computer programming book
TRANSCRIPT
©2011 CE-KMITL v0.1
1
©2011 CE-KMITL v0.1
2
คานา
หนงสอฉบบนเปนรน 0.1แกไขเมอ (Monday, May 30, 2011) แนนอนวาเปนรนเรมตน เนอหาสวนใหญในหนงสอนามาจากสไลท ซงคณาอาจารยทสอนวชา Computer and Programming และ Principle of Programming ไดแก อ. ประสาร ตงตสานนท อ. คณฐ ตงตสานนท อ. วบลย พรอมพานชย อ. บณฑต พสยา อ. วจนพงศ เกษมศร อ. จระศกด สทธกร อ. ธนญชย ตรภาค อ. เกยรตณรงค ทองประเสรฐ ดร.ปกรณ วฒนจตรพร รศ. ดร.เกยรตกล เจยรนยธนะกจ ดร. สรนทร กตตธรกล ทานเหลานไดเขยนหรอแกไขปรบปรงเนอหาเอาไว ผมไดรวมเนอหาเหลานนเปนหนงสอ โดยจดประสงคเพอเกบเนอหาอยางเปนระบบ และนศ.สามารถคนหาสงทสงสยไดอยางรวดเรว เนอหาในชวยแรกๆยอมมจดผดพลาด Bug ตางๆเกดขน อกทงความสมบรณของเนอหาในทางวชาการอาจจะไมลงลกในบางเรอง แนนอนวาตองปรบปรงตอไป เมอถงรน 1.0 แลวเนอหาสมบรณ ณ เวลานน คงพรอมเปนตาราทเหมาะสมตอไป ผมยนดรบขอเสนอแนะในการปรบปรงเนอหา สภกจ นตยะสกล ผประสานงานวชา Computer and Programming ปการศกษา 2554 แนะนาตดตอไดท [email protected]
©2011 CE-KMITL v0.1
3
แนะนาหนงสอภาษาซ (โดย อ. ธนญชย ตรภาค) ในการเรยนวชา คอมพวเตอรและการเขยนโปรแกรม (Computers and Programming) นอกจากจะใชเอกสารทอาจารยใชในการเรยนการสอนในหอง และเอกสารการทดลองแลว นกศกษาควรมหนงสออนๆ เพอเปนเอกสารอางองคาสงตางๆ ศกษาโจทยปญหา และแนวคดตางๆ โดยนกศกษาสามารถใชหนงสอในรายการตางๆ ตอไปน หรอหนงสออนๆ ในทองตลาดได
ชอหนงสอ : คมอเขยนโปรแกรมภาษา C ฉบบผเรมตน ผเขยน : ประภาพร ชางไม สานกพมพ : Dev Book หนงสอมเนอหาทฤษฎพนฐานของภาษา C ตามมาตรฐาน ANSI ครบถวน ซงสามารถนามาใชอางองในการเขยนคาสงตางๆ ไดเปนอยางดในหนงสอมตวอยางโจทยปญหา ตวอยางโปรแกรมพรอมคาอธบาย และหนาจอแสดงผลของโปรแกรมตวอยางตางๆ
ชอหนงสอ : รวมโจทยขอสอบภาษา C ผเขยน : ประภาพร ชางไม สานกพมพ : Dev Book หนงสอเลมนนาเสนอโจทยปญหาตางๆ ของภาษา C ในรปแบบคาถามและคาตอบ ซงนกศกษาสามารถนามาใชทบทวน และประเมนตวเองในการสอบกลางภาคและการสอบปลายภาคได
ชอหนงสอ : คอมพวเตอรและการเขยนโปรแกรม C และ Java ผเขยน : ธนญชย ตรภาค สานกพมพ : SE-ED เปนหนงสอทมงเนนกระบวนการคดในการเขยนโปรแกรม มการกาหนดขนตอนการคดโดยละเอยด จากโจทยปญหา โคดเทยม ไปจนถงลาดบการเขยนโคดโปรแกรม เหมาะสาหรบผทยงไมเคยเขยนโปรแกรมมากอน หรอผเรมตนเขยนโปรแกรม
©2011 CE-KMITL v0.1
4
ชอหนงสอ : คมอเรยนภาษาซ ผเขยน : อรพน ประวตบรสทธ สานกพมพ : Provision เปนหนงสอทนาเสนอชดคาสงและโครงสรางขอมลพนฐานตางๆ ในภาษาซ ซงแตละคาสงหรอโครงสรางขอมลจะมตวอยางโจทย โคดโปรแกรม และคาอธบายโคดโปรแกรมเปนรายบรรทด มการนาเสนอเกยวกบโครงสรางขอมล และการเปลยนแปลงขอมลตางๆ ทเกดขนในโปรแกรมใหเหนภาพการเปลยนแปลงขอมลในตวแปรตางๆชดเจน
ชอหนงสอ : คมอการเขยนโปรแกรมภาษา C ผเขยน : รศ. ธรวฒน ประกอบผล สานกพมพ : Clean Code หนงสออธบายหลกการและแนวคดของภาษาซ การเขยนโปรแกรมแบบโครงสราง ผงงาน และซโดโคด การบนทกลงไฟล และอานไฟล การเขยนโปรแกรมกราฟก และภาพเคลอนไหว โดยมตวอยางโจทย โคดโปรแกรม และคาอธบายโคดชดเจน
©2011 CE-KMITL v0.1
5
สารบญ
คานา .......................................................................................................................................................................................... 2
สารบญ ....................................................................................................................................................................................... 5
สารบญโปรแกรม ..................................................................................................................................................................... 12
บทท 0 แนะนาวชา ................................................................................................................................................................. 15
วตถประสงคของวชา ......................................................................................................................................................... 15
การวดผล .......................................................................................................................................................................... 15
ระเบยบการใชหองปฏบตการ ........................................................................................................................................... 15
บทท 1 พนฐานเกยวกบคอมพวเตอร ...................................................................................................................................... 17
1. ความเปนมาของคอมพวเตอร ............................................................................................................................................. 17
1.1 คอมพวเตอรคออะไร .................................................................................................................................................. 17
1.2 ขนตอนการทางานของคอมพวเตอร ........................................................................................................................... 17
1.3 องคประกอบหลกของคอมพวเตอร ............................................................................................................................ 17
1.4 ภาษาคอมพวเตอร ...................................................................................................................................................... 19
1.5 ระบบจานวนและตวเลข ............................................................................................................................................. 19
1.6 ขนาดตวเลขในระบบคอมพวเตอร .............................................................................................................................. 21
1.7 ตวอกษรทใชในคอมพวเตอร ....................................................................................................................................... 22
1.8 รจกภาษาซ ................................................................................................................................................................. 23
การทดลองท 1 การพฒนาโปรแกรมภาษาซเบองตน .............................................................................................................. 24
ทฤษฎ ................................................................................................................................................................................ 24
ขนตอนการพฒนาโปรแกรม .................................................................................................................................................... 24
การทดลองท 1.1 ............................................................................................................................................................... 25
การทดลองท 1.2 ............................................................................................................................................................... 30
การทดลองท 1.3 ............................................................................................................................................................... 31
การทดลองท 1.4 ............................................................................................................................................................... 31
บทท 2 การเขยนโปรแกรม คาสงแสดงผล .............................................................................................................................. 33
2.1 โครงสรางภาษาซ .............................................................................................................................................................. 33
2.2 ฟรโปรเซสเซอรไดเรคทฟ (Preprocessor directive) ..................................................................................................... 33
ฟงกชนหลก ....................................................................................................................................................................... 34
2.3 การแสดงผลดวยคาสง printf ........................................................................................................................................... 34
2.4 แสดงชนดขอมลทกาหนดรปแบบการแสดงผล ................................................................................................................. 37
2.5 คาอธบายโปรแกรม .......................................................................................................................................................... 38
2.5 คาถามทายบท .................................................................................................................................................................. 39
การทดลองท 2 การเขยนโปรแกรมเบองตนและคาสงแสดงผล ............................................................................................... 41
©2011 CE-KMITL v0.1
6
ทฤษฎ ................................................................................................................................................................................ 41
การทดลองท 2.1 ............................................................................................................................................................... 44
การทดลองท 2.2 ............................................................................................................................................................... 45
การทดลองท 2.3 ............................................................................................................................................................... 46
การทดลองท 2.4 ............................................................................................................................................................... 46
การทดลองท 2.5 ............................................................................................................................................................... 46
บทท 3 ชนดของขอมลในภาษาซ คาสงรบขอมล และการคานวณ .......................................................................................... 47
3.0 ตวแปรในภาษาซ .............................................................................................................................................................. 47
3.1 ชนดของขอมลในภาษาซ .................................................................................................................................................. 47
3.1.1 ขอมลชนดวางเปลา (void)...................................................................................................................................... 47
3.1.2 ขอมลชนดจานวนเตม (integer) ............................................................................................................................. 47
3.1.3 ขอมลชนดจานวนทศนยม (float) ........................................................................................................................... 47
3.1.4 ขอมลชนดอกขระ หรอตวอกษร (character) ......................................................................................................... 48
3.1.5 ตารางสรปชนดขอมล .............................................................................................................................................. 48
3.2 รปแบบการประกาศตวแปร .............................................................................................................................................. 48
3.2.1 ประกาศตวแปรแบบไมกาหนดคาเรมตน ................................................................................................................ 48
3.2.2 การประกาศตวแปรแบบกาหนดคาเรมตน .............................................................................................................. 49
3.2.3 หลกการตงชอตวแปร .............................................................................................................................................. 49
3.3 ตวแปรชนดขอความ ......................................................................................................................................................... 50
3.3.1 รปแบบการประกาศตวแปรชนดขอความ ................................................................................................................ 50
3.3.2 รปแบบการประกาศตวแปรชนดขอความพรอมกาหนดคา ...................................................................................... 50
3.3.3 รปแบบการอางองในตวแปรขอความ ...................................................................................................................... 51
3.4 การใชงานตวแปรรวมกบคาสง printf .............................................................................................................................. 51
3.5 การรบขอมลจาก Keyboard ดวย scanf ........................................................................................................................ 52
3.5.1 รปแบบคาสง scanf ................................................................................................................................................ 52
3.5.2 การรบขอความทมการเวน (spacebar) .................................................................................................................. 52
3.6 เครองหมายคานวณทางคณตศาสตร ................................................................................................................................ 53
3.6.1 การเพมลดคาตวแปร ............................................................................................................................................... 54
3.6.2 เครองหมายแบบลดรป ............................................................................................................................................ 54
3.6.3 ตวดาเนนการ และตวถกดาเนนการ ........................................................................................................................ 55
3.6.4 นพจน ...................................................................................................................................................................... 55
3.6.4 การเปลยนชนดของขอมล ....................................................................................................................................... 56
3.7 คาสงอนทใช แสดงผล และรบขอมล ................................................................................................................................ 56
3.8 คาถามทายบท .................................................................................................................................................................. 57
การทดลองท 3 การใชงานคาสง Input Output และการคานวณตางๆ ................................................................................. 59
©2011 CE-KMITL v0.1
7
ทฤษฎ ................................................................................................................................................................................ 59
การทดลองท 3.1 ............................................................................................................................................................... 61
การทดลองท 3.2 ............................................................................................................................................................... 61
การทดลองท 3.3 ............................................................................................................................................................... 62
บทท 4 ผงงาน และการเขยนโปรแกรมกาหนดเงอนไข ........................................................................................................... 63
4.1 การพฒนาโปรแกรมคอมพวเตอร ..................................................................................................................................... 63
อลกอรทม (Algorithm) .................................................................................................................................................... 63
ขนตอนการคด .................................................................................................................................................................. 64
4.1 ผงงาน (Flowchart) ......................................................................................................................................................... 64
4.2 การเขยนโปรแกรมแบบกาหนดเงอนไข ............................................................................................................................ 66
4.2.1 การเปรยบเทยบ ...................................................................................................................................................... 66
4.2.2 เปรยบเทยบทางตรรกศาสตร .................................................................................................................................. 67
4.3 คาสงเงอนไข if ................................................................................................................................................................. 67
4.4 คาสงเงอนไข if-else......................................................................................................................................................... 69
4.4 คาสงเงอนไข if-else ลกษณะผกกน ................................................................................................................................. 70
4.4 คาสง switch case .......................................................................................................................................................... 72
4.5 คาถามทายบท .................................................................................................................................................................. 72
การทดลองท 4 การเขยนโปรแกรมแบบกาหนดเงอนไข ......................................................................................................... 74
ทฤษฎ ................................................................................................................................................................................ 74
การทดลองท 4.1 ............................................................................................................................................................... 77
การทดลองท 4.2 ............................................................................................................................................................... 77
การทดลองท 4.3 ............................................................................................................................................................... 78
บทท 5 การเขยนโปรแกรมแบบวนซา ..................................................................................................................................... 79
5.1 บทนา ............................................................................................................................................................................... 79
5.2 คาสง while ..................................................................................................................................................................... 80
5.3 คาสง do-while ............................................................................................................................................................... 81
5.4 คาสง for .......................................................................................................................................................................... 82
5.4 คาถามทายบท .................................................................................................................................................................. 84
การทดลองท 5 การเขยนโปรแกรมแบบวนซา ........................................................................................................................ 86
ทฤษฎ ................................................................................................................................................................................ 86
การทดลองท 5.1 ............................................................................................................................................................... 89
การทดลองท 5.2 ............................................................................................................................................................... 89
การทดลองท 5.3 ............................................................................................................................................................... 89
บทท 6 การเขยนโปรแกรมแบบวนซา และกาหนดเงอนไข ..................................................................................................... 91
6.1 ตวอยางการประยกตใชคาสงวนซา กบเงอนไข เพอแกปญหาตางๆ ................................................................................. 91
©2011 CE-KMITL v0.1
8
6.2 คาถามทายบท .................................................................................................................................................................. 97
การทดลองท 6 การเขยนโปรแกรมการวนรอบ และกาหนดเงอนไข ....................................................................................... 98
การทดลองท 6.1 : ............................................................................................................................................................ 98
การทดลองท 6.2 ............................................................................................................................................................... 98
การทดลองท 6.3 ............................................................................................................................................................... 98
การทดลองท 6.4 ............................................................................................................................................................... 98
การทดลองท 6.5 ............................................................................................................................................................... 98
การทดลองท 6.6 ............................................................................................................................................................... 98
บทท 7 ตวแปรแถวลาดบ Array ........................................................................................................................................... 100
วตถประสงคการศกษา .......................................................................................................................................................... 100
7.1 ตวแปรแถวลาดบ Array ................................................................................................................................................. 100
7.2 อารเรย 1 มต .................................................................................................................................................................. 101
7.2.1 การกาหนดคาเรมตนใหอารเรย ............................................................................................................................. 101
7.2.2 การอางองขอมลอารเรย ........................................................................................................................................ 101
7.3 ตวแปรแถวลาดบและเกบขอความ ................................................................................................................................. 104
7.4 อารเรย 2 มตหรอมากกวา.............................................................................................................................................. 104
7.4.1 การกาหนดคาเรมตนใหอารเรย 2 มต ................................................................................................................... 105
7.5 การสลบคาในอารเรย ..................................................................................................................................................... 108
7.6 คาถามทายบท ................................................................................................................................................................ 109
การทดลองท 7 ตวแปรแถวลาดบ ......................................................................................................................................... 110
ทฤษฎ .............................................................................................................................................................................. 110
การทดลองท 7.1 ............................................................................................................................................................. 112
การทดลองท 7.2 ............................................................................................................................................................. 112
การทดลองท 7.3 ............................................................................................................................................................. 112
บทท 8 ตวแปรโครงสราง Structure .................................................................................................................................... 114
8.0 ตวแปรโครงสราง ............................................................................................................................................................ 114
8.1 การประกาศตวแปรโครงสราง ........................................................................................................................................ 114
8.2 การอางถงตวแปรในโครงสราง ....................................................................................................................................... 115
8.3 การกาหนดขอมลใหตวแปรโครงสราง ............................................................................................................................ 115
8.4 การกาหนดคาเรมตนใหโครงสราง .................................................................................................................................. 117
8.5 ประกาศตวแปรโครงสรางแบบอารเรย ........................................................................................................................... 117
8.6 โครงสรางซอนโครงสราง (Nest structure) ................................................................................................................... 118
8.7 คาถามทายบท ................................................................................................................................................................ 120
การทดลองท 8 โครงสรางขอมล ........................................................................................................................................... 121
ทฤษฎ .............................................................................................................................................................................. 121
©2011 CE-KMITL v0.1
9
การทดลองท 8.1 ............................................................................................................................................................. 123
การทดลองท 8.2 ............................................................................................................................................................. 123
บทท 9 ตวแปรชตาแหนง (Pointer) ..................................................................................................................................... 124
9.1 โครงสรางของหนวยความจาและตวช ............................................................................................................................. 124
9.1.1 การประกาศตวแปร pointer ................................................................................................................................ 124
9.1.2 ตวดาเนนการ (Reference Operator) “&” ........................................................................................................ 124
9.1.3 ตวดาเนนการเชงออม (Indirect Operator) “*” ................................................................................................. 125
9.2 การแสดงตวชดวยฟงกชน printf.................................................................................................................................... 125
9.3 Pointer ซอน Pointer ................................................................................................................................................... 127
9.4 ตวชและแถวลาดบ .......................................................................................................................................................... 127
9.4.1 การยาย Pointer ทชตวแปรอารเรย ดวย += และ -= ......................................................................................... 128
9.4.2 การยาย Pointer ทชตวแปรอารเรย ดวย + และ - .............................................................................................. 128
9.4.3 การคานวณจานวน element ดวย pointer ........................................................................................................ 129
9.4 ความสมพนธระหวาง Pointer กบ Array ...................................................................................................................... 129
9.4.1 กรณท 1 ใช array ปกต ........................................................................................................................................ 129
9.4.2 กรณท 2 ใช array เขยนแบบ pointer ................................................................................................................. 130
9.4.3 กรณท 3 ใช pointer เขยนแบบ array ................................................................................................................. 130
9.4.4 กรณท 4 ใช pointer ปกต ................................................................................................................................... 130
9.5 ตวชกบตวแปรโครงสราง ................................................................................................................................................ 131
9.6 คาถามทายบท ................................................................................................................................................................ 133
การทดลองท 9 ตวช (Pointer) ............................................................................................................................................. 134
ทฤษฎ .............................................................................................................................................................................. 134
การทดลองท 9.1 ............................................................................................................................................................. 135
การทดลองท 9.2 ............................................................................................................................................................. 136
การทดลองท 9.3 ............................................................................................................................................................. 136
การทดลองท 9.4 ............................................................................................................................................................. 137
คาถามพเศษ .................................................................................................................................................................... 138
บทท 10 ฟงกชน (Function) ............................................................................................................................................... 140
10.1 ฟงกชนคออะไร ............................................................................................................................................................ 140
10.2 ประเภทของฟงกชน ..................................................................................................................................................... 140
10.2.1 ฟงกชนไลบรารมาตรฐาน .................................................................................................................................... 141
10.2.2 ฟงกชนทผใชงานสรางขนเอง (User-defined function) .................................................................................. 143
10.3 รปแบบโครงสรางของฟงกชน ....................................................................................................................................... 143
10.4 การรบคาและสงคาจากฟงกชน .................................................................................................................................... 145
10.5 ตวแปรและขอบเขตการใชงานฟงกชน ......................................................................................................................... 147
©2011 CE-KMITL v0.1
10
10.6 การสงคาตวแปร ........................................................................................................................................................... 147
10.6.1 Pass by value .................................................................................................................................................. 148
10.6.2 Pass by reference ........................................................................................................................................... 148
10.7 คาถามทายบท .............................................................................................................................................................. 150
การทดลองท 10 ฟงกชน....................................................................................................................................................... 152
ทฤษฎ .............................................................................................................................................................................. 152
การทดลองท 10.1 .......................................................................................................................................................... 153
การทดลองท 10.2 .......................................................................................................................................................... 153
การทดลองท 10.3 .......................................................................................................................................................... 153
การทดลองท 10.4 .......................................................................................................................................................... 153
การทดลองท 10.5 .......................................................................................................................................................... 153
การทดลองท 10.6 .......................................................................................................................................................... 153
การทดลองท 10.7 .......................................................................................................................................................... 154
การทดลองท 10.8 .......................................................................................................................................................... 154
การทดลองท 10.9 .......................................................................................................................................................... 155
บทท 11 ไฟลขอมล ............................................................................................................................................................... 156
11.1 ไฟลขอมล ..................................................................................................................................................................... 156
11.2 เปดไฟล ........................................................................................................................................................................ 157
11.3 ปดไฟล ......................................................................................................................................................................... 158
11.4 อานไฟลรปแบบ Text .................................................................................................................................................. 159
11.5 เขยนไฟลรปแบบ text file .......................................................................................................................................... 161
11.6 เขยน array หรอ struct ลงไฟลรปแบบ binary ......................................................................................................... 162
11.7 อาน array หรอ struct จากไฟลรปแบบ binary......................................................................................................... 162
11.8 ยาย file pointer ......................................................................................................................................................... 163
11.9 คาสงอนเกยวกบไฟล .................................................................................................................................................... 164
11.10 คาถามทายบท ........................................................................................................................................................... 164
การทดลองท 11 การเขยนโปรแกรมตดตอกบ Text File ..................................................................................................... 166
ทฤษฎ .............................................................................................................................................................................. 166
การทดลองท 11.1 .......................................................................................................................................................... 167
การทดลองท 11.2 .......................................................................................................................................................... 168
การทดลองท 11.3 .......................................................................................................................................................... 168
การทดลองท 11.4 .......................................................................................................................................................... 168
การทดลองท 11.5 .......................................................................................................................................................... 168
การทดลองท 11.6 .......................................................................................................................................................... 169
หนงสออางอง ........................................................................................................................................................................ 170
©2011 CE-KMITL v0.1
11
การตดตงโปรแกรม Visual Studio 2008 ............................................................................................................................ 171
©2011 CE-KMITL v0.1
12
สารบญโปรแกรม
โปรแกรม 2.1 การใชงานคาสง printf .......................................................................................................................................................... 34
โปรแกรม 2.2 การใชงานคาสง printf หลายๆคาสง ............................................................................................................................. 35
โปรแกรม 2.3 การใชงานคาสง printf มสญลกษณพเศษควบคมการแสดงผล ........................................................................ 35
โปรแกรม 2.4 printf มสญลกษณพเศษควบคมการแสดงผล............................................................................................................ 36
โปรแกรม 2.4 แสดงรายไดตอเดอน ............................................................................................................................................................ 38
โปรแกรม 2.5 แสดงรายไดตอเดอน ............................................................................................................................................................ 39
โปรแกรม 2.6 โปรแกรมแสดงเกรด ............................................................................................................................................................ 39
โปรแกรม 3.1 คาสง scanf ................................................................................................................................................................................. 53
โปรแกรม 3.2 คาสง scanf ................................................................................................................................................................................. 53
โปรแกรม 3.3 แสดงการคานวณ .................................................................................................................................................................. 53
โปรแกรม 3.4 เพม/ลดคาตวแปร ................................................................................................................................................................. 54
โปรแกรม 3.5 เพม/ลดคาตวแปร ................................................................................................................................................................. 55
โปรแกรม 3.6 แสดงลาดบความสาคญสญลกษณทางคณตศาสตร ............................................................................................. 56
โปรแกรม 3.7 เรยกใช putchar, puts ............................................................................................................................................................. 57
โปรแกรม 3.8 เรยกใช getchar, getch, puts ................................................................................................................................................. 57
โปรแกรม 4.1 การสรางโปรแกรมคานวณหาพนทวงกลม ............................................................................................................... 65
โปรแกรม 4.2 โปรแกมตรวจสอบคะแนน ................................................................................................................................................ 68
โปรแกรม 4.3 หารเลข 2 จานวน .................................................................................................................................................................. 70
โปรแกรม 4.4 แสดงเกรด A ถง F .................................................................................................................................................................. 71
โปรแกรม 5.1 ไมมการวนซา ........................................................................................................................................................................... 79
โปรแกรม 5.2 แสดงเลข 0..10 ดวย while ................................................................................................................................................... 80
โปรแกรม 5.3 หาผลรวมของเลขใช while ................................................................................................................................................ 80
โปรแกรม 5.4 หาผลรวม 1 ถง 100 ใช do-while ...................................................................................................................................... 81
โปรแกรม 5.5 โปรแกรมหาผลรวม 1 ถง 100 ใช for ............................................................................................................................. 82
โปรแกรม 5.6 แสดงผล a – z ใช for ............................................................................................................................................................. 83
โปรแกรม 5.7 แสดงผลรปสเหลยม ใช for ............................................................................................................................................... 83
โปรแกรม 6.1 โปรแกรมแสดงสตรคณแม 2 ........................................................................................................................................... 91
โปรแกรม 6.2 โปรแกรมแสดงเลข 0 – 100 ใช while ........................................................................................................................ 92
โปรแกรม 6.3 โปรแกรมแสดงเลขค 0 – 100 ใช while ..................................................................................................................... 92
โปรแกรม 6.4 โปรแกรมตรวจสอบจานวนสระ ใช for ....................................................................................................................... 92
©2011 CE-KMITL v0.1
13
โปรแกรม 6.5 โปรแกรมแสดงผลรปสเหลยมกลวง ............................................................................................................................. 93
โปรแกรม 6.6 โปรแกรมต ATM ...................................................................................................................................................................... 94
โปรแกรม 6.7 โปรแกรมคานวณคาอาหาร .............................................................................................................................................. 95
โปรแกรม 7.1 โปรแกรมรบอายของคน 20 คน .................................................................................................................................... 102
โปรแกรม 7.2 โปรแกรมวเคราะหสวนสงของคน n คน................................................................................................................... 102
โปรแกรม 7.3 โปรแกรมรบขอมลและแสดงผลลพธแบบเมทรกซ ............................................................................................. 106
โปรแกรม 7.4 หาผลรวมในเมทรกซ ......................................................................................................................................................... 106
โปรแกรม 7.5 นบจานวนขอความ ............................................................................................................................................................. 107
โปรแกรม 7.6 หาคามากทสด ...................................................................................................................................................................... 108
โปรแกรม 8.1 ประกาศตวแปรโครงสราง ............................................................................................................................................... 115
โปรแกรม 8.2 กาหนดคาใหตวแปรโครงสราง ..................................................................................................................................... 116
โปรแกรม 8.3 โปรแกรมเกบขอมลหนงสอ ............................................................................................................................................ 116
โปรแกรม 8.4 เกบขอมลนศ.จานวน 10 คน .......................................................................................................................................... 118
โปรแกรม 8.5 โปรแกรมเกบขอมลสถานศกษา ................................................................................................................................... 119
โปรแกรม 9.1 โปรแกรมแสดงขอมลผานทาง pointer ....................................................................................................................... 125
โปรแกรม 9.2 โปรแกรมการใช referencing และ dereferencing ....................................................................................................... 126
โปรแกรม 9.3 โปรแกรมการใช referencing และ dereferencing แบบ2 ......................................................................................... 126
โปรแกรม 9.4 โปรแกรมแสดงการใช pointer กบ array ..................................................................................................................... 129
โปรแกรม 9.5 โปรแกรมแสดงการใช pointer กบ array ..................................................................................................................... 129
โปรแกรม 9.6 โปรแกรมเกบขอมลนศ. 10 คน ..................................................................................................................................... 132
โปรแกรม 10.1 โปรแกรมคานวณ sin,cos,tan,sqrt,pow,log,log10,exp และ fabs ......................................................................... 141
โปรแกรม 10.2 โปรแกรมใช strcpy, strcat, strcmp, strcmpi, strlen, tolower และ toupper ....................................................... 142
โปรแกรม 10.3 โปรแกรมแสดง kmitl ในกรอบสเหลยม .................................................................................................................. 144
โปรแกรม 10.4 โปรแกรมคานวณ degree radian ................................................................................................................................... 146
โปรแกรม 10.5 โปรแกรมแสดง pass by value และ pass by reference ......................................................................................... 148
โปรแกรม 10.6 โปรแกรมใช pass by value .............................................................................................................................................. 149
โปรแกรม 10.7 โปรแกรมใช pass by reference....................................................................................................................................... 149
โปรแกรม 10.8 โปรแกรมรจก global variable ........................................................................................................................................ 149
โปรแกรม 11.1 โปรแกรมเปด text file ...................................................................................................................................................... 158
โปรแกรม 11.2 โปรแกรมเปดและปด text file ...................................................................................................................................... 158
โปรแกรม 11.3 โปรแกรมอานขอมลจาก text file (string หนงตว) ................................................................................................. 159
©2011 CE-KMITL v0.1
14
โปรแกรม 11.4 โปรแกรมอานขอมลจาก text file (string หลายตว) .............................................................................................. 159
โปรแกรม 11.5 โปรแกรมอานขอมลจาก text file (character) .......................................................................................................... 160
โปรแกรม 11.6 โปรแกรมอานขอมลจาก text file (string กบ int) ................................................................................................... 160
โปรแกรม 11.7 โปรแกรมรบชออาย 3 คน เกบลงไฟล .................................................................................................................... 161
โปรแกรม 11.8 โปรแกรมเกบขอมลจาก struct ลงไฟล .................................................................................................................... 162
โปรแกรม 11.9 โปรแกรมอานขอมลจากไฟลเกบลง struct ............................................................................................................ 162
โปรแกรม 11.10 โปรแกรมอานขอมลจากไฟลเกบลง struct ใช fseek ........................................................................................ 163
©2011 CE-KMITL v0.1
15
บทท 0 แนะนาวชา
วชาคอมพวเตอรและการโปรแกรม (Computer & Programming) มอาจารยสอนทงหมดสบสามทานดงน อ. ประสาร ตงตสานนท อ. คณฐ ตงตสานนท อ. บณฑต พสยา อ. วบลย พรอมพานชย อ. ธนญชย ตรภาค อ. เกยรตณรงค ทองประเสรฐ อ. วจนพงศ เกษมศร รศ.ดร.บญธร เครอตราช รศ.กฤตวน ศรบรณ ผศ.มยร เลศเวชกล รศ.ทรงชย วระทวมาศ อ.สธรรม สทธรรมสกล อ. สภกจ นตยะสกล (ประสานงานวชา) หอง ECC901, [email protected]
วตถประสงคของวชา 1. เขาใจองคประกอบ และการทางานของระบบคอมพวเตอร 2. รจกโครงสรางภาษา และคาสงตางๆ ของภาษาซ เพอใหสามารถนามาเขยนเปนโปรแกรมคอมพวเตอรได 3. สามารถเขยนโปรแกรมสงใหคอมพวเตอรทางานตามทกาหนดได 4. สามารถประมวลผลลพธของโปรแกรมตามคาสงทกาหนดใหได 5. สามารถหาขอผดพลาด และแกไขโปรแกรมทกาหนดใหถกตอง
การวดผล การวดผลแบบองเกณฑ โดย ปการศกษา 2554 นคะแนนและการวดผลเปนดงน
ภาคปฏบต (Laboratory) เขาหองปฏบต 10% (เชคชอเขาหอง + เชคโปรแกรม) ภาคทฤษฎ (Lecture) หองเรยน 10% (เชคชอ หรอ สอบยอยในหอง หรอ กจกรรมในชนเรยน) สอบกลางภาค 30% สอบปลายภาค 50% คะแนนเขาหองปฏบตคดเปน 10% เทานน
ระเบยบการใชหองปฏบตการ 1. แตงกายใหเรยบรอยถกระเบยบสถาบนฯ 2. ไมนาอาหารเครองดมเขาหองปฏบตการ 3. เตรยมเอกสารประกอบการทดลองพรอมทงทาความเขาใจกอนเขาหอง 4. ใหนกศกษาทาการทดลองตามเอกสารดวยตนเอง หากไมเขาใจใหถามอาจารย และผชวยสอนประจาหอง 5. ในกรณการลาปวยตองมใบรบรองแพทย แนบพรอมใบลา กรณลากจอนญาตเฉพาะการทากจกรรมในฐานะตวแทน
สถาบนเทานน การลาปวย และลากจ ตองแจงอาจารยผประสานงานวชาฯ เทานน ลาปวยตองสงเอกสารภายใน 7 วน (นบตงแตวนลา) สวนลากจตองสงเอกสารลวงหนา 7 วน
6. การคดคะแนนในการเขาหองปฏบตการ 1 ครงประกอบดวย 1) คะแนนเขาหองปฏบตการ 0.5 คะแนน โดยนกศกษาเขาหองปฏบตการไมเกนเวลา 15 นาท ถาเขาหลงจาก 15 นาท จะไมไดคะแนนน 2)คะแนนการสงโปรแกรมในหองปฏบตการ 0.5 คะแนน นกศกษาจะไดคะแนนนจากการสงโปรแกรมใหเจาหนาทดแล
©2011 CE-KMITL v0.1
16
หองปฏบตการตรวจ ภายในเวลาชวโมงทาปฏบตครงตอครง โดยโจทยจะมาจากเอกสารการทดลอง ทเจาหนาทจะกาหนดใหนกศกษาทาภายในแตละหอง ครงละไมตากวา 1 ขอ
©2011 C
วตถประส1. 2. 3.
1. ความ
1.1 คอม
การจา กาจะตองเปนภาษาระดเหนวา Ma
M
1.2 ขนต
คอมพวเต
1.3 องค
1.
2.
สวนประก• • • •
CE-KMITL v0.1
สงคการศกษา เขาใจองคประกเขาใจขนตอนกรจกโปรแกรม V
มเปนมาขอ
มพวเตอรคอ
เปนอปกรณอเลารคานวณ การเนคาสงทเครองคบตาสด (Low-achine langua
Machine lang
ตอนการทาง
อรประกอบดวย
คประกอบหล
ฮารดแวร (Harกลไกล ทงหมดซอฟทแวร (Soตองการ เชน ก
กอบของฮารดแวหนวยประมวลหนวยความจา หนวยนาเขาขอหนวยสงออกขอ
1
บท
กอบ และการทการเขยนโปรแกVisual C++ 20
งคอมพวเต
ออะไร
ลกทรอนกสอยาเปรยบเทยบตดสคอมพวเตอรเขาlevel languagage อยใกล Ha
uage อยในรป
งานของคอม
ยสวนหลกๆสสว
ลกของคอม
rdware) หมายถดทประกอบกนเoftware) หมายการคานวณ การ
วร ผลกลาง (Cent (Memory) เชนอมล (Input Daอมล (Output
ทท 1 พนฐา
างานของระบบรมภาษาซเบอง008 Express E
อร
างหนง ทมนษยสนใจ เปนตน กาใจ คาสงเหลานge) มลกษณะอardware มากท
เลขฐานสอง
มพวเตอร
วนคอ input d
พวเตอร
ถง สวนประกอเปนเครองคอมพถง สวนทเปนชรบนทกผล การ
tral Processinน SDRAM 128ata) เชน คยบอ Data) เชน จอภ
Input Device
คยบอรด
17
านเกยวกบ
บคอมพวเตอร งตน Edition
ยประดษฐขน เพการทจะสงใหเคนมหลายคาสงเรยในรปเลขฐานส
ทสด
evice, output
บทางอเลกทรอพวเตอร ชดคาสง หรอโปแสดงผล ฯลฯ
g Unit) เชน 808 MB, ROM BIOรด เมาท กลองภาพ เครองพมพ
CPU
วงจรบวกเลข
Memory
รบคาตวเลขคาท 1จากคยบ
รบคาตวเลขคาท 2 จากคยบ
บวกคาตวเลข คาท 1กบ คา
พมพคาทไดออกทางจอภ
บคอมพวเต
พอนามาเสรมควครองคอมพวเตอรยกรวมวา ภาษสอง ประกอบด
t device, proc
อนกส และแมค
รแกรมทสงใหอ
0486 CeleronOS ฮารดดสก ซง พ เครองฉายภา
Output Deviceจอภาพ
บอรด
บอรด
าท 2
าพ
ตอร
วามสามารถขออรทางาน จาเปนษาเครอง (Macดวยตวเลข 0 กบ
cessor หรอ CP
คานคส (Mech
อปกรณฮารดแว
n Pentium Ath ซดรอม
าพ ลาโพง
งมนษยในดานกนตองปอนคาสงhine Languagบ 1จากรปดานล
PU และ mem
hanical) หรอสว
วรรวมกนทางาน
hon Duron
การรบร ง และge) เปนลาง จะ
mory
วนทเปน
นตามท
©2011 CE-KMITL v0.1
18
สวนประกอบของซอฟตแวร เปนชดคาสงทควบคมการทางานของคอมพวเตอร โดยชดคาสงเหลานเรยกไดอกอยางวาโปรแกรมคอมพวเตอร
1) ซอฟตแวรระบบ (Operating system: OS หรอ System software) ไดแก DOS (Disk Operating System) ป 1981-1995 เปนระบบปฏบตการในยค80 ใชการสงงานผานคาสง command line เชนตองการตรวจจานวนไฟลในแผนดสก ใชคาสง dir
Windows ป1985-ปจจบน เปนระบบ GUI (Graphic User Interface) ภาษาทใชในการสรางคอ C/C++ และ Assembly language
OS2 (Operating System /2) ป1987-2001 เปนระบบปฏบตการทพฒนาโดย Microsoft และ IBM ในชวงแรก และตอมา IBM เปนผพฒนาตอ ภาษาทใชในการสรางคอ C/C++
Unix ป1969-ปจจบน ภาษาทใชในการสรางคอ C
2) ซอฟตแวรประยกต (Application software)
2.1) ซอฟตแวรสาเรจรป (Commercial applications) คอ Microsoft Offices, โปรแกรมสอสารขอมล 2.2) ซอฟตแวรใชงานเฉพาะ (Particular applications) คอโปรแกรมคานวณเกรด, โปรแกรมยมคนหนงสอ, โปรแกรมคานวณดอกเบย, โปรแกรมรานเชาหนงสอ โปแกรมด DVD, โปรแกรมฟงเพลง
©2011 CE-KMITL v0.1
19
ซอฟทแวร หรอโปรแกรมตางๆ ททางานโดยคอมพวเตอรจะใชชดคาสงภาษาเครองในการทางาน แตภาษาเครองเปนภาษาทมนษยยากทจะจาและเขาใจการทางาน จงมการคดภาษาตางๆ ทใกลเคยงกบภาษาของมนษยขนมาเพอใหมนษยใชงานในการเขยนสรางโปรแกรมอนๆ
1.4 ภาษาคอมพวเตอร
ภาษาคอมพวเตอรแบงออกเปน 1) ภาษาเครอง (Machine Language) เปนภาษาระดบตาสด (Low-level language) อยในรปเลขฐานสอง (Binary
number) ประกอบดวยเลข 0 กบ 1 ภาษาเครองสามารถสงใหคอมพวเตอรทางานไดทนท อยางไรกตามขอเสยของภาษาเครองคอลกษณะทเปนเลขฐานสอง ทาใหโปรแกรมเมอรพฒนาโปรแกรมไดยาก
2) ภาษา Assembly เปนกงภาษาเครองเขยนเปนคาสง Neumonic สามารถแปลงเปนภาษาเครองไดงาย โดยการเทยบตาราง หรอใช Assembler
3) ภาษาขนสง เปนภาษาทใกลเคยงกบภาษาของมนษย (ประโยคขอความสวนใหญเปนภาษาองกฤษ) เชน ภาษา C, PASCAL, FORTRAN ซงมนษยสามารถเขยนไดงายแตตองมกระบวนการแปลงเปนภาษาเครองกอนโดยผานโปรแกรม Compiler
ตวอยางดานซายมอ ภาษา Assembly ของ AT&T และภาษาเครอง แปลงในรป object code ภาษา assembly คาสง addcc บวกเลข เมอแปลงเปนภาษาเครองจะไดเลข 10000010 10000....1000010 เปนตน
1.5 ระบบจานวนและตวเลข
ระบบจานวนและตวเลข เปนระบบตวเลขทมนษยทกคนเคย ทเหนไดชดเจนทสดคอการนบจานวนสงของตางๆ ซงพบวาระบบจานวนสวนใหญทใชกนจะมเลข 0 – 9 แตยงมระบบจานวนชนดอนอกแบบ เชน ในเลขโรมน ระบบคอมพวเตอรหรอภาษาคอมพวเตอรจะใชเลขเพยง 2 ตว คอ 0 และ 1 ซงไมเหมอนกบทมนษยใชกนปกต เราเรยกระบบจานวนทมจานวนตวเลขทใชงานตางกนวาระบบเลขฐาน เชน ระบบตวเลขฐานสบ ระบบตวเลขฐานสอง เปนตน ระบบเลขฐาน ฐานสบ ประกอบดวย ตวเลข 0-9 (525)10 = 5x102 + 2x101 + 5x100 ฐานสอง ประกอบดวย ตวเลข 0 กบ 1 (101)2 = 1x22 + 0x21 + 1x20 ฐานสบหก ประกอบดวยตวเลข 0-9 และ A-F (โดยแทน 10 = A, 11= B, 12 = C, 13 = D, 14 = E และ 15 = F) (3B2)16 = 3x162 + 11x161 + 2x160 เปรยบเทยบฐานสบกบฐานสอง ระบบเลขฐานสบ 10n 10n-1 …….. 102 101 100 ระบบเลขฐานสอง
©2011 CE-KMITL v0.1
20
MSB LSB 2n 2n-1 …….. 22 21 20 MSB ยอมาจาก Most Significant bit บตทมนยสาคญสง สวน LSB ยอมาจาก Least significant bit บตทมนยสาคญตา การแปลงเลขฐานสองเปนฐานสบ ตวอยาง จงแปลง 10001112 ไปเปนเลขฐานสบ 1 0 0 0 1 1 1 × × × × × × × 26 25 24 23 22 21 20 64 32 16 8 4 2 1 คานวณได (1×64)+(0×32)+(0×16)+(0×8) + (1×4) + (1×2) + (1 ×1) = 64+0+0+0+4+2+1 = 71 การแปลงเลขฐานสบเปนฐานสอง จงแปลง 45 ฐานสบ ใหเปนฐานสอง
การแปลงเลบฐานสบเปนฐานสบหก จงแปลง 946 ฐานสบ ใหเปนฐานสบหก
การแปลงตวเลขฐานสองเปนฐานสบหก
©2011 CE-KMITL v0.1
21
ตวอยาง แปลงเลขจาก 12EC16 ฐาน 16 เปน ฐานสองจะได 12EC = 0001-0010-1110-1100 แปลงเลขจาก 1011100111000111100112 เปนเลขฐาน 16 จะได 0001-0111-0011-1000-1111-0011 = 1738F316
1.6 ขนาดตวเลขในระบบคอมพวเตอร
บท (bit) คอตวเลขฐานสอง (binary) เพยงตวเดยว ไบท (Byte) คอ ตวเลขขนาด 8 บท เวรด (Word) คอ ตวเลขขนาด 16 บท หรอ 2 ไบท กโลไบท (KB) คอ ตวเลขขนาด 210 = 1024 ไบท เมกะไบท (MB) คอ ตวเลขขนาด 210 210 ไบท
จกกะไบท (GB) คอ ตวเลขขนาด 210 210 210 ไบท ขนาดหนวยความจาของเครองคอมพวเตอร หนวยความจา 128 MB หมายความวาสามารถเกบขอมลได 128 210 210 = 134217728 ตาแหนง
ตวเลขทใชงานคอมพวเตอร ตวเลขจานวนเตมทมเฉพาะคาบวก ขนาด 8 bit เรยกวา 1 Byte มคาเรมจาก 0 ถง 255
ตวอยาง มขอมล 8 bit มคา 11001110 คานวณแลวมคาเทาใด 110011102 = 128+64+8+4+2 = 20610 ขนาด 16 bit เรยกวา 1 Word (2 Byte) มคาเรมจาก 0 ถง 65,536
ตวอยาง มขอมล 16 bit มคา 1100-1110-1100-1110 คานวณแลวมคาเทาใด
©2011 CE-KMITL v0.1
22
1100-1110-1100-11102 = 5294210 จานวนเตม ทมทงคาบวกและคาลบ ขนาด 8 bit มคาเรมจาก -128 ถง 127 (2's Complement)
บตแรกสด เปน sign bit (1 เปนคาลบ, 0 เปนคาบวก) ขนาด 16 bit เรยกวา integer มคาเรมจาก -32,768 ถง 32,767 ขนาด 32 bit เรยกวา long integer มคาเรมจาก -2,147,483,648 ถง 2,147,483,647 ตวอยาง การแปลงเลขจาก –5ฐาน 10 เปน 8 Bit 2’Complement ทาไดโดย 1) เขยน เลข 5 ในรปฐานสองปกต ได 0000-0101 2) ทาการกลบบตจาก 0 เปน 1 และ 1 เปน 0 เรยกวา 1’s Complement จะได
0000-0101 กลบบตเปน 1111-1010 3) นาผลจาก 1’s Complement แปลงเปน 2’s Complement โดยการบวก 1 จะได 1111-1010 + 1 = 1111-1011 เปนคาตอบ จานวนทศนยม ขนาด 4 Byte เรยกวา float มคาเรมจาก 3.4 10-38 ถง 3.4 1038
ขนาด 8 Byte เรยกวา double มคาเรมจาก 1.7 10-308 ถง1.7 10308
ขนาด 10 Byte เรยกวา long double มคาเรมจาก 3.4 10-4932 ถง 3.4 104932
1.7 ตวอกษรทใชในคอมพวเตอร
ขอมลทเปนตวอกษรและสญลกษณ จะใชรหสแอสก (American National Standard Code for Information Interchange หรอยอวา ASCII) ขนาด 8 บต ซงเปนรหสมาตรฐาน ถกกาหนดโดยสถาบนมาตรฐานแหงชาตของสหรฐอเมรกา (American National Standard Institute หรอยอวา ANSI) เชน ตวอกษร A มคาเทากบ 6510 หรอ 4116 ตวอกษร B มคาเทากบ 6610 หรอ 4216 ตวอกษร a มคาเทากบ 9710 หรอ 6116 ตวอกษร 7 มคาเทากบ 5510 หรอ 3716 ตาราง ASCII
©2011 CE-KMITL v0.1
23
ขอสงเกตในการเกบคาลงหนวยความจา 7 ทเปนคาตวเลขจะเกบลงในหนวยความจาของคอมพวเตอรดงน กรณเกบเปนชนด 1 byte
กรณเกบเปนชนด Integer (2 byte)
7 ทเปนอกขระจะเกบลงในหนวยความจาของคอมพวเตอรดงน
ลกษณะการใชงานตวอกษรในภาษาซ ตวอกษร 1 ตว เรยกวาอกขระ (Character) เชน O การใชงานในภาษาซ 'O' z การใชงานในภาษาซ 'z' ตวอกษรเปนชด เรยกวาขอความ (string) เชน Com การใชงานในภาษาซ "Com" kmitl การใชงานในภาษาซ "kmitl"
1.8 รจกภาษาซ
ภาษา BCPL (Basic Combined Programming Language) ป 1966 มารตน รชารด (Martin Richards) ภาษา B เคน ทอมพสน (Ken Thompson) 1970 ภาษา C เดนนส รทช (Dennis Ritchie) 1972 ท Bell Labs เผยแพร 1978 เคอรนกเฮน (Kernighan) เดนนส รทช (Dennis Ritchie) จดเดนของภาษาซ
• เปนภาษาโครงสราง • เปนภาษาระดบสง • ไมขนอยกบระบบปฏบตการ • ไมขนอยกบชนดของเครองคอมพวเตอร
วธการแปลภาษาขนสงใหเปนภาษาเครอง
• อนเตอรพลเตอร (Interpreter) แปลครงละคาสงแลวสงใหเครองทางานจากนนจงแปลงคาสงถดไป เชน java, perl, python, shell script, vb script
• คอมไพลเลอร (Compiler) แปลคาสงทงหมดแลวสงใหเครองทางานเชน C, C++, Pascal ขนตอนการเขยนโปรแกรมภาษาซ
เรมตนดวย การสรางไฟลภาษา C นามสกล *.cpp หรอ *.c แลวจงคอมไพลเปนภาษาเครอง ไดเปนไฟล *.exe ตอจากนนจงรนโปรแกรม
©2011 CE-KMITL v0.1
24
การทดลองท 1 การพฒนาโปรแกรมภาษาซเบองตน
วตถประสงค 1. สามารถเขาใจขนตอนการพฒนาโปรแกรมเบองตน 2. สามารถใชคอมไพเลอร Visual C++ 2008 Express Edition เบองตน 3. สามารถเขยนโปรแกรมภาษา C อยางงาย 4. สามารถเขาใจการทางานของคาสง printf เบองตน 5. สามารถตรวจสอบหาทผดและแกไขโปรแกรมเบองตน การทดลอง 1. ทดลองใชคอมไพเลอร Visual C++ 2008 Express Edition เบองตน 2. ทดลองเขยนและรนโปรแกรมภาษา C อยางงาย 3. ทดลองหาทผดและแกไขโปรแกรมภาษา C 4. ทดลองกาหนดรปแบบการพมพดวย \n และ \t ของคาสง printf
ทฤษฎ การเขยนโปรแกรมคอการเขยนชดคาสง เพอใหคอมพวเตอรปฏบตงานตามความตองการของผใชงาน การเขยนชดคาสงทาไดโดยการใชภาษาคอมพวเตอร ซงมมากมายหลายภาษา อาท PHP, Visual Basic, C , JAVA ฯลฯ การทจะเลอกใชภาษาใดภาษาหนงนน จะตองพจารณาถงความสอดคลองกนระหวางงานทจะสรางและภาษาคอมพวเตอร กลาวคอภาษาทใชตองเหมาะสมกบงานทตองการ เชนหากตองการเขยนโปรแกรมททางานบน WWW ภาษาทเหมาะสมกคอ PHP หรอ JAVA เปนตน วชาคอมพวเตอรและการเขยนโปรแกรมนใชภาษาซในการเขยนชดคาสง ซงภาษาซมขอดหลายประการ อาทเชน เปนภาษาทไมขนกบฮารดแวร สามารถนาไปใชไดกบคอมพวเตอรสวนใหญซงมระบบปฏบตการท แตกตางกน เปนภาษาทมโครงสราง สามารถทาความเขาใจไดไมยากนก และเปนทนยมสาหรบนกเขยนโปรแกรมทวไป ดงนนหากนกศกษาสามารถเขยนโปรแกรมดวยภาษาซได นกศกษากสามารถนาความรนไปใชใหเปนประโยชนได
ขนตอนการพฒนาโปรแกรม โปรแกรมคอมพวเตอรถกเขยนขนมาดวยวตถประสงค คอ นาไปใชแกปญหา ซงในปจจบนโปรแกรมไดถกนาไปใชแกปญหาใหกบวงการตางๆ มากมาย ขนตอนในการเขยนโปรแกรมกจะคลายกบขนตอนในการแกไขปญหานนเอง คอ เมอเราตองการแกไขปญหากจะมขนตอนหลกๆ ดงน
1) กาหนดขอบเขตของปญหา 2) วางแผนหาวธการแกไขปญหา 3) ดาเนนการตามแผน 4) ทดสอบและประเมนผลวาปญหาไดถกแกหรอไม
การเขยนโปรแกรม จะมขนตอนหลกๆดงน
1) กาหนดวตถประสงคของโปรแกรม 2) หาวธการทโปรแกรมจะใชในการแกโจทยดวยการเขยนเปนแผนภาพ (Flowchart) หรอรหสเทยม(Pseudo code) 3) เปลยนรหสเทยมหรอแผนภาพใหอยในรปแบบของคาสงคอมพวเตอรโดยใชภาษาคอมพวเตอร เชน C 4) ทดลองรนโปรแกรมและตรวจดผลลพธ
ขนตอนในการพฒนาโปรแกรมเบองตนทโปรแกรมมขนาดและจานวนบรรทดของคาสงไมมากนก จะมขนตอนในการพฒนาโปรแกรมดงน
©2011 CE-KMITL v0.1
25
1) ใชโปรแกรม Editor ในการเขยนโปรแกรมตนฉบบ 2) ใชโปรแกรม Compiler ในการแปลภาษาตนฉบบ 3) ใชโปรแกรม Linker ในการรวมไฟลหรอฟงกชนตางๆ ทจาเปนเพอสรางเปนโปรแกรมทสามารถ ทางานไดหรอรนได
นนเอง 4) สงใหโปรแกรมทางาน ในกรณทไมมขอผดพลาดเรากจะไดโปรแกรมทตองการ 5) ในกรณมขอผดพลาดกจะตองทาการแกไขโปรแกรม โดยอาจจะใชโปรแกรม Debugger เขาชวย 6) หลงจากนนกนาโปรแกรมไปใชงานหรอเผยแพรตอไป
ดงนนจะเหนไดวาในการพฒนาโปรแกรมจะตองอาศยโปรแกรมอกหลายโปรแกรมเขามาชวยในการทางาน ซงใน ปจจบนนเพอใหผพฒนาโปรแกรมทางานไดงายขน บรษทผผลตซอฟตแวรกจะรวมเอาโปรแกรมตางๆเหลานไวใน โปรแกรมหลกโปรแกรมเดยว ซงเรามกจะเรยกโปรแกรมหลกนวาเปน โปรแกรมรวมพฒนา หรอ โปรแกรม IDE (Integrated Development Environment) สาหรบซอฟตแวร Visual C++ 2008 Express Edition กถอวาเปนโปรแกรม ประเภท IDE ตวหนงซงผลตโดยบรษท Microsoft และไดเผยแพรใหใชฟรไดภายใตเงอนไขทกาหนด
การทดลองท 1.1 ทดลองใชคอมไพเลอร Visual C++ 2008 Express Edition เบองตน 1 เปดโปรแกรม Visual C++ 2008 โดยการ Double Click ทไอคอนของโปรแกรม Visual C++ หรอ กด Start -> All Program -> Visual C++ Express Edition -> Microsoft Visual C++ 2008 Express Edition
©2011 CE-KMITL v0.1
26
2 สรางโปรเจคเพอสาหรบเกบโปรแกรมทจะเขยนขนในภายหลง ในแตละโปรเจคอาจจะมไดหลาย โปรแกรม ทเมนบารของ Visual C++ ใหกด File -> New -> Project
3 เลอกประเภทของโปรแกรมทจะทาการสราง ในการทดลองนจะสรางโปรแกรมทจะรนบนหนาตางคอนโซล คอ ขอมลทเปนเอาทพทและอนพทจะปรากฏอยทหนาตางน (หนาตางทเปนสดา) ทหนาจอNew Project ใหเลอก Win32 -> Win32 Console Application ท Name ใหตงชอโปรเจควา HelloWorld
©2011 CE-KMITL v0.1
27
4 เลอกตาแหนงทจะเกบโปรเจค ในการทดลองนใหเกบโปรเจคไวทไดรว D: โดยทชอโฟลเดอรใหใช รหสนกศกษา โดยการกด Browse -> เลอกไดรว D: -> Make New Folder -> ตงชอโดยใชรหส นศ. ->OK -> Next 5 กาหนดรปแบบของโปรแกรมทจะทาการสราง ทหนาจอ Win32 Application Wizard ใหเลอก Console Application -> Empty Project -> Finish
6 ทาการสรางโปรแกรมใหม ภายใตโปรเจคทไดสรางไวแลว ท Solution Explorer ใหคลกขวาท Source File -> Add -> New Item
©2011 CE-KMITL v0.1
28
7 กาหนดรปแบบของโปรแกรมทจะทาการสราง ในการทดลองนใหเลอก C++ File ทชอง Name ใหตงชอโปรแกรม HelloWorld แลวกด Add
8 เขยนโปรแกรมตามตวอยางตอไปน
#include <stdio.h> int main() { printf(“Hello, world!\n”); return 0; }
©2011 CE-KMITL v0.1
29
9 สงรนโปรแกรม ทเมนบารเลอก Debug -> Start Without Debugging หรอ Ctrl+F5 (ใหกดปม Ctrl และ F5 พรอมๆกน) หลงจากนนใหยนยนการสรางโปรแกรมโดยการกดปม Yes หากไมตองการใหหนาจอน ปรากฏบอยๆ ใหเลอก Do not show this dialog again
10 ในกรณทโปรแกรมมทผด จะมขอความบอกอยดานลางวาผดทไหน กตาแหนง และทหนาจอจะ ขนมาถามวาจะใหนาเอาโปรแกรมเกาทเขยนถกไวแลวมารนหรอไม ถาไมตองการใหเลอก No หลงจาก นนกทาการตรวจสอบวาโปรแกรมเขยนผดทไหน ใหทาการแกไข แลวรนโปรแกรมใหม
©2011 CE-KMITL v0.1
30
การทดลองท 1.2
ทดลองเขยนและรนโปรแกรมภาษา C อยางงาย 1 ใหนกศกษาสรางโปรเจคใหมชอ Lab01 โดยใหเกบไวทไดรว D: และสรางโปรแกรมใหมชอ Lab01_1.c แลวปอนโปรแกรมตามตวอยางดานลางนใน Editor Screen #include <stdio.h> int main() { printf(”Hello”); printf(”Ladkrabang”); return 0; }
2 ใหคอมไพลโปรแกรมดงกลาว โดยใช Ctrl+F5 แลวตรวจสอบดผลลพธ 3 ใหทาการแกไขโปรแกรมตามตวอยางดานลาง #include <stdio.h> int main() { printf(”Hello\n”); printf(”Ladkrabang”); return 0; }
ผลลพธของโปรแกรมตางจากโปรแกรมในขอท 2.1 อยางไร บนทก____________________________________________________________________________________ การทจะแสดงผลใหอยตางบรรทดกนตองทาอยางไร _________________________________________________________________________________________
©2011 CE-KMITL v0.1
31
4 ใหเปลยนโปรแกรมในขอ 2.3 โดยแทนท \n ดวย \t แลว Run โปรแกรมอกครง \t ทาใหผลลพธเปลยนแปลงอยางไร _________________________________________________________________________________________
การทดลองท 1.3
ทดลองหาทผดและแกไขโปรแกรมเบองตน ใหนกศกษาสรางโปรแกรมใหมภายใตโปรเจคเดม ดงตอไปน 1 ท Solution Explorer ทไฟลเดมชอ Lab01_1 ใหคลกขวาแลวเลอก Remove 2 ท Solution Explorer -> Source File -> คลกขวาเลอก New Item -> เลอก C++ File -> โดยใชชอ ไฟลวา Lab01_2.c แลวปอนโปรแกรมตามตวอยางดานลาง #include <stdio.h> int main() { prntf(”Bangkok”); printf(”Thailand”); return 0; }
3 ใหคอมไพลโปรแกรมดงกลาว โดยใชเมน Project->Compile โปรแกรมมขอผดพลาดหรอไม ________________ ถาในมขอผดพลาด เกดขอผดพลาดในบรรทดใด (เขยน Code ทงบรรทด) _________________________________________________________________________________________ ถามขอผดพลาด ผดพลาดเพราะอะไร _________________________________________________________________________________________ ถามขอผดพลาด จะ แกไขอยางไร _________________________________________________________________________________________ ถามขอผดพลาด แกไขแลวบรรทดทแกไขม Code อยางไรบาง (เขยน Code ทงบรรทด) _________________________________________________________________________________________ 4 สง Run โปรแกรม ผลลพธทแสดงหลงโปรแกรมทางานคอ _________________________________________________________________________________________
การทดลองท 1.4
ทดลองกาหนดรปแบบการพมพดวย \n และ \t ของคาสง printf ใหนกศกษาเขยนโปรแกรมแสดงขอมลของตวนกศกษาเอง ซงประกอบดวย รหสนกศกษา,เบอรโทรศพท,ชอ-นามสกล และจงหวดทอย โดยมรปแบบการแสดงผลดงตวอยาง เกบไวภายใตโปรเจคเดม คอ Lab01 ชอโปรแกรม Lab01_4 ID : 50015541 phone : 0815555555 Name : Somsak Jaidee province : Bangkok บนทกโคดของโปรแกรมทนศ.เขยน
©2011 CE-KMITL v0.1
32
©2011 CE-KMITL v0.1
33
บทท 2 การเขยนโปรแกรม คาสงแสดงผล
วตถประสงคการศกษา 1) สามารถเขยนโปรแกรมภาษาซอยางงาย ๆ ได 2) สามารถแสดงขอความออกทางจอภาพได 3) สามารถแสดงขอมลชนดตางๆ ออกทางจอภาพได 4) สามารถกาหนดรปแบบการแสดงขอมลออกทางจอภาพได
2.1 โครงสรางภาษาซ
สวนหวโปรแกรม (Header Program)
• พรโปรเซสเซอรไดเรคทฟ (Preprocessor Directive) #include #define
• ฟงกชนโพรโทรไทพ (Function Prototype Declaration) • ตวแปรชนดโกบอล (Global Variable Declaration)
สวนตวโปรแกรม (Body Program) • ฟงกชนหลก (Main Function)
ตวแปรชนดโลคอล (Local Variable Declaration) คาสง (Statement)
• ฟงกชนอน ๆ (Functions) คาอธบายโปรแกรม (Comment Program)
2.2 ฟรโปรเซสเซอรไดเรคทฟ (Preprocessor directive) สวนประมวลผลกอน เปนสวนทสงใหคอมไพเลอรเตรยมการทางานทกาหนดไว กอนทจะทางานในฟงกชนหลก #include <file-name.h> ใหโปรแกรมดงคาสงจาก file-name.h ใน Include Directory #include “file-name.h” ใหโปรแกรมดงคาสงจาก file-name.h ใน Current Directory file-name คอชอไฟลนามสกล h ตวอยางคาสงฟรโปรเซสเซอรไดเรคทฟ #include<stdio.h> ทาการเรยกไฟล stdio.h เพอทาใหสามารถใชคาสงทวไปได
©2011 CE-KMITL v0.1
34
#include<conio.h> ทาการเรยกไฟล conio.h เพอทาใหสามารถใชคาสงจดการหนาจอ และคาสงรบและแสดงผลเพมเตม #include<math.h> ทาการเรยกไฟล math.h เพอทาใหสามารถใชคาสงเกยวกบคณตศาสตรได #include<string.h> ทาการเรยกไฟล string.h เพอทาใหสามารถใชคาสงจดการเกยวกบขอความได
ฟงกชนหลก ฟงกชนหลกเปนฟงกชนทโปรแกรมภาษาซตองมอยเสมอ เพราะคอมไพเลอรของภาษาซจะเรมตนการทางานจากฟงกชนหลก ตวอยางการเขยนฟงกชนหลกทไมมการทางานใดๆ int main(void) { return(0); }
int main() { return 0; }
กฎเกณฑการใชคาสงในภาษาซ
• ใชเครองหมาย semi colon ; เปนจดสนสดคาสง • ใชอกษรตวเลกสาหรบเรยกใชคาสง (statement) • ใชเครองหมาย comma , สาหรบคนตวแปร และพารามเตอร • หากคาสงใดมคาสงสวนยอยภายในหลาย ๆ คาสง ใหใชเครองหมายปกกา { } สาหรบกาหนดขอบเขต
2.3 การแสดงผลดวยคาสง printf การเขยนโปรแกรมจาเปนตองมการแสดงผล เพอใหผใชงานทราบวาโปรแกรมสามารถทางานอะไร จาเปนตองปอนคาอะไรบาง และเมอโปรแกรมทางานเสรจ ผลลพธทไดเปนอยางไร คาสงทใชสาหรบการแสดงผลในภาษาซมหลายคาสง แตทสามารถใชงานไดครอบคลมและนยมใชกน คอ คาสง printf รปแบบคาสง
printf (format-string, data-list);
• format-string คอรปแบบของขอความซงจะประกอบดวย ขอความธรรมดา, คารหส ASCII และ สวนแสดงชนดขอมล โดย format-string จะอยในเครองหมาย Double quote " "
• data-list คอชอขอมล หรอตวแปรทจะทาการแสดงผลตามสวนแสดงชนดขอมลใน format-string คาสง printf ตองเรยกใช Preprocessor Directive #include<stdio.h>
โปรแกรม 2.1 การใชงานคาสง printf
#include <stdio.h> // เรยกวา preprocessing directive ใชฟงกชนใน stdio.h int main() //ประกาศฟงกชน main { //เรมตนฟงกชน printf ("Hello World!"); //ฟงกชน printf return 0; //สงคา 0 ออกจากฟงกชน main } //สนสดฟงกชน รปแบบของขอความในคาสง printf ขอความธรรมดา เปนสวนทแสดงตวอกษร ตวเลขออกโดยตรง คารหส ASCII เปนสวนทควบคมรปแบบการแสดงผล เชน การจดยอหนา การขนตนบรรทดใหม เปนตน สวนแสดงชนดขอมล เปนการกาหนดรปแบบของชนดขอมลทจะแสดงผลขอมล หรอตวแปร
• สวนแสดงชนดขอมลแบบปกต
©2011 CE-KMITL v0.1
35
• สวนแสดงชนดขอมลทกาหนดรปแบบการแสดงผล การแสดงขอความธรรมดาเปนการใชคาสง printf ใหแสดงขอความทตองการออกทางจอภาพ โดยจะอยในสวนของ format-string ในคาสง (อยในเครองหมาย Double quote " ") printf (format-string, data-list); เชน คาสงในตวอยางโปรแกรมทผานมา printf ("Hello World!"); จะทาการแสดงขอความ Hello World! ออกทางจอภาพหลงจากสง Run โปรแกรม
โปรแกรม 2.2 การใชงานคาสง printf หลายๆคาสง #include<stdio.h> #include<conio.h> int main() { printf ("Hello World!"); printf ("This is my first Program."); printf ("I am a programmer."); return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ Hello World!This is my first Program.I am a programmer
สญลกษณพเศษควบคมการแสดงผล อกขระพเศษทใชงานในภาษาซ ซงใชควบคมการแสดงผลในคาสง printf ในสวนของ format-string
โปรแกรม 2.3 การใชงานคาสง printf มสญลกษณพเศษควบคมการแสดงผล #include<stdio.h> int main() { printf ("Hello World!\n"); printf ("This is my first Program."); printf ("\n\tI\'m a programmer."); return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ Hello World! This is my first Program. I’m a programmer
สวนแสดงชนดขอมล การเขยนโปรแกรมทมการประยกตขน เชนโปรแกรมคานวณเลข จะตองมการแสดงผลลพธของคาททาการคานวณ ซงคาสง printf สามารถแสดงผลคาตวแปรได แตจะตองเขยนโปรแกรมใหมความสมพนธกนในสวนของ format-string และ data-list
• โดยทใน format-string จะมสวนแสดงชนดขอมล • และใน data-list จะมขอมล หรอตวแปรทจะแสดงผล
©2011 CE-KMITL v0.1
36
โปรแกรม 2.4 printf มสญลกษณพเศษควบคมการแสดงผล #include<stdio.h> int main() { printf ("My name is : %s\n","Kmitl"); printf ("My point : %d\n",10+40+49); printf ("Grade : %c\n",'A'); printf ("GPA : %f",3.99); return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ My name is : Kmitl My point : 99 Grade : A GPA : 3.990000
การกาหนดรายชอตวแปรในคาสง printf
• การแสดงผลตวแปรโดยใชคาสง printf สามารถใชงานโดยการใสขอมล หรอชอตวแปรในสวนของ data-list • หากไมตองการแสดงผลตวแปร ไมตองมสวนของ data-list • หากตองการแสดงผลขอมล หรอตวแปรมากกวาหนงตวในคาสงใหใช เครองหมาย comma , สาหรบคนชอตวแปร
โดยจะทาการแสดงผลตามลาดบตวแปร และสวนการแสดงชนดขอมล
#include<stdio.h> int main() { printf ("Age = %d, GPA = %f\n",17,3.75); printf ("Programming: %f\nMechanics: %f",4.0,3.5); return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ Age = 17, GPA = 3.750000 Programming: 4.000000 Mechanics: 3.500000
#include<stdio.h> int main() { printf ("Subject : %s(%d)\n","Programming",2552);
ผลลพธของโปรแกรมแสดงออกจอภาพ Subject : Programming(2552) Point : 99
©2011 CE-KMITL v0.1
37
printf ("Point : %d\nGrade : %c",99,'A'); return 0; }
Grade : A
2.4 แสดงชนดขอมลทกาหนดรปแบบการแสดงผล
printf(“%m?”, data); printf(“%-m?”, data);
เปนการจองพนทหนาจอจานวน m ตวอกษร แลวแสดงผล data ชดดานขวาของพนทสวนทจองไว โดยชนดขอมลตาม ? (หากความยาวเกนสวนทจองไวกจะเลอนออกไป) เปนการจองพนทหนาจอขนาด m ตวอกษร แลวแสดงผล data ชดดานซายของพนทสวนทจองไว โดยชนดขอมลตาม ? #include<stdio.h> int main() { printf ("123456789012345678901234567890"); printf ("\n%20d*",46); printf ("\n%-20d*",46); printf ("\n%3d*",46); printf ("\n%3d*",2550); return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ 123456789012345678901234567890 46* 46 * 46* 2550*
#include <stdio.h> int main() { printf ("123456789012345678901234567890"); printf ("\n%20c*",'c'); printf ("\n%-20c*",'c'); printf ("\n%10s*","Pro"); printf ("\n%10s*","Programming"); return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ 123456789012345678901234567890 c* c * Pro* Programming*
แสดงชนดขอมลทกาหนดรปแบบการแสดงผล
printf(“%.n?”, data); printf(“%m.n?”, data);
เปนการกาหนดใหแสดงจานวนทศนยม n ตาแหนง สาหรบ %f หรอแสดงอกขระจานวน n ตว สาหรบ %s เปนการจองพนทหนาจอขนาด m ตวอกษรแลวแสดงผล data จานวนทศนยม n ตาแหนง สาหรบ %f หรอแสดงอกขระจานวน n ตว สาหรบ %s
©2011 CE-KMITL v0.1
38
//มคาสงอนๆกอนหนาน printf ("123456789012345678901234567890"); printf ("\n%20s*","programming"); printf ("\n%-20s*","programming"); printf ("\n%.3s*","programming"); printf ("\n%20.3s*","programming"); printf ("\n%-20.3s*","programming"); //มคาสงอนๆหลงจากน
ผลลพธของโปรแกรมแสดงออกจอภาพ 123456789012345678901234567890 programming* programming * pro* pro* pro *_
//มคาสงอนๆกอนหนาน printf ("123456789012345678901234567890"); printf ("\n%20f*", 1234.56789); printf ("\n%-20f*", 1234.56789); printf ("\n%.3f*", 1234.56789); printf ("\n%20.3f*", 1234.56789); printf ("\n%-20.3f*", 1234.56789); //มคาสงอนๆหลงจากน
ผลลพธของโปรแกรมแสดงออกจอภาพ 123456789012345678901234567890 1234.567890* 1234.567890 * 1234.568* 1234.568* 1234.568 *_
2.5 คาอธบายโปรแกรม คาอธบายโปรแกรมเปนสวนทเพมในโปรแกรมเพอชวยใหผทเขยน หรอผทอานโปรแกรมสามารถเขาใจกบตวโปรแกรมไดงายขน โดยทคาอธบายโปรแกรมนจะไมมผลตอการทางานของโปรแกรม คอเวลาททาการคอมไพล จะขามขอความทอยในสวนอธบายโปรแกรมไป รปแบบคาสง /* comment style1 สาหรบขอความหลายบรรทด */ //comment style2 ขอความหนงบรรทด
โปรแกรม 2.4 แสดงรายไดตอเดอน
โปรแกรมแสดงผล ชอ-นามสกล อาย
#include <stdio.h> int main() { return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ Name : Kmitl Surname : Engineering Age : 46
©2011 CE-KMITL v0.1
39
โปรแกรม 2.5 แสดงรายไดตอเดอน
โปรแกรมแสดงรายไดตอเดอนแลวแสดงวาตอสปดาหคดเปนเทาใด (ทศนยม 2 ตาแนง) ตอวนคดเปนเทาใด (ทศนยม 3 ตาแหนง) #include <stdio.h> int main() { return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ Salary : 6500 Money/Week : 1625.00 Money/Day : 232.143
โปรแกรม 2.6 โปรแกรมแสดงเกรด
โปรแกรมแสดงผล เกรดวชา Programming, Drawing, Mechanics, Math1 พรอมแสดงเกรดเฉลย (ทศนยม 2 ตาแหนง) #include <stdio.h> int main() { return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ Programming : A Drawing : B+ Mechanics : B+ Math : B GPS : 3.50
2.5 คาถามทายบท 1) แสดงผลของโปรแกรมตอไปน อธบาย #include<stdio.h> int main() { /* float radius, pi, area; pi = 22/7; // pi = 3.14; printf ("Enter Radius of Circular : "); scanf ("%f",&radius); area = pi * radius * radius; */ printf (“Programming Language”,2008); return 0; }
ผลลพธของโปรแกรมแสดงออกจอภาพ
2) จงเขยนสวนของโปรแกรมใหแสดงผลดงตอไปน 12\06\2008 King Mongkut’s Institute of Technology Ladkrabang
©2011 CE-KMITL v0.1
40
Bangkok, Thailand. 3) จงเขยนสวนของโปรแกรมใหแสดงผลตามเงอนไขตอไปน บรรทดท 1 แสดง รหสประจาตว นศ. บรรทดท 2 แสดง ชอ นามสกล บรรทดท 3 แสดง วน/เดอน/ป เกด บรรทดท 8 แสดงขอความ http://www.ce.kmitl.ac.th ชดขอบขวาของบรรทด บรรทดท 10 แสดงขอความ bye bye ตรงกลางบรรทด
©2011 CE-KMITL v0.1
41
การทดลองท 2 การเขยนโปรแกรมเบองตนและคาสงแสดงผล
วตถประสงค 1. เพอใหนกศกษาสามารถเขยนโปรแกรมไดตรงตามโครงสรางของภาษา 2. เพอใหนกศกษาสามารถเขยนโปรแกรมเพอแสดงขอมลในหนาจอไดตรงตามความตองการ
ทฤษฎ ในการเขยนโปรแกรมทก ๆ ภาษา โปรแกรมเมอรจาเปนตองเขยนโปรแกรมใหตรงตามโครงสรางของภาษานนๆ ไมเวนแมแตในภาษา C ดงนนนกศกษาจงควรศกษาโครงสรางภาษา C ในแตละสวนโดยละเอยดกอน สาหรบโครงสรางภาษา C ประกอบดวยองคประกอบตางๆ ดงตวอยางตอไปน
#include<file.h> // พรโพรเซสเซอรไดเรคทฟ type function_name(type); // การประกาศฟงกชนโพรโตไทพ type variable; // การประกาศตวแปร global int main() // การประกาศฟงกชนหลก { // วงเลบปกกาเปด สาหรบฟงกชนหลก type variable; // การประกาศตวแปร local statement-1; . . . statement-n; return 0; // การสงคากลบของฟงกชน } // วงเลบปกกาปด สาหรบฟงกชนหลก type function_name(type variable) // ฟงชนยอย { statement-1; . . . statement-n; return (var); }
อธบายสวนประกอบตางๆ ดงน
1) ในสวนของพรโพรเซสเซอรไดเรคทฟ เปนสวนทโปรแกรมเมอรจะตองใหขอมลกบคอมไพลเลอร วาจะใชฟงกชนในกลมของไฟล .h ไฟลไหนบาง ซงโปรแกรมเมอรตองทราบวาฟงกชนทตนใช จะตองใชพรโพรเซสเซอรไดเรคทฟตวใด เชน ถาในโปรแกรมมคาสง printf จะตองมการเรยกใชงาน stdio.h ซงโปรแกรมจะไมสามารถ compile ไดถาเราไมไดกาหนด #include <stdio.h> ดงนนการกาหนดพรโพรเซสเซอรไดเรคทฟ ถอวาเปนสวนทจาเปน ถามการเรยกใชงานคาสงใดๆ ตองมการกาหนดพรโพรเซสเซอรไดเรคทฟทกครง
2) การประกาศฟงกชนโพรโตไทพ จะมการกาหนดกตอเมอมการเขยนโปรแกรมแบงเปนฟงกชนยอย และมการประกาศฟงกชนยอยหลงการประกาศฟงกชนหลกเทานน ถาไมมฟงกชนยอยกไมจาเปนตองประกาศฟงกชนโพรโตไทพ
3) การประกาศตวแปร global จะมการกาหนดกตอเมอมการเขยนโปรแกรมทตองเรยกใชตวแปร global ถาไมมการเรยกใชตวแปร global กไมจาเปนตองประกาศตวแปรในบรรทดดงกลาว
4) การประกาศฟงกชนหลก ถอเปนสวนสาคญทกโปรแกรมตองม 5) วงเลบปกกาเปดสาหรบฟงกชนหลก ถอเปนสวนสาคญทกโปรแกรมตองม 6) การ return คาของฟงกชน ถอเปนสวนสาคญ ทกโปรแกรมตองม ถามการประกาศ type ของฟงกชนหลก 7) วงเลบปกกาปดสาหรบฟงกชนหลก ถอเปนสวนสาคญ ทกโปรแกรมตองม 8) ฟงกชนยอย เปนสวนทไมจาเปนตองใชสาหรบผเรมตนเขยนโปรแกรม
©2011 CE-KMITL v0.1
42
นกศกษาจะเหนวาโดยตวโครงสรางของภาษา C มรายละเอยดมาก เนองจากผออกแบบไดออกแบบไวสาหรบการใชงานทหลากหลาย สาหรบผเรมเขยนโปรแกรม จะเรมจากการเขยนโปรแกรมอยางงาย มขนาดเลก และไมจาเปนตองมองคประกอบของโครงสรางภาษา C ทก ๆ องคประกอบ แตจะตองมขอมลองคประกอบหลกเพยงไมกตวเทานน การเขยนโปรแกรมภาษา C ทสามารถ compile ไดตามโครงสรางภาษานน ใชองคประกอบเพยงส องคประกอบเทานน ดงตวอยาง int main(void) { return 0; } ถานกศกษาลองนาโคดดงกลาวมา compile จะพบวาเราสามารถ compile โคดนได เนองจากมองคประกอบหลกครบถวนตามโครงสรางภาษาแตจะไมสามารถรนใหเกดผลลพธใด ๆ ได เนองจากโปรแกรมไมมการเรยกคาสงใดๆ เลย ถาตองการใหโปรแกรมทางานอยางใดอยางหนง จะตองเพมคาสง หรอฟงกชนภายในเครองหมายวงเลบปกกาเชน ถานกศกษาตองการใหคอมพวเตอรแสดงคาวา Engineer นกศกษาตองเพมคาสงหนงคาสงในเครองหมายวงเลบปกกา และเพมพรโพรเซสเซอรไดเรคทฟของคาสงนนๆ ดวยจะไดผลลพธดงน
#include <stdio.h> int main() { printf("Engineer"); return 0; }
สาเหตทตองเพมพรโพรเซสเซอรไดเรคทฟดวยเนองจาก คอมไฟลเลอรจะตองทาการเปลยนคาสง printf ใหกลายเปนไบนารโคด และตองใชรายละเอยดในไฟลชอ stdio.h ในการคอมไพลโปรแกรม ถาไมมพรโพรเซสเซอร ไดเรคทฟ จะทาใหคอมไพเลอรไมสามารถทราบไดวาตองเปลยนเปนไบนารโคดอยางไร สงผลใหโปรแกรมคอมไพลไมผาน โดยโปรแกรมจะแจงวาไมรจกคาสง printf ฟงกชน printf รปแบบคาสง printf (format string, data list); รายละเอยดการใชงานคาสง printf เปนคาสงทใชเพอแสดงผลออกทหนาจอ Output โดยภายในคาสงจะประกอบดวย 2 สวนไดแก 1. format string : สวนทแสดงผลซงจะอยในเครองหมาย " " (Double quote) โดยจะม 4 ลกษณะไดแก
1) ขอความหรอตวอกษรธรรมดา : ขอความหรอตวอกษรทวไปรวมทงชองวาง (space) ทตองการใหแสดงผลท Output
2) รหสควบคม (Escape Sequence) : ใชสาหรบควบคมการแสดงผลทหนาจอหรอเครองพมพ เชน การจดยอหนาการจดบรรทด ฯลฯ รหสควบคมขนตนดวยเครองหมาย \ (backslash) และตามดวยรหสควบคม ตามตวอยางตอไปน
\n : กาหนดใหขนบรรทดใหม \t : กาหนดใหเวนไป 1 แทบแนวนอน (8 อกขระ) \v : กาหนดใหเวนไป 1 แทบแนวตง \b : ถอยหลงหนงตวอกษร (back space) \a : สงเสยงบป 1 ครง \f : ขนหนาใหม (form feed) \r : ยายเคอรเซอรกลบไปทตนบรรทด
©2011 CE-KMITL v0.1
43
\’ : พมพเครองหมาย ‘ \” : พมพเครองหมาย “ \\ : พมพเครองหมาย \ \0 : คาวาง (null)
3) รหสรปแบบขอมล : กาหนดชนดขอมล ซงอาจจะเปนตวแปร นพจน หรอคาคงท ซงจะสมพนธกบสวน data list ทอยในคาสง โดยทรหสรปแบบขอมลจะขนตนดวยเครองหมาย % และตามดวยตวอกษรทบงบอกถง ชนดของขอมล ตวอยางเชน
%d : ชนดขอมลทพมพเปนเลขจานวนเตม %f : ชนดขอมลทพมพเปนเลขจานวนจรง %c : ชนดขอมลทพมพเปนตวอกขระหนงตว %s : ชนดขอมลทพมพเปนขอความสตรงก %ld : ชนดขอมลทพมพเปนเลขจานวนเตม แบบยาว %g : ชนดขอมลทพมพเปนเลขจานวนจรง %e : ชนดขอมลทพมพเปนเลขจานวนจรง แบบ exponent %i : ชนดขอมลทพมพเปนเลขจานวนเตม เชนเดยวกบ %d %o : ชนดขอมลทพมพเปนเลขฐานแปด %x : ชนดขอมลทพมพเปนเลขฐานสบหก %u : ชนดขอมลทพมพเปนเลขจานวนเตม ไมมเครองหมาย %p : ชนดขอมลทพมพเปนตวชตาแหนง
4) รปแบบการแสดงผลอนๆ • printf ("%m?",data); เปนการจองพนทหนาจอจานวน m ตวอกษร แลวแสดงผล data ชดดานขวาของพนท
สวนทจองไว โดยชนดขอมลตาม ? (หากความยาวเกนสวนทจองไวกจะเลอนออกไป) เชน ถาตองการแสดงผลคาวา Engineer ชดขวามอของจอภาพ (จอภาพมความกวาง 80 ตวอกษร) สามารถใชคาสง printf("%80s","Engineer"); ได
• printf ("%-m?",data); เปนการจองพนทหนาจอขนาด m ตวอกษร แลวแสดงผล data ชดดานซายของพนทสวนทจองไว โดยชนดขอมลตาม ?
• printf ("%.n?",data); เปนการกาหนดใหแสดงจานวนทศนยม n ตาแหนง สาหรบ %f หรอแสดงอกขระจานวน n ตว สาหรบ %s
• printf ("%m.n?",data); เปนการจองพนทหนาจอขนาด m ตวอกษรแลวแสดงผล data จานวนทศนยม n ตาแหนง สาหรบ %f หรอแสดงอกขระจานวน n ตว สาหรบ %s
2. data list : สวนทเปนตวแปร นพจน หรอคาคงทตางๆ ทคาสง printf จะนาไปใชแสดงผลตามรปแบบทกาหนดในสวนของ format string โดยถาหากมขอมลทตองการแสดงผลหลายตวใหใชเครองหมาย , (comma) คนขอมลแตละตว ชนดของขอมลตวท 1 จะตองตรงกบรหสขอมลทอยใน format string ตวท 1
©2011 CE-KMITL v0.1
44
การทดลองท 2.1
ใหนกศกษาปอนโปรแกรมตามตวอยางดานลาง แลวจดผลลพธลงในตาราง #include <stdio.h> int main() { printf("1234567890123456789012345678901234567890"); //Line 1 printf("\n123456789\tA\tB123456789\tC"); //Line 2 printf("\n%s***","programming"); //Line 3 printf("\n%20s***","programming"); //Line 4 printf("\n%20s***","programming\n\n\n"); //Line 5 printf("\n%-20s***","programming"); //Line 6 printf("\n%20.5s***","programming"); //Line 7 printf("\n%-20.5s***","programming"); //Line 8 printf("\n%3.5s***","programming"); //Line 9 printf("\n%-3.5s***","programming"); //Line 10 printf("\n%d***",3333); //Line 11 printf("\n%10d***",3333); //Line 12 printf("\n%10d***",-3333); //Line 13 printf("\n%2d***",3333); //Line 14 printf("\n%2d***",-3333); //Line 15 printf("\n%-10d***",3333); //Line 16 printf("\n%-10d***",-3333); //Line 17 printf("\n%d***",33.33); //Wrong output //Line 18 printf("\n%d***",33333); //Wrong output //Line 19 printf("\n%d***","12345"); //Wrong output //Line 20 printf("\n%f***",3.14159); //Line 21 printf("\n%f***",-3.14159); //Line 22 printf("\n%10f***",3.14159); //Line 23 printf("\n%-10f***",3.14159); //Line 24 printf("\n%10.3f***",3.14159); //Line 25 printf("\n%-10.3f***",3.14159); //Line 26 printf("\n%3.3f***",3.14159); //Line 27 printf("\n%3.3f***",-3.14159); //Line 28 printf("\n%f***",12345); //Line 29 printf("\n%f***","12345"); //Line 30 printf("\n%d***",'A'); //Line 31 printf("\n%d***",'a'); //Line 32 printf("\n%d***",'1'); //Line 33 printf("\n%c***",'A'); //Line 34 printf("\n%c***",'a'); //Line 35 printf("\n%c***",'1'); //Line 36 printf("\n%c***",65); //Line 37 printf("\n%o***",65); //Line 38 printf("\n%x***",65); //Line 39 return 0; }
©2011 CE-KMITL v0.1
45
การทดลองท 2.2 ใหนกศกษาปอนโปรแกรมตามตวอยางดานลาง แลวสงเกตผลลพธทได 1. ตวอยางโปรแกรมทมการเรยกใชงานฟงกชน printf #include <stdio.h> int main() { printf("Engineer"); return 0; }
©2011 CE-KMITL v0.1
46
2. (จากขอ 1) ถาตองการใหคาวา Engineer ปรากฏอยมมบนขวาของจอภาพจะตอง เปลยนแปลงคาสง printf("Engineer"); เปลยนเปน printf("%80s","Engineer"); (หมายเหต : โดยทวไปจอภาพจะตงคาไวทความกวาง 80 ตวอกษร) 3. (จากขอ 1) ถาตองการใหคาวา Engineer ปรากฏอยตรงกลางของจอภาพจะตอง เปลยนแปลงคาสง printf("Engineer"); เปลยนเปน printf("%44s","Engineer");
การทดลองท 2.3 ใหนกศกษาเขยนโปรแกรมโดยใหแสดงคาวา Computers and Programming ปรากฏอยกลางจอภาพ จดคาสงทใช
การทดลองท 2.4 ใหนกศกษาลองเขยนโปรแกรมตอไปนลองสงเกตผลลพธขณะ compile โปรแกรม หรอรนโปรแกรม แลวตอบคาถาม 1. ใหนกศกษาทดลองเขยนโปรแกรมในตวอยางการใชงานขอ 1 โดยตดบรรทด #include <stdio.h> ออกเพอทดสอบวาจะเกดอะไรขนถามการเรยกใชฟงกชนโดยไมมการกาหนดพรโพรเซสเซอรไดเรคทฟ Q: จะเกดขอผดพลาดอะไร 2. จากโปรแกรมในตวอยางการใชงานคาสง ขอ 1 ถาไมมบรรทด return 0; จะเกดขอผดพลาดอยางไร 3. เมอหนาจอมความกวาง 80 ตวอกษร จะเกดอะไรขนเมอใชคาสง printf (“%82s”,”engineer”);
การทดลองท 2.5
ใหนกศกษาเขยนโปรแกรมตอไปน 1) ใหนกศกษาเขยนโปรแกรมเพอแสดงผลลพธชอนกศกษา รหสนกศกษา และทอย โดยแสดงผลคนละบรรทด 2) ใหนกศกษาเขยนโปรแกรมเพอแสดงผลลพธเปนชอและนามสกลของนกศกษา โดยใหชอปรากฏอยทมมบนซายของ
จอภาพ และนามสกลปรากฏอยทมมบนขวาของจอภาพ (Hint : จอภาพมความกวาง 80 ตวอกษร) 3) ใหนกศกษาเขยนโปรแกรมเพอแสดงผลลพธเปนรหสนกศกษา ปรากฏอยตรงตาแหนงทง 4 มมของจอภาพโดยใช
คาสง printf เพยงครงเดยวเทานน 4) ใหนกศกษาเขยนโปรแกรมเพอแสดงผลคาตวเลขจานวนจรง 3.14285714 โดยแสดงผลลพธเปนเลขทศนยม 3,4,5
และ 6 ตาแหนง โดยแสดงผลคนละบรรทดและใหจดทศนยมอยตรงกลางจอภาพ
©2011 CE-KMITL v0.1
47
บทท 3 ชนดของขอมลในภาษาซ คาสงรบขอมล และการคานวณ
วตถประสงคการศกษา 1) รจกและเขาใจขอมลประเภทตางๆ 2) สามารถสรางตวแปรและใชงานตวแปรไดอยางถกตอง 3) สามารถแสดงขอความออกทางจอภาพและรบขอมลจากคยบอรดได 4) สามารถใช Operator ทางคณตศาสตรได 5) เขยนโปรแกรมประมวลผลตวอกษรได
3.0 ตวแปรในภาษาซ การประกาศตวแปรม 2 ลกษณะไดแกตวแปรโกบอล (Global variable) และ ตวแปรโลคอล (Local variable) ซงมรปแบบการประกาศตวแปรทเหมอนกน แตจะมคณสมบตตางกน โดยจะเหนไดชดเจนเมอมการสรางฟงกชนมาใชงาน เนอหาสวนตน จะใชงานเฉพาะตวแปรชนดโลคอล โดยจะประการตวแปรในสวนเรมตนของฟงกชน
3.1 ชนดของขอมลในภาษาซ เปนพารามเตอรทใชงานในภาษาซ เพอกาหนดลกษณะฟงกชนตนแบบ และ ตวแปรทใชงานในโปรแกรม ม 4 ชนด void ขอมลชนดวางเปลา int ขอมลชนดจานวนเตม float ขอมลชนดจานวนทศนยม char ขอมลชนดอกขระ
3.1.1 ขอมลชนดวางเปลา (void)
void เปนพารามเตอรทใชงานในสวนของ ฟงกชนโพรโทรไทพ การสรางและใชงานฟงกชน เพอแสดงใหรวาฟงกชนทสรางขนมาไมมการสง หรอรบคาจากการเรยกใชงานฟงกชน
3.1.2 ขอมลชนดจานวนเตม (integer)
int เปนพารามเตอรหลกทใชกบขอมลชนดจานวนเตม โดยมการใชงาน 5 รปแบบดงน unsigned int ขอมลชนดจานวนเตมไมคดเครองหมายขนาด 2 bytes short int ขอมลชนดจานวนเตมขนาด 2 bytes int ขอมลชนดจานวนเตมขนาด 2 bytes หรอ 4 bytes (สงเกตใหด ในคอมไพเลอรขนาด 32บต เชน MS-Visual studio 1.0 – 2008 เปนตน ตวแปร int จะมขนาด 4 byte และ ใน คอมไพเลอรขนาด 16 บตตวแปรเชน Borland C 1.0 - 4.5 ตวแปร int จะมขนาด 2 byte) unsigned long ขอมลชนดจานวนเตมไมคดเครองหมายขนาด 4 bytes long ขอมลชนดจานวนเตมขนาด 4 bytes
3.1.3 ขอมลชนดจานวนทศนยม (float)
float เปนพารามเตอรหลกทใชกบขอมลชนดจานวนทศนยมโดยมการใชงาน 3 รปแบบดงน float ขอมลชนดจานวนทศนยมขนาด 4 byte double ขอมลชนดจานวนทศนยมขนาด 8 byte long double ขอมลชนดจานวนทศนยมขนาด 10 byte
©2011 CE-KMITL v0.1
48
3.1.4 ขอมลชนดอกขระ หรอตวอกษร (character)
char เปนพารามเตอรทใชงานเกยวกบตวอกษร และขอความในภาษาซ โดยมการกาหนดคาอกขระโดยใหอยในเครองหมาย single quote ('...') เชน 'C', 'o', 'm', '1' อกขระพเศษบางตวไมสามารถกาหนดคาใหไดโดยตรง แตใชคารหส ASCII เชนอกขระควบคมการแสดงผลการขนตนบรรทดใหมใช '\n' เปนตน โดยมรปแบบการใชงาน 2 รปแบบ unsigned char ขอมลชนดอกขระไมคดเครองหมาย char ขอมลชนดอกขระปกต
3.1.5 ตารางสรปชนดขอมล
ขนาดจานวนบตของตวแปร integer ขนอยกบ รนของ compiler โดย โปรแกรมคอมไพเลอร เชน TurboC 2.0-
4.5 ขนาดของ Integer จะมขนาด 16บต หรอ 2 ไบท (ชวงขอมล -32768 ถง 32767) และโปรแกรมคอมไพเลอร Visual 1.0 - Visual Studio 2008 (รน 32บต) ขนาดของ integer มขนาด 32 บต หรอ 4 ไบท (ชวงขอมล -2147483648 ถง 2147483647)
3.2 รปแบบการประกาศตวแปร
3.2.1 ประกาศตวแปรแบบไมกาหนดคาเรมตน
รปแบบคาสง type var1; //รปแบบท1
type var1, var2,.., varN; //รปแบบท2
type คอ ชนดของขอมลทจะกาหนดใหกบตวแปร var คอ ชอของตวแปรทจะตง ตวอยางการประกาศตวแปร int number; //ประกาศตวแปรชนด integer int a, b, c; float real; //ประกาศตวแปรชนด float
©2011 CE-KMITL v0.1
49
float point1, point2; char choice; //ประกาศตวแปรชนด character char ch1,ch2; การประกาศตวแปรในลกษณะนเปนการประกาศแบบไมกาหนดคาเรมตน ดงนนคาเรมตนของตวแปร อาจจะเปนคาใดๆกได ขนอยกบขอมลทคางอยในหนวยความจาขณะนน
3.2.2 การประกาศตวแปรแบบกาหนดคาเรมตน
รปแบบคาสง type var1 = value; //รปแบบท1
type var1 = value1, var2 = value2; //รปแบบท2
type คอ ชนดของขอมลทจะกาหนดใหกบตวแปร var คอ ชอของตวแปรทจะตง value คอ คาของตวแปรทตองการกาหนดให ตวอยางการประกาศตวแปร int number = 25; int a = 1, b = 2, c = 3; float real = 99.99; float point1 = 45.2, point2 = 30; char choice = 'a'; char ch1 = 'o', ch2 = 'z';
3.2.3 หลกการตงชอตวแปร
หลกกการตงชอตวแปรมขอกาหนดดงน 1. ชอตวแปรขนตนดวยอกษร A-Z, a-z หรอ เครองหมายo_oเทานน 2. ภายในชอตวแปรหามมชองวาง 3. ภายในชอตวแปรประกอบดวยอกขระ A-Z, a-z, ตวเลข 0-9 หรอ เครองหมาย “_”เทานน 4. การใชอกษรตวใหญและตวเลกมความแตกตางกน 5. หามใชคาสงวน (Reserved word) เปนชอตวแปร 6. ควรตงชอตวแปรใหสมพนธกบคาขอมลทใชเกบ
3.2.3.1 คาสงวน (Reserved word) auto break case char const continue default do double else enum extern float for goto if int long register return short singned sizeof static struct switch typedef union unsigned void volatile while
©2011 CE-KMITL v0.1
50
ตวอยางการตงชอตวแปร //ตงชอตวแปรถกตอง int _money; float salary_ot; char M11223_223; double GOTO_data;
//ตงชอตวแปรผด int $money; float static; char 1M1223_223; double GOTO-data;
3.3 ตวแปรชนดขอความ ในภาษาซจะไมมขอมลชนดขอความโดยเฉพาะ ซงในการเขยนโปรแกรมสวนใหญจาเปนตองมการรบขอมลทเปนขอความ เราสามารถใชตวแปรขอมลชนดอกขระหลายๆ ตวมาใชงานไดในระดบหนง แตยงไมสะดวกเมอขอความมความยาวมาก ตวอยาง เชน ตองการใชขอความวา Hello สามารถใชตวแปรชนดอกขระ 5 ตวแทน char ch1='H',ch2='e',ch3='l',ch4='l',ch5='o'; ตวแปรชนดขอความในภาษาซ คอ การนาอกษรมาเรยงตอกน ดงนนสามารถสรางตวแปรชนดอกขระเรยงตอกนหลาย ๆ ตวใหเปนตวแปรชนดแถวลาดบ ทาใหสามารถใชเกบขอมลชนดขอความได โดยตวแปรชนดขอความในภาษาซจะอยในเครองหมาย Double quote " "
3.3.1 รปแบบการประกาศตวแปรชนดขอความ
รปแบบคาสง
char var1[M1]; //รปแบบท1
char var1[M1], var2[M2]; //รปแบบท1
var คอ ชอตวแปร M คอ จานวนของอกขระทจะใชเกบบวกดวย 1 การใชตวแปรแถวลาดบชนดอกขระเปนตวแปรขอความ ในภาษาซกาหนดไววาตวสดทายของตวแปรแถวลาดบคอ \0 สญลกษณ \0 เรยกวา Null character ตวอยาง char str[15]; char first[20],last[20];
3.3.2 รปแบบการประกาศตวแปรชนดขอความพรอมกาหนดคา
รปแบบคาสง char var[M] = “?????”; //รปแบบท1
char var[M] = {‘?’, ‘?’, ‘?’, ‘?’}; //รปแบบท2 char var[] = “?????”; //รปแบบท3
©2011 CE-KMITL v0.1
51
var คอ ชอตวแปร M คอ จานวนของอกขระทจะใชเกบบวกดวย 1 ? คอ อกษรทจะกาหนดคาใหขอความ จานวน m-1 ตว
3.3.3 รปแบบการอางองในตวแปรขอความ
รปแบบคาสง
variable[N]
variable คอชอตวแปร N คอลาดบอกษรทจะอางองในตวแปรขอความ เรมนบอกษรตวแรกเปนตาแหนงท 0 char subject[12] = "Programming";
3.4 การใชงานตวแปรรวมกบคาสง printf ในคาสง printf มสวนแสดงชนดขอมล ซงตวแปรทใชงานกเปนสวนยอยของขอมลชนดตาง ๆ รปแบบคาสง
printf (format-string, data-list);
จงสามารถใชตวแปรแทนในสวนของ data-list ได เชน //แบบไมใชตวแปร #include<stdio.h> int main() { printf("GPA : %.2f",3.5); return 0; }
//แบบใชตวแปร #include<stdio.h> int main() { float g = 3.5; //ประกาศตวแปรชนด float printf ("GPA : %.2f",g); return 0; }
ตวอยาง ตองการเขยนโปรแกรมแสดงคาวา Programming จานวน 5 บรรทดทจอคอมพวเตอร โดยใชตวแปรขอความ #include <stdio.h> int main() { printf ("%s\n","Programming"); printf ("%s\n","Programming"); printf ("%s\n","Programming"); printf ("%s\n","Programming"); printf ("%s\n","Programming"); return 0; }
#include <stdio.h> int main() { char name[20]="Programming"; printf ("%s\n",name); printf ("%s\n",name); printf ("%s\n",name); printf ("%s\n",name); printf ("%s\n",name); return 0; }
©2011 CE-KMITL v0.1
52
3.5 การรบขอมลจาก Keyboard ดวย scanf โปรแกรมโดยทวไปตองมการรบคาขอมลจากผใชโปรแกรม เพอนามาหาผลลพธตามกระบวนการทางานของโปรแกรม หรอตามความตองการของผใชงาน คาสงทใชสาหรบการรบคาในภาษาซมหลายคาสง แตทสามารถใชงานไดครอบคลมและนยมใชกน คอ คาสง scanf
3.5.1 รปแบบคาสง scanf
รปแบบคาสง
scanf(format-string, address-list);
format-string คลายในคาสง printf แตจะมเฉพาะสวนแสดงชนดขอมล และอยในเครองหมาย " " address-list คอ ตาแหนงของตวแปรทตองการเกบขอมลไว (การใชงานตาแหนงของตวแปรจะใชเครองหมาย & นาหนาชอตวแปร ยกเวนตวแปรชนดขอความ) หมายเหต คาสง scanf ตองเรยกใช Preprocessor Directive #include<stdio.h> ตวอยางการใชคาสง scanf #include<stdio.h> int main() { float point; char name[20]; printf ("Enter your name : "); scanf ("%s",name); printf ("Enter your point : "); scanf ("%f",&point); return 0; }
ตวอยางการใชคาสง scanf #include<stdio.h> int main() { char first[20],last[20]; printf ("Enter your name and surname : "); scanf ("%s %s",first,last); printf ("Hi %s %s\nHow are you?",first,last); return 0; }
ผลลพธ Enter your name and surname : Peter Bravo Hi Peter Bravo How are you?
3.5.2 การรบขอความทมการเวน (spacebar)
คาสง scanf ไมสามารถใชรบขอความทมการเวนเพอเกบในตวแปรขอความตวเดยวได (เมอใช %s) เราสามารถใชคาสง scanf เพอใหรบขอความทมการเวนไปเกบในตวแปรชนดขอความไดดงน รปแบบคาสง
scanf(“%[\n]”, string);
©2011 CE-KMITL v0.1
53
โปรแกรม 3.1 คาสง scanf #include<stdio.h> int main() { char name[40]; float gpa; printf ("Enter your name : "); scanf ("%[^\n]",name); printf ("Enter your GPA : "); scanf ("%f",&gpa); printf ("Name : %s\n",name); printf ("Gpa : %f",gpa); return 0; }
โปรแกรม 3.2 คาสง scanf #include<stdio.h> int main() { char name[40]; int date, month, year; printf ("Enter your name & surname : "); scanf("%[^\n]",name); printf ("Enter your Birthday [d/m/y] : "); scanf("%d/%d/%d",&date,&month,&year); printf ("%s birthday is %d %d %d",name,date,month,year); return 0; }
3.6 เครองหมายคานวณทางคณตศาสตร
โปรแกรม 3.3 แสดงการคานวณ #include <stdio.h> int main() { int a,b,ans; a = 10; b = 20; a+b = ans; //error ans = a+b; //OK printf("%d",ans); return 0; } การกาหนดคาใหกบตวแปรในภาษาซใชเครองหมาย = โดยการทางานจะนาคาทอยทางขวามอ (จานวน อกขระ ขอความ คาจากตวแปร หรอผลลพธจากฟงกชน) ใหกบตวแปรทอยทางซายมอ รปแบบคาสง
©2011 CE-KMITL v0.1
54
Variable = value;
ตวอยางการแทนคาลงในตวแปร num1 = 99; n = num%10; point = mid+final; ch = '9'; ans = pow(x,y); str = "Com"; //Error กรณทตวแปรเปน string ไมสามารถแทนขอความดวยเครองหมาย “=” ได ดงเชนตวอยางดานลางน วธการแกปญหาใหใชฟงกชน strcpy (อานวา string copy) ซงตองประกาศ #include <string.h> #include <stdio.h> #include <string.h> int main() { char str[10]; str = "hello"; //Error strcpy(str,"hello"); //OK printf("%s",str); return 0; }
3.6.1 การเพมลดคาตวแปร
โปรแกรม 3.4 เพม/ลดคาตวแปร #include <stdio.h> int main() { int a; a = 10; printf(“ %d ”,a++); printf(“ %d ”,++a); printf(“ %d ”,a+2); printf(“ %d ”,++a); //สงเกตผลลพธ return 0; }
//ผลลพธ 10 12 14 13
3.6.2 เครองหมายแบบลดรป
©2011 CE-KMITL v0.1
55
โปรแกรม 3.5 เพม/ลดคาตวแปร #include <stdio.h> int main() { int a; a = 10; printf(“ %d ”,a++); printf(“ %d ”,++a); printf(“ %d ”,a+=2); printf(“ %d ”,++a); //สงเกตผลลพธ return 0; }
//ผลลพธ 10 12 14 15
3.6.3 ตวดาเนนการ และตวถกดาเนนการ
3.6.4 นพจน
หมายเหต: ไมควรใช == หรอ != กบขอมลประเภททศนยม float double
©2011 CE-KMITL v0.1
56
โปรแกรม 3.6 แสดงลาดบความสาคญสญลกษณทางคณตศาสตร #include <stdio.h> int main() { int a = 10; printf(“ %d ”, 10*2*3-10/7); printf(“ %d ”, 10*2*(3-10)/7); printf(“ %d ”, 10*2>2+3); printf(“ %d ”, 10*2<2+3); return 0; }
//ผลลพธ 58 -20 1 0
3.6.4 การเปลยนชนดของขอมล
ในภาษาซมบางคาสงทใชงานไดกบเฉพาะขอมลบางชนดเทานน เชน Modulo จะใชงานไดเฉพาะขอมลชนดจานวนเตม แตไมสามารถใชกบขอมลชนดจานวนทศนยมได รปแบบการเปลยนชนดขอมล รปแบบคาสง
(type) variable;
type คอ ชนดของขอมลทตองการ variable คอ ชอของตวแปรทตองการนาคามาใช หมายเหต ไมไดทาการเปลยนตวแปรเปนชนดอน แตเปลยนชนดขอมลเพอนาไปใชงาน float gpa = 3.9; int num = 3; printf ("gpa(f) :%-10f num(d) :%-10d\n",gpa,num); printf ("gpa(d) :%-10d num(f) :%-10f\n",gpa,num); printf ("(int)gpa(d) :%-10d", (int)gpa); printf ("(float)num(f) :%-10f", (float)num);
3.7 คาสงอนทใช แสดงผล และรบขอมล putchar เปนคาสงทใชแสดงผลขอมลชนดอกขระทละตว โดยมรปแบบการใชงานคาสงดงน
putchar(ch);
ch คอตวแปรชนดอกขระทตองการแสดงผล หมายเหต คาสง putchar ตองเรยกใช preprocessor Directive #include<stdio.h> puts เปนคาสงทใชแสดงผลขอมลชนดขอความ โดยมรปแบบการใชงานคาสงดงน
puts(str);
str คอตวแปรชนดขอความทตองการแสดงผล หมายเหต คาสง puts ตองเรยกใช preprocessor Directive #include<stdio.h>
©2011 CE-KMITL v0.1
57
โปรแกรม 3.7 เรยกใช putchar, puts char ch = 'A', str[] = "Computer"; putchar (ch); putchar (' '); putchar (str[1]); putchar ('\n'); puts (str);
ผลลพธ A o Computer
getchar เปนคาสงทใชรบขอมลชนดอกขระจากผใชงานเพยงตวเดยว โดยเมอปอนขอมลแลวตองกด Enterคาสง getchar มรปแบบการใชงานคาสงดงน
ch = getchar();
ch คอตวแปรชนดขอความทตองการเกบขอมลไว หมายเหต คาสง getchar ตองเรยกใช Preprocessor Directive #include<stdio.h> getch เปนคาสงทใชรบขอมลชนดอกขระจากผใชงานเพยงตวเดยว โดยเมอปอนขอมลแลวโปรแกรมจะทางานคาสงตอไปทนท และจะไมแสดงอกขระทพมพไปคาสง getch มรปแบบการใชงานคาสงดงน
ch = getch();
ch คอตวแปรชนดขอความทตองการเกบขอมลไว หมายเหต คาสง getch ตองเรยกใช Preprocessor Directive #include<conio.h> gets เปนคาสงทใชรบขอมลชนดขอความจากผใชงาน โดยสามารถใสขอมลทมการเวนชองวางภายในได คาสง gets มรปแบบการใชงานคาสงดงน
gets(str);
str คอตวแปรชนดขอความทตองการแสดงผล หมายเหต คาสง gets ตองเรยกใช Preprocessor Directive #include<stdio.h>
โปรแกรม 3.8 เรยกใช getchar, getch, puts char ch1,ch2; printf ("Enter Character 1 : "); ch1 = getchar(); printf ("Enter Character 2 : "); ch2 = getch(); puts ("\n**** Output ****"); printf ("Char 1 = %c\nChar 2 = %c", ch1,ch2);
Enter Character 1 : J Enter Character 2 : **** Output **** Char 1 = J Char 2 = O
3.8 คาถามทายบท 1) ชนดขอมลแบบขอความเหมอนหรอแตกตางจากชนดขอมลแบบอกขระอยางไร 2) จากตวอยางโปรแกรมตอไปน เมอ Run แลวใหผลลพธใด #include <stdio.h> int main()
©2011 CE-KMITL v0.1
58
{ char name[20]; int age; printf("Enter your name: "); scanf("%s",name); printf("Enter your age "); scanf("%d",age); printf("Your name is : %s\n Your age is : %d",name,age); return 0; }
3) จากตวอยางโปรแกรมตอไปน เมอ Run แลวใหผลลพธใด #include <stdio.h> int main() { printf("%d",(40/4*3+4*5/2)); return 0; }
©2011 CE-KMITL v0.1
59
การทดลองท 3 การใชงานคาสง Input Output และการคานวณตางๆ
วตถประสงค 1. เพอใหนกศกษาสามารถใชงานคาสงการแสดงผลตางๆ 2. เพอใหนกศกษาสามารถใชงานคาสงการรบขอมลได 3. เพอใหนกศกษาเขาใจหลกการเขยนโปรแกรมเบองตน
ทฤษฎ คาสงในภาษา C สาหรบการสงใหคอมพวเตอรรบขอมลและแสดงผลขอมลมอยหลายคาสง แตสาหรบผเรมตนเขยนโปรแกรมแลว ควรเรมศกษาคาสง 2 คาสงคอคาสง printf สาหรบการแสดงผลขอมลในหนาจอคอมพวเตอรและคาสง scanf สาหรบรบขอมลจากคยบอรด ในการทดลองนจะใหนกศกษาลองใชงานคาสงทงสองน คาสง printf รปแบบคาสง printf (format string, data list); รายละเอยดการใชงานคาสง ดรายละเอยดจากการทดลองท 2 คาสง scanf รปแบบคาสง scanf (format string, address list); รายละเอยดการใชงานคาสง scanf เปนคาสงทใชเพอรบขอมลจาก key board ประกอบดวย 2 สวนไดแก
1) format string : จะคลายกบคาสง printf โดยจะอยในเครองหมาย " " (Double quote) แตจะม เพยงลกษณะเดยว ไดแก รหสรปแบบคาตวแปร
2) address list : สวนทเปนชอตวแปรตางๆ ทตองการนาคาทรบมาไปเกบไว โดยท ถาตวแปรทตองการนามาเกบคาเปนชนด จานวนเตม (int), จานวนจรง (float) หรอ อกขระ (char) ตองม & นาหนาชอตวแปร
การคานวณทางคณตศาสตร ในการเขยนโปรแกรมสงทจะขาดไมไดเลยคอการคานวณทางคณตศาสตร และการคานวณทางดานตรรกศาสตรสาหรบการคานวณทางคณตศาสตรนน โปรแกรมเมอรสามารถคานวณโดยใชเครองหมาย + , - , * , / และเครองหมาย % โดยมเครองหมาย ( และ ) เปนเครองหมายทใชในการจดกลมของการคานวณ การคานวณจะมการคานวณเครองหมายทมนยสาคญสงกวากอน โดยจดนยสาคญของเครองหมายไวดงน
©2011 CE-KMITL v0.1
60
ในการคานวณโปรแกรมเมอรตองพจารณาผลลพธของการคานวณใน 2 ประเดนคอ ผลลพธทไดมคาเทาใด และผลลพธทได เปนชนดอะไร ซงโดยทวไปจะมการสบสนระหวางผลลพธทไดจากการคานวณตวเลขจานวนเตม และตวเลขจานวนจรง ซงเราสามารถสรปชนดของตวเลขไวดงน
1) การคานวณทางคณตศาสตรระหวางตวแปรชนด float กบตวแปรชนด float จะไดผลลพธเปนตวแปรชนด float 2) การคานวณทางคณตศาสตรระหวางตวแปรชนด float กบตวแปรชนด int จะไดผลลพธเปนตวแปรชนด float 3) การคานวณทางคณตศาสตรระหวางตวแปรชนด int กบตวแปรชนด int จะไดผลลพธเปนตวแปรชนดint 4) การคานวณทางคณตศาสตรระหวางตวแปรชนด int กบตวแปรชนด float จะไดผลลพธเปนตวแปรชนด float
ตวอยางการใชงานคาสง 1. เมอตองการสงใหคอมพวเตอรแสดงคาวา Computers and Programming ทหนาจอคอมพวเตอรสามารถเขยนคาสงดงน printf("Computers and Programming"); 2. เมอตองการสงใหคอมพวเตอรแสดงผลลพธเปนชอวชา Computers and Programming แลวใหคอมพวเตอรแสดงผลลพธในคาสงถดมาใหอยในบรรทดใหม สามารถเขยนคาสงดงน printf("Computers and Programming\n"); 3. เมอตองการสงใหคอมพวเตอรรบขอมลเปนตวเลขจานวนเตม จะตองมการกาหนดคาตวแปรใหเปนชนดตวเลขจานวนเตม แลวใชคาสง scanf เพอรบขอมลมาเกบไวในตวแปรดงน int a; scanf ("%d",&a); 4. เมอตองการใหคอมพวเตอรรบคาตวเลขจานวนเตมสองตว แลวแสดงผลลพธผลบวกของเลขทงสองสามารถทาไดโดยใชคาสงดงน int a,b; scanf(“%d”,&a); scanf(“%d”,&b);
©2011 CE-KMITL v0.1
61
printf(“%d”,a+b); หรอถาตองการใหพมพผลลพธ แลวมคาวา result = สามารถทาไดโดยใชคาสง printf(“result = %d”,a+b);
การทดลองท 3.1
จากตวอยางการใชงานคาสง ใหนกศกษาประยกตใชงานดงตอไปน 1. ใหนกศกษาเขยนโปรแกรมเพอแสดงผล ชอ และนามสกลของนกศกษา โดยชอและนามสกล หางกน 1 tab 2. ใหนกศกษาเขยนโปรแกรมเพอรบคาตวเลขจานวนจรงสองตว แลวแสดงผลลพธผลบวก ลบ คณ และหาร ของเลขสองจานวนนน
การทดลองท 3.2
ใหนกศกษาลองเขยนโปรแกรมตอไปนลองสงเกตผลลพธขณะ compile โปรแกรม หรอรนโปรแกรม แลวตอบคาถาม 1. ตรวจสอบการใชงาน format string ทไมตรงกบชนดของตวแปรทกาหนดไว โดยเขยนโปรแกรมกาหนดชนดตวแปรเปน float แตใชคาสง scanf รบคาตวแปรนนทใช format %d Q : เกด error ขนหรอไม และตองแกไขอยางไร 2. ตรวจสอบการใชงาน format string ทไมตรงกบชนดของตวแปรทกาหนดไว โดยเขยนโปรแกรมกาหนดชนดตวแปรเปน int แตใชคาสง printf แสดงผลตวแปรนนทใช format %f Q : เกด error ขนหรอไม และตองแกไขอยางไร 3. เขยนโปรแกรมคานวนคาตวเลขสองชดคอ 2/3 และ 2.0/3 Q : 2/3 ไดผลลพธเปนเทาใด Q : 2.0/3 ไดผลลพธเปนเทาใด Q : เหตใดจงเปนเชนนน 4. จงอธบายขนตอนการทางานของการคานวณตวเลขตอไปน วามการทางานอะไรบางจงไดผลลพธของการคานวณและไดผลลพธเปนเทาใด 4+5*2+3/4 (4+5)*(2+3)/4 (4+5*2+3)/4 4+5*(2+3/4)
©2011 CE-KMITL v0.1
62
(4+5)*(2+3/4) 5. จงอธบายวา คาสงทงสามคาสงตอไปน มผลลพธตางกนอยางไร เพราะเหตใด a. printf("principle of computer programming"); b. printf("principle \t of \t computer \t programming"); c. printf("principle \n of \n computer \n programming");
การทดลองท 3.3 ใหนกศกษาเขยนโปรแกรมตอไปน 1. จงเขยนโปรแกรมคานวณพนทและเสนรอบวงของสเหลยมผนผาโดยเขยนโปรแกรมรบคาตวเลขดานกวางและยาวจากคยบอรด 2. เขยนโปรแกรมเพอหามมภายในของรป n เหลยมใดๆ โดยรบคา n จากผใชโปรแกรม (Hint : มมภายในรปสามเหลยมคอ 180 องศา) 3. เขยนโปรแกรมทสามารถรบประโยคทมความยาวเกน 5 ตวอกษร แลวใหคอมพวเตอรแสดงคาเฉพาะตวอกษร 5 ตวแรก ชดขอบขวามอของจอภาพ (Hint : จอภาพมความกวาง 80 ตวอกษร)
©2011 CE-KMITL v0.1
63
บทท 4 ผงงาน และการเขยนโปรแกรมกาหนดเงอนไข
วตถประสงคการศกษา 1) เขยนผงงานโปรแกรมจากโจทยปญหาได 2) เขยนโปรแกรมจากผงงานทสรางขนได 3) เขยนผงงานและโปรแกรมทมการกาหนดเงอนไขได
4.1 การพฒนาโปรแกรมคอมพวเตอร การเขยนโปรแกรมทมความซบซอนมาก โปรแกรมเมอรหรอผเขยนโปรแกรมจาเปนตองมทกษะในการวเคราะหและพฒนา ทกษะเหลานเรมตนพฒนาไดโดย เขาใจกระบวนการวเคราะหและแกปญหา กระบวนการหลกๆมดงน กอนการพฒนาโปรแกรม:
1) โปรแกรมเมอรตองทาความเขาใจกบปญหา วเคราะหรปแบบ สงทจาเปน 2) โปรแกรมเมอรตองคดวางแผนวธการแกไขปญหานน
ในขณะทกาลงพฒนาโปรแกรม: 1) พจารณาถงโครงสราง หรอชดคาสงทมของภาษาคอมพวเตอร ทใชอย วาคาสงมการเรยกใชซาซอน
โครงสรางมซาซอน หรอสามารถลดรปกระบวนการใดๆลงได 2) ทาตามหลกการการพฒนาโปรแกรมทดตลอดเวลา
กระบวนการพฒนาโปรแกรมมสงตางๆทใช เชน อลกอรทม (alogorithm) เปนลกษณะคาสงซงเขยนในรปยอ อาจะเขยนเปนประโยคทสอความเขาใจไดโดยงาย ทาใหโปรแกรมเมอรมองเหนภาพกระบวนการทางานของโปรแกรม ผงงาน (flowchart) เปนผงรปสญลกษณแสดงขนตอนกระบวนการทางาน ผงงานชวยใหโปรแกรมเมอรเหนภาพวาสวนงานใดมความซบซอน ผเรมเขยนโปรแกรมหรอนศ.ความเรมจากการศกษาลองวาด flowchar กอนการเขยนโปรแกรมเพอใหเหนภาพของกระบวนการทางานของโปรแกรม
อลกอรทม (Algorithm)
Problem สามารถทจะแกไขปญหาเหลานนไดโดยการทางานตามชดคาสงอยางมลาดบ Algorithms ขนตอนทระบถงวธการแกไขปญหาหรอทาใหงานสาเรจ มลาดบการทางานทแนนอน มความชดเจน สามารถทางานได มจดสนสดการทางานทชดเจน Representation วธการแปล Algorithm เปนภาษาคอมพวเตอร
ตวอยางอลกอรทมแสดงโปรแกรมทางานคานวณเลข //algorithm กาหนดคาเรมตนเรยกใช กาหนดตวแปรทใชงาน รบคาจากkeyboard เกบในตวแปร
//โปรแกรม #include<stidio.h> int main() { int a;
©2011 CE-KMITL v0.1
64
ถาตวแปรมคาเปน 10 แสดงคาวา hello world ถาไมใช แสดงคาวา bye
printf("Value ="); scanf("%d",&a); if(a==10) printf("hello"); else printf("bye"); return 0; }
ขนตอนการคด 1) ทาความเขาใจกบปญหา 2) พจารณาหาแนวคดถงขนตอนการแกไขปญหาทมอย (ซงอาจจะมหลายวธการในการแกไขปญหาหนง ๆ) 3) พฒนาโปรแกรมตามแนวคดทคดไวตามขนตอนท 2 4) ประเมนความถกตองของโปรแกรม และลองพจารณาถงความสามารถทจะใชโปรแกรมนกบปญหาอน ๆ ไดหรอไม
4.1 ผงงาน (Flowchart) แผนภาพซงแสดงลาดบขนตอนของการทางาน โดยแตละขนตอนจะแสดงโดยใชสญลกษณ ซงมความหมายบงบอกวาขนตอนนนๆ มลกษณะการทางานแบบใด และในแตละขนตอนจะเชอมโยงกนดวยลกศรเพอทจะแสดงลาดบการทางาน ประโยชนของผงงาน
• ชวยใหสามารถทาความเขาใจลาดบขนตอนการทางานของโปรแกรมหรอระบบใดๆไดอยางรวดเรว • ชวยแสดงลาดบขนตอนการทางาน ทาใหสามารถเขยนโปรแกรมไดอยางเปนระบบไมสบสน • ชวยในการแกไขขอผดพลาดของโปรแกรมไดรวดเรว และชวยใหผพฒนาโปรมแกรมตอสามารถทางานไดงายสะดวก
ขน • งายแกบคคลภายนอกในการตดตามขนตอนของการปฏบตงาน
ประเภทของผงงาน
• ผงงานระบบ (System Flowchart) เปนผงงานซงแสดงขอบเขต และลาดบขนตอนการทางานของระบบหนงๆ รวมทงแสดงรปแบบของขอมลเขา และขอมลออกวาถกรบเขาหรอแสดงผลโดยผานสอประเภทใด เนองจากผงงานระบบเปนแผนภาพทแสดงถงระบบโดยรวม ดงนนกระบวนการหรอโปรแกรมหนงๆ อาจถกแสดงเปนเพยงขนตอนหนงในผงงานระบบเทานน
• ผงงานโปรแกรม (Program Flowchart)เปนผงงานซงแสดงลาดบขนตอนการทางานของโปรแกรมหนงๆ สญลกษณทใชในการเขยนผงงาน
สญลกษณ ความหมาย
แทนการเรมตน หรอสนสดของผงงาน
แทนการรบขอมลหรอปอนขอมลเขาทางแปนพมพ
แทนการแสดงผลลพธบนหนาจอภาพ
แทนการกาหนดคาหรอการคานวณคา
แทนการเปรยบเทยบ
©2011 CE-KMITL v0.1
65
แทนจดตอเนองทอยหนาเดยวกน
แทนจดตอเนองทอยคนละหนากน
แทนการเรยกใชฟงกชนทสรางขน หลกเกณฑในการเขยนผงงาน
1) สญลกษณทใชอาจมขนาดตางๆกนได แตจะตองมรปรางเปนสดสวนตามมาตรฐาน 2) ทศทางของลกศรในผงงาน ควรจะมทศทางจากบนลงลาง หรอจากซายไปขวา 3) ผงงานควรมความเรยบรอย สะอาด พยามยามหลกเลยงการเขยนลกศรททาใหเกดจดตด เพราะจะทาใหอานและทา
ความเขาใจผงงานไดยาก 4) ถาในผงงานมการเขยนขอความอธบายใดๆ ควรทาใหสนกะทดรดและไดใจความ อาจเขยนเปนคาสงทอยใน
สญลกษณ หรอใชคาพดแทน แนวทางการสรางผงงานสาหรบการเขยนโปรแกรม
1) การวเคราะหขอมลเอาทพท หรอผลลพธ (Output Analysis) วเคราะหความตองการของผใช หรอผลลพธจากโจทยปญหา
2) การวเคราะหขอมลอนพท (Input Analysis) วเคราะหขอมลทผใชปอน หรอขอมลทโจทยใหมา 3) การวเคราะหกระบวนการทางาน (Process Analysis) วเคราะหขนตอนการทางานทใหไดมา ซงผลลพธ 4) การกาหนดตวแปร (Variable Define) กาหนดตวแปรทใชงานการเขยนโปรแกรมเพอความถกตอง
โปรแกรม 4.1 การสรางโปรแกรมคานวณหาพนทวงกลม
เขยนผงงาน และโปรแกรมคานวณหาพนทวงกลม 1) Output Analysis ผลลพธทตองการ คอ พนทของวงกลม 2) Input Analysis การคานวณหาพนทวงกลม จาเปนตองทราบขนาดของรศม (หรอเสนผานศนยกลาง)
3) Process Analysis • รอรบคารศม (หรอเสนผานศนยกลาง) จากผใชงาน • คานวณหาพนทวงกลมจากสตร • แสดงผลคาพนทวงกลมออกทางหนาจอ
4) Variable Define radius : เปนตวแปรชนดจานวนทศนยมสาหรบรบคารศม pi : เปนตวแปรชนดจานวนทศนยมสาหรบเกบคา area : เปนตวแปรชนดจานวนทศนยมสาหรบเกบคาพนท
©2011 CE-KMITL v0.1
66
5) วาดผงงาน
6) เขยนโปรแกรม #include<stdio.h> int main() { float radius, pi, area; pi = 22.0/7; // pi = 3.14; printf ("Enter Radius of Circular : "); scanf ("%f",&radius); area = pi * radius * radius; printf ("Area of Circular : %f",area); return 0; }
4.2 การเขยนโปรแกรมแบบกาหนดเงอนไข ในการเขยนโปรแกรมสาหรบงานสวนใหญ จาเปนตองมการทดสอบเงอนไขบางอยางกอน เพอตดสนในเลอกการทางานของโปรแกรมในอนดบถดไป คาสงควบคมการทางานของโปรแกรมทนยมใชมอย 2 คาสง คอ คาสง if และ คาสง if … else ซงจะพจารณาเลอกกระทาหรอไมกระทาจากการพสจนนพจนวาเปน จรง หรอ เทจ โดยจะใชควบคกบเครองหมายเปรยบเทยบ และเครองหมายทางตรรกะศาสตร
4.2.1 การเปรยบเทยบ
ผลของการเปรยบเทยบจะไดคาจรง (คาทไมใช 0) หรอคาเทจ (คาทเปน 0)
©2011 CE-KMITL v0.1
67
ไมควรใชเครองหมายเทากบ == หรอไมเทากบ != สาหรบขอมลทศนยม
4.2.2 เปรยบเทยบทางตรรกศาสตร
AND
OR
Invert
ตวอยางการเขยนเงอนไข กาหนดให int num1 = 10, num2 = 20, num3 = 30; ถาเขยน num1 == num2 ผลลพธ เทจ (false) num1 > num2 ผลลพธ ……………… num1 > num2 > num3 ผลลพธ ……………… (num1<num2) && (num2<num3) ผลลพธ……………… (num1>num2) || (num1>num3) ผลลพธ……………… (num1>num2) || (num2<num3) ผลลพธ………………
4.3 คาสงเงอนไข if
©2011 CE-KMITL v0.1
68
รปแบบท 1 if( expression ) statement1;
รปแบบท 2 ใชปกกาขยาย statement if( expression ) { statement1.1; statement1.2; statement1.3; }
int a = ; int b = ; if (a>b) { statement 1; statement 2; statement n; } printf();
โปรแกรม 4.2 โปรแกมตรวจสอบคะแนน
เขยนผงงานและโปรแกรมรบชอนามสกล รหสนกศกษา คะแนนสอบรวม และคะแนนเตม หากนกศกษาสอบได มากกวา 60% ใหแสดงผลชอ นามสกล รหสนกศกษา คะแนน และผลสอบวาผาน เรมตนโดย 1) Output analysis แสดงผลชอ-สกล รหสนกศกษา คะแนนสอบ ผลสอบ 2) Input analysis ชอ / นามสกล / รหสนกศกษา / คะแนนสอบ / คะแนนเตม 3) Process analysis
• โปรแกรมรอรบชอ / นามสกล / รหสนกศกษา / คะแนนสอบ / คะแนนเตม ตรวจสอบวาคะแนนมากกวาหรอเทากบ 60 % หรอไม
• ถาจรง แสดงผลชอ-สกล รหสนกศกษา คะแนน และแสดงวาสอบผาน 4) Variable define first : ตวแปรชนดขอความสาหรบเกบชอขนาด 20 last : ตวแปรชนดขอความสาหรบเกบนามสกลขนาด 20 id : ตวแปรชนดขอความสาหรบเกบรหสนกศกษาขนาด 9 point : ตวแปรชนดจานวนทศนยมสาหรบเกบคะแนนรวม full : ตวแปรชนดจานวนทศนยมสาหรบเกบคะแนนเตม ใน flowchart นยกตวอยางในกรณทหนากระดาษไมพอในการวาดจะใชสญลกษณจดเชอมตอ เชอมตอ
#include<stdio.h> int main()
©2011 CE-KMITL v0.1
69
ระหวางหนา
{ char first[20], last[20], id[9]; float point,full; printf ("Enter your Name : "); scanf ("%s",first); printf ("Enter your Surname : "); scanf ("%s",last); printf ("Enter your ID : "); scanf ("%s",id); printf ("Enter your examination points : "); scanf ("%f",&point); printf ("Enter your total points : "); scanf ("%f",&full); if ((point/full) >= 0.6) { printf ("Name : %s %s\n",first,last); printf ("ID : %s\n",id); printf ("Examination points : %f / %f\n",point,full); printf ("You passed, Congratulation\n"); } return 0; }
4.4 คาสงเงอนไข if-else รปแบบท 1 if( expression ) statement1; else statement2;
รปแบบท 2 ใชปกกาขยาย statement if( expression ) { statement1.1; statement1.2; statement1.3; } else { statement2.1; statement2.2; statement2.3;
}
END
"passed"
False
True
point/full>=0.6
point, full
first, last, id
first, last, id,point, full
START
1
1
©2011 CE-KMITL v0.1
70
โปรแกรม 4.3 หารเลข 2 จานวน
จงเขยนผงงานและโปรแกรมหารเลข 2 จานวน โดยโปรแกรมตองตรวจสอบไดวาตวหารเปน "0" หรอไม 1) Output analysis แสดงผลหารของเลข 2 จานวน แสดงผลวาไมสามารถหารไดเพราะตวหารเปนศนย 2) Input analysis ตวตง และตวหาร
#include<stdio.h> int main() { float num1,num2; printf ("Enter number 1 : "); scanf ("%f",&num1); printf ("Enter number 2 : "); scanf ("%f",&num2); if (num2 != 0) printf ("%.2f / %.2f = %.2f",num1,num2,num1/num2); else printf ("Error divided by zero\n"); return 0; }
4.4 คาสงเงอนไข if-else ลกษณะผกกน //รปแบบท 1 if (expression-1) statement-1; else if (expression-2) statement-2; ... ... else if (expression-m) statement-m; else statement-m+1;
//รปแบบท 2 if (expression-1) { statement-1.1; ... statement-1.n; } else if (expression-2) { statement-2.1; ... statement-2.n; } ... ... else if (expression-m) { statement-m.1; ... statement-m.n; } else { statement-m+1.1; ... statement-m+1.n;
END
num1/num2
False
True
num2 != 0
num2
num1
num1, num2
START
"Error"
1
1
©2011 CE-KMITL v0.1
71
}
โปรแกรม 4.4 แสดงเกรด A ถง F
จงเขยนผงงานและโปรแกรมสาหรบรบชอ นามสกล รหสนกศกษา และคะแนนวชา Computers and Programming เพอตรวจสอบวานกศกษาไดเกรดระดบใด โดยใชเกณฑดงน คะแนน 90 – 100 ไดเกรด A คะแนน 80 – 89.99 ไดเกรด B คะแนน 70 – 79.99 ไดเกรด C คะแนน 60 – 69.99 ไดเกรด D คะแนน 0 – 59.99 ไดเกรด F แสดงผลลพธ ชอ สกล รหสนกศกษา คะแนน และเกรด เรมตนโดย 1) Output analysis แสดงชอ นามสกล รหสนกศกษา คะแนน และเกรดทได 2) Input analysis ชอ / นามสกล / รหสนกศกษา / คะแนน 3) Process analysis
• โปรแกรมรอรบชอ / นามสกล / รหสนกศกษา / คะแนนสอบ • แสดงผลชอ-สกล รหสนกศกษา และคะแนน • ตรวจสอบคะแนนสอบ
o ถามากกวาหรอเทากบ 90 แสดงผลวาไดเกรด A o ถามากกวาหรอเทากบ 80 แสดงผลวาไดเกรด B o ถามากกวาหรอเทากบ 70 แสดงผลวาไดเกรด C o ถามากกวาหรอเทากบ 60 แสดงผลวาไดเกรด D o ถาไมตรงเงอนไขทผานมาทงหมด แสดงผลวาไดเกรด F
4) Variable define first : ตวแปรชนดขอความสาหรบเกบชอขนาด 20 last : ตวแปรชนดขอความสาหรบเกบนามสกลขนาด 20 id : ตวแปรชนดขอความสาหรบเกบรหสนกศกษาขนาด 9 point : ตวแปรชนดจานวนเตมสาหรบเกบคะแนน Flowchart หนาหนง
Flow chart หนาสอง
#include <stdio.h> int main(void) {//เขยนcode ประกาศตวแปร //เขยน code รบคาจาก keyboard เกบในตวแปร //เขยน code เปรยบเทยบและแสดงผล if(point>=90) printf(“A”); else if(point>=80) printf(“B”);
first, last, id, point
first, last, id, point
"Grade A"
START
first, last, id, point
a b
True
False
point>=90
©2011 CE-KMITL v0.1
72
return 0; }
4.4 คาสง switch case switch (expression-1) { case constant-expr-1: statement-1.1; statement-1.2; ... statement-1.n; break; case constant-expr-2: statement-2.1; statement-2.2; ... statement-2.n; break; default: statement-d.1; statement-d.2; ... statement-d.n; }...
//ตวอยางโปรแกรมแสดงการใชงาน switch case #include<stdio.h> int main() { int d; printf("Enter a number from 1 to 9: "); scanf("%d", &d); switch (d) { case 1: puts("A stitch in time saves nine."); break; case 2: //กรณเตมคาสง break; case 6: //กรณเตมคาสง break; case 9: puts("Handsome is as handsome does."); break; default: puts("Very clever. Try again."); } return 0; }
คาสง break คอ default คอ
4.5 คาถามทายบท 1) จงเขยนผงงานโปรแกรมเครองคดเลขทมตวอยางผลการรนดงตอไปน
"Grade C"
True "Grade D"False
END
"Grade F"
point>=60
True
False
point>=70
True
False
point>=80 "Grade B"
a b
©2011 CE-KMITL v0.1
73
Enter Num1 : 3 Enter Num2 : 6 Calculator Menu : 1. + 2. – 3. * 4. / 5. % Choose menu : 1 Ans: Num1 + Num2 = 9
2) จงเขยนโปรแกรมเพอแยกสาร 5 ชนดซงแตละชนดมคณสมบตดงตอไปน ชนดท 1 มคารบอนเปนองคประกอบ, ม 5 อะตอม, เปนกาซ ชนดท 2 มคารบอนเปนองคประกอบ, ม 6 อะตอม, เปนของเหลว ชนดท 3 มไนโตรเจนเปนองคประกอบ, ม 6 อะตอม, เปนกาซ ชนดท 4 มไนโตรเจนเปนองคประกอบ, ม 4 อะตอม, เปนของแขง ชนดท 5 เปนสารชนดท 1 และม ไฮโดรเจนเปนองคประกอบ 3) มสวนของคาสง switch อยใหหาคา x , y และ z หลงจากผานสวนของคาสง switch น โดยกาหนดให x = 1, y = 0 และ z = 0 switch(x%2) { case 0 : x = 2; y = 3; case 1 : x = 4; break; default : y = 3; x = z; }
©2011 CE-KMITL v0.1
74
การทดลองท 4 การเขยนโปรแกรมแบบกาหนดเงอนไข
วตถประสงค 1. เพอใหนกศกษาเขาใจหลกการเขยนโปรแกรมกาหนดเงอนไขและสามารถใชงานไดอยางถกตอง
ทฤษฎ การกาหนดเงอนไขการทางานตางๆ ในโปรแกรมจะทาใหโปรแกรมมความสามารถในการทางานมากขน ทงน โปรแกรมเมอรตองทาความเขาใจกบตรรกศาสตรเปนอยางมาก เนองจากเปนสวนทมความสาคญสงสด สาหรบการเขยนโปรแกรมกาหนดเงอนไขในภาษา C นนมคาสงทสามารถกาหนดเงอนไขการทางานอย 2 คาสง คอ if และ if – else คาสง if รปแบบคาสง if (expression) statement; ผงงาน
รายละเอยดการใชงานคาสง เปนคาสงทใชในการกาหนดเงอนไขวาจะใหโปรแกรมทางาน Statement หรอไม โดย ถา expression มผลลพธเปน TRUE จะทางาน Statement ถา expression มผลลพธเปน FALSE จะไมทางาน Statement การใชงานจงใชในสถานการณทโปรแกรมเมอรตองการใหโปรแกรม ทา หรอ ไมทา statement โดยโปรแกรมเมอรตองเปนผกาหนดเงอนไขเอง คาสง if-else รปแบบคาสง if (expression) statement-1; else statement-2; ผงงาน
รายละเอยดการใชงานคาสง สาหรบคาสง if – else จะมความแตกตางจากคาสง if เลกนอย โดยคาสง if – else จะมการทางานในลกษณะของการเลอกทา ระหวาง Statement1 กบ Statement2 ดงนน หมายความวาในคาสง if – else นน จะตองมการทางานของStatement ใด Statement หนงแนนอน เทคนคการใชงานคาสง ในการเขยนโปรแกรมคาสง if และ if – else นนจะมรปแบบการเขยนโปรแกรมทชวยใหเราสามารถเขยนโปรแกรมไดงายขน และสามารถรองรบการกาหนดเงอนไขทซบซอนมากๆ ได โดยมเทคนค 2 เทคนค คอ
©2011 CE-KMITL v0.1
75
1. การเขยนโปรแกรมใหมการทางาน statement มากกวา 1 statement เนองจากรปแบบของคาสง if และ if – else อนญาตใหมการกาหนด statement ทจะทางานไดเพยง statement เดยวตอคาสง if หรอ if – else หนงคาสง แตในการเขยนโปรแกรมเราจะพบวามบอยครงทจะตองมการทางานมากกวา 1 statement เชนกรณการโอนเงนจะตองมการกาหนดเงอนไขคอถามการโอนเงน ตองมการถอนจากบญชตนทาง ไปฝากยงบญชปลายทาง ซงถาเงอนไขการโอนสมบรณ เราตองมการทางาน 2 การทางานพรอมๆ กน ไมสามารถแยกการทางานทง สองออกจากกนได การทางานเมอมการโอนเงนคอ 1. จานวนเงนฝากบญช A = จานวนเงนฝากบญช A – เงนโอน ; 2. จานวนเงนฝากบญช B = จานวนเงนฝากบญช B + เงนโอน ; ซงในเชงการเขยนโปรแกรมโดยใชคาสง if แลว เราจะไมสามารถปรบยอดบญชทงสองไดโดยใช Statement เพยง 1 Statement เทานน จากตวอยางคาสง If (รายละเอยดการโอนเงนจากบญช A ไปยงบญช B สมบรณ) จานวนเงนฝากบญช A = จานวนเงนฝากบญช A – เงนโอน ; จานวนเงนฝากบญช B = จานวนเงนฝากบญช B + เงนโอน ; ถาเขยนตดกนตามตวอยาง จะมการทางานทผดพลาด นนคอ จะมคาสง 2 คาสงททางานไมสมพนธกน คอ If (รายละเอยดการโอนเงนจากบญช A ไปยงบญช B สมบรณ) จานวนเงนฝากบญช A = จานวนเงนฝากบญช A – เงนโอน ; และคาสง จานวนเงนฝากบญช B = จานวนเงนฝากบญช B + เงนโอน ; เขยนตดๆ กน ทาใหการทางานผดพลาด เพราะ ไมวารายละเอยดการโอนเงนจากบญช A ไปยงบญช B จะเปน TRUE หรอ FALSE จานวนเงนฝากในบญช B กจะถกปรบยอดเพมทนท ซงผดกระบวนการอยางยง ในภาษา C ไดกาหนดรปแบบใหสามารถแกปญหาดงกลาวไดโดยการกาหนดให การเขยน Statement หลายๆ Statement ในวงเลบปกกา คอมไพลเลอรจะถอวาเปน 1 Statement นนคอ { Statement; Statement; ….. } เราจงสามารถเขยนเงอนไขการทางานในการโอนเงนไดดงน If (รายละเอยดการโอนเงนจากบญช A ไปยงบญช B สมบรณ) { จานวนเงนฝากบญช A = จานวนเงนฝากบญช A – เงนโอน ; จานวนเงนฝากบญช B = จานวนเงนฝากบญช B + เงนโอน ; } ดงนนการเขยนโปรแกรมในคาสง if หรอ if – else ใหสามารถทางานกบ statement มากกวา 1 statement สามารถทาไดดงรปแบบตอไปน
©2011 CE-KMITL v0.1
76
2. การเขยนโปรแกรมเพอกาหนดเงอนไขแบบซบซอน มากกวา 1 ชน เงอนไขบางเงอนไข จะเปนเงอนไขทซบซอน ไมสามารถเขยนใน expression เพยง expression เดยวไดโดยเฉพาะการคานวณทางคณตศาสตรทมการทางานในแตละชวงเวลา หรอ การคดคานวณเปนลาดบชน เชนกรณการคานวณเกรดเฉลยของนกศกษา เปนตน ในการเขยนโปรแกรมเพอกาหนดเงอนไขแบบซบซอนมากกวา 1 ชน คอมไพเลอรอนญาตใหทาไดเนองจากคอมไพลเลอรมองวาคาสง if หรอคาสง if – else กเปน statement เชนเดยวกน ดงตวอยาง 1. if ( expression ) statement_A; else statement_B; 2. เมอเราแทนคา statement_B ดวย if ( expression ) statement_C; else statement_D; จะได If ( expression1 ) statement_A; else if (expression2 ) statement_C; else statement_D; 3. เมอเราแทนคา statement_D ดวย if (expression3) statement_E; จะได If ( expression1 ) statement_A; else if (expression2 ) statement_C; else if (expression3) statement_E; เปนตน ดงนนเราสามารถเขยนคาสง if – else ใหอยในรปแบบทมความซบซอน มการคานวณ expression ไดเปนลาดบ ชน ไดดงตวอยาง If (expression_A) statement_A; else if (expression_B) statement_B ; else if (expression_C) statement_C ; else ……. ตวอยางการใชงาน 1. กรณทตองการเขยนคาสงเพอใหแสดงขอความ “High Temperature” เมอตวแปร temperature มากกวา 100 สามารถเขยนคาสงไดดงน If (temperature > 100) printf (“High temperature!!!\n”); 2. กรณทตองการเขยนคาสงเพอใหแสดงรายงานความสมพนธระหวางตวแปร a กบตวแปร b สามารถเขยนคาสงไดดงน If (a > b ) printf (“A is greater than B”); else if (a == b) printf (“A and B are equal”); else printf(“B is greater than A”); 3. ตวอยางการเขยนโปรแกรมทมการใช if – else ทมการคานวณ expression หลายๆ ชนเชน คาสงทใชในการคานวณคะแนน เพอแสดงเกรดของนกศกษา ดงโปรแกรมตวอยาง #include <stdio.h> #include <conio.h>
©2011 CE-KMITL v0.1
77
main() { int point ; printf ("Enter your point : "); scanf("%d",&point) ; if (point >= 80) printf("%d point is Grade A",point); else if (point >= 70) printf("%d point is Grade B",point); else if (point >= 60) printf("%d point is Grade C",point); else if (point >= 50) printf("%d point is Grade D",point); else printf("F"); printf ("\n\nPress ENTER to end Program."); return 0; }
การทดลองท 4.1
จากตวอยางการใชงานคาสง ใหนกศกษาประยกตใชงานดงตอไปน 1. ใหนกศกษาเขยนคาสงทสามารถแสดงผลลพธของตวเลขทมคามากกวาทเกบอยในตวแปร a และ b 2. ใหนกศกษาเขยนคาสงทสามารถแสดงผลลพธของตวเลขทมคามากทสดทเกบอยในตวแปร a , b และ c
การทดลองท 4.2
ใหนกศกษาลองเขยนโปรแกรมตอไปนลองสงเกตผลลพธขณะ compile โปรแกรม หรอรนโปรแกรมแลวตอบคาถาม (a, b, c เปนตวแปรชนด int หรอ float กได) 1. ถาให a = 3 , b = 5 และ c = 7 คาสงตอไปนใหผลลพธคออะไร if (a>b && c>b) printf (“A”); else printf (“B”); if (a<b || c>b) printf (“A”); else printf (“B”); if (a>b || c<b) printf (“A”); else printf (“B”); if (a>c && c>b) printf (“A”); else printf (“B”); 2. การเขยนโปรแกรมแบบใช if เรยงกน กบการใช if ซอน if ใหผลลพธทมความแตกตางกน นกศกษาลองเขยนโปรแกรมแลวตอบคาถาม (กาหนด a = 10 , b= 5 และ c=2) Case 1: if (a>b) printf (“a>b”); if (b>c) printf(“b>c”); if (c>a) printf(“c>a”); Case 2: if (a>b) printf (“a>b”); else if (b>c) printf(“b>c”); else if (c>a) printf(“c>a”); Q : ผลลพธของ Case 1 คออะไร
©2011 CE-KMITL v0.1
78
Q : ผลลพธของ Case 2 คออะไร Q : เหตใดจงมความแตกตางกน
การทดลองท 4.3 ใหนกศกษาเขยนโปรแกรมตอไปน
1) จงเขยนโปรแกรมเพอรบคาตวแปรเปนตวเลขจานวนเตม 2 จานวน แลวแสดงผลลพธตวเลขทมคามากกวา 2) จงเขยนโปรแกรมเพอรบคาตวแปรเปนตวเลขจานวนเตม 3 จานวน แลวแสดงผลลพธตวเลขทอยตรงกลางระหวาง
เลขทมากทสด กบเลขทนอยทสด 3) จงเขยนโปรแกรมเพอรบคาตวแปรเปนตวเลขจานวนเตม 1 จานวนแลวแสดงผลลพธวาตวเลขทรบเขามาเปนเลขค
หรอเลขค 4) จงเขยนโปรแกรมเพอรบตวเลขจานวนเตม 3 จานวน แลวแสดงผลลพธเปนผลบวกของตวเลขทมากทสดกบตวเลขท
นอยทสด 5) จงเขยนโปรแกรมเพอรบคาตวเลขจานวนเตม 3 จานวน แลวแสดงผลลพธวา ถาตวเลขทงสามเปนความยาวของดาน
ของสามเหลยมหรอไม ถาเปนสามเหลยม สามเหลยมรปนนจะเปนสามเหลยมมมฉากหรอไม 6) แกไขโปรแกรมในขอ 5 โดยใหสามารถรบตวเลขทศนยมได
©2011 CE-KMITL v0.1
79
บทท 5 การเขยนโปรแกรมแบบวนซา
วตถประสงคการศกษา • นกศกษาเขาใจกระบวนการทางานแบบวนซา • นกศกษาสามารถเขยนโปรแกรมภาษาซโดยใชคาสงเพอใหคอมพวเตอรทางานแบบวนซาได
5.1 บทนา คาสงการวนซาดวย while คาสงการวนซาดวย do - while คาสงการวนซาดวย for ทาไมตองการเขยนโปรแกรมตองมการวนซา เพราะ เหตการณทเกดขนหลายรอบ เชน โปรแกรมแสดง ชอ 20 ครง เหตการณทเกดขนหลายรอบ โดยมการเปลยนแปลงคา หรอมเงอนไข เชน แสดงผลเลข 0, 1, 2, … , 10 แสดงผลรวมของ 1,3,5,7, … , 99 แสดง ชอ ไปเรอย ๆ จนกวาคา X จะมากกวา 30
โปรแกรม 5.1 ไมมการวนซา
จงเขยนผงงานและโปรแกรมเพอแสดงตวเลข 0 - 10 ออกทางหนาจอ 1) Output analysis แสดงผลเลข 0, 1, 2, … , 10 2) Input analysis ไมม 3) Process analysis โปรแกรมแสดงผลเลข 0, 1, 2, … ,10 4) Variable define ไมใช (หรอใช count เพอเพมคา) #include<stdio.h> #include<conio.h> int main() { printf ("0\t"); printf ("1\t"); printf ("2\t"); printf ("3\t"); printf ("4\t"); ... ... printf ("10\t"); return 0; }
#include<stdio.h> #include<conio.h> int main() { int count = 0; printf ("%d\t",count++); printf ("%d\t",count++); printf ("%d\t",count++); printf ("%d\t",count++); printf ("%d\t",count++); ... ... printf ("%d\t",count++); return 0; }
#include<stdio.h> #include<conio.h> int main() { int count = 0; while (count <= 10) //คาสงวนซา { printf ("%d\t",count++); } return 0;
©2011 CE-KMITL v0.1
80
}
5.2 คาสง while //รปแบบท 1 while(expression) statement-1;
//รปแบบท 2 ใชปกกาขยาย statement while(expression) { statement-1.1; statement-1.2; statement-1.3; }
อธบาย
โปรแกรม 5.2 แสดงเลข 0..10 ดวย while
จงเขยนผงงานและโปรแกรมเพอแสดงตวเลข 0 - 10 ออกทางหนาจอ 1) Output analysis แสดงผลเลข 0, 1, 2, … , 10 2) Input analysis ไมม 3) Process analysis โปรแกรมแสดงผลเลข 0, 1, 2, … ,10 4) Variable define count เปนจานวนเตมเพอใชนบจานวนรอบ
#include<stdio.h> int main() { int count = 0; printf ("Show number from zero to ten\n\n"); while (count<=10) { printf ("%d\t",count); count++; } return 0; }
โปรแกรม 5.3 หาผลรวมของเลขใช while
จงเขยนผงงานและโปรแกรมทมการควบคมทศทางแบบวนรอบโดยใชคาสง while เพอใหโปรแกรมทาการบวกเลขจานวนเตมตงแต 1 จนถงคาทผใชงานกาหนด 1) Output analysis ผลลพธการบวกเลขจานวนเตม ตงแต 1 ถงคาทผใชกาหนด 2) Input analysis คาทผใชงานปอนเขามา 3) Process analysis
START
count = 0
count<=10True
Falsecount++
count
END
©2011 CE-KMITL v0.1
81
• โปรแกรมถามวาผใชงานตองการบวกเลขตงแต 1 ถงเลขใด • วนรอบแบบ while เพอบวกคา • แสดงผลลพธทได
4) Variable define sum = 0 ผลรวมของการบวก โดยเรมตนมคาเทากบ 0 i = 1 คาทนาเขาไปบวกกบ sum ในแตละรอบ โดยรอบแรกคา i มคาเทากบ 1 และมคาเพมขนรอบละ 1 final เพอรบคาจากผใช และกาหนดจดสนสดของคา i
//…ละไมไดเขยนคาประกาศไลบาร int main() { int i = 1, final, sum=0; printf ("Enter final number : "); scanf ("%d",&final); while (i<=final) { sum = sum + i; i++; } printf ("Sum = %d",sum); return 0; }
5.3 คาสง do-while
คาอธบาย
โปรแกรม 5.4 หาผลรวม 1 ถง 100 ใช do-while
จงเขยนผงงานและโปรแกรมสาหรบรวมเลขจานวนเตม ตงแต 1 – 100 โดยใชคาสง do-while 1) Output analysis ผลรวมของเลขจานวนเตม ตงแต 1 - 100 2) Input analysis ไมม 3) Process analysis โปรแกรมทาการบวกคาเกบไวในตวแปรผลลพธ แลวเพมคาจนถง 100 4) Variable define count เปนตวแปรชนดจานวนเตมเพอนบจานวน sum เปนจานวนเตมเพอเกบคาผลรวม
START
i=1,final,sum=0
i<=finalTrue
Falsei++
sum
END
final
sum = sum + i
©2011 CE-KMITL v0.1
82
int main() { int count=1,sum=0; do { sum = sum + count; count++; } while(count<=100); printf ("Summation of 1 to 100 = %d",sum); return 0; }
5.4 คาสง for รปแบบ
initial เปนสวนทใชกาหนดคาเรมตนใหกบตวแปร condition เปนเงอนไขเพอพจารณา change เปนสวนทเปลยนแปลงคาตวแปร statement-1, 2, ... , n เปนคาสงทจะทางานเมอเงอนไขเปนจรง
โปรแกรม 5.5 โปรแกรมหาผลรวม 1 ถง 100 ใช for
จงเขยนผงงานและโปรแกรมสาหรบรวมเลขจานวนเตม ตงแต 1 – 100 โดยใชคาสง for 1) Output analysis ผลรวมของเลขจานวนเตม ตงแต 1 - 100 2) Input analysis ไมม 3) Process analysis โปรแกรมทาการบวกคาเกบไวในตวแปรผลลพธ แลวเพมคาจนถง 100 4) Variable define count เปนตวแปรชนดจานวนเตมเพอนบจานวน sum เปนจานวนเตมเพอเกบคาผลรวม
START
count=1, sum=0
count<=100True
False
count++
sum
END
sum=sum+count
©2011 CE-KMITL v0.1
83
int main() { int sum=0, count; for (count=1; count<=100; count++) { sum = sum + count ; } printf ("Summation of 1 to 100 = %d",sum); return 0; }
โปรแกรม 5.6 แสดงผล a – z ใช for
จงเขยนผงงานและโปรแกรมสาหรบแสดงผลอกษร a – z ออกทางจอภาพ โดยใชคาสง for 1) Output analysis แสดงผล a – z ทางจอภาพ 2) Input analysis ไมม 3) Process analysis โปรแกรมทาการวนรอบเพอแสดงผลอกษรตงแต a – z โดยการเพมคาตวแปรขนครงละ 1 (ดตาราง ASCII Code) 4) Variable define letter เปนตวแปรชนดอกขระ
#include<stdio.h> int main() { char letter; for (letter='a'; letter<='z'; letter++) { printf ("%c ",letter); } return 0; }
โปรแกรม 5.7 แสดงผลรปสเหลยม ใช for
จงเขยนผงงานและโปรแกรมแสดงผลรปสเหลยมขนาด n x n โดยโปรแกรมจะรอรบจานวนเตมจากผใชงาน ดงตวอยาง
START
sum=0
count<=100
True
False
count++sum
END
sum=sum+count
count=1
START
letter
letter<='z'True
Falseletter++
letter
END
letter='a'
©2011 CE-KMITL v0.1
84
1) Output analysis ผลตวเลข เปนรปสเหลยมจตรสขนาดเทากบจานวนตวเลขทรบเขามา 2) Input analysis เลขจานวนเตมทผใชปอนเขามา 3) Process analysis โปรแกรมรอรบคาจานวนเตมจากผใชงาน โปรแกรมวนรอบเพอทาการแสดง '*' เปนรปสเหลยมจตรส บรรทดท 1 แสดงผล '\n' แลวแสดงผล '*' จานวนเทากบคาทรบมา บรรทดท 2 แสดงผล '\n' แลวแสดงผล '*' จานวนเทากบคาทรบมา … บรรทดท n แสดงผล '\n' แลวแสดงผล '*' จานวนเทากบคาทรบมา 4) Variable define num เปนจานวนเตมเพอใชเกบคาตวเลขทผใชปอน i เปนจานวนเตมเพอใชนบจานวนบรรทด j เปนจานวนเตมเพอใชนบจานวน '*'
#include<stdio.h> int main() { int num,i,j; printf ("Enter number : "); scanf ("%d",&num); for (i=1; i<=num; i++) { printf ("\n"); for (j=1; j<=num; j++) { printf ("*"); } } return 0; }
5.4 คาถามทายบท 1) จงเขยนผงงาน และโปรแกรมคานวณดอกเบย โดยโปรแกรมรบ เงนตน (บาท) และดอกเบยตอป (%) จานวนเงนทผอนชาระตอเดอน แลวแสดงผลวาตองใชเวลากปในการผอนชาระ และจายดอกเบยทงหมดคดเปนเทาใด 2) จงเขยนโปรแกรมแสดงรหสแอสก ตงแต 33 ถง 55 Decimal ASCII
START
num, i, j
i<=numTrue
False
'\n'
END
i=1
num
i++
j<=num
j=1
j++
'*'True
False
©2011 CE-KMITL v0.1
85
33 ! 34 “ 35 # . . . 55 7 3) จงเขยนโปรแกรมรบตวเลขเพอมาคานวณหาผลบวกกาลงสอง จนกระทงตวเลขทรบเขามามคาเปน 0 Enter a number : 2 Enter a number : -5 Enter a number : 0 Result : 29 4) ขอใดเปนโปรแกรมทรนไมรจบ (Infinite loop) เมอกาหนด int i=0; 4.1 for(i=0; i>0; i++) printf("%d",i); 4.2 for(i=0; i%2!=0; i += 2) puts("a"); 4.3 while(i<7) printf("%d",i--); 4.4 do { i+=3; } while(i%3==0);
©2011 CE-KMITL v0.1
86
การทดลองท 5 การเขยนโปรแกรมแบบวนซา
วตถประสงค 1. เพอใหนกศกษาทดลองเขยนโปรแกรมเรยกใชคาสงวนซา 2. เพอใหนกศกษาสามารถเขยน และเขาใจหลกการเขยนโปรแกรมแบบวนซา
ทฤษฎ การเขยนโปรแกรมแบบวนซาจะเปนการเขยนโปรแกรมทชวยใหโปรแกรมเมอรไมจาเปนตองมการพมพขอมลหลายๆ บรรทด สามารถลดขนาดของไฟลลงไดมาก และสามารถเพมความเรวในการทางานตางๆ ได สาหรบการเขยนโปรแกรมแบบวนซานนจะมคาสงทเกยวของทงหมด 3 คาสงดวยกน คอคาสง for , while และคาสง do … while ซงคาสงทงสามคาสงสามารถทางานทดแทนกนได เนองจากการเขยนโปรแกรมแบบวนซามคาสงทเกยวของอย 3 คาสง ในการเลอกใชคาสงใหตรงตามการทางานของผใชงานจะทาใหการเขยนโปรแกรมทาไดอยางสะดวกมากขน โดยการเลอกใชงานคาสงตางๆ สามารถยดหลกดงน
1) เมอผใชงานทราบจานวนของการวนซาทแนนอน ทราบวาตองเรมทคาเทาใด จบทคาเทาใด หรอทราบวาตองทางานนนๆ กรอบ ควรใชคาสง for
2) เมอผใชงานไมทราบจานวนการทางานทแนนอน แตทราบเฉพาะเงอนไขการทางานวาการทางานแบบวนซา ทางานเมอเงอนไขเปนอยางไร ถาไมตรงตามเงอนไขทกาหนดไว จะหยดการทางาน ควรใชคาสง while
3) เมอผใชงานไมทราบจานวนการทางานทแนนอน แตทราบเฉพาะเงอนไขการทางานวาการทางานแบบวนซา จะทางานจนกวาจะเกดเงอนไขใดขน จงหยดทางาน ควรใชคาสง while
คาสง or รปแบบคาสง for (initial; expression; change) statement; ผงงาน
รายละเอยดการใชงานคาสง คาสง for เปนคาสงใหทาซาหรอวนรอบ เมอเงอนไขสอดคลองหรอ เงอนไขเปนจรง จะทางานในขอบขายทกาหนดไว และจะเลกกระทาซาหรอวนรอบ เมอเงอนไขไมสอดคลองหรอ เงอนไขเปนเทจ เชน ถาตองการใหพมพคาวา Engineer จานวน 10 ครง เราสามารถเขยนคาสงไดดงน For ( i=1 ; i<=10 ; i++ ) printf(“Engineer\n”); จากรปแบบคาสงเราจะไดความสมพนธจากตวอยางดงน Initial คอ i = 1 Expression คอ i < 10 Change คอ i++ Statement คอ printf (“Engineer\n”)
©2011 CE-KMITL v0.1
87
จากผงงานเราจะไดรปแบบและขนตอนการทางานคอ กอนจดเรมการทางานแบบวนซา จะมการตงคา i มคาเทากบ 1หลงจากนนจงมการตรวจสอบวาคา i นอยกวาหรอเทากบ 10 หรอไม ถา i นอยกวาหรอเทากบ 10 เปนจรงจะแสดงผลคาวาEngineer หนงครง แลวจงมการเพมคา i ทละ 1 แลวกลบไปพจารณาทจดเรมของการทางานแบบวนซาอกครง การทางานจะเปนไปอยางนเรอยๆ จนกวาคา i จะมากกวา 10 คา expression จะเปน False แลวจบการทางานของคาสงน คาสง while รปแบบคาสง while (expression) statement; ผงงาน
รายละเอยดการใชงานคาสง คาสง while เปนคาสงใหทาซา หรอวนรอบเมอเงอนไขสอดคลองหรอเงอนไขเปนจรง สาหรบ while จะมความแตกตางจาก for คอจะไมมการกาหนดคาเรมตนตางๆ กอนการทางาน การทางานวนซาจะทางานในขอบขายทกาหนดไวและจะเลกทาซาหรอวนรอบเมอเงอนไขไมสอดคลองหรอผลลพธของเงอนไขเปนเทจ เชนตองการใหมการรบคาขอมลจากคยบอรดเปนตวเลขจานวนเตม 1 จานวน แลวโปรแกรมจะแสดงคาตวเลขเปนสองเทา ไปเรอยๆ โดยตวเลขมากทสดทจะแสดงจะไมเกน 30000 จะไดผลลพธดงน scanf (“%d”,&i); while (i<30000) { printf (“%d\n”,i); i=i*2; } จากรปแบบคาสงเราจะไดความสมพนธจากตวอยางดงน Expression i<30000 statement { printf (“%d\n”,i); i=i*2; } จากโปรแกรมตวอยาง กอนทจะมการทางานคาสง while จะมการรบคาจากคยบอรดโดยคาสง scanf เกบขอมลไวท ตวแปร i จากผงงานเราจะไดรปแบบและขนตอนการทางานคอ หลงจากจดเรมตนการทางานแบบวนซา จะมการตรวจสอบ expression วาคา i ทรบจากคยบอรดนน มคานอยกวา 30000 หรอไม ถาเปนจรงตามนนจะเรมทางาน statement คอการแสดงผลลพธคา i แลวเพมคา i เปนสองเทา แลวจงกลบไปทางานทจดเรมตนการทางานแบบวนซาอกครงหนง การทางานจะเปนอยางนเรอยๆ จนกวาคา i จะไมนอยกวา 30000 จากการทางานจะพบวาใน statement ของคาสง while จะมการเปลยนแปลงคาตวแปรทสงผลกบ expression อยทกๆรอบของการทางาน ถาไมมการเปลยนแปลงคาตวแปรทสงผลกบ expression จะทาใหเกด infinite loop ได ซง การศกษาตองระมดระวงเมอใชคาสง while ดวย คาสง do….while รปแบบคาสง do statement; while (expression); ผงงาน
©2011 CE-KMITL v0.1
88
รายละเอยดการใชงานคาสง คาสง do… while เปนคาสงทใหทาซา หรอวนรอบการทางานเมอเงอนไขเปนจรง สาหรบ do… while จะมความแตกตางจาก while คอจะมการตรวจสอบ expression หลงจากทมการทางาน statement เรยบรอยแลว การกาหนดคาเรมตนมกจะถกกาหนดกอนทจะเรยกใชคาสง do… while และจะมการเปลยนแปลงคาทสงผลกบ expression ใน statement นนๆการทางานวนซาจะทางานในขอบขายทกาหนดไวและจะเลกทาซาหรอวนรอบเมอเงอนไขไมสอดคลองหรอผลลพธของเงอนไขเปนเทจ เชนตองการใหมการวนรบคาตวเลขไปเรอยๆ จนกวาคาทไดรบจะมคาเปน 0 จะไดผลลพธของโปรแกรมดงน do { scanf(“%d”,&i); Printf(“Input = %d\n”,i); } while (I != 0); จากรปแบบคาสงเราจะไดความสมพนธจากตวอยางดงน Expression i != 0 Statement { scanf(“%d”,&i); printf(“Input = %d\n”,i); } จากโปรแกรมตวอยาง หลงจากจดเรมตนการทางานแบบวนซา จะม statement ในการรบตวเลขจากคยบอรดแลวแสดงผลลพธตวเลขออกมาทางหนาจอ แลวจงมการตรวจสอบคา expression วามคาเปน 0 หรอไม ถา expression เปนจรง จะกลบไปเรมทางานทจดเรมตนการทางานแบบวนซาอกครง แตถาตรวจสอบคา expression แลวมคาเปนเทจ จะออกจากการทางานแบบวนซาทนท เทคนคการใชงานคาสง การใชงานคาสงวนซา มกใชประโยชนในสองกรณเทานน 1. ลดจานวนการพมพขอมล โดยอาศยการทางานซาๆ นน แทนการพมพคาสงซาๆ กน 2. เรยกใชตวแปรทมการปรบเปลยนไปเรอยๆ ภายในรอบการทางานวนซาในแตละรอบ เนองจากรปแบบของคาสง for , while และ do … while นนมสวนทเปน statement เพยง statement เดยวอยในรปแบบของคาสง ดงนนเราสามารถใชหลกการของคอมไพเลอร 2 ขอ มาใชในการสรางรปแบบการเขยนโปรแกรมทมความซบซอนสงขนได เชนเดยวกบชดคาสงกาหนดเงอนไข (if, if – else)
1) การรวม statement หลายๆ statement ใหกลายเปน statement เดยวดวยการใชเครองหมายวงเลบปกกา { } ลอมรอบกลมของ statement ทตองการใหคอมไพเลอรแปลความหมายเปน statement เดยว
2) การแทนคา statement ดวยคาสงของตวมนเอง ทาใหเกดลกษณะการทางานเปน ลป ซอน ลป ทาใหสามารถเขยนโปรแกรมทซบซอนมากขนได
ตวอยางการใชงาน 1. ถาตองการพมพตวเลข 1-20 สามารถใชคาสง for ดงน
©2011 CE-KMITL v0.1
89
for (i=1;i<=20;i++) printf(“%d\n”,i) 2. ถาตองการพมพเลขคตงแต 1-19 สามารถใชคาสง for ดงน for (i=1;i<=20;i=i+2) printf(“%d\n”,i) 3. ถาตองการเขยนโปรแกรมเพอรบคาตวเลข 1 จานวนแลวแสดงคาผลบวกตงแต 1 จนถงคาทรบเขามาสามารถใชคาสง for ดงน int a,i,sum int main() { scanf(“%d”,&a); sum = 0; for (i=1; i<=a ; i++) sum = sum + i; printf(“%d\n”,i); return 0; }
การทดลองท 5.1
จากตวอยางการใชงานคาสง ใหนกศกษาประยกตใชงานดงตอไปน 1. ใหนกศกษาเขยนคาสงในตวอยางการใชงานขอ 1 และ 2 โดยใชคาสง while 2. ใหนกศกษาเขยนคาสงในตวอยางการใชงานขอ 1 แตเปลยนเปนใหแสดงตวเลขตงแต 100 ถง 1
การทดลองท 5.2
ใหนกศกษาลองเขยนโปรแกรมตอไปนลองสงเกตผลลพธขณะ compile โปรแกรม หรอรนโปรแกรม แลวตอบคาถาม 1. ทดสอบกรณการทางานแลวเกด infinite loop โดยใหนกศกษาเขยนตวอยางคาสง for , while และ do…while ทจะทาใหเกด infinite loop ได พรอมอธบายวาเหตใดจงเกด infinite loop for while do…while
การทดลองท 5.3
ใหนกศกษาเขยนโปรแกรมตอไปน 1) จงเขยนโปรแกรมรบจานวนเตม 1 จานวน แลวแสดงผล ตวเลขตงแตเลข 1 ถง จานวนทรบมา 2) จงเขยนโปรแกรมรบอนพทเปนตวเลขจานวนเตม 1 จานวนแลวคานวณหาผลคณของตวเลขตงแต 2 จนถงตวเลขท
รบเขาโดยใชคาสง for เทานน
©2011 CE-KMITL v0.1
90
3) จงเขยนโปรแกรมรบอนพทเปนตวเลขจานวนเตม 1 จานวนแลวคานวณหาผลคณของตวเลขตงแต 2 จนถงตวเลขทรบเขาโดยใชคาสง while เทานน
4) จงเขยนโปรแกรมรบอนพทเปนตวเลขจานวนเตม 1 จานวนแลวคานวณหาผลคณของตวเลขตงแต 2 จนถงตวเลขทรบเขาโดยใชคาสง do…while เทานน
5) จงเขยนโปรแกรมเพอรบตวเลขไปเรอยๆ จนกวาจะรบคาตวเลข 0 แลวแสดงผลลพธผลรวมของตวเลขทรบคาทงหมด
©2011 CE-KMITL v0.1
91
บทท 6 การเขยนโปรแกรมแบบวนซา และกาหนดเงอนไข
วตถประสงคการศกษา 1) ทบทวนเรองการเขยนโปรแกรมแบบวนซา และผงงาน 2) สามารถเขยนโปรแกรมภาษาซใหมทางานแบบวนซาได และกาหนดเงอนไขรวมกนได
6.1 ตวอยางการประยกตใชคาสงวนซา กบเงอนไข เพอแกปญหาตางๆ
โปรแกรม 6.1 โปรแกรมแสดงสตรคณแม 2
จงเขยนผงงานและโปรแกรมแสดงสตรคณแม 2 1) Output analysis สตรคณแม 2 2) Input analysis ไมม 3) Process analysis โปรแกรมวนรอบเพอแสดงสตรคณแม 2 แสดงอยในรป 2 * num = 2*num 2 * 1 = 2 2 * 2 = 4 … 2 * 12 = 24 4) Variable define num เปนจานวนเตมเพอนบคา 1 - 12
#include<stdio.h> int main() { int num; printf ("Multiplication table\n"); for (num=1; num<=12; num++) { printf ("%4d * %-2d = %-d\n",2,num,2*num); } return 0; }
หลกการเลอกใช for , while , do-while
• ใช for ในกรณททราบจานวนรอบของการวนซา • ใช while ในกรณทตองคดเงอนไขกอนการทางานแบบวนซา • ใช do-while ในกรณทตองคดเงอนไขการทางานภายหลงจากทางานไปแลวครงหนง
การเขยนโปรแกรมวนรอบ และกาหนดเงอนไข
• การเขยนโปรแกรมทมความซบซอนมากขน จาเปนตองอาศยการเขยนโปรแกรมแบบวนรอบรวมกบการเขยนโปรแกรมแบบมเงอนไข
START
END
num
num<=12
True
False
2, num2*num
num = 1
num++
©2011 CE-KMITL v0.1
92
• โดยการเพมเงอนไขการทางานในสวนของการวนรอบ หรอมการตรวจสอบเงอนไขวาจะใหโปรแกรมมการวนรอบอยางไร
โปรแกรม 6.2 โปรแกรมแสดงเลข 0 – 100 ใช while #include<stdio.h> int main() { int count = 0; printf ("Show number from 0 to 100\n\n"); while (count<=100) { printf ("%d ",count); count++; } return 0; }
โปรแกรม 6.3 โปรแกรมแสดงเลขค 0 – 100 ใช while #include<stdio.h> int main() { int count = 0; printf ("Show even number from 0 to 100\n\n"); while (count<=100) { if (count%2 == 0) //ใชเงอนไข ควบคมใหแสดงผลเฉพาะเลขค printf ("%d ",count); count++; } return 0; }
แผนผงเปรยบเทยบการทางานระหวางโปรแกรมตวอยางท 6.2 กบ 6.3 //flowchart โปรแกรมตวอยาง 6.2
//flowchart โปรแกรมตวอยาง 6.3
โปรแกรม 6.4 โปรแกรมตรวจสอบจานวนสระ ใช for
จงเขยนผงงาน และโปรแกรมเพอรบอกษรตวเลกมา 10 ตว แลวตรวจสอบวามอกษรทเปนสระกตว และไมใชสระกตว
©2011 CE-KMITL v0.1
93
1) Output analysis จานวนอกษรทเปนสระ และไมใชสระ 2) Input analysis อกษรทผใชปอนมาจานวน 10 ตว 3) Process analysis โปรแกรมทางานแบบวนรอบ เพอรบคาจานวนอกขระ แลวตรวจสอบวาเปนสระ หรอไม แลว
นบจานวนไว จนครบ 10 ตว 4) Variable define vowel เปนจานวนเตมเพอใชนบจานวนสระ alphabet เปนจานวนเตมเพอใชนบจานวนทไมใชสระ count เปนจานวนเตมเพอใชนบวาครบ 10 ตวหรอไม letter เปนอกขระเพอรบตวอกษร
#include<stdio.h> #include<conio.h> int main() { int vowel=0,alphabet=0,count; char letter; for (count=0; count<10; count++) { printf ("\nEnter letter a-z : "); letter = getche(); if ((letter=='a')||(letter=='e')||(letter=='i') ||(letter=='o')||(letter=='u')) vowel++; else alphabet++; } printf ("\n***Result***\n"); printf ("Vowel (a,e,i,o,u) = %d\n",vowel); printf ("Other letter = %d",alphabet); return 0; }
โปรแกรม 6.5 โปรแกรมแสดงผลรปสเหลยมกลวง
จงเขยนผงงานและโปรแกรมแสดงผลรปสเหลยมขนาด n x n โดยโปรแกรมจะรอรบจานวนเตมจากผใชงาน ดงตวอยาง
1) Output analysis ผลตวเลข เปนรปสเหลยมจตรสขนาดเทากบจานวนตวเลขทรบเขามา โดยเวนชองวางตรงกลาง 2) Input analysis เลขจานวนเตมทผใชปอนเขามา 3) Process analysis โปรแกรมรอรบคาจานวนเตมจากผใชงาน โปรแกรมวนรอบเพอทาการแสดง '*' เปนรปสเหลยมจตรส
START
END
vowel=0,alphabet=0,count,letter
count = 0
letter
letter is
vowel vowel++
alphabet++
count ++
count<10
vowelalphabet
True
false
True
False
©2011 CE-KMITL v0.1
94
โดยพจารณาวาสวนทอยในกรอบใหแสดงเปนชองวาง บรรทดท 1 แสดงผล '\n' แสดงผล '*' เฉพาะตาแหนงขอบ ทเหลอแสดงผล ' ' บรรทดท 2 แสดงผล '\n' แสดงผล '*' เฉพาะตาแหนงขอบ ทเหลอแสดงผล ' ' ….. บรรทดท n แสดงผล '\n' แสดงผล '*' เฉพาะตาแหนงขอบ ทเหลอแสดงผล ' ' 4) Variable define num เปนจานวนเตมเพอใชเกบคาตวเลขทผใชปอน i เปนจานวนเตมเพอใชนบจานวนบรรทด j เปนจานวนเตมเพอใชนบจานวนอกษรในบรรทด //วาด flowchart #include<stdio.h>
int main() { int num,i,j; char space=' '; printf ("Enter number : "); scanf ("%d",&num); for (i=1; i<=num; i++) { printf ("\n"); for (j=1; j<=num; j++) { if (i==1 || i==num || j==1 || j==num) printf ("*"); else printf ("%c",space); } } return 0; }
โปรแกรม 6.6 โปรแกรมต ATM
จงเขยนผงงาน และโปรแกรมการจายเงนของต ATMโดยใหผใชกรอกจานวนเงนเขามาแลวโปรแกรมจะตรวจสอบวาถกตองหรอไมโดยมเงอนไขวา ATM จะจายเงนใหไมเกน 20000 และตองมากกวา 100 ซงโปรแกรมจะตองคานวณวาตองจายเปนธนบตรมลคาตางๆอยางละจานวนกใบโดยกาหนดใหในเครอง ATM มธนบตรมลคาตางๆดงน ธนบตรใบละ 1000 ธนบตรใบละ 500 ธนบตรใบละ 100 1) Output analysis แสดงผลลพธของจานวนธนบตรมลคาตางๆ 2) Input analysis จานวนเงนทผใชตองการกรอก 3) Process analysis
• โปรแกรมทางานแบบวนรอบ เพอรบคาจานวนเงนทถกตอง • ถาจานวนเงนถกตองใหคานวณวามธนบตรใดจานวนเทาใด • ตรวจสอบวาจานวนเงนควรมธนบตรมลคา 1000 กใบ แสดงผลและหกจานวนเงนทจายธนบตรมลคา 1000 ฿ • ตรวจสอบวาจานวนเงนทเหลอควรมธนบตรมลคา 500 กใบ แสดงผลและหกจานวนเงนทจายธนบตรมลคา 500 ฿
©2011 CE-KMITL v0.1
95
• ตรวจสอบวาจานวนเงนทเหลอควรมธนบตรมลคา 100 กใบ แสดงผล 4) Variable define money เปนจานวนเตมสาหรบเกบคาเงน amount เปนจานวนเตมสาหรบเกบจานวนธนบตรทจายออกไป //วาด flowchart #include<stdio.h>
int main() { int money,amount; printf ("Enter money : "); scanf ("%d",&money); while ((money > 20000) || (money%100!=0)) { printf ("Sorry, please enter money : "); scanf ("%d",&money); } printf ("\nTotal bank note\n"); if (money/1000!=0) { amount = money/1000; money = money%1000; printf ("Banknote 1000 : %d\n",amount); } if (money/500!=0) { amount = money/500; money = money%500; printf ("Banknote 500 : %d\n",amount); } if (money/100!=0) { amount = money/100; money = money%100; printf ("Banknote 100 : %d\n",amount); } return 0; }
โปรแกรม 6.7 โปรแกรมคานวณคาอาหาร
จงเขยนผงงานและโปรแกรม เมนรบรายการอาหารจากลกคาเพอคานวณราคาอาหารทงหมด โดยกาหนดใหโปรแกรมมรายการดงน 1. Pizza 150 ฿ 2. Hamburger 50 ฿ 3. Sandwich 25 ฿
©2011 CE-KMITL v0.1
96
4. Water 10 ฿ 0. Calculate money โดยทกครงทเลอกเมนรายการอาหารจะแสดงจานวนอาหารทสงไปแลวดวย 1) Output analysis แสดงผลจานวนรายการอาหาร และราคา 2) Input analysis จานวนรายการอาหารทผซอเลอก 3) Process analysis โปรแกรมทางานแบบวนรอบ เพอแสดงรายการอาหาร และรบขอมลรายการอาหารทเลอก แลวรวมผลของรายการแตละชนด และราคารวม 4) Variable define menu เปนจานวนเตมสาหรบรบรายการอาหาร m1,m2,m3,m4 เปนจานวนเตมสาหรบนบจานวนรายการอาหาร money เปนจานวนทศนยมสาหรบเกบจานวนเงนรวม i เปนจานวนเตมเพอควบคมการเวนบรรทด
#include<stdio.h> int main() { int menu,m1=0,m2=0,m3=0,m4=0,i; float money=0; printf ("Welcome to Restaurant\n"); do { printf ("1. Pizza 150 B\n"); printf ("2. Hamburger 50 B\n"); printf ("3. Sandwich 25 B\n"); printf ("4. Water 10 B\n"); printf ("0. Calculate money\n"); printf ("\nSelect menu : "); scanf ("%d",&menu); for (i=0;i<34;i++) printf ("\n"); if (menu==1) { money = money + 150; m1++; } else if (menu==2) { money = money + 50; m2++;
START
menu, money=0m1=0,m2=0,m3=0
money END
menu
menu == 1 money=money+150m1++
money=money+50m2++
money=money+25m3++
menu!=0
m1,m2m3,m4
money=money+10m4++
menu == 2
menu == 3
menu == 4
True
False
True False
True
FalseTrue
FalseTrue
False
©2011 CE-KMITL v0.1
97
} else if (menu==3) { money = money + 25; m3++; } else if (menu==4) { money = money + 10; m4++; } printf ("\n\nU have :\n"); printf ("Pizza %d * 150 : %d\n",m1,m1*150); printf ("Hamburger %d * 50 : %d\n",m2,m2*50); printf ("Sandwich %d * 25 : %d\n",m3,m3*25); printf ("Water %d * 10 : %d\n\n",m4,m4*10); } while (menu!=0); printf ("\nTotal payment = %.2f\n",money); return 0; }
6.2 คาถามทายบท 1) จงเขยนโปรแกรม รบตวเลข 1 2 3 เขามา ถารบเปนเลข 1 ใหพมพคาวา Hello ถาเปนเลข 2 ใหพมพคาวา Thank you ถารบเปนเลข 3 ใหพมพคาวา Good bye และออกจากโปรแกรม ถาเปนเลขอน ใหพมพคาวา Sorry ตวอยางโปรแกรม
2) จงเขยนโปรแกรมรบตวเลข ระหวาง 2 ถง 25 และแสดงสตรคณออกมา ถาตวเลขทรบเขามาไมอยในชวงทกาหนด ใหผใชปอนคาเขามาใหม
3) จงเขยนโปรแกรมรบขอความเขามาหนงขอความ แลวนามาแสดงผลบรรทดละ 10 ตวอกษร
©2011 CE-KMITL v0.1
98
การทดลองท 6 การเขยนโปรแกรมการวนรอบ และกาหนดเงอนไข
วตถประสงค 1. เพอใหนกศกษารจกการใช คาสงการวนรอบ และกาหนดเงอนไข รวมกน 2. เพอใหนกศกษาสามารถใช คาสงการวนรอบ และกาหนดเงอนไข เพอเขยนโปรแกรมทซบซอนได
การทดลองท 6.1 :
จงเขยนโปรแกรมรบตวเลข 1 ตว แลวแสดงผลลพธวาคาทรบมาเปนจานวนเฉพาะหรอไม
การทดลองท 6.2
จงเขยนโปรแกรมรบคา 2 คา แลว แสดงจานวนเฉพาะทอยระหวางคาท รบมา โดยเรยงจากนอยไปมากเสมอ
การทดลองท 6.3
จงเขยนโปรแกรมรบตวเลข 1 ตวแลวใหคอมพวเตอรวาดรปเครองหมาย * เปนสเหลยมจตรสทมดานเทากบตวเลขทรบเขามาดงตวอยาง เมอปอนตวเลข 5 จะไดผลลพธดงน
การทดลองท 6.4
จงเขยนโปรแกรมรบตวเลข 1 ตวเพอแสดงผล เปนรปสเหลยมขนาดเทากบจานวนตวเลขทรบเขามา โดยมพน หลงเปน * และ - สลบกนไปเรอยๆ เชนปอนตวเลข 5 จะไดผลลพธดงน
การทดลองท 6.5
ใหนกศกษาเขยนโปรแกรมรบคาตวเลข ตวแลวใหคอมพวเตอรวาดรปเครองหมาย * เปนประมดทมความสงเทากบตวเลขทรบเขามาดงตวอยาง เมอปอนตวเลข 5 จะไดผลลพธดงน
การทดลองท 6.6
ใหนกศกษาเขยนโปรแกรมรบคาตวเลข 1 ตว แลวใหแสดงผลลพธเปนรปผเสอเชน
©2011 CE-KMITL v0.1
99
©2011 CE-KMITL v0.1
100
บทท 7 ตวแปรแถวลาดบ Array
วตถประสงคการศกษา 1. เขาใจหลกการของตวแปรแถวลาดบ 2. สามารถเขยนโปรแกรมใชงานตวแปรแถวลาดบไดอยางถกตอง
หากตองการเขยนโปรแกรมเพอรบรหสนกศกษา และคะแนนสอบกลางภาควชา Computers and Programming ของนกศกษาหอง 1 – 10 char id0001[9],id0002[9],id0003[9],..., ,...,id1158[9],id1159[9]; float point0001,point0002,point0003,..., ,...,pint158,point1159; scanf ("%s",id0001); scanf ("%f",&point0001); ... scanf ("%s",id1159); scanf ("%f",&point1159);
7.1 ตวแปรแถวลาดบ Array ตวแปรอารเรย คอ ตวแปรทสามารถเกบขอมลไดเปนชด โดยสรางตวแปรขนมาเพยงตวเดยว (ตวแปร 1 ตว จดเกบขอมลไดหลายคา) แตขอมลนนตองเปนชนดเดยวกน ตวอยาง ตวแปรอารเรยชอ SUM เกบขอมลชนดจานวนเตมขนาด 5 อลเมนท (element)
ตวแปรอารเรยชอ point สาหรบเกบขอมลชนดตวเลขทศนยมขนาด 4 อลเมนต
ตวแปรอารเรยชอ letter สาหรบเกบขอมลชนดอกขระขนาด 4
ลกษณะตวแปรแถวลาดบ ตวแปรอารเรย 1 มต ตวแปรอารเรยทเกบขอมลไดเพยงแถวเดยว (ใชลาดบในการอางถงขอมล)
©2011 CE-KMITL v0.1
101
อารเรย 2 มตตวแปรอารเรยทเกบขอมลโดยใช แถว(Row) และหลก(Column) ในการอางถงขอมล และอารเรย 3 มต ตวแปรอารเรยทเกบขอมลลกษณะของลกบาศก โดยใช แถว(Row) หลก(Column) และลก (Deep) ในการอางถงขอมล
7.2 อารเรย 1 มต รปแบบคาสง
type array-name[n]
type เปนชนดของตวแปรทจะสรางขน int ประกาศตวแปรเปนชนดจานวนเตม float ประกาศตวแปรเปนชนดทศนยม char ประกาศตวแปรเปนชนดอกขระ array-name เปนชอของตวแปรอารเรย n เปนขนาดของตวแปรอารเรย
7.2.1 การกาหนดคาเรมตนใหอารเรย
รปแบบคาสง
type array_name[n] = {value1, value2,..,value};
value-1, value-2, …, value-n เปนขอมลทจะทาการกาหนดใหกบตวแปรแถวลาดบ โดยจะตองเปนขอมลชนดเดยวกบ type ทกาหนด ตวอยางการประกาศอารเรย #include<stdio.h> #include<conio.h> int main() { int number[3] = {23, -186, 43}; float value_2[5]={0.98,43.213,-3.47,52.08,-0.987}; char vowel[5] = {'a','e','i','o','u'}; char name[9] = {'E','n','g','i','n','e','e','r','\0'}; return 0; }
7.2.2 การอางองขอมลอารเรย
ตวอยางการอางขอมลในอารเรย
©2011 CE-KMITL v0.1
102
#include<stdio.h> #include<conio.h> int main() { int year[5] = {2001,2542,1999,2000,2521}; printf ("%d\n",year[2]); printf ("%d\n\n",year[4]); year[0] = 2545; printf ("%d\n",year[0]); }
//ผลลพธ 1999 2521 2545
โปรแกรม 7.1 โปรแกรมรบอายของคน 20 คน
จงเขยนผงงานและโปรแกรมเพอเกบอายของผใชงานจานวน 20 คนโดยเกบขอมลอายในตวแปรชนดอารเรย 1) Output analysis ไมม 2) Input analysis อายทผใชงานปอนเขามา 3) Process analysis สรางตวแปรแถวลาดบขนาด 20 เพอเกบคาอาย โปรแกรมวนรอบเพอรอรบคาจากผใชงาน 4) Variable define age[20] เปนตวแปรแถวลาดบชนดจานวนเตมขนาด 20 เพอใชเกบคาอาย count เปนตวแปรชนดจานวนเตมเพอใชนบจานวนรอบ
#include<stdio.h> #include<conio.h> int main() { int age[20],count; for (count=0; count<20; count++) { printf ("Enter age[%d] : ",count); scanf ("%d",&age[count]); } printf ("Finish\n"); return 0; }
โปรแกรม 7.2 โปรแกรมวเคราะหสวนสงของคน n คน
จงเขยนผงงานและโปรแกรม เพอรบจานวนนกศกษาในหอง หลงจากนน ใหโปรแกรมรอรบสวนสงของคน n คน แลววเคราะหวามนกศกษาในหองมสวนสงชวงตางๆ จานวนกคน แลวคานวณสวนสงเฉลย แลวแสดงผลสวนสงของนกศกษาทงหมด
Group A 0 - 160
Group B 161 - 170
Group C 171 - 180
Group D 181 - 200
1) Output analysis
• จานวนนกศกษาทสงแตละชวง
True
START
END
age[20],count
count = 0
age[count]
count++
count<20False
©2011 CE-KMITL v0.1
103
• สวนสงของนกศกษาเฉลยในหอง • สวนสงของนกศกษาทงหมด
2) Input analysis จานวนนกศกษาทงหมด และสวนสงของแตละคน 3) Process analysis
• โปรแกรมรบจานวนนกศกษา • วนรอบเพอรบสวนสงเทากบจานวนนกศกษา • วนรอบเพอตรวจสอบชวงสวนสงของนกศกษาและหาผลรวมสวนสงของนกศกษาทกคน • คานวณหาคาเฉลย
4) Variable define num เปนจานวนเตมเพอเกบจานวนนกศกษา a เปนจานวนเตมเพอตรวจตาแหนงตวแปร และนบรอบ range1=0, range2=0, range3=0, range4=0 เปนจานวนเตมสาหรบเกบคาจานวนนกศกษาแตละชวง high[300] เปนตวแปรแถวลาดบชนดทศนยมเพอเกบสวนสง avg = 0 เปนจานวนทศนยมเพอเกบคาผลรวมและคาเฉลย
#include<stdio.h> #include<conio.h> int main() { int num,a; int range1=0,range2=0,range3=0,range4=0; float high[300],avg=0; printf("Please enter number of student : "); scanf ("%d",&num); for(a=0; a<num; a++) { printf("Student %2d : ",a+1); scanf("%f",&high[a]); } for(a=0; a<num; a++) { if (high[a]<=160) range1++; else if (high[a]<=170) range2++; else if (high[a]<=180) range3++; else range4++; avg = avg + high[a]; } avg = avg/num; printf("\n 0 - 160 : %3d",range1); printf("\n161 - 170 : %3d",range2); printf("\n171 - 180 : %3d",range3); printf("\n181 - 200 : %3d",range4); printf("\n\nAverage : %f ",avg); for(a=0; a<num; a++) { printf("%.2f ",high[a]); } return 0; }
True
num,arange1=0,range2=0range3=0,range4=0high[300],avg=0
high[a]
a=0
START
num
a<num
a++
False
(2)
23
False True
a++
<=160
<=170
<=180
range4++
range1++
range2++
range3++
F
T
F
T
F
T
a<num
avg=avg+high[a]
avg=avg/num
a=0
(3)
(2)
©2011 CE-KMITL v0.1
104
7.3 ตวแปรแถวลาดบและเกบขอความ char subject[11] = {"C language"}; หรอ char subject[11] = {'C', ' ', 'l', 'a', 'n', 'g', 'u', 'a', 'g', 'e', '\0'};
char name[9] = {"Engineer"};
ตวอยางโปรแกรมแถวลาดบเกบขอความและแสดงผล #include<stdio.h> #include<conio.h> int main() { char sentence[22]="Welcome to my country"; char word[9]={'T','h','a','i','l','a','n','d','\0'}; char not_word[4]={'l','o','v','e'}; printf ("Message1 = %s\n",sentence); printf ("Message2 = %s\n",word); printf ("Message3 = %s\n",not_word); return 0; }
//ผลลพธ Message1 = Welcome to my country Message2 = Thailand Message3 = loveThailand
7.4 อารเรย 2 มตหรอมากกวา รปแบบคาสง
type array-name[n][m];
END
(3)
Truea<num
a++
a=0
high[a]
range1range2range3range4avg
False
©2011 CE-KMITL v0.1
105
type เปนชนดของตวแปรทจะสรางขน int ประกาศตวแปรเปนชนดจานวนเตม float ประกาศตวแปรเปนชนดทศนยม char ประกาศตวแปรเปนชนดอกขระ array-name เปนชอของตวแปรอารเรย n เปนจานวนแถวของตวแปรอารเรย m เปนจานวนคอลมนของตวแปรอารเรย
7.4.1 การกาหนดคาเรมตนใหอารเรย 2 มต
รปแบบคาสงการกาหนดคาใหอารเรย 2 มต
type array-name[n][m] = {value1,value2,..,valueN};
value-1-1, value-1-2, …, value-1-n, …, …, value-n-m เปนขอมลทจะทาการกาหนดใหกบตวแปรแถวลาดบ โดยจะตองเปนขอมลชนดเดยวกบ type ทกาหนด ตวอยางการกาหนดคาเรมตนและการอางคาในอารเรย 2 มต ลกษณะการเขยนประกาศแบบท 1 int num[3][4] = { 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34 }; float matrix[2][4] = { 0.19, -0.01, -0.23, 4.44, -4.44, 0.26, -0.09, -0.22 }; char letter[2][4] = { 'G', 'o', 'o', 'D', 'T', 'i', 'm', 'E'}; char str[2][10] = {"Computer", "Engineer" };
ลกษณะการเขยนประกาศแบบท 2 ในกรณทอารเรยมขนาดยาวกวาบรรทดทเขยน int num[3][4] = { 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34 }; float matrix[2][4] = { 0.19, -0.01, -0.23, 4.44, -4.44, 0.26, -0.09, -0.22 }; char letter[2][4] = {'G', 'o', 'o', 'D', 'T', 'i', 'm', 'E'}; char str[2][10] = {"Computer", "Engineer" };
การอางคาตาแหนงดงรปดานลาง
©2011 CE-KMITL v0.1
106
โปรแกรม 7.3 โปรแกรมรบขอมลและแสดงผลลพธแบบเมทรกซ
จงเขยนโปรแกรมเพอรบคาจานวนเตมในรปแบบเมตรกซโดยเกบคาไวในตวแปร แถวลาดบ ขนาด 3 3 แลวแสดงผลเมตรกซ #include<stdio.h> #include<conio.h> int main() { int matrix[3][3],r,c; for(r=0; r<3; r++) { for(c=0; c<3; c++) { printf("Enter numbers [%d][%d] : ",r,c); scanf("%d",&matrix[r][c]); } } printf ("\n*** Matrix ***\n"); for (r=0; r<3; r++) { for(c=0; c<3; c++) { printf ("%5d ",matrix[r][c]); } printf ("\n"); } return 0; }
//ผลลพธของโปรแกรม //รบคา
//แสดงเมทรกซ
โปรแกรม 7.4 หาผลรวมในเมทรกซ
จากตวแปรแถวลาดบทกาหนดให จงเขยนโปรแกรมหาผลรวมของจานวนในแตละหลก และผลรวมของจานวนในแตละแถว โดยเกบคาผลรวมไวในตวแปร row[], column[] กาหนด int num[3][4] = {1, 2, 3, 4,2, 3, 4, 5, 3, 4, 5, 6 }; #include<stdio.h> #include<conio.h> int main()
//ผลลพธ *** Show Matrix ***
©2011 CE-KMITL v0.1
107
{ int num[3][4] = { 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6 }; Int r,c,row[3]={0,0,0},column[4]={0,0,0,0}; /* Display Matrix */ printf ("\n*** Show Matrix ***\n\n"); for (r=0; r<3; r++) { for(c=0; c<4; c++) printf ("%5d ",num[r][c]); printf ("\n\n"); } /* Summation Matric */ for (r=0; r<3; r++) for(c=0; c<4; c++) { row[r] = row[r] + num[r][c]; column[c] = column[c] + num[r][c]; } /* Display Summation */ printf ("\n\n"); for (r=0; r<3; r++) printf ("sum of row [%d] = %d\n",r,row[r]); for (c=0; c<4; c++) printf("sum of column [%d] = %d\n",c,column[c]); return 0; }
1 2 3 4 2 3 4 5 3 4 5 6 Sum of row[0] = 10 Sum of row[1] = 14 Sum of row[2] = 18 Sum of column[0] = 6 Sum of column[1] = 9 Sum of column[2] = 12 Sum of column[3] = 15
โปรแกรม 7.5 นบจานวนขอความ
จงเขยนผงงาน และโปรแกรม เพอรบขอความเขามา ตรวจสอบวามทงหมดกประโยค
#include<stdio.h> #include<conio.h> int main() { char message[100]; int count=0,c=0; printf ("******************************\n"); printf ("* Program for count SENTENCE *\n"); printf ("******************************\n"); printf ("\n(One sentence must have '.' or '?')\n"); printf ("Enter Message : "); gets(message); while (message[c]!='\0') { if (message[c]=='.' || message[c]=='?') count++; c++; } printf ("\n\nYour message has %d
44
START
END
count=0, c=0, message[100]
message
message[c]!=\0
c++
count
False
True
message[c]==POINT || message[c]==QU
count++
False
True
©2011 CE-KMITL v0.1
108
sentence(s).\n",count); return 0; }
7.5 การสลบคาในอารเรย
ตวอยาง code temp = num[0] num[0] = num[9]; num[9] = temp;
โปรแกรม 7.6 หาคามากทสด
จงเขยนโปรแกรมเพอรบจานวน 10 จานวน เพอหาคามากทสดในจานวนทรบมา โดยการยายคามากทสดไปไว Array ทตาแหนงสดทาย
#include<stdio.h> #include<conio.h> #define SIZE 10 int main() { int num[SIZE],temp,n; for (n=0; n<SIZE; n++) { printf ("Enter num[%d] : ",n+1); scanf ("%d",&num[n]); } for (n=0; n<SIZE-1; n++) { if (num[n]>num[n+1]) { temp = num[n+1]; num[n+1] = num[n]; num[n] = temp; } } printf ("The maximum number = %d",num[SIZE-1]);
49
0 19 1 23 99 15 10 23 -26 -9num[10]
num[0] num[1] num[2] num[3] num[4] num[5] num[6] num[7] num[8] num[9]
0 19 1 23 99 15 10 23 -26 -9num[10]
0 1 19 23 99 15 10 23 -26 -9num[10]
temp = num[1]; num[1]=num[2]; num[2] = temp;
0 1 19 23 15 99 10 23 -26 -9num[10]
temp = num[4]; num[4]=num[5]; num[5] = temp;
0 1 19 23 15 10 23 -26 -9 99num[10]
©2011 CE-KMITL v0.1
109
return 0; }
อธบาย
7.6 คาถามทายบท 1) กาหนดให Matrix A มขนาด 3x3 ดงน
จงเขยนโปรแกรมหา Diagonal matrix ของ A โดยใหนาผลทไดใสลงไปใน Array A
2) จากโจทยขอท 1) จงเขยนโปรแกรมหา Transpose ของ Matrix A โดยใหนาผลมาใสใน Matrix A
3) จาก Matrix A ในขอท 1 จงเขยนโปรแกรมเพอแสดงผลคณของ A x A
ผลลพธ -1 -4 -6 A x A = 3 16 22 8 28 35
©2011 CE-KMITL v0.1
110
การทดลองท 7 ตวแปรแถวลาดบ
วตถประสงค 1. เพอใหนกศกษาทดลองเขยนโปรแกรมโดยใชตวแปรแถวลาดบ 2. เพอใหนกศกษาสามารถใชงานตวแปรแถวลาดบได 3. เพอใหนกศกษาเขยนโปรแกรมโดยประยกตใชความรทผานมากบตวแปรแถวลาดบได
ทฤษฎ ในการเขยนโปรแกรมตามโจทยทไดเรยนมาในบทกอนหนาน จะเปนโจทยทมรปแบบการกาหนดตวแปรทละตวเทานน ซงในการใชงานจรงการเขยนโปรแกรมโดยกาหนดตวแปรทละตวมขอจากดในการเขยนโปรแกรมอยสองประเดนใหญๆ ประเดนแรกคอกรณทตองเกบขอมลเปนชดจะเกดความยงยากในการเขยนโปรแกรมมากเชน ขอมลความสงของนกศกษาจานวน 50 คน ถาตองเขยนโปรแกรมในลกษณะนโดยกาหนดตวแปรทละตว จะทาใหตองเขยนโปรแกรมทมการทางานซาซอนกนหลายบรรทดโดยไมสามารถใชการเขยนโปรแกรมแบบวนซามาชวยใหเขยนโปรแกรมไดงายขนไดเลย อกขอจากดหนงทสาคญมาก นนคอในกรณทเขยนโปรแกรมแลวตองมการเกบขอมลหรอรบขอมลทโปรแกรมเมอรไมทราบวาปรมาณขอมลทแทจรงเปนเทาใด จาเปนตองมการกาหนดจานวนตวแปรในการเกบขอมลเผอไวกอน ซงในกรณนโปรแกรมเมอรจะไมทราบไดเลยวาจะตองทางานกบตวแปรโดดแตละตวอยางไร จงไมสามารถเขยนโปรแกรมในลกษณะนได ทางออกสาหรบปญหาใหญสองปญหาดงกลาวคอการกาหนดตวแปรเปนกลม ทเราเรยกวา Array ซง Array จะเปนชดของขอมลชนดเดยวกน เรยงกนอยตามรปแบบทผใชงานกาหนด โดยโปรแกรมเมอรสามารถกาหนดขนาดรวมถงลกษณะมตของ Array ทตองการได อกทงโปรแกรมเมอรจะสามารถอางองคาทเกบไวใน Array ไดอยางงายดายArray คอหนวยเกบขอมลทมลกษณะเปนแถวหรอกลมของขอมลทเรยงตอกน โดยอาจเปนการเรยงตอกนเปนแถวใน 1 มต เรยงกนเปนแถวใน 2 มตเหมอนกบชนวางของ หรอจะมากกวานนกได Array จะอนญาตใหมการเกบขอมลเพยงชนดเดยวเทานนในกลมขอมลทงหมด นนคอเราจะไมสามารถเกบขอมลทมชนดตางกนไดเลยใน Array จะตองใชการเกบขอมลในรปแบบอนๆ แทน สาหรบผเรมตนเขยนโปรแกรม ควรเรมตนจากการใชงาน Array 1 มต และ Array 2 มต ซงเปน Array ทมขนาดเลก การใชงานไมซบซอน แตเปนพนฐานในการเขยนโปรแกรมทซบซอนและตองใชขอมลหลายๆ มตในอนาคตไดสาหรบการใชงาน Array นกศกษาควรมความเขาใจและสามารถทางานตางๆ กบ Array ดงตอไปนได 1. การสราง Array ทมขนาด และชนดขอมลตามทตองการได 2. การนาขอมลเขาเกบใน Array และการนาขอมลใน Array ออกมาใชงาน การสราง Array ทมขนาด และชนดขอมลตามทตองการได การสราง Array จะนน จะมลกษณะคลายกบการกาหนดคาตวแปรตางๆ แตจะแตกตางกนเลกนอยตรงท Array ตองมการกาหนดขนาดของ Array ดวยทกครงโดยรปแบบการสราง Array สาหรบเกบขอมลจะมรปแบบการประกาศดงน Array 1 มต : type array-name [n] Array 2 มต :type array-name [r][c] โดย type คอชนดของตวแปร เชน int , float , char เปนตน array_name คอชอของตวแปร array โดยขอกาหนดตางๆของชอ array จะเหมอนกบ ขอกาหนดของชอตวแปรทกประการ n คอ ตวเลขขนาดของ array 1 มต ทไดกาหนดไว r คอ ตวเลข จานวนแถว ของ array 2 มต c คอ ตวเลข จานวนหลกของ array 2 มต ตวอยางการใชงาน 1. ตวอยางการประกาศ array ทใชในการเกบความสงของนกศกษา 50 คน เราจะตองมการกาหนดกลมขอมลของint จานวน 50 จานวน โดยเราจะกาหนด Array ชอ height เกบขอมลความสงของนกศกษาทง 50 คนไดดงน int height[50];
©2011 CE-KMITL v0.1
111
2. ตวอยางการประกาศ array 2 มตทใชในการเกบขอมลตวเลขขนาด 40 x 50 ชอง สามารถประกาศตวแปรดงน int data[40][50]; การนาขอมลเขาเกบใน Array และการนาขอมลใน Array ออกมาใชงาน ในการอางองขอมลใน Array เพอดงขอมลออกมาใชงานหรอเกบขอมลลงไปใน Array จะสามารถใชงานโดยการเขยนชอตวแปร ตามดวยตาแหนงของชองทตองการดงขอมลออกมา โดยชองแรกของ Array จะมหมายเลข 0 ตวอยางการกาหนด Array 1 มต : int a[9]; รปแบบขอมลทถกสรางขน
ในแตละชองจะสามารถบรรจขอมลตวเลขชนด int จานวน 9 ชอง การใสขอมลเลข 1 ลงไปในชองแรก สามารถทาไดโดยใชคาสง a[0] = 1; การนาเอาคาตวเลขในชองแรก มาแสดงผลในหนาจอ สามารถทาไดโดยใชคาสง printf (“%d”,a[0]); ตวอยางการกาหนด Array 2 มต : int b[4][4]; รปแบบขอมลทถกสรางขน
ในแตละชองจะสามารถบรรจขอมลตวเลขชนด int จานวน 16 ชอง แบงเปน 4 แถว แตละแถวม 4 ชองการใสขอมลเลข 5 ลงไปในแถวท 3 หลกท 4 สามารถทาไดโดยใชคาสง b[2][3] = 5; การนาเอาคาตวเลขในในแถวท 3 หลกท 4 มาแสดงผลในหนาจอ สามารถทาไดโดยใชคาสง printf (“%d”, b[2][3]); โดยเราจะสงเกตเหนวา โดยวธการเขยนโปรแกรมแลวการอางอง Array กคอการเขยนตวแปรธรรมดาเทานนเพยงแคเพมเตมตวเลขแสดงตาแหนง (index) ของคาขอมลนนๆ ใน Array เทานน การเขยนโปรแกรมกบ Array จงไมไดแตกตางจากการเขยนโปรแกรมโดยทวไปเลย ตวอยางการใชงาน 1. การเขยนโปรแกรมสราง Array เกบตวเลขจานวนเตม 10 จานวน โดยเกบคาตวเลข 1-10 ตามลาดบทาไดดงน #include<stdio.h> int main() { int i,data[10]; for (i=0;i<10;i++) { data[i]=i+1; printf("data[%d] = %d\n",i,data[i]); } return 0; }
©2011 CE-KMITL v0.1
112
2. การเขยนโปรแกรมสราง Array เกบตวเลข 10 ตวโดยรบคาจากคยบอรด แลวแสดงผลลพธจากตวเลขจากหลงมาหนา #include<stdio.h> int main() { int i,data[10]; for (i=0;i<10;i++) { printf("input number : "); scanf("%d",&data[i]); } printf("reverse data :"); for (i=9;i>=0;i--) { printf("%d ",data[i]); } return 0; }
การทดลองท 7.1
จากตวอยางการใชงานคาสง ใหนกศกษาประยกตใชงานดงตอไปน 1. การเขยนโปรแกรมสราง Array เกบตวเลขจานวนเตม 10 จานวน โดยเกบคาตวเลข 10-1 ตามลาดบ 2. การเขยนโปรแกรมสราง Array เกบตวเลข 10 ตวโดยรบคาจากคยบอรด แลวแสดงผลลพธจากตวเลขจากหลงมาหนา โดยแสดงผลเฉพาะตวเลขทเปนเลขคเทานน 3. การเขยนโปรแกรมสราง Array เกบตวเลข 10 ตวโดยรบคาจากคยบอรด แลวแสดงผลลพธจากตวเลขจากหลงมาหนา โดยแสดงผลเฉพาะลาดบทเปนเลขคเทานน
การทดลองท 7.2
ใหนกศกษาทดลองเขยนโปรแกรมตอไปนแลวสงเกตผลลพธขณะ compile โปรแกรม หรอรนโปรแกรม แลวตอบคาถาม 1. ใหนกศกษาทดสอบการทางานเมอมการอางองขอมลในตาแหนงเกนจากทไดกาหนดขนาดไว โดยกาหนด int a[10]; (ให Array a เกบชนดขอมลชนด int จานวน 10 จานวน) แตทดสอบในโปรแกรมโดยใชคาสงกาหนดคา a[15] = 100; (กาหนดคา Array a ตาแหนงท 15 ใหเกบชนดขอมล int ทมคา 100) ผลลพธทเกดขน 2. ใหนกศกษาทดสอบการทางานเมอมการใสขอมลลงใน Array โดยทขอมลทกาหนดใหม type ไมตรงกบ type ของ Array โดยกาหนด int a[10]; (ให Array a เกบชนดขอมลชนด int จานวน 10 จานวน) แตทดสอบใน โปรแกรมโดยใชคาสงกาหนดคา a[3]=5.5 ; (กาหนดคา Array a ตาแหนงท 3 ใหเกบชนดขอมล float ทมคา 5.5) ผลลพธทเกดขน
การทดลองท 7.3
ใหนกศกษาเขยนโปรแกรมตอไปน 1. ใหนกศกษาเขยนโปรแกรมรบคาเมตรกซขนาด 3x3 จานวน 2 ตว แลวคานวณหาผลคณของเมตรกซทงสอง และพมพผลลพธออกมา ดงตวอยาง
©2011 CE-KMITL v0.1
113
input: Enter the matrix A: 1 2 3 4 5 6 7 8 9 input: Enter the matrix B: 9 8 7 6 5 4 3 2 1 output: The matrix C = A * B is: 30 24 18 84 69 54
138 114 90 2. ใหนกศกษาเขยนโปรแกรมเพอรบตวเลข 10 ตวตามลาดบ แลวแสดงผลลพธวาตวเลขใดทมตวเลขขางเคยงเปนเลขค ดงตวอยาง Data : 1 3 6 7 8 9 4 5 6 6 Result : 6 8 4 Data : 2 1 4 9 5 8 5 3 1 7 Result : 4 8 3 1
3. ใหนกศกษาเขยนโปรแกรมเพอรบขอมล String จานวน 1 ชด แลวแสดงผลลพธโดยเปลยนตวอกษรตวพมพเลกใหกลายเปนตวอกษรตวพมพใหญและเปลยนตวอกษรตวพมพใหญใหกลายเปนตวอกษรตวพมพเลก 4. ใหเขยนโปรแกรมรบจานวนเตม 10 จานวนเกบไวในตวแปรแถวลาดบ แลวเรยงคาจากมากไปหานอยแลวแสดงผลลพธทไดออกทางจอภาพดงตวอยาง input : 99 -89 77 196 21 0 -99 55 66 19 output : 196 99 77 66 55 21 19 0 -89 -99
©2011 CE-KMITL v0.1
114
บทท 8 ตวแปรโครงสราง Structure
วตถประสงคการศกษา 1) ศกษาการตวแปรโครงสราง 2) เขยนโปรแกรมทมการใชตวแปรโครงสรางเกบขอมลได
8.0 ตวแปรโครงสราง ตวแปรโครงสรางมคณสมบตในการจดกลมขอมล เชน ขอมลนกเรยนประกอบดวยชอ นามสกล อาย เกรด ทงหมดเปนขอมลทรวมอยในนกเรยนหนงคน ภายในตวแปรโครงสรางหนงตวสามารถมพารามเตอรหรอตวแปรไดหลายๆตว และมชนดของตวแปรแตกตางกน ตวอยาง นกเรยน(student) ประกอบไปดวย ชอ(name), นามสกล(surname), อาย(age) และ เพศ (gender
หากไมใชตวแปรโครงสราง เราจะตองเขยนโปรแกรมเกบขอมลของนกเรยนทง 3 คนดงน #include<stdio.h> main( ) { char student1_name[15], student2_name[15], student3_name[15]; char student1_surname[30], student2_surname[30], student3_surname[30]; int student1_age, student2_age, student3_age; char student1_gender[7], student2_gender[7], student3_gender[7]; } อะไรจะเกดขน หากเราตองเขยนโปรแกรมรองรบนกเรยน 2,000 คน? โปรแกรมจะยาวมาก และทาใหเขยนโปรแกรมยากลาบาก โครงสรางขอมล (Structure) คอการกาหนดตวแปรชนดใหมขนมาใชงาน โดยนาตวแปรพนฐานในภาษา C มารวมกนเปนโครงสรางของตวแปรชนดใหม เชน
8.1 การประกาศตวแปรโครงสราง //รปแบบท 1 struct name { type var_1; type var_2; ……… type var_n; };
//รปแบบท 2 struct name { type var_1; type var_2; ……… type var_n; } struct_var;
©2011 CE-KMITL v0.1
115
struct name struct_var;
ตวอยาง ประกาศตวแปรโครงสรางใชเกบขอมลนศ. ซงประกอบดวย ชอ นามสกล อาย และเพศ //รปแบบท 1 struct student { char name[15]; char surname[30]; int age; char gender[7]; }; struct student st1,st2;
//รปแบบท 2 struct student { char name[15]; char surname[30]; int age; char gender[7]; } st1,st2;
8.2 การอางถงตวแปรในโครงสราง การกาหนดหรออานคาของตวแปร ภายในโครงสรางทาได โดยมรปแบบดงน struct_var.var_name การเขาถงตวแปรแตละตวจะใช "." นาหนา ตามดวยชอตวแปร เชน struct product { char name[15]; int count; float price; }; struct product pr1,pr2;
pr1.name pr1.count pr2.price pr2.count เปนตน
8.3 การกาหนดขอมลใหตวแปรโครงสราง วธการกาหนดขอมลใหกบตวแปรทเปนสมาชกของโครงสราง ทาไดในลกษณะแบบเดยวกบตวแปรปกต เชน pr1.count = 10; pr1.price = 30; แตในกรณทตวแปรเปนชนดขอความ เชน pr1.name = "Joy" /* error */ ไมสามารถกาหนดคาใหได ตองใชคาสง strcpy ( ) เชน strcpy(pr1.name, "Joy" ) /*pass*/ หมาเหต: strcpy() เปนคาสงคดลอกขอความ เมอใชงานจาเปนตอง #include <string.h>
โปรแกรม 8.1 ประกาศตวแปรโครงสราง
#include<stdio.h> #include<conio.h> int main() { struct income { float salary; float bonus; int age; }; struct income people1; people1.salary = 16000; people1.bonus = 40000;
©2011 CE-KMITL v0.1
116
people1.age = 23; return 0; }
โปรแกรม 8.2 กาหนดคาใหตวแปรโครงสราง
#include<stdio.h> #include<conio.h> #include<string.h> int main() { struct letter { char name[20]; char surname[30]; char message[50]; } first; printf ("Enter name : "); scanf ("%s", first.name); printf ("Enter surname : "); scanf ("%s",first.surname); strcpy (first.message,"Hi"); printf ("%s",first.message); printf ("\n%s",first.name); printf (" %s",first.surname); return 0; }
โปรแกรม 8.3 โปรแกรมเกบขอมลหนงสอ
จงเขยนโปรแกรมสาหรบเกบขอมลของหนงสอ 1 เลม โดยขอมลของหนงสอประกอบดวยคอ ชอหนงสอ, ราคา และสวนลด(คงท 10 %) โดยกาหนดใหใชเกบขอมลแบบโครงสราง โปรแกรมจะแสดงผลการทางานดงน
#include<stdio.h> #include<conio.h> int main() { struct book { char name[50]; float price; float discount; } book1; printf ("Enter book name : "); gets (book1.name); printf ("Enter book price : "); scanf ("%f",&book1.price); book1.discount = 0.1*book1.price; printf ("\n\n\n\nBook : %s\n",book1.name); printf ("Price : %.2f\n",book1.price); printf ("Discount 10 percent : %.2f\n" "Total price : %.2f", book1.discount, book1.price - book1.discount);
©2011 CE-KMITL v0.1
117
return 0; }
8.4 การกาหนดคาเรมตนใหโครงสราง เราสามารถกาหนดคาเรมตนใหแกโครงสรางได โดยการกระทาคลายกบการกาหนดคาเรมตนใหแกตวแปรทวไป แตตวแปรโครงสรางจะตองกาหนดคาเรมตนใหตามลาดบของตวแปรทประกาศไว #include<stdio.h> #include<conio.h> int main() { struct book { char name[50]; float price; } b1 = {"harry",120}; struct book b2 = {"Using C",150}; struct book b3 = {150, "Pascal" }; //เกด error return 0; }
//ขอมลเกบในตวแปรโครงสราง
8.5 ประกาศตวแปรโครงสรางแบบอารเรย กรณทตองใชตวแปรชนดโครงสรางซาๆกนหลายๆ ตว เราสามารถใชคณสมบตของอารเรย กบโครงสรางได เรยกวา Structure Array ตวอยางเชนตองการตวแปร student1, student2, …, student10 จะสามารถกาหนดเปนตวแปรโครงสรางเปนอารเรย คอ student[10] เปนตน
//ตวอยางประกาศโครงสรางแบบไมใชอารเรย struct profile student1, student2, student3, student4, student5, student6, student7, student8, student9, student10;
//ตวอยางประกาศโครงสราแบบใชอารเรย struct profile student[10];
รปแบบการประกาศโครงสรางแบบอารเรย //รปแบบท 1 #include<stdio.h> int main() { struct profile{ char name[20]; int age; char grade; }; struct profile student[10]; return 0; }
//รปแบบท 2 #include<stdio.h> int main() { struct profile{ char name[20]; int age; char grade; } student[10]; return 0; }
name char[50] price float
b1
b2
b3
120harry
150Using CPascal150
struct profile{char name[20];int age;char grade;
};
student1,student2,student3,..
student[10]
©2011 CE-KMITL v0.1
118
โปรแกรม 8.4 เกบขอมลนศ.จานวน 10 คน
จงเขยนโปรแกรมเกบขอมลนกศกษาจานวน 10 คน โดยมรายละเอยดประกอบดวย ขอมลประกอบดวย ชอกบ อาย รบขอมลนกศกษาจาก keyboard โปรแกรมจะตองใช structure array เมอปอนขอมลเสรจ โปรแกรมจะคนหานกเรยนทอายมากกวา 20 ป แสดงชอ ออกจอภาพ หนาจอของโปรแกรมเมอทางานแสดงดงน
#include<stdio.h> #include<conio.h> #include<string.h> int main() { int i; struct profile{ char name[20]; int age; } s[10]; for(i=0;i<10;i++) { printf("Student[%d]\n",i); printf("\t name:"); scanf("%s",s[i].name); printf("\t age:"); scanf("%d",&s[i].age); } for(i=0;i<10;i++) if(s[i].age > 20) printf("\n %s,%d",s[i].name,s[i].age); return 0; }
8.6 โครงสรางซอนโครงสราง (Nest structure) เราสามารถสรางโครงสรางซอนโครงสรางได เรยกวา Nest structure เชนประกาศโครงสราง C โดยภายในโครงสราง C ประกอบดวยโครงสราง A และ B มลกษณะดงรป //ตวอยางการประกาศโครงสรางซอนโครงสราง struct A{ ... }; struct B{ ... }; struct C{ struct A data_a;
//รปแบบของโครงสรางซอนโครงสราง
©2011 CE-KMITL v0.1
119
struct B data_b; ... };
ตวอยางประกาศโครงสรางซอนโครงสราง เพอเกบขอมลทอย struct address{ int num; int moo; char road[20]; char district[20]; char province[20]; }; struct phone{ char home[10]; char mobile[10]; }; struct student{ char name[20]; char surname[20]; char id[9]; sturct address add; struct phone tel; };
//ลกษณะของโครงสรางทซอนกน
โปรแกรม 8.5 โปรแกรมเกบขอมลสถานศกษา
#include<stdio.h> #include<conio.h> #include<string.h> int main() { struct address{ int add; int moo; char road[20]; char district[20]; char province[20]; }; struct university{ char name[70]; struct address place; }; struct university king; strcpy (king.name,”King Mongkut\'s Institute of Technology Ladkrabang”); king.place.add = 3; king.place.moo = 2; strcpy(king.place.road,”Chalongkrung”); strcpy(king.place.district,”Ladkrabang”); strcpy(king.place.province,”Bangkok”); printf ("%s\n",king.name); printf ("Address : %d Moo %d, %s Rd.\n", king.place.add,king.place.moo,king.place.road); printf (" %s, %s",king.place.district, king.place.province); return 0; }
//ผลลพธ King Mongkut's Institute of Technology Ladkrabang Address: 3 Moo 2, Chalongkrung Rd.
name surname idadd tel
num moo road district province home mobile
©2011 CE-KMITL v0.1
120
Ladkrabang, Bangkok
8.7 คาถามทายบท 1) ประกาศโครงสรางตอไปน แลวพบวาคาสงเรยกใชโครงสรางคาสงใดไมถกตอง struct product { char name[15]; int count; float price; }; struct product pr1, pr2;
คาสงขอใดไมถกตอง 1. pr1.count = 10; 2. pr2.count = 30; 3. pr1.price = 130.5; 4. pr2.price = 240.75; 5. pr1.name = “Programming”;
2) ประกาศโครงสรางตอไปน แลวพบวาคาสงเรยกใชโครงสรางคาสงใดไมถกตอง struct profile { char name[30]; float salary; }; struct profile a[] ={"John",3000, "Tiger",2000,"Lisa", 5000};
จากสวนของโปรแกรมดานบน ขอใดไมถกตอง 1. a[0].name คอ “John” 2. a[0].salary + a[1].salary มคาเทากบ 5000 3. a[1].salary มคาเทากบ 2000 4. a เปนตวแปรแถวลาดบ ขนาด 6 5. a ใชพนท 102 ไบท
3) การประกาศตวแปรขอใดใชพนทรวมไดหนวยความจา 12ไบท 1. struct data{int item; double price[3]} A; 2. char i[3][3]; int a_str; 3. struct data{char name[8]; float money;} A; 4. int i[3][4]; char a_str; 5. ไมมขอใดถกตอง
©2011 CE-KMITL v0.1
121
การทดลองท 8 โครงสรางขอมล
วตถประสงค 1. เพอใหนกศกษาเขาใจการทางานของตวแปรโครงสราง 2. เพอใหนกศกษาสามารถเรยกใชงานโครงสรางไดถกตอง 3. เพอใหนกศกษาสามารถใชงานตวแปรแถวลาดบชนดโครงสรางได
ทฤษฎ ในการเขยนโปรแกรมสาหรบการใชงานเฉพาะดานตางๆ โปรแกรมเมอรพบปญหาอยางมากเนองจาก ตวแปรมาตรฐานทภาษา C กาหนดไวให ไมสามารถใชงานไดโดยตรง การใชขอมลโดดทภาษา C กาหนดไวเพยงตวเดยวไมสามารถบงบอกรายละเอยดของวตถทมรายละเอยดมากได เชนในการเขยนโปรแกรมระบบทะเบยน ตองมการเกบขอมลของนกเรยน 1 คน โดยขอมลทตองใชในการประมวลผลสาหรบนกเรยน 1 คนไดแก ชอ นามสกล รหสนกศกษา วนเกดทอย โรคประจาตว ฯลฯ ซงการใชชนดขอมลทขอมลโดดๆ เพยงตวเดยวเชน string กไมสามารถเกบขอมลทจาเปนไดทงหมด ในภาษา C จงมกระบวนการทใหโปรแกรมเมอรสามารถสราง ชนดขอมลไดเอง โดยมการนาเอาชนดขอมลทมอยแลวมาประกอบกนใหอยในรปแบบของโครงสรางขอมลใหม (structure) เชน ถาตองมการเกบขอมลเกรดเฉลยของนกศกษา 1 คน โดยขอมลทตองนามาใชคอ รหสนกศกษา ชอ – นามสกล และเกรดเฉลย ซงเมอพจารณาจากโจทยแลวภาษา C ไมไดมชนดขอมลสาหรบทางานนเลย ถาตองการเกบขอมลทงหมดนในชนดขอมลเพยงชนดเดยวโปรแกรมเมอรจะตองสรางชนดขอมลขนมาเอง โดยตองนาชนดขอมล string จานวน 3 ตว สาหรบเกบขอมลรหสนกศกษา ชอนกศกษา และนามสกลตามลาดบ ประกอบกบชนดขอมล float สาหรบเกบขอมลเกรดเฉลย กลายเปนชนดขอมลชนดใหม ทเหมาะกบการเขยนโปรแกรมในลกษณะน การใชงาน structure ในภาษา C นน มการทางานทนกศกษาตองสามารถใชงานใหเปน 2 สวนคอ 1. สรางโครงสรางขอมลทตองการ 2. สามารถใชงานโครงสรางทสรางขนได การสรางโครงสรางขอมลทตองการ ในการสรางโครงสรางขอมลสามารถสรางไดโดยใชคาสง struct ตรงตาแหนง local variable หรอ ตาแหนง global variable สาหรบคาสง struct มรปแบบคาสงดงน //รปแบบท 1 struct name { type var-1; type var-2; ... type var-n; }; struct name variable;
//รปแบบท 2 struct name { type var-1; type var-2; ... type var-n; }variable;
struct name เปนชอโครงสรางทตองการสรางขน – type var-1, type var-2, … ,type var-n เปนสวนของโครงสรางทตองการสรางขน variable เปนชอของตวแปรชนดโครงสรางทมลกษณะโครงสรางเปน name ทประกอบดวย var-1, var-2, ... ตวอยางการสราง struct ทมรายละเอยดการเกบขอมลนกศกษา struct student{ char name[20]; char id[9]; int age ; float gpa; char gender;
©2011 CE-KMITL v0.1
122
};
การใชงานโครงสรางทสรางขน เนองจาก struct เปนวธการทใหโปรแกรมเมอรสามารถกาหนดชนดตวแปรได ดงนนการใชงานคาสง struct จงมการใชงานเหมอนกบการกาหนดชนดตวแปรใหกบตวแปรตวใดตวหนง นอกจากนโปรแกรมเมอรตองสามารถใชงานตวแปรทมชนดขอมลเปน struct ทสรางขนมาแลวได โดยการใชงานตวแปรทถกสรางขนนน โปรแกรมเมอรตองสามารถการอางองขอมลในโครงสรางสวนตางๆ ได ในการอางองสวนตางๆของตวแปรชนดโครงสราง สามารถอางองไดโดยใชชอตวแปร (variable) ตามดวยเครองหมายจด (.) แลวตามดวย สวนของโครงสรางตางๆ (var-1, var-2, …, var-n) เชน variable.var-1 การกาหนดคาใหตวแปรโครงสราง การกาหนดคาใหกบตวแปรโครงสรางสามารถกาหนดได 2 แบบ
1) การกาหนดคาเมอเรมประกาศตวแปรชนดโครงสราง เปนการกาหนดคาเมอประกาศตวแปร กาหนดคาดวยการใสคาทตองการกาหนดลงในเครองหมายปกกา {} โดยเรยงตามลาดบสวนของโครงสรางขอมล
2) การกาหนดคาเมอหลงประกาศตวแปรชนดโครงสราง เปนการกาหนดคาใหกบสวนตางๆของตวแปรโครงสราง เหมอนการกาหนดคาตวแปรปกต
ตวอยาง การกาหนดคาเมอเรมประกาศตวแปรชนดโครงสราง struct student{ char name[20]; char id[9]; int age; float gpa; char gender; }; struct student st = {"kmitl","51010000",17,3.33,'m'};
ตวอยาง การกาหนดคาเมอหลงประกาศตวแปรชนดโครงสราง struct student{ char name[20]; char id[9]; int age; float gpa; char gender; };
struct student st; strcpy (st.name,"kmitl") strcpy (st.id,"51010000") age = 17; gpa = 3.33; gender = 'm';
Array of Structure ในการทางานกบ Structure นนโดยทวไปเรามกจะไมมการใชงาน Structure เพยงอยางเดยว มกจะมการใชงานควบคกบ Array โดยสรางตวแปรทมลกษณะเปน Array of Structure เชน กรณทเราตองการเกบขอมลเกรดเฉลยของนกศกษาแตละคนในกลมนกศกษาจานวน 10 คน กอนอนจะตองมการสรางโครงสรางขอมลสาหรบเกบขอมลของนกศกษา 1 คนกอน เชน struct student{ char ID[10]; char Name[50]; float gpa; };
หลงจากนนจงสรางตวแปร array ขนมาโดยกาหนด type เปน struct student ดงน struct student std[10]; เราจะได array ทขอมลแตละชองคอ struct student ในการอางองขอมลใน struct ของ array สามารถทาไดโดยการกาหนดคาใหกบโครงสรางยอยแตละตวดงตวอยาง การกาหนดคา gpa ใหกบนกเรยนคนแรก สามารถทาไดโดยการใชคาสง std[0].gpa = 3.40; เปนตน
©2011 CE-KMITL v0.1
123
การทดลองท 8.1
1. ใหนกศกษาออกแบบโครงสรางขอมลสาหรบเกบขอมลนกศกษาสาหรบงานทะเบยนนกศกษา โดยสามารถเกบรหสนกศกษา ชอ นามสกล เพศ วนเดอนปเกดได 2. ใหนกศกษาออกแบบโครงสรางขอมลสาหรบการคานวณเกรดเฉลยของนกศกษาโดยสามารถเกบรหสวชาชอวชา หนวยกต และเกรด 3. ใหนกศกษาออกแบบโครงสรางขอมลสาหรบการเกบขอมลรถยนตของกรมการขนสง โดยสามารถเกบทะเบยนรถ ยหอรถ ชนดรถยนต ส หมายเลขตวถง 4. ใหนกศกษาออกแบบโครงสรางขอมลสาหรบเกบขอมลหนงสอในหองสมด โดยสามารถเกบ หมวดหนงสอ เลขเรยกหนงสอ ชอหนงสอ ชอผแตง สานกพมพ ISBN
การทดลองท 8.2
1. ใหนกศกษาเขยนโปรแกรมรบขอมลนกศกษาโดยใชโครงสรางทไดออกแบบไว 2. ใหนกศกษาเขยนโปรแกรมเพอรบคาชอวชา เกรด และหนวยกตของวชาตางๆ จานวนมากทสด 10 วชา โดยใชโครงสรางขอมลสาหรบคานวณเกรดเฉลยของนกศกษาทไดออกแบบไวในการทดลองท 8.1 หลงจากนนใหคานวณเกรดเฉลยทไดแสดงผลในหนาจอ (Hint : ใช Array of structure เพอเกบขอมลทละ 10 วชา) 3. ใหนกศกษาเขยนโปรแกรมเพอรบคาขอมลนกศกษา 5 คนและผลการเรยน 5 วชาของนกศกษาแตละคนพรอมทงใหแสดงผลลพธคอคะแนนสงสด,ตาสดของแตละวชา ชอนกศกษาทไดคะแนนสงสดของแตละวชา และชอนกศกษาทไดคะแนนรวมสงสด (สรางโครงสรางขอมลใหมโดยประกอบจากโครงสรางขอมลในขอ 8.1) 4. ใหนกศกษาเขยนโปรแกรมสาหรบเกบขอมลหนงสอในหองสมด โดยสามารถเกบชอหนงสอ ชอผแตง และสานกพมพ โดยแตละฟลดมขนาดไมเกน 50 ไบต โดยโปรแกรมมความสามารถดงน a. แสดงเมนทงหมด 4 เมน คอ เพมขอมลหนงสอ ลบขอมลหนงสอ แสดงขอมลหนงสอ และออกจากโปรแกรม b. การเพมขอมลหนงสอสามารถเพมขอมลไดมากทสด 20 เลม โดยใหผใชงานกรอกรายละเอยดของหนงสอทงหมด c. การแสดงรายการหนงสอสามารถแสดงผลรายละเอยดหนงสอทงหมด ทเกบขอมลไวได d. การลบขอมลหนงสอ สามารถลบจากเลขลาดบหนงสอทตองการลบขอมล 5. ใหนกศกษาออกแบบโครงสรางขอมลเพอเกบขอมลประวตการยมและคนหนงสอของนกศกษา โดยออกแบบโครงสรางขอมลทเชอมตอโครงสรางขอมลทสรางไวแลวในขอ 8.1 พรอมทงเขยนโปรแกรมทดสอบการทางาน
©2011 CE-KMITL v0.1
124
บทท 9 ตวแปรชตาแหนง (Pointer)
วตถประสงคการศกษา 1) เพอศกษาตวแปรประเภทตวช 2) เพอนาตวแปรประเภทตวชไปใชงานไดถกตอง
9.1 โครงสรางของหนวยความจาและตวช
9.1.1 การประกาศตวแปร pointer
type *pointer_name;
type คอ ชนดของตวแปรประเภทตวช (pointer) * คอ เครองหมายแสดงวาเปนตวแปรประเภทตวช pointer_name คอ ชอของตวแปรประเภทตวช ตวอยางการใชตวช int * ptr_int; /* pointer to integer */ float * ptr_float; /* pointer to float */ char * ptr_char; /* pointer to char */
9.1.2 ตวดาเนนการ (Reference Operator) “&”
ตวดาเนนการ & สงกลบเลขทอย (Address) ของวตถ int count; int *ptr; ptr = &count //ให ptr ชไปท count
//รปแสดงลกษณะการชของ pointer ในหนวยความจา
15
3.1415
0000
'A'…
ทอยของขอมล(Address)
ขอมล ประเภท
0000
0002
0006
XXXX
int
float
char
ชอตวแปร ขนาด
count
pi
ch
2 bytes
4 bytes
1 bytes
…
0001
000300040005
ptr = &countตวช ptr ชไปทอยของตวแปรชอ count
©2011 CE-KMITL v0.1
125
ตวอยางการประกาศตวแปร pointer พรอมกาหนดใหชไปยงตวแปรทตองการ //ประกาศตวแปร int count = 15; //ขนาดของ count 2byte float pi = 3.1415; //ขนาดของ pi 4byte char ch = ‘A’; //ขนาดของ ch 1byte //ประกาศ pointer และใหชไปยงตวแปร char *ptr_char = &ch; //ขนาดของ ptr_char 4byte float *ptr_float = π //ขนาดของ ptr_float 4byte int *ptr_int = &count; //ขนาดของ ptr_int 4byte
//รปแสดงลกษณะการชของ pointer ในหนวยความจา
9.1.3 ตวดาเนนการเชงออม (Indirect Operator) “*”
เปนตวดาเนนการเชงออม (Indirection) หรอ กลบการอางอง (Dereferencing) int count = 15, y, z[10]; int *ptr; // ptr เปนตวช int ptr = &count; // ptr ชไปท count y = *ptr; // y มคา 15 *ptr = 0; // count มคา 0 ptr = &z[0]; // ptr ชไปท z[0]
9.2 การแสดงตวชดวยฟงกชน printf ฟงกชน printf สามารถแสดงตาแหนงทอย (address) ไดโดยใช เครองหมาย
%p เพอแสดงตาแหนงเปนเลขฐานสบหก %u เพอแสดงตาแหนงเปนเลขฐานสบ ผลลพธทไดจะอยในรปแบบ XXXX:YYYY หรอ XXXX ขนอยกบ memory model ทใช
โปรแกรม 9.1 โปรแกรมแสดงขอมลผานทาง pointer
©2011 CE-KMITL v0.1
126
#include<stdio.h> int main() { char letter = 'D'; int num = 19; float point = 26.09; char *pt_letter; int *pt_num; float *pt_point; pt_letter = &letter; pt_num = # pt_point = &point; printf("Address of letter = %p \n",pt_letter); printf("Address of num = %p \n",pt_num); printf("Address of point = %p \n",pt_point); return 0; }
//รปแสดงลกษณะการชของ pointer ในหนวยความจา
//ผลลพธ Address of letter = 0000 Address of num = 0002 Address of point = 0004
โปรแกรม 9.2 โปรแกรมการใช referencing และ dereferencing
int main() { int num1 = 113,num2; float price1 = 4.85; char hint1 = 'J',hint2; int *pt_num; float *pt_price; char *pt_hint; pt_num = &num1; pt_price = &price1; pt_hint = &hint1; num2 = *pt_num; hint2 = *pt_hint; printf ("Variable num1 = %d \n", num2); printf ("Variable price1 = %f \n",*pt_price); printf ("Variable hint2 = %c \n", hint2); return 0; }
//รปแสดงลกษณะการชของ pointer ในหนวยความจา
//ผลลพธ Variable num1 = 113 Variable price1 = 4.850000 Variable hint2 = J
โปรแกรม 9.3 โปรแกรมการใช referencing และ dereferencing แบบ2
#include<stdio.h> #include<conio.h> int main()
D
0000
letter19
0002
num26.09
0004
point
????
pt_letter
????
pt_num
????
pt_point0000 0002 0004
113
--x--
num14.85
--y--
price1J
--z--
hint1
--y--pt_price
--x--pt_num
--z--pt_hint
num2 hint2
J113
©2011 CE-KMITL v0.1
127
{ int a; int *aPtr; a = 7; aPtr = &a; //ให aPtr ช a printf ("The address of a is %p\n The value of aPtr is %p\n\n", &a, aPtr); printf ("The value of a is %d\n The value of *aPtr is %d\n\n", a, *aPtr); printf ("Proving that * and & are complements of each other.\n&*aPtr = %p\n*&aPtr = %p\n", &*aPtr, *&aPtr); return 0; }
//ผลลพธ The address of a is FFF4 The value of aPtr is FFF4 The value of a is 7 The value of *aPtr is 7 Proving that * and & are complements of each other. &*aPtr = FFF4 *&aPtr = FFF4
9.3 Pointer ซอน Pointer รปแบบคาสง
type **ptt_name;
Type คอ ชนดของตวแปร พอยนเตอร ** คอ เครองหมายทแสดงวาเปนตวแปร พอยนเตอรซอนพอยนเตอร ptt_name คอ ชอของตวแปร พอยนเตอรซอนพอยนเตอร ตวอยาง Pointer ซอน Pointer float time = 9.28; float *pt_time; float **ptt_time; //ประกาศ pointer ซอน pointer pt_time = &time; ptt_time = &pt_time; float temp1; temp1 = *pt_time; float temp2; temp2 = **ptt_time; //ดงคาท pointer ช
9.4 ตวชและแถวลาดบ ตวชและแถวลาดบในภาษาซนน มความใกลชดกนอยางมาก การประกาศ float v[5] เปนการกาหนดแถวลาดบ v ขนาด 5 นนคอกลมของวตถตดกน 5 ชนมชอวา v[0], v[1], v[2], v[3], v[4]
©2011 CE-KMITL v0.1
128
การประกาศ float *vPtr และกาหนดให vPtr ชไปยงตวแปรแถวลาดบ v สามารถทาไดสองวธคอ //วธท 1
vPtr = v; //วธท 2
vPtr = &v[0];
9.4.1 การยาย Pointer ทชตวแปรอารเรย ดวย += และ -=
ตวชสามารถนามาคานวณทางเลขคณตได ดงน เพม (++, increment) หรอลด (--, decrement) จานวนเตมสามารถบวกกบตวชได ( + หรอ += ) หรอลบกบตวชได (– หรอ –= ) ตวชตวหนงสามารถลบกบตวชอกตวหนงได เมอบวกหรอลบจานวนเตมกบตวชแลว คาของตวชมไดเพมหรอลดลงตามตวเลขจานวนนน คาของตวชเพมหรอลดตามตวเลขจานวนนนคณกบขนาดของวตถทตวชนนชอย ขนาด (ไบท) ขนกบประเภทของขอมลทใชในวตถนน ตวอยาง (กาหนดขนาดของวตถ ชนด float คอ 4 ไบท) //เรมยาย Pointer vPtr += 2; // vPtr = vPtr+(2*4) // or vPtr = 3000+(2*4)
//กอนยาย Pointer
//หลงยาย Pointer
//เรมยาย Pointer vPtr -= 2; // vPtr = vPtr-(2*4) // or vPtr = 3008-(2*4)
//กอนยาย Pointer
//หลงยาย Pointer
9.4.2 การยาย Pointer ทชตวแปรอารเรย ดวย + และ -
เขยนคาอธบายเพม
©2011 CE-KMITL v0.1
129
9.4.3 การคานวณจานวน element ดวย pointer
//pointer ตวแรก vPtr = &v[0]; // vPtr = 3000 //pointer ตวทสอง v2Ptr = &v[2]; // or v2Ptr = 3008 //คานวณจานวน element ของ array ท pointer ทงสองช x = v2Ptr – vPtr; // x = จานวน element
คาท x ไดรบคอจานวนหนวย (element) ของตวแปรแถวลาดบนบจาก vPtr ถง vPtr2 ในกรณนคอ 2
โปรแกรม 9.4 โปรแกรมแสดงการใช pointer กบ array
int num[5] = {12, 34, 112, 45, 907}; int *pt_num; pt_num = &num[1]; pt_num = &num[4]; int temp; temp = *pt_num;
โปรแกรม 9.5 โปรแกรมแสดงการใช pointer กบ array
float *pt_num; pt_num = num; float test1, test2; test1 = *(pt_num+3); test2 = *(pt_num+1);
9.4 ความสมพนธระหวาง Pointer กบ Array เหนไดวาตวชและตวแปรแถวลาดบมความสมพนธกน และสามารถใชแทนกนไดเกอบทกกรณ
9.4.1 กรณท 1 ใช array ปกต
int main() { int i, offset, b[] = {10, 20, 30, 40}; int *bPtr = b; //ให bPtr ช b printf("Array b printed with:\n"
//ผลลพธ Array b printed with: Array subscript notation b[0] = 10 b[1] = 20 b[2] = 30
12
0410
num[0]
34
0412
num[1]
112
0414
num[2]
45
0416
num[3]
907
0418
num[4]
0350
pt_num
04120418
050A
temp
907
19.01
0300
num[0]
26.09
0304
num[1]
-4.23
0308
num[2]
-4.24
030C
num[3]
-13.12
0310
num[4]
090D
pt_num
0300
032A
test1
322E
test2
+3
-4.24
+1
26.09
©2011 CE-KMITL v0.1
130
"Array subscript notation\n"); for (i=0; i<=3; i++) printf("b[%d] = %d\n", i, b[i]); //สงเกตทน return 0; }
b[3] = 40
9.4.2 กรณท 2 ใช array เขยนแบบ pointer
int main() { int i, offset, b[] = {10, 20, 30, 40}; int *bPtr = b; //ให bPtr ช b printf("Pointer/offset notation where\n" "the pointer is the array name\n"); for (offset = 0; offset<=3 ; offset++) printf("*(b + %d) = %d\n", offset, *(b + offset)); //สงเกตทน return 0; }
//ผลลพธ Pointer/offset notation where The pointer is the array name *(b + 0) = 10 *(b + 1) = 20 *(b + 2) = 30 *(b + 3) = 40
9.4.3 กรณท 3 ใช pointer เขยนแบบ array
int main() { int i, offset, b[] = {10, 20, 30, 40}; int *bPtr = b; //ให bPtr ช b printf("Pointer subscript notation\n"); for (i=0 ; i<=3 ; i++) printf("bPtr[%d] = %d\n", i, bPtr[i] ); //สงเกตทน return 0; }
//ผลลพธ Pointer subscript notation bPtr[0] = 10 bPtr[1] = 20 bPtr[2] = 30 bPtr[3] = 40
9.4.4 กรณท 4 ใช pointer ปกต
int main() { int i, offset, b[] = {10, 20, 30, 40}; int *bPtr = b; //ให bPtr ช printf("Pointer/offset notation\n"); for (offset=0; offset<=3; offset++)
//ผลลพธ Pointer/offset notation *(bPtr + 0) = 10 *(bPtr + 1) = 20 *(bPtr + 2) = 30 *(bPtr + 3) = 40
©2011 CE-KMITL v0.1
131
printf("*(bPtr + %d) = %d\n", offset, *(bPtr + offset)); //สงเกต return 0; }
9.5 ตวชกบตวแปรโครงสราง เราสามารถใชงานสมาชกของตวแปรแบบโครงสรางไดอยสองวธ
• ใชเครองหมายจด (struc_var.struc_member ) (structure member operator, or dot operator) • ใชเครองหมาย -> เมอเปนตวชไปยงตวแปรแบบโครงสราง เราจะใช structure pointer operator (struc_Ptr-
>struc_member) หากตองการพมพวาชอนกศกษา สามารถทาไดสองวธคอ printf("%s", s.name); printf("%s", sPtr->name); ตวอยาง struct student{ char name[40]; int age ; }; struct student s; struct student *sPtr; strcpy(s.name,“Somsak”); s.age = 19; sPtr = &s;
ตวอยาง struct card { char *face; char *suit; }; struct card a; struct card *aPtr;
ตวอยาง int main(){ struct card { char *face; // 2,3,..,9,J,Q,K,A char *suit; // space, heart, diamond, club }; struct card a; struct card *aPtr;
aPtrxxxx
a.suit
heart\0nnnn
a.face
Queen\0mmmm
mmmm nnnn xxxx
mmmm nnnna a.face a.suit
aPtrxxxx
xxxx yyyy
yyyy
Ace\0 space\0nnnnmmmm
©2011 CE-KMITL v0.1
132
a.face = “Ace"; a.suit = “spade"; aPtr = &a; printf( "%s%s%s\n%s%s%s\n%s%s%s\n", a.face , " of " ,a.suit, aPtr->face , " of " , aPtr->suit, (*aPtr).face, " of " , (*aPtr).suit ); return 0; }
//ผลลพธ Ace of spade Ace of spade Ace of spade
โปรแกรม 9.6 โปรแกรมเกบขอมลนศ. 10 คน
จงเขยนโปรแกรมเกบขอมลนกศกษาจานวน 10 คน โดยมรายละเอยดดงน • ขอมลประกอบดวย ชอกบ อาย • รบขอมลนกศกษาจากคยบอรด • โปรแกรมจะตองใชตวชทชไปยงขอมลประเภทโครงสราง • เมอปอนขอมลเสรจ โปรแกรมจะคนหานกเรยนทอายมากกวา 20 ป แสดงชอ ออกจอภาพ
#include<stdio.h> #include<conio.h> int main() { struct profile{ char name[20]; int age; } s[10]; int i; struct profile *sPtr; sPtr = s; //sPtr ชท s[0] //รบคา for (i=0; i<10; i++) { printf("Student # %d\n\tName :", i+1 ); scanf("%s",sPtr->name); printf("\tAge:"); scanf("%d",&(sPtr->age)); sPtr++; } sPtr -= 10; //ยาย sPtr กลบ //แสดงผล for (i=0; i<10; i++) { if ((sPtr->age) > 20) printf("\n%s, %d",sPtr->name,sPtr->age); sPtr++;
ผลลพธ
©2011 CE-KMITL v0.1
133
} return 0; }
9.6 คาถามทายบท 1) จงสรางอารเรย A เปนอารเรยขนาด 3x3 เกบขอมลตวเลข 1-9 แลวแสดงผลลพธตวเลขในอารเรยโดยใชการอางองคาตวเลขโดยใช Pointer เทานน 2) กาหนดให x และ y เปนตวแปรแบบทศนยม จงเขยนโปรแกรม ทาการสลบคา x และ y โดยใช pointer เทานน 3) ให S เปน Structure ทเกบขอมลตวเลข 3 ตว จงเขยนโปรแกรมใหเกบขอมลตวเลขตวท 1 และ 2 ลงใน Structure แลวหาผลรวมลงในตวเลขตวท 3 โดยใชการอางองขอมลโดย Pointer เทานน
©2011 CE-KMITL v0.1
134
การทดลองท 9 ตวช (Pointer)
วตถประสงค 1. เพอใหนกศกษาเขาใจตวแปรประเภทตวชและการคานวณตาง ๆ ของตวช 2. เพอใหนกศกษาเขาใจความสมพนธระหวางตวชกบตวแปรแถวลาดบ
ทฤษฎ ในการทางานของคอมพวเตอร นอกจากจะตองทราบชนดขอมล และปรมาณขอมลแลว สงสาคญอกอนหนงทคอมพวเตอรจาเปนตองทราบคอ ตาแหนงทเกบขอมล ในการกาหนดวาขอมลตวแปรตางๆ จะเกบไว ณ ตาแหนงไหนในหนวยความจา จะเปนหนาทของระบบปฏบตการ สาหรบโปรแกรมเมอรแลว เราจะทราบคาตาแหนงของตวแปรตางๆ ทระบบปฏบตการกาหนดตาแหนงไวใหแลวได โดยการใชเครองหมาย & นาหนาตวแปรนนๆ ซงนกศกษาเคยเหนรปแบบการใชงานลกษณะนแลวตงแตคาสง scanf แลว จากคาสง scanf(“%d”,&a); ทไดเรยนมาแลว โดยการทางานของคาสงน คอการสงใหคอมพวเตอรรบขอมลจากคยบอรดแลวนามาตความเปนตวเลขจานวนเตม เกบไว ณ ตาแหนงของตวแปร a ซงเราใชสญลกษณะ &a แทนตาแหนงของตวแปร a เนองจาก ตาแหนงของตวแปรหรอขอมลตางๆ ถอวาเปนขอมลอกชนดหนงทโปรแกรมเมอร จาเปนตองใชงานเชนกน ภาษา C จงมการกาหนดคาชนดขอมลชนดหนง ทใชในการเกบ ตาแหนงของตวแปรหรอขอมลไว นนคอ ตวช(pointer) ตวชเปนตวแปรทบนทกตาแหนงของหนวยความจา แทนทจะบนทกคาหนง ๆ เชนตวแปรประเภทอน ๆ ตวแปรประเภทตวชบนทกตาแหนงของหนวยความจา(Memory Address) อาจกลาวไดวาตวแปรประเภทตวชอางองถงขอมลอยางออม (indirect reference) การประกาศตวแปรประเภทตวช ประกาศโดย Type * pointer_name; type คอชนดของตวแปรทตวชจะอางองไปถง โดยท int ประกาศตวแปรทตวชจะอางองไปถงเปนประเภทจานวนเตม float ประกาศตวแปรทตวชจะอางองไปถงเปนประเภททศนยม char ประกาศตวแปรทตวชจะอางองไปถงเปนประเภทอกขระ * เครองหมายแสดงวาเปนตวแปรประเภทตวช Pointer_name ชอของตวแปรประเภทตวช เมอประกาศตวแปรประเภทตวชแลว ตวชนนจะอางองไปถงตวแปรไดโดยกาหนดตาแหนงของตวแประใหกบตวช สญลกษณ & (Address Operator) ในภาษาซ จะใหผลลพธคอตาแหนงทอยของตวแปรนน ตวอยางเชน int y = 5 /* ประกาศตวแปร y เปนประเภทจานวนเตม และมคาเรมตน 5 */ int *yPtr /* ประกาศตวแปร yPtr เปนตวชทจะอางองไปยงตวแปรประเภทจานวนเตม */ yPtr = &y /* ประกศให yPtr อางองไปถงตาแหนงของ y */
จากตารางขอมลเราจะเหนวาตวแปร yPtr จะมการเกบขอมลตาแหนงของตวแปร y หรอความสมพนธระหวางyPtr กบ y คอ ตวแปร yPtr เปน pointer ชตวแปร yเมอตวชอางองไปถงตวแปรใดตวแปรหนงแลว เราสามารถใชสญลกษณ * (indirect operator หรอ Dereferenceoperator) เพอจะอางถงขอมล ณ ตาแหนงทตวแปรนนเกบอย ดงนนเมอใช *yPtr จะไดผลลพธทอางองถงในกรณนคอ จานวนเตม 5
©2011 CE-KMITL v0.1
135
ในภาษาซนนตวแปรประเภทตวชและแถวลาดบมความใกลชดกนมาก เชนเมอประกาศ int v[5] จะมการจองเนอทสาหรบขอมลประเภท Integer (ขนาด 4 ไบท) ขนมาหาตาแหนงตดกน สมมตใหตาแหนงเรมตนอยทตาแหนง 0x22ff74 และแตละตวมขนาดสองไบท จะมการจดเกบในหนวยความจาดงตอไปน
ตวแปรประเภทตวชในกรณขางตนน จะถกประกาศโดยใชคาสง int *vPtr; และกาหนดใหตวชน ชไปทตาแหนงเรมตนของตวแปรแถวลาดบโดยใชวธใดวธหนงดงตอไปน vPtr = v; /* วธท 1 */ vPtr = &v[0] /* วธท 2 */ เมอใชวธแรกตวชจะชไปยงตาแหนงเรมตนคอตาแหนงของ v[0] เสมอ แตเมอใชวธทสอง เราสามารถใหตวชนนชไปทตาแหนงใด ๆ ในตวแปรแถวลาดบได ดงนนควรจะพจารณาใหถวนถวา ณ ขณะนน ตวชชทตาแหนงใดอยการใชงานขอมลทเกบไวในตวแปรแถวลาดบนน มอยสวธตามตวอยางตอไปน สมมตใหมตวแปรประเภทตวชและแถวลาดบดงตวอยางขางตน และกาหนดใหตวชชไปยงตาแหนงแรกของตวแปรแถวลาดบ โดยคาสงใดคาสงหนงในสองวธทกลาวไปแลว การเขาถงขอมลของตวแปรแถวลาดบตาแหนงท n สามารถทาไดโดย 1. v[n] เปนการใชงานขอมลแบบแถวลาดบตามแบบปกต 2. *(v+n) เปนการใชงาน Dereference operator (*) โดยเรมจากตาแหนงเรมตนทระบโดย v และเพม(หรอลด)ไปอก n หนวย สงเกตไดวาวธการนใชตวแปรแบบแถวลาดบแบบตวช 3. vPtr[n] เปนการใชตวแปรประเภทตวชโดยระบตาแหนงหางไปจากตาแหนงเรมตน n หนวย สงเกตไดวาวธการนใชตวชเสมอนวาเปนตวแปรแถวลาดบ 4. *(vPtr+n) เปนการใชขอมลแบบตวชตามปกต คอใช Derefernce operator (*) โดยเรมจากตาแหนงทระบโดยตวช (vPtr) หางออกไปอก n หนวย การคานวณทางคณตศาสตรของตวช เปนอกหวขอหนงซงนกศกษาพงใชดวยความระมดระวง การเพมหรอลดคาของตวชดวยจานวนเตมใด ๆ จะเปนการเพมหรอลดคาทตวชนนเกบอยคณดวยขนาดของวตถทตวชนนชอย เชนเมอเปนตวชทชไปยงตวเลขจานวนเตม (Integer) ซงมขนาด 4 ไบท การเพมหรอลดจะเปนการทวคณของขนาด (ในกรณนคอ 4 ไบท) เชนหากวา vPtr ชไปยงตาแหนง 3000 เมอใชคาสง vPtr++ แลว vPtr จะเพมไปอกหนงหนวย (ในกรณน คอ4 ไบท) ตาแหนงใหมท vPtr ชไปจงเปนตาแหนงท 3000 + (1 หนวย * 4 ไบท) คอตาแหนง 3004 ผลลพธของการคานวณทางคณตศาสตรกเชนเดยวกน นนกคอจะไดเปนหนวยของวตถในกรณทตวชนนชไปยงขอมลประเภทโครงสราง การใชขอมลในโครงสรางนนทาไดโดยใชเครองหมาย ->(Structure pointer operator) คอใชรปแบบ StructurePointer->StructureMember
การทดลองท 9.1
เขยนโปรแกรมตอไปนและสงเกตผลลพธ #include <stdio.h> int main(void) { char letter = 'D'; int num = 19 ; float point = 26.09; char *pt_letter; int *pt_num; float *pt_point; pt_letter = &letter;
©2011 CE-KMITL v0.1
136
pt_num = # pt_point = &point; printf("Address of letter = %p \n", pt_letter); printf("Address of num = %p \n", pt_num); printf("Address of point = %p \n", pt_point); return 0; }
1) บนทกผลลพธของโปรแกรม
2) ใหนกศกษาใชคาสง printf แลวใช format string ตางๆ ตอไปน %p สาหรบสงใหคาสง printf แสดงคาตาแหนงในหนวยความจา %c สาหรบสงใหคาสง printf แสดงตวอกษร %f สาหรบสงใหคาสง printf แสดงคาตวเลขทศนยม %d สาหรบสงใหคาสง printf แสดงคาตวเลขจานวนเตม แลวเตมคาตางๆ ตอไปนในตารางใหสมบรณ (สาหรบคาทถกอางอง ใหเตมเฉพาะชองทตวแปรเปนตวชเทานน)
การทดลองท 9.2
เขยนโปรแกรมตอไปน แลวบนทกผล #include <stdio.h> void main(void) { int v[5] = { 10, 20, 30, 40, 50};/* int v[] = { 10, 20, 30, 40, 50} */ int *v1Ptr, *v2Ptr; v1Ptr = &v[1]; v2Ptr = &v[2]; printf("The address of v1Ptr in Hex is %p and in DEC is u\n",v1Ptr,v1Ptr); printf("The address of v2Ptr in Hex is %p and in DEC is %u\n",v2Ptr,v2Ptr); printf("The result of v2Ptr-v1Ptr is %d\n", v2Ptr-v1Ptr); printf("Size of integer is %d\n", sizeof(int)); return 0; }
1. ตาแหนงของ v1Ptr คอ ______________ (ฐานสบหก) และ _______________ (ฐานสบ) 2. ตาแหนงของ v2Ptr คอ______________ (ฐานสบหก) และ _______________ (ฐานสบ) 3. ผลลพธของ v2Ptr – v1Ptr คอ ______________________ 4. ขนาดของตวแปรประเภท integer มขนาด __________ ไบท
การทดลองท 9.3
เขยนโปรแกรมตอไปน แลวบนทกผล int main(void) { int i, offset, b[] = {10, 20, 30, 40); int *bPtr = b;
©2011 CE-KMITL v0.1
137
printf("Array b printed with: \n","Array Subscript notation \n"); for (i=0; i<=3; i++) printf("b[%d] = %d \n",i,b[i]); printf("Pointer/offset notation where\nthe pointer is the array name\n"); for (offset=0; offset<=3; offset++) printf("*(b+%d) = %d\n",offset, *(b+offfset)); printf("Pointer subscript notation\n"); for (i=0; i<=3; i++) printf("bPtr[%d] = %d\n", i, bPtr[i]); printf("Pointer/offset notation\n"); for (offset=0; offset<=3; offset++) printf("*(bPter+ %d) = %d\n", offset, *(bPtr+offset)); return 0; }
บนทกผล
การทดลองท 9.4
#include <stdio.h> struct card { char *face; /* 2, 3, 4, ... , J, Q, K, A */ char *suit; /* Spade, Heart, Diamond, Club */ }; int main(void) { struct card aCard; struct card *cardPtr; aCard.face = "Ace"; aCard.suit = "Spade"; cardPtr = &aCard; printf("%s%s%s\n%s%s%s\n%s%s%s\n", aCard.face, " of ", aCard.suit, cardPtr->face, " of ", cardPtr->suit, (*cardPtr).face, " of ", (*cardPtr).suit); return 0; }
บนทกผล ใหนกเรยนทดสอบความเขาใจเรองการใชงานตวชโดยตอบคาถามดงตอไปน 1. ตวแปรประเภทตวชเปนตวแปรทบนทก ______________________________________ ของตวแปรตวอน 2. สญลกษณ __________________ ใชเพอแสดงตาแหนง (Address) ของตวแปร 3. สญลกษณ __________________ ใชเพอแสดงขอมล ณ ตาแหนงทตวชนนชอย 4. การประกาศตวแปรแถวลาดบแบบ double ทมชอวา numbers มขนาด 10 หนวย โดยใชมคาเรมตนเปน 0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9 ทาไดโดยใช
©2011 CE-KMITL v0.1
138
5. ประกาศตวชชอวา nPtr โดยใหชไปยงตวแปรแถวลาดบในขอขางตน โดยใหชไปทตวแปรแถวลาดบตวแรกสามารถทาไดสองวธคอ 6. จากการทดลองจะเหนไดวาเราสามารถใชงานขอมลแถวลาดบไดถงสวธ ทงจากการอางองจากชอตวแปรแถวลาดบหรอจากตวช ถาหากตองการใหแสดงขอมลทงสบจานวนจากตวแปรแถวลาดบนนเราสามารถแสดงขอมลนนไดอยางไรบาง 7. สมมตวา nPtr ชอยทตาแหนงของตวแปรแถวลาดบ โดยใหตาแหนงแรกของตวแปรแถวลาดบอยทตาแหนง FA00 และขนาดของตวแปรชนด double มขนาด 8 ไบท ตาแหนงทอย (Address) เมอเราอางองถง nPtr + 8 คอ ________________________ และคาทเกบอย ณ ตาแหนงนนคอ ____________________________ 8. สมมตวา nPtr ชอยทตาแหนง [ 5 ] ตาแหนงทอย หรอ คาทบนทกอยใน nPtr คอ _______________________________________________________ และถาหากใชคาสง nPtr -= 4 แลว ตาแหนงทอยใหมคอ _____________________________________ ขอมลทบนทกอย ณ ตาแหนงนนคอ ______________________________________________________ 9. สมมตวา nPtr ชอยทตาแหนง [ 5 ] ถาหากวาเราใชอางอง nPtr [0] ตาแหนงทอยคอ __________________ขอมลท บนทก ณ ตาแหนงนนคอ_______________ nPtr [2] ตาแหนงทอยคอ __________________ ขอมลทบนทก ณ ตาแหนงนนคอ_______________ nPtr [-2] ตาแหนงทอยคอ __________________ ขอมลทบนทก ณ ตาแหนงนนคอ_______________
คาถามพเศษ 1. รบคาจานวนตวเลขทศนยม 10 จานวน แลวบนทกในตวแปรแถวลาดบ จากนนใหรบคามาอกหนงคาจากผใชงาน พฒนาโปรแกรมเพอคนหาเลขจานวนนน หากพบจานวนนน ใหแสดงตาแหนง และคานน ๆ ออกทจอภาพ หากไมพบใหแสดงคาวา “Cannot find the matched data” จากนนใหถามวาผใชตองการคนหาอกหรอไม โดยรบอกขระ Y หรอ N ใหโปรแกรมทางานจนกระทงผใชกด N ทงนอนญาตใหใชตวแปรแถวลาดบสาหรบเกบขอมลทงสบจานวน จากนนใหตวชชไปทตาแหนงเรมตนของตวแปรแถวลาดบ แลวไมใหใชตวแปรแถวลาดบอก ใหใชไดแตตวชเทานน 2. ใหสรางตวแปรประเภทโครงสราง โดยใหรบขอมลเกยวกบนกศกษาจานวน 5 คน โดยใหบนทก ชอและนามสกล รหสประจาตวนกศกษา หมายเลขโทรศพททใหตดตอ เกรดของวชาฟสกซ (Physics) คณตศาสตร(Mathematics) เคม (Chemistry) ชววทยา (Biology) โดยรบเปนเกรด A, B, C, D, หรอ F จากนนใหโปรแกรมคนหา โดยโปรแกรมจะรบรหสประจาตวนกศกษา หากพบ ใหแสดงขอมล ชอและนามสกล รหสประจาตวหมายเลขโทรศพท เกรดรายวชา และคะแนนเฉลย (GPA) ของนกศกษานนหากไมพบ ใหแสดงคาวา “ Searchnot found ” ใหโปรแกรมทาไปเรอยจนกวาผใชจะปอนรหสนกศกษาเปน 0 จงออกจากโปรแกรม ทงนใหเกบแปรแถวลาดบทเปนโครงสรางนน แลวไมใหใชตวแปรแถวลาดบอก ใหใชไดแตตวชเทานน 3. ทาเหมอนขอ 2 แตใหเพมขอมลทอย โดยใหเปนโครงสรางอกชดหนง โดยใหมสมาชกของโครงสรางนนเปนบานเลขท (Num) ถนน (Road) ตาบล (Subdistrict) อาเภอ (District) จงหวด (Province) และรหสไปรษณย(ZIPcode) และใหเพมขอมลหมายเลขตดตอ เปนอกหนงโครงสราง โดยใหมสมาชกของโครงสรางนนเปนหมายเลขโทรศพท ปกต (LandlineNumber) หมายเลขโทรศพทเคลอนท (MobileNumber) และหมายเลขโทรสาร (FaxNumber) ดงนนขอมลของนกศกษาแตละคนจะเปนโครงสรางซอนโครงสรางอย ทงนการใชขอมลตาแหนงตาง ๆ ใหใชเฉพาะตวชเทานน เหมอนขอกาหนดเดม
©2011 CE-KMITL v0.1
139
4. เขยนโปรแกรมเพอรบขอมลตวเลขทศนยมสามจานวน แลวสงเลขทศนยมทงสามนไปยงฟงกชนยอย โดยใหฟงกชนยอยสลบตาแหนงของตวเลขทงสองน (ศกษาเรองการสงขอมลแบบ Call by reference) โดยใชตวเลขทแรกไปอยทตาแหนงทสอง ตวเลขตาแหนงทสองยายไปอยตาแหนงทสาม ตวเลขทสามยายไปอยตาแหนงแรก 5. ทาเหมอนขอ 4 แตใหรบขอมลเปนขอความหรอประโยคแทน 6. เขยนโปรแกรมเพอตรวจสอบคาทรบมาวาเปนคาหรอขอความสมมาตร (Palindromes) กนหรอไม ทงนใหใชเฉพาะตวชและการจดการตาง ๆ ของตวชเทานน คาหรอขอความสมมาตรหรอ Palindromes คอคา/ขอความครงซายของคา/ขอความและครงขวาของคา/ขอความสมมาตรกน เชน ABBA หรอ ABCBA หรอ MADAMหรอ “A TOYOTA” หรอ “DNA LAND” หรอ DETARTRATED หรอ “WONTON? NOT NOW” เปน ตน
©2011 CE-KMITL v0.1
140
บทท 10 ฟงกชน (Function)
วตถประสงคการศกษา 1) เพอศกษาการเขยนฟงกชน 2) เพอศกษาการนาฟงกชนมาชวยในการพฒนาโปรแกรม
10.1 ฟงกชนคออะไร ภายในโปรแกรมคอมพวเตอรทเขยนขนมา เมอมจานวนบรรทด และความซบซอนมากขน นกพฒนาจะพบปญหาคอโปรแกรมมความยาว ไมสามารถมองภาพของงานในลกษณะเปนกลมไดโดยงาย หากเราวเคราะหการทางานของโปรแกรมจะพบวามสวนของงานทซาๆกน เชนสวนแสดงผล สวนรบอนพท และอาจจะพบอกวาในโปรแกรมการเรยกใชสวนแสดงผล สวนรบอนพทซาๆกนหลายครง ดงนนวธการลดความซบซอน ลดจานวนบรรทดของโปรแกรม กจะนาเอาการทางานทซาซอน การทางานทสามารถจดกลมงานได แยกออกมาเปนโปรแกรมยอยๆ ซงเราเรยกวา ฟงกชน ฟงกชน คอ ชดของการทางาน หรอกลมคาสงของโปรแกรม ทถกเขยนขนเพอโปรแกรมเมอรสามารถเรยกใชงานไดโดยงาย ลดความซาซอน และแยกสวนประกอบของโปรแกรมไดโดยงาย การพฒนาโปรแกรมกบฟงกชน พบปญหาหลกคอ ทเกดขนคอโปรแกรมทซบซอน เพราะ
• โปรแกรมเมอรไมสามารถทราบการทางานของระบบโดยละเอยดไดเชน ไมทราบกระบวนการสงขอมลผานเครอขาย แตตองเขยนโปรแกรมเพอเชอมตอระบบเครอขาย
• โปรแกรมเมอรไมสามารถทราบขนตอนการทางานของคอมพวเตอรทงหมดได เชน ทาอยางไรตวอกษรจงปรากฏในหนาจอภาพได
• โปรแกรมบางโปรแกรมมการทางานทซบซอน และการทางานซบซอนนนถกเรยกใชงานบอยครงเชน การหาผลลพธทางวทยาศาสตร การวเคราะหขอมลขนาดใหญเปนตน
วธการแกไข
• เพอใหโปรแกรมเมอรสามารถทางานไดโดยไมจาเปนตองทราบรายละเอยดการทางานทงหมดของระบบ จะใหโปรแกรมเมอรททราบการทางานโดยละเอยดของกระบวนการตางๆ จะเขยนชดคาสงในรปแบบของ ฟงกชน แลวแจกจายใหโปรแกรมเมอรอนๆ ไดใชงาน
• โปรแกรมเมอรสามารถเรยกใชฟงกชนโดยทราบเพยงวธการใชงาน และผลลพธทเกดขนหลงจากเรยกใชงานฟงกชนเทานน
• เชน โปรแกรมเมอรทไมทราบวาทาอยางไรตวอกษรจงจะปรากฏหนาจอ สามารถใชคาสง printf ไดเลย โดยโปรแกรมเมอรจะทราบเพยงแค การเรยก printf จะทาใหมตวอกษรปรากฏบนหนาจอไดเทานน
ขอดของฟงกชน
1) ทาใหโปรแกรมเมอรสามารถพฒนาโปรแกรมไดโดยงาย โดยโปรแกรมเมอรไมจาเปนตองทราบวาการทางานของฟงกชนทางานอยางไรทราบเพยงผลลพธของการทางานเทานน
2) โปรแกรมเมอรสามารถเขยนโปรแกรมใหมการทางานทซบซอนได โดยไมจาเปนตองเขยนโปรแกรมสวนทซบซอนนนหลายๆ ครง
3) โปรแกรมเมอรสามารถออกแบบฟงกชนไดตามความตองการของโปรแกรมเมอร
10.2 ประเภทของฟงกชน ฟงกชนแบงออกเปน 2 ประเภท
1) ฟงกชนไลบรารมาตรฐาน (Standard Library function) 2) ฟงกชนทสรางขนเอง (User Defined function)
©2011 CE-KMITL v0.1
141
10.2.1 ฟงกชนไลบรารมาตรฐาน
ฟงกชนไลบรารมาตรฐาน (Standard Library Function) เปนฟงกชนทมอยแลวเกบไวใน Library ในการใชงานตอง include directives กอน Directive คอสารบญของกลมฟงกชน เชน stdio.h , conio.h , string.h , math.h เปนตน การ include directives จะเปนเหมอนการประกาศใหกบ compiler ทราบวาจะใชคาสง ในกลมของ directive นนๆ เชน การใชคาสง sin() ซงอยใน math.h จะตองมบรรทด include math.h เสมอ ดงตวอยาง ตวอยางการเรยกใชฟงกชนมาตรฐาน จากไลบาร math.h #include<stdio.h> #include<conio.h> #include<math.h> //ไลบาร math.h int main() { double rad = -1.0; do { printf ( "Sine of %f is %f\n", rad, sin(rad)); //คานวณคา sin ดวยฟงกชน sin() rad += 0.1; } while (rad <= 1.0); return 0; }
การเรยกใช Standard Library Function มขนตอนดงน
1) ทราบวาโปรแกรมทเขยนตองการการทางานอะไร 2) การทางานดงกลาวคอฟงกชนชออะไร 3) ทราบ directive ทเปนสารบญของคาสง 4) Include directive นนๆ 5) เรยกใชฟงกชนในโปรแกรม
ฟงกชนการคานวณทางคณตศาสตร ฟงกชนทางคณตศาสตรเกบอยใน Library ชอ math.h เวลาเรยกใชจงจาเปนตองประกาศ #include <math.h> sin(var); //คานวณคา sin cos(var); tan(var); sqrt(var); //คานวณรากกาลงสอง (square root) pow(var1,var2); //คานวณเลขยกกาลงโดย var1 ยกกาลงดวย var2 log(var); //คานวณ logarithm ฐานธรรมชาต log10(var); //คานวณ logarithm ฐานสบ exp(var); //คานวณเลขชกาลง (exponential) fabs(var); //คานวณ absolute value ของเลขทศนยม (floating point) abs(var); //คานวณ absolute value ของเลขจานวนเตม (integer)
โปรแกรม 10.1 โปรแกรมคานวณ sin,cos,tan,sqrt,pow,log,log10,exp และ fabs
#include<stdio.h> #include<math.h> int main() { float a = 3.14; float b = -123.456;
//ผลลพธ 0.002 -1.000 -0.002
©2011 CE-KMITL v0.1
142
float c = 2.7; int d = -2000; printf ("%.3f \n", sin(a)); printf ("%.3f \n", cos(a)); printf ("%.3f \n", tan(a)); printf ("%.3f \n", sqrt(a)); printf ("%.3f \n", pow(a,c)); printf ("%.3f \n", log(a)); printf ("%.3f \n", log10(a)); printf ("%.3f \n", exp(a)); printf ("%.3f \n", fabs(b)); printf ("%d \n", abs(d)); return 0; }
1.772 21.964 1.144 0.497 23.104 123.456 2000
ฟงกชนสาหรบอกขระและขอความ ไฟล header => string.h ctype.h //ฟงกชนทใชประจาในไลบาร string.h
strcpy(str1, str2); strcat(dest1, src2); strcmp(dest1, src2); strcmpi(str1, str2); strlen(str);
//ฟงกชนทใชประจาในไลบาร ctype.h
tolower(ch); toupper(ch);
โปรแกรม 10.2 โปรแกรมใช strcpy, strcat, strcmp, strcmpi, strlen, tolower และ toupper
#include <stdio.h> #include <string.h> #include <ctype.h> int main(void) { char string[10]; char *str = "Abc"; //strcpy strcpy(string, str); printf("%s\n", string); //strcat strcat(string, "Def"); printf("%s\n", string); //strcmp and strcmpi printf("%d\n",strcmp(str,"abc")); printf("%d\n",strcmpi(str,"abc")); //strlen printf("%d\n",strlen(string)); //tolower and toupper string[0] = tolower(string[0]); string[1] = toupper(string[1]);
//ผลลพธ Abc AbcDef -1 0 6 aBcDef
©2011 CE-KMITL v0.1
143
printf("%s\n", string); return 0; }
10.2.2 ฟงกชนทผใชงานสรางขนเอง (User-defined function)
เนองจาก Standard Library Function ทงหมด เปนฟงกชนมาตรฐานทมเฉพาะการทางานพนฐานตางๆ เทานน หากตองการฟงกชนทมการทางานเฉพาะกจ โปรแกรมเมอรตองเขยนฟงกชนขนมาเอง ขอกาหนดพนฐานของ User-defined Function
1) ตองมการประกาศ function prototype ทตนโปรแกรมเสมอ จงจะเรยกใชงาน function นนๆ ได (เปนการบอก Compiler วาคาสงดงกลาวคอฟงกชน ไมใช syntax error)
2) ตองมการเขยนฟงกชนตามโครงสรางทไดประกาศไวใน function prototype เทานน
10.3 รปแบบโครงสรางของฟงกชน โปรโตไทปฟงกชน (Function Prototype) รปแบบคาสง
type function_name(type1, type2,.., typeN);
เปนการประกาศการใชงานฟงกชนทอยหลง main() type คอ ชนดของฟงกชน วาฟงชนททาการสรางจะสงขอมลชนดใดกลบ function_name คอ ชอฟงกชนทจะสรางขน type-n คอ ชนดของขอมลทจะสงใหฟงกชน การเขยนโปรแกรมโดยมฟงกชนทสรางขนเองม 2 รปแบบ
1) สรางฟงกชน กอน ฟงกชนหลก ฟงกชนหลกสามารถเรยกใชงานฟงกชนทสรางขนได 2) สรางฟงกชน หลง ฟงชนหลก ตองประกาศ Function Prototype กอนเพอใหฟงกชนหลกรวามฟงกชนทสรางขน
#include<file.h>type function_name(type);type variableint main(){
type variable;statement-1;...statement-n;return 0;
}type function_name(type variable){
statement-1;...statement-n;return(var);
}
พรโปรเซสเซอรไดเรคทฟ
ตวแปรชนดโกบอล
ฟงกชนหลก
ฟงกชนยอย
สวนตวโปรแกรม
สวนหวโปรแกรม
ตวแปรชนดโลคอล
คาสง
ฟงกชนโพรโทรไทพ
©2011 CE-KMITL v0.1
144
//สรางฟงกชนกอนฟงกชนหลก #include<file.h> type variable type function_name(type variable) { statement-1; ... statement-n; return(var); } int main() { type variable; statement-1; ... statement-n; return 0; }
//สรางฟงกชนหลงฟงกชนหลก #include<file.h> type function_name(type); type variable int main() { type variable; statement-1; ... statement-n; return 0; } type function_name(type variable) { statement-1; ... statement-n; return(var); }
โปรแกรม 10.3 โปรแกรมแสดง kmitl ในกรอบสเหลยม
//flowchart
//ผลลพธ
//สรางฟงกชนกอนฟงกชนหลก #include<stdio.h> #include<conio.h> void show_star (int n) { int i; for (i=1;i<=n;i++) putchar('*'); } int main() { int num=9; show_star(num); printf ("\n* kmitl *\n"); show_star(num); return 0; }
//สรางฟงกชนหลงฟงกชนหลก #include<stdio.h> #include<conio.h> void show_star (int); int main() { int num=9; show_star(num); printf ("\n* kmitl *\n"); show_star(num); return 0; } void show_star (int n) { int i; for (i=1;i<=n;i++) putchar('*'); }
START
END
num=9
show_star(num)
kmitl
show_star(num)
show_star(n)
i=1
*
i<=nT
F
end
i++
©2011 CE-KMITL v0.1
145
10.4 การรบคาและสงคาจากฟงกชน รปแบบการรบคาเขาฟงกชน และรปแบบการสงคาออกจาฟงกชน จดไดสแบบคอ
1) ฟงกชนทไมมการรบสงคา 2) ฟงกชนทมการรบคา แตไมสงคากลบ 3) ฟงกชนทมการรบคา และมการสงคากลบ 4) ฟงกชนทไมมการรบคา แตมการสงคากลบ
10.4.1 ฟงกชนทไมมการรบสงคา เปนฟงกชนทไมมการรบคาเขามาในฟงกชน และไมมการสงคากลบออกไปจากฟงกชน #include<stdio.h> #include<conio.h> void function_name(void); int main() { function_name(); return 0; } void function_name() { statement-1; statement-2; ... statement-n; }
//ตวอยางโปรแกรม #include <stdio.h> void show(void) { printf("hello"); } int main(void) { show(); show(); return 0; }
10.4.2 ฟงกชนทมการรบคา แตไมสงคากลบ เปนฟงกชนทมการรบคาเขามาในฟงกชน แตไมมการสงคากลบออกไปจากฟงกชน #include<stdio.h> #include<conio.h> void func_name(type); int main() { ... func_name(varX); ... return 0; } void func_name(type varY) { statement-1; statement-2; ... statement-n; }
//ตวอยางโปรแกรม #include <stdio.h> void show(int i,float f) { printf("%f",i+f); } int main(void) { show(22,3.14); show(10,12.1); return 0; }
©2011 CE-KMITL v0.1
146
10.4.3 ฟงกชนทมการรบคา และมการสงคากลบ เปนฟงกชนทมการรบคาเขามาในฟงกชน และมการสงคากลบออกไปจากฟงกชน #include<stdio.h> #include<conio.h> type func_name(type); int main() { ... var = func_name(varX); ... return 0; } type func_name(type varY) { statement-1; statement-2; ... statement-n; return(varZ); }
//ตวอยางโปรแกรม #include <stdio.h> float show(int i,float f) { printf("%f",i+f); return i*f; } int main(void) { float a; a = show(22,3.14); printf("%f",a); printf("%f",show(10,12.1)); return 0; }
10.4.4 ฟงกชนทไมมการรบคา แตมการสงคากลบ เปนฟงกชนทไมมการรบคาเขามาในฟงกชน แตมการสงคากลบออกไปจากฟงกชน #include<stdio.h> #include<conio.h> type func_name(void); int main() { ... var = func_name(); ... return 0; } type func_name() { statement-1; statement-2; ... statement-n; return(varZ); }
//ตวอยางโปรแกรม #include <stdio.h> int getdata() { int k; printf("enter value"); scanf("%d",&k); return k; } int main(void) { int a; a = getdata(); printf("%d",a); printf("%d",getdata()); return 0; }
โปรแกรม 10.4 โปรแกรมคานวณ degree radian #include<stdio.h> #include<conio.h> #include<math.h> #define PI 3.14 float deg_rad(float); /*Function Prototype*/ int main() { float deg,rad; printf ("Enter Degree : "); scanf ("%f",°); rad = deg_rad(deg); //printf ("%f->%f\n",deg,rad); printf ("sin(%.2f) = %.3f\n",deg,sin(rad)); printf ("cos(%.2f) = %.3f\n",deg,cos(rad)); printf ("tan(%.2f) = %.3f\n",deg,tan(rad)); return 0;
©2011 C} float { }
10.5 ตวขอบเขตข
1)
2)
ตวอยาง ป#includ#includint void teint mai{ } void te{ }
ตวอยาง ป#includ#includvoid teint mai{ } void te{ }
10.6 กาการสงคาต
CE-KMITL v0.1
deg_rad(f
float anans = numreturn(an
วแปรและของตวแปรในโปตวแปร globalไดเรคทฟ ตวแปร local ตวแปรภายในแ
ประกาศตวแปร de<stdio.h>de<conio.h>num1; est(void); in()
num1 = 19;printf ("litest(); printf ("lireturn 0;
est()
num1 = 26;printf ("li
ประกาศตวแปร de<stdio.h>de<conio.h>est(void); in()
int num1num1 = 19;printf ("litest(); printf ("lireturn 0;
est()
int num1num1 = 26;printf ("li
ารสงคาตวแตวแปรมสองแบ
1
float num)
ns; m * PI / 1ns);
ขอบเขตการใรแกรมแบงขอบl เปนตวแปรทฟ
เปนตวแปรทสาแตละฟงกชน
num1 เปน gl> >
/*Funct
ine1 (main)
ine2 (main)
ine1 (test)
num1 เปน lo> >
/*Funct
1; ine1 (main)
ine2 (main)
1; ine1 (test)
แปร บบคอ
80;
ใชงานฟงกบเขตไดสองระดฟงกชนใดกสาม
ามารถเรยกใชได
lobal ชนด int
tion Protot
) : num1 =
) : num1 =
) : num1 =
ocal ชนด inte
tion Protot
) : num1 =
) : num1 =
) : num1 =
147
ชน ดบคอ ารถเรยกใชไดโ
ดภายในเฉพาะฟ
eger
type*/
%d\n",num1
%d\n",num1
%d\n",num1
ger
type*/
%d\n",num1
%d\n",num1
%d\n",num1
ดยจะประกาศส
ฟงกชนทประกา
1);
1);
1);
//ผล
1);
1);
1);
//ผล
สรางตวแปรตอจ
าศสรางตวแปรน
ลลพธ
ลลพธ
จาก พรโปรแซส
นนโดยจะประก
สเซอร
กาศสราง
©2011 CE-KMITL v0.1
148
1) การสงคาทเกบอยในตวแปรใหกบฟงกชน (pass by value) 2) การสงคา Address ของตวแปรใหกบฟงกชน (pass by reference)
10.6.1 Pass by value
เปนการสงคาทเกบอยในตวแปรเขาสฟงกชน การเปลยนแปลงคาตางๆ ของพารามเตอรจะไมเปลยนแปลงคาของตวแปรในโปรแกรมหลก ลกษณะของ Pass by Value Function จะไมสงคา Address (หนาตวแปรจะไมมเครองหมาย *) ตวอยาง int add(int a, int b) void draw_line(int count)
10.6.2 Pass by reference
เปนการสงคา Address ของตวแปรเขาสฟงกชน การเปลยนแปลงคาตางๆ ของพารามเตอรจะสงผลไปยงตวแปรในโปรแกรมหลก ลกษณะของ Pass by Reference Function จะสงคา Address (หนาตวแปรจะมเครองหมาย * หนาตวแปรเสมอ) ตวอยาง int max(int *a, int *b) void increase(int *count)
โปรแกรม 10.5 โปรแกรมแสดง pass by value และ pass by reference //Pass by value void func(int va) { va = va+1; printf ("In function la = %d\n",va); } //Pass by reference void func2(int *pa) { *pa = *pa +1; printf ("In function *pa = %d\n",*pa); } int main() { int x; x = 10; printf ("Before call function x = %d\n",x); func(x); //pass by value printf ("After call function x = %d\n",x); printf ("\n\n"); x = 10; printf ("Before call function x = %d\n",x); func2(&x); //pass by reference printf ("After call function x = %d\n",x); return 0; }
//ผลลพธ
©2011 CE-KMITL v0.1
149
โปรแกรม 10.6 โปรแกรมใช pass by value #include <stdio.h> #include <conio.h> int a; //global void func(int x) { x=10; printf("x = %d\n",x); } int main() { int b; a = 3; b = 5; func(b); printf ("a = %d\n",a); printf ("b = %d\n",b); return 0; }
//ผลลพธ x = 10 a = 3 b = 5
โปรแกรม 10.7 โปรแกรมใช pass by reference #include <stdio.h> #include <conio.h> int a; void func(int *x) { *x=10; printf("x = %d\n",*x); } int main() { int b; a = 3; b = 5; func(&b); printf ("a = %d\n",a); printf ("b = %d\n",b); return 0; }
//ผลลพธ x = 10 a = 3 b = 10
โปรแกรม 10.8 โปรแกรมรจก global variable #include <stdio.h> #include <conio.h> int a; void func(int x) { a=10; printf("x = %d\n",x); } int main() { int b; a = 3; b = 5;
//ผลลพธ x = 5 a = 10 b = 5
©2011 CE-KMITL v0.1
150
func(b); printf ("a = %d\n",a); printf ("b = %d\n",b); return 0; }
10.7 คาถามทายบท 1) โปรแกรมเกบขอมลสนคา 1 ชนด ภายในโปรแกรมประกอบดวย ฟงกชนตางๆดงน ฟงกชนใสขอมลสนคา getdata() ฟงกชนเพมจานวนสนคา 10 ชน add10() ฟงกชนลดจานวนสนคา 10 ชน sub10() และฟงกชนแสดงจานวนรายละเอยดภายในสนคา โปรแกรมนยงไมสมบรณด ใหนกศกษาเขยนคาประกาศฟงกชน getdata() และ add10 และคาสงภายในใหสมบรณ #include <stdio.h> #include <string.h> struct product { char name[15]; int number; float price; }; struct product getdata(void) { struct product x; strcpy(x.name,"Chewing gum"); x.number = 100; x.price = 25.5; return x; } ……… showdata(………………) { …………………………………….. } void sub10(struct product &x) { if (x.number > 10) x.number -=10; } …………add10(………………..) { x.number +=10; } int main(void) { int i; struct product y; y = getdata(); showdata(y); add10(y); add10(y); showdata(y); sub10(y); showdata(y); return 0; }
2) ใหนกศกษาอธบายการทางานของโปรแกรมน พรอมกบชใหเหนวาจดผดของโปรแกรมคอจดใด Hint: มทผด 1 จด #include <stdio.h> #include <string.h>
©2011 CE-KMITL v0.1
151
void callnum(int i,char y) { char data [10][8] = {"zero","one","two","three","four", "five","six","seven","eight","nine"}; strcpy(y,data[i]); } int main(void) { char ch[10]; int i; int telno[] = {0,2,7,3,7,3,0,0,0}; for (i=0;i<9;i++) { callnum(telno[i],ch); printf("%s ",ch); } return 0; }
3) โปรแกรมตอไปนแสดงผลเลขอะไรจอภาพ ใชเวลาคดไมเกน 10นาท เมอคดเสรจแลวใหลองพมพ code ดงกลาวลงคอมพวเตอร และตรวจสอบคาตอบ #include <stdio.h> int i; struct data { int i; int j; }W; void fa(int *a, int b); void fb(int c, int *d); void fc(struct data x,struct data *y, struct data z); int main(void) { int j=0; int i = 15; struct data X,Y,Z; X.i = 10; X.j = 20; fa(&i,j); printf("\n i=%d, j=%d",i,j); fb(i,&j); printf("\n i=%d, j=%d",i,j); fc(X,&Y,Z); printf("\n W.i=%d,W.j=%d",W.i,W.j); printf("\n X.i=%d, X.j=%d",X.i,X.j); printf("\n Y.i=%d, Y.j=%d",Y.i,Y.j); printf("\n Z.i=%d, Z.j=%d",Z.i,Z.j); return 0; } void fa(int *a, int b) { i = 4; *a = *a+3; b = i+2; } void fb(int c,int *d) { c += i; *d += i; } void fc(struct data x,struct data *y, struct data z) { y->i = x.j++; y->j = y->i + (++x.i); z.i = x.j; z.j = y->j; W.i = y->i + (++x.j); W.j = y->j + z.i; }
©2011 CE-KMITL v0.1
152
การทดลองท 10 ฟงกชน
วตถประสงค 1. เพอใหนกศกษาทดลองเขยนโปรแกรมโดยใชฟงกชน 2. เพอใหนกศกษาเพอใหนกศกษาเขาใจเรองฟงกชน และการทางานของคาสงพนฐานตางๆ
ทฤษฎ ในการเขยนโปรแกรมบางครงตองมการใชชดคาสงแบบเดยวกนซา ๆ หลายครงในหลาย ๆ จดของตวโปรแกรม หรออาจตองการแบงโปรแกรมออกเปนสวน ๆ ตามรปแบบการทางาน ดงนนเพอเปนการลดจานวนชดคาสงทตองใช เพอความสะดวกในการเขยนโปรแกรม และเพอความงายในการแกไขและบารงรกษา ภาษาโปรแกรมจงเปดโอกาสใหผเขยนโปรแกรมสามารถนาเอาชดคาสงทอาจใชซาไดนนไปเขยนรวมกนไวเปนพวก ๆเพอใหงายตอการตอการเรยกใชซงชดคาสงดงกลาวจะถกเรยกวาฟงกชน โดยฟงกชนในภาษาซมดวยกน 2 ประเภท 1. ฟงกชนมาตรฐาน – ไลบรารฟงกชน (Standard Library Function) 2. ฟงกชนทสรางขนเอง (User-defined Function) การทดลองนจะใหนกศกษาทาความเขาใจเกยวกบการใชงานฟงกชนทสรางขนเอง สาหรบการประกาศฟงกชนทสรางขนเองนน มการประกาศในสองรปแบบดวยกนคอ 2.1 การสรางฟงกชน กอนฟงกชนหลก ซงตองเขยนฟงกชนทจะใชงานกอนเรยกใชฟงกชน เพอใหโปรแกรมไดรจกฟงกชนกอน 2.2 การสรางฟงกชน หลงฟงกชนหลก สามารถเขยนฟงกชนหลงจากฟงกชนหลกได (main function)แตตองประกาศ โปรโตไทปฟงกชน (Function Prototype) กอน ฟงกชนหลกโดยโปรแกรมเมอรสามารถใชงานไดทงสองรปแบบ สาหรบฟงกชนทโปรแกรมเมอรไดสรางขนเองนนสามารถแบงออกไดเปน 4 กลมหลกตามการรบสงคาของฟงกชน ดงน 1. ฟงกชนทไมมการรบสงคา 2. ฟงกชนทมการรบคา แตไมสงคากลบ 3. ฟงกชนทมการรบคา และมการสงคากลบ 4. ฟงกชนทไมมการรบคา แตมการสงคากลบ ฟงกชนทไมมการรบสงคา คอฟงกชนททางานแบบตายตว ทกๆ ครงทเรยกใชงานฟงกชนนจะมการทางานในรปแบบเดมๆ ทกๆ ครง เนองจากไมมการรบคาพารามเตอรใดๆ และหลงจากการทางานฟงกชนนแลว จะไมมการสงผลลพธกลบไปยงผเรยกใชงานฟงกชน ตวอยางเชน void printmenu(void); ฟงกชนทมการรบคา แตไมสงคากลบ คอฟงกชนทางานโดยขนอยกบผใชงานฟงกชนจะปอนพารามเตอรอะไรดงนนการทางานของฟงกชนในลกษณะนจะยดหยน แตภายหลงจากทฟงกชนทางานเรยบรอยแลว จะไมมการสงผลลพธการทางานกลบไปยงผเรยกใชงานเชนเดยวกบแบบแรก ตวอยางเชน void print_message(int m_id); ฟงกชนทมการรบคา และมการสงคากลบ คอฟงกชนทมการทางานขนอยกบผใชงานฟงกชนจะปอนพารามเตอรอะไร การทางานลกษณะนมความยดหยนสง นอกจากนยงมการสงคาผลลพธการทางานกลบไปยงผใชงานฟงกชนดวย ตวอยางเชน int area(int width, int height) ฟงกชนทไมมการรบคา แตมการสงคากลบคอฟงกชนทสงขอมลกลบโดยไมตองอาศยพารามเตอรใดๆยกตวอยางเชน int time(void) การสงคาพารามเตอรเขาสฟงกชน 1. การสงคาแบบ pass by value คอการสงขอมลทตวแปรนนๆ เกบอย สงใหฟงกชนทางาน โดยการทางานของฟงกชนจะไมมผลกระทบตอคาทเกบในตวแปร เนองจากสงเฉพาะขอมลไปยงฟงกชนเทานน
©2011 CE-KMITL v0.1
153
2. การสงคาแบบ pass by reference คอการสงคาตาแหนงของตวแปรนนๆ สงใหฟงกชนทางาน โดยการทางานของฟงกชนจะมผลกระทบตอคาทเกบในตวแปร เนองจากการทางานภายในฟงกชนจะไปกระทากบตวแปรทตาแหนงนนๆ โดยตรง ชนดของตวแปร 1. ตวแปร global เปนตวแปรทถกประกาศตรงตาแหนงกอนการประกาศฟงกชนหลก ตวแปร global จะเปนตวแปรทสามารถอางถงไดจากทกๆ ตาแหนงในโปรแกรม 2. ตวแปร local เปนตวแปรทถกประกาศภายในฟงกชนตางๆ ซงจะสามารถอางองไดภายในเครองหมาย { และ } ของ ฟงกชนนนๆ เทานน
การทดลองท 10.1
1. ใหนกศกษาเขยนโปรแกรมเพอรบคาจานวนเตม 2 จานวน แลวสงคาไปในฟงกชน int findmax(int, int); เปนฟงกชนทรบคาจานวนเตมมา แลวสงคาทมคามากกวากลบ 2. นาคาทไดจากฟงกชน findmax มาแสดงผล
การทดลองท 10.2
ใหนกศกษา แกไขโปรแกรมในการทดลองท 10.1 โดยใหรบตวเลขมา 3 จานวน แลวแสดงผลคาทมากทสด โดยใชฟงกชน findmax (หามแกไขตวฟงกชน)
การทดลองท 10.3
ใหนกศกษา เขยนโปรแกรมรบคามา 2 จานวน โดยโปรแกรมจะแสดงเลขจานวนเฉพาะตงแตคาแรกจนถงคาท 2 ทรบเขามา โดยใหสรางฟงกชน void primecheck(int); เปนฟงกชนทรบคาจานวนเตมมาตรวจสอบวาเปนจานวนเฉพาะหรอไม ถาใชใหแสดงผลคานนในรปแบบ printf (“%4d”,var)
การทดลองท 10.4
ใหนกศกษาเขยนโปรแกรมเพอรบขอความมา 1 ขอความ แลวหาวาในขอความทรบมามความยาวเทาใดและมสระ กตว
การทดลองท 10.5
ใหนกศกษาแกไขโปรแกรมจากการทดลองท 10.4 โดยการสรางฟงกชน int countstr(char[]); เปนฟงกชนทรบขอความเขามาเพอตรวจสอบวามความยาวเทาใด แลวสงคาความยาวกลบฟงกชนหลก int countvowel(char[],int); เปนฟงกชนทรบขอความ และคาความยาวของขอความเขามาเพอตรวจสอบวามสระจานวนเทาใด แลวสงคากลบฟงกชนหลก
การทดลองท 10.6
พจารณาโปรแกรมตอไปน #include <stdio.h> void swap (int *, int *); int main(void) { int a = -5, b=10; printf("Before swapping\n");
©2011 CE-KMITL v0.1
154
printf("The value of a is %d, and the value of b is %d\n",a,b); swap(&a,&b); printf("After swapping\n"); printf("The value of a is %d, and the value of b is %d\n",a,b); return 0; } void swap (int *aptr, int *bptr) { int temp; temp = *bptr; *bptr = *aptr; *aptr = temp; }
จากฟงกชน swap ทมการสงคาตวแปรแบบ pass by reference ใหนกศกษาอธบายการเปลยนแปลงคาของตวแปร a และ b วามการเปลยนแปลงคาอยางไร และเหตใดจงเปนเชนนน
การทดลองท 10.7
พจารณาโปรแกรมตอไปน #include <stdio.h> int cubeByValue(int); void cubeByReference(int *); int main(void) { int number =5; printf("The original value of number is %d\n", number); number = cubeByValue(number); printf("The new value of number is %d\n", number); cubeByReference(&number); printf("The new value of number is %d\n", number); return 0; } int cubeByValue(int n) { return n*n*n; } void cubeByReference(int *nPtr) { *nPtr = *nPtr * *nPter * *nPtr; }
ใหนกศกษาพจารณาความแตกตางระหวางฟงกชน cubeByValue กบ cubeByReference วาการทางานมความ แตกตางกนอยางไร ใหผลลพธแตกตางกนหรอไม อยางไร
การทดลองท 10.8
โปรแกรมตอไปน ทางานอะไร #include <stdio.h> int mystery1 (char *s); int main (void) { char string[80]; printf(“Enter a string: ”); scanf(“%s”, string); printf(“%d\n”, mystery1(string)); return 0;
©2011 CE-KMITL v0.1
155
} int mystery1 (char *s) { int x; for (x=0; *s!=’\0’; s++) { x++; } return x; }
ผลลพธของโปรแกรมอธบาย
การทดลองท 10.9
1. จงเขยนฟงกชนในการคานวณคา Det ของเมตรกขนาด 3x3 พรอมทงเขยนโปรแกรมเพอทดสอบการทางานของฟงกชน 2. จงสรางฟงกชนใหผลลพธตวอกษร A-F เมอปอนคะแนน โดยใชเกณฑคะแนนของวชา Principles of Compute Programming พรอมทงเขยนโปรแกรมเพอทดสอบการทางาน 3. จากสมการ a(x) = b(x-1) + a(x-1) และ b(x) = a(x-2) + b(x-2) เมอ a(0) = b(0) = 0 , a(1) = b(1) = 1 จงเขยนโปรแกรมรบคา n และแสดงผลลพธ a(n) 4. กระตายตวหนงสามารถขนบนไดโดยการกระโดดไดทละ 1 ขนหรอ 2 ขน จงเขยนโปรแกรมเพอหาจานวนรปแบบทเปนไปไดทงหมดในการกระโดดขนบนได N ขนของกระตายตวน
©2011 CE-KMITL v0.1
156
บทท 11 ไฟลขอมล
วตถประสงคการศกษา 1) เพอศกษาการเขยนโปรแกรมเกบขอมลลงไฟล 2) เพอศกษาคาสงทใชในการเกบขอมลลงไฟล
11.1 ไฟลขอมล ไฟลขอมลถกสรางขนเพอเกบรวบรวมขอมลตางๆเขาไวดวยกน ไฟลขอมลมกจะถกเกบอยในหนวยความจาภายนอก เชน Hard Disk, CD หรอ DVD เปนตน เมอคอมพวเตอรทาการอาน (read) ขอมลจะถกสาเนาจากอปกรณภายนอกเขามายงหนวยความจาภายใน เมอคอมพวเตอรทาการบนทก (write) ขอมลจะถกสาเนาจากหนวยความจาภายในไปยงอปกรณภายนอก ในการเคลอนยายขอมลนจะมการใชพนทหนวยความจาทกนเอาไวสาหรบงานนเปนพเศษ ซงเรยกวา buffer เนองจากการอานหรอนาขอมลจากอปกรณภายนอกนน ในบางครงจะไดจานวนขอมลทมากกวาทจะปอนเขาโปรแกรมในครงเดยว ในทางกลบกนเมอโปรแกรมตองการบนทกขอมลลงฮารดดสค buffer จะทาหนาทในการพกขอมลไวจนกวาจะมขอมลจานวนทมากพอทจะบนทกลงฮารดดสค การทางานทเกยวของกบ buffer จะดแลโดยโปรแกรมพเศษทเราเรยกกนวา device drivers ซงโปรแกรมนจะใหมาโดยผสรางอปกรณตางๆ หรอมาพรอมกบ Operating System โปรแกรมภาษา C จะมองขอมลทสงมาจากอปกรณ (e.g. keyboard) หรอไฟลวาเปนสายของขอมล (data stream) และเมอโปรแกรมตองการสงขอมลใหกบอปกรณ (e.g. CRT) หรอไฟลกจะสงเปนสายขอมลไปให ในระหวางการรบสงขอมลกบ buffer หากมขอผดพลาดเกดขนกจะทาใหมขอมลบางสวนตกคางอยใน buffer
ภาษา C จะแบง data stream ออกเปน 2 ประเภท คอ
1) สายขอมลตวอกษร (Text Stream)เปนสายขอมลตวอกษรทมนษยสามารถอานได ขอมลจะอยในรปแบบของรหส ASCII (ตวอกษร) เชน A, B,…,Z, a, b,…,z, 0,1,…, 9 อกษรพเศษ โดยทสายขอมลตวอกษรจะแบงออกเปนบรรทดๆ แตละบรรทดปดทายดวยรหส \n
2) สายขอมลไบนาร (Binary Stream) เปนสายขอมลชนดตางๆ เชน intger, real, complex ซงขอมลตางๆเหลานจะเกบอยในรปแบบทคอมพวเตอรจะเขาใจ เชน 2’s Complement
File เปนสงทมชอและ Operating System รจก Stream เปนสงทมชอเหมอนกน โดยทสตรมถกสรางโดยโปรแกรม ในการประมวลผลหรอทางานเกยวกบไฟล จะตองมการเชอมโยงระหวาง stream และ file เขาดวยกน ขนตอนการทางานในการประมวลผลเกยวกบไฟล ประกอบดวย 4 ขนตอนหลก คอ
1) ทาการสราง file stream pointer ตวอยางคาสง File* fp;
Data Source Program
Input Text Stream DataFileor
Keyboard
Data Destination Program
Output Text Stream DataFileorCRT
©2011 CE-KMITL v0.1
157
2) ทาการเปดไฟลโดยการเชอม file name เขากบชอของ stream name ตวอยางคาสง fp = fopen(“c:\\MyFile.DAT”,”r”);
3) ทาการอานหรอบนทกขอมลลงไฟลผานทางชอ stream ตวอยางคาสง fscanf(fp,”%d %d %d”,&date,&month,&year);
4) ทาการปดไฟล ตวอยางคาสง fclose(fp);
11.2 เปดไฟล รปแบบการเปดเทกซไฟล รปแบบคาสง
FILE *fp; fp = fopen(“name”, “mode”);
FILE คอ ประเภทขอมลแบบโครงสรางทกาหนดไวใหแลวใน stdio.h * คอ เครองหมายทแสดงวาเปนตวแปร Pointer fp คอ ชอตวแปรพอยนเตอรไปยงไฟลสตรม (file stream pointer) name คอ ชอของไฟลททาการเปด mode คอ โหมดของการจดการกบไฟล หมายเหต ชอของ file stream pointer ทระบบกาหนดใหแลวใน stdio.h ไดแก stdin (standard input stream), stdout (standard output stream) และ stderr (standard error stream) Mode ของการจดการกบไฟล “r” เปนการเปดเทกซไฟลเพออาน (Read) ถาไมมไฟลอยกจะเกดสถานะ fail
“w” เปนการสรางไฟลเพอเขยน (Write) ถาไฟลนนมอยแลวจะลบขอมลเดมทงหมด ถาไมมไฟลนนจะทาการสรางเทกซไฟลใหม
“a” เปนการ เปด หรอ สราง ไฟลเพอเขยนเพม (Append) ถาไฟลนนมอยแลวจะเปนการเขยนขอมลตอทาย ถาไมมไฟลนนจะทาการสรางเทกซไฟลใหม
“r+” เปนการเปดไฟลเพอ Update (อานและเขยนขอมล) ถาไมมไฟลอยกจะเกดสถานะ fail ตวชตาแหนงจะชไปทตาแหนงเรมตนของไฟล
“w+” เปนการสรางไฟลเพอ Update (อานและเขยนขอมล) ถาไฟลนนมอยแลวจะลบขอมลเดมทงหมด ถาไมมไฟลนนจะทาการสรางเทกซไฟลใหมเพอ Update
a+ เปนการเปดหรอสรางไฟลเพอ Update (อานและเขยนขอมล) ถาไฟลนนมอยแลวจะเขยนตอทาย ขอมลเดม ตวชตาแหนงจะชไปยงตาแหนงทายสด (EOF: End Of File)
EOF
File stream pointer
EOF
File stream pointer
EOF
File stream pointer
©2011 CE-KMITL v0.1
158
โปรแกรม 11.1 โปรแกรมเปด text file
จงเขยนโปรแกรมเพอเปดไฟลขอมล โดยถาไฟลสามารถเปดไดจะแสดงคาวา “can open file” หากไฟลไมสามารถเปดไดแสดงคาวา “cannot open file” ใชโปรแกรม Notepad สรางไฟลขอมล ดงรปดานลาง บนทกเปนชอ test.txt เกบไวท C:\Temp\ #include<stdio.h> #include<conio.h> int main() { FILE *fp; fp = fopen(“test.txt","r"); //สงเกตระบการ directory if (fp == NULL) { printf("Cannot open file\n"); return 0; } else printf("Can open file\n"); return 0; }
//สรางไฟลขอมลดวย notepad และ save ไวท c:\temp\test.txt
//หากระบ directory เปน test.txt ผลลพธได Cannot open file //หากระบ directory เปน c:/temp/test.txt ผลลพธทได Can open file
11.3 ปดไฟล รปแบบคาสง
fclose(fp);
fp คอ ตวแปรพอยนเตอรทชไปยงไฟลสตรม ผลลพธของฟงกชน fclose() หากสามารถปดไฟลไดสาเรจจะ return คา 0 กลบ แตหากไมสาเรจจะ return คา EOF (โดยปกตคอคา -1)
โปรแกรม 11.2 โปรแกรมเปดและปด text file
#include<stdio.h> #include<conio.h> int main() { FILE *fp; fp = fopen("C:/Temp/test.txt","r"); if (fp == NULL) { printf("Cannot open file\n"); return 0; } printf("Can open file\n"); if (!fclose(fp)) printf("\nClose file\n"); return 0;
//ผลลพธ Can open file Close file
©2011 CE-KMITL v0.1
159
}
11.4 อานไฟลรปแบบ Text รปแบบคาสง
fscanf(fp, “format”, &variable);
fp คอตวแปรพอยนเตอรทชไปยงไฟลสตรม format คอ การกาหนดรปแบบในการอานขอมลขนมาจาก ไฟล เชน อานขอมลเปนชนด int หรอ double variable คอ ตวแปรทเกบคาขอมลจากไฟล (จะตองกาหนด แอดเดรสของตวแปรโดยใชสญลกษณ & เสมอ)
โปรแกรม 11.3 โปรแกรมอานขอมลจาก text file (string หนงตว)
จงเขยนโปรแกรมเพอเปดไฟลขอมล เพออานขอมล และแสดงผล ใชโปรแกรม Notepad สรางไฟลขอมล บนทกเปน test.txt เกบไวท C:\Temp\ (คลายกบตวอยางโปรแกรมท 11.1) #include<stdio.h> int main() { FILE *fp; char str[20]; fp = fopen("C:/Temp/test.txt","r"); if (fp == NULL) { printf("Cannot open file\n"); return 0; } printf("Can open file\n"); fscanf(fp,"%s",str); //สงเกต if (!fclose(fp)) printf("\nClose file\n"); printf("%s",str); return 0; }
//ผลลพธ Can open file Close file Programming
โปรแกรม 11.4 โปรแกรมอานขอมลจาก text file (string หลายตว)
#include<stdio.h> int main() { FILE *fp; char str1[20],str2[10],str3[10]; fp = fopen("C:/Temp/test.txt","r"); if (fp == NULL) { printf("Cannot open file\n"); return 0; }
//ผลลพธ Programming 2551 kmitl
©2011 CE-KMITL v0.1
160
printf("Can open file\n"); fscanf(fp,"%s%s%s",str1,str2,str3); //สงเกต if (!fclose(fp)) { printf("\nClose file\n"); } printf("%s %s %s",str1,str2,str3); }
โปรแกรม 11.5 โปรแกรมอานขอมลจาก text file (character)
#include<stdio.h> int main() { FILE *fp; char ch1,ch2,ch3; fp = fopen("C:/Temp/test.txt","r"); if (fp == NULL) { printf("Cannot open file\n"); return 0; } printf("Can open file\n"); fscanf(fp,"%c%c%c",&ch1,&ch2,&ch3); //สงเกต if (!fclose(fp)) { printf("\nClose file\n"); } printf("%c%c%c",ch1,ch2,ch3); return 0; }
//ผลลพธ Pro
โปรแกรม 11.6 โปรแกรมอานขอมลจาก text file (string กบ int)
#include<stdio.h> int main() { FILE *fp; char str1[20],str2[10]; int num; fp = fopen("C:/Temp/test.txt","r"); if (fp == NULL) { printf("Cannot open file\n"); return 0; } printf("Can open file\n"); fscanf(fp,"%s%d%s",str1,&num,str2); //สงเกต if (!fclose(fp)) { printf("\nClose file\n"); } printf("%s %d %s",str1,num,str2); return 0; }
//ผลลพธ Programming 2551 kmitl
©2011 CE-KMITL v0.1
161
11.5 เขยนไฟลรปแบบ text file รปแบบคาสง
fprintf (fp, “format-string”, value);
fp คอตวแปรพอยนเตอรทชไปยงไฟลสตรม format คอ การกาหนดรปแบบของขอมลทจะเขยนลงไฟล variable คอ คาทตองการเขยนลงไฟล (ไมตองม & )
โปรแกรม 11.7 โปรแกรมรบชออาย 3 คน เกบลงไฟล
จงเขยนโปรแกรม เพอรบขอมล ชอ และอายของคน 3 คน เกบขอมลใน C:\Temp\new.txt นาขอมลจากไฟลมาแสดงผล #include<stdio.h> #include<conio.h> int main() { FILE *fp; char name[20],ch; int age,count=0; fp = fopen("C:/Temp/new.txt","w"); if (fp == NULL) { printf("Cannot open file\n"); return 0; } printf("Can open file (write)\n"); /*input data in program & write on file*/ while(count<3) { printf ("Enter name : "); scanf ("%s",name); printf ("Enter age : "); scanf ("%d",&age); fprintf (fp,"%-20s %d\n",name,age); count++; } if (!fclose(fp)) printf("\nClose file\n"); fp = fopen("C:/Temp/new.txt","r"); if (fp == NULL) { printf("Cannot open file\n"); return 0; } printf("Can open file (read)\n"); do { ch = getc(fp); printf("%c",ch); } while (ch!=EOF); if (!fclose(fp)) printf("\nClose file\n"); return 0; }
©2011 CE-KMITL v0.1
162
11.6 เขยน array หรอ struct ลงไฟลรปแบบ binary รปแบบคาสง
int fwrite (ptr, size,items,stream);
ptr คอ ตาแหนงของตวแปร struct หรอ array ในหนวยความจา (address) ทตองการจะเขยนลงไฟล size คอ ขนาดของตวแปร struct หรอ array items คอ จานวนของ struct หรอ array ทตองการจะเขยนลงไฟล stream คอ ตวแปรพอยนเตอรทชไปยงไฟลสตรม fwrite จะ return จานวน bytes ทไดเขยนลงในไฟล และจะ return 0 เมอไมสามารถเขยนขอมลลงไฟลได
โปรแกรม 11.8 โปรแกรมเกบขอมลจาก struct ลงไฟล int main() { FILE *fptr; struct student { char name[20]; char ID[9]; int age; } s; fptr = fopen("StRecord.txt", "w"); printf("Name : "); scanf("%s",s.name); printf("ID : "); scanf("%s",s.ID); printf("Age : "); scanf("%d",&s.age); fwrite(&s, sizeof(struct student), 1, fptr); fclose(fptr); return 0; }
//ปอนขอมลจาก keyboard Name : Kmitl ID : 48010000 Age : 45_ //เปดไฟลทเกบขอมลไว
11.7 อาน array หรอ struct จากไฟลรปแบบ binary รปแบบคาสง
int fread(dest, size, items, stream);
dest คอ ตาแหนงของตวแปร struct หรอ array ทใชเกบคาทอานจากไฟล size คอ ขนาดของตวแปร struct หรอ array ทตองการอานเขามา items คอ จานวนของ struct หรอ array ทตองการจะอานจากไฟล stream คอ ตวแปรพอยนเตอรทชไปยงไฟลสตรม fread จะ return คาเปนจานวน bytes ทอานได และจะ return 0 มนทาการอานจนถงตาแหนงสดทายของไฟล
โปรแกรม 11.9 โปรแกรมอานขอมลจากไฟลเกบลง struct
©2011 CE-KMITL v0.1
163
int main() { FILE *fptr; struct student { char name[20]; char ID[9]; int age; }s; fptr = fopen("StRecord.txt", "r"); if (fptr == (FILE *)NULL) printf("Cannot open file\n"); else while (fread(&s,sizeof(struct student),1,fptr)!=0) { printf("Name: %s\n", s.name); printf("ID: %s and Age: %d\n", s.ID,s.age); printf("---------------------------------\n"); } fclose(fptr); return 0; }
//ผลลพธ Name: Kmitl ID: 48010000 and Age: 45 --------------------------------------
11.8 ยาย file pointer รปแบบคาสง
int fseek(stream, offset, where);
stream คอ ตวแปรพอยนเตอรทชไปยงไฟลสตรม offset คอ ระยะทตองการใหตวชตาแหนงในไฟลเคลอนไปในแตละครง where เปนกาหนดตาแหนงของตวชตาแหนงในไฟล มได 3 คาคอ
0: ตวชตาแหนงในไฟลเรมตนทตาแหนงแรกสดของไฟล 1: ตวชตาแหนงในไฟลเรมตนทตาแหนงปจจบน 2: ตวชตาแหนงในไฟลเรมตนทตาแหนงสดทายของไฟล
fseek จะ return 0 ถาสามารถเลอนตวชตาแหนงในไฟลไดสาเรจ และจะ return คา int ใด ๆ ทไมเทากบ 0 เมอดาเนนการตาม parameter ไมสาเรจ
โปรแกรม 11.10 โปรแกรมอานขอมลจากไฟลเกบลง struct ใช fseek
FILE *fptr; int noffset; struct student { char name[20]; char ID[9]; int age; } s; fptr = fopen("StRecord.txt", "w"); strcpy (s.name,"Student A"); strcpy (s.ID,"48010000"); s.age = 17; fwrite(&s, sizeof(struct student), 1, fptr); strcpy (s.name,"Student B"); strcpy (s.ID,"48012000"); s.age = 18; fwrite(&s, sizeof(struct student), 1, fptr); strcpy (s.name,"Student C"); strcpy (s.ID,"48015000");
//ขอมลในไฟล
//(1) ยาย file pointer โดยกาหนด //noffset = 0 * sizeof(struct student); //ไดผลลพธ Name: Student A ID: 48010000 and Age: 17 //(2) ยาย file pointer โดยกาหนด
©2011 CE-KMITL v0.1
164
s.age = 20; fwrite(&s, sizeof(struct student), 1, fptr); fclose(fptr); fptr = fopen("StRecord.txt", "r"); noffset = 0 * sizeof(struct student); //สงเกต if (fseek( fptr, noffset, 0) == 0 ) { if (fread(&s,sizeof(struct student),1,fptr) != 0) { printf("Name: %s\n", s.name); printf("ID: %s and Age: %d\n", s.ID,s.age); printf("---------------------------------\n"); } } fclose(fptr);
//noffset = 1 * sizeof(struct student); //ไดผลลพธ Name: Student B ID: 48012000 and Age: 18 //(3) ยาย file pointer โดยกาหนด //noffset = 2 * sizeof(struct student); //ไดผลลพธ Name: Student C ID: 48015000 and Age: 20
11.9 คาสงอนเกยวกบไฟล การอานและเขยนขอมลตวอกษร var = fgetc(fp); //var = getc(fp); fputc (ch,fp); //putc (ch,fp); คาสง getchar() และ putchar() ใชไดกบสตรม stdin และ stdout เทานน การอานและเขยนขอมลทเปนขอความ fgets(var,length,fp); fputs (str,fp); การอานจะอานขอความขนาดไมเกน length-1 การอานและเขยนขอมลตามชนดของขอมล fscanf (fp,"format",&variable); fprintf (fp,"format",value); การอานและเขยนขอมลจาก Array ชโดย ptr fread(*ptr,size,items,*stream); fwrite(*ptr,size,items,*stream);
11.10 คาถามทายบท 1) จงเขยนโปรแกรมเพออานไฟล(สามารถเลอกไฟลได) เพอนบจานวนสระ แลวแสดงผลจานวนสระแตละตวในไฟลใหม(สามารถเลอกชอไฟลได) โดยในไฟลทเกบคาตอบใหเกบในรปแบบดงน Number of Vowel A : 10 E : 0 I : 2 O: 3 U : 12
©2011 CE-KMITL v0.1
165
2) จงเขยนโปรแกรมเพอนบจานวนครงการรนโปรแกรมหนง ๆ วามการรนไปทงหมดกครงแลว โดยใหเกบจานวนครงการรนไวในไฟล 3) จงเขยนโปรแกรมเพอเกบขอมลของคนจานวน 10 คน โดยเกบชอ อาย ไวในไฟล (สามารถเลอกชอไฟลได) แลวคนหาคนทมอายมากกวา 20 ปจากขอมลในไฟลทเกบไว แลวแสดงผลท output
©2011 CE-KMITL v0.1
166
การทดลองท 11 การเขยนโปรแกรมตดตอกบ Text File
วตถประสงค 1. เพอใหนกศกษาทดลองเขยนโปรแกรมตดตอกบไฟล 2. เพอใหนกศกษาสามารถเปดไฟลขอมลเพอนาคามาใชงานได 3. เพอใหนกศกษาสามารถสรางไฟลเพอเขยนขอมลลงไฟลได
ทฤษฎ การสรางไฟล และคาสงทางานกบไฟล ไฟลขอมลถกสรางขนเพอใชขอมลสาหรบการใชงานครงตอไป การจะใชงานไฟลขอมล ตองเขยนโปรแกรมสรางไฟลขอมลขนมา หรอเขยนโปรแกรมเพออานไฟลขอมลทมอย โดยการเรยกใชคาสงตางๆ เชน เปดไฟล เกบหรอเขยนขอมลลงไฟล ดงหรออานขอมลจากไฟล แลวจงนาขอมลไปประมวลผลตอไป และปดไฟลขอมลเมอทางานเสรจสาหรบภาษา C สามารถสรางไฟลสาหรบเกบขอมลได 2 แบบคอ ไฟลขอมลตวอกษร (Text file) กบไฟลขอมลไบนาร(Non-text file) สาหรบการทดลองครงนเปนการทดลองกบ Text file ซงไฟลประเภทนเกบขอมลเปนตวอกษร เชน A-Z,a-z, 0-9, หรอ ตวอกษรพเศษ ขนตอนแรกของการเขยนโปรแกรมตดตอกบ Text file คอการประกาศตวแปรไฟล ซงจะถกประกาศในรปของตวแปร pointer เราเรยกตวแปรไฟลนวา file pointer ซงจะใชตวแปรดงกลาวภายในโปรแกรมเพอทาการตดตอกบไฟลขอมลจรงทถกเกบไวในอปกรณสารองขอมล เชน แผนดสก หรอ ฮารดดสก เปนตน การประกาศตวแปรไฟลมรปแบบดงตอไปน FILE *fp; ความหมาย FILE เปนการสรางตวแปรชนด file * เปนเครองหมายทแสดงวาเปน pointer fp เปน file pointer ทสรางขนเพอเกบตาแหนงของไฟลขอมล หลงจากทชไปทตาแหนงไฟลแลว จะเขยนโปรแกรมเพอจดการกบไฟลโดยใช fp โดยมคาสงตางๆ ทใชใน การเขยนโปรแกรมตดตอกบไฟลดงนน 1.1 คาสงเปดไฟล fp = fopen("name", "mode"); ความหมาย name คอ ชอของไฟลททาการเปด mode คอ โหมดของการจกการกบไฟล r เปดไฟลเพออานอยางเดยว ตองมไฟลนนอยจรง w เปดไฟลเพอเขยนขอมลทบลงไฟลเกา ถาไมมไฟลเครองจะสรางขน a เปดไฟลเพอเขยนขอมลตอทายไฟลเกา ถาไมมไฟลเครองจะสรางขน ตวอยาง การเปดไฟล fp = fopen ("c:\temp\mydata.txt", "r"); เปนคาสงเปดไฟลเพออานขอมลลงไฟลชอ mydata.txt ถาในดสกไมพบไฟลในชอดงกลาว โปรแกรมจะหยดทางานและแสดงขอผดพลาด fp = fopen ("c:\temp\mydata.txt", "w"); เปนคาสงเปดไฟลเพอเขยนขอมลลงไฟลชอ mydata.txt ถาในดสกไมพบไฟลในชอดงกลาว คาสงนจะสรางไฟลวางเปลาใหโดยไมมขอมล แตถามไฟลชอดงกลาวอยแลว ขอมลเดมในไฟลทงหมดจะหายไป กลายเปนไฟลวางเปลา
©2011 CE-KMITL v0.1
167
fp = fopen ("c:\temp\mydata.txt", "a"); เปนคาสงเปดไฟลเพอเขยนขอมลลงไฟลชอ mydata.txt โดยในดสกจะตองมไฟลชอดงกลาวอยกอนหนานแลว คาสงนจะเขยนขอมลใหมตอทายขอมลเดมทมอยในไฟล ถาในดสกไมพบไฟลในชอดงกลาว โปรแกรมจะหยดทางานและแสดงขอผดพลาด 1.2 คาสงปดไฟล fclose (fp) เปนคาสงปดไฟลเมอทางานเสรจ เมอโปรแกรมทางานกบไฟลขอมลเสรจแลว การเรยกใชคาสงปดไฟลจะเตมตวอกษรพเศษปดทายไฟลบอกจดสนสดของขอมลในไฟล หากสามารถปดเทกไฟลไดสาเรจจะ return คา 0 กลบ 1.3 คาสงอานขอมลจากไฟล fscanf (fp,"format string",address variable); ความหมาย fp (file pointer) คอ ตวแปรทใชเกบตาแหนงไฟล format string คอ การใชรหสรปแบบ address list คอ ตวแปรทเกบคาขอมลจากไฟล fscanf เปนฟงกชนในการอานขอมลจากไฟล ซงประกอบดวยพารามเตอร สามตวคอfile pointer, formatstringและ address list รปแบบในการอานขอมลจากไฟลจะถกกาหนดโดย format string ซงสอดคลองกบตวแปรตางๆทอยใน address list var = getc(fp); var = fgetc(fp); getc และ fgetc เปนฟงกชนทใชในการอานขอมลประเภทตวอกษรจากไฟลขอมลทอยในอปกรณสารองขอมลผานตวแปรไฟล fp 1.4 คาสงเขยนขอมลลงไฟล fprintf (fp,"format string",data list); fprintf เปนฟงกชนในการเขยนขอมลลงไฟล ซงประกอบดวยพารามเตอร สามตวคอ filepointer, format stringและ datalist รปแบบในการเขยนขอมลลงไฟลจะถกกาหนดโดย format string ซงสอดคลองกบตวแปรตางๆ ทอยในdata list fputc (ch,fp); fputc (ch,fp); putc และ fputc เปนฟงกชนทใชในการเขยนขอมลประเภทตวอกษร (ทถกเกบในตวแปรch) ลงไฟลขอมลผานตวแปรไฟล fp
การทดลองท 11.1 ใหนกศกษาพมพโปรแกรมตามตวอยางตอไปน และสงใหโปรแกรมทางาน #include<stdio.h> #include<conio.h> int main() { FILE *fp; fp = fopen("test.txt","r"); if (fp == NULL) { printf("Error \nCannot open file\n"); getch (); return (0); } else
©2011 CE-KMITL v0.1
168
printf("Can open file\n"); getch(); return 0; }
ผลลพธทไดเปนอยางไร เหตใดจงเปนเชนนน
การทดลองท 11.2 ใหนกศกษาเขยนโปรแกรมสรางไฟลชอ demo.txt ทมรายละเอยดคอ ชอ นามสกล รหสนกศกษา โดยอยคนละบรรทด
การทดลองท 11.3
ใหนกศกษาเขยนโปรแกรมสาหรบ copy ไฟลชอ demo.txt ไปยงไฟลชอ backup.txt
การทดลองท 11.4
จงเขยนโปรแกรม copy ไฟล โดยอานขอมลจากไฟล (สามารถเลอกชอไฟลได) และสรางไฟลใหมทเหมอนกบไฟลตนฉบบ (สามารถตงชอไฟลได)
การทดลองท 11.5
ใหนกศกษาพมพโปรแกรมตามตวอยางตอไปน และสงใหโปรแกรมทางาน #include<stdio.h> #include<conio.h> int main() { FILE *fp; struct people { char name[20]; char surname[20]; int day; char month[15]; int year; } pe; fp = fopen("data.txt","w"); if (fp == NULL) { printf("Error \nCannot open file\n"); getch (); return (0); } else printf("Can open file\nPlease Enter to Continue.."); getch(); printf ("\nEnter your name : "); scanf ("%s",pe.name); printf ("Enter your surname : "); scanf ("%s",pe.surname); printf ("Enter your birthday \n"); printf ("\t Day :"); scanf ("%d",&pe.day); printf ("\t Month :"); scanf ("%s",pe.month); printf ("\t Year :"); scanf ("%d",&pe.year); fprintf (fp,"%s %s ",pe.name,pe.surname);
©2011 CE-KMITL v0.1
169
fprintf (fp,"%d %s %d\n",pe.day,pe.month,pe.year); if (!fclose(fp)) { printf("\nClose file\n"); } getch(); return 0; }
ผลลพธทไดจากการรนโปรแกรมเปนอยางไร หากตองการเกบขอมลคน 5 คนตองแกไขโปรแกรมอยางไร
การทดลองท 11.6
1. ใหนกศกษา Save as ไฟล HTML ในอนเตอรเนตแลวเขยนโปรแกรมเพอนบลงคใน HTML ไฟลนน 2. ใหนกศกษา Save as ไฟล HTML ในอนเตอรเนตแลวเขยนโปรแกรมเพอแสดงรายการลงค Image ทงหมดในHTML ไฟลนน 3. ใหนกศกษาหาไฟลรปภาพตวอยางทมนามสกล .bmp แลวเขยนโปรแกรมเพอหาวาในไฟลรปภาพ .bmp นนมจดสแดงทงหมดกจด
©2011 CE-KMITL v0.1
170
หนงสออางอง
[1] The C Programming Language, Brian W. Kernighan and Dennis M. Ritchie. Prentice Hall [2] Computer Science: A Structured Programming Approach Using C, Second Edition , Behrouz Forouzan, Richard Gilberg [3] Turbo C Programming Principles and Practices, M.Tim Grady [4] คอมพวเตอรและการเขยนโปรแกรม (Computers and Programming) C และ Java, ธนญชย ตรภาค, สนพ. ซเอดยเคชน จากด
©2011 CE-KMITL v0.1
171
การตดตงโปรแกรม Visual Studio 2008