PDA

View Full Version : ช่วยอธิบายโค๊ดภาษา C หน่อยคับ



PKXIII
06-02-2009, 02:22 AM
คือมันเป็นโจทย์ที่อาจารย์ให้เป็นตัวอย่างนะคับ

ที่ไม่เข้าใจมีเค่บรรทัดเดียวเอง คือ


ืืndigit[c-'0']++;ืื

นี่คือโค๊ดโปรแกรมทั้งหมดนะคับ

[code]#include<stdio.h>
#include<conio.h>

main(){

Edkung_
06-02-2009, 01:39 PM
ndigit[c-&#39;0&#39;]++;
เอาแบบง่ายๆ นะ

สมมติให้ c = &#39;5&#39;

ndigit[c-&#39;0&#39;]++; >>> ndigit[&#39;5&#39;-&#39;0&#39;]++ >>> ndigit[0x35-0x30]++ >>> ndigit[5]++

สมมติให้ ndigit[5] = 1

ndigit[5]++ >>> ndigit[5] + 1 >>> 2

Gen0TypE
06-02-2009, 01:39 PM
ภาษา c จะประมวลผลเกี่ยวกับ character ในรูปแบบของ รหัส ascii ครับ

เพราะเฉพาะคำสั่ง c=getchar() ก็จะเก็บ รหัส ascii ไว้ในตัวแปร c ยกตัวอย่างเช่น

- ถ้าเราพิมพ์เลข 1 ไป ตัวแปร c ก็จะเก็บค่า 49 (เป็น รหัส ascii ของตัวอักษร 1)
ดังนี้นประโยค

ndigit[c-&#39;0&#39;]++;
ก็คือ การเอา 49 (ค่าของตัวแปร c) ลบกับ รหัส ascii ของ 0 ซึ่่งก็คือ 48
เมื่อแทนค่า character ด้วย รหัส ascii จะได้

ndigit[49-48]++;
ซึ่งก็คือ

ndigit[1]++;
นั่นเอง



- แต่ถ้าเราพิมพ์ิเลข 2 ลงไป ในตัวแปร c ก็จะเก็บค่า 50 (รหัส ascii ของตัวอักษร 2)
ดังนั้นจะได้

ndigit[50-48]++;
ซึ่งก็คือ

ndigit[2]++;
นั่นเอง

จาก 2 ตัวอย่างที่ใ้ห้คาดว่าน่าจะพอเข้าใจจุดมุ่งหมายของคำสั่ง

ndigit[c-&#39;0&#39;]++;
แล้วนะครับ :)



ส่วนอื่นๆ ของโปรแกรมก็ไม่ยาก ให้ลองอ่านๆ ดูละกันครับ จะได้เป็นการฝึกทักษะ ;)

PKXIII
06-02-2009, 01:52 PM
ขอบคุณท่านอย่างมากทั้งสองที่มาช่วยตอบคับ

คือผมมีข้อสงสัยอีกอย่างหนึ่งว่า เราจะสามารถทราบค่ารหัส ascii ของแต่ละตัวอักษรได้อย่างไร และมีกี่วิธีบ้างคับ

อ๋อ แล้วอีกอย่างนะครับ มันมีระบบการนับยังไงครับ

ขอขอบคุณล่วงหน้าอย่างสูง :lol: :lol: :lol:

Edkung_
06-02-2009, 01:55 PM
http://www.asciitable.com/

ProHack
06-02-2009, 03:44 PM
ถ้า
ndigit[c-&#39;0&#39;]++;
เท่ากับ

ndigit[&#39;c&#39;-48]++;
แล้วทำไมเขาไม่ใช้
ndigit[&#39;c&#39;-48]++; ซะเลยอะครับ หรืออีกในความหมายหนึ่งคือ

ndigit[c-&#39;0&#39;]++; และ
ndigit[&#39;c&#39;-48]++; ต่างกันไงครับ

Gen0TypE
06-02-2009, 03:59 PM
ndigit[c-&#39;0&#39;]++;
กับ

ndigit[c-48]++;
ความหมายเหมือนกันครับ

แต่ที่ใช้

ndigit[c-&#39;0&#39;]++;
เพราะเข้าใจง่ายกว่า

เรื่องนี้ถ้าเขียนโปรแกรมไปสักพักจะเข้าใจมากขึ้นครับ
แต่ก็ต้องศึกษาเกี่ยวกับรหัส ascii ด้วยนะ ;)

PKXIII
06-02-2009, 05:23 PM
ถ้า
ndigit[c-&#39;0&#39;]++;
เท่ากับ

ndigit[&#39;c&#39;-48]++;
แล้วทำไมเขาไม่ใช้
ndigit[&#39;c&#39;-48]++; ซะเลยอะครับ หรืออีกในความหมายหนึ่งคือ

ndigit[c-&#39;0&#39;]++; และ
ndigit[&#39;c&#39;-48]++; ต่างกันไงครับ
[/b]

:unsure: จากที่ผมเข้าใจนะคับ

ndigit[c-&#39;0&#39;]++;
จะเท่ากับ

ndigit[c-48]++;

แต่

ndigit[c-&#39;0&#39;]++;
มันจะไม่เหมือนกับ

ndigit[&#39;c&#39;-48]++;
เพราะ ตัวอักษร &#39;c&#39; ตามรหัส ascii มันจะเท่ากับ 99 ไปซะ
แล้วมันก็จะได้เท่ากับ

ndigit[99-48]++;
ผมเข้าใจตามนี้ถูกหรือป่าวคับ ผู้รู้ช่วยยืนยันที :mellow:

cyberwizard
13-02-2009, 11:20 AM
หาได้ในเว็บGoogle ครับ หรือไม่ก็เว็บ http://www.asciitable.com/ นี่ก็ดีครับผมใช้อยู่เลยครับ

retool2
13-02-2009, 10:04 PM
ndigit[c-&#39;0&#39;]++;
มันจะไม่เหมือนกับ

ndigit[&#39;c&#39;-48]++;
เพราะ ตัวอักษร &#39;c&#39; ตามรหัส ascii มันจะเท่ากับ 99 ไปซะ
แล้วมันก็จะได้เท่ากับ

ndigit[99-48]++;
ผมเข้าใจตามนี้ถูกหรือป่าวคับ ผู้รู้ช่วยยืนยันที :mellow:
[/b]

เข้าใจถูกต้องครับ เนื่องจาก &#39;c&#39; คือ c ที่เป็น ตัวอักษร ไม่ใช่ตัวแปรครับ