computer programming book

171
©2011 CE-KMITL v0.1 1

Transcript of computer programming book

Page 1: computer programming book

©2011 CE-KMITL v0.1

1

Page 2: computer programming book

©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]

Page 3: computer programming book

©2011 CE-KMITL v0.1

3

แนะนาหนงสอภาษาซ (โดย อ. ธนญชย ตรภาค) ในการเรยนวชา คอมพวเตอรและการเขยนโปรแกรม (Computers and Programming) นอกจากจะใชเอกสารทอาจารยใชในการเรยนการสอนในหอง และเอกสารการทดลองแลว นกศกษาควรมหนงสออนๆ เพอเปนเอกสารอางองคาสงตางๆ ศกษาโจทยปญหา และแนวคดตางๆ โดยนกศกษาสามารถใชหนงสอในรายการตางๆ ตอไปน หรอหนงสออนๆ ในทองตลาดได

ชอหนงสอ : คมอเขยนโปรแกรมภาษา C ฉบบผเรมตน ผเขยน : ประภาพร ชางไม สานกพมพ : Dev Book หนงสอมเนอหาทฤษฎพนฐานของภาษา C ตามมาตรฐาน ANSI ครบถวน ซงสามารถนามาใชอางองในการเขยนคาสงตางๆ ไดเปนอยางดในหนงสอมตวอยางโจทยปญหา ตวอยางโปรแกรมพรอมคาอธบาย และหนาจอแสดงผลของโปรแกรมตวอยางตางๆ

ชอหนงสอ : รวมโจทยขอสอบภาษา C ผเขยน : ประภาพร ชางไม สานกพมพ : Dev Book หนงสอเลมนนาเสนอโจทยปญหาตางๆ ของภาษา C ในรปแบบคาถามและคาตอบ ซงนกศกษาสามารถนามาใชทบทวน และประเมนตวเองในการสอบกลางภาคและการสอบปลายภาคได

ชอหนงสอ : คอมพวเตอรและการเขยนโปรแกรม C และ Java ผเขยน : ธนญชย ตรภาค สานกพมพ : SE-ED เปนหนงสอทมงเนนกระบวนการคดในการเขยนโปรแกรม มการกาหนดขนตอนการคดโดยละเอยด จากโจทยปญหา โคดเทยม ไปจนถงลาดบการเขยนโคดโปรแกรม เหมาะสาหรบผทยงไมเคยเขยนโปรแกรมมากอน หรอผเรมตนเขยนโปรแกรม

Page 4: computer programming book

©2011 CE-KMITL v0.1

4

ชอหนงสอ : คมอเรยนภาษาซ ผเขยน : อรพน ประวตบรสทธ สานกพมพ : Provision เปนหนงสอทนาเสนอชดคาสงและโครงสรางขอมลพนฐานตางๆ ในภาษาซ ซงแตละคาสงหรอโครงสรางขอมลจะมตวอยางโจทย โคดโปรแกรม และคาอธบายโคดโปรแกรมเปนรายบรรทด มการนาเสนอเกยวกบโครงสรางขอมล และการเปลยนแปลงขอมลตางๆ ทเกดขนในโปรแกรมใหเหนภาพการเปลยนแปลงขอมลในตวแปรตางๆชดเจน

ชอหนงสอ : คมอการเขยนโปรแกรมภาษา C ผเขยน : รศ. ธรวฒน ประกอบผล สานกพมพ : Clean Code หนงสออธบายหลกการและแนวคดของภาษาซ การเขยนโปรแกรมแบบโครงสราง ผงงาน และซโดโคด การบนทกลงไฟล และอานไฟล การเขยนโปรแกรมกราฟก และภาพเคลอนไหว โดยมตวอยางโจทย โคดโปรแกรม และคาอธบายโคดชดเจน

Page 5: computer programming book

©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

Page 6: computer programming book

©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

Page 7: computer programming book

©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

Page 8: computer programming book

©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

Page 9: computer programming book

©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

Page 10: computer programming book

©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

Page 11: computer programming book

©2011 CE-KMITL v0.1

11

การตดตงโปรแกรม Visual Studio 2008 ............................................................................................................................ 171

Page 12: computer programming book

©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

Page 13: computer programming book

©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

Page 14: computer programming book

©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 

Page 15: computer programming book

©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 คะแนน นกศกษาจะไดคะแนนนจากการสงโปรแกรมใหเจาหนาทดแล

Page 16: computer programming book

©2011 CE-KMITL v0.1

16

หองปฏบตการตรวจ ภายในเวลาชวโมงทาปฏบตครงตอครง โดยโจทยจะมาจากเอกสารการทดลอง ทเจาหนาทจะกาหนดใหนกศกษาทาภายในแตละหอง ครงละไมตากวา 1 ขอ

Page 17: computer programming book

©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

วนทเปน

นตามท

Page 18: computer programming book

©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, โปรแกรมฟงเพลง

Page 19: computer programming book

©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 ระบบเลขฐานสอง

Page 20: computer programming book

©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 ฐานสบ ใหเปนฐานสบหก

การแปลงตวเลขฐานสองเปนฐานสบหก

Page 21: computer programming book

©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 คานวณแลวมคาเทาใด

Page 22: computer programming book

©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

Page 23: computer programming book

©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 ตอจากนนจงรนโปรแกรม

Page 24: computer programming book

©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) ทดลองรนโปรแกรมและตรวจดผลลพธ

ขนตอนในการพฒนาโปรแกรมเบองตนทโปรแกรมมขนาดและจานวนบรรทดของคาสงไมมากนก จะมขนตอนในการพฒนาโปรแกรมดงน

Page 25: computer programming book

©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

Page 26: computer programming book

©2011 CE-KMITL v0.1

26

2 สรางโปรเจคเพอสาหรบเกบโปรแกรมทจะเขยนขนในภายหลง ในแตละโปรเจคอาจจะมไดหลาย โปรแกรม ทเมนบารของ Visual C++ ใหกด File -> New -> Project

3 เลอกประเภทของโปรแกรมทจะทาการสราง ในการทดลองนจะสรางโปรแกรมทจะรนบนหนาตางคอนโซล คอ ขอมลทเปนเอาทพทและอนพทจะปรากฏอยทหนาตางน (หนาตางทเปนสดา) ทหนาจอNew Project ใหเลอก Win32 -> Win32 Console Application ท Name ใหตงชอโปรเจควา HelloWorld

Page 27: computer programming book

©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

Page 28: computer programming book

©2011 CE-KMITL v0.1

28

7 กาหนดรปแบบของโปรแกรมทจะทาการสราง ในการทดลองนใหเลอก C++ File ทชอง Name ใหตงชอโปรแกรม HelloWorld แลวกด Add

8 เขยนโปรแกรมตามตวอยางตอไปน

#include <stdio.h> int main() { printf(“Hello, world!\n”); return 0; }

Page 29: computer programming book

©2011 CE-KMITL v0.1

29

9 สงรนโปรแกรม ทเมนบารเลอก Debug -> Start Without Debugging หรอ Ctrl+F5 (ใหกดปม Ctrl และ F5 พรอมๆกน) หลงจากนนใหยนยนการสรางโปรแกรมโดยการกดปม Yes หากไมตองการใหหนาจอน ปรากฏบอยๆ ใหเลอก Do not show this dialog again

10 ในกรณทโปรแกรมมทผด จะมขอความบอกอยดานลางวาผดทไหน กตาแหนง และทหนาจอจะ ขนมาถามวาจะใหนาเอาโปรแกรมเกาทเขยนถกไวแลวมารนหรอไม ถาไมตองการใหเลอก No หลงจาก นนกทาการตรวจสอบวาโปรแกรมเขยนผดทไหน ใหทาการแกไข แลวรนโปรแกรมใหม

Page 30: computer programming book

©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 อยางไร บนทก____________________________________________________________________________________ การทจะแสดงผลใหอยตางบรรทดกนตองทาอยางไร _________________________________________________________________________________________

Page 31: computer programming book

©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 บนทกโคดของโปรแกรมทนศ.เขยน

Page 32: computer programming book

©2011 CE-KMITL v0.1

32

Page 33: computer programming book

©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 เพอทาใหสามารถใชคาสงทวไปได

Page 34: computer programming book

©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 เปนสวนทควบคมรปแบบการแสดงผล เชน การจดยอหนา การขนตนบรรทดใหม เปนตน สวนแสดงชนดขอมล เปนการกาหนดรปแบบของชนดขอมลทจะแสดงผลขอมล หรอตวแปร

• สวนแสดงชนดขอมลแบบปกต

Page 35: computer programming book

©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 จะมขอมล หรอตวแปรทจะแสดงผล

Page 36: computer programming book

©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

Page 37: computer programming book

©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

Page 38: computer programming book

©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

Page 39: computer programming book

©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

Page 40: computer programming book

©2011 CE-KMITL v0.1

40

Bangkok, Thailand. 3) จงเขยนสวนของโปรแกรมใหแสดงผลตามเงอนไขตอไปน บรรทดท 1 แสดง รหสประจาตว นศ. บรรทดท 2 แสดง ชอ นามสกล บรรทดท 3 แสดง วน/เดอน/ป เกด บรรทดท 8 แสดงขอความ http://www.ce.kmitl.ac.th ชดขอบขวาของบรรทด บรรทดท 10 แสดงขอความ bye bye ตรงกลางบรรทด

Page 41: computer programming book

©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) ฟงกชนยอย เปนสวนทไมจาเปนตองใชสาหรบผเรมตนเขยนโปรแกรม

Page 42: computer programming book

©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 : ยายเคอรเซอรกลบไปทตนบรรทด

Page 43: computer programming book

©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

Page 44: computer programming book

©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; }

Page 45: computer programming book

©2011 CE-KMITL v0.1

45

การทดลองท 2.2 ใหนกศกษาปอนโปรแกรมตามตวอยางดานลาง แลวสงเกตผลลพธทได 1. ตวอยางโปรแกรมทมการเรยกใชงานฟงกชน printf #include <stdio.h> int main() { printf("Engineer"); return 0; }

Page 46: computer programming book

©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 ตาแหนง โดยแสดงผลคนละบรรทดและใหจดทศนยมอยตรงกลางจอภาพ

Page 47: computer programming book

©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

Page 48: computer programming book

©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

Page 49: computer programming book

©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

Page 50: computer programming book

©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

Page 51: computer programming book

©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; }

Page 52: computer programming book

©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);

Page 53: computer programming book

©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; } การกาหนดคาใหกบตวแปรในภาษาซใชเครองหมาย = โดยการทางานจะนาคาทอยทางขวามอ (จานวน อกขระ ขอความ คาจากตวแปร หรอผลลพธจากฟงกชน) ใหกบตวแปรทอยทางซายมอ รปแบบคาสง

Page 54: computer programming book

©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 เครองหมายแบบลดรป

Page 55: computer programming book

©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

Page 56: computer programming book

©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>

Page 57: computer programming book

©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()

Page 58: computer programming book

©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; }

Page 59: computer programming book

©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) ตองม & นาหนาชอตวแปร

การคานวณทางคณตศาสตร ในการเขยนโปรแกรมสงทจะขาดไมไดเลยคอการคานวณทางคณตศาสตร และการคานวณทางดานตรรกศาสตรสาหรบการคานวณทางคณตศาสตรนน โปรแกรมเมอรสามารถคานวณโดยใชเครองหมาย + , - , * , / และเครองหมาย % โดยมเครองหมาย ( และ ) เปนเครองหมายทใชในการจดกลมของการคานวณ การคานวณจะมการคานวณเครองหมายทมนยสาคญสงกวากอน โดยจดนยสาคญของเครองหมายไวดงน

Page 60: computer programming book

©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);

Page 61: computer programming book

©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)

Page 62: computer programming book

©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 ตวอกษร)

Page 63: computer programming book

©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;

Page 64: computer programming book

©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)เปนผงงานซงแสดงลาดบขนตอนการทางานของโปรแกรมหนงๆ สญลกษณทใชในการเขยนผงงาน

สญลกษณ ความหมาย

แทนการเรมตน หรอสนสดของผงงาน

แทนการรบขอมลหรอปอนขอมลเขาทางแปนพมพ

แทนการแสดงผลลพธบนหนาจอภาพ

แทนการกาหนดคาหรอการคานวณคา

แทนการเปรยบเทยบ

Page 65: computer programming book

©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 : เปนตวแปรชนดจานวนทศนยมสาหรบเกบคาพนท

Page 66: computer programming book

©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)

Page 67: computer programming book

©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

Page 68: computer programming book

©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()

Page 69: computer programming book

©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

Page 70: computer programming book

©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

Page 71: computer programming book

©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

Page 72: computer programming book

©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

Page 73: computer programming book

©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; }

Page 74: computer programming book

©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 เทคนค คอ

Page 75: computer programming book

©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 สามารถทาไดดงรปแบบตอไปน

Page 76: computer programming book

©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>

Page 77: computer programming book

©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 คออะไร

Page 78: computer programming book

©2011 CE-KMITL v0.1

78

Q : ผลลพธของ Case 2 คออะไร Q : เหตใดจงมความแตกตางกน

การทดลองท 4.3 ใหนกศกษาเขยนโปรแกรมตอไปน

1) จงเขยนโปรแกรมเพอรบคาตวแปรเปนตวเลขจานวนเตม 2 จานวน แลวแสดงผลลพธตวเลขทมคามากกวา 2) จงเขยนโปรแกรมเพอรบคาตวแปรเปนตวเลขจานวนเตม 3 จานวน แลวแสดงผลลพธตวเลขทอยตรงกลางระหวาง

เลขทมากทสด กบเลขทนอยทสด 3) จงเขยนโปรแกรมเพอรบคาตวแปรเปนตวเลขจานวนเตม 1 จานวนแลวแสดงผลลพธวาตวเลขทรบเขามาเปนเลขค

หรอเลขค 4) จงเขยนโปรแกรมเพอรบตวเลขจานวนเตม 3 จานวน แลวแสดงผลลพธเปนผลบวกของตวเลขทมากทสดกบตวเลขท

นอยทสด 5) จงเขยนโปรแกรมเพอรบคาตวเลขจานวนเตม 3 จานวน แลวแสดงผลลพธวา ถาตวเลขทงสามเปนความยาวของดาน

ของสามเหลยมหรอไม ถาเปนสามเหลยม สามเหลยมรปนนจะเปนสามเหลยมมมฉากหรอไม 6) แกไขโปรแกรมในขอ 5 โดยใหสามารถรบตวเลขทศนยมได

Page 79: computer programming book

©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;

Page 80: computer programming book

©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

Page 81: computer programming book

©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

Page 82: computer programming book

©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

Page 83: computer programming book

©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'

Page 84: computer programming book

©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

Page 85: computer programming book

©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);

Page 86: computer programming book

©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”)

Page 87: computer programming book

©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); ผงงาน

Page 88: computer programming book

©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 ดงน

Page 89: computer programming book

©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 เทานน

Page 90: computer programming book

©2011 CE-KMITL v0.1

90

3) จงเขยนโปรแกรมรบอนพทเปนตวเลขจานวนเตม 1 จานวนแลวคานวณหาผลคณของตวเลขตงแต 2 จนถงตวเลขทรบเขาโดยใชคาสง while เทานน

4) จงเขยนโปรแกรมรบอนพทเปนตวเลขจานวนเตม 1 จานวนแลวคานวณหาผลคณของตวเลขตงแต 2 จนถงตวเลขทรบเขาโดยใชคาสง do…while เทานน

5) จงเขยนโปรแกรมเพอรบตวเลขไปเรอยๆ จนกวาจะรบคาตวเลข 0 แลวแสดงผลลพธผลรวมของตวเลขทรบคาทงหมด

Page 91: computer programming book

©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++

Page 92: computer programming book

©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 ตว แลวตรวจสอบวามอกษรทเปนสระกตว และไมใชสระกตว

Page 93: computer programming book

©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

Page 94: computer programming book

©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 ฿

Page 95: computer programming book

©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 ฿

Page 96: computer programming book

©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

Page 97: computer programming book

©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 ตวอกษร

Page 98: computer programming book

©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 ตว แลวใหแสดงผลลพธเปนรปผเสอเชน

Page 99: computer programming book

©2011 CE-KMITL v0.1

99

Page 100: computer programming book

©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 มต ตวแปรอารเรยทเกบขอมลไดเพยงแถวเดยว (ใชลาดบในการอางถงขอมล)

Page 101: computer programming book

©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 การอางองขอมลอารเรย

ตวอยางการอางขอมลในอารเรย

Page 102: computer programming book

©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

Page 103: computer programming book

©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)

Page 104: computer programming book

©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

Page 105: computer programming book

©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" };

การอางคาตาแหนงดงรปดานลาง

Page 106: computer programming book

©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 ***

Page 107: computer programming book

©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

Page 108: computer programming book

©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]

Page 109: computer programming book

©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

Page 110: computer programming book

©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];

Page 111: computer programming book

©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; }

Page 112: computer programming book

©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 ตว แลวคานวณหาผลคณของเมตรกซทงสอง และพมพผลลพธออกมา ดงตวอยาง

Page 113: computer programming book

©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

Page 114: computer programming book

©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;

Page 115: computer programming book

©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;

Page 116: computer programming book

©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);

Page 117: computer programming book

©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]

Page 118: computer programming book

©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;

//รปแบบของโครงสรางซอนโครงสราง

Page 119: computer programming book

©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

Page 120: computer programming book

©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. ไมมขอใดถกตอง

Page 121: computer programming book

©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;

Page 122: computer programming book

©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; เปนตน

Page 123: computer programming book

©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 พรอมทงเขยนโปรแกรมทดสอบการทางาน

Page 124: computer programming book

©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

Page 125: computer programming book

©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 = &pi; //ขนาดของ 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

Page 126: computer programming book

©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 = &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

Page 127: computer programming book

©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]

Page 128: computer programming book

©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 ทชตวแปรอารเรย ดวย + และ -

เขยนคาอธบายเพม

Page 129: computer programming book

©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

Page 130: computer programming book

©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

Page 131: computer programming book

©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

Page 132: computer programming book

©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++;

ผลลพธ

Page 133: computer programming book

©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 เทานน

Page 134: computer programming book

©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

Page 135: computer programming book

©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;

Page 136: computer programming book

©2011 CE-KMITL v0.1

136

pt_num = &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;

Page 137: computer programming book

©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 ทาไดโดยใช

Page 138: computer programming book

©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) ดงนนขอมลของนกศกษาแตละคนจะเปนโครงสรางซอนโครงสรางอย ทงนการใชขอมลตาแหนงตาง ๆ ใหใชเฉพาะตวชเทานน เหมอนขอกาหนดเดม

Page 139: computer programming book

©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” เปน ตน

Page 140: computer programming book

©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)

Page 141: computer programming book

©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

Page 142: computer programming book

©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

Page 143: computer programming book

©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);

}

พรโปรเซสเซอรไดเรคทฟ

ตวแปรชนดโกบอล

ฟงกชนหลก

ฟงกชนยอย

สวนตวโปรแกรม

สวนหวโปรแกรม

ตวแปรชนดโลคอล

คาสง

ฟงกชนโพรโทรไทพ

Page 144: computer programming book

©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++

Page 145: computer programming book

©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; }

Page 146: computer programming book

©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",&deg); 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;

Page 147: computer programming book

©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);

//ผล

สรางตวแปรตอจ

าศสรางตวแปรน

ลลพธ

ลลพธ

จาก พรโปรแซส

นนโดยจะประก

สเซอร

กาศสราง

Page 148: computer programming book

©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; }

//ผลลพธ

Page 149: computer programming book

©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

Page 150: computer programming book

©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>

Page 151: computer programming book

©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; }

Page 152: computer programming book

©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 คอการสงขอมลทตวแปรนนๆ เกบอย สงใหฟงกชนทางาน โดยการทางานของฟงกชนจะไมมผลกระทบตอคาทเกบในตวแปร เนองจากสงเฉพาะขอมลไปยงฟงกชนเทานน

Page 153: computer programming book

©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");

Page 154: computer programming book

©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;

Page 155: computer programming book

©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 ขนของกระตายตวน

Page 156: computer programming book

©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

Page 157: computer programming book

©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

Page 158: computer programming book

©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

Page 159: computer programming book

©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

Page 160: computer programming book

©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

Page 161: computer programming book

©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; }

Page 162: computer programming book

©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

Page 163: computer programming book

©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 โดยกาหนด

Page 164: computer programming book

©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

Page 165: computer programming book

©2011 CE-KMITL v0.1

165

2) จงเขยนโปรแกรมเพอนบจานวนครงการรนโปรแกรมหนง ๆ วามการรนไปทงหมดกครงแลว โดยใหเกบจานวนครงการรนไวในไฟล 3) จงเขยนโปรแกรมเพอเกบขอมลของคนจานวน 10 คน โดยเกบชอ อาย ไวในไฟล (สามารถเลอกชอไฟลได) แลวคนหาคนทมอายมากกวา 20 ปจากขอมลในไฟลทเกบไว แลวแสดงผลท output

Page 166: computer programming book

©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 ถาในดสกไมพบไฟลในชอดงกลาว คาสงนจะสรางไฟลวางเปลาใหโดยไมมขอมล แตถามไฟลชอดงกลาวอยแลว ขอมลเดมในไฟลทงหมดจะหายไป กลายเปนไฟลวางเปลา

Page 167: computer programming book

©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

Page 168: computer programming book

©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);

Page 169: computer programming book

©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 นนมจดสแดงทงหมดกจด

Page 170: computer programming book

©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, ธนญชย ตรภาค, สนพ. ซเอดยเคชน จากด

Page 171: computer programming book

©2011 CE-KMITL v0.1

171

การตดตงโปรแกรม Visual Studio 2008