การเขยี นโปรแกรมภาษาซี
โดย
วจิ กั ษณ ศรีสัจจะเลิศวาจา
ดษุ ฎี ประเสรฐิ ธติ พิ งษ
ภาควิชาวิทยาการคอมพิวเตอร
คณะวทิ ยาศาสตร มหาวทิ ยาลยั เชยี งใหม
พฤษภาคม 2545
สารบัญ 1
1
บทท่ี 1. แนะนาํ ภาษาซี 1
1.1 แนะนาํ ความเปนมา 5
1.2 รปู แบบโปรแกรมภาษาซี 6
1.3 ตัวแปร 9
1.4 ชนิดขอมูล 11
1.5 การใชต วั แปร 17
1.6 การรบั ขอ มูลและแสดงผลขอ มลู 19
แบบฝก หดั บทท่ี 1 19
21
บทท่ี 2. ตวั ดาํ เนนิ การและนพิ จน 23
2.1 ตวั ดาํ เนินการกาํ หนดคา 24
2.2 ตวั ดาํ เนินการคณิตศาสตร 25
2.3 ตวั ดาํ เนินการกาํ หนดคา แบบผสม 26
2.4 ตวั ดาํ เนินการเพิ่มคาและลดคา 27
2.5 ตวั ดาํ เนินการเปล่ยี นชนดิ ขอมูล 28
2.6 ตวั ดาํ เนินการคอมมา 29
2.7 ตวั ดาํ เนนิ การความสัมพันธ 31
2.8 ตวั ดาํ เนนิ การความเทากัน 33
2.9 ตวั ดาํ เนนิ การตรรกะ 35
2.10 ตวั ดาํ เนนิ การเงอ่ื นไข 35
แบบฝก หดั บทท่ี 2 44
48
บทท่ี 3. คาํ สั่งควบคุม 53
3.1 คาํ สง่ั if 61
3.2 คาํ สงั่ switch 64
3.3 คําส่ัง for 69
3.4 คําส่งั while 69
3.5 คาํ สงั่ do-while 73
แบบฝก หดั บทท่ี 3 77
บทท่ี 4. ฟงกชัน
4.1 แนวความคิดในการออกแบบฟงกชัน
4.2 รปู แบบของฟง กช ัน
4.3 การประกาศโปรโตไทปของฟงกชัน
4.4 ขอบเขต 79
4.5 ฟง กชันแบบเรียกซํ้า 81
4.6 ตวั อยางเพิ่มเติม 84
4.7 ไลบรารีมาตรฐานของภาษาซี 87
แบบฝก หดั บทท่ี 4 90
บทท่ี 5. พอยนเ ตอร 94
5.1 พอยนเตอรกับแอดเดรส 94
5.2 การประกาศตัวแปรพอยนเตอร 95
5.3 การกาํ หนดคาและการอานคาตัวแปรพอยนเตอร 95
5.4 พอยนเตอรและอารก วิ เมนทของฟงกช ัน 99
แบบฝก หดั บทท่ี 5 110
บทท่ี 6. ตัวแปรชุด 113
6.1 รปู แบบการประกาศตวั แปรชดุ 113
6.2 การใชพอยนเตอรกับตัวแปรชุด 125
6.3 ตวั แปรชุดของตัวอักขระ 128
6.4 การคํานวณกับแอดเดรส 131
6.5 ฟง กชันมาตรฐานของสตริง 133
6.6 ตวั แปรชดุ แบบหลายมติ ิ 135
6.7 การกาํ หนดคาเริ่มตนใหกับตัวแปรชุด 2 มิติ 138
6.8 การใชงานตัวแปรชุด 2 มิติ 138
6.9 คอมมานไลนอารกิวเมนท 146
แบบฝก หดั บทท่ี 6 149
บทท่ี 7. โครงสรา งและยูเนยี น 152
7.1 ความรทู ว่ั ไปเกย่ี วกบั โครงสรา ง 152
7.2 การใชงานตัวแปรโครงสราง 153
7.3 การเก็บขอมูลแบบโครงสราง 158
7.4 การใชขอมูลแบบโครงสรางกับฟงกชัน 160
7.5 การใชพ อยนเ ตอรก บั ตวั แปรโครงสรา ง 163
7.6 การใชคาํ สั่ง typedef กบั โครงสราง 167
7.7 การใชต ัวแปรชุดเปนสมาชิกของโครงสราง 169
7.8 ตวั แปรชุดของโครงสราง 172
7.9 ยูเนียน 178
แบบฝก หดั ทา ยบทท่ี 7 182
บทท่ี 8. การจัดการแฟมขอมูล 185
8.1 ฟง กช นั ทใ่ี ชส ําหรบั การประมวลผลแฟม ขอ มลู 185
8.2 การบนั ทกึ ขอ มลู ลงแฟม ขอ มลู 187
8.3 การอานขอมูลจากแฟมขอมูล 188
8.4 แฟม ขอมูลแบบเขาถึงโดยตรง 191
8.5 แฟม ขอ มลู แบบเรคคอรด 192
8.6 อปุ กรณมาตรฐานในการนาํ เขาและแสดงผลขอมูล 195
8.7 การรองรับความผดิ พลาดจากการทาํ งาน 196
8.8 ตวั อยางเพิ่มเติม 197
แบบฝก หดั ทา ยบทท่ี 8 204
205
บรรณานกุ รม
แนะนาํ ภาษาซี
Introduction to C Programming Language 1
ภาษาโปรแกรม (Programming Languages) ทมี่ กี ารคดิ คนขึ้นมาใชกับคอมพิวเตอรนั้นมีหลายพัน
ภาษา แตภ าษาทเ่ี ปน ทร่ี จู กั และเปน ทน่ี ยิ มใชทว่ั ไปนน้ั อาจจะมเี พยี งหลายสบิ ภาษา เชน โคบอล (COBOL)
ปาสคาล (Pascal) เดลไฟล (Delphi) วชิ วลเบสิก (Visual Basic) ซี (C) จาวา (Java) เปน ตน ซึ่งแตละภาษา
สรา งขนึ้ ดว ยวัตถุประสงคที่แตกตางกันและมีจุดเดนของภาษาที่ตางกัน ภาษาซ(ี C Programming Language)
เปนภาษาเชิงโครงสรางท่ีมีการออกแบบโปรแกรมในลักษณะโมดูลที่มีจุดเดนในเร่ืองของประสิทธิภาพการ
ทาํ งานทเ่ี รว็ มีความยืดหยุนในการเขียนโปรแกรมสูง
เนอื่ งจากมผี ผู ลติ คอมไพเลอรเพื่อใชแปลภาษาซีหลายบรษิ ัท ตัวอยางตาง ๆ ทน่ี าํ เสนอในหนงั สอื เลม น้ี
เปน ตวั อยางที่นาํ เสนอโดยใชคอมไพเลอรของ Turbo C เวอรช นั 3.0 ของบรษิ ทั บอรแ ลนด โดยพยายามเขียนใน
รปู แบบทเี่ ปน มาตรฐานหากผูอานนําไปใชกับคอมไพเลอรของบริษัทอื่นจะไดมีการปรับแกไมมากนัก เพื่อใหผ ู
อา นไดเ ห็นภาพการพัฒนาโปรแกรมเชิงโครงสรางอยางชัดเจน
1. ประวัติความเปนมา
ภาษาซไี ดร บั การพฒั นาขน้ึ โดยเดนนสิ รทิ ชี (Dennis Ritchie) ขณะทท่ี าํ งานอยทู เ่ี บลแลบ็ บอราทอรี
(Bell Laboratories) โดยพฒั นาขึ้นจากหลักการพื้นฐานของภาษาบี (B) และบซี พี แี อล (BCPL) ในชวงป ค.ศ.
1971 ถงึ 1973 แตไ ดเพิ่มชนิดขอมูลและความสามารถอื่น ๆ ใหมากขึ้น และนาํ ภาษาซีไปใชพัฒนาระบบปฏิบัติ
การยูนิกซ (UNIX) บนเครื่องคอมพิวเตอร DEC PDP-11 ภาษาซเี ปน ทน่ี ยิ มใชอ ยา งแพรห ลายในชว งตน ทศวรรษ
ท1่ี 980 จนกระทงั่ มคี วามพยายามกําหนดมาตรฐานของภาษาเพื่อใหสามารถใชภาษาซีไดบนเครื่องคอมพิวเตอร
ใด ๆ ในป ค.ศ. 1983 โดย ANSI (The American National Standards Institute) ไดต ั้งคณะกรรมการ X3J11
เพอื่ รางมาตรฐานดังกลาว และไดรับการตรวจสอบและยอมรับโดย ANSI และ ISO (The International
Standards Organization) โดยมกี ารตพี มิ พมาตรฐานของภาษาซีในป ค.ศ. 1990 จากความมีประสิทธิภาพ
และสามารถทาํ งานบนเครอ่ื งคอมพวิ เตอรใ ด ๆ ของภาษาซีจึงไดมีการนาํ ภาษาซีไปใชในการพัฒนาระบบปฏิบัติ
การตา ง ๆ และใชเปนตนแบบของภาษาอื่น ๆ ทส่ี าํ คญั ในปจ จบุ นั เชน ซพี ลสั พลสั (C++) จาวา (Java) เปนตน
2. รปู แบบโปรแกรมภาษาซี
ในการเขยี นภาษาโปรแกรม ผูเขียนโปรแกรมจะตองศึกษารูปแบบพื้นฐานของภาษา และไวยากรณ
ของภาษานน้ั รปู แบบพื้นฐานของภาษาจะเขียนโปรแกรมในลักษณะของโมดูลคือมีการแบงออกเปนสวนยอย ๆ
ทเี่ รียกวา ฟงกชัน (Function) แสดงดังตัวอยางที่ 1.1 และรปู ท่ี 1.1
2
ตวั อยางที่ 1.1 แสดงตวั อยางโปรแกรมภาษาซีเบื้องตน
#include <stdio.h>
void main( ) {
/* Display message to standard output */
printf(“My first program.”);
}
ผลการทํางานของโปรแกรม
My first program.
ระวัง - การพมิ พต วั อกั ษรตัวพิมพใหญและตัวพิมพเล็กตางกัน จะทําใหเ กิดความผดิ พลาด
- ตรวจสอบวามีการพิมพขอความตาง ๆ เหมือนกับตัวอยาง
รปู ท่ี 1.1 แสดงสวนประกอบของโปรแกรมภาษาซีเบื้องตน
สว นประกอบที่ 1 สวนหัว (Header) จะเปน สว นทอ่ี ยทู ต่ี อนตน ของโปรแกรม โดยอยูนอกสว นที่
เรยี กวาฟงกชัน ทสี่ ว นหวั ของโปรแกรมจะประกอบดว ยคําสั่งที่เปนการกาํ หนดคาหรือกาํ หนดตัวแปรตาง ๆ คํา
สงั่ ในท่ขี ้ึนตนดวยสัญลักษณ # เปน คาํ สั่งที่เรียกวา ตัวประมวลผลกอ น (Preprocessor) คอื คาํ สั่งที่จะไดรับการ
ทาํ กอ นทจ่ี ะมกี ารคอมไพลโ ปรแกรม ตัวประมวลผลกอ น ทส่ี าํ คัญของภาษาซีแบงออกเปน 2 ประเภทดงั น้ี
• # include
ในภาษาซจี ะมฟี ง กชนั มาตรฐานทผ่ี ผู ลติ คอมไพเลอรไ ดจ ดั เตรยี มไวให ซึ่งมักจะเกี่ยวของ
กบั การรับขอมูล การแสดงผลขอ มูล การคาํ นวณ และอน่ื ๆ ซึ่งผูเขียนโปรแกรมสามารถ
เรยี กใชง านไดท นั ที โดยไมตองเขียนโปรแกรมแกรมเอง ในตัวอยางจะมีการใชคาํ ส่งั
3
printf( ) ซงึ่ เปน คาํ สงั่ ที่ใชแสดงขอความออกทางอุปกรณแสดงผลมาตรฐาน เชน จอภาพ
คาํ สัง่ printf( ) เปน การเรยี กใชฟงกชันมาตรฐานซึ่งอยูในกลุมที่เรียกวา Standard Input
and Output เมอื่ จะเรยี กใชฟงกชันใดในกลุมดังกลาว จะตองบอกใหคอมไพเลอรไปอาน
คาทอ่ี ยใู นอนิ คลชู ไฟลท ช่ี อ่ื stdio.h มาไวท ส่ี ว นตน ของโปรแกรม โดยใชคาํ สั่ง
#include <stdio.h>
เพราะฉะนั้นผูเขียนโปรแกรมควรจะศึกษาฟงกชันมาตรฐานที่คอมไพเลอรแตละบริษัทได
เตรยี มไวใหวาคําสั่งใดใชคูกับอินคลูชไฟลใด
• # define
ใชส าํ หรบั การกาํ หนดคาคงที่ ตัวอยางเชน
#define YES 1
คาํ สงั่ ดงั กลาวเปน การกําหนดวา หากที่ใดในโปรแกรมมีคําวา YES จะถกู แทนที่ดวยคาทาง
ขวามือ ในที่นี้คือ 1
นอกจากในสว นหัวของโปรแกรมอาจจะมีการประกาศตัวแปร และสว นของการประกาศโปรโตไทปไ วท ส่ี ว นหวั
ของโปรแกรมไดอีกดวย ซึ่งจะกลาวถึงในบทตอ ๆ ไป
สว นประกอบท่ี 2 ฟงกชัน (Function) สว นของฟง กช นั คือสว นของคําสั่งที่บอกใหคอมพิวเตอร
ทาํ งานตา ง ๆ เชน การรับขอมูล การคาํ นวณ การแสดงผล เปนตน โปรแกรมภาษาซีจะประกอบดวยฟงกชัน
ยอ ยหลาย ๆ ฟงกชัน แตจะมีฟงกชันหลักฟงกชันหนึ่งที่ชื่อวาฟงกชัน main( ) เสมอ โดยที่การทํางานของ
โปรแกรมจะตองเริ่มการทํางานจากฟงกชันนี้
กฎพน้ื ฐานทส่ี าํ คัญในภาษาซี
• การพมิ พต วั อกั ษรตัวพิมพใหญและตัวพิมพเล็กในภาษาซีนั้นในผลลัพธที่แตกตางกัน (Case
Sensitive) ตวั อยางเชน หากมีการพิมพ main( ) กลายไปเปน Main( ) กจ็ ะเกดิ ความผิดพลาด
ขึน้
• ฟง กช นั ของภาษาซีจะแบงขอบเขตของฟงกชันแตละฟงกชันดวยเครื่องหมาย { } ในตวั อยางมี
ฟงกชัน void main( ) คาํ วา void จะบอกใหร วู าเมื่อฟงกชันนี้ทํางานเสร็จจะไมมีการคืนคากลับ
ไปยงั สงิ่ ที่เรียกใชงานฟงกชัน ในกรณีของฟงกชัน main( ) กค็ อื จะไมมีการคืนคาใด ๆ กลับไปยัง
ระบบปฏิบัติการ หลังฟงกชันจะตองตามดวย ( ) เสมอ โดยที่ภายในวงเล็บจะประกอบดวย
คา ทสี่ ง เขามายังฟงกชัน ที่เรียกวาพารามิเตอร (Parameter) หรอื อาจจะไมมีคาใด ๆ สงเขามาก็
ได
• คาํ สง่ั ตา ง ๆ ซึ่งตองเขียนอยูในฟงกชันเสมอ แบงเปน 2 สวนคือสวนของการประกาศตัวแปรที่
ตอ งการใชใ นฟง กช ัน และสวนของคาํ สั่งเพื่อทํางานใดงานหนึ่ง ในที่นี้มีเฉพาะคาํ สั่งที่ใชในการ
4
แสดงผลลพั ธอ อกทางจอภาพ คือ printf( ) ใชส าํ หรบั การแสดงผลลพั ธอ อกทางจอภาพ หาก
ตอ งการแสดงขอ ความใด ๆ ออกทางจอภาพใหเขียนขอความนั้นอยูภายในเครื่องหมาย “ “
• คาํ สงั่ ในภาษาซีจะตองปดทา ยดวยเครื่องหมาย ; (Semicolon) เนอื่ งจากภาษาซีจะใชเครื่อง
หมาย ; ในการแยกคาํ สั่งตาง ๆ ออกจากกัน การเวนบรรทัดหรือการเขียนคาํ สั่งไมตอเนื่องกันจะ
ไมม ผี ลตอคอมไพเลอร แตเปนการชวยใหผูเขียนโปรแกรมอานโปรแกรมไดงายขึ้นเทานั้น
จากตวั อยา งท่ี 1.1 อาจจะเขียนโปรแกรมในลักษณะตาง ๆ ซึ่งไมมีผลตอการทํางานของคอมไพเลอรดังตัวอยาง
ท่ี 1.2 และ 1.3
ตวั อยางที่ 1.2 แสดงตวั อยางโปรแกรมภาษาซีเบื้องตน
#include <stdio.h> void main( ) { /* Display message to standard output */ printf
(“My first program.”); }
ตวั อยางที่ 1.3 แสดงตวั อยางโปรแกรมภาษาซีเบื้องตน
#include
<stdio.h>
void
main
(
)
{
/* Display message
to standard
output */
printf
(
“My first program.”
)
;
}
ไมว า ผใู ชจ ะเขียนโปรแกรมในลักษณะที่ 1.1 1.2 หรอื 1.3 คอมไพเลอรจะทํางานไดผ ลลพั ธเ ดยี วกนั
เสมอ เพราะฉะน้ันการเขยี นโปรแกรมท่ีเปน ระเบยี บจะชว ยใหผเู ขียนโปรแกรมหรอื ผูอน่ื ทม่ี าอา นโปรแกรมอาน
ไดง ายขึ้น โดยทั่วไปมักใชระบบของการเยื้อง (Indentation) เขา มาชวยใหโปรแกรมอานไดงายขึ้น พจิ ารณา
5
จากตัวอยางที่ 1.2 และ 1.3 ซึ่งไมมีการเยื้องกับตัวอยางที่ 1.1 ทเี่ ขยี นโดยมีลักษณะของการเยื้อง การเยื้องนั้น
อาจจะใชการเคาะชองวาง (Space Bar) เปน จาํ นวน 3-5 ทีเพื่อใหเกิดการเยื้อง
นอกจากนหี้ ากผใู ชตองการใสคาํ อธบิ ายลงในโปรแกรม ก็สามารถทําไดโดยใชสิ่งที่เรียกวา Comment
ขอบเขตของ Comment จะขึ้นตนตั้งแต /* จนกระทั่งถึง */ ขอ ความใด ๆ ที่อยูในขอบเขตของเครื่องหมายดัง
กลา วจะไมถูกแปลโดยคอมไพเลอร โดยทั่วไปจะมีการใช Comment เพอื่ อธิบายวาโปรแกรมนั้นทาํ งานอะไร
ใชอ ธบิ ายคาํ สงั่ แตละคําสงั่ ใชอธิบายฟงกชันแตละฟงกชัน และใชอธิบายกลุมของคําสัง่ โดยเขียน
Comment ไวด า นบนหรือดานขางของสิ่งที่ตองการอธิบาย เชน หากเปนการอธิบายโปรแกรมจะเขียน
Comment ไวท ต่ี นของโปรแกรมนน้ั หากเขียนอธิบายฟงกชันจะเขียน Comment ไวดานบนของฟงกชันที่
ตอ งการอธบิ าย เขียนอธิบายคาํ สั่งอาจจะเขียน Comment ไวด า นบนหรอื ดา นขา งของคาํ สั่งนั้น ๆ และเขียน
อธบิ ายกลมุ คําสั่งก็จะเขียนอธิบายไวดานของกลุมคาํ สั่งนั้น
3. ตัวแปร
ในการเขยี นโปรแกรมคอมพิวเตอรกระบวนการสาํ คัญที่เกิดขึ้น คือ การรับขอมูล การประมวลผล
ขอ มลู และการแสดงผลขอ มลู จะเห็นวาสิ่งที่เปนสวนสําคัญที่สุดคือขอมูล การทาํ งานของโปรแกรมขณะใด
ขณะหนงึ่ จะตอ งมีการเก็บขอมูลไวในคอมพิวเตอร โดยรับขอมูลจากอุปกรณรับขอมูลไปเก็บไวในสว นที่เรียกวา
หนว ยความจาํ และสงขอมูลจากหนวยความจาํ ไปประมวลผลในหนว ยประมวลผลกลาง โดยผานคาํ สั่งตาง ๆ
เมอื่ ประมวลผลเสร็จแลวก็นําผลลพั ธท ไ่ี ดกลบั มาเกบ็ ไวท ห่ี นว ยความจําอีก เมื่อตองการใหแสดงผลก็จะใชคํา
สงั่ ใหไ ปอานขอมูลจากหนว ยความจาํ สง ขอ มลู นน้ั ไปยงั อปุ กรณแ สดงผล
พจิ ารณาจากตวั อยางการบวกเลข แสดงดังรูปที่ 1.2 โดยใหรับคาจาํ นวนเต็ม 2 คาจากผูใช และนาํ
ไปเกบ็ อยใู นหนว ยความจาํ ตาํ แหนง ท่ี 0 มีคา 15 ตําแหนง ท่ี 1 มีคา 30 หากตองการบวกนําคาทั้ง 2 มาบวกกัน
และเกบ็ ไวท ต่ี าํ แหนง ท่ี 2 จะตองใชคําสั่งในการบวก สมมติดังตัวอยาง Add 0 , 1 , 2 คอื การเอาคา ณ
ตาํ แหนง ท่ี 0 และ 1 มาบวกกนั และนาํ ไปเก็บที่ตาํ แหนง ท่ี 2 จะไดวามีการอานคา 15 จากตําแหนง ท่ี 0 ไป
บวกกบั คา 20 จากตําแหนง ท่ี 1 ไดผ ลลพั ธค อื 45 นาํ ไปเก็บในตําแหนง ท่ี 2
รปู ท่ี 1.2 แสดงแบบจาํ ลองการบวกเลขในคอมพิวเตอร
6
ในความเปน จรงิ ตาํ แหนงตาง ๆ ไมไดอางดวยเลข 0 1 หรอื 2 แตอางดวยระบบการอางที่อยูซึ่งเปน
ซบั ซอ นกวา นน้ั การเขียนในลักษณะที่เหน็ ในตัวอยางเปน การเขียนในภาษาคอมพิวเตอรย ุคแรก เชน
แอสเซมบลี (Assembly) เพอ่ื ความสะดวกในการอา งถงึ ขอ มลู ณ ตําแหนงตาง ๆ ในหนวยความจาํ จึงไดมีการ
พฒั นากนั ตอมา จนกระทั่งเปนการอางในระบบของชื่อตัวแปร (Variable) ทใ่ี ชใ นปจ จบุ นั พิจารณาจากตัว
อยา งทีใ่ ชร ะบบชอื่ ตัวแปรแสดงดงั รปู ที่ 1.3 ผเู ขยี นโปรแกรมสรางตัวแปรขึ้นมา จะเกิดการจองพื้นที่ในหนวย
ความจาํ ใหโ ดยอตั โนมัติ ผูใชไมจําเปนตองรูวาตัวแปรนั้นอยูที่ตาํ แหนงใด การอางถึงชื่อตัวแปรคือการอางถึง
ขอ มลู ในหนวยความจาํ เพราะฉะนั้นหากผูใชสรางตัวแปร a และ b เพอื่ เก็บขอมูล 15 และ 20 ตามลําดับ เมื่อ
ตอ งการหาผลบวกและนาํ คาไปเก็บไวที่หนึ่ง ก็สรางตัวแปรขึ้นมาเพื่อเก็บผลลัพธสมมติชื่อวา c การสั่งให
ทาํ งานก็สามารถทาํ ไดโดยใชคาํ ส่งั c = a + b ซงึ่ อา นไดเขาใจไดงายกวาคาํ สัง่ add 0, 1, 2
รปู ท่ี 1.3 แสดงแบบจาํ ลองการบวกเลขโดยอางชื่อตัวแปร
4. ชนิดขอมูล
ในการใชง านตวั แปรนน้ั สง่ิ สําคัญที่จะตองคาํ นึงถึงคือขอมูลที่เก็บอยูภายในตัวแปรนั้น ขอ มลู แตล ะ
ชนดิ มคี ณุ สมบตั แิ ตกตางกันไป เชน เปนเลขจาํ นวนเต็ม เปนเลขจาํ นวนจริง เปนตัวอักษร เปนตน ผูเขียน
โปรแกรมจะตอ งกําหนดชนิดขอมูลใหกับตัวแปรโดยสอดคลองกับขอมูลที่ตองการเก็บ ภาษาซีแบงขอมูลออก
เปน ชนดิ ตา ง ๆ ซึ่งมีขนาดพื้นที่ที่ตองใชเก็บขอมูลในหนวยความจาํ แตกตางกันขึ้นอยูกับชนิดขอมูลและบริษัทผู
ผลติ คอมไพเลอร ซึ่งสามารถดูรายละเอียดไดจากอินคลูชไฟล limits.h และ float.h แสดงดังตาราง 1.1
ตาราง 1.1 แสดงคุณสมบัติของชนิดขอมูลพื้นฐาน
ชนิดขอมูล ขนาด (ไบต) คาที่เก็บ
char
int 1 ตวั อกั ษร ASCII 1 ตวั ตั้งแต 0 ถึง 255
short
long 2 คา จาํ นวนเตม็ ตง้ั แต 32767 ถึง –32768
unsigned
2 คา จาํ นวนเตม็ ตง้ั แต 32767 ถึง –32768
4 คา จาํ นวนเต็มตั้งแต 2147483647 ถงึ –2147483648
unsigned int 2 คา จาํ นวนเต็มตั้งแต 0 ถึง 65535
unsigned short 2 คา จาํ นวนเต็มตั้งแต 0 ถึง 65535
unsigned long 4 คา จาํ นวนเตม็ ตง้ั แต 0 ถึง 4294967295
7
ตาราง 1.1 (ตอ ) แสดงคุณสมบัติของชนิดขอมูลพื้นฐาน
ชนิดขอมูล ขนาด (ไบต) คาที่เก็บ
float
4 คา จาํ นวนจริงตั้งแต 3.4x10-38 ถงึ 3.4x1038
double
8 คา จาํ นวนจริงตั้งแต 1.7x10-308 ถึง 1.7x10308
จากชนดิ ของขอ มลู ดังกลาว เมื่อนํามาจัดเปนประเภทขอมูลเราสามารถแบงชนดิ ของขอมูลในภาษาซี
ออกเปน ประเภทหลกั ได 3 ชนิด คือ
1. จาํ นวนเต็ม ไดแ กข อ มลู ชนดิ int, short, long, unsigned int, unsigned short และ unsigned
long
2. จาํ นวนจริง คอื ขอ มูลที่เปนเลขจาํ นวนจริง มีทศนิยม หรืออยูในรูปของนิพจนวิทยาศาสตร ได
แกข อ มลู ชนิด float และ double
3. ตวั อักขระและสตริง (String) ไดแกขอ มลู ชนดิ char ซงึ่ เก็บขอมูลได 1 อกั ขระ และขอ มลู ทเ่ี ปน
ชดุ ของขอมูล char (Array of char) ทใี่ ชเ กบ็ สตริงซึ่งจะกลาวถึงตอไป
• รปู แบบการเขียนคาตาง ๆ ทเ่ี ปน ไปไดข องขอ มลู แตล ะชนดิ ไดแ ก
- จาํ นวนเต็ม กรณเี ขยี นเปน เลขฐาน 10 เชน 125 0 -154
กรณเี ขยี นเปน เลขฐาน 8 ใหขึ้นตนดวย 0 เชน 0377 0177 0000 01
กรณเี ขียนเปนเลขฐาน 16 ใหขึ้นตนดวย 0x หรอื 0X เชน 0XFF 0x14 0x4B
กรณขี อ มลู เปน ชนดิ long ใหลงทายดวย l หรอื L เชน 123L 0437l 0x4FFL
- จาํ นวนจริง เขยี นรปู แบบทศนยิ ม เชน 12.524 0.1259 0.00001
เขยี นรปู แบบนพิ จนว ทิ ยาศาสตร เชน 1.0E4 12.432e-4 1E-4 2E+3
กรณขี อ มลู เปน float เชน 1.4321F 472.324f
กรณขี อ มลู เปน double เชน 232.98D 1.2323d
- ตวั อักขระ เชน ‘a’ ‘W’ ‘\a’ ‘\t’ โดยที่อักขระใดขึ้นตนดวย \
แสดงวาเปนอักขระพิเศษ เชน ‘\a’ แทนการสง เสยี ง
‘\t’ แทนการยอ หนา
‘\n’ แทนการขน้ึ บรรทดั ใหม
‘\0’ แทนคา NULL ซงึ่ หมายถึงคาวาง
นอกจากนยี้ งั สามารถใชในลักษณะเลขฐาน 8 และเลขฐาน 16 ไดดังนี้ ตัวอยาง
เชน ‘X’ ในตาราง ASCII ตรงกบั เลขฐาน 8 คือ 130 และเลขฐาน 16 คือ 58
เขยี นแทนคาคงที่อักขระไดคือ ‘\130’ และ ‘\x58’ ตามลําดับ
char ch1=’X’;
char ch2 = ‘\130’;
char ch3 = ‘\x58’;
ถา สั่งใหพิมพคาตัวแปร ch1 ch2 และ ch3 จะพมิ พคาเดียวกันคือ X
8
ตวั อยางที่ 1.4 แสดงตวั อยางการใชคาของตัวแปรชนิด char
#include <stdio.h>
void main( ) {
int no;
char ch;
ch = ‘J’;
printf(“char : %c, dec : %d, oct : %o, hex : %x”, ch, ch, ch, ch);
no = ch;
printf(“\nno : %d, ch : %c”, no, ch);
no = 68;
ch = no;
printf(“\nno : %d, ch : %c”, no, ch);
}
ผลการทํางานของโปรแกรม
char : J, dec : 74, oct : 112, hex : 4a
no : 74, ch : J
no : 68, ch : D
-สตรงิ จะเขียนอยูในเครื่องหมาย “ เชน “Hello” โดยทใี่ นสตริงทุกตัวจะมีอักขระพิเศษที่
ไมสามารถมองเหน็ คือ ‘\0’ หรอื NUL เปนตัวสุดทายเสมอ ในขณะทอ่ี กั ขระจะจอง
พน้ื ทห่ี นว ยความจําเพียง 1 ไบต ในตัวอยางจะไดวาเกิดการจองพื้นที่ขึ้น 6 ตัว
อกั ษร ตัวอยางการประกาศตัวแปรสตริง
char msg[ ] = “Hello”;
แสดงการจองพื้นที่ในหนวยความจาํ ใหก บั ตวั แปร msg ดังรูปท่ี 1.4
H e l l o \0
รปู ท่ี 1.4 แสดงการพื้นที่หนวยความจาํ ของตัวแปร msg
9
5. การใชตัวแปร
เมอ่ื ตอ งการใชต วั แปร จะตองมีการประกาศชื่อตัวแปรที่ตองการใชงานนั้น มรี ปู แบบคอื
ประเภทขอมูล ช่อื ตัวแปร ;
ตวั อยา งของการประกาศตัวแปร เชน
float score;
int age;
char ch;
float width, height, length;
กรณที มี่ ตี วั แปรมากกวา 1 ตัวที่มีชนิดเดียวกัน สามารถประกาศไวใ นคําสั่งเดียวกันไดโดยใชเครื่อง
หมาย , คนั่ ระหวางตัวแปรแตละตัว
กฎการตั้งชื่อ
ในภาษาซมี กี ารกาํ หนดกฎในการตั้งชื่อ Identifier ตาง ๆ อนั ไดแ ก ชอื่ ตัวแปร ชอื่ ฟงกชัน ชื่อคาคงที่
ดังนี้
• ใหใชตัวอักษร a ถงึ z A ถึง Z เลข 0 ถึง 9 และ _ (Underscore) ประกอบกันเปน
ชื่อ
• ขนึ้ ตนดวยตัวอักษรหรือ _
• ตวั อกั ษรตวั พมิ พใ หญ ตัวพิมพเล็กมีผลตอการตั้งชื่อและการเรียกใชงาน
• ชอ่ื นนั้ จะตอ งไมซา้ํ กับคําหลกั (Keyword) ซงึ่ ภาษาซีจองไวใช คือ
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
10
คาํ แนะนาํ ในการตั้งชื่อ
ในการเขยี นโปรแกรมทด่ี นี น้ั เราควรทําการตั้งชื่อของตัวแปร คาคงที่ ฟงกชัน ใหอยูในรูปแบบมาตร
ฐานดงั น้ี
• ใหต งั้ ชอื่ ทสี่ ื่อความหมายบอกใหรูวาตัวแปรนั้นใชทําอะไร
• ขนึ้ ตนดวยตัวอักษร
• กรณตี งั้ ชอื่ ตวั แปรมักจะหรือฟงกชันมักจะใชตัวอักษรตัวพิมพเล็ก
• คา คงที่ที่กาํ หนดโดย #define มกั จะใชต ัวอักษรตัวพิมพใหญทั้งหมด
• กรณที ช่ี อื่ ตวั แปรประกอบดวยคาํ หลาย ๆ คํา อาจจะใชตัวอักษรตัวพิมพใหญขึ้นตนคาํ ในลาํ ดับ
ตอ มา หรือใช _ แยกระหวางคาํ เชน totalScore หรอื total_score
ตวั อยางการตั้งชื่อตัวแปร เชน
totalscore = score1 + score2 + score3;
ยอ มจะทาํ ความเขาใจไดงายกวา
robert = willy + bird + smith;
ตวั อยางชื่อตัวแปรที่ใชได ไดแ ก _MAX MONEY Average_score
salary totalPage recordno annual2001
x
ตวั อยา งของการใชค าํ สั่งประกาศตัวแปรไมถูกตองและไมเหมาะสมไดแก
float $dollar; ใชเคร่ืองหมาย $ ในชอ่ื ตวั แปรไมไ ด
int my age; ชอื่ ตวั แปรหามเวนวรรค
integer age; ประเภทขอ มลู integer ไมมีในภาษาซี
int a. b. c; ใชเคร่อื งหมาย . แทนที่จะใชเครื่องหมาย ,
char ch: ใชเ คร่ืองหมาย : แทนที่จะใชเครื่องหมาย ;
float student-height; ใชเครอ่ื งหมาย - แทนที่จะใชเครื่องหมาย _
float 1Score; ชอื่ ตวั แปรหามขึ้นตนดวยตัวเลข
float score;
int score; หา มประกาศชื่อซํา้ กัน
11
เมอ่ื มกี ารประกาศตวั แปร จะเกิดกระบวนการจองพื้นที่ในหนวยความจาํ ใหกับตัวแปรตัวนั้นมีขนาด
เทา กบั ชนดิ ของขอ มลู ที่กาํ หนด เมื่อใดที่มีการอางถึงชื่อตัวแปรก็จะเปนการอางถึงคาที่เก็บอยูในพื้นที่หนวย
ความจาํ นน้ั สงิ่ ทตี่ องระวังคือ ควรจะมีการกาํ หนดคาเริ่มตนใหกับตัวแปรนั้น ๆ เสมอ เพราะพน้ื ทใ่ี นหนว ยความ
จาํ ทถี่ กู จองนนั้ อาจจะมีคาบางอยางอยูภายใน ตัวอยางของการกาํ หนดคาเริ่มตนใหกับตัวแปร คือ
int sum=0;
float height=0.0f;
จากคาํ สง่ั ขา งตน ระบบจะทาํ การจองพื้นที่ในหนวยความจาํ ใหกับตัวแปรชื่อ sum มขี นาดเทากับ int (2
ไบต) และกาํ หนดใหมีคาเริ่มตนเทากับ 0 เมื่อมีการอางถึงชื่อตัวแปรก็จะไดคาคือ 0 และจองพน้ื ทใ่ี นหนว ย
ความจาํ ใหก บั ตวั แปร height มขี นาดเทา กบั float (4 ไบต) และกาํ หนดใหมีคาเริ่มตนเทากับ 0.0
6. การรบั ขอ มลู และแสดงผลขอ มลู
ภาษาซีไดเตรียมฟงกชันมาตรฐานท่ีใชในการรับและแสดงผลขอมูลใหกับผูพัฒนาโปรแกรมหลาย
ฟง กช นั แตในที่นี้จะกลาวถึงเฉพาะฟงกชันในการรับขอมูล คือ ฟงกชัน scanf( ) และฟง กช นั ในการแสดงผล
ขอ มูลคือฟงกชัน print( ) ในสว นของการใชง านพน้ื ฐาน ซึ่งกอนจะใชงานฟงกชันดังกลาวที่สวนหัวของ
โปรแกรมจะตองมีคําสง่ั
#include <stdio.h>
6.1 การรบั ขอ มลู
ฟง กช นั ที่ใชในการรับขอมูลมีรูปแบบของการใชงานคือ
scanf ( รปู แบบ , อารก ิวเมนต1, อารกิวเมนต2 , … ) ;
ในการรับขอมูลผูเขียนโปรแกรมจะตองกาํ หนดรปู แบบของขอ มูลที่ตองการรับซึ่งสอดคลองกับชนิดของ
ขอ มลู ที่ตองการรับเขา โดยที่ผูใชตองสงตาํ แหนง (หรอื แอดเดรสในหนวยความจํา – Address) ของตัวแปรที่
ตอ งการรับเขาไปยังฟงกชัน โดยระบุในตาํ แหนงของอารกิวเมนต
ตวั อยา งเชน ตองการรับขอมูลเดือนและปเปนจาํ นวนเต็ม จะตองใชคําส่งั
int month, year;
scanf(“%d %d”, &month, &year);
12
จากตัวอยางรูปแบบ คือ “%d %d” บอกใหร วู าตองรับขอมูล 2 ตัว โดยที่ขอมูลนั้นแยกจากกันดวย
ชองวาง %d ตวั แรกแทนขอ มลู ตวั แรกทป่ี อ นเขา สรู ะบบจะนําไปเก็บที่ตัวแปร month %d ตัวที่ 2 แทนขอ มลู
ตวั ที่ 2 ทป่ี อ นเขา สรู ะบบจะถกู นําไปเก็บที่ตัวแปร year ในทน่ี จ้ี ะระบตุ ําแหนงของตัวแปรในหนวยความจาํ ดวย
เครื่องหมาย & (Address Operator)
รปู แบบของการรบั ขอมูลในภาษาซี จะขึ้นตนดวยสัญลักษณ % อยใู นเครื่องหมาย “ “ รปู แบบการรบั
ขอ มูลแสดงไดดังตาราง 1.2
รปู แบบ ตาราง 1.2 แสดงรปู แบบของการรบั ขอ มลู
d, i คาํ อธบิ ายการใชง าน
ld
u รบั ขอ มลู จํานวนเต็มและแปลงขอมูลเปน int
o รบั ขอ มลู จํานวนเต็มและแปลงขอมูลเปน long
x รบั ขอ มลู เปน จํานวนเต็มบวกและแปลงขอมูลเปน unsigned
c รบั ขอ มลู เปน จาํ นวนเต็มบวกของเลขฐาน 8 และแปลงขอ มลู เปน unsigned
s รบั ขอ มลู เปน จาํ นวนเต็มบวกของเลขฐาน 16 และแปลขอ มลู เปน unsigned
f รบั ขอ มลู เปน อกั ขระ 1 ตัว
lf รบั ขอ มลู เปน สตรงิ
รบั ขอ มูลทศนิยมและแปลงขอ มลู เปน float
รบั ขอ มลู ทศนยิ มและแปลงขอมลู เปน double
ตวั อยางการรับขอมูลมีดังนี้
scanf(%d/%d/%d”, &day, &month, &year);
ขอ มลู ทจ่ี ะปอ นเขา สรู ะบบ
20/7/2001
นอกจากนี้ยังสามารถกําหนดขนาดของขอมูล เชน
scanf(%2d%2d%4d”, &day, &month, &year);
ขอ มลู ทจ่ี ะปอ นเขา สรู ะบบคอื
20072001
หมายเหตุ
ใน Turbo C กรณที ม่ี กี ารรบั ขอ มลู ชนดิ char ในโปรแกรม หากในโปรแกรมมกี ารรบั ชนดิ ขอ
มลู อนื่ ดวย จะพบวาเมื่อปอนขอมูลชนิด char เสรจ็ จะไมมีการหยุดรับขอมูลในลาํ ดับถัด
ไป เนอื่ งจากความผดิ พลาดของการทํางานของคอมไพเลอร เพราะฉะนั้นควรจะใชฟงกชัน
flushall( ) ซงึ่ เปนฟงกชันมาตรฐานใน stdio.h ชว ยเพอ่ื แกป ญ หาดงั กลา ว โดยใสฟงกชัน
flushall( ) ไวหลงั คาํ สง่ั scanf( ) ทุกคาํ ส่งั
13
6.2 การแสดงผลขอ มลู
การแสดงผลขอ มลู สามารถทาํ ไดโดยการเรียกใชฟงกชัน printf( ) มรี ปู แบบคอื
printf ( รปู แบบ , อารกิวเมนต1 , อารกิวเมนต2 , … ) ;
ผเู ขยี นโปรแกรมสามารถสงขอความใด ๆ มายังฟงกชัน print( ) หรอื สงตัวแปรมาพิมพคาโดยสงผาน
มาทางอารก วิ เมนต ใหส อดคลอ งกบั รปู แบบทก่ี าํ หนด ตัวอยางเชน
char name[ ] = “Mickey”;
int age = 20;
printf(“%s is %d years old.”, name, age);
ผลลพั ธท ไ่ี ดคอื
Mickey is 20 years old.
โดยที่ %s ตวั แรกจะถูกแทนที่ดวยคาของอารกิวเมนตตัวที่ 1 คือ ตวั แปร name และ %d ตวั ที่ 2 จะ
ถกู แทนที่ดวยคาของอารก วิ เมนตตัวที่ 2 คือ ตัวแปร age
นอกจากนี้ผูใชยังสามารถใช printf( ) ในการพมิ พขอความใด ๆ ออกทางจอภาพโดยไมจาํ เปน ตอ งสง
อารก วิ เมนตเขาไปยังฟงกชันก็ได ตัวอยางเชน
printf(“Good morning.”);
ผลลพั ธท ไ่ี ดค ือ
Good morning.
ตวั อยา งของการแทนที่ตัวแปรที่เกิดจากการคาํ นวณ เชน
int x, y;
x = 7;
y = 2;
printf(“The sum of %d and %d is %d\n”, x, y, x+y);
ผลลพั ธท ไ่ี ดค อื
The sum of 7 and 2 is 9
14
คาํ สั่ง \n เปน อกั ขระพิเศษที่ไดกลาวถึงแลวคือ อักขระที่ใชสั่งใหมีการเวนบรรทัด (New Line) ในทน่ี ้ี
หลงั จากพิมพขอความเสร็จจะมีการเวนวรรทัดเกิดเขนึ้ จากตัวอยางจะเห็นวา %d ตวั ที่ 3 เกิดจากการนาํ คาของ
ตัวแปร x มาบวกกบั ตวั แปร y ไดผ ลลพั ธเ ทา ใดจงึ สง ใหก ับ %d ตวั ที่ 3 แสดงผล
รปู แบบการแสดงผล ในฟงกชัน printf( ) แสดงดังตาราง 1.3
รปู แบบ ตาราง 1.3 แสดงรปู แบบของการแสดงขอมลู
d, i คาํ อธบิ ายการใชง าน
ld
u ขอ มูลจํานวนเต็มและแปลงขอมูลเปน int
o ขอ มลู จํานวนเต็มและแปลงขอมูลเปน long
x, X ขอ มลู เปนจาํ นวนเต็มบวกและแปลงขอมูลเปน unsigned
c ขอ มลู เปนจาํ นวนเต็มบวกของเลขฐาน 8 และแปลงขอ มลู เปน unsigned
s ขอ มลู เปนจาํ นวนเต็มบวกของเลขฐาน 16 และแปลขอ มลู เปน unsigned
f ขอ มลู เปน อกั ขระ 1 ตัว
lf ขอ มลู เปน สตรงิ
ขอ มลู ทศนยิ มและแปลงขอ มลู เปน float
ขอ มลู ทศนยิ มและแปลงขอ มลู เปน double
การจดั รปู แบบการแสดงผล
กรณขี องการใชรูปแบบในฟงกชัน printf( ) จะแตกตางกับฟงกชัน scanf( ) ตรงที่ฟงกชัน printf( ) ใชใ น
การแสดงผลออกทางหนา จอ เพราะฉะนั้นจึงมีการกาํ หนดคา เพอ่ื ใหส ามารถจดั ผลลพั ธใ หแ สดงในรปู แบบท่ี
ตอ งการได โดยปกติแลวขอมูลทุกตัวที่แสดงจะแสดงผลจากทางดานขวามือ เชน
printf(“The sum of %5d and %5d is %5s\n”, a, b, a+b);
ผลลพั ธท ไ่ี ดคอื
The sum of 7 and 2 is 9.
จะเกดิ การเวน ชอ งวา ง 5 ชอง และแสดงผลจากทางดานขวามือของชองวางนั้น
ตวั อยางอื่นไดแก
float x=43.34, y=2.231;
printf(“Minus %f with %f, answer is %f”, x, y, x-y);
ผลลพั ธท ไ่ี ดค อื
Minus 43.340000 with 2.231000, answer is 41.109000
แตหากกาํ หนดวา
printf(“Minus %4.2f with %4.2f, answer is %4.2f”);
15
ผลลพั ธท ไ่ี ดค ือ
Minus 43.34 with 2.23, answer is 41.11
การจดั รปู แบบเมอ่ื ใชส ญั ลกั ษณ – ประกอบในรปู แบบจะทาํ ใหเกิดการบังคับใหการแสดงผลชิดทาง
ดา นซายมือ แสดงดังตัวอยางที่ 1.5
ตวั อยา งที่ 1.5 แสดงตวั อยางการจัดรูปแบบของการแสดงผล
#include <stdio.h> /* [Computer] */
#include <conio.h> /* [Computer] */
void main( ) { /* [Com] */
/* [ Computer] */
clrscr( ); /* [Computer ] */
printf("\n[%s]", "Computer"); /* [Com ] */
printf("\n[%2s]", "Computer");
printf("\n[%.3s]", "Computer"); /* Hexa [f] */
printf("\n[%10s]", "Computer"); /* Octal [17] */
printf("\n[%-10s]", "Computer");
printf("\n[%-10.3s]", "Computer"); /* [100] */
printf("\n"); /* [100] */
printf("\n[%x]", 15); /* [ 100] */
printf("\n[%o]", 15); /* [100 ] */
/* [100 ] */
printf("\n");
printf("\n[%d]", 100); /* [32.576200] */
printf("\n[%.2d]", 100); /* [32.58] */
printf("\n[%10d]", 100); /* [ 32.58] */
printf("\n[%-10d]", 100); /* [32.58 ] */
printf("\n[%-10.2d]", 100);
printf("\n");
printf("\n[%f]", 32.5762);
printf("\n[%.2f]", 32.5762);
printf("\n[%10.2f]", 32.5762);
printf("\n[%-10.2f]", 32.5762);
getch( );
}
ในตวั อยา งนม้ี กี ารใชฟ ง กชันเพม่ิ เตมิ เพอ่ื ชวยใหเ หน็ ผลลพั ธข องการแสดงผลทจ่ี อภาพ ) ในกรณที ผ่ี ู
เขยี นโปรแกรมใชค อมไพเลอร Turbo C คือ
16
• clrscr( ) ใชเ พอื่ ใหล บขอความตาง ๆ ทค่ี า งบนจอภาพกอ นทจ่ี ะแสดงผลโปรแกรม
• getch( ) ใชเ พอ่ื รอรบั การกดแปน พมิ พใ ด ๆ หลงั จากแสดงผลแลว เพื่อใหเกิดการคางรอใหผูใช
กดปอ นพมิ พก อ นจะไปทํางานอื่นตอไป
ทง้ั 2 ฟงกชันอยูในฟงกชันมาตรฐานของคอมไพลเลอร Turbo C ตองเรียกใชอินคลูชไฟลชื่อ conio.h
ตวั อยางที่ 1.6 เปน ตวั อยางของการรับขอมูลเขาเพื่อแสดงผลทางจอภาพ
ตวั อยางที่ 1.6 แสดงตวั อยางการรับขอมูลเพื่อนํามาแสดงผล
#include <stdio.h>
void main( ) {
char name[100];
printf("What is your name ?\n");
scanf("%s", name);
printf("Very glad to know you, ");
printf("%s.",name);
}
ผลลัพธของการทํางาน
What is your name ?
Willy
Very glad to know you, Willy.
หมายเหตุ ตวั เอยี งคอื ขอความที่ผใู ชป อ นเขาสูร ะบบ
ขอควรระวัง
- การปอ นขอ มลู ทเ่ี ปน สตรงิ ไมจ าํ เปนตองใสเครื่องหมาย & นาํ หนาตัวแปรสตริง
- หากชอื่ ทปี่ อ นเขาสูโปรแกรมมีชองวาง เชนผูใชปอนชื่อและนามสกุล โดยมีชองวางระหวางชื่อและ
นามสกลุ โปรแกรมจะรบั ไดเ ฉพาะขอ มลู ชอ่ื เทา นน้ั โปรแกรมไมสามารถรับขอมูล ที่มีชองวางเขา
มาเก็บในตัวแปรได
17
แบบฝกหัดบทที่ 1
1. ใหห าทผี่ ิดพลาดของการประกาศตัวแปรตอไปนี้ และแกไขใหถูกตอง
int $dollar, num1-5, birth year; .
char x, y, x; .
float main, double; .
integer number; .
real float; .
int a1, a2 .
int อาย,ุ ปเกิด; .
2. ใหห าทผ่ี ดิ พลาดของโปรแกรมตอ ไปน้ี และแกไขใหถูกตอง
void mian {
float a 1;
printf("Enter number : ’);
scanf("%s", a 1)
printf(“Your number is %.2d” a 1);
3. ใหจ ดั รปู แบบการเยอ้ื ง (Indentation) ของโปรแกรมตอ ไปนใ้ี หส มบรู ณ
(ก) #include <stdio.h> (ข) #include <stdio.h>
void main( ) { void main( ) { char name[100];
char name[100]; printf("What is your name ?\n"); scanf("%s", name);
printf("What is your name ?\n"); printf("Very glad to know you, "); printf("%s.",name);}
scanf("%s", name);
printf("Very glad to know you, ");
printf("%s.",name);
}
4. ใหแ สดงผลลพั ธข องการทํางานโปรแกรมตอไปนี้
(ก) # include <stdio.h> (ข) #include <stdio.h>
void main( ) { void main() {
char newline = '\n', tab = '\t'; int n=10;
float number=94.323;
printf("Start Program"); char name[15]="Mickey Mouse";
printf("%c",newline);
printf("%cMy first Program",tab); printf("\nDear %13.11s\n", "Dad and Mama");
printf("\n\tWonderful"); printf("\tI will get %x for this course!", n);
printf(" 100%%\n"); printf("\n\t%1.1f is my score", number);
printf("\t"); printf("\t\t\nLove you %d %%", n*10);
printf("%10","Hello"); printf("\n%-8.6s -Ja", name);
}}
18
5. ใหป ระกาศตัวแปรเพื่อใชเก็บขอมูลตาง ๆ ตอ ไปน้ี
(ก) เลขจาํ นวนเตม็ 5 จํานวน เก็บคาตัวเลขไมเกิน 100,000
(ข) ความสงู มีหนวยเปนเซนติเมตร
(ค) นามสกลุ ความยาวไมเกิน 30 ตัวอักษร
(ง) เลขทบ่ี ตั รประจําตวั ประชาชนเปน ตวั เลข 13 หลกั
(จ) จาํ นวนพนกั งานในบรษิ ทั แหง หนง่ึ มีพนักงานไมเกิน 500 คน
(ฉ) คะแนนสอบของนกั ศกึ ษาในกระบวนวชิ าหนง่ึ มีคาไมเกิน 100 คะแนน
(ช) เงนิ เดือนท่พี นกั งานบรษิ ทั แหง หน่งึ ไดร บั
6. ใหเ ขยี นโปรแกรมเพอ่ื รบั ขอ มลู ตา ง ๆ ในขอ 5 และแสดงผลขอ มลู ทร่ี บั นน้ั
7. ใหเขียนโปรแกรม 2 โปรแกรมเพื่อแสดงขอความตอไปนี้ออกทางจอภาพ
I love
C programming
very much.
โดยที่
(ก) เขยี นโปรแกรมท่ี 1 โดยในฟงกชัน main( ) ประกอบดวยฟงกชัน printf( ) 3 คาํ ส่ัง
(ข) เขยี นโปรแกรมท่ี 2 โดยใชฟงกชัน main( ) ประกอบดวยฟงกชัน printf( ) 1 คาํ สง่ั
8. ใหเ ขยี นโปรแกรมเพื่อรับชื่อและความสูงของคน ๆ หนง่ึ และแสดงชื่อและความสูงนั้นทางจอภาพ โดย
แสดงในรปู แบบดงั ตวั อยา งตอ ไปน้ี (ตวั เอนคอื สง่ิ ทผ่ี ใู ชป อ นสรู ะบบ)
Enter name : Somchai
Enter height (cm.) : 178
Output :
Name Height (cm.)
Somchai 178
9. ใหเ ขียนโปรแกรมรับขอมูลเลขจาํ นวนจริงแบบ float 3 จาํ นวน และแสดงผลลพั ธเ ลขทง้ั 3 จํานวนดังตัว
อยาง (ตวั เอนคอื สง่ิ ทผ่ี ใู ชป อ นสรู ะบบ)
Enter number 1 : 5243.2
Enter number 2 : 13
Enter number 3 : 12.3548
Output :
5243.20
13.00
12.35
ตวั ดําเนินการและนิพจน 2
(Operators and Expressions)
ในการเขยี นโปรแกรมองคประกอบทีส่ าํ คัญสิ่งหนึ่งคือ ตัวดาํ เนนิ การ ซึ่งมักจะนําใชรว มกบั นพิ จนใ น
ลกั ษณะตา ง ๆ ตัวดาํ เนนิ การทส่ี าํ คัญ ไดแ ก ตัวดาํ เนินการกาํ หนดคา (Assignment Operator) ตวั ดาํ เนนิ
การคณติ ศาสตร (Arithmetic Operators) ตวั ดาํ เนินการกาํ หนดคา แบบผสม (Compound Assignment
Operators) ตวั ดาํ เนินการเพิ่มคาและลดคา (Increment and Decrement Operators) ตวั ดาํ เนนิ การเปลย่ี น
ชนิดขอมูล (Type Cast Operator) ตวั ดาํ เนนิ การความสมั พันธ (Relational Operators) ตวั ดาํ เนินการความ
เทากัน (Equality Operators) ตวั ดาํ เนนิ การตรรกะ (Logical Operators) ตวั ดาํ เนนิ การเงอ่ื นไข (Conditional
Operator) ตวั ดาํ เนินการคอมมา (Comma Operator)
ตวั ดาํ เนนิ การเหลา นเ้ี มอ่ื นําไปใชก บั นพิ จนจ ะทําใหเ กดิ นพิ จนใ นรปู แบบตา ง ๆ เชน นิพจนกาํ หนดคา
นพิ จนคณิตศาสตร นพิ จนต รรกศาสตร เปนตน
1. ตวั ดาํ เนินการกําหนดคา
ตวั ดาํ เนนิ การกาํ หนดคา เปน ตวั ดาํ เนินการพื้นฐานที่ใชในการกาํ หนดคาตาง ๆ ใหกับตัวแปร โดยใช
เครื่องหมาย = มรี ปู แบบของนพิ จนก าํ หนดคาคือ
ตัวแปร = นพิ จน ;
โดยทน่ี พิ จนอ าจจะเปน คา คงท่ี ตัวแปร หรอื นพิ จนท ป่ี ระกอบขน้ึ จากตวั ดาํ เนินการตาง ๆ ก็ไดตัวอยางเชน
age = 10;
speed = distance / time;
total_min = 60 * hours + minutes;
ch = ‘A’;
ความหมายของตวั ดาํ เนินการกาํ หนดคาคือ การกาํ หนดคาที่อยูทางขวามือของคาํ สั่งใหกับตัวแปรที่อยู
ทางซายมือ
นอกจากนยี้ งั มรี ปู แบบเพิ่มเติมหากตองการกําหนดคาใหกับตัวแปรหลายตัวดวยคาเดียวกัน มรี ปู แบบ
ดังนี้คือ
ตัวแปร1 = ตวั แปร2 = …. = นพิ จน ;
20
โดยตวั แปรทั้งหมดจะตองเปนตัวแปรประเภทเดียวกัน เชน
int x, y, z;
x = y = z = 45;
แปลความหมายไดวา
z = 45;
y = z;
x = y;
นอกจากนี้เมื่อมีการใชตัวดําเนินการกําหนดคาจะมีการแปลงคาชนิดของขอมูลโดยอัตโนมัติอีกดวย
(Implicit Casting) ซงึ่ จะเกดิ กับขอมูลตัวเลข เชน กาํ หนดคาที่มีชนิดเปน int ใหก บั ตวั แปรทม่ี ชี นดิ เปน float
จะเกดิ กระบวนการแปลงคาจาก int ไปเปน float เชน
float x;
x = 14;
14 เปน ขอ มลู ประเภท int แต x เปน ตวั แปรประเภท float เพราะฉะนน้ั คา 14 จะถูกแปลงเปน 14.0f
กอ นทจ่ี ะนาํ ไปเก็บยังตัวแปร x แตห ากมกี ารกาํ หนดคาที่มีชนิดเปนจํานวนจริงใหกับตัวแปรที่เปนจาํ นวนเต็มจะ
เกดิ การปดเศษทิ้ง ตัวอยางเชน
int a;
a = 3.5;
จะไดวามีการแปลงคา 3.5 ไปเปน 3 กอ นทจ่ี ะนาํ คานั้นไปกาํ หนดใหกับ a จะไดวา a เก็บคา 3
พจิ ารณาตัวอยางตอไปนี้
int a;
float x;
x = a = 12.74;
จะไดวามีการกาํ หนดคา a = 12.34 กอ น ซึ่งมีการแปลงคา 12.74 โดยปดเศษทิ้ง ไดวา a เกบ็ คา 12
จากนน้ั นาํ คาใน a ไปกาํ หนดคา ใหก ับตวั แปร x ซงึ่ เปน float จะมีการแปลงคา 12 เปน 12.0f จะไดวา x เก็บคา
12.0 แสดงตวั อยา งเรื่องการปดเศษดวยตัวอยางที่ 2.1
21
ตวั อยา งที่ 2.1 แสดงการกาํ หนดคาจํานวนจริงใหกับตัวแปรจาํ นวนเต็ม
#include <stdio.h>
void main( ) {
int x;
x = 14.8328;
printf(“x value is %d”, x);
}
ผลการทํางานของโปรแกรม
x value is 14
2. ตวั ดาํ เนินการคณิตศาสตร
ตวั ดาํ เนนิ การคณิตศาสตรในภาษาซีประกอบดวยการบวก ลบ คูณ หาร หารเอาเศษ การเขียน
นพิ จนค ณติ ศาสตรท างคอมพิวเตอรจะแตกตางกับนิพจนคณิตศาสตรที่เคยเรียนทั่วไป ตรงทมี่ ีลําดับความ
สาํ คัญ (Precedence) ของตวั ดาํ เนนิ การเขา มาเกย่ี วขอ ง แสดงตัวดําเนินการคณิตศาสตรและการทาํ งานดัง
ตาราง 2.1 และแสดงลําดับความสําคัญของตัวดาํ เนนิ การดังตาราง 2.2
ตาราง 2.1 แสดงตัวดําเนนิ การคณิตศาสตรและการทาํ งาน
ตวั ดาํ เนินการ คําอธิบาย ตัวอยาง การทาํ งาน ผลลพั ธ
+ +10
- Unary plus +10 ขวาไปซาย -7
* 30
/ Unary minus -7 ขวาไปซาย 3
% 1
+ Multiplication 10*3 ซายไปขวา 13
- 7
Division 10/3 ซา ยไปขวา
Modulus 10%3 ซายไปขวา
Addition 10+3 ซา ยไปขวา
Subtraction 10-3 ซายไปขวา
ตาราง 2.2 แสดงลําดับความสําคัญของตัวดาํ เนนิ การ
ตวั ดาํ เนินการ คําอธิบาย
+, - Unary Plus, Unary Minus
*, /, % Multiplication, Division, Modulus
+, - Addition, Subtraction
22
จากตาราง 2.2 ตัวดาํ เนนิ การทอ่ี ยดู า นบนจะมคี วามสําคัญกวาดานลา ง นน่ั คอื หากในนพิ จนป ระกอบ
ดว ยตวั ดาํ เนนิ การดา นบนจะมกี ารแปลคา ตวั ดําเนนิ การนน้ั การ หากพบตัวดาํ เนนิ การทอ่ี ยใู นลาํ ดับเดียวกันก็
จะทาํ การแปลความหมายจากซายไปขวา ตัวอยางเชน
3+4/2 จะไดผ ลลพั ธเ ทา กบั 3 + (4 / 2) = 5
3 * 2 + 4 % 2 จะไดผ ลลพั ธเ ทา กบั (3*2) + (4%2) = 6 + 0 = 6
แตห ากตอ งการใหทาํ ตัวดาํ เนนิ การในลําดับตํ่ากอน ใหใชเครื่องหมาย ( ) ครอบคําสั่งที่ตองการ เชน
3 * (2 + 4 )% 2 จะไดผ ลลพั ธเ ทา กบั 3 * 6 % 2 = 18 % 2 = 0
เพราะฉะนั้นหากมีสมการเชน
X = A+B+C
10
หากตอ งการเขียนเปนนิพจนคณิตศาสตร จะตองเขียนวา
X = (A + B + C) / 10
สิ่งสาํ คัญอกี สง่ิ หนง่ึ ในการใชต ัวดาํ เนินการคณิตศาสตร คือ การคาํ นวณภายในนพิ จนท่ีเกดิ จากขอ มลู
ชนดิ จาํ นวนเต็มกับขอมูลจาํ นวนจริง และการใช Modulus ตวั อยางเชน
float f;
f = 17.0 / 4; /* f = 4.25 */
f = 17 / 4.0; /* f = 4.25 */
f = 17 / 4; /* f = 4.0 */
int a; /* a = -5 */
a = -17 / 3; /* a = -5 */
a = 17 / -3; /* a = 5 */
a = -17 / -3;
a = 17 % 3; /* a = 2 */
a = 15 % 3; /* a = 0 */
a = -17 % 3; /* a = -2 */
a = 17 % -3; /* a = 2 */
a = -17 % -3; /* a = -2 */
และแสดงตวั อยา งการทาํ งานของตัวดาํ เนนิ การคณิตศาสตรดังตาราง 2.3 สมมติให a และ b มคี าเปน
จาํ นวนเตม็ และแสดงตัวอยางการหาผลรวมของเลขจาํ นวนเต็ม 2 จํานวนที่รับจากผูใช ดังตัวอยางที่ 2.2
23
ตาราง 2.3 แสดงตวั อยา งการประมวลผลตวั ดาํ เนินการคณิตศาสตร
ab a/b a%b a+b*3
17 3 5 2 26
-17 3 -5 -2 -8
17 -3 -5 2 8
-17 -3 5 -2 -26
ตวั อยางที่ 2.2 โปรแกรมหาผลรวมของเลขจาํ นวนเต็ม 2 จํานวนที่รับขอมูลจากผูใช
#include <stdio.h>
void main( ) {
int x, y, z;
printf(“Enter X value : “);
scanf(“%d”, &x);
printf(“Enter Y value : “);
scanf(“%d”, &y);
z = x + y;
printf(“Summary of X and Y is %d”, z);
}
ผลการทํางานของโปรแกรม
Enter X value : 15
Enter Y value : 20
Summary of X and Y is 35
3. ตวั ดาํ เนินการกําหนดคาแบบผสม
ตัวดําเนินการกําหนดคาแบบผสมเปนตัวดําเนินการที่ผสมระหวางตัวดําเนินการกําหนดคาและตัว
ดาํ เนนิ การคณิตศาสตร แสดงดังตาราง 2.4
ตาราง 2.4 แสดงตัวดําเนินการกาํ หนดคา แบบผสม
ตวั ดาํ เนินการ ตวั อยางคาํ สั่ง คาํ สั่งเต็ม
*= a *= 2; a = a * 2;
/= a /=2; a = a / 2;
%= a %= 2; a = a % 2;
+= a += 2; a = a + 2;
-= a -= 2; a = a – 2;
24
การแปลคาํ สงั่ ของตัวดาํ เนินการกาํ หนดคา แบบผสม จะทําคาํ สั่งที่อยูทางขวามือกอนเสมอ เชน
a *= 3 + 2 ;
จะเทากับคาํ สั่ง
a = a * (3 + 2);
4. ตวั ดาํ เนินการเพิ่มคาและลดคา
ตวั ดาํ เนนิ การเพมิ่ คาและลดคา เปนตัวดาํ เนินการเพื่อใชเพิ่มคาตัวแปรขึ้น 1 หรอื ลดคา ตวั แปรลง 1
โดยใชเครื่องหมาย ++ แทนการเพม่ิ คา ขน้ึ 1 และ - - แทนการลดคาลง 1 และสามารถใชตัวดําเนินเพม่ิ คา หรอื
ลดคา กบั ตวั แปรได 2 ตาํ แหนง คือ วางตัวดาํ เนินการเพิ่มคาหรือลดคาไวหนาตัวแปร และวางไวหลังตัวแปร ดัง
ตวั อยาง
a++;
++a;
ทง้ั 2 คาํ สั่งจะมีคาเทา กับ a = a + 1; สว นคําส่งั
a- -;
- - a;
จะมีคาเทากับ a = a – 1;
ความแตกตา งของตําแหนงการวางตัวดาํ เนินการเพิ่มคาหรือลดคา
ตาํ แหนง ของการวางตัวดาํ เนนิ การเพิ่มคาหรือลดคาจะสงผลถึงการทํางานของคาํ สั่งนั้น ตัวอยางเชน
b = 5;
a = 10 + b++ * 2;
ผลลพั ธท ไ่ี ด จะมีผลเทากับคาํ สงั่
a = 10 + b * 2;
b = b + 1;
จะไดวา a มคี า เทากับ 10 + 5 * 2 = 20 และ b มคี าเทากับ 6
แตห ากนาํ ตวั ดาํ เนนิ การเพ่มิ คามาไวดานหนาตัวแปร ดังตัวอยาง โดยกาํ หนดให b มคี า เทากับ 5 เชน
เดียวกัน
b = 5;
a = 10 + ++b * 2;
25
ผลลพั ธท ไ่ี ด จะมีผลเทากับคาํ ส่งั
b = b + 1;
a = 10 + b * 2;
จะได b มคี าเทา กับ 6 และ a มคี า เทา กับ 10 + 6 * 2 = 22
ตวั อยา งที่ 2.3 แสดงการใชตัวดาํ เนินการเพิ่มคา
#include <stdio.h>
void main( ) {
int y, count;
count = 1;
y = count++;
printf(“y = %d, count = %d”, y, count);
count = 1;
y = ++count;
printf(“\ny = %d, count = %d”, y, count);
}
ผลการทํางานของโปรแกรม
y = 1, count = 2
y = 2, count = 2
5. ตวั ดาํ เนนิ การเปลี่ยนชนิดของขอมูล
การเปลยี่ นชนิดขอมูลในภาษาซีมี 2 ลกั ษณะ คือ การเปลี่ยนชนิดขอมูลโดยไมตองใชคําสัง่ (Implicit
Casting) ซง่ึ กลา วถงึ ในหัวขอท่ี 2.1 และการเปลี่ยนชนิดขอมูลโดยใชคาํ สั่ง (Explicit Casting) เชน หากตอง
แปลงขอ มลู ชนดิ float ไปเปน อกี ขอ มลู ชนดิ int จะตองใชคาํ ส่ัง
int a;
a = (int)12.423;
จะไดวา a มคี า เทา กบั 12 กระบวนการทาํ งานจะมีการเปลี่ยนชนิดขอมูลที่อยูใกลกับตัวดําเนนิ การ
เปลย่ี นชนดิ ขอ มลู ใหเ ปน ชนดิ ขอ มลู ทร่ี ะบใุ นวงเลบ็ แลวจึงมีการกาํ หนดคาใหมนั้นใหกับ a ทงั้ นสี้ ามารถกาํ หนด
ชนดิ ขอ มลู ทจี่ ะเปลี่ยนคาเปนชนิดขอมูลใด ๆ ก็ได แสดงตัวอยางเพิ่มเติมดังตัวอยางที่ 2.4
26
ตวั อยางที่ 2.4 แสดงการใชตวั ดาํ เนินการเปลี่ยนชนดิ ขอ มลู
#include <stdio.h>
void main( ) {
int x;
x = 2.5 * 2;
printf(“x value is %d”, x);
x = (int)2.5 * 2;
printf(“\nx value is %d”, x);
x = (int)(2.5 * 2);
printf(“\nx value is %d”, x);
}
ผลการทํางานของโปรแกรม
x value is 5
x value is 4
x value is 5
6. ตวั ดาํ เนินการคอมมา
ตวั ดาํ เนนิ การคอมมา เปนตัวดาํ เนนิ การเพอ่ื บอกถึงลําดับการทาํ งาน เพื่อชวยกาํ หนดการทาํ งานของ
นพิ จนห นง่ึ ๆ มักจะใชรวมกับคําสั่งควบคุม รูปแบบการใชต วั ดาํ เนินการคอมมา คือ
นพิ จน1 , นพิ จน2
การทาํ งานจะทาํ งานที่นิพจนทางซายมือกอนเสมอ แลวจึงทาํ งานที่นิพจนขวามือ แตถาใชคาํ สัง่
s = ( t = 2, t + 3);
ลาํ ดับการทาํ งานคือ t = 2 หลงั จากนั้นจะนําคาใน t คอื 2 ไปบวกกบั 3 จะไดคาคอื อ 5 และนาํ คา 5
ไปกาํ หนดใหกับ s จะไดวา t มีคา 2 และ s มคี า 5
แตห ากไมมีเครื่องหมายวงเล็บดังตัวอยาง
s = t = 2, t + 3
จะไดวา s เทากับ 2 และ t เทา กับ 2 หลงั จากนน้ั นาํ คา t ไปบวก 3 ไดผ ลลพั ธข องนพิ จนเ ปน 5 มักจะ
ใชก บั นพิ จนต รรกศาสตรใ นคาํ สั่งควบคุมแบบตาง ๆ ซง่ี จะไดก ลา วถงึ ในบทท่ี 3
27
7. ตวั ดาํ เนินการความสัมพันธ
ตวั ดาํ เนนิ การความสมั พนั ธไดแ กต วั ดาํ เนนิ การทใ่ี ชเ ปรยี บเทยี บนพิ จน 2 นพิ จน มักใชกับคําสั่งควบคุม
ซง่ึ จะกลา วถงึ ในบทท่ี 3 ดังตาราง 2.5
ตาราง 2.5 แสดงตัวดําเนนิ การความสัมพันธ
ตวั ดาํ เนินการ ความหมาย
> มากกวา
< นอยกวา
>= มากกวาหรอื เทา กับ
<= นอ ยกวาหรือเทากับ
ผลทไี่ ดจากการใชดําเนนิ การความสัมพันธ คือ จริง (True) หรือเท็จ (False) ซงึ่ ในภาษาซีแทนดวย
เลขจาํ นวนเต็ม กรณีเท็จจะแทนดวยคา 0 และกรณจี รงิ จะแทนดวยคา ที่ไมใช 0 ทดสอบคาการเปรียบเทียบดัง
ตวั อยา งท่ี 2.5 และแสดงตวั อยางการประมวลผลนพิ จนค วามสมั พนั ธด ังตาราง 2.6
ตวั อยา งที่ 2.5 แสดงคา ของการเปรียบเทียบดวยตัวดาํ เนนิ การความสัมพันธ
#include <stdio.h>
void main( ) {
int x, y
printf(“Enter X : “);
scanf(“%d”, &x);
printf(“Enter Y : “);
scanf(“%d”, &y);
printf(“X > Y is %d”, x>y);
}
ผลการทํางานของโปรแกรม
Enter X : 32
Enter Y : 24
X > Y is 1
28
ตาราง 2.6 แสดงตวั อยา งการประมวลผลนพิ จนค วามสมั พนั ธ กาํ หนดให a = 5 และ b = 3
นพิ จน แปลงนิพจน คาตรรกะ คาที่ได
5+2*4 < (5+2)*4 5+(2*4) < (5+2)*4 True 1
a + b <= b+a (5+3) <= (3+5) True 1
a/b < b/a (5/3) < (3/5) False 0
8. ตวั ดาํ เนินการความเทากัน
ตวั ดาํ เนนิ การความเทา กนั เปน ตวั ดาํ เนินการเพื่อใชเปรียบเทียบความเทากันของนิพจน 2 นพิ จน มัก
ใชก บั คาํ สง่ั ควบคมุ ซง่ึ จะกลา วถงึ ในบทท่ี 3 มีตัวดาํ เนินการดังตาราง 2.7
ตาราง 2.7 แสดงตัวดําเนินการความเทากัน
ตวั ดาํ เนินการ ความหมาย
== เทากัน
!= ไมเทากัน
ผลลพั ธข องการเปรยี บเทยี บมีคา คือจริง หรอื เทจ็ การใชงานจะตองระวังเพราะมีความสับสนระหวาง
การใชต วั ดาํ เนนิ การความเทากัน == กบั ตวั ดาํ เนนิ กาํ หนดคา = ซงึ่ มกี ารทาํ งานที่ตางกัน และตัวดาํ เนนิ การไม
เทา กันใชเครื่องหมาย != ไมใ ชเครื่องหมาย <> เหมือนในภาษาอื่น ๆ เชน
a == 2 เปน การเปรยี บเทยี บวาตวั แปร a มคี า เทา กับ 2 หรอื ไม
a = 2 เปน การกาํ หนดคา 2 ใหกับตัวแปร a
ในการเปรียบเทียบคาจะตองระวังเร่ืองของเลขทศนิยมซึ่งเกิดจากการคํานวณของเครื่องคอมพิวเตอร
ซงึ่ คอมพวิ เตอรแ ตละเคร่อื งอาจจะใหผลการคาํ นวณที่ตางกันดังตัวอยาง
float a=1.0f;
คาํ สงั่ a == a / 3.0 * 3.0 อาจจะใหค า ถา คาดไมถ งึ เนื่องจากในทางคณิตศาสตร 1 / 3 * 3 จะได
คา เทา กบั 1 แตใ นทางคอมพวิ เตอร เครื่องคอมพิวเตอรบางเครื่องเมื่อ 1 / 3 จะไดค า 0.33333… เมอ่ื นํากลบั
มาคณู กับ 3 จะไดคา 0.99999… ซง่ึ ผลลพั ธจ ะไมเทากบั 1.0 ตามที่ผูเขียนโปรแกรมตั้งใจ แสดงตัวอยางการใช
ตวั ดาํ เนนิ การความเทากันดังตัวอยางที่ 2.6
29
ตวั อยา งที่ 2.6 แสดงคา ของการเปรียบเทียบดวยตัวดาํ เนนิ การความเทากัน
#include <stdio.h>
void main( ) {
int x, y, result;
printf(“Enter X : “);
scanf(“%d”, &x);
printf(“Enter Y : “);
scanf(“%d”, &y);
result = (x==y);
printf(“X == Y is %d”, result);
}
ผลการทํางานของโปรแกรม
Enter X : 25
Enter Y : 4
X == Y is 0
9. ตวั ดาํ เนินการตรรกะ
ตวั ดาํ เนนิ การตรรกะเปน ตวั ดําเนินการที่ใชคูกับตัวดาํ เนนิ การความสมั พันธและตัวดําเนนิ การความเทา
กนั ซง่ึ มกั จะใชก บั คาํ สั่งควบคุมซึ่งจะกลาวถึงในบทที่ 3 มีตัวดาํ เนนิ การดังตาราง 2.8 และมกี ารทาํ งานเหมือน
กบั การเปรยี บเทยี บเชงิ ตรรกะทว่ั ไป แสดงดว ยตารางคาความจริงในตาราง 2.9
ตาราง 2.8 แสดงตัวดําเนนิ การตรรกะ
ตวั ดาํ เนินการ ความหมาย
&& Logical AND
|| Logical OR
! Logical NOT
ตาราง 2.9 แสดงตารางคาความจริงของตัวดําเนนิ การตรรกะ
PQ P&&Q P||Q P !P
false
true true true true true true
true false false true false
false true false true
false false false false
30
ตวั อยางของการเปรียบเทียบไดแก 0
!10 ผลลพั ธค อื 1
!0 ผลลพั ธค อื 0
!’A’ ผลลพั ธค อื
สมมติให int a=1, b=3, c=4;
แสดงตวั อยา งการประมวลผลดงั ตาราง 2.10
ตาราง 2.10 แสดงตวั อยางการใชตัวดําเนนิ การตรรกะ
นพิ จน แปลงนิพจน คาตรรกะ คาที่ได
0
a + b > 0 && b / c > 1 ((a+b)>0) && ((b/c) > 1) False 1
0
a /c == b / c && (a+b) /c ==1 ((a/c)==(b/c))&&(((a+b)/c)==1) True
!a || !b ||!c (!a) || (!b) || (!c) False
ในการใชตัวดาํ เนินการตรรกกะสิ่งที่ตองระวังคือ Short Circuit เนอื่ งจากเราทราบวา ในกรณขี อง &&
(Logical And) หากนพิ จนแรกเปนเท็จ ไมว า นพิ จนท ่ี 2 เปน อะไร จะทําใหน พิ จนน น้ั เปนเทจ็ เสมอ และในกรณี
ของ || (Logical Or) หากนพิ จนแรกเปนจริง ไมว า นพิ จนท ่ี 2 เปน อะไร จะทําใหนพิ จนน นั้ เปนจริงเสมอ
คอมไพเลอรใ ชหลักการคิดนี้เชนเดียวกัน ทาํ ใหไ มม กี ารประมวลผลนพิ จนท ่ี 2 ในกรณที น่ี พิ จนแ รกทําใหเ กิด
Short Circuit แสดงดังตัวอยาง
int a=10;
printf(“[%d]”, a < 10 && a++ > 10);
printf(“\na is %d”, a);
จากตวั อยางผูเขียนตองการเพิ่มคา a ขนึ้ 1 หลังจากทาํ งานฟงกชัน printf( ) คาํ สง่ั แรก แตเนื่องจาก
นพิ จน a < 10 เปน เทจ็ ทาํ ใหน พิ จนห ลงั ไมถ กู ประมวลผล จึงไมเกิดการเพิ่มคา a จะได a มคี า เทากับ 10
เหมือนเดิม
พจิ ารณาตัวอยาง Short Circuit กรณขี องการใชตัวดาํ เนนิ การ ||
int a = 10;
printf(“[%d]”, a < 20 || a++ > 10);
printf(“\na is %d”, a);
จากตัวอยางนิพจน a < 20 เปน จรงิ ทาํ ใหเ กิด Short Circuit คอื ไมม กี ารประมวลผลในนพิ จนท ่ี 2
ของตวั ดาํ เนนิ การ || คา a จงึ ไมถ ูกเพิ่มคา จะไดคําตอบวา a มคี า เทากับ 10 เหมือนเดิม
31
นอกจากนี้การเขียนนิพจนตรรกศาสตรท่ีคุนเคยในชีวิตประจําวันในบางลักษณะไมสามารถทําไดใน
ทางคอมพวิ เตอร ตัวอยางเชน หากตองการทราบวา x มคี า อยใู นชวงตั้งแต 10 ถึง 20 จรงิ หรอื ไม ปกติแลว จะ
เขียนวา 10 <= x <=20 ซงึ่ รปู แบบนไี้ มสามารถใชไดในทางคอมพิวเตอร ที่ถูกตองจะตองเขียนวา
x >= 10 && x <=20
10. ตวั ดาํ เนินการเงื่อนไข
ตวั ดาํ เนนิ การเงอ่ื นไขเปน ตวั ดาํ เนนิ การทใ่ี ชต รวจสอบเงอ่ื นไขของนพิ จน มรี ปู แบบคอื
นพิ จน1 ? นพิ จน2 : นพิ จน3
การประมวลผลจะตรวจสอบนพิ จน1 วาเปน จรงิ หรอื เทจ็ หากเปนจริงจะทํางานในนพิ จน2 แตหากเปน
เทจ็ จะทาํ งานในนพิ จน3 แสดงดังตัวอยาง
min = (a < b) ? a : b;
การดาํ เนินการจะเปรียบเทียบคา a และ b หาก a มคี า นอยกวา b จรงิ จะไดวา min = a แตห าก
นพิ จน a < b เปนเท็จจะไดวา min = b; แสดงตวั อยางเพิ่มเติมในตัวอยางที่ 2.7 และ 2.8
ตวั อยา งที่ 2.7 โปรแกรมรบั ขอ มลู เลขจํานวนเต็มจากผูใช 2 จํานวน คือ x และ y หาก x มคี ามาก
กวา y ใหข ึ้นขอความวา “X more than Y” แตถ า ไมใชใหขึ้นขอความวา “X not more than Y”
#include <stdio.h>
void main( ) {
int x, y;
printf(“Enter X : “);
scanf(“%d”, &x);
printf(“Enter Y : “);
scanf(“%d”, &y);
(x > y) ? printf(“X more than Y”) : printf(“X not more than Y”);
}
ผลการทํางานของโปรแกรม
Enter X : 12
Enter Y : 8
X more than Y
32
ตวั อยางที่ 2.8 โปรแกรมรบั ขอ มลู เลขจํานวนเต็มจากผูใช 2 จํานวน คือ x และ y ใหหาวาคาที่มีคา
นอ ยที่สุดคือคาใด
#include <stdio.h>
void main( ) {
int x, y, min;
printf(“Enter X : “);
scanf(“%d”, &x);
printf(“Enter Y : “);
scanf(“%d”, &y);
min = (x < y) ? x : y;
printf(“Minimum value is %d”, min);
}
ผลการทํางานของโปรแกรม
Enter X : 12
Enter Y : 8
Minimum value is 8
33
แบบฝกหัดบทที่ 2
1. แปลงสมการตอ ไปนเ้ี ปน นพิ จนค ณติ ศาสตร .
(ก) .
x = 2y2 + y×3
(ข)
x = 2y2 + 4
2
2. หาทผ่ี ดิ ในนพิ จนต อ ไปน้ี และแกไขใหถูกตอง
(ก) a = + a – b * 3 2 .
(ข) a = ab + c .
(ค) x <> y .
(ง) a => b .
(จ) a1 > a2 OR a1 > a3 .
(ฉ) 10 <= x <= 20 .
(ช) (((a+b) > 10) && ((a-b) > 5))) .
3. ใหเขียนนิพจนตามที่โจทยระบุ
(ก) มีตัวแปร a b และ c ใหเ ขยี นนพิ จนเ พอ่ื หาคา ของ a ซงึ่ เกิดจาก b ยกกาํ ลังสองบวกกับ c
.
(ข) มีตัวแปร a b และ c ใหเ ขยี นนพิ จนเ พอ่ื หาคา ของ a ซงึ่ เกิดจาก a คณู กับ c แลวหารดวย b
.
(ค) มีตัวแปร a b และ c ใหเ ขยี นนพิ จนเ พอ่ื เปรยี บเทยี บวา a บวก b มคี า มากกวา a บวกดวย c หรอื ไม
.
(ง) มีตัวแปร a ใหเ ขยี นนพิ จนเ ปรยี บเทยี บวา a มคี า มากกวา 0 และเมื่อบวก a ดวย 5 มคี า ไมเกิน 100
.
(จ) มีตัวแปร x เกบ็ อายขุ องพนกั งานคนหนง่ึ ในบรษิ ทั ใหตรวจสอบวา x มอี ายอุ ยูในชวงตั้งแต 25 ปข น้ึ ไป
แตวาไมเกิน 60 ป
.
(ฉ) มีตัวแปร x เกบ็ จาํ นวนจริงจาํ นวนจริง ใหตรวจสอบวา x มคี า นอ ยกวา 100 หรือมากกวา 500
.
4. ใหค ําตอบของนพิ จนต อ ไปน้ี
(ก) int a=5, b=10, c=15, d;
d = a + 5 * b; /* d = . */
d = a + 5 * b; /* d = . */
d = b / a * c; /* d = . */
34
d = a + b * 3 / 2 – b / 4 + a % 2 + 10; /* d = . */
d=5
d += a + b % 3; /* d = . */
d %= b - 3; /* d = . */
d = a++ + b++ + 2; /* d = . */
/* a = . */
/* b = . */
d = ++a + a++; /* d = . */
/* a = . */
d = a + b++ 2 – b++ / 4 + ++a % 2; /* d = . */
/* a = . */
/* b = . */
(ข) int a=5, b;
float x=12.5, y;
b = 15.7; /* b = . */
y = 10; /* y = . */
b = a / 2; /* b = . */
y = x / 2; /* y = . */
b = a % 3 * 2.5; /* b = . */
y = x + 6 / 3; /* y = . */
(ค) int a=5, b=10, c=3;
a > b || a < c /* คาํ ตอบ = . */
(a + b / 3) > 10 /* คาํ ตอบ = . */
a*c > b && b*a/c < b/a*c /* คาํ ตอบ = . */
a >= 10 || b >=10 && c*a >= 10 /* คําตอบ = . */
! (a < b) && (a > c) || !(a+c > b) /* คาํ ตอบ = . */
5. เขยี นโปรแกรมคาํ นวณพื้นที่ของวงกลม โดยรับรัศมีของวงกลมจากผูใช สูตรการหาพื้นที่ของวงกลมไดแก
CircleArea = 1 PI *r2
2
กาํ หนดใหคา PI คือ 3.14159265
6. เขยี นโปรแกรมรบั ขอมูลจาํ นวนเต็ม 5 จํานวนจากผูใช และหาวาคาเฉลี่ยของขอมูลที่รับเขามามีคาเทาใด
7. เขยี นโปรแกรมใหร บั คา จาํ นวนจริงจากผูใช 1 จํานวน และใหห าวาเลขดังกลาวอยูในชวงของเลขจํานวน
เตม็ ใด เชน หากผใู ชป อ นเลข 12.5 ใหตอบวา “12.5 is between 12 and 13” (ใชต วั ดําเนนิ การเปลย่ี น
ชนดิ ขอมูลในการเขียนโปรแกรม)
8. เขยี นโปรแกรมเพอ่ื รบั ขอ มลู เลขจาํ นวนจริงจากผูใช 3 จาํ นวน ใหหาวาคาที่มากที่สุดที่ปอนเขามาคือคา
ใด โดยใชตัวดาํ เนนิ การเงอ่ื นไข
คาํ สั่งควบคุม 3
(Control Statements )
ในการเขียนโปรแกรมแบบโครงสราง จะมรี ปู แบบการแกป ญ หาหรอื รปู แบบการเขยี นโปรแกรมอยู 3
ลกั ษณะ คือ การเขียนแบบลําดับ (Sequential) การเขยี นแบบเงอ่ื นไข (Selection) และการเขียนแบบวนซํ้า
(Repetition) การเขยี นทลี ะคาํ สั่งจากบนลงจัดเปนการเขียนแบบลําดับ สวนการเขียนแบบเงื่อนไขและการ
เขยี นแบบวนซาํ้ นนั้ จะตอ งใชคาํ สั่งควบคุมมาชวยใหเกิดการเขียนในลกั ษณะดังกลา ว โดยที่ใชภาษาซีมีคาํ สั่ง if
และ switch เพอื่ ชวยในการเขียนแบบเงื่อนไข สว นในการเขยี นแบบวนซ้ําจะมี 3 คาํ สั่งคือ for while และ
do-while
1. คาํ สงั่ if
คาํ ส่งั if เปน คาํ สง่ั ทใ่ี ชใ นการเขยี นแบบเงอ่ื นไข ตัวอยางของประโยคในลักษณะเงื่อนไขเปนตัวอยางที่
สามารถพบเห็นไดในชีวิตประจาํ วัน เชน
ถา วนั นฝ้ี นไมต ก ฉนั จะเดนิ ไปโรงเรยี น แตถาฝนตก ฉนั จะขอใหค ณุ พอ ไปสง ทโ่ี รงเรยี น
หรอื ตัวอยางเชน
ถา ฉนั สอบไดค ะแนนดี คุณพอและคุณแมจะภูมิใจ
จะใหว า ประโยคเงื่อนไขดังกลาวมีอยู 2 ลกั ษณะ คือ ถาเงื่อนไขเปนจริงเกิดเหตุการณหนึ่ง แตถาไม
จรงิ จะเกดิ อกี เหตกุ ารณหน่งึ กับประโยคในลักษณะที่ถาเงื่อนไขเปนจริงจึงจะเกิดเหตุการณขึ้นเทานั้น ทง้ั 2
ลกั ษณะสามารถเขียนเปนผังงานของงานไดดังรูปที่ 3.1 (ก) และ (ข)
รปู ท่ี 3.1 แสดงผังงานของประโยคเงื่อนไข
36
จากผงั งานทั้ง 2 จะมีรูปแบบการเขียนคาํ สง่ั if เกิดขึ้น 2 แบบ
1.1 คาํ ส่ัง if-else
คําสง่ั if ในรปู แบบแรกจะคําสั่งที่ตองทําทั้งในกรณีที่เงื่อนไขเปนจริงและเปนเท็จ โดยใช
นิพจนตรรกศาสตรมาเปนเครื่องมือชวยในการตรวจสอบเงื่อนไข มรี ปู แบบคาํ สัง่ คือ
if ( เงื่อนไข )
คาํ สั่งที่ 1;
else
คาํ สั่งที่ 2;
ตวั อยา งเชน หากรับขอมูลจากผูใชและตองการตรวจสอบวาเลขที่รับเขามามีคามากกวา 10
ใหพ ิมพขอความวา “Number XXXX is over than 10” แตถ า ไมใชใหพิมพขอความวา “Number
XXXX is not over than 10” จะเขยี นเปน คําสั่งไดวา
scanf(“%d”, &number);
if (number > 10)
printf(“Number %d is over than 10”, number);
else
printf(“Number %d is not over than 10”, number);
แตห ากเงอ่ื นไขเปน จรงิ หรอื เทจ็ แลว ตอ งทําคาํ สั่งมากกวา 1 คําสัง่ จะตองใชเขียน if-else ใน
รปู แบบทใ่ี ชเ ครอ่ื ง { } ซงึ่ แสดงขอบเขตของการทําเงื่อนไข ครอบคาํ สั่งที่ตองทําในแตล ะเงอ่ื นไข มีรูป
แบบดังนี้
if ( เงื่อนไข ) {
คาํ สั่งที่ 1;
คาํ สั่งที่ 2;
….
} else {
คาํ สั่งที่ 3;
คาํ สั่งที่ 4;
…
}
37
ตวั อยา งเหมอื นในตวั อยา งกอ นหนา น้ี แตเพิ่มเงื่อนไขวา ถาเลขนั้นมีคามากกวา 10 ใหล ด
เลขนน้ั ลง 5 แสดงไดดังตัวอยาง
scanf(“%d”, &number);
if (number > 10) {
printf(“Number %d is over than 10”, number);
number = number – 5;
} else
printf(“Number %d is not over than 10”, number);
แตห ากมเี งอ่ื นไขเพม่ิ ขน้ึ อกี วา ถาเลขนั้นไมมากกวา 10 ใหเพิ่มคาเลขนั้นขึ้นอีก 5 สามารถ
เขียนไดวา
scanf(“%d”, &number);
if (number > 10) {
printf(“Number %d is over than 10”, number);
number = number – 5;
} else {
printf(“Number %d is not over than 10”, number);
number = number + 5;
}
ทง้ั นห้ี ากมคี าํ สงั่ เพียงคําสั่งเดียวในเงื่อนไข ก็สามารถใชเครื่องหมาย { } ไดเชนเดียวกัน เชน
scanf(“%d”, &number);
if (number > 10) {
printf(“Number %d is over than 10”, number);
} else {
printf(“Number %d is not over than 10”, number);
}
แสดงตวั อยางโปรแกรมดังตัวอยางที่ 3.1 และตัวอยางที่ 3.2
38
ตวั อยา งที่ 3.1 โปรแกรมเพื่อตรวจสอบความสูงของนักเรียน 2 คน โดยรับขอมูลความสงู ของนักเรียน
ทง้ั สองมาหาวาความสงู มากที่สุดคือคาใด
#include <stdio.h>
void main( ) {
float height1, height2, max;
printf(“Enter first student’s height (cm.) : “);
scanf(“%f”, &height1);
printf(“Enter second student’s height (cm.) : “);
scanf(“%f”, &height2);
if (height1 > height2)
max = height1;
else
max = height2;
printf(“Maximum height is : %.2f cm.”, max);
}
ผลการทํางานของโปรแกรม
Enter first student’s height (cm.) : 184.5
Enter second student’s height (cm.) : 192.4
Maximum height is : 192.40 cm.
ตวั อยางที่ 3.2 ใหค าํ นวณคาดัชนขี องนาํ้ หนกั (Body Mass Index : BMI) ซงึ่ สามารถคิดไดจากสูตร
BMI = w / h2 โดยที่ w แทนน้าํ หนักตัวมีหนวยเปนกิโลกรัม และ h แทนความสูงมีหนวยเปนเมตร หากคา
BMI อยใู นชว ง 20-25 ใหขึ้นขอความวา “Normal BMI.” แตห ากอยนู อกชวงดังกลาวใหขึ้นขอความวา
“Dangerous BMI.”
#include <stdio.h>
void main( ) {
float w, h, BMI;
printf(“Enter weight (Kg): “);
scanf(“%f”, &w);
printf(“Enter height (M): “);
scanf(“%f”, &h);
BMI = w / (h * h);
printf(“BMI is %.2f”, BMI);
if (BMI >= 20 && BMI <= 25)
printf(“\nNormal BMI.”);
39
else
printf(“\nDangerous BMI.”);
}
1.2 คาํ สัง่ if
ในกรณที ป่ี ระโยคเงอ่ื นไขมกี ารทํางานเฉพาะเงื่อนไขที่เปนจริงเทานั้น โดยไมมีการทาํ งานใด
ในเงอ่ื นไขทเ่ี ปน เทจ็ ดังแสดงในรูปที่ 3.1 (ข) สามารถเขียนแทนดวยคาํ สั่ง if โดยไมตองใสคาํ สง่ั
else แสดงดังรูปแบบ
if ( เงื่อนไข )
คาํ สั่งที่ 1;
แตถ า เงอื่ นไขเปนจริงแลวมีการทาํ คาํ สั่งมากกวา 1 คาํ สง่ั ขน้ึ ไป กใ็ ชรูปแบบของเครอ่ื งหมาย
{ } ซงึ่ ใชใ นกรณที ม่ี คี าํ สั่งที่ตองทําในเงื่อนไขและการวนซาํ้ มากกวา 1 คําสัง่ เพื่อแสดงขอบเขตของ
การทาํ งานนั้น
ตวั อยา งเชน ใหรับขอมูลจาํ นวนเต็มจากผูใช หากขอมูลนั้นมีคามากกวา 60 หรอื นอ ยกวา
20 ใหข ึ้นขอความวา “Number XXXX is out of range” เขยี นไดดังตัวอยาง
scanf(“%d”, &number);
if (number < 20 || number > 60)
printf(“Number %d is out of range”, number);
แสดงตวั อยา งการใชงานแสดงดังตัวอยางที่ 3.3 และ 3.4
ตวั อยา งที่ 3.3 โปรแกรมเพอื่ ใหผูใชคาดเดาตัวอักษรที่โปรแกรมไดตั้งไว ถาผูใชปอนขอมูลตัวอักษร
ตรงกบั ตวั อักษรตรงกับสิ่งที่โปรแกรมตั้งไวจะขึ้นคาํ วา “Bingo”
#include <stdio.h>
#define ANS ‘G’
void main( ) {
char ch;
printf(“Enter character (a-z/A-Z) : “);
scanf(“%c”, &ch);
if (ch == ANS)
printf(“Bingo”);
}
40
ผลการทํางานของโปรแกรม
Enter character (a-z/A-z) : G
Bingo
ระวัง - หากพิมพคาํ ส่งั ch == ANS เปน คําสงั่ ch = ANS จะไดผ ลลพั ธก ารทํางานที่แตกตางกัน
- การเปรียบเทียบ ch == ANS คอื การสั่งใหเปรียบเทียบวา ch == ‘G’
ตวั อยางที่ 3.4 แสดงโปรแกรมเพื่อรับขอมูลเลขจาํ นวนเต็ม 2 จาํ นวนจากผูใช หากคาแรกที่รับมามี
คา มากกวาคาหลงั ใหขึ้นขอความวา “First value more than second value.”
#include <stdio.h>
void main( ) {
int a, b;
printf(“Enter A : “);
scanf(“%d”, &a);
printf(“Enter B : “);
scanf(“%d”, &b);
if (a > b)
printf(“First value more than second value”);
}
1.3 คาํ สั่ง if แบบซับซอน
ในบางกรณปี ระโยคเงื่อนไขอาจจะมีความซับซอน มีการเปรียบเทียบเงื่อนไขเดียวกันกับหลายคา เชน
ใหร บั ขอ มลู ชั้นปของนักศึกษาและใหพิมพขอความตรงกับชั้นป กาํ หนดวาชน้ั ปท ่ี 1 พิมพวา “Freshman” ชน้ั ป
ท่ี 2 พิมพวา “Sophomore” ชน้ั ปท ่ี 3 พิมพวา “Junior” ชน้ั ปท ่ี 4 พิมพวา “Senior” ชน้ั ปอ น่ื ๆ พิมพวา “Super”
scanf(“%d”, &year);
if (year == 1)
printf(“Freshman”);
else if (year == 2)
printf(“Sophomore”);
else if (year == 3)
printf(“Junior”);
else if (year == 4)
printf(“Senior”);
else
printf(“Super”);
41
นอกจากนบี้ างเงอื่ นไขอาจจะมีความซับซอน เชน พิจารณาขอมูลนักศึกษา ใหตรวจสอบวาถาเปนนัก
ศกึ ษาเพศชายมคี วามสงู ตง้ั แต 180 ซม. ขน้ึ ไป ใหขึ้นขอความแนะนําวาควรจะสมัครเขาชมรมบาสเก็ตบอล แต
ถา เปน เพศหญงิ มคี วามสูงต้งั แต 170 ซม. ขน้ึ ไป ใหขึ้นขอความแนะนําวาควรจะสมัครเขาชมรมวอลเลยบอล
if (gender == ‘M’ && height > 180)
printf(“Basketball”);
else if (gender == ‘F’ && height > 170)
printf(“Volleyball”);
สามารถเขียนในอีกลักษณะหนึ่งไดวา
if (gender == ‘M’) {
if (height > 180)
printf(“Basketball”);
} else { /* ไมใ ชเพศชาย เพราะฉะนั้นเปนเพศหญิง */
if (height > 170)
printf(“Volleyball”);
}
การเขยี นในลกั ษณะดังกลาวจะตองระมัดระวังเรื่องการใชเครื่องหมาย { } ใหถ กู ตอ ง
พจิ ารณาจากตัวอยางตอไปน้ี
if (gender == ‘M’) เหมือนกับ if (gender == ‘M’)
if (height > 180) if (height > 180)
printf(“Basketball”); printf(“Basketball”);
else if (height > 170)
else printf(“Volleyball”);
if (height > 170)
printf(“Volleyball);
จะเหน็ วา การเวนยอหนาไมชวยใหเกี่ยวของกับการจับคูของเงื่อนไข if-else เวลาทค่ี อมไพเลอรม องดู
โปรแกรมไมไ ดด จู ากการยอ หนา แตดูจากสัญลักษณตาง ๆ การตีความจึงแตกตางจากความตั้งใจของผูเขียน
โปรแกรม เพราะฉะนั้นหากไมแนใจการจับคูเงื่อนไขใด ใหใชเครื่องหมาย { } เปน ตัวบอกขอบเขตการทาํ งาน
ของคาํ สง่ั if-else นน้ั ๆ โดยที่จาํ นวนปกกาเปดจะในโปรแกรมจะตองเทากับจาํ นวนปกกาปด ในโปรแกรมเสมอ
แสดงตวั อยางโปรแกรมดังตัวอยางที่ 3.5 และ 3.6
42
ตวั อยา งที่ 3.5 เขยี นโปรแกรมเพื่อรับขอมูลคะแนนสอบของนักศึกษา และใหพิมพเกรดที่นักศึกษาได
รบั จากเงอ่ื นไขการใหล ําดับขั้นดังนี้
คะแนนตา่ํ กวา 50 ไดเกรด F
คะแนนตา่ํ กวา 60 ไดเกรด D
คะแนนตา่ํ กวา 70 ไดเกรด C
คะแนนตา่ํ กวา 85 ไดเกรด B
คะแนนตั้งแต 85 ขน้ึ ไปไดเ กรด A
#include <stdio.h>
void main( ) {
float score;
printf(“Enter score : “);
scanf(“%f”, &score);
if (score < 50)
printf(“Grade F”);
else if (score < 60)
printf(“Grade D”);
else if (score < 70)
printf(“Grade C”);
else if (score < 85)
printf(“Grade B”);
else
printf(“Grade A”);
}
ตวั อยา งที่ 3.6 ใหร บั ขอ มลู จํานวน 3 จํานวนจากผูใช และใหหาวาคามากที่สุดมีคาเทาใด
#include <stdio.h>
void main( ) {
int first, second, third, max;
printf(“Enter first number : “);
scanf(“%d”, &first);
printf(“Enter second number : “);
scanf(“%d”, &second);
printf(“Enter third number : “);
scanf(“%d”, &third);
max = first;
if (max > second)
max = second;
43
else if (max > third)
max = third;
printf(“Maximum number is %d”, max);
}
ในทนี่ ลี้ องพิจารณาตัวอยางของ Short Circuit ทไ่ี ดก ลา วถงึ ในบทท่ี 2 กบั การใชงานประโยคเงื่อนไข
สงิ่ ทต่ี อ งระวังคือ หากใชเครื่องหมาย && (Logical And) ถา นพิ จนแ รกเปน เทจ็ จะทําใหนพิ จนนนั้ เปน เทจ็ เสมอ
และถาเปนเครื่อง || (Logical Or) หากนพิ จนแ รกเปนจริง จะทําใหทั้งนิพจนเปนจริงเสมอ สิ่งที่ตามมาคือ
คอมไพเลอรจ ะไมม กี ารประมวลผลคําสั่งในนิพจนที่คูกัน เรียกกระบวนการนี้วา Short-circuit แสดงดังตัวอยาง
int a = 10;
if (a > 5 || a++ > 10)
a = a * 2;
printf(“a = %d”, a);
จะไดคําตอบวา a = 20 ทง้ั นห้ี ากสงั เกตนพิ จนท ่ี 2 ของการเปรยี บเทียบจะเห็นวา ผูเขียนโปรแกรม
ตง้ั ใจใหม กี ารเพม่ิ คา ของ a ขน้ึ อกี 1 กอนทจ่ี ะทาํ งานใด ๆ แตเนื่องจากนิพจนแรกเปนจริง ทาํ ใหสรุปไดวาทั้ง
นพิ จนน เ้ี ปน จรงิ จึงไมมกี ารประมวลผลนพิ จนท ่ี 2 คา a จงึ ไมเ พมิ่ ขนึ้ ซึ่งอาจจะทําใหคาที่ไดผดิ จากความตั้งใจ
ของผเู ขยี นโปรแกรม
ตวั อยางของ Short-circuit ทใี่ ชเครื่องหมาย && ไดแ ก
int a = 10;
if (a < 5 && a++ > 10)
a = a * 2;
printf(“a = %d”, a);
จะไดค ําตอบคือ a = 10 เนอื่ งจากนิพจนแรกเปนเท็จ ทาํ ใหเ กิด Short-circuit ไมม กี ารประมวลผล
นพิ จนท ่ี 2 คา a จงึ ไมมีการเพิ่มขึ้น
นอกจากนห้ี ากเปรยี บเทยี บตวั ดาํ เนนิ การเงอ่ื นไขทไ่ี ดก ลา วถงึ ในบทท่ี 2 สามารถเปรียบเทียบไดกับการ
ทาํ งานประโยคเงอ่ื นไข if-else ดงั ตวั อยาง
x = (y < 0) ? -y : y;
หากเขยี นคาํ สั่งดังกลาวเปนประโยคเงอื่ นไข if-else จะได
if (y < 0)
x = -y;
else
x = y;
44
2. คาํ ส่ัง switch
คาํ ส่งั switch เปน คาํ สงั่ ที่ใชในการเขียนประโยคเงื่อนไข มักจะใชกับกรณีที่เปนเงื่อนไข if แบบซบั ซอ น
ตวั อยา งเชน ในเรื่องของการตรวจสอบชั้นปของนักศึกษา และใหพิมพขอความตามชั้นปที่กาํ หนด ดังตัวอยางที่
แสดงในหวั ขอ 3.1.3 จะเห็นวามีการตรวจสอบนิพจนเ งื่อนไข คือ ชั้นปของนักศึกษาในทุกเงื่อนไขเหมือนกัน
ประโยคในลกั ษณะเชนนี้สามารถใชคาํ ส่งั switch มาชว ยในการเขียน เพื่อชวยใหอานเขาใจไดมากยิ่งขึ้น ท้งั น้ี
เงอ่ื นไขทจ่ี ะนาํ มาตรวจสอบในคาํ สงั่ switch ไดจ ะตอ งมีคาเปนเลขจาํ นวนเต็มหรือตัวอักขระเทานั้น ไม
สามารถใชก บั การตรวจสอบสตรงิ หรือขอมลู ท่มี ลี ักษณะเปนชวง มีรูปแบบของคาํ สง่ั switch คือ
switch ( เงื่อนไข ) {
case คา คงที่1 : คาํ สั่ง1 ;
case คา คงท2่ี : คาํ สงั่ 2 ;
default : คาํ สงั่ N ;
}
การทํางานของคาํ สงั่ switch จะตรวจสอบเงอ่ื นไข วาตรงกับคา case ใด กจ็ ะไปทํางานที่คาํ สั่งที่อยู
ใน case นน้ั คาํ สั่งหนึ่งที่มักจะใชคูกับคาํ สงั่ switch คือ คาํ ส่ัง break คาํ สง่ั นใี้ ชในการบอกใหโปรแกรมหยดุ
การทาํ งาน และกระโดดออกจากขอบเขตของ { } ทใ่ี กลท สี่ ดุ ซึ่งสามารถใชคําสั่งนี้รวมกับคาํ สั่งวนซาํ้ อื่น ๆ อกี
ดว ย พิจารณาการทาํ งานของคาํ ส่งั switch จากตัวอยาง
int a=2; int a=2;
switch ( a ) { switch ( a ) {
case 1 : printf(“11111\n”); case 1 : printf(“11111\n”);
case 2 : printf(“22222\n”); break;
case 3 : printf(“33333\n”);
default : printf(“AAAAA\n”); case 2 : printf(“22222\n”);
} break;
case 3 : printf(“33333\n”);
break;
default : printf(“AAAAA\n”);
}