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-'0']++;
เอาแบบง่ายๆ นะ
สมมติให้ c = '5'
ndigit[c-'0']++; >>> ndigit['5'-'0']++ >>> 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-'0']++;
ก็คือ การเอา 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-'0']++;
แล้วนะครับ :)
ส่วนอื่นๆ ของโปรแกรมก็ไม่ยาก ให้ลองอ่านๆ ดูละกันครับ จะได้เป็นการฝึกทักษะ ;)
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-'0']++;
เท่ากับ
ndigit['c'-48]++;
แล้วทำไมเขาไม่ใช้
ndigit['c'-48]++; ซะเลยอะครับ หรืออีกในความหมายหนึ่งคือ
ndigit[c-'0']++; และ
ndigit['c'-48]++; ต่างกันไงครับ
Gen0TypE
06-02-2009, 03:59 PM
ndigit[c-'0']++;
กับ
ndigit[c-48]++;
ความหมายเหมือนกันครับ
แต่ที่ใช้
ndigit[c-'0']++;
เพราะเข้าใจง่ายกว่า
เรื่องนี้ถ้าเขียนโปรแกรมไปสักพักจะเข้าใจมากขึ้นครับ
แต่ก็ต้องศึกษาเกี่ยวกับรหัส ascii ด้วยนะ ;)
PKXIII
06-02-2009, 05:23 PM
ถ้า
ndigit[c-'0']++;
เท่ากับ
ndigit['c'-48]++;
แล้วทำไมเขาไม่ใช้
ndigit['c'-48]++; ซะเลยอะครับ หรืออีกในความหมายหนึ่งคือ
ndigit[c-'0']++; และ
ndigit['c'-48]++; ต่างกันไงครับ
[/b]
:unsure: จากที่ผมเข้าใจนะคับ
ndigit[c-'0']++;
จะเท่ากับ
ndigit[c-48]++;
แต่
ndigit[c-'0']++;
มันจะไม่เหมือนกับ
ndigit['c'-48]++;
เพราะ ตัวอักษร 'c' ตามรหัส 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-'0']++;
มันจะไม่เหมือนกับ
ndigit['c'-48]++;
เพราะ ตัวอักษร 'c' ตามรหัส ascii มันจะเท่ากับ 99 ไปซะ
แล้วมันก็จะได้เท่ากับ
ndigit[99-48]++;
ผมเข้าใจตามนี้ถูกหรือป่าวคับ ผู้รู้ช่วยยืนยันที :mellow:
[/b]
เข้าใจถูกต้องครับ เนื่องจาก 'c' คือ c ที่เป็น ตัวอักษร ไม่ใช่ตัวแปรครับ
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.