/* code to calculate the milestone, not shown */
switch (milestone)
{
case 0:
commission = 0.00;
break;
case 1000:
commission = 0.02;
break;
case 5000:
case 6000:
case 7000:
commission = 0.05;
break;
default:
commission = 0.10;
break;
}
แจง้ ให้ทราบว่าสามเงื่อนไขการทดสอบจะมีการรวมกลุ่มกนั น้ีจะบอกโปรแกรมวา่ ถา้ ใด ๆ ของเหตกุ ารณ์สาคญั เหล่าน้ีจะพบอตั ราค่า
นายหนา้ เป็นร้อยละ 5
ซ่ึงแตกตา่ งจาก "ถา้ " คาสง่ั ถา้ คุณมีมากกวา่ หน่ึงบรรทดั ของรหสั ท่ีจะตอ้ งดาเนินการเม่ือสภาพการทดสอบจะพบคุณไม่จาเป็นตอ้ งวางรหสั
ระหวา่ งวงเลบ็ โปรแกรมเมอร์บางคนทาและบางคนไม่ มีอะไรผิดปกติกบั สถานการณ์อยา่ งใดอยา่ งหน่ึงคือ แตถ่ า้ คุณตดั สินใจท่ีจะใชก้ าร
จดั ฟันท่ี "ทาลาย" คาส่ังควรจะมาหลงั จากท่ีร้ังสุดทา้ ยสาหรับแต่ละกรณีเช่นดงั น้นั :switch( someVar )
{
case 1:
{
...
}
break;
case 2:
Learn Programming with C Page 51
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
{
...
}
break;
...
}
งบกรณีที่ดีเม่ือคุณตอ้ งการผลการทดสอบเป็นไปไดม้ ากที่คุณรู้วา่ ผลเทา่ น้นั ที่สามารถค่าใดค่าหน่ึงไมก่ ่ี ใช้ "กรณี" งบเพียงการทดสอบคู่
เป็ นเรื่องยาก แตผ่ มเคยเห็นมนั ทาเพือ่ อานวยความสะดวกในการอ่านและการเขา้ รหสั .
อะไรคอื สิ่งทแี่ ตกแขนง? What Is Branching?
มีคูข่ องเทคนิคตา่ ง ๆ ที่มกั จะถูกเรียกวา่ แตกแขนงเป็น พดู อยา่ งเคร่งครัดแยกใชก้ ารทดสอบท่ีจะตดั สินใจระหวา่ งลาดบั ทางเลือก
ลาดบั เหล่าน้นั อาจจะเรียกเป็ นข้นั ตอนที่แตกตา่ งกนั หรือฟังกช์ น่ั หรือการต้งั ค่าตวั แปรใหเ้ ป็นคา่ ท่ีแตกต่างกนั (เช่นในตวั อยา่ งท่ีคุณเคยเห็น
ดา้ นบน) ในความเป็นจริงคุณเคยเห็นตวั อยา่ งของการแยกทางท้งั หมดท่ีผา่ นหลกั สูตรน้ี ลองดูอีกคร้ังท่ีผงั สาหรับเงินเดือนจากบทที่ 2
รูปที่ 8-1: การแตกแขนงแผนภมู ิการไหล
ขอใหส้ งั เกตสภาพการทดสอบเป็นเวลาหลายชวั่ โมง ถา้ เวลานอ้ ยกวา่ หรือเท่ากบั 40 ลาดบั หน่ึงของงบจะดาเนินการ แตถ่ า้ เวลามากกวา่ 40
ลาดบั ของผอู้ ่ืนงบจะถูกดาเนินการ โดยใชผ้ งั งานสามารถช่วยคุณตรวจสอบที่สาขาเกิดข้ึนในโปรแกรมของคุณ
ลองดูท่ีตวั อยา่ งที่แตกตา่ งกนั เล็กนอ้ ย ชนิดท่ีพบบ่อยท่ีสุดของการกาหนดการใชส้ ภาพทดสอบเพ่ือกาหนดหลกั สูตรของการดาเนินการ (ตาม
คานิยามของเรา) แต่แลว้ เรียกกระบวนงานท่ีแตกต่างกนั หรือฟังกช์ น่ั ในการดาเนินการลาดบั ของคาสง่ั ที่ ดงั น้นั คุณ "สาขา" ออกจากกิจวตั ร
ประจาวนั ในปัจจบุ นั และเขา้ ไปอีก ตวั อยา่ งเช่น:
ชวั่ โมงถึง 40 ชว่ั โมง คาสงั่ ท่ีเขียนใน C, อาจมีลกั ษณะดงั ต่อไปน้ี:
#define kNormalPay 10
Learn Programming with C Page 52
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
#define kNormalWeek 40
float overtimePay;
...
if (hours > 40)
overtimePay = CalculateOvertime(hours, kNormalPay *
1.5);
else
overtimePay = 0.0;
...
ในตวั อยา่ งน้ีถา้ พนกั งานทางานล่วงเวลา (มากกวา่ 40 ชว่ั โมง) รหสั "สาขา" ในฟังกช์ นั่ ในการคานวณค่าใชจ้ า่ ยค่าล่วงเวลา บอ่ ยคร้ังถา้
คุณจาเป็ นตอ้ งดาเนินการคาสงั่ จานวนมากเป็ นผลมาจากสาขาที่คุณใชว้ ธิ ีการหรือฟังกช์ นั่ แตถ่ า้ คุณจะตอ้ งดาเนินการไมก่ ่ีคาสง่ั (เช่นการ
กาหนดตวั แปร) คุณสามารถวางคาสง่ั ผูท้ ่ีอยใู่ นสาขาแทนในชีวิตประจาแยกต่างหาก.
กำรใช้นพิ จน์เป็ นพำรำมิเตอร์ Using Expressions as Parameters
ขอให้สงั เกตวา่ อตั ราการจ่ายเงินจะถูกส่งเป็ นพารามิเตอร์ไปยงั ฟังกช์ นั CalculateOvertime คุณสามารถใชก้ ารแสดงออกทาง
คณิตศาสตร์เป็นพารามิเตอร์ การแสดงออกท่ีไดร้ ับการประเมินคร้ังแรกและผลท่ีไดจ้ ะถูกส่งผา่ นไปยงั ข้นั ตอนหรือฟังกช์ นั่ การใชส้ านวนที่
เป็ นพารามิเตอร์ในลกั ษณะน้ีสามารถประหยดั เวลาและการเขา้ รหสั ; แต่ก็ไมแ่ นะนาใหใ้ ชน้ ิพจนท์ ี่ซบั ซอ้ น ใชน้ ิพจน์ส้นั ท่ีดีท่ีกาหนดที่เขา้ ใจได้
ง่ายโดยการอา่ นรหสั
Learn Programming with C Page 53
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
Lesson 9: Going Loopy
คำอธิบำยบทเรียน Lesson Description: ในบทเรียนน้ีคุณไดเ้ รียนรู้เก่ียวกบั ชนิดที่แตกตา่ งกนั ของลูปเมื่อใชล้ ูป,
วิธีการใชล้ ูปในการเขา้ ถึงขอ้ มูลและอน่ื ๆ เม่ือคุณเสร็จสิ้นบทเรียนที่คุณจะมีทกั ษะท่ีจาเป็นในการดาเนินการโครงการสุดทา้ ยใน
บทเรียน 10-12
คอื อะไรทล่ี ูบWhat Is a Loop?
มีตลกเก่าเก่ียวกบั โปรแกรมเมอร์ที่ไมส่ ามารถไดร้ ับการออกจากห้องอาบน้าเป็น เหตุผล? เขาเอาคาแนะนาบนขวดแชมพแู ทจ้ ริง พวกเขาอ่าน
"ฟองลา้ งซ้า." โปรแกรมเมอร์ที่มีประสิทธิภาพไดต้ ิดอยใู่ น "ห่วงอนนั ต.์ " เขาอา่ นแตล่ ะบรรทดั การกระทาท่ีอธิบายไวแ้ ลว้ ตีซ้า - จดุ ทเี่ ขาเร่ิม
กระบวนการท้งั หมดอีกคร้ัง เรื่องตลกน้ีแสดงใหเ้ ห็นแนวคดิ ของการวนลูปที่เรียบงา่ ย
ห่วงถูกสร้างข้ึนเม่ือคุณทาซ้าชุดเดียวกนั ของการกระทามากกวา่ หน่ึงคร้ังในส่วนเดียวของรหสั ในการออกจากวงที่คุณจาเป็นตอ้ งมีเงื่อนไข
การทดสอบที่ประเมินเป็นเทจ็ เงื่อนไขการทดสอบโดยปกติจะเป็นส่วนหน่ึงของโครงสร้างห่วงและสามารถเป็นไดท้ ้งั ที่จุดเริ่มตน้ หรือ
จดุ สิ้นสุดของวง ห่วงกบั การทดสอบทีจ่ ุดเร่ิมตน้ ทเี่ รียกวา่ ห่วงรายการสภาพ ห่วงกบั การทดสอบในตอนทา้ ยท่เี รียกวา่ ห่วงทางออกปรับอากาศ
โปรแกรมเมอร์บางคนคิดวา่ การวนรอบรายการสภาพทเี่ หนือกวา่ ความหลากหลายทางออกสภาพเพราะมนั ง่ายตอ่ การทดสอบก่อนที่คุณจะ
ห่วง ในบางกรณีคุณอาจจาเป็ นตอ้ งขา้ มห่วงอยา่ งสิ้นเชิงถา้ เง่ือนไขการทดสอบลม้ เหลวที่ไม่สามารถทาไดด้ ว้ ยการออกจากวงปรับอากาศ
มีหลายชนิดของลูปเป็น คุณจะพบวา่ บางชนิดของลปู อยรู่ ่วมกนั ระหวา่ งการเขียนโปรแกรมภาษาแมว้ า่ พวกเขาอาจมีโครงสร้างท่ีแตกตา่ งกนั
เลก็ นอ้ ย ลูปอ่ืน ๆ อาจจะไม่ซ้ากบั การเขียนโปรแกรมภาษาท่ีคุณเลือก ถา้ ห่วงโดยเฉพาะอยา่ งยง่ิ จะไม่ครอบคลุมถึงที่น่ีคุณควรวจิ ยั ชนิดของลูป
การเขียนโปรแกรมภาษาขอ้ เสนอของคุณและวิธีการใช้
ใน C มีสามชนิดพ้ืนฐานของลูป พวกเขาเป็น "สาหรับ" วงในขณะที่ . . ทาและทา . . ในขณะที่ ลองดูท่แี ตล่ ะคนในรายละเอียดเพ่มิ เติม
"สำหรับ" ห่วง "For" Loop
วา่ "สาหรับ" ห่วงเป็นห่วงที่เพิม่ ข้ึนหมายความวา่ วงจะดาเนินการจานวนคงที่ของเวลาที่เพมิ่ ข้ึน พารามิเตอร์ท้งั หมด (เงื่อนไข) สาหรับ
วงจะไดร้ ับท่ีจุดเร่ิมตน้ พารามิเตอร์ท่ีจะเร่ิมตน้ คา่ สิ้นสุดคุณค่าและมลู คา่ เพ่มิ ข้ึน พารามิเตอร์สาหรับ "สาหรับ" ห่วงดาเนินการต่อไปน้ี
สามงาน:
•เริ่มตน้ ตวั แปรเคานเ์ ตอร์
•เปรียบเทียบเคาน์เตอร์ที่มีค่าหยดุ
•การเพ่มิ เคาน์เตอร์แตล่ ะคร้ัง iterates ห่วง
ลองดูท่ีตวั อยา่ งในทางปฏิบตั ิ สมมติวา่ คุณตอ้ งการที่จะพิมพต์ วั เลข 1 ถึง 10 บนหนา้ จอ คุณสามารถเขียนสิบบรรทดั ของรหสั หรือคุณ
สามารถเขียนเพยี งไมก่ ่ีบรรทดั ของรหสั ที่เช่นน้ี
Learn Programming with C Page 54
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
#include <stdio.h>
int main(void)
{
short count;
for (count = 1; count <= 10; count++)
printf("%d\n", count);
}
ส่วนแรกของวงท่ีกาหนดตวั แปร "นบั " เพ่ือ 1. อฒั ภาคแยกส่วนของแต่ละวง ส่วนถดั ไปคือการแสดงออกของเง่ือนไขการทดสอบ หาก
การแสดงออกน้ีจะกลายเป็ นเทจ็ เราออกจากวง ในกรณีน้ีเรายงั คงวนรอบเป็นเวลานานนบั เป็นตวั แปรของเรามีค่านอ้ ยกวา่ หรือเท่ากบั 10
สุดทา้ ยนบั ++ คือ C จดชวเลขบอกวา่ นบั นบั = + 1 น้ีส่วนสุดทา้ ยเพม่ิ ข้ึนเพ่ิมข้ึนนบั ตวั แปรโดยท่ี 1
สุดทา้ ย "printf" คาสง่ั เขียนออกค่าของตวั แปร "นบั " ในบรรทดั ใหม่สาหรับทวนของแตล่ ะวง
ท้งั หมดน้ีในใจอะไรจะเกิดข้ึนถา้ เง่ือนไขการทดสอบไดร้ ับการ "นบั <10" แทน "นบั <= 10"? โปรแกรมจะเขียนออก "นบั " จนถึง
วนั ที่ 10 แต่จะไม่เขียน 10 วงสุดทา้ ยเพราะ "นบั = 10" และการแสดงออกจะเป็นเทจ็
เช่น "ถา้ " และ "กรณี" งบคุณสามารถเขียนห่วงที่ตอ้ งมีมากกวา่ หน่ึงบรรทดั ของรหสั ที่จะดาเนินการ พิจารณาตวั อยา่ งตอ่ ไปน้ีหลอก:
short count;
for (count = 0; count <= 500; count+=2)
{
DoSomething();
DoSomethingElse();
BringItOn();
}
เมื่อใดกต็ ามที่คุณใชง้ บหลายในวงคุณตอ้ งกลุ่มพวกเขาร่วมกนั โดยใชเ้ ครื่องหมายวงเล็บที่แสดงขา้ งตน้ มีความคิดเห็นท่ีแตกตา่ งกนั
จานวนมากในการจดั ตาแหน่งของการจดั ฟันและหรือไมว่ ่าใชว้ งเล็บสาหรับแมแ้ ตบ่ รรทดั เดียวในคือ "สาหรับ" วงทาให้วงอ่านไดม้ าก
ข้ึนหรือไม่ หลงั จากท่ีคุณอา่ นรหสั ท่ีมาของคนอื่น ๆ ในขณะท่ีคุณจะพฒั นาความคิดของคุณเองและนามาใชใ้ นรูปแบบท่ีคุณรู้สึก
สะดวกสบายใช้
หน่ึงของการใชท้ ี่พบมากที่สุดของ "สาหรับ" ห่วงคือการกา้ วผา่ นตวั แปรอาร์เรยท์ ่ีจะอ่านหรือเขียนขอ้ มลู ไปยงั ตาแหน่งท่ีอาร์เรย์
พิจารณาตวั อยา่ งตอ่ ไป:
Boolean vote[50]; /* remember, Boolean is really an
int */
Learn Programming with C Page 55
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
/* code to fill vote array not shown*/
short count, numVotes;
numVotes=0;
for (count = 0; count < 50; count++)
{
if (vote[count] == 1)
numVotes++;
printf("Woohoo! You have %d votes!",
numVotes);
}
ขอ้ มูลโคด้ น้ีมีลกั ษณะท่ีตาแหน่งของผลู้ งคะแนนเสียงอาร์เรยแ์ ต่ละมองหาค่า 1 หรือจริง ถา้ คา่ ท่ีตาแหน่ง "นบั " เป็น 1 แลว้
numVotes จะเพม่ิ ข้ึนโดย 1 จานวนเสียงท้งั หมดของจริงแลว้ จะถูกเขียนออกมาใน "printf" คาสง่ั โดยปกติจานวนเสียง
ท้งั หมดจะไดร้ ับการพมิ พค์ ร้ังหน่ึงวงที่จะเสร็จสิ้น; แลว้ คุณสามารถกาจดั การจดั ฟันในตวั อยา่ งขา้ งตน้ อยา่ งไรกต็ ามเป้ าหมายของที่น่ี
คือการแสดงใหค้ ุณเห็นวา่ รหสั ในวงยอ่ มถูกเรียกใชผ้ า่ นห่วงในแตล่ ะคร้ัง
สิ่งหน่ึงที่ควรทราบเก่ียวกบั วงน้ีคือการเปรียบเทียบที่ใชเ้ ป็ นกรณีทดสอบ: นบั <
50. จาไวว้ า่ อาร์เรยใ์ น C มี 0 ข้ึน นน่ั คือพวกเขาเร่ิมตน้ ที่ศูนยแ์ ละยงั คงขนาดของอาร์เรยล์ บหน่ึง (50 -1) โดยใชต้ วั ดาเนินการ
<(นอ้ ยกวา่ ) เมื่อเทียบกบั
<= (นอ้ ยกวา่ หรือเท่ากบั ) ผปู้ ระกอบการท่ีเราหลีกเลี่ยงท่ีจะ "ออกจากขอบเขต" โดยการนบั ที่ผา่ นมาในตอนทา้ ยของอาร์เรย์ หรือคุณ
สามารถใช้ <= การดาเนิน; กอ็ ยา่ ลืมที่จะใชข้ นาดของอาร์เรยล์ บ 1 เป็นเปรียบเทียบ.
"ในขณะท"่ี ห่วง "While" Loop
"ในขณะท่ี" ลูปเป็ นอีกรูปแบบหน่ึงของวงท่ีพบบอ่ ยในหลายภาษาโปรแกรมท่ีทนั สมยั บางภาษาเรียกวา่ "ขณะที่" ลูป "ในขณะที่ตอ้ งทา"
ลูปเพราะพวกเขามีโครงสร้างต่อไปน้ี:
while (something is true)
do something
เงื่อนไขการทดสอบสาหรับ "ขณะที่" ห่วงคือท่ีจดุ เริ่มตน้ คลา้ ยกบั "สาหรับ" ห่วง ดงั น้นั หากสภาพการทดสอบลม้ เหลวหรือประเมินเทจ็
แลว้ วงท่ีจะขา้ ม ลองเปล่ียนของเรา "สาหรับ" ห่วงจากขา้ งตน้ กบั "ขณะที่" ห่วง.
Boolean vote[50]; /* remember, Boolean is really an
int */
/* code to fill vote array not shown */
short count, numVotes;
Learn Programming with C Page 56
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
count = 0;
while (count < 50)
{
if (vote[count] == 1)
numVotes++;
printf("Whohoo! you have %d votes!", numVotes);
count++;
}
บางส่ิงท่ีจะตอ้ งทราบในตวั อยา่ งน้ี รหัสน้ีเป็นหลกั เช่นเดียวกบั "สาหรับ" ห่วงมีขอ้ ยกเวน้ ต่อไปน้ี:
•ตวั แปร "นบั " ไดร้ ับการเร่ิมตน้ (ไดร้ ับค่าเริ่มตน้ ) นอกโครงสร้างห่วง
•ตวั แปร "นบั " จะเพิม่ ข้ึนใกลถ้ ึงจุดสิ้นสุดของวง
โดยทว่ั ไปโปรแกรมเมอร์จานวนมากไมไ่ ดต้ ้งั คา่ ตวั แปรทนั ทีก่อนท่ีจะเป็น "ขณะท่ี" ห่วง ในความเป็นจริง แต่กข็ ้ึนอยกู่ บั สิ่งท่ีคุณตอ้ งทา
ท้งั หมดการแสดงออกการทดสอบตอ้ งประเมินเป็นจริงหรือเทจ็ คุณยงั สามารถใชน้ ิพจน์บูลีนปกติเช่นดงั น้นั :
while (someBool == TRUE)
{
...
}
ทำ . . ในขณะทห่ี ่วง Do . . . While Loop
"จะ... ขณะท่ี" ห่วงเป็ นห่วงสภาพทางออก ซ่ึงหมายความว่าวงจะถูกดาเนินการอยา่ งนอ้ ยหน่ึงคร้ังโดยไม่คานึงวา่ สภาพการทดสอบลม้ เหลว
หรือไม่ คุณภาพน้ีจะช่วยให้ "ทา... ขณะท่ี" ห่วงขอ้ ดีและขอ้ เสีย ในดา้ นขอ้ เสียถา้ สภาพการทดสอบจะพบกนั มาก่อนท่ีจะเขา้ สู่วงวงยงั คง
ดาเนินการอยา่ งน้อยหน่ึงคร้ังจนกว่าจะมีการทดสอบในตอนทา้ ยของวง ในดา้ นประโยชน์ถา้ คุณรู้วา่ คุณจาเป็นตอ้ งดาเนินการชุดของการ
กระทาอยา่ งนอ้ ยหน่ึงคร้ัง (ท่ีไม่คานึงถึงเงื่อนไขใด ๆ ก่อนถูกพบ) แลว้ อาจจะตอ้ งดาเนินการท่ีชุดเดียวกนั ของการดาเนินการอีกคร้ังหลงั จาก
ท่ีแลว้ "ทาอยา่ งไร... ขณะที่" ห่วงเหมาะกบั ใบเสร็จอยา่ งมาก
ลองใชต้ วั อยา่ งเช่นนบั คะแนนของเราอีกคร้ัง:
Boolean vote[50]; /* remember, Boolean is really an
int */
/* code to fill vote array not shown */
Learn Programming with C Page 57
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
short count, numVotes;
count = 0;
do
{
if (vote[count] == 1)
numVotes++;
printf("Whohoo! you have %d votes!", numVotes);
count++;
} while (count < 50)
ในขณะทแี่ ละไม่ . . ในขณะทเี่ ตอื น While and Do . . . While Caveats
ตวั อยา่ งน้ีโดยเฉพาะอยา่ งย่งิ จะคอ่ นขา้ งทาไม่ไดเ้ ป็น "ทา... ขณะท่ี" ห่วงหรือเป็น "ขณะท่ี" วงดงั ท่ีแสดงไวก้ ่อนหนา้ น้ี พิจารณา
สถานการณ์ท่ีตวั แปร "นบั " ไม่ไดเ้ ริ่มตน้ เกิดอะไรข้ึน? เพราะ "นบั " จะไมไ่ ดก้ าหนดอยา่ งชดั เจนใหเ้ ป็นศูนยก์ ็อาจจะคุม้ ค่าใด ๆ โดย
พล คอมไพเลอร์บางคนจบั น้ีและจะเร่ิมตน้ ตวั แปรท้งั หมดให้เป็นศูนยจ์ นกวา่ คุณจะเปลี่ยนคา่ ของพวกเขา แต่คุณไม่สามารถพ่ึงพา
คอมไพเลอร์ที่จะทาเพอ่ื คุณ เราอาจลืมที่จะต้งั "นบั " เพื่อเป็ นศูนยโ์ ดยไม่ต้งั ใจและพยายามที่จะเขา้ ถึงตาแหน่งอาร์เรยพ์ ล 125 ตวั อยา่ ง
ซ่ึงไมไ่ ดอ้ ยทู่ ี่ก่อใหเ้ กิดโปรแกรมเพ่ือเขา้ ถึงหน่วยความจาท่ีไม่ถูกตอ้ งหรือผดิ พลาด
ลองปรับเปล่ียนตวั อยา่ งเลก็ นอ้ ย ในการเลือกต้งั ลงคะแนนจะนบั จนถึงการลงคะแนนเสียงคร้ังสุดทา้ ยจะมาถึง คุณรู้วา่ คุณจะนบั อยา่ ง
นอ้ ยหน่ึงการลงคะแนนเสียงและอาจนบั เพ่มิ ข้ึน สมมติวา่ เรามีฟังกช์ นั่ ท่ีทดสอบถา้ เราไดน้ บั การลงคะแนนเสียงท่ีผ่านมาและมีสามฝ่าย
เรากาลงั นบั บตั รลงคะแนนสาหรับ รหสั อาจมีลกั ษณะเช่นน้ี:
long partyA, partyB, partyC;
short vote; /* the value of vote can be 1, 2 or 3 */
partyA = partyB = partyC = 0;
/* a little shorthand to initialize all variables to 0
*/
do
{
vote = GetNextBallot();
switch (vote)
{
case 1:
partyA++; /* increment partyA's number of votes */
Learn Programming with C Page 58
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
break;
case 2:
partyB++;
break;
case 3:
partyC++;
break;
}
printf("Running totals-Party A: %d, Party B: %d, Party
C: %d",
partyA, partyB, partyC);
} while ( !LastBallot() )
ในตวั อยา่ งน้ีเรามีฟังกช์ น่ั ท่ีจดุ เริ่มตน้ ของวงที่จะไดร้ ับการลงคะแนนเสียงตอ่ ไป เราใช้ "กรณี" คาสง่ั ให้เรียงลาดบั จากความเป็นไปได้
ของการลงคะแนนเสียง การใช้ "!" ตวั ละครในสภาพการทดสอบเป็นเช่นเดียวกบั คาพดู ไม่ได้ ดงั น้นั สภาพการทดสอบอ่าน: ในขณะท่ีไม่
LastBallot LastBallot () เป็นฟังกช์ นั่ บลู ีนที่แอบไปดูวา่ มีบตั รลงคะแนนมากข้ึน ถา้ เป็ นเช่นน้นั วงเริ่มตน้ อีกคร้ังดว้ ยการควา้
ลงคะแนนเสียงตอ่ ไปในกอง.
Learn Programming with C Page 59
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
Lesson 10: ปัญหำโลกแห่งควำมจริงReal World Problems
คำอธิบำยบทเรียน Lesson Description: ในบทเรียนน้ีคุณจะเสร็จสิ้นโครงการแรกของคุณ คุณจะไดร้ ับความรู้
ท้งั หมดที่พ้นื หลงั ที่คุณจะตอ้ งเร่ิมตน้ โครงการโดยการพฒั นาผงั ข้นั ตอนวธิ ีการและรายละเอียดโปรแกรม.
รำยละเอยี ดของปัญหำProblem Description
ปัญหาท่ีคุณจะแกก้ วา่ สามบทเรียนต่อไปคือการติดตามความเคลื่อนไหวของสินคา้ คงคลงั ท่ีร้านหนงั สือ โปรแกรมท่ีคุณเขียนไม่
จาเป็นตอ้ งมีความซบั ซอ้ น; ในความเป็นจริงเราจะเก็บขอ้ กาหนดของโปรแกรมการจดั การท่ีเรียบง่ายเพอ่ื ให้แน่ใจวา่ ร้านหนงั สือใน
คาถามเป็นร้านหนงั สือมือสอง.
กระบวนกำรสินค้ำคงคลงั The Inventory Process
ร้านหนงั สือ - ขอเรียกวา่ หนงั สือที่มีสไตล์ - ไดร้ ับหนงั สือจากการบริจาคหรือซ้ือ หนงั สือเหล่าน้ีจะถูกส่งออกไปเสมียนสินคา้ คงคลงั
สาหรับการเขา้ สู่ฐานขอ้ มลู ของพวกเขา หนงั สือแต่ละเล่มมีมาตรฐานจานวนหนงั สือนานาชาติ (ไอ) ที่เกี่ยวขอ้ งกบั มนั ต้งั แตม่ นุษยท์ าผดิ
ไดม้ ีการป้ อนขอ้ มูลก็คอ่ นขา้ งเป็นไปไดท้ ่ีความผดิ พลาดท่ีอาจจะทาและการป้ อนขอ้ มูลที่ไม่ถูกตอ้ ง ISBN ลงในฐานขอ้ มลู โปรแกรม
ท่ีตอ้ งตรวจสอบเพื่อใหแ้ น่ใจวา่ ไดไ้ อที่ถูกตอ้ งพมิ พล์ งใน (เพมิ่ เติมวา่ เลก็ ๆ นอ้ ย ๆ ในภายหลงั ) นอกเหนือไปจาก ISBN ของหนงั สือ
ชื่อผเู้ ขียนวนั ส่ิงพิมพป์ ระเภทและไมว่ า่ หนงั สือเล่มน้ีเป็นปกแขง็ หรือออ่ นยงั ถูกเก็บไวใ้ นฐานขอ้ มูล แตห่ นงั สือเล่มน้ีไมส่ ามารถเก็บไว้
จนไดไ้ อที่ถูกตอ้ งคือการป้ อนขอ้ มูล
คาเตือนผใู้ ชข้ องท่านไม่ถูกตอ้ งเช่นน้ีเรียกวา่ "การตรวจสอบขอ้ ผิดพลาด." การตรวจสอบเพื่อดูวา่ เง่ือนไขบางประการที่มีความพึงพอใจ
ก่อนท่ีจะดาเนินการตรวจสอบผลที่ไดห้ ลงั จากเรียกฟังกช์ น่ั ท่ีอาจจะกลบั มาผลท่ีผิดพลาดและการตรวจสอบคา่ ท่ีจะดูวา่ มนั อยใู่ นช่วงที่
เป็ นตวั อยา่ งของการตรวจสอบขอ้ ผดิ พลาด การตรวจสอบขอ้ ผิดพลาดอาจจะเป็นกระบวนการท่ีใชเ้ วลานานต้งั แตค่ ุณกาลงั ดาเนินการ
กระทาท่ีอาจไมจ่ าเป็ นที่จะตอ้ งทา 100 เปอร์เซ็นตข์ องเวลาท่ีจึงชะลอตวั ลงโปรแกรมของคุณนิด อยา่ งไรกต็ ามการตรวจสอบ
ขอ้ ผดิ พลาดเป็ นส่วนสาคญั อยา่ งย่งิ ของการเขียนโปรแกรมและจาเป็ นตอ้ งทาเพ่ือให้แน่ใจวา่ ขอ้ ผดิ พลาดและขอ้ บกพร่องบางอยา่ ง
สามารถป้ องกนั ไดใ้ นระหวา่ งการใชง้ านโปรแกรมของคุณ.
ฐำนข้อมูล Database
เมื่อเรามน่ั ใจวา่ ISBN สาหรับหนงั สือป้ อนไมถ่ กู ตอ้ งเราสามารถใหผ้ ใู้ ชส้ ามารถเพิม่ ขอ้ มลู ท่ีสาคญั อ่ืน ๆ ไปยงั ฐานขอ้ มลู ของ
ร้านคา้ โปรแกรมจะตอ้ งอนุญาตให้ดาเนินการตอ่ ไปท่ีจะดาเนินการในฐานขอ้ มูล:
•เพ่ิมหนงั สือเล่มใหม่
•ลบหนงั สือ
•แสดงหนงั สือท้งั หมดในฐานขอ้ มลู
สาหรับวตั ถุประสงคข์ องเราเราไมต่ อ้ งการอะไรที่มีความซบั ซอ้ นมากเกินไป เราจะเกบ็ ฐานขอ้ มลู ขนาดเลก็ และงา่ ยตอ่ การใชแ้ ละการ
เขา้ ถึง ขอ้ มลู เพ่มิ เติมเก่ียวกบั ฐานขอ้ มลู จะถูกจดั ให้อยใู่ นบทเรียนต่อไป.
Learn Programming with C Page 60
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
ระบบ ISBN ISBN System
เกือบทกุ เล่มพมิ พท์ ่ีไหนสกั แห่งบนปกหลงั เป็นจานวนสิบหลกั ที่เรียกวา่ นานาชาติจานวนหนงั สือมาตรฐานหรือ ISBN ไอถกู แบ่ง
ออกเป็นส่ีส่วนแตล่ ะท่ีมคี วามหมายพเิ ศษ ยกตวั อยา่ งเช่น ISBN ของหนงั สือ C รองพ้ืนพลสั ทใ่ี ชใ้ นการเสริมหลกั สูตรน้ีเป็นแบบน้ี:
1-571690-161-8
ส่วนแรกคือการระบกุ ลุ่มที่สองคือคานาหนา้ สานกั พมิ พ,์ และท่ีสามเป็นตวั ระบุช่ือ เหล่าน้ีสามส่วนแรกขนาดแตกตา่ งกนั จานวนของตวั เลข
ในจานวนกลุ่มและในคานาหนา้ สานกั พิมพจ์ ะถูกกาหนดโดยปริมาณของช่ือเร่ืองวางแผนท่ีจะผลิตโดยสานกั พมิ พห์ รือผเู้ ผยแพร่กลุ่ม
สานกั พิมพส์ านกั พิมพห์ รือกลุ่มที่มีผลขนาดใหญช่ ื่อจะถูกแทนดว้ ยตวั เลขนอ้ ยลง
ในตวั อยา่ งขา้ งตน้ ของเราหลกั แรก, 1, หมายความวา่ หนงั สือเล่มน้ีไดร้ ับการตีพมิ พใ์ นประเทศที่พดู ภาษาองั กฤษ ชุดที่สองของตวั เลขคา
นาหนา้ ของผเู้ ผยแพร่หมายความวา่ มนั ถูกตีพมิ พโ์ ดยส่วน SAMS เผยแพร่ กลุ่มท่ีสามเป็นเอกลกั ษณ์ของหนงั สือเล่มน้นั คุณอาจพบวา่
หนงั สือเล่มอ่ืน ๆ เช่นน้ีเผยแพร่โดย SAMS ที่จะมีคานาหนา้ สานกั พิมพเ์ ดียวกนั หลกั สุดทา้ ยที่เรียกวา่ การตรวจสอบหลกั (อยา่ ลืมวา่ การ
อภิปรายของการตรวจสอบขอ้ ผดิ พลาดของเราหรือไมก่ ารตรวจสอบขอ้ ผิดพลาดที่ถูกสร้างข้ึนในระบบ ISBN.)
เช็คเลข The Check Digit
เช็คเลขคานวณโดยใชโ้ มดูลสั 11 และเป็ น "น้าหนกั รวม." หลกั ของ ISBN แต่ละคร้ังรวมถึงการตรวจสอบหลกั ที่จะถูกคูณดว้ ย
จานวน 10-1 และผลรวมของผลิตภณั ฑท์ ี่จะมาร่วมกนั ค่าที่ถูกแบ่งแยกออกจากกนั แลว้ โดย 11 เพื่อดูว่ามีเหลือใด ๆ หนงั สือหลาย
เล่มใช้ X การตรวจสอบหลกั แทนการใชจ้ านวน 10 X 10 ในระบบตวั เลขโรมนั ลองดูที่คูข่ องตวั อยา่ ง.
Group Publisher Prefix Title ID Check
ID Digit
ISBN 1 5 716 9161 8
Weight 10 9 8 7 6 5 4 3 2 1
10 +45 +56 +7 +36 +45 +4 +18 +2 +8
Total 231 hecksum 231 / 11 = 21 with no
remainder So the ISBN is valid
Learn Programming with C Page 61
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
วธิ ีการท่ีคุณสามารถทาเช่นน้ีกค็ ือในส่ิงที่ตรงกนั ขา้ ม คูณ 9 หลกั เป็นคร้ังแรกโดยตาแหน่งของพวกเขา (1-9) และเพ่ิมทุน แลว้ หาร
ผลรวมท่ี 11 และดูวา่ มีที่เหลือ ส่วนท่ีเหลือควรจะตรวจสอบหลกั ใชต้ วั อยา่ งขา้ งตน้ ของเราที่เราไดร้ บั :
Group Publisher Prefix Title ID Check
ID Digit
ISBN 1 5 716 9161 8
Weight 1 2 345 6789
1 +10 +21 +4 +30 +54 +7 +78 +9
Total hecksum 184 / 11 = 16 with a remainder
184 of 8 which is the check digit So the ISBN is
valid
ท่านสามารถหาขอ้ มูลเพิ่มเติมเก่ียวกบั ระบบ ISBN และวธิ ีการทางานจากเวบ็ ไซตข์ องหน่วยงานระหวา่ งประเทศ ณ ISBN:
http:IIwww.isbn.spk-berlin.de
ลองดูตวั อยา่ งที่มีขอ้ ผิดพลาดในน้นั เราจะใชว้ ิธีการท้งั สองสาหรับการสาธิต.
Group Publisher Prefix Title ID Check
ID Digit
ISBN 5 7 6 2 6 11 6 3 2
Weight 10 9 8 7 6 5 4 3 2 1
50 +49 +48 +14 +36 +5 +4 +15 +6 +2
Total 229 hecksum 229 / 11 = 20 with a remainder
of 9 So the ISBN is not valid
โดยใชว้ ิธีการยอ้ นกลบั ที่เราไดร้ ับ:
Group Publisher Prefix Title ID Check
ID Digit
ISBN 5 7 6 2 6 11 6 3 2
Weight 1 2 3 4 5 67 8 9
5 +14 +18 +8 +30 +5 +7 +48 +18
Total hecksum 153 / 11 = 13 with a remainder
153 of 10 (or X) which is not the check digit So
the ISBN is not valid
Learn Programming with C Page 62
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
Lesson 11: Coding ขนึ้ พำยุCoding Up A Storm
Course Slug: 100000117
คำอธิบำยบทเรียน Lesson Description: ขอพดู คุยเลก็ ๆ นอ้ ย ๆ เกี่ยวกบั การออกแบบโปรแกรมคุณสมบตั แิ ละ
เอกสาร
กำรออกแบบและคุณสมบัติ Design and Features
หน่ึงในส่วนที่ยากที่สุดของงานโปรแกรมเมอร์จะไดร้ ับการป้ อนขอ้ มลู สาหรับโปรแกรมคุณสมบตั ิที่ผใู้ ชห้ รือผใู้ ชท้ ่ีตอ้ งการดาเนินการ
และแลว้ การเหล่าน้นั และข้ึนมาพร้อมกบั การออกแบบโปรแกรมท่ีสามารถทางานไดเ้ พอ่ื รองรับการร้องขอ ทาไมเป็นเช่นน้ียาก? คิดวา่
สกั ครู่เก่ียวกบั หน่ึงในโปรแกรมท่ีคุณชื่นชอบ คิดวา่ ตอนน้ีเก่ียวกบั คุณลกั ษณะท้งั หมดท่ีมีโปรแกรม ตอนน้ีวิธีการที่หลายคุณสมบตั ิ
เหล่าน้นั จริงๆคุณใช?้ อาจจะไมท่ ้งั หมดของพวกเขาใช่ม้ยั ? อาร์กิวเมนตใ์ นอุตสาหกรรมซอฟแวร์คือการที่ผใู้ ชบ้ างคนถามวา่ อยทู่ ี่ไหน
สกั แห่งสาหรับคุณลกั ษณะที่จะรวมอยใู่ นโปรแกรม ในขณะน้ีแน่นอนอาจจะเป็นจริงก็ดูเหมือนวา่ บางส่วนของคุณสมบตั ิเหล่าน้นั จะถูก
นามาใชโ้ ดยไมต่ อ้ งคิดวา่ มากในการออกแบบจริงของพวกเขาและการดาเนินการ
โปรแกรมท่กี ล่าวถึงในบทเรียนที่ผา่ นมาไม่จาเป็ นตอ้ งมีความซบั ซอ้ น มนั ไม่ แตจ่ าเป็ นที่จะตอ้ งประสบความสาเร็จไปต้งั เป้ าหมาย:
•เพ่มิ หนงั สือใหม่
•แสดงหนงั สือทุกเลม่ ในสินคา้ คงคลงั (พิมพร์ ายการ)
•ติดตามวิธีการหลายหนงั สืออยใู่ นสินคา้ คงคลงั
•ตรวจสอบขอ้ ผดิ พลาดของการป้ อนขอ้ มูลของไอ (รหสั การตรวจสอบเช่นเดียวกบั ความยาว)
• จากดั สินคา้ คงคลงั ไป 50 เล่ม (ตอนน้ี)
•ไมม่ ีการประมวลผลไฟล์ - โปรแกรมที่ไม่จาเป็นตอ้ งมีความสามารถที่จะบนั ทึกสินคา้ คงคลงั ท่ีจะยน่ื และอา่ นมนั กลบั มาอยใู่ นการ
ดาเนินการเตม็ รูปแบบจะมีคุณลกั ษณะที่ แตเ่ ราไม่ไดเ้ กี่ยวขอ้ งกบั การทีต่ อนน้ี.
•ให้ใชง้ านงา่ ย
•จะงา่ ยตอ่ การเปล่ียนแปลงและปรับปรุง
คุณจะตอ้ งดาเนินการอยา่ งใดอยา่ งหน่ึงของข้นั ตอนวิธีการตรวจสอบหลกั ISBN ที่กล่าวถึงในบทก่อนหนา้ เลือกรุ่นใดกต็ ามท่ีคุณรู้สึก
วา่ จะงา่ ยที่สุดสาหรับคุณท่ีจะเขียนและเขา้ ใจ
เพ่อื ให้ไดร้ บั ขอ้ มลู จากผใู้ ชท้ ่ีมีสองวิธีที่คุณสามารถใช้ คุณสามารถเขียนข้นั ตอนท่ีใชไ้ ม่ก่ี printf () งบพิมพเ์ มนูเก่ียวกบั ใจเช่นน้ี:
void PrintMenu( void )
{
/* print a bunch of empty lines first */
Learn Programming with C Page 63
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
printf("\n\n\n\n\n\n\n\n\n");
/* the \t is a special character that means tab */
printf("\t\t Type the first letter of the option
you want\n");
printf("\t\t\t [A]dd a book\n");
printf("\t\t\t [P]rint list of books\n");
/* add a couple more blank lines to make the menu
look nice */
printf("\n\n");
}
จากน้นั ในชีวติ ประจาหลกั ของคุณคุณจะมีบางส่ิงบางอยา่ งเช่นน้ี:
void main( void )
{
char ch;
PrintMenu();
printf("Type the letter you want and hit return:
");
scanf("%c", &ch);
printf("\n\n");
/* other code to call routines based on the user's
choice */
}
คุณไมจ่ าเป็ นตอ้ งใชต้ วั อกั ษร; คุณสามารถใชต้ วั เลขแทน ยกตวั อยา่ งเช่น 1 คือการเพมิ่ และ 2 คือการพมิ พ์ ลาดบั ของรายชื่อท่ีตาม
อาเภอใจ แตก่ ารปฏิบตั ิร่วมกนั คือการใส่การกระทาที่ไดท้ าบ่อย ๆ (เพิ่ม) ใกลด้ า้ นบนของเมนูและการกระทาท่ีดาเนินการไมบ่ ่อยอยู่
ดา้ นล่าง (พมิ พ)์ เดอะ
คุณไมจ่ าเป็ นตอ้ งท่ีจะเป็ นรายละเอียดเพ่ิมเติมตามตวั อยา่ งขา้ งตน้ คุณก็สามารถใช้ printf () และ scanf () เพอ่ื ขอใหท้ า่ นผใู้ ช้
ดาเนินการในลกั ษณะที่ง่ายข้ึนเช่นน้ี:
void main( void )
{
char ch;
printf("type the first letter of the action to
perform\n");
scanf("[A]dd a book, [P]rint book list: %c", &ch);
Learn Programming with C Page 64
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
}
การดาเนินการแต่ละ (เพม่ิ และพมิ พ)์ ควรจะเป็นข้นั ตอนท่ีแยกต่างหากหรือฟังกช์ นั่ น้ีช่วยใหร้ หสั "โมดูลาร์" และงา่ ยตอ่ การดูแลรักษา
และทาความเขา้ ใจ คุณควรต้งั ช่ือตามข้นั ตอนหรือการทางานเป็นไปตามการดาเนินการกค็ ือการดาเนินการ ตวั อยา่ งเช่น: AddBook,
PrintInventory
ส่ิงหน่ึงที่จาในการเขียนโปรแกรม: ถา้ การทางานของโปรแกรม - มนั ไมส่ ่ิงที่มนั ถูกออกแบบมาเพือ่ ทา - การดาเนินงาน (วิธีการท่ี
โปรแกรมถูกเขียน) ไม่ผดิ รหสั อาจจะไมม่ ีประสิทธิภาพและอาจไดร้ ับประโยชนจ์ ากการทาให้เพรียวลม แตม่ นั ก็ไมผ่ ิด
เพรียวลมและเพ่มิ ประสิทธิภาพโปรแกรมที่มาพร้อมกบั ประสบการณ์ ผมไมไ่ ดค้ าดหวงั ว่าคุณจะมีประสบการณ์และคุณไมค่ วรคาดหวงั
ของตวั เอง สิ่งที่คุณควรคาดหวงั คือการเรียนรู้โดยการทา เป็ นคุณต่อการเขียนโปรแกรมท่ีคุณจะไดเ้ รียนรู้วิธีการใหมแ่ ละดีกวา่ ท่ีจะ
บรรลุผลงานบางอยา่ ง แลว้ คุณสามารถใชค้ วามรู้ท่ีจะกลบั ไปและปรับแตง่ ซอฟตแ์ วร์ท่ีคุณไดเ้ ขียนไวก้ ่อนหนา้ น้ีหรือเพียงแค่นาไปใชก้ บั
โปรแกรมใหมท่ ่ีคุณเขียน.
เคลด็ ลบั กำรออกแบบDesign Hints
คุณไมจ่ าเป็ นตอ้ งอ่านบทน้ีถา้ คุณมีความคิดเกี่ยวกบั วิธีการท่ีจะบรรลุเป้ าหมายดงั กล่าวขา้ งตน้ หากคุณไมแ่ น่ใจหรือเพยี งแค่ตอ้ งการเป็น
ตวั ช้ีนอ้ ยที่จะมุ่งหนา้ คุณออกไปในทิศทางท่ีถูกตอ้ งอา่ นต่อ
วิธีท่ีงา่ ยที่สุดที่จะบรรลุเป้ าหมายท้งั หมดที่กล่าวขา้ งตน้ คือการใชอ้ าร์เรยร์ วมกนั และโครงสร้างสาหรับสินคา้ คงคลงั หนงั สือ ต้งั แต่ที่เรา
จดั การกบั จานวน จากดั ของขอ้ มูลอาร์เรยจ์ ะทางานอยา่ งสมบูรณ์ ใชอ้ าร์เรยท์ าใหง้ า่ ยตอ่ การกา้ วผา่ นสินคา้ คงคลงั พมิ พแ์ ละง่ายต่อการ
เพมิ่ รายการถา้ คุณติดตามตาแหน่งอาร์เรยท์ ี่ผา่ นมา นอกจากน้ียงั สามารถเปล่ียนแปลงไดอ้ ยา่ งง่ายดายในภายหลงั ไดโ้ ดยไม่ตอ้ งมี
ผลกระทบตอ่ ส่วนท่ีเหลืออยา่ งมีนยั สาคญั ของโปรแกรม
ไอควรจะใส่เป็ นอาร์เรยท์ ี่มีหน่ึงหลกั ของ ISBN ครองตาแหน่งหน่ึงในอาร์เรย์ ขนาดของอาร์เรยน์ ้ีกจ็ ะ 10 (0-9) วิธีหน่ึงคือการ
บรรลุเป้ าหมายน้ีคือการพยายามแยกออกจากแต่ละหมายเลขตามที่มีการป้ อนและวางค่าลงในอาร์เรย์ คุณจะตอ้ งทดสอบหาขอ้ ผดิ พลาด
ในระหวา่ งการป้ อนขอ้ มูลและแปลง X เพื่อ 10 บาทสาหรับการตรวจสอบท่ีเหมาะสม สาหรับคาแนะนาเพม่ิ เติมเกี่ยวกบั วธิ ีท่ีคุณอาจทา
เช่นน้ีมองผา่ นบทที่ 7 ในหนงั สือของคุณโดยเฉพาะอยา่ งยง่ิ หนา้ 211-215 และ 232-236
เพอื่ วตั ถุประสงคใ์ นการอานวยความสะดวกและเพราะมนั ง่ายตอ่ การรหสั ท่ีใชต้ วั แปรทวั่ โลกสาหรับโครงสร้างหนงั สืออาร์เรยห์ นงั สือ
อาร์เรย์ ISBN และตวั แปรดชั นีลงในอาร์เรยห์ นงั สือเล่มน้ีเพื่อให้คุณทราบจานวนหนงั สือท่ีคุณมีเพียงแค่มองตวั แปรที่ เป็นโบนสั เมื่อ
คุณไดร้ ับการตรวจสอบหมายเลข ISBN เกบ็ ไวเ้ ป็ นตวั แปรสตริงในโครงสร้างขอ้ มลู หนงั สือ น้ีเป็นเร่ืองง่ายที่จะทากวา่ เสียง จาเอาไว:้
อาร์เรยแ์ ละสตริงเป็นหลกั เทา่ กบั ยกเวน้ Terminator null "\ 0" ในตอนทา้ ยของสตริงซ่ึงหมายความวา่ ตวั แปรสตริงของคุณ
จะตอ้ งเป็ นหน่ึงในตวั ละครท่ีมีขนาดใหญ่กวา่ อาร์เรย์ ISBN ของคุณ.
เอกสำรประกอบของโปรแกรมProgram Documentation
Let 's talk เลก็ นอ้ ยเก่ียวกบั เอกสาร จดั เก็บเอกสารในโปรแกรมท่ีจะเกิดข้ึนในสองระดบั ระดบั แหล่งทมี่ าและระดบั ผใู้ ช้ เอกสาร
ระดบั ผใู้ ชค้ ูม่ ือการเขียนหรือเอกสารทคี่ ุณใหก้ บั คนท่ีจะใชโ้ ปรแกรมของคุณ ทุม่ เททางเทคนิค
Learn Programming with C Page 65
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
นกั เขียนที่ทางานใกลช้ ิดกบั โปรแกรมเมอร์ (คุณ) ท่ีจะช่วยใหผ้ ใู้ ชเ้ ขา้ ใจโปรแกรมมกั จะไมเ่ อกสารสาหรับผใู้ ชร้ ะดบั เป็นคร้ังคราว แต่
โปรแกรมเมอร์ท่ีจะทางานท่ี
เอกสารท่ีตอ้ งเขียนเป็ นเอกสารแหล่งทมี่ า โดยเอกสารแหล่งท่ีมาของผมหมายถึงการใชค้ วามคิดเห็นตลอดรหสั ที่มาที่จะอธิบายสิ่งที่
เกิดข้ึนในส่วนของรหสั น้ีไมส่ องส่ิง ก่อนจะช่วยทุกคนที่อาจจะอ่านรหััสของคุณในภายหลงั จะเขา้ ใจรหสั ท่ีดีกวา่ โปรแกรมเมอร์
สามารถคลุมเครือฉาวโฉ่เม่ือมนั มาถึงรหสั ของตวั เอง ทาดีที่สุดของคุณจะไม่ยอมจานนต่อส่ิงล่อใจที่ ส่ิงที่สองกไ็ มส่ ามารถที่จะช่วยให้
คุณโปรแกรมเมอร์เขา้ ใจสิ่งท่ีเกิดข้ึนในรหสั ของคุณถา้ คุณกลบั ไปไดใ้ นภายหลงั เพอ่ื ใหก้ ารเปลี่ยนแปลงหรือแมก้ ระทงั่ เพยี งแค่ตรวจสอบ
สิ่งที่คุณเขียน
คุณเคยเห็นตวั อยา่ งของความคิดเห็นของรหสั ที่มาในบางตวั อยา่ งตลอดหลกั สูตรน้ี ที่น่ีช้ีบางอยา่ งเก่ียวกบั การเขียนรหสั ที่มาดีเอกสารเป็น
2. 1; เขียนก่อนท่ีความละเอียดข้นั ตอนหรือฟังกช์ นั่ แสดงความคดิ เห็นบล็อกเพือ่ อธิบายสิ่งท่ีฟังกช์ น่ั ควรจะทา
8. เขียนแสดงความคิดเห็นตลอดท้งั ฟังกช์ น่ั หรือข้นั ตอนในการอธิบายถึงพ้ืนท่ีที่ไม่อาจจะเขา้ ใจไดท้ นั ที
ใน C, ความคิดเห็นบล็อกอาจมลี กั ษณะเช่นน้ี:
/*****************************************************
******
*
* FunctionName - This function does something really
cool.
*
******************************************************
*****/
ความคิดเห็นใน C ตอ่ ไปจนกวา่ จะมีการยกเลิกอยา่ งชดั เจนแมท้ อดหลายบรรทดั ความคิดเห็นท่ีเร่ิมตน้ ดว้ ยตวั อกั ษร / * และลงทา้ ยดว้ ย
ตวั อกั ษร * / คุณสามารถออกแบบความคิดเห็นบล็อก แต่คุณตอ้ งการ นอกจากน้ีคุณยงั สามารถเพม่ิ ขอ้ มูลความคิดเห็นของบลอ็ กเช่น
ผเู้ ขียนข้นั ตอนหรือฟังกช์ นั่ (ดีถา้ ทางานเก่ียวกบั โปรแกรมที่มีคนกลุ่มหน่ึง), วนั ที่มนั ถูกเขียนและบางทีคาอธิบายของพารามิเตอร์ที่.
ควำมคดิ เหน็ ทไ่ี ม่ดี Bad Comments
เช่นเดียวกบั ส่ิงท่ีดีอื่น ๆ อีกมากมายสามารถแสดงความคิดเห็นจะถูกทาร้ายหรือต้ือเม่ือมีความจาเป็น พจิ ารณาต่อไปน้ี:
short count; /* a count variable /*
...
test = 0; /* set test to 0 */
Learn Programming with C Page 66
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
...
addresses myAddresses[5000] /* an array to keep track
of addresses */
for (count = 0; count < 5000; count ++) /* a for loop
*/
PrintAddresses();
ความคิดเห็นเหล่าน้ีระบุชดั เจน programmner ไดเ้ ลือกไดท้ ่ีจะใชต้ วั แปรที่กาหนดอยา่ งชดั เจนใชข้ องพวกเขาและใหค้ วามเห็นท่ี
ไมจ่ าเป็ น Howerever แสดงความคิดเห็นในลูปและการกาหนดอยเู่ สมอการปฏิบตั ิท่ีดี แนวคิดพ้นื ฐานคือการใชว้ จิ ารณญาณของ
คุณ.
Learn Programming with C Page 67
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
Lesson 12: เทคนิคกำรแก้จุดบกพร่องDebugging Technique
คำอธิบำยบทเรียน Lesson Description: สิ่งสุดทา้ ยที่จะเรียนรู้ก่อนท่ีจะไปทางมา้ ของคุณเป็นเรื่องเลก็ ๆ นอ้ ย ๆ
เกี่ยวกบั การแกจ้ ุดบกพร่องเทคนิค; วา่ มีวิธีการติดตามและแกไ้ ขปัญหาในโปรแกรมของคุณ
วธิ ีกำรแก้จุดบกพร่องDebugging Methods
มีวิธีการที่แตกตา่ งกนั หลายโปรแกรมเมอร์ใชเ้ พือ่ "แกป้ ัญหา" รหสั ของพวกเขา แกจ้ ดุ บกพร่องเป็นกระบวนการของการที่จะผา่ น
โปรแกรมของคุณเพอ่ื หาขอ้ ผดิ พลาดและปัญหาท่ีเกิดข้ึนแลว้ กาจดั พวกเขา ลองดูท่ีวิธีการที่แตกต่างกนั ท้งั คู่.
งบยทุ ธศำสตร์Strategic Statements
หน่ึงในเทคนิคที่งา่ ยท่ีสุดที่จะใชใ้ นการแกจ้ ดุ บกพร่องของโปรแกรมคือการใชง้ บ printf วางกลยทุ ธ์ ใชโ้ ทร printf ในการพิมพท์ ี่
คุณอยใู่ นรหสั ที่มาหรือการพมิ พค์ า่ ของตวั แปรที่จดุ ท่กี าหนดในเวลาที่ช่วยใหค้ ณุ สามารถติดตามความคืบหนา้ อยา่ งแขง็ ขนั ของ
โปรแกรมของคุณ
ตวั อยา่ งเช่นสมมติวา่ ผมเขียนประจาที่เรียกฟังกช์ นั่ เฉพาะ แตผ่ ลท่ีไดจ้ ากฟังกช์ นั่ ที่มีท้งั ท่ีผิดพลาดหรือโปรแกรม "ลอ็ ค" และไม่ได้
กลบั มาจากการเรียกใชฟ้ ังกช์ นั ฉนั สามารถวางคาสง่ั printf แค่ก่อนทีผ่ มเรียกฟังกช์ นั่ และท่ีอ่ืนในการทางานท่ีจะรู้วา่ โปรแกรมของ
ฉนั จริงมีจุดหน่ึง.
void main( void )
{
long num = 0;
/* some other code may go here */
printf("Calling function CalculateSomething()\n");
num = CalculateSomething();
printf("The value of num after
CalculateSomething() is %d",num);
}
ในตวั อยา่ งน้ีถา้ คุณไม่เห็นขอ้ ความจากโทร printf สองบนหนา้ จอท่ีคุณรู้วา่ บางสิ่งบางอยา่ ง messed ข้ึนในระหวา่ งการเรียกร้องให้
CalculateSomething () และคุณตอ้ งการท่ีจะขดุ ต่อไป
คุณสามารถทาส่ิงอื่น ๆ ท่ีมียทุ ธศาสตร์ printf เช่นกนั ตวั อยา่ งเช่นคุณสามารถพิมพค์ ่าของพารามิเตอร์ก่อนที่จะเรียกประจาและพิมพ์
สิ่งท่ีมีคา่ ท่ีมีเม่ือคุณมาถึงในชีวิตประจาวา่
บางภาษาและระบบปฏิบตั ิการท่ีอนุญาตให้มีชนิดอื่น ๆ ของงบยทุ ธศาสตร์ ยกตวั อยา่ งเช่นการเรียกระบบปฏิบตั ิการท่ีจะทาใหเ้ สียงเตือน
หรือหยดุ โปรแกรมท่ีจะรอขอ้ มูลจากผูใ้ ช้ มนั ข้ึนอยกู่ บั ทางเลือกของภาษาและระบบปฏิบตั ิการเฉพาะ
Learn Programming with C Page 68
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
คุณสมบตั ิที่คุณตอ้ งการใช้ พมิ พข์ อ้ มูลไปยงั หนา้ จอเป็นชนิดที่พบมากที่สุดของการแกจ้ ุดบกพร่องงบยทุ ธศาสตร์.
คดั ลอกยำกแก้จุดบกพร่องHard-Copy Debugging
คดั ลอกยากแกจ้ ดุ บกพร่องเป็นคร้ังท่ีสองรูปแบบที่พบมากที่สุดของการแกจ้ ดุ บกพร่อง ในความเป็นจริงกระบวนการของการแก้
จุดบกพร่องคดั ลอกยากเป็ นสิ่งที่นาไปสู่การดีบกั แหล่งที่มาในระดบั ทเ่ี ราจะหารือในหวั ขอ้ ถดั ไป
ใส่เพยี งแคค่ ดั ลอกยากแกจ้ ดุ บกพร่องที่เก่ียวขอ้ งกบั การพิมพอ์ อกรหสั ทีม่ ากบั โปรแกรมของคุณและใชด้ ินสอและบางทีบางกระดาษ
พิเศษติดตามผา่ นโปรแกรมของคุณวา่ คณุ มีเครื่องคอมพิวเตอร์ คุณมองไปท่ีแตล่ ะบรรทดั ของรหสั อยา่ งระมดั ระวงั เพอ่ื พยายามท่ีจะคิด
ออกวา่ มนั จะทา หากมีการคานวณทางคณิตศาสตร์ใด ๆ ที่เกี่ยวขอ้ งกบั การดาเนินการใหค้ ุณและเขียนผล ถา้ ตวั แปรมกี ารเปลี่ยนแปลง
มูลค่าท่ีคุณเขียนลงคา่ ใหม่ เมื่อคุณกา้ วผา่ นห่วงคุณเขยี นลงผลของแตล่ ะผา่ นห่วงเพื่อใหค้ ุณสามารถติดตามส่ิงที่คุณคิดวา่ เป็นส่ิงท่ีเกิดข้ึน
และเปรียบเทียบกบั ส่ิงที่อาจจะเกิดข้ึนจริงๆ
เห็นไดช้ ดั วา่ คดั ลอกยากแกจ้ ุดบกพร่องอาจจะเป็นกระบวนการทีใ่ ชเ้ วลานาน แตก่ ไ็ มจ่ าเป็นเสมอที่จะพิมพอ์ อกแหล่งที่มาสาหรับ
โปรแกรมท้งั หมด บ่อยคร้ังสิ่งท่ีคุณตอ้ งการที่จะพิมพเ์ ป็นเพียงไม่กี่ไฟลท์ ี่สาคญั (ในกรณีของโครงการหลายไฟล)์ หรือการปฏิบตั ิและ
เพยี งแคต่ ิดตามผา่ นเหล่าน้นั
ในขณะทกี่ ารแกจ้ ดุ บกพร่องรหสั ทม่ี าวิธีน้ีจะน่าเบ่ือมากกย็ งั สามารถเป็นท่ีคุม้ คา่ มาก คุณเรียนรู้เลก็ ๆ นอ้ ย ๆ เก่ียวกบั โปรแกรมของคุณ
โดยการคิดเช่นคอมพวิ เตอร์ คุณมกั จะพบความผดิ พลาดไดง้ า่ ยข้ึนมากดว้ ยวธิ ีน้ีโดยเฉพาะอยา่ งยง่ิ ความผิดพลาดในตรรกะ นอกจากน้ีคุณ
ยงั อาจตอ้ งการท่ีจะขอให้คนที่จะช่วยใหค้ ุณกบั กระบวนการ มกั จะเป็นมุมมองใหมใ่ นรหสั ของคุณพบขอ้ บกพร่องทีเ่ ร็วมาก ผมไม่ทราบ
วา่ หลายคร้ังที่ฉนั ไดด้ ูทีบ่ รรทดั ของรหสั ท่ีมาพยายามที่จะหาขอ้ ผิดพลาดและคนท่ี (มกั ภรรยาของฉนั ) มีลกั ษณะท่ีมนั และบอกวา่ เป็น
"ฉนั คดิ วา่ คุณลืมเครื่องหมายจลุ ภาคท่ีน่ี." จาเป็นตอ้ งพดู เธอมกั จะขวา.
ระดบั แหล่งดบี กั เกอร์ Source-Level Debuggers
ตอนน้ีท่ีเราไดค้ รอบคลุมบางส่วนของเทคนิคการแกจ้ ดุ บกพร่องแบบด้งั เดิมให้มาพดู คุยเกี่ยวกบั วิธีการเปลี่ยนแปลงในคอมไพเลอร์และ
การแนะนาของสภาพแวดลอ้ มการพฒั นา (IDEs) ทาให้ชีวติ ของคุณท่ีง่ายมาก เนื่องจากหลกั สูตรน้ีใช้ Metrowerks
CodeWarrior IDE เป็นพ้นื ฐานที่ฉนั จะมงุ่ เนน้ ไปที่มนั อยา่ งไรกต็ ามการอภิปรายน้ีสามารถนาไปใชแ้ ละแหล่งท่ีมา IDE
เคร่ืองมือระดบั การแกจ้ ดุ บกพร่องใด ๆ หรือ IDE
แบบบรู ณาการการพฒั นาสภาพแวดลอ้ มท่ีมีการเรียกเช่นน้ีเพราะพวกเขารวมคอมไพเลอร์, แกไ้ ข, เครื่องมือการบริหารจดั การโครงการ
และการดีบกั ลงในแพคเกจเดียว หนา้ ต่างโครงการใน CodeWarrior เช่นช่วยใหค้ ุณสามารถดูไฟลท์ ้งั หมดท่ีห้องสมดุ และเชื่อมโยง
กบั โครงการของคุณและยงั ใหพ้ วกเขาอยใู่ นกลุ่ม.
Learn Programming with C Page 69
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
รูปท่ี 12-1: CodeWarrior โครงการ
CodeWarrior ยงั ช่วยให้คณุ เปิ ดข้อมลู การดีบกั และปิ ดแฟ้ มโดยเฉพาะอย่างยิ่งทางด้านขวาในหน้าต่างโครงการ คุณสามารถเพ่ิม
และลบไฟล์โดยใช้การลากและวางเช่นเดียวกบั การได้รับ "ภาพรวม" ดูท่ีโครงการของคณุ
ดีบกั ระดบั แหล่งรวมกับ CodeWarrior เป็นหน่ึงในมีประสิทธิภาพมากท่ีสุดของ IDE ใด ๆ คณุ สามารถก้าวผ่านเส้นรหัส
ต้นฉบบั ของคณุ โดยสายโดยใช้ป่ มุ ควบคุมโปรแกรม (หรือแป้ นพิมพ์ลดั ) จึงช่วยให้คณุ ความสามารถเดียวกนั ของการแก้จดุ บกพร่อง
คัดลอกยากผ่านวิธีการทางอิเลก็ ทรอนิกส์ คณุ สามารถดตู วั แปรและดพู วกเขาขณะท่ีพวกเขามีการเปล่ียนแปลงในบานหน้าต่างตัวแปร คณุ
สามารถมองเห็นสิ่งท่ีฟังก์ช่ันที่คณุ ได้เรียกว่าสแตค็ ในบานหน้าต่างการรวบรวมข้อมลู ที่ช่วยให้คุณสามารถติดตามเส้นทางที่โปรแกรม
ของคณุ เอาไปรับไปยงั จดุ ท่ี นอกจากนีค้ ุณสามารถข้ามไปมาระหว่างไฟล์และฟังก์ชั่นและรหัสที่มาแสดงผลในรูปแบบที่มาประกอบ (ท่ี
เรียกว่าภาษาเครื่อง) หรือรุ่นที่ผสมของทั้งสอง.
Learn Programming with C Page 70
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559
Figure 12-2: CodeWarrior Debugger Window
มีมากข้ึน CodeWarrior IDE สามารถทาเพื่อคุณกวา่ สามารถอธิบายไดท้ ี่น่ีในบทเรียนส้นั ผมขอแนะนาใหค้ ุณไปดูบทเรียน
เช่นเดียวกบั การพิมพเ์ อกสารและอิเล็กทรอนิกส์ท่ีมาพร้อมกบั CodeWarrior เพอื่ เรียนรู้เพิ่มเติมเก่ียวกบั อานาจและความยดื หยนุ่ .
Learn Programming with C Page 71
แปลโดยจำรัส เจริญเขตต์
2 พฤษภำคม 2559