การเขียนโปรแกรมคอมพิวเตอร...
TRANSCRIPT
การเขยนโปรแกรมคอมพวเตอร (Computer Programming)
ผศ.ดร. กรช สมกนธา
วศ.ด. วศวกรรมไฟฟา (แขนงวจยดานวศวกรรมคอมพวเตอร) วศ.ม. วศวกรรมคอมพวเตอร
คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน
คานา ตาราการเขยนโปรแกรมคอมพวเตอร เปนผลทไดจากการใชประกอบการสอนรายวชา
CS34101 การเขยนโปรแกรมคอมพวเตอร ซงเปนรายวชาทไดเปดสอนในสาขาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ มหาวทยาลยราชภฏอดรธาน โดยผ เขยนตาราไดใชภาษาซในการเขยนโปรแกรมคอมพวเตอร เนองจากภาษาซเปนภาษาทมประสทธภาพสงและเหมาะสาหรบการเขยนโปรแกรมทมปญหาซบซอน ผ เขยนตาราไดจดทาตาราตามคาอธบายรายวชาทไดอธบายไวในหลกสตร โดยไดแบงเนอหาไว 13 บทเรยน โดยในบทท 1 ถงบทท 11
ครอบคลมตามคาอธบายรายวชาทงหมดตามหลกสตร และบทท 12-13 จะเปนบททเพมเตม ทไดมาจากประสบการณการวจย โดยจะเปนการประยกตในการเขยนโปรแกรมเพอใชในงานวจย เพอเปนพนฐานของการทางานวจยของนกศกษาซงจะเปนการสรางพนฐานความเขาใจใหนกศกษาใหมผลสมฤทธทดยงขน โดยคาดหวงวาจะเปนตาราทเหมาะสมสาหรบนกศกษาในสาขาวชาวทยาการคอมพวเตอร สาขาวศวกรรมคอมพวเตอร สาขาเทคโนโลยสารสนเทศ สาขาคอมพวเตอรธรกจ และนกวจยทวไป ตาราเลมนผ เขยนไดทาการปรบปรง แกไขเนอหาและรปภาพบางสวนใหเหมาะสมเพมเตม เนองจากไดใชประกอบการสอนตงแตป พ.ศ. 2553 จนถงปจจบน ในสวนของคาศพทเฉพาะทางผ เขยนไดใชคาศพทตามศพทคอมพวเตอรและเทคโนโลยสารสนเทศ ฉบบราชบณฑตยสถาน พทธศกราช 2546 และหากคาศพทใดไมมคาแปลผ เขยนไดใชคาทบศพท หรอตามความนยม เพอใหเหมาะสมกบตารา
ผ เขยนขอขอบคณบดา มารดา พสาว ภรรยา ลกชาย และลกสาว อนเปนทรกทเปนกาลงใจสนบสนนใหงานสาเรจไปดวยด โดยเฉพาะอยางยงผ เขยนขอกราบพระคณมารดาผลวงลบ (คณแมอมพร สมกนธา) ผ ทเปนแรงผลกดนในทกสงทกอยางของชวต ผ ทคอยสนบสนนและเปนกาลงใจใหตลอดมา ผ ททางานเหนอยยากเพอใหผ เขยนมวนนได สดทายผ เขยนขอกราบขอบพระคณ คร-อาจารย ทประสทธประสาทวชาความรใหผ เขยน อกทงไดใหความชวยเหลอและสละเวลาอนมคาทใหคาแนะนา จนทาใหตาราเลมนสาเรจลลวงดวยด
(2)
ในโอกาสนผ เ ขยนขอขอบคณทนเครอขายเชงกลยทธและพฒนาอาจารยในสถาบนอดมศกษา สานกงานคณะกรรมการอดมศกษา ทใหทนขาพเจาจนสาเรจการศกษา และขอขอบคณเจาของงานเขยนทกทานทไดถกอางองในตาราเลมน ผ เขยนไมไดตงใจทจะละเมดลขสทธของผ ใด หากมขอความหรอรปภาพบางสวน ทผ เขยนไมไดอางองถง ผ เขยนกขออนญาตมา ณ ทนดวย ผ เขยนหวงเปนอยางยงวา ตาราเลมนจะเปนประโยชนตอการเรยนการสอนในวชาการเขยนโปรแกรมคอมพวเตอรและเปนตาราพนฐานในการทาวจย โดยสามารถใชเปนเหมอนตาราหลกในการศกษา และสามารถใชเปนตาราอางอง หรอศกษาเองไดโดยสะดวก หากทานทนาไปใชมขอเสนอแนะ ผ เขยนยนดรบคาแนะนาจากทกทาน เพอปรบปรงใหดยงขนตอไป และขอขอบคณ ณ โอกาสนดวย
ผ เขยนขออทศงานนใหกบมารดาผลวงลบ
(I dedicated this work to my late mother.)
ผชวยศาสตราจารย ดร. กรช สมกนธา 1 พฤศจกายน 2556
สารบญ
หนา
คานา ......................................................................................................................... (1)
สารบญ ........................................................................................................................ (3)
สารบญรป .................................................................................................................. (13)
สารบญตาราง ............................................................................................................ (19)
บทท 1 พนฐานระบบคอมพวเตอร .................................................................................. 1
1.1 ลกษณะการทางานของคอมพวเตอร .................................................................. 1
1.2 ประเภทของเครองคอมพวเตอร ......................................................................... 2
1.2.1 แบงประเภทตามลกษณะการใชงาน ................................................... 3
1.2.2 แบงตามขนาดและความสามารถ ...................................................... 3
1.3 โครงสรางคอมพวเตอร .................................................................................... 10
1.4 องคประกอบของระบบคอมพวเตอร ................................................................. 14
1.4.1 ฮารดแวร ....................................................................................... 15
1.4.2 ซอฟตแวร ..................................................................................... 15
1.4.3 ขอมล ........................................................................................... 16
1.4.4 บคลากร ....................................................................................... 17
1.4.5 ขนตอนการดาเนนงาน ................................................................... 18
1.5 ซอฟตแวร ...................................................................................................... 18
1.5.1 ซอฟตแวรระบบ .............................................................................. 19
1.5.2 ซอฟตแวรประยกต .......................................................................... 22
1.5.3 ซอฟตแวรสาเรจรป ........................................................................ 23
1.6 ภาษาคอมพวเตอร ......................................................................................... 24
1.7 หนาทการทางานของเครองคอมพวเตอร .......................................................... 28
บทสรป ............................................................................................................. 33
แบบฝกหด .......................................................................................................... 34
(4)
หนา
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน .................................................. 35
2.1 ขนตอนในการเขยนโปรแกรม ......................................................................... 35
2.2 สญลกษณผงงาน ......................................................................................... 38
2.3 รหสเทยม .................................................................................................... 40
2.4 การวเคราะหผงงาน ...................................................................................... 42
2.5 การตรวจสอบขอผดพลาดของโปรแกรม ......................................................... 46
2.6 โครงสรางการควบคมโปรแกรม ...................................................................... 47
2.6.1 โครงสรางการควบคมโปรแกรมแบบลาดบ........................................ 47
2.6.2 โครงสรางการควบคมโปรแกรมแบบเงอนไข ...................................... 50
2.6.3 โครงสรางการควบคมโปรแกรมแบบวนซา ........................................ 56
2.6.4 โครงสรางการควบคมโปรแกรมแบบกระโดด .................................... 62
บทสรป ............................................................................................................ 64
แบบฝกหด .......................................................................................................... 65
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ ............................................. 67
3.1 ประวตความเปนมาของภาษาซ ..................................................................... 67
3.2 ขนตอนการทางานของภาษาซ ....................................................................... 68
3.2.1 ขนตอนการเขยนโปรแกรม .............................................................. 69
3.2.2 ขนตอนการแปลโปรแกรม ............................................................... 70
3.2.3 ขนตอนการเชอมโยงโปรแกรม ......................................................... 71
3.2.4 ขนตอนการประมวลผลโปรแกรม ..................................................... 72
3.3 โครงสรางพนฐานของภาษาซ ........................................................................ 73
3.3.1 สวนหวของโปรแกรม ...................................................................... 74
3.3.2 สวนประกาศตวแปร ....................................................................... 75
3.3.3 สวนฟงกชน ................................................................................... 75
3.3.4 สวนของรายละเอยดโปรแกรมหรอคาสงโปรแกรม ............................. 76
(5)
หนา
3.4 องคประกอบพนฐานของภาษาซ ..................................................................... 77
3.4.1 คาและสญลกษณ ........................................................................... 77
3.4.2 ตวแปรและชนดของขอมล ............................................................... 85
บทสรป ............................................................................................................. 88
แบบฝกหด .......................................................................................................... 89
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล ....................... 91
4.1 ชนดของขอมล .............................................................................................. 91
4.1.1 ชนดขอมลแบบวอย ........................................................................ 93
4.1.2 ชนดขอมลแบบตวอกษร .................................................................. 93
4.1.3 ชนดขอมลแบบเลขจานวนเตม ......................................................... 94
4.1.4 ชนดขอมลแบบเลขทศนยม .............................................................. 96
4.2 ตวแปร ......................................................................................................... 97
4.2.1 กฎการตงชอตวแปร ........................................................................ 98
4.2.2 รปแบบการประกาศตวแปร .............................................................. 99
4.2.3 ประเภทของตวแปร ....................................................................... 100
4.2.4 ขอบเขตการทางานของตวแปร ....................................................... 102
4.3 คาคงท ....................................................................................................... 105
4.3.1 ชนดของคาคงท ............................................................................ 105
4.3.2 การกาหนดคาคงท ........................................................................ 109
4.4 การรบและแสดงผลขอมล ............................................................................ 111
4.4.1 การรบขอมลดวยฟงกชน scanf() ................................................... 111
4.4.2 การแสดงผลขอมลดวยฟงกชน printf() ........................................... 116
4.4.3 การรบและแสดงผลขอมลดวยฟงกชน getchar() และ putchar() ...... 120
4.4.4 การรบและแสดงผลขอมลแบบสตรงดวยฟงกชน gets() และ puts() .. 121
บทสรป ........................................................................................................... 121
แบบฝกหด ........................................................................................................ 124
(6)
หนา
บทท 5 การดาเนนการในภาษาซ ............................................................................... 129
5.1 ตวดาเนนการ ............................................................................................. 129
5.2 ตวดาเนนการทางคณตศาสตร ..................................................................... 130
5.2.1 ตวดาเนนการทางคณตศาสตรจานวนเตม ...................................... 133
5.2.2 ตวดาเนนการทางคณตศาสตรทศนยม ........................................... 134
5.2.3 ตวดาเนนการกาหนดคาทางคณตศาสตร ....................................... 135
5.2.4 ตวดาเนนการทางคณตศาสตรเพมคาและลดคา ............................. 137
5.2.5 ลาดบการทางานของตวดาเนนการ ................................................ 140
5.2.6 การแปลงชนดขอมล ..................................................................... 142
5.3 ตวดาเนนการทางตรรกะ ............................................................................. 145
5.4 ตวดาเนนการเชงสมพนธ ............................................................................. 148
5.5 ตวดาเนนการระดบบต ................................................................................ 151
5.6 ตวดาเนนการกาหนดคา .............................................................................. 156
5.7 ตวดาเนนการเงอนไข .................................................................................. 159
5.8 ลาดบการทางาน ........................................................................................ 159
บทสรป .......................................................................................................... 161
แบบฝกหด ........................................................................................................ 162
บทท 6 คาสงควบคม .................................................................................................. 167
6.1 พนฐานคาสงควบคมในภาษาซ ................................................................... 167
6.2 คาสงแบบลาดบ ........................................................................................ 172
6.3 คาสงแบบเลอกหรอแบบมเงอนไข ................................................................ 173
6.3.1 คาสงทดสอบเงอนไข 1 ทางเลอก (if) ............................................. 173
6.3.2 คาสงทดสอบเงอนไข 2 ทางเลอก (if-else)...................................... 179
6.3.3 คาสงทดสอบเงอนไขหลายทางเลอก (nested if) ............................. 184
6.3.4 คาสงเลอกเงอนไข (switch-case) ................................................. 188
(7)
หนา
6.4 คาสงแบบวนซา .......................................................................................... 196
6.4.1 คาสงตรวจสอบเงอนไขกอนแลวจงทาซา (while) ............................. 196
6.4.2 คาสงทากอนแลวจงตรวจสอบเงอนไขเพอทาซา (do-while) .............. 201
6.4.3 คาสงทาซาตามจานวนรอบทระบ (for) ........................................... 205
6.5 คาสงแบบกระโดด ....................................................................................... 213
6.5.1 คาสงกระโดดโดยใชฟงกชน break ................................................. 213
6.5.2 คาสงกระโดดโดยใชฟงกชน continue ........................................... 214
6.5.3 คาสงกระโดดโดยใชฟงกชน goto .................................................. 215
บทสรป ........................................................................................................... 217
แบบฝกหด ........................................................................................................ 218
บทท 7 แถวลาดบ ....................................................................................................... 225
7.1 โครงสรางแถวลาดบ .................................................................................... 225
7.2 แถวลาดบ 1 มต .......................................................................................... 227
7.2.1 การประกาศตวแปรแถวลาดบ 1 มต ............................................... 228
7.2.2 การกาหนดคาเรมตนใหกบแถวลาดบ 1 มต .................................... 229
7.2.3 การเขาถงขอมลในแถวลาดบ 1 มต ................................................ 232
7.3 แถวลาดบแบบ 2 มต ................................................................................... 236
7.3.1 การประกาศตวแปรแถวลาดบ 2 มต ............................................... 236
7.3.2 การกาหนดคาเรมตนใหกบแถวลาดบ 2 มต .................................... 237
7.3.3 การเขาถงขอมลในแถวลาดบ 2 มต ................................................ 239
7.4 แถวลาดบ 3 มต .......................................................................................... 245
7.4.1 การประกาศตวแปรแถวลาดบ 3 มต ............................................... 245
7.4.2 การกาหนดคาเรมตนใหกบแถวลาดบ 3 มต .................................... 246
7.4.3 การเขาถงขอมลในแถวลาดบ 3 มต ................................................ 248
(8)
หนา
7.5 ขนาดแถวลาดบอตโนมต ............................................................................ 250
7.5.1 การกาหนดขนาดแถวลาดบโดยอตโนมต ....................................... 250
7.5.2 การหาขนาดของแถวลาดบโดยฟงกชน sizeof() .............................. 252
7.6 แถวลาดบของสายอกขระ ............................................................................ 258
บทสรป .......................................................................................................... 262
แบบฝกหด ........................................................................................................ 263
บทท 8 ฟงกชน ....................................................................................................... 265
8.1 แนวคดของฟงกชน ..................................................................................... 265
8.2 ฟงกชนมาตรฐาน ....................................................................................... 269
8.2.1 ฟงกชนในแฟมสวนหว math.h ...................................................... 269
8.2.2 ฟงกชนในแฟมสวนหว ctype.h ..................................................... 274
8.2.3 ฟงกชนในแฟมสวนหว string.h ..................................................... 277
8.2.4 ฟงกชนในแฟมสวนหว stdlib.h ..................................................... 279
8.3 ฟงกชนสรางเอง ......................................................................................... 281
8.3.1 ฟงกชนทไมมการรบคาเขามาในฟงกชน และไมมการสงคากลบ
ออกไปจากฟงกชน ................................................................................ 284
8.3.2 ฟงกชนทมการรบคาเขามาในฟงกชน แตไมมการสงคากลบ
ออกไปจากฟงกชน ................................................................................ 287
8.3.3 ฟงกชนทมการรบคาเขามาในฟงกชน และมการสงคากลบ
ออกไปจากฟงกชน ................................................................................ 289
8.3.4 ฟงกชนทไมมการรบคาเขามาในฟงกชน แตมการสงคากลบ
ออกไปจากฟงกชน ................................................................................ 292
8.3.5 การใชแถวลาดบในฟงกชน ........................................................... 294
(9)
หนา
8.4 การประกาศตวแปรของเรองฟงกชน .............................................................. 298
8.4.1 ตวแปรสวนกลาง .......................................................................... 298
8.4.2 ตวแปรเฉพาะท ............................................................................. 300
8.4.3 ตวแปรสถต .................................................................................. 301
8.4.4 ตวแปรเรจสเตอร .......................................................................... 302
บทสรป ........................................................................................................... 304
แบบฝกหด ........................................................................................................ 305
บทท 9 โครงสรางและยเนยน ..................................................................................... 307
9.1 โครงสราง ................................................................................................... 307
9.1.1 ความหมายและการประกาศขอมลแบบโครงสราง ........................... 308
9.1.2 การกาหนดคาเรมตนใหกบตวแปรภายในขอมลแบบโครงสราง ......... 312
9.1.3 การเขาถงตวแปรภายในขอมลแบบโครงสราง .................................. 313
9.1.4 การรบขอมลของตวแปรภายในขอมลแบบโครงสราง ........................ 318
9.1.5 ขอมลแบบโครงสรางซอนขอมลแบบโครงสราง ................................ 321
9.1.6 แถวลาดบกบขอมลแบบโครงสราง ................................................. 325
9.2 ยเนยน ....................................................................................................... 330
9.2.1 ความหมายและการประกาศขอมลแบบยเนยน ................................ 330
9.2.2 การกาหนดคาเรมตนใหกบตวแปรภายในขอมลแบบยเนยน ............. 336
9.2.3 การเขาถงตวแปรภายในขอมลแบบยเนยน ...................................... 337
9.2.4 การรบขอมลของตวแปรภายในขอมลแบบยเนยน ............................ 340
9.2.5 ขอมลแบบยเนยนซอนขอมลแบบยเนยน ......................................... 342
9.2.6 แถวลาดบกบขอมลแบบยเนยน ...................................................... 344
บทสรป ........................................................................................................... 347
แบบฝกหด ........................................................................................................ 348
(10)
หนา
บทท 10 ตวช ........................................................................................................... 351
10.1 พนฐานเกยวกบตวชและทอยหนวยความจา ............................................... 351
10.2 สญลกษณสาหรบตวช .............................................................................. 354
10.3 การประกาศตวแปรของตวช ...................................................................... 357
10.4 การกาหนดคาเรมตนของตวช .................................................................... 365
10.5 ตวชของตวช ............................................................................................ 369
10.6 ตวชและแถวลาดบ ................................................................................... 374
10.6.1 การใชงานตวชและแถวลาดบ ...................................................... 374
10.6.2 การสรางแถวลาดบจากตวช ........................................................ 378
10.6.3 การเปลยนขนาดของแถวลาดบ ................................................... 385
บทสรป .......................................................................................................... 387
แบบฝกหด ........................................................................................................ 389
บทท 11 แฟมขอมล ................................................................................................... 393
11.1 พนฐานแฟมขอมล .................................................................................... 393
11.2 การทางานกบแฟมขอความ (Text Files) .................................................... 395
11.3 ฟงกชนในการจดการแฟมขอมล ................................................................ 399
11.3.1 ฟงกชนในการจดการแฟมขอมลในรปแบบตวอกขระ ..................... 399
11.3.2 ฟงกชนในการจดการแฟมขอมลในรปแบบขอความ ....................... 404
11.4 การทางานเกยวกบแฟมฐานสอง................................................................ 416
11.5 การเขาถงขอมลแบบสม ............................................................................ 421
บทสรป .......................................................................................................... 430
แบบฝกหด ........................................................................................................ 431
(11)
หนา
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย .................................................. 433
12.1 การวดแนวโนมเขาสสวนกลาง ..................................................................... 433
12.1.1 ตวกลางเลขคณต ........................................................................ 433
12.1.2 มธยฐาน ................................................................................... 435
12.1.3 ฐานนยม ................................................................................... 438
12.2 การวดการกระจายของขอมล ...................................................................... 440
12.2.1 พสย .......................................................................................... 440
12.2.2 พสยควอรไทลและสวนเบยงเบนควอรไทล ................................... 442
12.2.3 สวนเบยงเบนมาตรฐานและความแปรปรวน ................................. 445
12.3 การคานวณสมการถดถอย .......................................................................... 447
12.3.1 การคานวณสมการถดถอยโดยใชสมการเสนตรง ........................... 448
12.3.2 การวดประสทธภาพของการพยากรณ .......................................... 454
12.4 การคนหาขอมลและการจดเรยงขอมล ......................................................... 464
12.4.1 การคนหาขอมล .......................................................................... 464
12.4.2 การจดเรยงขอมล ....................................................................... 472
บทสรป ........................................................................................................... 481
แบบฝกหด ........................................................................................................ 482
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐ ในการสรางขอสอบอตโนมต ........................................................................................ 485
13.1 ทฤษฎการวเคราะหขอสอบ ......................................................................... 485
13.1.1 ความยากงายของขอสอบ ............................................................ 487
13.1.2 อานาจจาแนก ............................................................................ 490
13.1.3 ความเปนปรนย .......................................................................... 492
13.1.4 ความมประสทธภาพ ................................................................... 493
13.1.5 ความยตธรรม ............................................................................ 493
13.1.6 ความเทยงตรงของขอสอบ ........................................................... 493
13.1.7 ความเชอมน .............................................................................. 494
(12)
หนา
13.2 ขนตอนวธเชงพนธกรรม ............................................................................. 495
13.2.1 ขนตอนวธเชงพนธกรรมเบองตน .................................................. 495
13.2.2 ฟงกชนเปาหมายกบฟงกชนความเหมาะสม ................................. 496
13.2.3 รปแบบโครโมโซม ..................................................................... 496
13.2.4 ขนตอนการทางานของวธเชงพนธกรรมพนฐาน ............................. 497
13.3 การเขยนโปรแกรมการวเคราะหขอสอบ และการสรางขอสอบ
อตโนมตโดยขนตอนวธเชงพนธกรรม ................................................................... 504
13.3.1 การเขยนโปรแกรมในการวเคราะหขอสอบ .................................... 504
13.3.2 การเขยนโปรแกรมในการสรางขอสอบอตโนมตโดย ขนตอนวธเชงพนธกรรม ......................................................................... 508
บทสรป .......................................................................................................... 534
แบบฝกหด ........................................................................................................ 535
บรรณานกรม ............................................................................................................. 537
ภาคผนวก .................................................................................................................. 539
ดรรชน ...................................................................................................................... 563
สารบญรป
หนา
รปท 1.1 ลกษณะการทางานของเครองคอมพวเตอร .............................................................. 2
รปท 1.2 ซเปอรคอมพวเตอร ................................................................................................ 4
รปท 1.3 เมนเฟรมคอมพวเตอร ............................................................................................ 5
รปท 1.4 มนคอมพวเตอร .................................................................................................... 6
รปท 1.5 คอมพวเตอรสวนบคคล.......................................................................................... 6
รปท 1.6 โนตบกคอมพวเตอร ............................................................................................... 7
รปท 1.7 คอมพวเตอรแทบเลต ............................................................................................. 8
รปท 1.8 คอมพวเตอรแบบมอถอ ......................................................................................... 8
รปท 1.9 คอมพวเตอรแบบบอรดเดยว .................................................................................. 9
รปท 1.10 โครงสรางภายในของคอมพวเตอร ....................................................................... 10
รปท 1.11 โครงสรางภายในของหนวยประมวลผลกลาง ....................................................... 11
รปท 1.12 ตวอยางซพยหรอหนวยประมวลผลกลาง ............................................................. 11
รปท 1.13 รอม ................................................................................................................. 13
รปท 1.14 แรม ................................................................................................................. 14
รปท 1.15 ตวอยางฮารดแวรของเครองคอมพวเตอร ............................................................. 15
รปท 1.16 ซอฟตแวรระบบปฏบตการวนโดว XP .................................................................. 16
รปท 1.17 กลมของซอฟตแวรประเภทตางๆ ........................................................................ 19
รปท 1.18 ภาษาเครอง ...................................................................................................... 24
รปท 1.19 ภาษาแอสแซมบล ............................................................................................. 25
รปท 1.20 ตวอยางรปแบบภาษาซ ...................................................................................... 26
รปท 1.21 รปแบบของการแปลงภาษาระดบสงไปเปนภาษาเครอง ........................................ 27
รปท 1.22 วงรอบคาสง ...................................................................................................... 28
รปท 1.23 ตวอยางการทางานของการดงชดคาสง ................................................................ 29
รปท 1.24 แผนภาพสถานะวงรอบคาสง .............................................................................. 31
รปท 2.1 แบบจาลองนาตก ................................................................................................ 36
รปท 2.2 ความหมายของสญลกษณผงงาน ......................................................................... 39
(14)
หนา
รปท 2.3 ผงงานของการบวกเลข ตามแนวคดท 1 ................................................................ 43
รปท 2.4 ผงงานของการบวกเลข ตามแนวคดท 2 ................................................................ 44
รปท 2.5 ผงงานของการคานวณราคาสนคา ....................................................................... 45
รปท 2.6 ผงงานของการคานวณหาคาเกรดเฉลย 2 เทอม .................................................... 46
รปท 2.7 รปแบบการควบคมโปรแกรมแบบลาดบ ............................................................... 48
รปท 2.8 รปแบบประมวลผลชดคาสงแบบลาดบ ................................................................. 48
รปท 2.9 ผงงานแบบลาดบในการคานวณหาพนท ............................................................... 49
รปท 2.10 รปแบบการควบคมโปรแกรมแบบเงอนไข ............................................................ 50
รปท 2.11 รปแบบประมวลผลชดคาสงแบบเงอนไข ............................................................. 51
รปท 2.12 ผงงานแบบเงอนไขในการตรวจสอบตวเลขคและเลขค ......................................... 52
รปท 2.13 ผงงานแบบเงอนไขในการตรวจสอบตวเลขลบและบวก ........................................ 53
รปท 2.14 ผงงานแบบเงอนไขในการตรวจสอบอาย ............................................................. 54
รปท 2.15 ผงงานแบบเงอนไขในการตดเกรด ...................................................................... 55
รปท 2.16 รปแบบการควบคมโปรแกรมแบบวนซา .............................................................. 56
รปท 2.17 รปแบบประมวลผลชดคาสงแบบวนซา ............................................................... 57
รปท 2.18 ผงงานแบบวนซาในการพมพชออกจานวน 100 ครง ............................................ 58
รปท 2.19 ผงงานแบบวนซาในการหาคาผลรวมของเลข 1 ถง 10.......................................... 59
รปท 2.20 ผงงานแบบวนซาในการหาคาผลรวมของเลขคตงแตเลข 1 ถง 10 .......................... 60
รปท 2.21 ผงงานแบบวนซาในการหาคาเฉลยสวนสงของนกศกษา....................................... 61
รปท 2.22 รปแบบการควบคมโปรแกรมแบบกระโดด ........................................................... 62
รปท 2.23 รปแบบประมวลผลชดคาสงแบบกระโดด ............................................................ 63
รปท 3.1 ขนตอนการทางานของภาษาซ ............................................................................. 69
รปท 3.2 การเขยนโปรแกรมภาษาซในโปรแกรม Notepad ................................................... 69
รปท 3.3 การเขยนโปรแกรมในโปรแกรมภาษาเทอรโบซพลสพลส ......................................... 70
รปท 3.4 การเขยนโปรแกรมในโปรแกรม Microsoft Visual Studio ....................................... 70
รปท 3.5 การแปลโปรแกรมรหสตนฉบบแลวมขอผดพลาด ................................................... 71
รปท 3.6 ตวอยางการดาเนนการเชอมโยงขอมล .................................................................. 72
(15)
หนา
รปท 3.7 ตวอยางผลลพธจากการประมวลผลของโปรแกรม .................................................. 73
รปท 3.8 โครงสรางการเขยนโปรแกรมพนฐานของภาษาซ .................................................... 74
รปท 3.9 ตวอยางรปแบบของฟงกชนในภาษาซ ................................................................... 76
รปท 3.10 สวนของโปรแกรมตดเกรดนกศกษา .................................................................... 77
รปท 3.11 การหมายเหตโปรแกรม ...................................................................................... 78
รปท 3.12 ผลของการหมายเหตโปรแกรม ........................................................................... 79
รปท 3.13 สญลกษณตางๆ ทปรากฏในโปรแกรม ................................................................ 85
รปท 3.14 การประกาศตวแปร ........................................................................................... 85
รปท 3.15 การประกาศตวแปรทผดพลาด ........................................................................... 86
รปท 3.16 การประกาศตวแปรทกาหนดคาเรมตน ................................................................ 87
รปท 4.1 การประกาศตวแปรชนดขอมลแบบวอย ................................................................. 93
รปท 4.2 การกาหนดชนดของขอมลแบบจานวนเตม ............................................................ 95
รปท 4.3 ตวอยางการกาหนดคามากเกนเกบ ....................................................................... 95
รปท 4.4 ตวอยางการกาหนดคานอยเกนเกบ ....................................................................... 96
รปท 4.5 การกาหนดชนดของขอมลแบบทศนยม ................................................................. 97
รปท 4.6 การอางองขอมลในหนวยความจา ........................................................................ 98
รปท 5.1 แสดงการเลอนบตทางซายและการเลอนบตทางขวา ............................................. 152
รปท 6.1 รปแบบการเขยนคาสงของโปรแกรม .................................................................... 168
รปท 6.2 คาสงแบบเรยงลาดบ ......................................................................................... 168
รปท 6.3 ผงงานของคาสงแบบมเงอนไข ............................................................................ 170
รปท 6.4 ผงงานของคาสงแบบทาซา ................................................................................. 171
รปท 6.5 รปแบบคาสงแบบแบบกระโดด ........................................................................... 171
รปท 6.6 ผงงานของคาสงแบบมเงอนไขแบบเงอนไข 1 ทางเลอก ........................................ 173
รปท 6.7 ผงงานของคาสงแบบมเงอนไขแบบเงอนไข 2 ทางเลอก ........................................ 179
รปท 6.8 ผงงานของคาสงแบบมเงอนไขแบบเงอนไขหลายทางเลอก .................................... 184
รปท 6.9 คาสงทดสอบเงอนไขหลายทางเลอกทมความสบสน ............................................. 187
รปท 6.10 รปแบบคาสงเลอกเงอนไข ................................................................................ 189
(16)
หนา
รปท 6.11 ผงงานของคาสงแบบทาซาแบบตรวจสอบเงอนไขกอนแลวจงทาซา ..................... 196
รปท 6.12 ผงงานของคาสงแบบทาซาแบบทากอนแลวจงตรวจสอบเงอนไขเพอทาซา ........... 202
รปท 6.13 ผงงานของคาสงแบบทาซาตามจานวนรอบ ....................................................... 205
รปท 7.1 โครงสรางขอมลแบบแถวลาดบ .......................................................................... 226
รปท 7.2 รปแบบของแถวลาดบแบบ 1 มต ....................................................................... 227
รปท 7.3 รปแบบของแถวลาดบแบบ 2 มตหรอเมทรกซ (เมทรกซขนาด 5x5) ....................... 236
รปท 7.4 รปแบบของแถวลาดบแบบ 3 มต (เมทรกซขนาด 2x5x5) ..................................... 245
รปท 7.5 การจองหนวยความจาของตวแปร char name[6]; .............................................. 258
รปท 8.1 รปแบบตวอยางการทางานของฟงกชน ............................................................... 266
รปท 8.2 รปแบบตวอยางการเรยกใชงานฟงกชน............................................................... 282
รปท 9.1 โครงสรางการจดเกบขอมลชนดโครงสราง ........................................................... 330
รปท 9.2 โครงสรางการจดเกบขอมลชนดยเนยน ............................................................... 330
รปท 10.1 ตวอยางรปแบบของขอมลทจดเกบในหนวยความจา .......................................... 352
รปท 10.2 ตวอยางการใชงานสญลกษณ & ...................................................................... 354
รปท 10.3 ตวอยางการใชงานสญลกษณดอกจน * ............................................................ 355
รปท 10.4 ตวอยางการทางานของตวแปรตวชในการใช สญลกษณแอมเพอรแซนด & และดอกจน * ...................................................................... 356
รปท 10.5 ตวอยางตาแหนงหนวยความจาของขอมลในการใชตวแปรตวช ........................... 362
รปท 10.6 การประกาศตวแปรตวชทไมกาหนดคาเรมตน ................................................... 365
รปท 10.7 เปรยบเทยบตวอยางของตวแปรตวชของตวช .................................................... 369
รปท 10.8 ตวอยางการกาหนดคาเรมตนใหกบตวแปรตวชของตวช ..................................... 370
รปท 10.9 แผนภาพการชตาแหนงตางๆ ของขอมลของโปรแกรม ........................................ 372
รปท 10.10 แผนภาพการชตาแหนงตางๆ ของขอมลตวชของตวช 3 ตวช ............................. 373
รปท 10.11 การอางองตวแปรตวชของแถวลาดบ 1 มต ...................................................... 375
รปท 10.12 การอางองตวแปรตวชของแถวลาดบ 2 มต ...................................................... 375
รปท 10.13 การอางองตวแปรตวชของแถวลาดบ 3 มต ...................................................... 376
รปท 11.1 ลกษณะรปแบบของการทางานของแฟมขอมล .................................................. 394
(17)
หนา
รปท 11.2 รปแสดงการทางานของแฟมขอความในโหมดตางๆ ............................................ 397
รปท 11.3 แสดงตวอยางการใชฟงกชน rewind() ............................................................... 422
รปท 12.1 การคนหาขอมลแบบลาดบ .............................................................................. 465
รปท 13.1 ปรบปญหาเขาสขนตอนวธเชงพนธกรรม ........................................................... 495
รปท 13.2 วฏจกรขนตอนวธเชงพนธกรรมพนฐาน .............................................................. 498
รปท 13.3 รปแบบของโครโมโซม ...................................................................................... 499
รปท 13.4 ตวอยางวงลอเสยงทาย .................................................................................... 501
รปท 13.5 สลบสายพนธแบบ 1 จด .................................................................................. 502
รปท 13.6 สลบสายพนธแบบ 2 จด .................................................................................. 503
รปท 13.7 กลายพนธแบบทวภาค..................................................................................... 503
รปท 13.8 ปรบรปแบบของปญหาใหเขาสในรปแบบทเหมาะสม ......................................... 508
รปท 13.9 ขอมลแตละสถานเชอมตอ ................................................................................ 509
รปท 13.10 ผงงานหลกในการเขยนโปรแกรมโดยขนตอนวธเชงพนธกรรมพนฐาน ................. 511
รปท 13.11 แสดงรปตวอยางของการสรางประชากรตนแบบโดยการสม ............................... 512
รปท 13.12 ตวอยางของการสลบสายพนธแบบ 1 จด ......................................................... 517
รปท 13.13 ตวอยางของการกลายพนธ ............................................................................. 520
สารบญตาราง
หนา
ตารางท 3.1 อกษรพเศษ ................................................................................................... 83
ตารางท 3.2 ชนดตวแปรสาหรบเกบคาคงทชนดตาง ๆ ในภาษาซ ......................................... 87
ตารางท 4.1 แสดงการเปรยบเทยบขนาดของขอมลชนดตางๆ ............................................... 92
ตารางท 4.2 คาสงวน ........................................................................................................ 98
ตารางท 4.3 ชนดของตวแปรประเภทตางๆ ในภาษาซ ........................................................ 100
ตารางท 4.4 คาคงทตวอกษรพเศษ .................................................................................. 107
ตารางท 4.5 ตวแทนชนดขอมล ........................................................................................ 112
ตารางท 4.6 ตวแทนชนดขอมลอนๆ ................................................................................. 112
ตารางท 5.1 ตวดาเนนการทางคณตศาสตร ...................................................................... 131
ตารางท 5.2 ตวดาเนนการทางคณตศาสตรจานวนเตม ...................................................... 133
ตารางท 5.3 ตวดาเนนการทางคณตศาสตรทศนยม ........................................................... 134
ตารางท 5.4 ตวดาเนนการกาหนดคาทางคณตศาสตร ....................................................... 136
ตารางท 5.5 ตวดาเนนการทางคณตศาสตรเพมคาและลดคา ............................................. 138
ตารางท 5.6 ลาดบความสาคญของตวดาเนนการ .............................................................. 141
ตารางท 5.7 ลาดบนยสาคญของตวถกดาเนนการ ............................................................. 143
ตารางท 5.8 ตวดาเนนการทางตรรกะ ............................................................................... 145
ตารางท 5.9 ตวดาเนนการเชงสมพนธ .............................................................................. 148
ตารางท 5.10 ตวดาเนนการระดบบต ............................................................................... 151
ตารางท 5.11 ผลลพธของตวดาเนนการระดบบต & ,| ,^ ,~ ................................................ 152
ตารางท 5.12 ตวอยางการดาเนนการระดบบต .................................................................. 153
ตารางท 5.13 การกาหนดคาตวถกดาเนนการระดบบต ...................................................... 155
ตารางท 5.14 ตวดาเนนการกาหนดคา ............................................................................. 156
ตารางท 5.15 ทศทางการคานวณ .................................................................................... 160
ตารางท 8.1 แฟมสวนหว math.h ..................................................................................... 269
ตารางท 8.2 แฟมสวนหว ctype.h .................................................................................... 274
(20)
หนา
ตารางท 8.3 แฟมสวนหว string.h ................................................................................... 277
ตารางท 8.4 แฟมสวนหว stdlib.h ................................................................................... 375
ตารางท 10.1 การประกาศแถวลาดบแบบปกตและแถวลาดบแบบตวแปรตวช .................... 379
ตารางท 11.1 โหมดการทางานของแฟมขอความ .............................................................. 395
ตารางท 11.2 โหมดการทางานของแฟมขอความชนดแฟมฐานสอง .................................... 414
ตารางท 11.3 รปแบบการกาหนดรปแบบของตาแหนงตวช ................................................ 428
ตารางท 13.1 ตวอยางของการหาคาของสมการ ............................................................... 501
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
บทท 1
พนฐานระบบคอมพวเตอร
ในบทนจะกลาวถงลกษณะการทางานของเครองคอมพวเตอร (The Characteristic
of Computer) ประเภทของเครองคอมพวเตอร (Type of Computer) โครงสรางคอมพวเตอร (Structure of Computer) องคประกอบของระบบคอมพวเตอร (Element of Computer
System) ซอฟตแวร (Software) ภาษาคอมพวเตอร (Computer Language) และหนาทการทางานของเครองคอมพวเตอร (Function of Computer) ซงบทนจะเปนพนฐานการทางานของระบบคอมพวเตอร การเขยนโปรแกรมคอมพวเตอร และการทางานรวมกนของระบบคอมพวเตอร การทางานของระบบคอมพวเตอรจะสามารถกระทาไดจะตองประกอบไปดวยสวนของโครงสรางระบบคอมพวเตอรและสวนของซอฟตแวรจงจะสามารถทางานได ซงจะทางานรวมกนอยางเปนระบบสงผลทาใหเราสามารถใชงานคอมพวเตอรได ซงเมอเราเขาใจพนฐานของคอมพวเตอรกจะสามารถทจะนาไปประยกตในการใชงานในการเขยนโปรแกรมคอมพวเตอรไดอยางมประสทธภาพ
1.1 ลกษณะการทางานของคอมพวเตอร (The Characteristic of Computer)
คอมพวเตอรถกสรางมาจากการจาลองการทางานทางธรรมชาต สงเกตดวาลกษณะการทางานของเครองคอมพวเตอรจะคลายๆ กบลกษณะการทางานของสมองมนษย ซงเปนการเลยนแบบการคดของมนษยนนเอง ดงรปท 1.1 แสดงถงโครงสรางหลกของคอมพวเตอร ซงจะประกอบไปดวย หนวยประมวลผลกลาง หนวยความจา หนวยอนพต เอาตพต และเสนทางการเชอมโยงขอมล
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
2
หนวยคานวณ หนวยความจา 5 + 6 = ?
สมองมนษย ผานตาและมอ
Dataกระดาษ
ก. การทางานของสมองมนษย
Central
Procesing
Unit
Memory
Unit
Program
Input/
Output Unit
Instruction +
Data
Data
ข. การคานวณของคอมพวเตอรในปจจบนทมแนวคดมาจากจอหน ฟอน นอยมนน
รปท 1.1 ลกษณะการทางานของเครองคอมพวเตอร
คอมพวเตอรในยคปจจบนยงคงมขอจากดทคอมพวเตอรไมสามารถทางานได
ดงเชนมนษยจะสามารถกระทาได ถงแมวาลกษณะการทางานจะคลายกบมนษย ตวอยางของคอมพวเตอรในปจจบนทยงมขอจากดในการทางาน ดงเชนความสามารถในการเขาใจภาษามนษย ความสามารถในการเรยนร ความสามารถในการศกษาหาเหตผลประกอบการตดสนใจ ความสามารถในการรจกลกษณะตางๆ เชน รป รส กลน เสยง และความคดรเรม
อารมณ สญชาตญาณ และอนๆ ซงปจจบนกาลงอยในชวงทาวจยเพอพฒนาอยางตอเนองใหมประสทธภาพทสามารถทางานไดใกลเคยงกบมนษยหรอสามารถทางานไดดกวามนษยในทกสภาวะการทางาน
1.2 ประเภทของเครองคอมพวเตอร (Type of Computer)
คอมพวเตอรคอเครองมอหรออปกรณอเลกทรอนกสทมความสามารถในการคานวณอตโนมตตามคาสง สวนทใชประมวลผลเรยกวาหนวยประมวลผล ชดของคาสงทระบขนตอนการคานวณเรยกวาโปรแกรมคอมพวเตอร โดยคอมพวเตอรสามารถรบชดคาสงทเราสงใหทางานและนามาประมวลผลคาสงตางๆ เหลานน เพอแกปญหางานทสลบซบซอนจนไดผลลพธทตองการ ประเภทของคอมพวเตอรในปจจบนมผ แบงออกเปนหลายชนดหลายประเภท ขนอยกบเกณฑทใชในการแบง ดงเชนแบงตามลกษณะการใชงานและแบงตามขนาดและความสามารถ
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
3
1.2.1 แบงประเภทตามลกษณะการใชงาน
แบบใชงานทวไป (General Purpose Computer) หมายถง เครองคอมพวเตอรทมการใชงานทวไปและมความยดหยนในการทางาน โดยไดรบการออกแบบใหสามารถประยกตใชในงานประเภทตางๆ ในงานแตละดานไดโดยสะดวก โดยจะทางานตามคาสงในโปรแกรมทเขยนขนมา และเมอผ ใชตองการใหเครองคอมพวเตอรทางานอะไร กเพยงแตออกคาสงเรยกโปรแกรมทเหมาะสมเขามาใชงาน แบบใชงานทวไปเครองคอมพวเตอรเครองหนงสามารถใชงานไดหลายโปรแกรมพรอมกนเชนการใชโปรแกรมดหนงฟงเพลง พรอมกบสามารถใชโปรแกรมในการตดตอสอสารได
แบบใชงานเฉพาะดาน (Special Purpose Computer) หมายถงเครองคอมพวเตอรทถกออกแบบตวเครองและโปรแกรมควบคม ใหทางานอยางใดอยางหนงเปนการเฉพาะ โดยไมสามารถทางานอยางอนได โดยทวไปมกใชในงานควบคม หรองานอตสาหกรรมทเนนการประมวลผลแบบรวดเรว เชนเครองคอมพวเตอรควบคมสญญาณไฟจราจร คอมพวเตอรควบคมลฟต หรอคอมพวเตอรควบคมระบบอตโนมตในโรงงานตางๆ เปนตน
1.2.2 แบงตามขนาดและความสามารถ เปนการจาแนกประเภทของคอมพวเตอรทพบเหนในปจจบน ซงสามารถแบงออกเปนประเภทตางๆ ไดดงน
ซเปอรคอมพวเตอร (Supercomputer)
ซเปอรคอมพวเตอร ถอไดวาเปนคอมพวเตอรทมความเรวสงสด เครองซเปอรคอมพวเตอรมราคาแพงมาก มขนาดใหญทสดในคอมพวเตอรทกประเภท ซเปอรคอมพวเตอรสามารถคานวณทางคณตศาสตรทมความซบซอนมากไดอยางรวดเรว โดยทวไปสรางขนเปนการเฉพาะ เพองานดานวทยาศาสตรทตองการการประมวลผลทซบซอน และตองการความเรวสง ดงเชน งานวจยขปนาวธ งานโครงการอวกาศสหรฐ (NASA) การพยากรณอากาศลวงหนาเปนเวลาหลายวน และการศกษาผลกระทบของมลพษกบสภาวะแวดลอม ซงหากใชคอมพวเตอรชนดอนๆ แกไขปญหาประเภทน อาจจะตองใชเวลาในการคานวณหลายปกวาจะเสรจสน ในขณะทซเปอรคอมพวเตอรสามารถแกไขปญหาไดภายในเวลาไมกชวโมงเทานน
การแกปญหาทซบซอนหรอปญหาขนาดใหญ จะตองใชหนวยความจาสง ดงนน ซเปอรคอมพวเตอรจงมหนวยความจาทใหญมากเพอรองรบการทางานทมความเรวสง ซเปอร
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
4
คอมพวเตอรจะเปนระบบทสามารถทางานหลายๆ งานในเวลาเดยวกนไดอยางมประสทธภาพเนองจากใชการประมวลผลแบบขนาน ซงจะมจานวนหนวยประมวลผลกลางจานวนมากชวยในการประมวลผล ตวอยางของซเปอรคอมพวเตอรแสดงดงรปท 1.2
รปท 1.2 ซเปอรคอมพวเตอร (ทมา http://en.wikipedia.org/wiki/Supercomputer สบคน 1 มถนายน 2555)
เมนเฟรมคอมพวเตอร (Mainframe Computer)
เมนเฟรมคอมพวเตอรเปนเครองคอมพวเตอรทมขนาดใหญรองลงมาจากเครองซเปอรคอมพวเตอร โดยลดประสทธภาพบางสวนจากเครองซเปอรคอมพวเตอรเพอลดตนทนการผลต เมนเฟรมคอมพวเตอรมสมรรถภาพทตากวาซเปอรคอมพวเตอร แตยงมความเรวสงและมประสทธภาพทสงกวาเครองคอมพวเตอรประเภทอน เมนเฟรมคอมพวเตอรสามารถทางานไดพรอมกนหลายงาน (Multi Tasking) และใชงานไดพรอมกนหลายคน (Multi User) ดงนนจงสามารถใหบรการผ ใชจานวนหลายรอยคนพรอมกน และสามารถใชโปรแกรมจานวนนบรอยแบบในเวลาเดยวกนได โดยเฉพาะถาตอเครองเขาเครอขายคอมพวเตอร ผ ใชสามารถใชไดจากทวโลก ปจจบน องคกรใหญๆ เชน ธนาคาร จะใชคอมพวเตอรประเภทนในการบรการลกคา ตวอยางเมนเฟรมคอมพวเตอรแสดงดงรปท 1.3
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
5
รปท 1.3 เมนเฟรมคอมพวเตอร (ทมา http://www.itproportal.com สบคน 1 มถนายน 2555)
มนคอมพวเตอร (Minicomputer)
มนคอมพวเตอรหรอเครองคอมพวเตอรขนาดกลาง เปนเมนเฟรมคอมพวเตอรขนาดเลก ซงสามารถบรการผ ใชงานไดหลายคนพรอมๆ กน แตจะมราคาถกกวาเครองคอมพวเตอรใน 2 ประเภทแรก มนคอมพวเตอรจะไมมสมรรถภาพเพยงพอทจะบรการผ ใชในจานวนทเทยบเทาเมนเฟรมคอมพวเตอรเนองจากมการลดประสทธภาพบางอยางเพอใหไดราคาทองคกรขนาดกลางสามารถทจะจดซอได จงทาใหมนคอมพวเตอรเหมาะสาหรบองคกรขนาดกลางเทานนดงเชนการนาเอามนคอมพวเตอรมาใชบรการขอมลใหแกลกคาในการจองหองพกหรอใหบรการในการจดการงานดานตางๆ ของโรงพยาบาล ตวอยางมนคอมพวเตอรแสดงดงรปท 1.4
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
6
รปท 1.4 มนคอมพวเตอร (ทมา http://www.lopburi1.go.th/school/banchee/mini สบคน 10 มถนายน 2555)
ไมโครคอมพวเตอร (Microcomputer) หรอ พซ (Personal Computer : PC)
ไมโครคอมพวเตอร คอ คอมพวเตอรขนาดเลกแบบขนาดตงโตะทสรางขนมาจากไมโครโพรเซสเซอร (Microprocessor) บางครงเรยกวาเครองคอมพวเตอรสวนบคคล (Personal
Computer) ในเครองพซโดยทวไปจะประกอบไปดวยอปกรณทสาคญดงเชนจอภาพ
(Monitor) ตวเครอง (Case) แปนรบขอมล (Keyboard) และ เมาส (Mouse) ตวอยางไมโครคอมพวเตอรหรอพซแสดงดงรปท 1.5
รปท 1.5 คอมพวเตอรสวนบคคล (ทมา http:// guyakreview.blogspot.com สบคน 10 มถนายน 2555)
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
7
บางครงไมโครคอมพวเตอรทสรางขนมาจะมขนาดเลกกวาเครองคอมพวเตอรสวนบคคล อาทเชน
โนตบกคอมพวเตอร หรอคอมพวเตอรขนาดสมดบนทก (Notebook or Laptop)
คอมพวเตอรโนตบกคอ คอมพวเตอรทมขนาดเลกกวาเครองคอมพวเตอรสวนบคคล ถกออกแบบไวเพอนาตดตวไปใชตามทตางๆ มขนาดเลก และนาหนกเบา ในปจจบนมขนาดพอๆกบสมดบนทก และนยมใชงานกนอยางแพรหลายเนองจากมประสทธภาพในการทางานทสงขนและมราคาทถกลง ตวอยางโนตบกคอมพวเตอรแสดงดงรปท 1.6
รปท 1.6 โนตบกคอมพวเตอร (ทมา http://www.xbitlabs.com/articles/mobile/display/dell-vostro1400_3.html
สบคน) 10 มถนายน 2555
คอมพวเตอรแทบเลต (Tablet Computer)
คอคอมพวเตอรทมลกษณะคลายกบโนตบกคอมพวเตอร แตจะมขนาดเลกกวา พกพาไดสะดวก แตแตกตางกนทแทบเลตสามารถปอนขอมลทางจอภาพไดตามเทคโนโลยของผผลต เหมาะสาหรบใชในการเดนทางและการทางานทไมซบซอนมากนก ตวอยางของคอมพวเตอรแทบเลตแสดงดงรปท 1.7
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
8
รปท 1.7 คอมพวเตอรแทบเลต
(ทมา http://www.tabletpcmanufacturer.com สบคน 1 ธนวาคม 2553)
คอมพวเตอรแบบมอถอ (Handheld Computer)
คอคอมพวเตอรทมขนาดเลกทาใหสามารถทจะถอเพยงมอเดยวได พกพาสะดวก ซงคอมพวเตอรชนดนถกออกแบบมาเพอใชงานเฉพาะอยางเชนใชเปนตารางเวลา ปฏทนนดหมาย หรอสมดบนทกตางๆ คอมพวเตอรชนดนสามารถนามาเปนเครองสอสารไดเชนเดยวกบโทรศพทมอถอ ตวอยางคอมพวเตอรแบบมอถอแสดงดงรปท 1.8
รปท 1.8 คอมพวเตอรแบบมอถอ (ทมา http://www.redferret.net/?p=15450 สบคน 5 สงหาคม 2553)
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
9
คอมพวเตอรแบบบอรดเดยว (Single-Board Computers)
เปนคอมพวเตอรขนาดเลกมากทใชไมโครโปรเซสเซอรขนาดเลกทหาซอไดทวไป ไมมจอภาพแตม 7-เซกเมนต (7-Segment) และมแผงแปนอกขระหรอแปนพมพขนาดเลก เหมาะสาหรบใชงานเฉพาะอยางเชน งานควบคมอปกรณอเลกทรอนกส งานควบคมอปกรณไฟฟา งานควบคมหนยนต และงานควบคมในการประยกตใชงานดานตางๆ ตวอยางลกษณะของคอมพวเตอรแบบบอรดเดยวแสดงดงรปท 1.9
รปท 1.9 คอมพวเตอรแบบบอรดเดยว (ทมา http://www.tarad.com/_tarad/_modules สบคน 10 มถนายน 2555)
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
10
1.3 โครงสรางคอมพวเตอร (Structure of Computer)
คอมพวเตอรเปนระบบทมการทางานทซบซอน ประกอบดวยวงจรอเลกทรอนกสจานวนมาก ดงนนการทาความเขาใจกบระบบคอมพวเตอรในลกษณะทเปนโครงสรางจะสามารถเขาใจไดมากทสดตงแตโครงสรางระดบใหญจนถงโครงสรางระดบเลก โครงสรางหมายถง วธการทอปกรณตางๆ ของคอมพวเตอรเชอมตอเขาดวยกน โดยองคประกอบของคอมพวเตอรมองคประกอบทสาคญ แสดงดงรปท 1.10
รปท 1.10 โครงสรางภายในของคอมพวเตอร (ทมา William Stallings, 2003, 10)
หนวยประมวลผลกลาง (Central Processing Unit: CPU)
ซพยหรอหนวยประมวลผลกลางจดไดวาเปนสวนทสาคญทสดของคอมพวเตอร เปรยบเสมอนเปนสมองของเครองคอมพวเตอร โดยทาหนาทในการคานวณคาตางๆ ตามคาสงทไดรบมอบหมาย และควบคมการทางานของสวนประกอบอนๆ ทงหมด ในระบบไมโครคอมพวเตอร หนวยประมวลผลกลางจะถกสรางใหอยในรปวงจรรวม (Integrated
Circuit: IC) เพยงตวเดยวทาใหงายในการนาไปใชงาน หนวยประมวลกลางเปนหนวยทมความซบซอนมากทสด ซงประกอบดวยสวนประกอบหลกตางๆ แสดงดงรปท 1.11 และภาพตวอยางของหนวยประมวลผลกลางแสดงดงรปท 1.12
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
11
รปท 1.11 โครงสรางภายในของหนวยประมวลผลกลาง (ทมา William Stallings, 2003, 11)
รปท 1.12 ตวอยางซพยหรอหนวยประมวลผลกลาง (ทมา http:// srayaisom.dyndns.org สบคน 10 มนาคม 2555)
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
12
หนวยคานวณทางคณตศาสตรและตรรกะ (Arithmetic and Logic Unit)
เปนหนวยททาหนาทประมวลผลโดยใชวธทางคณตศาสตร เชน บวก ลบ คณ หาร หรอ ทาหนาทประมวลผลทางตรรกะ เชน แอนด (AND) ออร(OR) และนอต (NOT) เปนตน
รวมทงยงทาหนาทในการเปรยบเทยบคาตางๆ หนวยเกบขอมลชวคราวทอยภายในหนวยประมวลผลกลางหรอเรจสเตอร (Register)
เปนหนวยความจาขนาดเลก ทาหนาทเปนทพกขอมล ชวคราวกอนทจะถกนาไปประมวลผล โดยปกตแลวในหนวยประมวลผลกลางจะม เรจสเตอร สาหรบเกบขอมลไมเกน
64 ตว การอางองขอมลของเรจสเตอร จะมความเรวเทากบความเรวของหนวยประมวลผลกลาง เพราะเปนหนวยความจาสวนทอยภายในตวหนวยประมวลผลกลางจงไมตองไปอางองถงภายนอกหนวยประมวลผล
หนวยควบคม (Control Unit)
เปนเสมอนหนวยบญชาการของระบบคอมพวเตอรทงหมด ทาหนาทกาหนดจงหวะการทางานตางๆ ของคอมพวเตอรไมเวนแมแตสวนประกอบอนๆ ของหนวยประมวลผลกลาง นอกจากนยงทาหนาทควบคมการรบสงขอมลระหวางหนวยตางๆ ในคอมพวเตอรใหสามารถทางานรวมกนไดอยางเปนระบบ
หนวยความจาหลก (Main Memory Unit)
เปนหนวยททาหนาทเกบขอมลของระบบคอมพวเตอร ไมวาจะเปนตวเลขหรอขอความแมกระทงคาสงตางๆ ในโปรแกรมทจะใชสงงานระบบคอมพวเตอร โดยทวไปแลวหนวยความจาจะถกสรางมาบนไอซเพอใหมความจสงแตมขนาดเลก ขอมลทเกบในหนวยความจาจะมสถานะเพยงแคเปดวงจร (0) หรอปดวงจร (1) เทานน หนวยความจาสามารถแบงออกไดเปน 2 ประเภทใหญ ๆ คอ
รอม หรอหนวยความจาอานอยางเดยว (ROM: Read Only Memory) เปนหนวยความจาแบบสารกงตวนาชวคราวชนดอานไดอยางเดยว ใชเปนสอบนทกในคอมพวเตอร เพราะไมสามารถบนทกซาได เปนหนวยความจาทมซอฟตแวรหรอขอมลอยแลว และพรอมทจะนามาตอกบไมโครโพรเซสเซอรไดโดยตรง หนวยความจาประเภทนแมไมมไฟเลยงตออย ขอมลกจะไมหายไปจากหนวยความจา โดยทวไปจะใชเกบขอมลทไมตองมการแกไขอกแลวเชนไบออส (Basic Input Output System: BIOS) ของเครองคอมพวเตอร ตวอยางของรอมแสดงดงรปท 1.13
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
13
รปท 1.13 รอม
(ทมา http://www.projectsjugaad.com/2010/08/roms-read-only-memory-rom
สบคน 15 มถนายน 2555)
แรม หรอหนวยความจาเขาถงโดยสม (RAM: Random Access Memory)
หนวยความจาทเขาถงขอมลโดยการสม เปนหนวยความจาหลก ทใชในระบบคอมพวเตอรยคปจจบน หนวยความจาชนดน อนญาตใหเขยนและอานขอมลไดในตาแหนงตางๆ อยางอสระ และรวดเรว ซงตางจากสอเกบขอมลชนดอนๆ อยางเทป หรอดสก ทมขอจากดในการอานและเขยนขอมล ทตองทาตามลาดบกอนหลง หรอมขอจากดแบบรอม ทอนญาตใหอานเพยงอยางเดยว ขอมลในแรม จะหายไปทนท เมอระบบคอมพวเตอรถกปดลง เนองจากหนวยความจาชนดน จะเกบขอมลไดเฉพาะเวลาทมกระแสไฟฟาหลอเลยงเทานน ตวอยางของแรมแสดงดงรปท 1.14
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
14
รปท 1.14 แรม
(ทมา http://www.learners.in.th/media/files/265500 สบคน 15 มถนายน 2555)
หนวยอนพต เอาตพตหรอหนวยรบเขาและสงออก (Input / Output Unit)
เปนหนวยททาหนาทรบการตดตอจากภายนอกเขาสระบบ และแสดงผลทไดจากการทางานของระบบออกสอปกรณภายนอก เชน คยบอรด, จอภาพ, ลาโพง, หนวยขบจานบนทก เปนตน หนวยรบเขาและสงออกเปนหนวยททาหนาทในการตดตอสอสารระหวางระบบภายในของคอมพวเตอรและอปกรณภายนอกตางๆ ใหสามารถตดตอสอสารขอมลและสามารถทางานรวมกนไดอยางมประสทธภาพ
หนวยการเชอมตอภายในเครองคอมพวเตอร (System Interconnection Unit)
เปนหนวยทใหสวนประกอบตางๆ ของคอมพวเตอรสามารถสอสารระหวางกนได เปนสอกลางในการเชอมโยงของโครงสรางตางๆ ภายในระบบคอมพวเตอรใหสามารถตดตอสอสารกนได
1.4 องคประกอบของระบบคอมพวเตอร (Element of Computer)
ระบบคอมพวเตอรจะสามารถทางานไดอยางมประสทธภาพจะตองประกอบดวย 5
องคประกอบคอ ฮารดแวร ซอฟตแวรระบบ ซอฟตแวรประยกต บคลากร และขนตอนการดาเนนงาน
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
15
1.4.1 ฮารดแวร (Hardware)
ฮารดแวรหรอสวนเครองคอชนสวนของคอมพวเตอรและอปกรณตางๆ ของคอมพวเตอร หรออปกรณตางๆ ทประกอบขนเปนเครองคอมพวเตอร มลกษณะเปนโครงรางทสามารถมอง เหนดวยตาและสมผสไดเชนจอภาพ (Monitor) ลาโพง (Speaker) คยบอรด
(Keyboard) เครองพมพ (Printer) และเมาส (Mouse) เปนตน ดงตวอยางฮารดแวรทแสดงในรปท 1.15
รปท 1.15 ตวอยางฮารดแวรของเครองคอมพวเตอร (ทมา http://angsila.cs.buu.ac.th สบคน 8 มกราคม 2553)
1.4.2 ซอฟตแวร (Software)
หมายถงชดคาสง หรอโปรแกรมทเขยนขนมาเพอประมวลผลขอมล และควบคมการทางานของสวนประกอบตางๆ ของฮารดแวร เปรยบเสมอนเปนตวสงการใหคอมพวเตอรทางานตามทเราตองการ ในปจจบนซอฟตแวรมหลากหลายประเภท โดยแตละประเภทกมลกษณะการใชงานทแตกตางกนไป ซงแลวแตความเหมาะสมของงาน ซอฟตแวรสามารถแบงไดหลายกลม ดงเชนซอฟตแวรระบบ ซอฟตแวรประยกต และซอฟตแวรสาเรจรป ซงซอฟตแวรทงหมดจะเปนสอกลางในการตดตอระหวางผ ใชกบคอมพวเตอรใหสามารถทางานรวมกน
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
16
อยางสะดวกและมประสทธภาพ ตวอยางซอฟตแวรระบบปฏบตการวนโดว XP แสดงดงรปท
1.16
รปท 1.16 ซอฟตแวรระบบปฏบตการวนโดว XP
1.4.3 ขอมล (Data)
ขอมลเปนองคประกอบทสาคญอยางหนงในระบบคอมพวเตอร เปนสงทตองปอนเขาไปในคอมพวเตอรพรอมกบโปรแกรมทนกเขยนโปรแกรมเขยนขน เพอนาไปใชในโปรแกรมและผลตผลลพธทตองการออกมา ดงนนขอมลทนาเขาไปจะตองมความถกตอง จงจะไดเอาตพตทถกตองออกมา ซงขอมลกมหลายประเภทเชน ขอมลตวเลข ขอมลตวอกขระ ขอมลบคลากร หนวยงานหรอองคกร กลมขอมลทจาเปนสาหรบการคานวณ และอนๆ อกมาก
สารสนเทศ (Information) คอขอมลทผานการประมวลผลดวยวธการใดๆ เชน การเปรยบเทยบ การคานวณ และการสรป เปนตน เพอใหสามารถนาไปใชใหเกดประโยชนตางๆ ตรงกบความตองการของผ ใช ดงเชนขอมลคอสวนสงของนกศกษาแตละคนเมอผานกระบวนการประมวลผลโดยการหาคาเฉลยทาใหไดสารสนเทศของคาเฉลยนกศกษาทงหอง
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
17
1.4.4 บคลากร (Personnel)
เปนองคประกอบทสาคญทสดของระบบคอมพวเตอร ซงไดแก ผสราง และผ ใชระบบคอมพวเตอร บคลากรจะเปนผจดและควบคมระบบคอมพวเตอรใหสามารถปฏบตงานไดอยางมประสทธภาพ คอยแกไขปญหาตางๆ ทเกดขนกบระบบคอมพวเตอร รวมไปถงการใชงานโปรแกรมประยกตทถกพฒนาขน เราสามารถแบงบคลากรได 6 กลมดงน
หวหนาหนวยงานคอมพวเตอร (Electronic Data Processing Manager: EDP
Manager) เปนบคลากรทอยในตาแหนงทางบรหาร จะมหนาทวางแผนงาน กาหนดนโยบายของหนวยงาน จดทาโครงการและแผนงานการใชระบบคอมพวเตอร จดหาฮารดแวรและซอฟตแวรทจาเปนตองใชในองคกร อานวยความสะดวก เปนบคคลทมความรบผดชอบสง
นกวเคราะหระบบ (System Analysis) เปนผ ทมหนาทวเคราะหระบบและออกแบบระบบ โดยจะรวบรวมขอมลตางๆ ทเกยวของกบงานเดม และความตองการของผ ใช เพอทาการวเคราะหและออกแบบงานใหม หรอปรบปรงงานเดมใหมประสทธภาพ ผ ททางานดานน ควรมประสบการณเปนอยางด และมพนฐานในการเขยนโปรแกรมมากอน ถงแมวานกวเคราะหระบบ จะไมไดเขยนโปรแกรมเอง แตจะตองเปนผ คนหาวธการและขนตอนตางๆ ในการเขยนโปรแกรมเพอสงใหนกเขยนโปรแกรม
นกเขยนโปรแกรมระบบ (System Programmer) จะมหนาทเขยนโปรแกรมระบบควบคมเครอง จะคอยตรวจสอบและแกไขเมอระบบคอมพวเตอรมปญหาบคลากรประเภทน จะตองมความรทางฮารดแวรเปนอยางด เพราะตองมหนาทใหคาปรกษาตางๆ เกยวกบระบบคอมพวเตอรเมอมปญหา และตองคอยพฒนาโปรแกรมอานวยความสะดวกตางๆ ขน
บคลากรดานการเขยนโปรแกรม (Programmer) ไดแกนกเขยนโปรแกรมททาหนาทเขยนโปรแกรมประยกต (Application Program) ทางคอมพวเตอร ตามขนตอนทนกวเคราะหระบบไดออกแบบไวเพอใหผใชงานคอมพวเตอรสามารถใชงานโปรแกรมประยกตนนได
ผปฏบตการ (Operator) เปนเจาหนาทคอมพวเตอร ทมหนาทคอยปดและเปดเครองคอมพวเตอร และคอยเฝาดระบบ เมอมปญหาใดๆ เกยวกบระบบคอมพวเตอร กจะเปนผแจงใหกบนกเขยนโปรแกรมระบบทราบเพอทาการแกไข และยงมหนาทสงงานตางๆ เขาไปประมวลผลในคอมพวเตอร คอยรบงานการประมวลผลเพอแจกจาย สารองขอมล
ผ ใช (User) เปนผ ใชระบบคอมพวเตอร ซงจะมความสาคญตอการออกแบบและพฒนาระบบอยางมาก เพราะผ ใชเปนผตดสนใจ และระบความตองการลงไปวาตองการใหระบบคอมพวเตอรทาอะไรบาง ซงบรรดานกคอมพวเตอรตางๆ กจะตองพยามตอบสนองความตองการของผใชนนๆ
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
18
1.4.5 ขนตอนการดาเนนงาน (Procedures)
เปนขนตอน หรอวธการในการใชระบบคอมพวเตอร เพอใหสามารถใชระบบคอมพวเตอรประมวลผลไดอยางถกตอง และมประสทธภาพ ขนตอนการดาเนนงานมหลากหลายวธทจะทาใหคอมพวเตอรประมวลผลไดอยางมประสทธภาพ ซงในแตละวธกจะเหมาะสมกบขนตอนบางขนตอน ดงนนการเลอกขนตอนการดาเนนงานเปนกระบวนการทสาคญกระบวนการหนงทจะทาใหใชงานระบบคอมพวเตอรไดอยางมประสทธภาพ
1.5 ซอฟตแวร (Software)
ซอฟตแวรหมายถงชดคาสงหรอโปรแกรมทใชสงงานใหคอมพวเตอรทางาน ซอฟตแวรจงหมายถงลาดบขนตอนการทางานทเขยนขนดวยคาสงของคอมพวเตอร คาสงเหลานเรยงกนเปนโปรแกรมคอมพวเตอร ดงนนโปรแกรมคอมพวเตอรทใชสงงานคอมพวเตอรจงเปนซอฟตแวร เพราะเปนลาดบขนตอนการทางานของคอมพวเตอร คอมพวเตอรเครองหนงทางานแตกตางกนไดมากมายดวยซอฟตแวรทแตกตางกน ซอฟตแวรจงหมายถงโปรแกรมคอมพวเตอรทกประเภทททาใหคอมพวเตอรทางานได การทเราเหนคอมพวเตอรทางานใหกบเราไดมากมาย เพราะวามผพฒนาโปรแกรมคอมพวเตอรมาใหเราทางานรวมกบคอมพวเตอรไดอยางมประสทธภาพ ดงเชนบรษทขายตวใชคอมพวเตอรชวยในระบบการจองตว คอมพวเตอรชวยในเรองกจการงานธนาคารทมขอมลตางๆ มากมาย คอมพวเตอรชวยงานพมพเอกสารใหรวดเรว เปนตน การทคอมพวเตอรดาเนนการไดดและมประสทธภาพสวนหนงมาจากประสทธภาพของซอฟตแวร ซอฟตแวรจงเปนสวนสาคญของระบบคอมพวเตอร หากขาดซอฟตแวรคอมพวเตอรกไมสามารถทางานได ซอฟตแวรจงเปนสงทจาเปน และมความสาคญมาก และเปนสวนประกอบหนงททาใหระบบคอมพวเตอรตางๆ เปนไปไดตามทตองการ โดยทวไปเราสามารถแบงซอฟตแวรออกเปน 3 กลมใหญไดแก ซอฟตแวรระบบ
ซอฟตแวรประยกต และซอฟตแวรสาเรจรป แสดงดงรปท 1.17 ซงจะกลาวถงในหวขอถดไป
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
19
รปท 1.17 กลมของซอฟตแวรประเภทตางๆ
1.5.1 ซอฟตแวรระบบ (System Software)
ซอฟตแวรระบบคอซอฟตแวรททาหนาทเปนสอกลางในการตดตอสอสารกบมนษยเพอใหสามารถใชงานไดอยางมประสทธภาพ เปนตวควบคมฮารดแวรของระบบเครองคอมพวเตอรซงจะทางานใกลชดกบฮารดแวร การทางานของคอมพวเตอรประกอบดวย หนวยอนพต เอาตพต หนวยความจา และหนวยประมวลผลกลาง ดงนนในการทางานของคอมพวเตอรจาเปนตองมการดาเนนงานกบอปกรณพนฐาน จงตองมซอฟตแวรระบบเพอใชในการจดการระบบ หนาทหลกของซอฟตแวรระบบประกอบดวย
1. ใชในการจดการหนวยอนพต เอาตพต เชนการตดตอกบคยบอรด เมาส ลาโพง พรนเตอร และอปกรณตอพวงอนๆ
2. ใชในการจดการหนวยความจา เพอนาขอมลจากแหลงเกบขอมลภายนอกตางๆ มาเกบไวยงหนวยความจาหลก หรอในทานองกลบกน คอนาขอมลจากหนวยความจาหลกไปเกบไวยงแหลงเกบขอมลภายนอกตางๆ
3. ใชเปนตวเชอมตอระหวางผ ใชงานกบเครองคอมพวเตอร ทาใหสามารถใชงานไดงายขนและมประสทธภาพ เชนการดขอมลตางๆ ทอยภายในคอมพวเตอรกจะสามารถทาไดโดยงาย
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
20
ซอฟตแวรระบบสามารถจาแนกออกได 3 กลมคอ ซอฟตแวรระบบปฏบตการ ซอฟตแวรตวแปลภาษา และซอฟตแวรอรรถประโยชน
ซอฟตแวรระบบปฏบตการ (Operating System)
ซอฟตแวรระบบปฏบตการ หรอโอเอส (OS) เปนซอฟตแวรททาหนาทในการบรหาร และจดทรพยากรตางๆ ในระบบคอมพวเตอร ดงเชนจดการกบฮารดแวร ใหกบผ ใชเพอใหสามารถใชงานไดสะดวกและมประสทธภาพ เปนซอฟตแวรใชในการดแลระบบคอมพวเตอร โดยเครองคอมพวเตอรทกเครองจะตองมซอฟตแวรระบบปฏบตการนจงจะสามารถใชงานคอมพวเตอรได หากปราศจากซอฟตแวรระบบปฏบตการแลว กจะไมสามารถใชงานคอมพวเตอรไดเลยเนองจากไมมสอกลางในการตดตอสอสารกบอปกรณตางๆ ของคอมพวเตอร ซอฟตแวรระบบปฏบตการมอยหลายชนด ดงเชน
ระบบปฏบตการดอส (Dos) เปนซอฟตแวรจดระบบงานทพฒนาเมอแรกเรมของการใชงานคอมพวเตอร ในการใชงานจะเปนการสงงานโดยใชคาสงเปนตวอกษร ในปจจบนระบบปฏบตการดอสไมไดรบความนยมเนองจากมการใชงานยาก ตองจาคาสงตางๆ ถงจะสามารถใชงานได แตอยางไรกตามระบบปฏบตการใหมๆ กยงคงมระบบปฏบตการดอสควบค เพอความเหมาะสมสาหรบงานบางอยาง
ระบบปฏบตการวนโดว เปนระบบปฏบตการทพฒนาตอจากดอส เพอเนนการใชงานทงายขน สามารถทางานหลายงานพรอมกนได โดยจะเปลยนแปลงการสงคอมพวเตอรจากการพมพคาสงเปนรปแบบของการใชรปแบบกราฟก ผ ใชงานสามารถใชเมาสเลอนตวช ตาแหนงเพอเลอกตาแหนงทปรากฏบนจอภาพ ทาใหใชงานคอมพวเตอรไดงาย วนโดวจงไดรบความนยมมากในปจจบน ระบบปฏบตการวนโดวไดเรมตงแตป 1985 ซงไดผลตวนโดว 1.0 ขนมาใชงาน ตอมาไดวนโดวรนใหมๆ ขนมาดงเชน วนโดว 2.0 วนโดว 2.1 วนโดว 3.0
วนโดว 3.1 วนโดว NT 3.5 วนโดว NT 3.51 วนโดว 95 วนโดว NT 4.0 วนโดว 98 วนโดว 2000
วนโดว Me วนโดว XP และ วนโดวเซรฟเวอร 2003 วนโดว Vista และวนโดวเซรฟเวอร 2008
และวนโดว 7 ซงเปนวนโดวทนยมใชกนในปจจบน ซงมทง 32 บต และ 64 บต เพอรองรบการทางานของคอมพวเตอรททางานเปนแบบ 64 บต
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
21
ระบบปฏบตการโอเอสท (OS/2) เปนระบบปฏบตการทมลกษณะการตดตอสอสารโดยการใชรปแบบกราฟกแบบเดยวกบวนโดว แตบรษทผพฒนาคอบรษทไอบเอม ปจจบนไมไดรบความนยมมากนกและไดเลกการพฒนาไปตงแตป พ.ศ.2549
ระบบปฏบตการยนก ซ (UNIX) เ ปนระบบปฏบตการ ทพฒนามาเ พอใ ชกบมนคอมพวเตอรเปนสวนใหญ เหมาะสาหรบใชเปนระบบปฏบตการสาหรบเครองผ ใหบรการตางๆ ระบบปฏบตการยนกซเปนระบบปฏบตการทสามารถใชงานไดหลายงานพรอมกน และทางานไดหลาย ๆ งานในเวลาเดยวกน (Multitasking) ยนกซจงเหมาะสมกบเครองทเชอมโยงและตอกบเครองปลายทางไดหลายเครองพรอมกน
ระบบปฏบตการลนกซ (Linux) คอระบบปฏบตการแบบยนกซชนดหนง โดยใชลนกซ เคอรเนล เปนศนยกลางทางานรวมกบไลบรารและเครองมออน ลนกซเปนซอฟตแวรเสร และซอฟตแวรโอเพนซอรส ทนกพฒนาโปรแกรมทกๆ คนสามารถดหรอนาโคดของลนกซไปแกไข ดดแปลง ปรบปรง ใชงาน และแจกจายไดอยางไมผดขอกฎหมาย ลนกซจาหนายหรอแจกฟรในลกษณะเปนโปรแกรมสาเรจ (Package) โดยผจดทาจะรวมซอฟตแวรสาหรบใชงานในดานอนเปนชดเขาดวยกน ระบบปฏบตการลนกซเหมาะสาหรบรานคาทไมตองการเสยคาลขสทธซอฟตแวร ทาใหสามารถลดตนทนในการดาเนนการไดเปนอยางสง
ซอฟตแวรตวแปรภาษา (Compiler)
ซอฟตแวรตวแปลภาษาเปนซอฟตแวรในการสงงานใหคอมพวเตอรทางานตามคาสงทเราปอนเขาไป ในการพฒนาซอฟตแวรจาเปนตองมซอฟตแวรทใชในการแปลภาษาระดบสง เพอแปลภาษาระดบสงใหเปนภาษาเครอง (Compiler) เพอใหคอมพวเตอรสามารถเขาใจและทาตามคาสงได ภาษาคอมพวเตอร (Computer Language) คอภาษาทใชสงงานคอมพวเตอรโดยคอมพวเตอรสามารถเขาใจและนาไปประมวลผลได ภาษาคอมพวเตอรมทงภาษาระดบตาและภาษาระดงสง การเขยนภาษาระดบตาจะเขยนไดตองเขาใจโครงสรางทางฮารดแวรทาใหยากตอการเขยนและการพฒนา ภาษาระดบสงเปนภาษาทมสญลกษณของภาษาทมนษยสามารถเขาใจไดงาย ดงนนในปจจบนในการพฒนาโปรแกรมตางๆ จะใชภาษาระดบสงเปนเครองมอในการพฒนา ภาษาระดบสงมหลายภาษาดงเชนภาษาปาสคาล (Pascal) ภาษาเบสก (Basic) ภาษาซ (C) ภาษาจาวา (JAVA) และอนๆ อกมากมาย ซงแตละภาษาจะมจดเดนจดดอยในการใชงานทแตกตางกน
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
22
ซอฟตแวรอรรถประโยชน (System Utilities)
เปนโปรแกรมทชวยอานวยความสะดวกในการจดการกบเครองคอมพวเตอรในดานตางๆ ทาใหประสทธภาพในการทางานทดขน ซอฟตแวรอรรถประโยชนในปจจบนมเปนจานวนมากเพอเสรมใหเครองคอมพวเตอรทางานไดอยางมประสทธภาพ เชน โปรแกรมตรวจจบไวรส โปรแกรมจดการกบขอมล โปรแกรมเกยวกบการลบขอมล การเขยนขอมล โปรแกรมเกยวกบการจดการกบระบบดสก ฮารดดสก โปรแกรมรกษาหนาจอภาพ โปรแกรมจดเรยงขอมล โปรแกรมตดตอสอสาร โปรแกรมบบอดขอมล เปนตน
1.5.2 ซอฟตแวรประยกต (Application Software)
ซอฟตแวรประยกตคอ ซอฟตแวรทถกสรางขนมาเพอใหผพฒนาสามารถนาไปใชไดอยางสะดวกและรวดเรว ทาใหประสทธภาพในการทางานทดขน ซงอาจจะเปนซอฟตแวรสาเรจหรอเปนซอฟตแวรทถกสรางขนมาใชงานในดานตางๆ ตามความตองการของผ ใชเชนซอฟตแวรในการจดพมพเอกสาร ซอฟตแวรสาหรบการคานวณดอกเบย ซอฟตแวรในการออกแบบบานซอฟตแวรในการออกแบบเสอผา ซอฟตแวรในการออกแบบหนงสอ ซอฟตแวรในการตดตอสอสารตางๆ ซอฟตแวรในการในการจายเงนเดอน ซอฟตแวรในการจดการระบบสนคาคลง และซอฟตแวรในการยมคนหนงสอหองสมด เปนตน โดยจะใชภาษาระดบสงในการพฒนาเชน ภาษาซ ภาษาปาสคาล ภาษาจาวา หรอภาษาระดบสงอนๆ การใชงานคอมพวเตอรตองมซอฟตแวรประยกต ซงอาจเปนซอฟตแวรสาเรจทมผพฒนาเพอใชงานทวไปทาใหทางานไดสะดวกขน หรออาจเปนซอฟตแวรใชงานเฉพาะ ซงผ ใชเปนผพฒนาขนเองเพอใหเหมาะสมกบสภาพการทางานของตน เราสามารถแบงลกษณะการใชงานของซอฟตแวรประยกตไดดงน
ดานการใชงานทางธรกจ เปนซอฟตแวรในการใชงานทางดานธรกจดงเชนซอฟตแวรพมพงานจาพวกการ
ประมวลคา (Word Processing) ซอฟตแวรแผนตารางทาการ (Spread Sheet) ซอฟตแวรฐานขอมล (Data Base) ซอฟตแวรการแสดงผลทางกราฟก (Presentation Graphics) และโปรแกรมบญชตางๆ (Accounting) เปนตน
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
23
ดานการออกแบบและดานสอประสม
เปนซอฟตแวรทใชในการออกแบบและสอประสมดงเชนซอฟตแวรการออกแบบใชคอมพวเตอรชวยหรอแคด (Computer-Aided Design: CAD) ซอฟตแวรในการวาดภาพและแกไขภาพวาด (Paint/Image Editing) ซอฟตแวรในการแกไขภาพวดทศนและเสยง (Video
and Audio Editing) ซอฟตแวรคอมพวเตอรชวยสอนหรอซเอไอ (Computer-Assisted
Instruction: CAI) และซอฟตแวรในการออกแบบเวบเพจ (Web Page Authoring) เปนตน
ตวอยางซอฟตแวรในการใชงานทางดานการออกแบบ
ดานการใชงานสวนตว เปนซอฟตแวรทใชในการใชงานสวนตวดงเชนซอฟตแวรในดานความบนเทง (Entertainment) ซอฟตแวรในการจดการรปภาพ (Clip Art/Image Gallery) ซอฟตแวรประมวลคา (Word Processing) ซอฟตแวรแผนตารางทาการ (Spread Sheet) เปนตน
ตวอยางซอฟตแวรดานการใชงานสวนตว
ดานการตดตอสอสาร เปนซอฟตแวรทใชในการตดตอสอสารเพอชวยในการตดตอสอสารดานตางๆ อาจจะเปนการตดตอสอสารดวยเสยง ตดตอสอสารผานการพมพตางๆ ซอฟตแวรทใชในการตดตอสอสารดงเชน ซอฟตแวรสงจดหมายอเลกทรอนกส (E-Mail) ซอฟตแวรหองคย (Chat
Room) ซอฟตแวรเอฟทพ (File Transfer Protocol: FTP) ซอฟตแวรโปรแกรมคนดเวบหรอเวบเบราวเซอร (Web Browser) และซอฟตแวรการประชมทางวดทศน (Videoconference) เปนตน ตวอยางซอฟตแวรดานการตดตอสอสาร
1.5.3 ซอฟตแวรสาเรจรป (Package Software)
ซอฟตแวรสาเรจรปหมายถงซอฟตแวรประยกตชนดหนงทมผจดทาไวเพอใชในการทางานประเภทตางๆ หรอในดานตางๆ ตามความสามารถของโปรแกรม โดยผ ใชสามารถนาซอฟตแวรประเภทนไปใชกบการทางานเฉพาะอยาง แตจะไมสามารถดดแปลงหรอแกไขโปรแกรมได ผใชไมจาเปนตองเขยนโปรแกรมขนมาเอง จงเปนการประหยดเวลา แรงงาน และคาใชจายในการเขยนโปรแกรม ตวอยางของโปรแกรมเชนโปรแกรมจดการระบบฐานขอมล โดยสามารถจดเกบเปนหมวดหมได โปรแกรมจดพมพรายงาน โปรแกรมระบบบญช โปรแกรมเกม เปนตน
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
24
1.6 ภาษาคอมพวเตอร (Computer Language)
ภาษาคอมพวเตอรเปนภาษาทคอมพวเตอรสามารถเขาใจและประมวลผลได
ภาษาคอมพวเตอรจะเปนภาษาเครองซงจะเปนรหสดจทล เนองจากคอมพวเตอรทางานในสภาวะโลจก “0” และ “1” ภาษาคอมพวเตอรเปนภาษาทมนษยเขาใจไดยาก ซงจะไมนยมเขยนโปรแกรมเปนภาษาเครอง ในปจจบนในการเขยนโปรแกรมจะเปนเขยนโปรแกรมดวยภาษาระดบสงเนองจากเปนภาษาทเขาใจงายและใกลเคยงกบภาษามนษย ภาษามนษยมหลากหลายภาษาในโลก ภาษาคอมพวเตอรกมหลายภาษาเหมอนกน การประยกตใชงานกประยกตใชงานภาษาในแตละงานโดยจะใหเหมาะกบงานทไดวางแผนไว
ภาษาโปรแกรมสามารถแบงออกเปนสองรปแบบ ภาษาระดบตา(Low Level
Language) และภาษาระดบสง (High Level Language) ภาษาทมความใกลเคยงกบมนษยมากเทาไหรเราจดไดวาเปนภาษาระดบสงมากเทานน ภาษาระดบตาทาความเขาใจและใชงานไดยากกวาภาษาระดบสง แตสามารถทาใหโปรแกรมทพฒนานนมความเรวสงและขนาดเลกกวาพฒนาดวยภาษาระดบสง แตอยางไรกตามในปจจบนจะนยมการเขยนโปรแกรมดวยภาษาระดบสงเนองจากสามารถเขยนไดโดยงายและเหมาะกบการประยกตใชงานในดานตางๆ ไดอยางรวดเรว เราสามารถแบงภาษาออกไดเปนกลมดงน
ภาษาระดบตาทสดคอ ภาษาเครอง (Machine language) ซงรหสคาสงจะเปนเลขฐานสองคอ “1” และ “0” ภาษาเครองจะเปนภาษาทคอมพวเตอรเขาใจเนองจากคอมพวเตอรทางานเปนระบบดจทล ทอย ในรปแบบของเลขฐานสอง รปแบบของภาษาระดบตาแสดงดงรปท 1.18
1100111101010101
0011111101110111
0110110101010101
0000100001010101
1110000001010100
รปท 1.18 ภาษาเครอง
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
25
ภาษาทสงกวาภาษาเครองเลกนอยคอโปรแกรมภาษาแอสแซมบล (Assembly
Language Program) ภาษานจะใชขอความหรอสญลกษณตางๆ เปนคาสงในการสงงานใหคอมพวเตอรทางานตามทเราตองการ ดงเชนคาสง Mov Ax,Bx ซงหมายความวาเปนการยายขอมลทอยในเรจสเตอร Bx ไปเกบไวยงเรจสเตอร Ax การเขยนโปรแกรมภาษาแอสแซมบลจะเปนการเขยนทตองเขาใจโครงสรางของระบบคอมพวเตอร จงจะสามารถเขยนโปรแกรมภาษาแอสแซมบลได เนองจากตองจดการขอมลตางๆ ทเกบในหนวยความจาและรจสเตอรของไมโครโปรเซสเซอรโดยตรง ตวอยางภาษาแอสแซมบลแสดงดงรปท 1.19
Mov A, R0 เอาคาทอยในเรจสเตอร R0 มาเกบไวยงเรจสเตอร A
Mov R1, 20H เอาคาทอยในหนวยความจาตาแหนง 20H มาเกบไวยงเรจสเตอร R1
Add A,R1 เอาคาทอยในเรจสเตอร R1 มาบวกกบคาทอยในเรจสเตอร A
Mov 21H, A เอาคาทอยในเรจสเตอร A มาเกบไวยงตาแหนงหนวยความจาท 21H
Mov 22H,R1 เอาคาทอยในเรจสเตอร R1 มาเกบไวยงตาแหนงหนวยความจาท 22H
รปท 1.19 ภาษาแอสแซมบล
ภาษาระดบสงคอภาษาทถกสรางขนมาเพอชวยใหสามารถใชงานไดงายขน เชนภาษาซ ภาษาจาวา ภาษาปาสคาล ภาษาซ ภาษาจาวา ภาษาปาสคาล ภาษาเบสก และภาษาระดบสงอนๆ ชวยใหโปรแกรมเมอรเขยนโปรแกรมดวยภาษาทมความใกลเคยงกบภาษามนษย และโปรแกรมเมอรไมจาเปนตองจดการคาตางๆ ทอยในรจสเตอรหรอหนวยความจาเองเหมอนกบภาษาแอสแซมบล ตวอยางภาษาระดบสงดงเชนภาษาซ แสดงดงรปท 1.20
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
26
#include<stdio.h>
#include<conio.h>
Void main(void)
{
int a,b,c;
printf(“Input a = ”);
scanf(“%i”,&a);
printf(“Input b = ”);
scanf(“%i”,&b);
c = a*b;
printf(“ a * b = %i”,c);
}
รปท 1.20 ตวอยางรปแบบภาษาซ
ภาษาระดบสงสรางขนมาเพอทาใหการเขยนโปรแกรมสงงานคอมพวเตอรงายขน โดยชดคาสงของภาษาระดบสงอานแลวเขาใจงาย (ซงจะสามารถเขาใจไดงายกวาภาษาระดบตา) การเขยนภาษาระดบสงเรายงไมอาจใชงานไดทนท เนองจากภาษาระดบสงเปนภาษาทหนวยประมวลผลไมเขาใจจะตองแปลงใหเปนภาษาเครองเสยกอน ดงนนจงตองมการแปลคาสงของภาษาระดบสงไปเปนภาษาแอสแซมบล ตวททาการแปลงโปรแกรมเปนภาษาเครองจะเรยกวา คอมไพเลอรหรอตวแปลโปรแกรม (Compiler) และแอสแซมเบลอร (Assembler)
หลกการทางานแสดงดงรปท 1.21 หนวยประมวลผลกลางแตละยหอจะมภาษาระดบตาทแตกตางกน ดงนนถาเขยนภาษาระดบตาของหนวยประมวลผลกลางยหออนเทล (Intel) กจะใชรปแบบของภาษาระดบตาของเครองอนเทล ถาใชหนวยประมวลผลกลางยหอเอเอมด
(AMD) กจะใชรปแบบของภาษาระดบตาของเครองเอเอมด ซงจะทาใหยงยากในการเขยนโปรแกรม ถาใชโปรแกรมภาษาระดบสงในการเขยนจะสามารถเขยนโปรแกรมเหมอนกนไดทกยหอ สวนเวลาในการแปลเปนภาษาระดบตา ตวแปลโปรแกรมกจะทาหนาทจดการแปลตามยหอแตละเครองโดยอตโนมต
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
27
รปท 1.21 รปแบบของการแปลงภาษาระดบสงไปเปนภาษาเครอง
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
28
1.7 หนาทการทางานของเครองคอมพวเตอร (Function of
Computer)
หนาทการทางานของเครองคอมพวเตอรคอการประมวลผลของชดคาสงหรอโปรแกรมทถกเขยนขนมา โดยมหนวยประมวลผลกลางเปนสวนททาหนาทในการประมวลผล เนองจากคอมพวเตอรปจจบนเปนคอมพวเตอรมพนฐานมาจากแบบจอหน ฟอน นอยมนน หรอเปนเครองจกรททางานตามขนตอนของคาสงหรอโปรแกรมทมนษยคดไว โดยนาโปรแกรมนนไปเกบในรปแบบของไฟลในดสก คอมพวเตอรกอานโปรแกรมไปเกบไวในหนวยความจาเพอใหหนวยประมวลผลกลาง มาอานคาสงไปทางานทละคาสง โดยเรมตงแตคาสงแรกไปจนจบโปรแกรม
การประมวลผลคาสงทละ 1 วงรอบของการทางาน จะประกอบดวยกระบวนการหลก 2 กระบวนการ
1. การดงชดคาสง (Instruction Fetch)
ในการทางานในแตละชดคาสง หนวยประมวลผลกลางจะตองดงคาสงทจะถกนามาประมวลผลจากหนวยความจามาเกบไวในหนวยประมวลกลางเพอทจะประมวลผล
2. การประมวลผลคาสง (Execute Instruction)
เมอมชดคาสงและขอมลตางๆ พรอมอยในหนวยประมวลผลกลางแลว กจะกระทาการประมวลผลคาสงเพอใหไดผลลพธตามทชดคาสงตองการ
รปท 1.22 วงรอบคาสง ทมา (William Stallings, 2003, 54)
จากรปท 1.22 กระบวนการทางานของคอมพวเตอรจะทาการดงชดคาสงเพอนามาประมวลผลจากนนกกระทาการประมวลผล ซงกจะกระทาซาแบบวนรอบไปเรอยๆ จนกวาจะจบโปรแกรมของชดคาสง การไปนามา (Fetch) คอการดงชดคาสงเขามา โดยขนตอนของการดงชดคาสง แสดงดงรปท 1.23
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
29
รปท 1.23 ตวอยางการทางานของการดงชดคาสง
จากรปท 1.23 ประกอบไปดวย เรจสเตอรคาสงเครอง (IR) เรจสเตอรบพเฟอรหนวยความจา (MBR) และ เรจสเตอรตวนบระบตาแหนงคาสง(PC) ในแตละการทางานของวงรอบคาสง หนวยประมวลผลกลางจะดงคาสงมาจากหนวยความจาโดยดจากเรจสเตอรตวนบระบตาแหนงคาสง (PC) ซงจะเปนเรจสเตอรทอยภายในหนวยประมวลผลกลางมหนาทเกบตาแหนงของชดคาสงทจะถกนามาประมวลผลในลาดบถดไป ซงเมอชดคาสงไดถกนามาประมวลผลแลวเรจสเตอรตวนบระบตาแหนงคาสง (PC) กจะทาการเพมคาหรอชไปยงตาแหนงอนๆ ถดไป เพอทจะไดเอาชดคาสงถดไปมาประมวลผล ถาการประมวลผลปกต ถาเรมตนทตาแหนง 100 ตาแหนงถดไปกจะเปน 101, 102, 103 ตามลาดบไปเรอยๆ ซงลาดบน อาจเปลยนแปลงได ถาบางชดคาสงเปนการกระโดดไปยงตาแหนงอนๆ ชดคาสงทถกดงเขามาจะถกนาไปเกบไวทเรจสเตอรบพเฟอรหนวยความจา (MBR)
ซงจะเปนเรจสเตอรทเกบชดคาสงชวคราว และจะสงชดคาสงไปทเรจสเตอรคาสงเครอง (IR)
ซงเปนเรจสเตอรทเกบชดคาสงกอนทจะนาไปประมวลผล คาสงจะประกอบดวยบตตางๆ ทกาหนดใหหนวยประมวลกลางทางาน
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
30
การกระทาการ (Execute) ชดคาสง คอการประมวลผลชดคาสงโดยหนวยประมวลผลกลางจะนาชดคาสงทอยในเรจสเตอรคาสงเครอง (IR) ไปประมวลผลแปลความหมายและทางานตามคาสงนน โดยทวไปหนวยประมวลกลางจะกระทาออกเปนกลมตางๆ ดงน
หนวยประมวลผลกลางและหนวยความจา (Processor-Memory) การเคลอนยายขอมลจาก หนวยประมวลผลกลางไปหนวยความจา หรอจากหนวยความจาไปหนวยประมวลกลาง
หนวยประมวลผลกลางและอนพต เอาตพต (Processor-Input/Output) การเคลอนยายขอมลจากหนวยประมวลผลกลางไปยงอปกรณอนพต เอาตพต หรอจากอปกรณอนพต เอาตพตไปยงหนวยประมวลผลกลาง
การประมวลผลขอมล (Data processing) เปนการประมวลผลขอมลหรอการคานวณทางคณตศาสตรและตรรกะตางๆ
การควบคม (Control) การควบคมลาดบของการประมวลผลหรอการควบคมอปกรณตางๆ ของระบบคอมพวเตอรใหทางานตางๆ ตามทไดรบคาสง
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
31
แผนภาพสถานะหรอสเตทไดอะแกรม (State Diagram)
จากวงรอบคาสงจากรปท 1.22 อาจจะเขยนแผนภาพสถานะเพอแสดงรายละเอยดทแสดงใหเหนภาพการทางานทชดเจนดงรปท 1.24 ซงลกษณะการทางานในสวนยอยของวงรอบคาสงอธบายไดดงน
รปท 1.24 แผนภาพสถานะวงรอบคาสง ทมา (William Stallings, 2003, 57)
Instruction Address Calculation (IAC): คานวณตาแหนงของคาสง ซงเปนการคานวณหาตาแหนงของคาสงทจะถกนามาประมวลผล โดยทวไปบางระบบจะเปนการบวกคาตาแหนงทละ 1 ตาแหนงเชน ตาแหนง 100, 101, 102 ซงเปนการบวกทละ 1 ตาแหนงไปเรอย
Instruction Fetch (IF): การดงชดคาสง ซงเปนการดงชดคาสงทอยในหนวยความจามาสหนวยประมวลผล (เกบไวทเรจสเตอรทอยภายในหนวยประมวลผล)
Instruction Operation Decoding (IOD): การถอดรหสชดคาสง ซงเปนการแปลความหมายของชดคาสง โดยดวาชดคาสงจะกระทาอะไร และขอมลทจะนามาใชคออะไร
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
32
Operand Address Calculation (OAC): การคานวณตาแหนงของตวถกกระทา ซงเปนการคานวณหาตาแหนงตวถกกระทาหรอโอเปอแรนด (Operand) ถาคาสงนนมการอางถงตวถกกระทาในหนวยความจา หรอผานอปกรณอนพต เอาตพตตางๆ เชนมการอางถงขอมลตางๆ ทอยในหนวยความจาทจะถกนามาใช
Operation Fetch (OF): การดงตวถกกระทามาเกบไวยงหนวยประมวลผล ซงเปนการดงตวถกกระทาตางๆ เชนดงขอมลทจะเปนตวถกกระทาจากหนวยความจาหรออปกรณอนพต
เอาตพตตางๆ มาไวยงหนวยประมวลผล
Data Operation (DO): การทางานกบขอมล ซงเปนการนาเอาขอมลตางๆ มาทาการประมวลผลตามชดคาสงทสงงาน
Operand Store (OS): การจดเกบขอมลตวถกกระทา ซงเปนการจดเกบขอมลทไดจากการประมวลผลตางๆไวทหนวยความจาหรอไวทอปกรณอนพต เอาตพตตางๆ
จากรปท 1.24 สงเกตเหนวาแผนภาพสถานะในสวนดานบนจะเกยวของกบการแลกเปลยนขอมลระหวางหนวยประมวลผลกบหนวยความจาหรออปกรณอนพต/เอาตพตตางๆ สวนแผนภาพสถานะทอยสวนลางจะเปนสวนทเกยวของกบการประมวลผลภายในหนวยประมวลผลเอง นอกจากนในแผนภาพสถานะสงเกตเหนวาระบบนสามารถยนยอมใหมตวถกกระทาไดหลายตวและมผลลพธไดหลายตวเชนกน เนองจากบางคาสงของระบบคอมพวเตอรบางชนดมความตองการในการทางานในลกษณะนดงเชนคาสง ADD A,B ซงจะเปนการอางตวถกกระทาจานวน 2 ตว
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
33
บทสรป
ในบทนไดกลาวถงลกษณะการทางานของเครองคอมพวเตอร ประเภทของเครองคอมพวเตอร โครงสรางคอมพวเตอร องคประกอบของระบบคอมพวเตอร ซอฟตแวร และภาษาคอมพวเตอร ซงเปนพนฐานของการเรยนรของการทางานของเครองคอมพวเตอร ทาใหสามารถเขาใจและเปนพนฐานในการทางานเกยวกบคอมพวเตอรในระดบสงตอไป ลกษณะการทางานของเครองคอมพวเตอรมแนวคดมาจากการจาลองการทางานทางธรรมชาต ซงลกษณะการทางานของเครองคอมพวเตอรจะคลายๆ กบลกษณะการทางานของสมองมนษย จาลองการเลยนแบบการคดของมนษยนนเอง ประเภทของเครองคอมพวเตอรในปจจบนมผแบงออกเปนหลายชนดหลายประเภท ขนอยกบเกณฑทใชในการแบง ดงเชนแบงตามลกษณะการใชงานและแบงตามขนาดและความสามารถ โครงสรางคอมพวเตอรคอวธการทอปกรณตางๆ ของคอมพวเตอรเชอมตอเขาดวยกน โดยองคประกอบของคอมพวเตอรมองคประกอบทสาคญ หนวยประมวลผลกลาง หนวยความจาหลก หนวยอนพต เอาตพตหรอหนวยรบเขาและสงออก และหนวยการเชอมตอภายในเครองคอมพวเตอร องคประกอบของระบบคอมพวเตอรประกอบดวย 5 องคประกอบคอ ฮารดแวร ซอฟตแวร ขอมล บคลากร และขนตอนการดาเนนงาน ซงการทคอมพวเตอรจะสามารถทางานไดตองประกอบไปดวยทง 5 องคประกอบ
ซอฟตแวรหมายถงชดคาสงหรอโปรแกรมทใชสงงานใหคอมพวเตอรทางาน ซอฟตแวรระบบคอซอฟตแวรททาหนาทเปนสอกลางในการตดตอสอสารกบมนษยเพอใหสามารถใชงานไดอยางมประสทธภาพ เปนตวควบคมฮารดแวรของระบบเครองคอมพวเตอรซงจะทางานใกลชดกบฮารดแวร ซอฟตแวรระบบสามารถจาแนกออกได 3 กลมคอ ซอฟตแวรระบบปฏบตการ ซอฟตแวรตวแปลภาษา และซอฟตแวรอรรถประโยชน ซอฟตแวรประยกตคอ ซอฟตแวรทถกสรางขนมาเพอใหผพฒนาสามารถนาไปใชไดอยางสะดวกและรวดเรว ทาใหประสทธภาพในการทางานทดขน ซงอาจจะเปนซอฟตแวรสาเรจหรอเปนซอฟตแวรทถกสรางขนมาใชงานในดานตางๆ ตามความตองการของผ ใช ภาษาโปรแกรมสามารถแบงออกเปนสองรปแบบ
ภาษาระดบตาและภาษาระดบสง ภาษาทมความใกลเคยงกบมนษยมากเทาไหรเราจดไดวาเปนภาษาระดบสงมากเทานน ซงจะสามารถเขาใจงายมากกวาภาษาระดบตา ในปจจบนนยมการเขยนโปรแกรมตางๆ ดวยภาษาระดบสง เนองจากเขาใจงายและสามารถประยกตใชงานไดอยางรวดเรว หนาทการทางานของเครองคอมพวเตอรคอการประมวลผลของชดคาสงหรอโปรแกรมทถกเขยนขนมา โดยมหนวยประมวลผลกลางเปนสวนททาหนาทในการประมวลผล
บทท 1 พนฐานระบบคอมพวเตอรและการเขยนโปรแกรมคอมพวเตอร
34
แบบฝกหดทบทวน
1. จงอธบายลกษณะการทางานของคอมพวเตอร 2. โครงสรางของคอมพวเตอรประกอบดวยอะไรบาง จงอธบาย 3. หนวยประมวลผลกลางคออะไรและมองคประกอบอะไรบาง 4. หนวยความจาคออะไรและมหนาททาอะไร 5. หนวยอนพต เอาตพต ทาหนาทอะไร 6. ซอฟตแวรคออะไร และทาหนาทอะไร 7. ซอฟตแวรสามารถแบงออกได 3 กลมใหญประกอบดวยซอฟตแวรอะไรบาง 8. จงยกตวอยางของซอฟตแวรระบบปฏบตการมา 3 ตวอยาง 9. ซอฟตแวรตวแปลภาษาคออะไร พรอมทงยกตวอยางซอฟตแวรตวแปลภาษามา 3
ตวอยาง 10. ซอฟตแวรสาเรจรปคออะไร จงอธบายพรอมทงยกตวอยางซอฟตแวรสาเรจรปมา 3
ตวอยาง 11. ภาษาระดบตา ภาษาระดบสงคออะไร พรอมทงยกตวอยางอธบาย 12. จงเขยนรปแบบของการแปลงภาษาระดบสงไปเปนภาษาเครอง มหลกการทางานอยางไร จงอธบาย
13. จงอธบายแผนภาพสถานะวงรอบคาสงดงรป
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
บทท 2
หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
ในบทนจะกลาวถงขนตอนในการเขยนโปรแกรม (Procedure of Computer
Programming) สญลกษณผงงาน (Flowchart Symbol) รหสเทยม (Pseudo Code) การวเคราะหผงงาน (Flowchart Analysis) การตรวจสอบขอผดพลาดของโปรแกรม (Testing
and Debugging) และโครงสรางการควบคมโปรแกรม (Structure of Program Control) ซงเปนหลกการพนฐานในการเขยนโปรแกรมคอมพวเตอร ในปจจบนระบบคอมพวเตอรสามารถคดและคานวณไดรวดเรวกวามนษย และสามารถทางานตางๆ ไดจานวนมาก การทางานตางๆ เหลานเกดขนไดกจากการเขยนโปรแกรมคอมพวเตอรทมประสทธภาพคอยสงงานใหคอมพวเตอรทางานตามคาสงทเราตองการ ดงนนการเขยนโปรแกรมคอมพวเตอรอยางมประสทธภาพจาเปนจะตองมกระบวนการในการแกปญหาอยางเปนระบบ และมความเขาใจรปแบบการเขยนโปรแกรม เพอใหเกดความรความเขาใจทถกตอง ชดเจน ซงจะเปนพนฐานทสาคญในการเขยนโปรแกรมเพอนาไปประยกตใชงานไดอยางมประสทธภาพ
2.1 ขนตอนในการเขยนโปรแกรม (Procedure of Programming)
การเขยนโปรแกรมคอมพวเตอรจาเปนตองมกระบวนการหรอขนตอนทสาคญเพอใหการแกปญหามประสทธภาพทดทสด ในการเขยนโปรแกรมจะมรปแบบในการพฒนาหลายรปแบบดงเชนวธการแบบจาลองนาตก (Waterfall Model) ซงเปนวธการหนงเขาใจงายและทนยมใชในปจจบน ซงหลกการกจะเปนเชนเดยวกบนาตกตามชอของวธการ โดยเรมตนจากการขนตอนของการสอบถามความตองการ (Requirement Phase) ขนตอนของการวเคราะห
(Specification (Analysis) Phase) ขนตอนของการวางแผน (Planning Phase) ขนตอนการออกแบบการทางานของแตละงานยอย (Design Phase) ขนตอนของการเขยนโปรแกรม
(Implementation Phase) ขนตอนของรวมงาน (Integration Phase) ขนตอนของการ
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
36
บารงรกษา (Maintenance Phase) สดทายคอขนตอนของการเลกใชงาน (Retirement) ดงแสดงในรปท 2.1
รปท 2.1 แบบจาลองนาตก
ขนตอนของการสอบถามความตองการ (Requirement Phase) เปนขนตอนสอบถามความตองการของผ ใชโปรแกรมหรอลกคา วาตองการใหโปรแกรมทสรางขนสามารถทาอะไรไดบาง ดงเชนความตองการของลกคาทตองการนาโปรแกรมไปใชจดการฐานขอมลในรานหนงสอ หรอรานคาตางๆ
ขนตอนของการวเคราะห (Specification (Analysis) Phase) เปนขนตอนของการวเคราะหหรอกาหนดรายละเอยดตางๆ หลงจากทราบความตองการของผ ใชแลวกมาทาการวเคราะหวาจะสรางโปรแกรมตามความตองการของผ ใช ตองทาอยางไร (อยางกวาง ๆ) จะใชเครองมออะไรบางในการพฒนาโปรแกรม
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
37
ขนตอนของการวางแผน (Planning Phase) เปนขนตอนของการวางแผนงาน จะกระทาการวางแผน สรางตารางเวลาการทางาน กระจายงานทตองทา ซงเปนงานทไดจากขนตอนของการวเคราะหในกอนหนาน
ขนตอนการออกแบบการทางานของแตละงานยอย (Design Phase) เปนขนตอนของการออกแบบของแตละงานยอย ซงเปนงานทไดจากการกระจายงานในขนตอนการวางแผน
ซงประกอบดวยสองขนตอนทสาคญคอ การคดหาวธการทางานของโปรแกรมหรอทเรยกกนวาขนตอนวธ (Algorithm) ซงการ
คดหาวธการทางานของแตละคนสาหรบแตละปญหากจะแตกตางกน ตามแตความสามารถในการคดของขนตอนวธ แตผลลพธทไดจะตองสามารถกระทาไดตามทตองการตามทไดวางแผนไว
การถายทอดความคดนนไปใหกบผ ทจะทางานในสวนการเขยนโปรแกรมเรามกจะใชสองวธการ (อยางใดอยางหนง) นนคอ การเขยนผงงาน (Flowchart) ซงเปนการอธบายขนตอนการทางานของโปรแกรมในรปแบบของกราฟกและ การเขยนรหสเทยม (Pseudo
code) ซงเปนการอธบายขนตอนการทางานของโปรแกรมในรปแบบของตวหนงสอ
ขนตอนของการเขยนโปรแกรม (Implementation Phase) เปนขนตอนของการเขยนโปรแกรมตามทออกแบบไวตามขนตอนการวางแผนงาน การเขยนโปรแกรมโดยมากจะดจากผงงานหรอรหสเทยม เพอสามารถใหเขยนโปรแกรมตามแนวทางของแตละคนไดตามแผนทวางไว เนองจากการเขยนโปรแกรมสามารถเขยนไดหลายภาษา แตภาษาทเปนมาตรฐานเดยวกนคอผงงานและรหสเทยม
ขนตอนของรวมงาน (Integration Phase) เปนขนตอนของการนาโปรแกรมทเขยนเสรจของแตละงานมารวมกน แลวลองนาไปใชจรง
ขนตอนของการบารงรกษา (Maintenance Phase) เปนขนตอนการบารงรกษาโปรแกรม ระหวางทใชโปรแกรมนนอาจเกดปญหาบางอยาง เชนโปรแกรมทางานผดพลาด
โปรแกรมทางานไมตรงกบความตองการตามทผใชโปรแกรมตองการ ซงผพฒนาโปรแกรมตองนาโปรแกรมไปแกไข ปรบปรงเพมเตมจนไดโปรแกรมทสมบรณตามทผใชตองการ
ขนตอนของการเลกใชงาน (Retirement) คอการเลกใชโปรแกรม
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
38
2.2 สญลกษณผงงาน (Flowchart Symbol)
สญลกษณผงงานเปนเครองมออกแบบหนงทใชรปภาพ แสดงถงขนตอนในการเขยนโปรแกรม หรอขนตอนในการแกปญหาทละขน และมเสนทแสดงทศทางการไหลของขอมลตงแต จดเรมตน จนกระทงจดสนสดของโปรแกรมหรอผลลพธของโปรแกรม ใชเปนโครงรางกอนการเขยนโปรแกรมคอมพวเตอร เพอสามารถเหนภาพของการแกปญหาไดอยางชดเจนและเขาใจงายยงขน สญลกษณผงงานเปนเครองมอทสาคญในการเขยนโปรแกรมของทกๆ ภาษา เนองจากสญลกษณผงงานจะใชรปมาตรฐานเดยวกนในทกๆ ภาษา ทาใหเมอเหนผงงานของโปรแกรมแลวจะสามารถนาไปเขยนโปรแกรมภาษาใดกได สญลกษณผงงานจะเปนเครองมอถายทอดแนวคดในการแกปญหาใหออกมาในรปของรปธรรม การเขยนโปรแกรมโดยใชสญลกษณผงงาน แบงไดออกเปน 2 แบบไดแก
1) ผงงานระบบ (System flowchart) เปนผงงานทเขยนขนเพอแสดงใหเหนถงความสมพนธระหวางโปรแกรมตางๆ วาไดรบขอมลเขามาประมวลผลจากทางใด ประมวลผลเสรจแลวจะสงไปทไหน และผลลพธทเกดขนจะแสดงออกในรปใด
2) ผงงานโปรแกรม (Program flowchart หรอ Detail flowchart) เปนผงงานทเขยนขนเพอแสดงขนตอนคาสงอยางละเอยด ซงตามปกตแลวผ เขยนโปรแกรมจะเขยนผงงานโปรแกรม ขนมากอน ตอจากนนจะตรวจสอบขนตอนคาสงงานแตละขนในผงงานวาไมมผดพลาดแลวจงลงมอเขยนโปรแกรมเพอนาไปประยกตใชงานตอไป
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
39
สญลกษณ ความหมาย สญลกษณ ความหมาย
เรมตนและสนสดโปรแกรม
พมพผลลพธออกทางกระดาษ
รบขอมลทางคยบอรด
ประมวลผล
อานเขยนขอมลจากดสก
ตดสนใจเลอก
อานเขยนขอมลจากเทปแมเหลก
รอยตอของเสนเชอม
อานเขยนขอมลลงฐานขอมล
แสดงการเชอมตอในหนาถดไป
แสดงผลลพธออกทางหนาจอ
เสนเชอมตอ
รปท 2.2 ความหมายของสญลกษณผงงาน
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
40
2.3 รหสเทยม (Pseudo Code)
รหสเทยมคอรหสจาลองทใชเปนตวแทนของขนตอนวธทใชในภาษาการเขยนโปรแกรมทวไป โดยจะแสดงขนตอนวธการทใชภาษาเขยนทเขาใจงาย โดยมถอยคาหรอประโยคคาสงทเขยนอยในรปแบบของภาษาองกฤษหรอภาษาไทยกได ขนอยกบความสะดวกของผ เขยนโปรแกรม แตโดยทวไปจะใชรปแบบภาษาองกฤษเพออธบายรายละเอยดของขนตอนวธตางๆ เนองจากเปนภาษากลางทสวนมากนยมใชกน
บางครงจะมการใชคาเฉพาะ (Reserve Words) ทมอยในภาษาโปรแกรมมาชวยเขยน
โครงสรางของรหสจาลองดงนนจงมสวนคลายกบการเขยนโปรแกรมมาก รหสจาลองจงเปนเครองมออกแบบทใชกนในการออกแบบโปรแกรม
หลกการเขยนรหสเทยม
ถอยคาทใชเขยน ใชภาษาองกฤษหรอภาษาไทยทเขาใจงาย ในหนงบรรทด ควรใหมเพยงหนงประโยคคาสงเทานน
ใชยอหนาใหเปนประโยชน ในการแสดงการควบคมอยางเปนสดสวน
แตละประโยคคาสงใหเขยนจากบนลงลาง และมทางออกทางเดยว กลมของประโยคคาสงอาจรวมเปนหมวดหมแลวเรยกใชเปนหนวยโปรแกรมประยกต
(Module)
ตวอยางท 2.1 ใหทาการเขยนรหสเทยมของการชงกาแฟ จานวน 5 ถวย วธทา
1. ซอกาแฟผง 5 ซอง 2. ตมนารอนจนเดอด
3. ทาซา 5 ถวย 3.1 เตรยมถวยและชอน สาหรบชงกาแฟ
3.2 ฉกซองกาแฟ แลวเทลงถวยเปลา 3.3 เทนารอนลงถวยแลวใชชอนคนใหเขากน
4. เรยกเพอนทง 5 คน
5. เชญทกรบประทานกาแฟ
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
41
ตวอยางท 2.2 ใหทาการเขยนรหสเทยมของการหาคานวณพนทสามเหลยม
วธทา 1. Set Variable
2. X = Input of Base
3. Y = Input of High
4. Z = ½ * X * Y
5. Output = Z
ตวอยางท 2.3 ใหทาการเขยนรหสเทยมของการคานวณของคา 3 คา วธทา
1. Set Variable
2. X = Input Value 1
3. Y = Input Value 2
4. Z = Input Value 3
5. Total = X * Y * Z
6. Output = Total
ตวอยางท 2.4 ใหทาการเขยนรหสเทยมของการคานวณของคาเกรดเฉลยของนกศกษา จานวน 2 เทอม
วธทา 1. Set Variable
2. X = Input Grade1
3. Y = Input Grade 2
4. Calculate Average by Using Z = (X+Y)/2
5. Show Result of Z
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
42
2.4 การวเคราะหผงงาน (Flowchart Analysis)
การวเคราะหผงงานเปนการวเคราะหถงปญหานบไดวาเปนสวนสาคญของการเขยนโปรแกรมประยกตตางๆ การวเคราะหผงงานเปนการศกษาถงลกษณะและรายละเอยดตางๆ ทเกยวของสาหรบการเขยนโปรแกรม เชนตองการใหเขยนโปรแกรมอะไรกจะทาการวเคราะหผงงานทงหมดตงแตอนพตจนถงเอาตพต และวธการประมวลผลตางๆ เพอใหผ เขยนโปรแกรมสามารถมองเหนปญหาไดงายขนและสามารถนาไปเขยนโปรแกรมประยกตใชงานจรงไดอยางรวดเรวและมความถกตองสมบรณ การวเคราะหผงงานทมประสทธภาพมหลากหลายวธ แตวธการทนยมใชกนอยางแพรหลาย จะสามารถแบงวธการวเคราะหผงงานไดดงน
สงทโจทยตองการ หมายถงสงทตองการใหเครองคอมพวเตอรทาให เชน ตองการใหคานวณเกรดเฉลยของนกศกษา คานวณเกรดของนกศกษา และอนๆ การพจารณาถงสงทโจทยตองการเปนสวนทสาคญมาก เพราะถาไมสามารถเขาสงทโจทยตองการกไมสามารถจะทาขนตอนตอไปไดเลย หรอถาเขาใจสวนนผดกจะทาใหงานขนตอนทเหลอผดหมด
ผลลพธทตองการแสดง (Output Results) หมายถงผลลพธทตองการใหคอมพวเตอรแสดงผลออกมาวาควรจะมลกษณะในการแสดงผลอยางไร มรายละเอยดทตองการใหแสดงผลมากนอยเพยงใด
ขอมลทตองนาเขา (Input Data) หมายถงขอมลอนพตทตองปอนเขามาเพอใชในการประมวลผล
ตวแปรทใช (Variable) หมายถงตวแปรทใชแทนความหมายของขอมล เพอความสะดวกในการอางถงขอมล ในการเขยนโปรแกรมควรตงชอตวแปรทมความหมายทมความเกยวของกบขอมล การตงชอตวแปรนจะขนอยกบกฎเกณฑของภาษาคอมพวเตอรของแตละภาษาทใชในการเขยนโปรแกรม เนองจากภาษาคอมพวเตอรแตละภาษามขอกาหนดในการตงตวแปรทแตกตางกนไป
วธการประมวลผล (Processing) หมายถงวธการประมวลผลโดยจะแสดงขนตอนตางๆ ของการประมวลผลทงหมด ในขนตอนของวธการนถาทาไดอยางมประสทธภาพและเขาใจงายกจะชวยในการเขยนโปรแกรมใหงายยงขน เนองจากมองเหนกระบวนการตางๆ ชดเจน
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
43
หลกการทวไปของการเขยนผงงานระบบทด เราสามารถสรปวธการเขยนไดดงน
ควรมจดเรมตนและจดสนสดเพยงจดเดยวในผงงาน
มทางเขาของสญลกษณเพยงทางเดยว มทางออกของสญลกษณเพยงทางเดยว แตยกเวนสญลกษณของการตดสนใจท
สามารถออกได สองทาง ทศทางของสญลกษณควรจะเขยนจากบนลงลาง ขอความทอยในสญลกษณควรจะสนกะทดรด และสอความหมายทเขาใจงาย ขนาดของสญลกษณควรมความพอด
เสนทางในการเชอมตอควรจะเขยนใหชดเจน วาจะมลกศรไปในทศทางใดบาง
ตวอยางท 2.5 จงเขยนผงงานของการบวกเลขจานวน 2 คา วธทา วเคราะหแนวคดท 1 ในการเขยนผงงาน
ถาโจทยไมไดระบวาใหคาตวเลขมาจากไหนอนพตอะไร ใหสมมตวาไดรบอนพตของเลขมาจากคยบอรด ดงนนทาการรบขอมลอนพตคอรบตวเลขสองตวเขามา เมอรบคาเขามาแลวจะเกบคาไวทไหน ซงโดยปกตแลวจะเกบไวในตวแปรทสรางขนมา ดงนนในการเขยนผงงาน เราจะเอาตวเลขตวแรกไวทตวแปร A และตวเลขตวทสองไวทตวแปร B แลวจากนนกเอาเลขสองตวมาบวกกนแลวแสดงผล ซงสามารถเขยนเปนผงงานไดดงรปท 2.3
Start
Input A,B
A+B
End
รปท 2.3 ผงงานของการบวกเลข ตามแนวคดท 1
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
44
วเคราะหแนวคดท 2 ในการเขยนผงงาน
ใหสมมตวาไดรบอนพตของเลขมาจากคยบอรด ดงนนทาการรบขอมลอนพตคอรบตวเลขสองตวเขามา เมอรบคาเขามาแลวจะเกบไวในตวแปร A และตวแปร B แลวจากนน เอาคาตวแปร A และ B ทาการบวกกนแลวเกบไวทตวแปร C สดทายนาเอาตวแปร C ไปแสดงผล ซงสามารถเขยนเปนผงงานไดดงรปท 2.4
Start
Input A,B
C
End
C = A + B
รปท 2.4 ผงงานของการบวกเลข ตามแนวคดท 2
ตวอยางท 2.6 จงเขยนผงงานของโปรแกรมสาหรบหาราคาของสนคา โดยใหผ ใชระบราคาสนคา และโปรแกรมจะแสดงราคากอนรวมภาษและราคาหลงรวมภาษแลวใหผใชสามารถเหนราคาสนคาทรวมภาษ
วธทา อตราภาษในทนสมมตใหอตราภาษเปน 7% จากนนสงเกตจากโจทยมคาวา “ผใชระบ
ราคา” แสดงวาจะตองมการรบคาอนพตจากผใช ดงนนใหรบคาอนพตจากคยบอรดแลวเกบไวทตวแปร A จากนนใหตวแปรทชอวา VAT ใชเกบผลลพธจากการคานวณภาษ โดยสามารถคานวณไดจาก VAT = 0.07 * A สดทายแสดงราคากอนรวมภาษ (คาของตวแปร A) และราคาหลงรวมภาษ (A+VAT) ซงสามารถเขยนเปนผงงานไดดงรปท 2.5
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
45
Start
Input A
AVAT+A
End
VAT = 0.07 x A
รปท 2.5 ผงงานของการคานวณราคาสนคา
ตวอยางท 2.7 จงเขยนผงงานของโปรแกรมสาหรบหาเกรดเฉลยรวมสองเทอม
วธทา จะหาเกรดเฉลยรวมสองเทอมไดจะตองรหนวยกตทลงเทอมหนง เกรดทไดเทอมหนง
หนวยกตทลงเทอมสอง เกรดทไดเทอมสอง ดงนนตองรบคามาทงหมดสคาโดยท รบคาหนวยกตทลงเทอมหนงเกบไวทตวแปร U1รบคาหนวยกตทลงเทอมสองเกบไวทตวแปร U2 รบคาเกรดเทอมหนงเกบไวทตวแปร G1 และรบคาเกรดเทอมสองเกบไวทตวแปร G2 จากนนทาการคานวณเกรดเฉลยแลวเกบผลลพธไวทตวแปรชอ G สดทายทาการแสดงผลคาของ G ออกมา ซงสามารถเขยนเปนผงงานไดดงรปท 2.6
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
46
Start
Input U1,U2G1, G2
G
End
G = (G1xU1 + G2xU2)/ (U1+U2)
รปท 2.6 ผงงานของการคานวณหาคาเกรดเฉลย 2 เทอม
2.5 การตรวจสอบขอผดพลาดของโปรแกรม (Testing and
Debugging)
การตรวจสอบขอผดพลาดของโปรแกรมเปนกระบวนการตรวจสอบความผดพลาดของโปรแกรมเมอนาไปสรางโปรแกรมขนมาจนเสรจสนแลว บางครงโปรแกรมอาจผานการแปล โดยไมมขอผดพลาดเกดขน แตเมอนาโปรแกรมไปใชงานปรากฏวาไดผลลพธทไมถกตอง ดงนนควรจะตองมขนตอนการทดสอบความถกตองของโปรแกรม ซงอาจจะตองตรวจสอบการใสขอมลทถกตอง ตรวจสอบการใชขอบเขตและความถกตองของขอมล ตรวจสอบการใชความสมเหตสมผล ตรวจสอบขอมลทเปนตวเลขและตวอกษร โปรแกรมทกโปรแกรมจะตองไดรบการตรวจสอบขอผดพลาดตางๆ กอนวา มขอผดพลาดในโปรแกรมหรอไม โดยทวไปวธทตรวจสอบขอผดพลาดของโปรแกรม จะมดงน
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
47
ตรวจสอบดวยตนเอง (Self Checking) เปนการทดลองเขยนโปรแกรมลงบนกระดาษ
แลวใสตรวจสอบการทางานของโปรแกรมทละขนดวยตนเองวาโปรแกรมมการทางานทถกตองตามผลลพธทตองการหรอไม
ตรวจสอบดวยการแปลโปรแกรม หลงจากเขยนโปรแกรมเสรจ กจะปอนโปรแกรมเขาสเครองเพอทาการแปลโปรแกรม โดยจะมการเรยกใชคอมไพเลอร (Compiler) และแอสแซมเบลอร (Assembler) ทาการแปลโปรแกรมใหเปนภาษาเครอง (Machine Language) ในการแปลจะเปนการตรวจสอบความผดพลาดของโปรแกรมไปในตว ซงถามขอผดพลาดเกดขนโปรแกรมทใชเขยนภาษานนจะแจงขอผดพลาดทเกดขน โดยทวไปมขอผดพลาดดานไวยากรณของภาษา ขอผดพลาดในระหวางการรนของโปรแกรม และขอผดพลาดทเกดจากการตความหมายของปญหาผดไป
2.6 โครงสรางการควบคมโปรแกรม (Structure of Program Control)
โครงสรางการควบคมโปรแกรมเปนการควบคมลาดบของการเขยนโปรแกรมใหดาเนนการตามงานทตองการซงโครงสรางการควบคมโปรแกรมมหลายโครงสรางดงเชนโครงสรางการควบคมโปรแกรมแบบลาดบ (Sequential Control) โครงสรางการควบคมโปรแกรมแบบเงอนไข (Selection Control) โครงสรางการควบคมโปรแกรมแบบวนซา (Iteration Control) โครงสรางการควบคมโปรแกรมแบบกระโดด (Jump Control) ซงจะเปนโครงสรางการควบคมโปรแกรมคอมพวเตอรในรปแบบตางๆ โดยจะเปนสวนสาคญในการสรางโปรแกรมคอมพวเตอรใหสามารถแกปญหาตางๆ เพอใชในการสรางโปรแกรมอยางมประสทธภาพ
2.6.1 โครงสรางการควบคมโปรแกรมแบบลาดบ (Sequential Control)
โครงสรางการควบคมโปรแกรมแบบลาดบหรอการเขยนโปรแกรมแบบลาดบจะมลกษณะการทางานของโปรแกรมจากบนลงลาง โดยจะทาคาสงทกๆ คาสงทเขยนจากบนลงลาง โดยไมมเงอนไข รปแบบโครงสรางการควบคมโปรแกรมแบบลาดบแสดงดงรปท 2.7
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
48
รปท 2.7 รปแบบการควบคมโปรแกรมแบบลาดบ
ในการเขยนโปรแกรมในแตละชดคาสง (Instruction) ของรปแบบโครงสรางการควบคมแบบลาดบจะดาเนนการประมวลผลของชดคาสงตงแตคาสงแรกจนถงคาสงสดทาย ดงผงงานตวอยางทแสดงในรปท 2.8
รปท 2.8 รปแบบประมวลผลชดคาสงแบบลาดบ
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
49
ตวอยางท 2.8 จงเขยนผงงานของโปรแกรมแบบลาดบเพอคานวณหาพนท 4 เหลยมผนผา วธทา
ถาโจทยไมไดระบวาใหคาตวเลขมาจากไหนอนพตอะไร ใหสมมตวาไดรบอนพตของเลขมาจากคยบอรด ดงนนทาการรบขอมลอนพตคอรบตวเลขสองตวเขามา เมอรบคาเขามาแลวจะเกบคาไวทตวแปร A และตวเลขตวทสองไวทตวแปร B แลวจากนนกเอาเลขสองตวมาคณกนเพอหาพนทของ 4 เหลยมผนผา จากนนแสดงผลทตองการ ซงสามารถเขยนเปนผงงานไดดงรปท 2.9
รปท 2.9 ผงงานแบบลาดบในการคานวณหาพนท
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
50
2.6.2 โครงสรางการควบคมโปรแกรมแบบเงอนไข (Selection Control)
โครงสรางการควบคมโปรแกรมแบบเงอนไขจะมลกษณะการทางานของโปรแกรมทสามารถเลอกชดคาสงในการประมวลผลได การจะกระทาชดคาสงไปในทศทางไหนแลวแตเงอนไขทตงไว รปแบบโครงสรางการควบคมโปรแกรมแบบลาดบแสดงดงรปท 2.10
รปท 2.10 รปแบบการควบคมโปรแกรมแบบเงอนไข
ในการเขยนโปรแกรมในแตละชดคาสง ของรปแบบโครงสรางการควบคมแบบเงอนไขจะดาเนนการประมวลผลเลอกชดคาสงตามเงอนไขทกาหนดไว ดงผงงานตวอยางทแสดงในรปท 2.11
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
51
หรอ
รปท 2.11 รปแบบประมวลผลชดคาสงแบบเงอนไข
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
52
ตวอยางท 2.9 จงเขยนผงงานของโปรแกรมตรวจสอบคาตวเลข โดยถาเลขทรบเขามาเปนเลขคใหแสดงคาวา Even ถาเลขทรบเขามาเปนเลขคใหแสดงคาวา Odd
วธทา ใหรบคาตวเลขไวทตวแปร A จากนนตรวจสอบตวเลขวาเปนเลขคหรอเลขค โดยถา A
หาร 2 แลวไดเศษ 0 แสดงวาเปนเลขค ถา A หาร 2 แลวไดเศษ 1 แสดงวาเปนเลขค ดงนนจะตองมตวแปรเกบเศษจากการหารสองสมมตวาเปนตวแปร B ถาเศษเปน 0 แสดงคาวา Even ถาเศษเปน 1 แสดงคาวา Odd จากนนแสดงผลทตองการ ซงสามารถเขยนเปนผงงานไดดงรปท 2.12
รปท 2.12 ผงงานแบบเงอนไขในการตรวจสอบตวเลขคและเลขค
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
53
ตวอยางท 2.10 จงเขยนผงงานของโปรแกรมตรวจสอบคาตวเลข โดยถาคาตวเลขทรบเขามา ถาตดลบใหแสดงคาวา Negative ถาเปนบวกใหแสดงคาวา Positive
วธทา โปรแกรมนรบคาอนพตหนงตวโดยใหรบเขามาเกบไวทตวแปร A จากนนทาการ
ตรวจสอบตวแปร A โดยถา A มากกวาหรอเทากบศนยกแสดงคาวา Positive ถานอยกวาใหแสดงคาวา Negative ซงสามารถเขยนเปนผงงานไดดงรปท 2.13
รปท 2.13 ผงงานแบบเงอนไขในการตรวจสอบตวเลขลบและบวก
ตวอยางท 2.11 จงเขยนผงงานของโปรแกรมรบคาอาย ถานอยกวา 10 พมพคาวา Children
ถานอยกวา 20 ใหพมพคาวา Young ถามากกวานนใหพมพคาวา Adult
วธทา โปรแกรมนรบคาอายเขามาเกบไวทตวแปร A แลวนาคา A มาพจารณาวานอยกวา
10 หรอไม ถานอยกวาใหพมพคาวา Children แตถาเปนอยางอนกไปมาพจารณาตอวา A
นอยกวา 20 หรอไม ถานอยกวาพมพคาวา Young และถานอกเหนอจากนนแสดงวาอายเกน
20 ป ใหพมพคาวา Adult เลย ซงสามารถเขยนเปนผงงานไดดงรปท 2.14
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
54
รปท 2.14 ผงงานแบบเงอนไขในการตรวจสอบอาย
ตวอยางท 2.12 จงเขยนผงงานของโปรแกรมตดเกรดตามเกณฑดงน
คะแนนตากวา 50 ได F
คะแนน 50 แตไมถง 60 ได D
คะแนน 60 แตไมถง 70 ได C
คะแนน 70 แตไมถง 80 ได B
คะแนน 80 เปนตนไปได A
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
55
วธทา โปรแกรมรบอนพตเปนคะแนนนกศกษาโดยเกบไวทตวแปร A จากนนตรวจสอบคา
เกรดทได โดยถา A<50 ให Grade = อกษร F และถา A<60 ให Grade = อกษร D และถา A<70 ให Grade = อกษร C และถา A<80 ให Grade = อกษร B และถา A>=80 ให Grade
= อกษร A สดทายใหแสดงคาของ Grade ทได ซงสามารถเขยนเปนผงงานไดดงรปท 2.15
รปท 2.15 ผงงานแบบเงอนไขในการตดเกรด
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
56
2.6.3 โครงสรางการควบคมโปรแกรมแบบวนซา (Iteration Control)
โครงสรางการควบคมโปรแกรมแบบวนซาจะมลกษณะการทางานของโปรแกรมทวนซาชดคาสง ซงเหมาะสาหรบการเขยนโปรแกรมทตองการทาซา คานวณซาหลายๆ รอบ โดยจะทาซาจนกวาจะไดผลลพธทตองการ รปแบบโครงสรางการควบคมโปรแกรมแบบวนซาแสดงดงรปท 2.16
รปท 2.16 รปแบบการควบคมโปรแกรมแบบวนซา
ในการเขยนโปรแกรมในแตละชดคาสง ของรปแบบโครงสรางการควบคมแบบวนซาจะดาเนนการประมวลผลทาซาตามเงอนไขทกาหนดไว ดงผงงานตวอยางทแสดงในรปท 2.17
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
57
(ก) รปแบบตรวจสอบเงอนไขกอน
(ข) รปแบบตรวจสอบเงอนไขทหลง รปท 2.17 รปแบบประมวลผลชดคาสงแบบวนซา
ตวอยางท 2.13 จงเขยนผงงานของโปรแกรมพมพชอออกทางหนาจอจานวน 100 ครง วธทา
การเขยนโปรแกรมในรปแบบนควรใชวธการวนซาโดยทเงอนไขในการทาซาคอจานวนรอบ เรมตนใหตวแปรนบรอบชอ A มคาเรมตนเปน 1 จากนนตรวจสอบเงอนไข ถา A > 1000
ใหหยดทา แตถานอยกวาใหพมพชอออกทางหนาจอภาพและเพมคา A โดยจะเปนการวนซาจนกวาคาของตวแปร A มคามากกวา 100 ซงสามารถเขยนเปนผงงานไดดงรปท 2.18
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
58
รปท 2.18 ผงงานแบบวนซาในการพมพชออกจานวน 100 ครง
ตวอยางท 2.14 จงเขยนผงงานของโปรแกรมหาคาผลรวมตงแต 1 ถง 10
วธทา การเขยนโปรแกรมควรมตวแปรสะสมคา ซงจะเปนตวแปรทเกบผลรวมของ 1 ถง 10
โดยจะตงชอวา SUM มคาเรมตนเปน 0 แลวใชการทาซา ถาเงอนไขในการทาซาคอ จานวนรอบ สมมตใหตวแปรนบรอบชอ A มคาเรมตนเปน 1 ถา A > 10 ใหหยดทา สงทตองทาซาคอการนาเอาคาของ A ไปรวมไวทตวสะสมคา หลงเสรจสนการทาซากแสดงคาผลลพธของ SUM
ออกมา ซงสามารถเขยนเปนผงงานไดดงรปท 2.19
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
59
รปท 2.19 ผงงานแบบวนซาในการหาคาผลรวมของเลข 1 ถง 10
ตวอยางท 2.15 จงเขยนผงงานของโปรแกรมหาคาผลรวมของเลขคตงแตเลข 1 ถง 10
วธทา การเขยนโปรแกรมในขอนจะคลายตวอยางกอนหนาน แตมการเพมการตรวจสอบ
คาทเปนเลขคและคาทเปนเลขคจากการหาร 2 และเกบเศษไวพจารณา ถาเศษได 0 แสดงวาตวเลขทตรวจสอบจะเปนเลขค ถาเศษได 1 แสดงวาตวเลขทตรวจสอบจะเปนเลขค ซงสามารถเขยนเปนผงงานไดดงรปท 2.20
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
60
รปท 2.20 ผงงานแบบวนซาในการหาคาผลรวมของเลขคตงแตเลข 1 ถง 10
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
61
ตวอยางท 2.16 จงเขยนผงงานของโปรแกรมหาคาเฉลยสวนสงของนกศกษา วธทา
การเขยนโปรแกรมตองทราบกอนวาในหองนมคนกคน แลวทาการทาซาทากบจานวนคนทมอยในหอง โดยแตละรอบของการทาซานนกจะทาการรบสวนสงของแตละคนเขามา แลวนาไปสะสมคากบตวแปรสะสมความสงรวม สดทายกนาเอาคาตวแปรสะสมความสงรวมไปหารกบจานวนคนทมอยในหอง กจะไดคาเฉลยออกมา ซงสามารถเขยนเปนผงงานไดดงรปท
2.21
รปท 2.21 ผงงานแบบวนซาในการหาคาเฉลยสวนสงของนกศกษา
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
62
2.6.4 โครงสรางการควบคมโปรแกรมแบบกระโดด (Jump Control)
โครงสรางการควบคมโปรแกรมแบบกระโดดจะมลกษณะการทางานของโปรแกรมทกระโดดขามชดคาสงถดไป โดยจะสามารถกระโดดไปในสวนไหนกได ซงสามารถกระโดดไดทงแบบมเงอนไข และกระโดดแบบไมมเงอนไข โดยทวไปรปโครงสรางการควบคมโปรแกรมแบบกระโดดจะไมนยมนามาใชในการเขยนโปรแกรมในภาษาระดบสง รปแบบโครงสรางการควบคมโปรแกรมแบบกระโดดแสดงดงรปท 2.22
รปท 2.22 รปแบบการควบคมโปรแกรมแบบกระโดด
ในการเขยนโปรแกรมในแตละชดคาสง ของรปแบบโครงสรางการควบคมแบบกระโดดจะดาเนนการกระโดดไปยงชดคาสงทตองการใหประมวลผล ดงผงงานตวอยางทแสดงในรปท
2.23
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
63
รปท 2.23 รปแบบประมวลผลชดคาสงแบบกระโดด
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
64
บทสรป
ในบทนไดกลาวถงขนตอนในการเขยนโปรแกรม สญลกษณผงงาน รหสเทยม การวเคราะหผงงาน การตรวจสอบขอผดพลาดของโปรแกรม และโครงสรางการควบคมโปรแกรม
ขนตอนการเขยนโปรแกรมคอมพวเตอรเปนขนตอนทสาคญเพอใหการเขยนโปรแกรมถกตองตามความตองการและเพอใหมประสทธภาพทดทสด ขนตอนการเขยนโปรแกรมมหลากหลายวธดงเชนรปแบบของวธการแบบจาลองนาตก ซงเปนวธการหนงเขาใจงายและทนยมใชในปจจบนซงทาใหสามารถเขยนโปรแกรมไดอยางมประสทธภาพมากยงขน สญลกษณผงงานเปนเครองมออกแบบหนงทใชรปภาพ แสดงถงขนตอนในการเขยนโปรแกรม หรอขนตอนในการแกปญหาทละขน และมเสนทแสดงทศทางการไหลของขอมลตงแต จดเรมตน จนกระทงจดสนสดของโปรแกรมหรอผลลพธของโปรแกรม ใชเปนโครงรางกอนการเขยนโปรแกรมคอมพวเตอร เพอสามารถเหนภาพของการแกปญหาไดอยางชดเจนและเขาใจงายยงขน รหสเทยมคอรหสจาลองทใชเปนตวแทนของขนตอนวธทใชในภาษาการเขยนโปรแกรมทวไป โดยจะแสดงขนตอนวธการทใชภาษาเขยนทเขาใจงาย โดยมถอยคาหรอประโยคคาสงทเขยนอยในรปแบบของภาษาองกฤษหรอภาษาไทยกได ขนอยกบความสะดวกของผ เขยนโปรแกรม
การวเคราะหผงงานเปนการวเคราะหถงปญหาซงเปนการศกษาถงลกษณะและรายละเอยดตางๆ ทเกยวของสาหรบการเขยนโปรแกรมทงหมดตงแตอนพตจนถงเอาตพต และวธการประมวลผลตางๆ เพอใหผ เขยนโปรแกรมสามารถมองเหนปญหาไดงายขนและสามารถนาไปเขยนโปรแกรมประยกตใชงานจรงไดอยางมประสทธภาพ การตรวจสอบขอผดพลาดของโปรแกรมเปนกระบวนการตรวจสอบความผดพลาดของโปรแกรมเมอโปรแกรมเสรจสนตามทตองการเพอใหไดโปรแกรมทถกตองและมประสทธภาพทสดซงโปรแกรมทกโปรแกรมจะตองไดรบการตรวจสอบขอผดพลาดตางๆ กอนวา มขอผดพลาดในโปรแกรมหรอไม โครงสรางการควบคมโปรแกรมเปนการควบคมลาดบของการเขยนโปรแกรมใหดาเนนการตามงานทตองการซงโครงสรางการควบคมโปรแกรมมหลายโครงสรางดงเชนโครงสรางการควบคมโปรแกรมแบบลาดบ โครงสรางการควบคมโปรแกรมแบบเงอนไข โครงสรางการควบคมโปรแกรมแบบวนซา โครงสรางการควบคมโปรแกรมแบบกระโดด ซงในแตละโครงสรางกจะสามารถนาไปประยกตเพอแกปญหาในการเขยนโปรแกรมตางๆ ไดอยางมประสทธภาพ
บทท 2 หลกการเขยนโปรแกรมคอมพวเตอรพนฐาน
65
แบบฝกหดทบทวน
1. สญลกษณผงงานคออะไร และมประโยชนอะไร จงอธบาย 2. ขอแตกตางระหวางสญลกษณผงงานและรหสเทยมคออะไร จงอธบาย 3. จงอธบายขนตอนในการเขยนโปรแกรมตามแบบจาลองนาตก และจงอธบายขนตอนในแตละขน
4. จงเขยนรหสเทยมของโปรแกรมในการหาพนทของวงกลม
5. จงเขยนผงงานของโปรแกรมในการแปลงสกลเงนบาทเปนเงนดอลลาร และแปลงสกลเงนดอลลารเปนเงนบาท
6. จงเขยนผงงานของโปรแกรมในการแปลง พ.ศ. เปน ค.ศ. และแปลง ค.ศ. เปน พ.ศ.
7. จงเขยนผงงานของโปรแกรมในการแปลงนาทเปนชวโมงและใหแสดงนาททเหลอ 8. จงเขยนผงงานของโปรแกรมในการคานวณหาพนทของรปดงน
a
b โดยคานวณจากสมการ
½ * a * b * sin
9. จงเขยนผงงานของโปรแกรมในการตดเกรดของนกศกษา 10. จงเขยนผงงานของโปรแกรมในการบวกเลขคตงแตเลข 1 ถง 100
11. จงเขยนผงงานของโปรแกรมในการแสดงเลขคทหนาจอภาพตงแตเลข 1 ถง 100
12. จงเขยนผงงานของโปรแกรมในการแสดงชอของนกศกษาจานวน 100 ครง
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
บทท 3
ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
ในบทนจะกลาวถงประวตความเปนมาของภาษาซ (History of C Language)
ขนตอนของการทางานของภาษาซ (Procedure of C Language) โครงสรางของภาษาซ (Structure of C Language) และองคประกอบพนฐานของภาษาซ (Basic Element of C
Language) ในการเขยนโปรแกรมภาษาซจะตองรจกสวนตางๆ ของภาษาซเพอใหสามารถใชงานโปรแกรมไดอยางมประสทธภาพ ซงภาษาซกเปรยบเสมอนภาษาหนงดงทเราใชงานกนในยคปจจบน ดงนนในการทเราจะสามารถทางานกบภาษาซไดจาเปนตองศกษากระบวนการตางๆ โครงสรางตางๆ และองคประกอบตางๆ เสยกอน จงจะสามารถนาไปเขยนโปรแกรมไดอยางถกตองและมประสทธภาพ ในบทนจะเปนบทพนฐานทจะนาไปสการเขยนโปรแกรมภาษาซในระดบทสงขน
3.1 ประวตความเปนมาของภาษาซ (History of C Language)
ภาษาซ (C) เปนภาษาโปรแกรมบนคอมพวเตอรระดบสง พฒนาขนเมอ พ.ศ.
2515 (ค.ศ. 1972) โดย เดนนส รตช (Dennis Ritchie) มวตถประสงคเพอสรางระบบปฏบตการยนกซในขณะนน ซงในขณะนนการใชงานภาษาซยงไมนยมแพรหลายเหมอนเชนในปจจบน ตอมาเมอ พ.ศ. 2521 (ค.ศ. 1978) เดนนส รตช และไบรอน เคอรนกน (Brian
Kernighan) พฒนามาตรฐานของภาษาซขนมา และไดตพมพหนงสอเลมแรกชอ การเขยนโปรแกรมภาษาซ (The C Programming Language) ซงเปนทรจกในกลมของนกเขยนโปรแกรมหรอโปรแกรมเมอรภาษาซวา "เคแอนดอาร" (K&R Kernighan&Rtchie) หนงสอเลมนทาหนาทเปนขอกาหนดของภาษาอยางไมเปนทางการมาหลายป ตอมาภาษาซเรมไดรบความนยมมากขน จงไดเกดภาษาซในหลากหลายรปแบบ ดงนนในป พ.ศ. 2531 (ค.ศ. 1988)
เดนนส รตช และไบรอน เคอรนกน ไดรวมมอกบสถาบนมาตรฐานแหงชาตของสหรฐอเมรกา
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
68
หรอแอนซ (American National Standards Institute: ANSI) สรางมาตรฐานของภาษาซขนมา ซงเรยกวาแอนซ ซ (ANSI C) เพอใชเปนตวกาหนดมาตรฐานการสรางภาษาซรนถดไป
นอกจากภาษาซออกแบบขนมาเพอสรางซอฟตแวรระบบแลว ภาษาซยงสามารถใชอยางแพรหลายเพอพฒนาซอฟตแวรประยกตอนๆ อกดวย ปจจบนภาษาซเปนภาษาทไดรบความนยมสงและมการพฒนาขนมาอยางตอเนองดงเชนภาษาซพลสพลส (C++) และ ภาษาซเสมอน (Visual C++) เปนตน
ผลจากการยอมรบในวงกวางและประสทธภาพของทดภาษาซ ทาใหตวแปลโปรแกรม
ตวแปลคาสง ไลบรารตางๆ ของภาษาอน กจะพฒนามาจากภาษาซ ภาษาซเปนภาษาทมประสทธภาพสงจงเหมาะสาหรบคอมพวเตอรเพองานคานวณและวทยาศาสตร เนองจากความสนเปลองตา อยางไรกตามในปจจบนภาษาซเหมาะสาหรบการสรางโปรแกรมประยกตตางๆ ของผ ใชเอง แตเมองานประยกตทมขนาดใหญขนการพฒนาดวยภาษาซอาจจะกระทาไดไมสะดวกนก จงอาจจะสรางโปรแกรมดวยภาษาอนๆ ทพฒนามาจากภาษาซดงเชนภาษา ซพลสพลส (C++) และภาษาซชารป (C#) ซงมโครงสรางของภาษาทเหมอนกน ทาใหสามารถศกษาภาษาไดโดยงาย ภาษาซเปนภาษาทเหมาะสมกบการเรมตนการเขยนโปรแกรมและสามารถนาไปเขยนโปรแกรมภาษาระดบสงได
3.2 ขนตอนการทางานของภาษาซ (Procedure of C Langauge)
ขนตอนในการเขยนโปรแกรมภาษาซมทงหมด 4 กระบวนการ ไดแกขนตอนการเขยนโปรแกรมหรอเขยนรหสตนฉบบ (Source Code) ขนตอนการแปลโปรแกรม (Compile)
ขนตอนการเชอมโยงโปรแกรม (Link) และขนตอนการประมวลผลโปรแกรม (Run) ซงเมอไดทาการประมวลผลโปรแกรมแลวจะไดรหสกระทาการ (Execute Code) ดงแสดงในรปท 3.1
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
69
รปท 3.1 ขนตอนการทางานของภาษาซ
3.2.1 ขนตอนการเขยนโปรแกรม (Source Code)
ขนตอนการเขยนโปรแกรมเปนกระบวนการเขยนโปรแกรมในโปรแกรมบรรณาธกร (Edit Program) ตางๆ ซงเราอาจจะเขยนโปรแกรมในโปรแกรมบรรณาธกรตางๆ ได เชนโปรแกรม Notepad โปรแกรม TextPad หรอโปรแกรม EditPlus เปนตน หรอจะเขยนในหนาตางบรรณาธกรของโปรแกรมภาษาซกไดดงเชนโปรแกรมภาษาเทอรโบซพลสพลส (Turbo C++) หรอในโปรแกรม ไมโครซอฟตวชวลสตดโอ (Microsoft Visual Studio) หลงจากทไดเขยนโปรแกรมแลวใหทาการบนทกไฟลใหมนามสกลเปน .c เชน Hello.c หรอ Test.c เปนตน ตวอยางของการเขยนโปรแกรมแสดงดงรปท 3.2 รปท 3.3 และรปท 3.4
รปท 3.2 การเขยนโปรแกรมภาษาซในโปรแกรม Notepad
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
70
รปท 3.3 การเขยนโปรแกรมในโปรแกรมภาษาเทอรโบซพลสพลส
รปท 3.4 การเขยนโปรแกรมในโปรแกรม Microsoft Visual Studio
3.2.2 ขนตอนการแปลโปรแกรม (Compile)
ขนตอนการแปลโปรแกรมเปนขนตอนในการแปลภาษาระดบสงใหเปนภาษาทเครองคอมพวเตอรสามารถเขาใจไดและพรอมทจะนาไปใชงาน โดยในขนตอนนจะดาเนนการตรวจสอบรหสตนฉบบ (Source Code) เพอดวามขอผดพลาดหรอไม ถามจะทาการแจงเตอนขอผดพลาดใหผ ทาการเขยนโปรแกรมทราบ เพอทใหผ ทาการเขยนโปรแกรมไดทาการแกไข หากไมพบขอผดพลาดกจะดาเนนการแปลรหสตนฉบบเปนภาษาเครองทมนามสกล .obj เชน
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
71
ถาไฟลรหสตนฉบบชอ Doctor.c กจะถกแปลและจะจดเกบรหสทไดทาการแปลในชอไฟล Doctor.obj ในการแปลโปรแกรม ตวแปลโปรแกรมของภาษาซจะทาการแปลรหสตนฉบบทงหมด แตในบางครงเราสามารถทาการแปลทละคาสงไดในขณะใชโปรแกรมตรวจแกจดบกพรอง (Debugger) เพอตรวจสอบความถกตองของโปรแกรม การแปลทงโปรแกรมเราจะเรยกวาการแปลโปรแกรมหรอเรยกวาการคอมไพล (Compile) สวนการแปลทลาบรรทดเราเรยกวาตวแปลคาสงหรออนเทอรพรเตอร (Interpreter) ตวอยางการแปลโปรแกรมแลวมขอผดพลาดแสดงดงรปท 3.5 ซงจะประกอบไปดวยขอผดพลาด (Error) โดยจะมขอความบอกความผดพลาดทเกดขนวาขอผดพลาดเกดจากอะไร
รปท 3.5 การแปลโปรแกรมรหสตนฉบบแลวมขอผดพลาด
3.2.3 ขนตอนการเชอมโยงโปรแกรม (Link)
ขนตอนการเชอมโยงโปรแกรมเปนขนตอนของการเชอมโยงสวนตางๆ ของโปรแกรมเขาดวยกน ในการเขยนโปรแกรมภาษาซผ เขยนโปรแกรมไมจาเปนตองเขยนโปรแกรมทกขนตอนขนมาใหมหมด แตอาจจะใชในสงทมอยแลวของผ อน หรอของโปรแกรมทเตรยมไวดงเชนฟงกชนตางๆ ทเรยกใชงาน ดงนนเมอจะกระทาการประมวลผลโปรแกรมกจะดาเนนการเชอมโยงโปรแกรมทงหมดเขาดวยกนกอนเพอใหสามารถทางานรวมกนไดและพรอมทจะนาไปประมวลผลตอไป การเชอมโยงโปรแกรมในโปรแกรมภาษาซเมอมการประมวลผลโปรแกรมจะสามารถดาเนนการเชอมโยงโดยอตโนมตเพอใหพรอมในการทางาน ตวอยางในการเชอมโยงโปรแกรมดงเชนในโปรแกรมไดมการใชคาสง printf() เพอแสดงขอความตางๆ ออกทาง
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
72
หนาจอภาพ ซงจะเปนฟงกชนในภาษาซทมอยแลว เพยงแตมการเรยกใชงานกจะสามารถเรยกใชงานไดโดยงายซงจาเปนตองมการเชอมโยงกบโปรแกรมของเรากบฟงกชนทมอยในภาษาซ ใหสามารถนาไปใชงานได
รปท 3.6 ตวอยางการดาเนนการเชอมโยงขอมล
3.2.4 ขนตอนการประมวลผลโปรแกรม (Run)
ขนตอนการประมวลผลโปรแกรมเปนขนตอนของการทางานของโปรแกรมซงจะสงผลใหไดผลลพธทไดเขยนโปรแกรมไวออกมา ซงอาจจะเปนผลลพธทแสดงผลทหนาจอภาพ หรอเปนผลลพธของการคานวณคาตางๆ ดงตวอยางของผลลพธทเกดจากการประมวลผลโปรแกรมของการบวกเลขในรปท 3.7
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
73
รปท 3.7 ตวอยางผลลพธจากการประมวลผลของโปรแกรม
3.3 โครงสรางพนฐานของภาษาซ (Basic Structure of C Language)
โครงสรางพนฐานของภาษาซประกอบดวย 4 สวน พนฐาน คอสวนหวของโปรแกรม
(Preprocessing Directives) สวนประกาศตวแปร (Variable Declaration) สวนฟงกชน
(Function) และสวนของรายละเอยดโปรแกรมหรอคาสงโปรแกรม (Program Statement) ซงโครงสรางพนฐานทง 4 สวน เปนสวนทจาเปนพนฐานทจะทาใหสามารถเขยนโปรแกรมได ดงตวอยางแสดงดงรปท 3.8
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
74
รปท 3.8 โครงสรางการเขยนโปรแกรมพนฐานของภาษาซ
3.3.1 สวนหวของโปรแกรม (Preprocessing Directives)
สวนหวของโปรแกรมเปนสวนทใชระบเพอบอกใหตวแปลโปรแกรมหรอคอมไพเลอรนาเอาไฟลสวนหว (Header File) เขารวมการแปลโปรแกรมดวย ดงเชนการใชงานบางฟงกชนของภาษาซถาเราไมไดมการประกาศไฟลสวนหว เรากจะไมสามารถใชงานฟงกชนนนได
ตวอยางของตวชแนะหรอไดเรกทพ (Directive: #) ทใชบอยคอ include โดยคาสงนใชในการระบไฟลสวนหว สามารถเขยนได 2 รปแบบคอ
#include <ชอไฟลสวนหว> รปแบบนจะทาการคนหาไฟลสวนหวตามทระบชอไวในสารบบหรอไดเรคทอร ทใชเกบไฟลสวนหวเฉพาะ โดยปกตจะเกบไวในไดเรคทอรชอ “Include” เชน
#include <stdio.h>
#include <conio.h>
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
75
#include ”ชอไฟลสวนหว” รปแบบนจะทาการคนหาไฟลสวนหวตามทระบชอไวในไดเรคทอรเดยวกนกบไฟลของโปรแกรม ซงถาไมพบจะไปคนหาจากสวนทเกบไฟลสวนหวเฉพาะ เชน
#include “stdio.h”
#include “conio.h”
#include “c:\tc\include\stdio.h”
3.3.2 สวนประกาศตวแปร (Variable Declaration)
สวนประกาศตวแปรเปนสวนทแจงใหตวแปลภาษาทราบวาเราตองการใชตวแปรใดในการแทนขอมล ขอมลทใชเปนขอมลชนดใด (Data Type) โดยเขยนอยในรปแบบดงน
ชนดขอมล (data_type) ชอตวแปร (variable_name);
ดงเชน
int number;
float image;
int a,b,c,d;
สวนประกาศตวแปรสามารถประกาศตวแปรไดทงแบบตวแปรสวนกลาง (Global
Variable) และการประกาศตวแปรเฉพาะท (Local Variable) โดยตวแปรสวนกลางเปนการประกาศตวแปรขนมาแลวสามารถใชทกสวนของโปรแกรม สามารถใชไดทงฟงกชนหลก และฟงกชนอนๆ ของโปรแกรม สวนตวแปรเฉพาะทเปนการประกาศตวแปรขนมาใชในเฉพาะสวนของโปรแกรม เฉพาะเจาะจงของโปรแกรม ตวอยางการประกาศตวแปร แสดงดงในรปท 3.8
3.3.3 สวนฟงกชน (Function)
ในโปรแกรมภาษาซอยางนอยตองม 1 ฟงกชนจงจะสามารถทางานไดนนคอฟงกชนหลก (Main Function) ซงแสดงวาทกโปรแกรมทเขยนขนโดยภาษาซจะตองมฟงกชนหลกอยเสมอ แตอยางไรกตามในภาษาซกมสวนของฟงกชนอนๆ เชนฟงกชนของโปรแกรมทสรางขนมา ฟงกชนของโปรแกรมทมอยแลวในภาษาซ เปนตน โดยปกตการเขยนโปรแกรมในปจจบนจะมหลายฟงกชน เปรยบเสมอนกบการแบงกลมทางาน โดยแตละกลมกจะทางานของตนเองเมอทางานเสรจกจะสงคาคนไปประมวลผลตอไป ตวอยางของการเขยนฟงกชน
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
76
แสดงในรปท 3.9 ซงจะประกอบไปดวยฟงกชนหลก ฟงกชนยอยทสรางขนมา และฟงกชนทมอยแลวในภาษาซ ในภาษาซจะตองมฟงกชน main() อยเสมอซงกคอฟงกชนหลกของโปรแกรมโดยจะมขอบเขตของการเขยนโปรแกรมเรมตนและสนสดทเครองหมาย { และ }
#include <stdio.h>
void menu(void) //ฟงกชนยอย { printf(“\n”); printf(“[1] Bangkok\n”); printf(“[2] Chiang Mai\n”); printf(“Select : “); }
void main(void) //ฟงกชนหลก {//void ตวแรกไมคนคากลบออกไปจากฟงกชน void ตวทสองไมรบคาเขามาในฟงกชน
int a; do { menu();
scanf(“%i”,&a); //ฟงกชนทมอยแลวในภาษาซ } while((a!=1)&&(a!=2)); if(a==1)
printf("Bangkok\n"); //ฟงกชนทมอยแลวในภาษาซ else
printf("Chiang Mai\n"); //ฟงกชนทมอยแลวในภาษาซ }
รปท 3.9 ตวอยางรปแบบของฟงกชนในภาษาซ
3.3.4 สวนของรายละเอยดโปรแกรมหรอคาสงโปรแกรม (Program Statement)
สวนของรายละเอยดโปรแกรมหมายถงสวนของคาสงตางๆ ทสงใหคอมพวเตอรทางาน สงเกตดวาสวนของคาสงตางๆ ทถกเขยนขนในภาษาซจะมเครองหมายอฒภาค (Semicolon) อยทายคาสงตางๆ อยเสมอ เนองจากในภาษาซจะถอวาเปนจดสนสดของคาสง ดงนนในการเขยนคาสงของโปรแกรมตางๆ ในภาษาซจะตองมเครองหมายอฒภาคอยทายคาสงเสมอ ไมอยางนนแลวโปรแกรมจะไมสามารถทางานได สวนของรายละเอยดโปรแกรมหรอคาสงแสดงตวอยางดงรปท 3.10 ซงเปนโปรแกรมตดเกรดนกศกษา
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
77
#include <stdio.h> void main(void) { int score; scanf("%i",&score); if(score <50) { printf("F"); } else if(score < 60) { printf("D"); } else if(score < 70) { printf("C"); } else if(score < 80) { printf("B"); } else { printf("A"); } }
รปท 3.10 สวนของโปรแกรมตดเกรดนกศกษา
3.4 องคประกอบพนฐานของภาษาซ (Basic Element of C Language)
องคประกอบของภาษาซเปนสวนขององคประกอบตางๆ ของภาษาซ เพอใชในการเขยนโปรแกรม ในหวขอนจะกลาวถงองคประกอบพนฐานในภาษาซ องคประกอบเหลานเปนองคประกอบเบองตน ทจะใชในการเขยนโปรแกรมภาษาซดงเชนคาและสญลกษณ และตวแปรและชนดของขอมลเปนตน ซงจะเปนพนฐานในการเขยนโปรแกรมในระดบถดไป
3.4.1 คาและสญลกษณ
คาและสญลกษณ คอสงทตวแปลโปรแกรมสามารถเขาใจและทาการตความเปนภาษาระดบตาตอไปได ดงนนถาเราเขยนโปรแกรมทไมถกตองตามทกาหนดไว กจะเกดความผดพลาด (Error) ขณะทาการแปลโปรแกรม ในภาษาซเราสามารถแบงคาและสญลกษณออกเปนประเภทตางๆ ดงน
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
78
หมายเหต (Comment)
คอสวนของหมายเหตหรอคาอธบายของโปรแกรม ในบางครงในการเขยนโปรแกรมเราอาจตองการเขยนคาอธบายสวนของโปรแกรมเพอใหสามารถจดจาไดงาย เมอตองการแกไขโปรแกรม เมอเจอสวนของหมายเหต ตวแปลภาษาจะขามการแปลผลคาสงในสวนนไป
ซงเราสามารถนามาใชในการจากดการทางานของโปรแกรมบางสวนในกรณทเขยนโปรแกรมแลวไมตองการลบคาสงโปรแกรมคาสงบางสวนทง เรากสามารถใชสวนของหมายเหตในการดาเนนการได ในภาษาซสวนของหมายเหตมวธการ 2 แบบคอ
แบบท 1 หมายเหตแบบบรรทดเดยว จะใชเครองหมาย // สวนทหมายเหต
แบบท 2 หมายเหตแบบหลายบรรทด จะใชเครองหมาย /* สวนทหมายเหต */
#include <stdio.h> void main(void) { int a,b,c; //Variable Declaration : a,b,c is Integer printf("Input a"); scanf("%i",a); /*printf("Input b"); หมายเหตแบบหลายบรรทด
scanf("%i",&b);
c = a*b;*/
c = a*a; //printf("Result=%i",c); หมายเหตแบบบรรทดเดยว }
รปท 3.11 การหมายเหตโปรแกรม
จากโปรแกรมในรปท 3.11 เมอมการประมวลผลโปรแกรมจะเปรยบเสมอนการประมวลผลคาสงเฉพาะบางคาสง ดงแสดงในรปท 3.12
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
79
#include <stdio.h> void main(void) { int a,b,c; printf("Input a"); scanf("%i",&a);
c = a*a;
}
รปท 3.12 ผลของการหมายเหตโปรแกรม
ประโยชนของหมายเหตคอ 1) ใชเขยนกากบวาบรรทดหรอชดคาสงของโปรแกรมวาทาหนาทอะไร มความพเศษตรงไหน
2) ใชในการทบทวนความทรงจาและแจงใหทราบในการเขยนโปรแกรม ถามการเขยนบอกวา บรรทดนใชทาอะไร ตวแปรนคออะไร เวลากลบมาดโปรแกรมนอกรอบจะไดจาไดงายขน
หรอถาสงโปรแกรมทเขยนขนมาไปใหผ อน คนทไดรบโปรแกรมกจะทราบวาบรรทดนใชทาอะไร ตวแปรนคออะไร โดยสะดวก
3) ใชกาจดบรรทดทไมตองการใหทางาน เชนไมตองการบรรทดไหนใหประมวลผลกใหใสหมายเหตสงผลทาใหโปรแกรมในสวนนนไมถกแปลคาสง
ตวระบชอ (Identifier)
ในภาษาซจะมการตงชอใหกบสงตางๆ มากมายเชน ตงชอใหกบตวแปร ตงชอใหกบฟงกชน ซงการตงชอใด ๆ จะองตามกฎการตงชอมดงน
ตองไมซากบคาหลก (Keyword) ทมอยของโปรแกรมภาษาซ ประกอบดวยอกษร A-Z, a-z, 0-9, _ เทานน หามมเปนสญลกษณอน ๆ ปนอย ตวอกษรตวแรกของการตงชอหามเปนตวเลข ตวอกษรตวเลกตวใหญในภาษาซจะเปนคนละชอกน (Case-Sensitive) เชน Book
และ book ซงถอวาเปนคนละชอกน
การตงชอจะเวนวรรคไมได (ชองวางภายในชอ) ไมควรตงชอทขนตนดวย _ (ถงแมวาจะทาได)
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
80
คาหลก (Keyword)
คาหลกเปนชอทมอยแลวและเปนชอทสงวนไวใชงานอยแลว ดงนนคาหลกในทนคอชอทหามตงเชน
auto break case char const continue default do
double else enum extern float For goto If
int long register return short Signed sizeof static
struct switch typedef union unsigned Void volatile while
คาคงท (Constant)
คาคงทคอคาทสามารถเปนไปไดในภาษาซ คาคงทเปนคาทไมสามารถเปลยนแปลงไดขณะประมวลผลโปรแกรม คาคงทมหลากหลายชนดดงเชนคาของเลขจานวนเตม คาของจานวนเลขทศนยม และคาของตวอกขระ เปนตน คาคงทพนฐานของภาษาซไดแก คาคงทเปนเลขจานวนเตม คาคงททเปนเลขทศนยม คาคงททเปนตวอกษร คาคงททเปนขอความ และคาคงททเปนสญลกษณตางๆ เปนตน
จานวนเตม (Integer)
คอคาของเลขจานวนเตมบวกและจานวนเตมลบ การเขยนเลขจานวนเตมในภาษาซมขอกาหนดสาหรบการเขยน ซงขอกาหนดในการเขยนเลขจานวนเตมมดงน
1) ถาตองการเขยนเลขฐานสบสามารถเขยนไดเลย แตหามมศนยนาหนา เชน
1235 หมายถง หนงพนสองรอยสามสบหา 4324 หมายถง สพนสามรอยยสบส
2) ถาตองการเขยนเลขฐานแปดใหนาหนาดวยเลขศนย เชน
0123 หมายถง หนงรอยยสบสามฐานแปด
0765 หมายถง เจดรอยหกสบหาฐานแปด 3) ถาตองการเขยนเลขฐานสบหกใหนาหนาดวย 0x หรอ 0X เชน
0XAB93 หรอ 0xab93 (อกษรภาษาองกฤษตวเลกตวใหญไมมผล) หมายถง เอบเกาสามฐานสบหก
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
81
4) สามารถมเครองหมายตดลบขางหนาได ถาไมใสถอวาเปนเลขบวก เชน
-1234 หมายถง ตดลบหนงพนสองรอยสามสบส -01234 หมายถง ตดลบหนงสองสามสฐานแปด
-0x1234 หมายถง ตดลบหนงสองสามสฐานสบหก 5) จานวนเตม (Integer) คอจานวนเตมทมคาระหวาง -32768 ถง +32767 ใชหนวยความจา 16 บต ตวอยางเชน
1234 ถกตองตามหลกการเขยนเลขจานวนเตม
-1234 ถกตองตามหลกการเขยนเลขจานวนเตม
64321 ไมถกตอง เพราะคาทเขยนไวเกน 32767
-74321 ไมถกตอง เพราะคาทเขยนไวเกน -32768
6) จานวนเตมไมคดเครองหมาย (Unsigned Integer) คอจานวนเตมทมคาระหวาง 0 ถง 65535 ใชหนวยความจา 16 บต
7) จานวนเตมแบบยาว (Long Integer) คอจานวนเตมทมคาระหวาง -2147483648
ถง 2147483647 ใชหนวยความจา 32 บต
8) จานวนเตมแบบยาวไมคดเครองหมาย (Unsigned Long Integer) คอจานวนเตมทมคาระหวาง 0 ถง 4294967295 ใชหนวยความจา 32 บต
ทศนยม (Floating Point)
ทศนยมคอเลขทมคาทศนยม มคายอยของเลขจานวนเตม การเขยนทศนยมในภาษาซมขอกาหนดสาหรบการเขยนดงน
1) วธเขยนแบบปกตคอระบคาทศนยมทตองการเลย เชน
123.4 หมายถง หนงรอยยสบสามจดส .123 หมายถง ศนยจดหนงสองสาม
0.123 หมายถง ศนยจดหนงสองสาม
2) วธเขยนแบบวทยาศาสตร คอตวเลขทศนยมนนถกคณดวย 10n เขยนแทนดวย en
หรอ Enโดยทเราเปนคนระบคา n น เชน
1.57E1 หมายถง 1.57 x 101 = 15.75
1.575e-2 หมายถง 1.57 x 10-2 = 0.01575
25E-4 หมายถง 25 x 10-4 = 0.0025
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
82
3) สามารถมเครองหมายตดลบขางหนาได ถาไมระบถอวาเปนเลขบวก 4) เลขทศนยม (Floating point) คอเลขทศนยมมขนาดไดมากสดไดคอ [+/–]
3.40282e+38 มขนาดไดเลกสดคอ [+/–] 3.40282e-38 ใชหนวยความจา 32 บต
5) ทศนยมความละเอยดสองเทา (Double Precision Floating Point) คอทศนยมปกต ไมตองมอกษรตอทาย มขนาดไดมากสดคอ [+/–] 1.79769e+308 มขนาดไดเลกสดคอ [+/–]1.79769e-308 ใชหนวยความจา 64 บต
6) ทศนยมความละเอยดสองเทาแบบยาว (Long Double Precision Floating
Point) คอทศนยมทมขนาดไดมากทสดคอ [+/–] 1.18973e+4932 มขนาดไดเลกสดคอ [+/–] 3.3621e-4932 ใชหนวยความจา 80 บต
ตวอกขระหรอตวอกษร (Character)
ตวอกษรคอตวอกขระภาษาองกฤษ ตวเลข และสญลกษณตางๆ ซงขอกาหนดการเขยนอกษรในภาษาซมดงน
1) ตวอกษรตองมเพยงตวอกษรเดยว เปนอกษรทมอยในตารางแอสก หรอรหสมาตรฐานของสหรฐอเมรกาเพอการสบเปลยนสารสนเทศ (American
Standard Code for Information Interchange: ASCII) และตองอยระหวางเครองหมาย ' ' เทานน ตวอยางเชน
'a' หมายถง อกษรเอเลก 'A' หมายถง อกษรเอใหญ
'aA' ไมถอวาเปนอกขระเพราะมจานวนตวอกขระมากกวา 1 ตว 2) สามารถ เ ขยนอกษรในแบบเลขฐานสบหกไ ด (Hexadecimal-Escape-
Sequence) คอ ขนตนดวย \x ตามดวยเลขฐานสบหก ตวอยางเชน
'\x41' เลข 41 เปนฐานสบหกแปลงเปนฐานสบได 65 เมอไปเปดดในตาราง แอสกอกษรลาดบท 65 คออกษร A
'\x61' เลข 61 เปนฐานสบหกแปลงเปนฐานสบได 97 เมอไปเปดดในตาราง แอสก อกษรลาดบท 97 คออกษร a
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
83
3) สามารถเขยนอกษรในแบบเลขฐานแปดได (Octal-Escape-Sequence) คอ \ ตามดวยเลขฐานแปดสามหลก (ถาไมถงสามหลกใหเตมศนย) '\141' เลข 141 เปนฐานแปดแปลงเปนฐานสบได 97 เมอไปเปดดในตาราง แอสก อกษรลาดบท 97 คออกษร a
'\077' เลข 077 เปนฐานแปดแปลงเปนฐานสบได 63 เมอไปเปดดในตาราง แอสก อกษรลาดบท 63 คออกษร ?
4) มอกษรพเศษอยกลมหนง มไวเพอควบคมการทางานของคอมพวเตอร จะไมแสดงอกษรใด ๆ ออกมาทางหนาจอทงสน เรยกวา “Escape Sequence” ซงมรายละเอยดดงตารางท 3.1
ตารางท 3.1 อกษรพเศษ
Escape Sequence Represents
\a Bell (alert) เสยงระฆง \b Backspace เลอนกลบ
\f Form feed ขนหนาใหม
\n New line ขนบรรทดใหม
\r Carriage return เคอเซอรกลบไปตนบรรทด
\t Horizontal tab เวนระยะในแนวระดบ
\v Vertical tab เวนระยะในแนวตง \' Single quotation mark การกดเครองหมาย \ \\ Backslash การกดเครองหมาย \\ \? Literal question mark การกดเครองหมาย ?
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
84
5) อกษรแตละอกษรจะกนหนวยความจา 8 บต (มคาระหวาง 0 ถง 255) และเวลาเกบจรงจะเกบเปนตวเลขเสมอ โดยองตวเลขทจะเกบตามตารางแอสก ดงนนเราสามารถนาเอาอกษรมาบวก ลบ คณ หารกนไดตามปกต (เพราะอกษรคอตวเลข) เชน
'A' + 12 เมอเปดตารางแอสกปรากฏวาอกษร A เปนอกษรลาดบท 65 (มคา 65)
ดงนน 'A' + 12 จงหมายถง 65 + 12
'A' + 'a' เมอเปดตารางแอสกปรากฏวาอกษร A เปนอกษรลาดบท 65 (มคา 65)
และอกษร a เปนอกษรลาดบท 97 ดงนน 'A' + 'a' จงหมายถง 65 + 97
สายอกขระหรอขอความ (String)
ขอความคอการนาเอาอกขระหลายๆ ตวมาเรยงตอกน ภายใตเครองหมาย " "
ตวอยางเชน “cmu” , “Chula”, “Kmitl” และ “Kmutt”
คาความจรง (Boolean)
คาความจรงในภาษาซ จะถอวา 0 เปนเทจ อยางอนเปนจรงหมด เชน
-1 ถอวาเปนจรง 19 – 7 ถอวาเปนจรง 18 – (10 + 8) ถอวาเปนเทจ 'A' – 65 ถอวาเปนเทจ 'a' – 'A' ถอวาเปนจรง
สญลกษณ (Symbol)
เครองหมายและสญลกษณทสามารถใชไดในภาษาซดงเชน # ~ ! % ^ & * - = + | < > /
, : ; . ( ) { } [ ] เปนตน ดงนนการทจะเรมตนเขยนโปรแกรมภาษาซจาเปนทจะตองรจกความหมายของสญลกษณตางๆ ในภาษาซ จงจะดาเนนการเขยนโปรแกรมโดยไมมขอผดพลาด ซงสญลกษณตางๆ ในภาษาซจะไดกลาวในบทถดไป ตวอยางของการใชงานสญลกษณแสดงดงรปท 3.13
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
85
#include <stdio.h> void main(void) {
int a,b,c; printf("Input a"); scanf("%i",&a); printf("Input b");
scanf("%i",&b); c = a*b; }
รปท 3.13 สญลกษณตางๆ ทปรากฏในโปรแกรม
3.4.2 ตวแปรและชนดของขอมล ตวแปร (Variables) คอสงทกาหนดขนมาเพอใชในการเกบขอมล ซงการประกาศตว
แปรตางๆ มหลกการทไดกลาวในหวขอท 3.4.1 การประกาศตวแปรเปนสวนทจาเปนเนองจากหากไมมการประกาศตวแปรขนมากจะไมสามารถเกบขอมลได การประกาศตวแปรขนมากสามารถประกาศไดวาเปนการประกาศตวแปรชนดไหน ชนดของขอมล (Data Type) คอสงทใชในการกาหนดลกษณะขอบเขตของขอมล ซงขอมลมหลากหลายชนด และมลกษณะทแตกตางกนไป ดงเชนขอมลตวอกษร ขอมลตวเลข และขอมลตวเลขทศนยมเปนตน ในสวนรายละเอยดของตวแปรและชนดของขอมลตางๆ จะกลาวถงในบทถดไป
ขอควรทราบของการใชตวแปรในภาษาซคอ ตองมการบอกใหตวแปลภาษา (Compiler) ทราบกอนวาตวแปรแตละตวนนใชเกบ
คาคงทแบบไหน (ดงเชน จานวนเตม ทศนยม อกษร ขอความ คาความจรง) เรยกวาการประกาศตวแปร (Variable Declaration) ดงแสดงตวอยางในรปท 3.14
#include <stdio.h> #include <conio.h> void main(void) { clrscr(); int a,b,c; //การประกาศตวแปร a = 3; //หลงจากมการประกาศตวแปรแลวจงจะสามารถใชงานตวแปรได
b = 6; c = a + b; printf("c = %i \n",c); }
รปท 3.14 การประกาศตวแปร
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
86
เ มอตวแปลภาษาทางานมาจนถงบรรทดทประกาศตวแปร กจะทาการจองหนวยความจาขนาดเทากบขอมลทจะเกบ เชนถาจะใชตวแปรนเกบจานวนเตม ตวแปรตวนกจะจองหนวยความจาขนาด 16 บต ไว
การทางานของภาษาซจะทางานจากบนลงลาง (ทาประโยคท 1 เสรจแลวคอยทาประโยคท 2 เสรจแลวตอดวยประโยคท 3 ตอเนองไปจนเสรจสน) ดงนนควรประกาศตวแปรไวสวนตนของโปรแกรม ซงจะทาใหตวแปรทไดประกาศไวจะสามารถใชไดทงโปรแกรม ดงตวอยางทแสดงในรปท 3.14 ซงเปนประกาศตวแปรไวในสวนตนของโปรแกรม ดงนนในโปรแกรมนจงสามารถใชตวแปรนไดทกสวนหลงจากการประกาศตวแปร แตถาไมไดประกาศตวแปรกอนประมวลผลคาสงจะเกดความผดพลาดของโปรแกรมไมสามารถทางานไดดงเชนโปรแกรมในรปท 3.15
#include <stdio.h> void main(void) { a=1000; int a; //ประกาศตวแปร a หลงการใชงาน ทาใหโปรแกรมเกดความผดพลาด b=2000; }
รปท 3.15 การประกาศตวแปรทผดพลาด
การกาหนดคาใหกบตวแปร (Variable Assignment) จะพรอมกบการประกาศตวแปรหรอหลงประกาศตวแปรกได ในตวอยางท 3.14 แสดงใหเหนการประกาศตวแปรกอนทจะกาหนดคา สวนในรปท 3.16 แสดงใหเหนการประกาศตวแปรพรอมกบกาหนดคา
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
87
#include <stdio.h> void main(void) { int a = 3; int b = 6; //การประกาศตวแปรพรอมทงกาหนดคา int c; //การประกาศตวแปรทยงไมไดกาหนดคา c = a + b; printf("c = %i \n",c); }
รปท 3.16 การประกาศตวแปรทกาหนดคาเรมตน
ถากาหนดคาใหกบตวแปรไมตรงกบชนดตวแปรทประกาศไว เชน การกาหนดคามากเกนเกบ (Overflow) การกาหนดคานอยเกนเกบ (Underflow) จะทาใหคาทเกบไวในตวแปรผดพลาดได
ชนดของตวแปรตามทไดกลาวขางตนมหลายรปแบบซงเราสามารถสรปชนดของตวแปรไดดงในตารางท 3.2
ตารางท 3.2 ชนดตวแปรสาหรบเกบคาคงทชนดตาง ๆ ในภาษาซ ชนดคาคงท ชนดตวแปรในภาษาซ ตวอยางการประกาศ
ตวแปรชอวา a
Character char char a
Integer int int a;
Unsigned integer unsigned unsigned a;
Long integer long long a;
Unsigned long integer unsigned long unsigned long a;
Floating point float float a;
Double precision floating point double double a;
Long double precision floating
point
long double long double a;
String (จานวนตวอกษร) char char a[ความยาว+1]
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
88
บทสรป
ในบทนไดกลาวถงประวตความเปนมาของภาษาซ ขนตอนของการทางานของภาษาซ โครงสรางของภาษาซ และองคประกอบพนฐานของภาษาซ ซงเปนการศกษาภาษาซเบองตนกอนทจะดาเนนการเขยนโปรแกรมไดอยางถกตอง ความเปนมาของภาษาซเรมพฒนาขนเมอ พ.ศ. 2515 (ค.ศ. 1972) โดย เดนนส รตช (Dennis Ritchie) ตอมาเมอ พ.ศ. 2521 (ค.ศ.
1978) เดนนส รตช และไบรอน เคอรนกน (Brian Kernighan) พฒนามาตรฐานของภาษาซขนมา ซงเปนทรจกในกลมโปรแกรมเมอรภาษาซวา "เคแอนดอาร" (K&R Kernighan&Rtchie)
ตอมาในป พ.ศ. 2531 (ค.ศ. 1988) เดนนส รตช และไบรอน เคอรนกน ไดรวมมอกบสถาบนมาตรฐานแหงชาตของสหรฐอเมรกาหรอแอนซ (American National Standards Institute:
ANSI) สรางมาตรฐานของภาษาซขนมา ซงเรยกวา ANSI C เพอใชเปนตวกาหนดมาตรฐานการสรางภาษาซรนถดไป ปจจบนภาษาซเปนภาษาทไดรบความนยมสงและมการพฒนาขนมาอยางตอเนองดงเชนภาษาซพลสพลส (C++) และ ภาษาซเสมอน (Visual C++) เปนตน
ขนตอนในการเขยนโปรแกรมภาษาซมทงหมด 4 กระบวนการ ไดแกขนตอนการเขยนโปรแกรมหรอเขยนรหสตนฉบบ (Source Code) ขนตอนการแปลโปรแกรม (Compile) ขนตอนการเชอมโยงโปรแกรม (Link) และขนตอนการประมวลผลโปรแกรม (Run) ซงเมอไดทาการประมวลผลโปรแกรมแลวจะไดรหสกระทาการ (Execute Code) โครงสรางพนฐานของภาษาซประกอบดวย 4 สวน พนฐาน คอสวนหวของโปรแกรม (Preprocessing Directives) สวนประกาศตวแปร (Variable Declaration) สวนฟงกชน (Function) และสวนของรายละเอยดโปรแกรมหรอคาสงโปรแกรม (Program Statement) องคประกอบพนฐานของภาษาซเปนสวนขององคประกอบตางๆ ของภาษาซ เพอใชในการเขยนโปรแกรม ในการเขยนโปรแกรมภาษาซจาเปนทจะตองรองคประกอบพนฐานกอนทจะดาเนนการเขยนโปรแกรมไดอยางถกตอง ดงเชนคาและสญลกษณทสามารถใชในภาษาซมอะไรบาง ตวแปรและชนดของขอมลในภาษาซจะดาเนนการใชกบโปรแกรมอยางไรเปนตน ในบทนเปนบทพนฐานทจะนาไปสกระบวนการเขยนโปรแกรมไดอยางถกตองและมประสทธภาพตอไป
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
89
แบบฝกหดทบทวน
1. จงอธบายประวตความเปนมาของภาษาซ 2. ชอตอไปน ชอใดไมถกตองตามกฎการตงชอ
1) aaa
2) aaa1
3) student_name
4) stdntNm
5) _drQ
6) Std nm
7) printf
8) int
9) $sum
10) 2names
3. จากรปจงอธบายขนตอนการทางานของภาษาซ
บทท 3 ภาษาซเบองตนและการใชงานโปรแกรมภาษาซ
90
4. จงอธบายโครงสรางตางๆ ของภาษาซดงรป
#include<stdio.h)
#include<conio.h>
int a_global,b_global;
main()
{
int a,b,c;
a = 5;
b = 5;
c = a + b;
}
Preprocessing
Directives
Global
Variable Declaration
Function
Program Statement
Local
Variable Declaration
5. หมายเหต (Comment) คออะไรในภาษาซ มประโยชนยงไง และมการใชงานอยางไร จงอธบาย พรอมทงแสดงโปรแกรมประกอบ
6. ตวระบชอ (Identifier) คออะไรในภาษาซ 7. คาคงท (Constant) คออะไรในภาษาซ และคาคงทมอะไรบางจงอธบายใหละเอยด
8. จงอธบายตวอกษรพเศษดงตอไปน
Escape Sequence Represents
\a
\b
\f
\n
\r
\t
\v
\'
9. ตวแปร (Variables) และชนดของขอมล (Data Type) คออะไรในภาษาซ 10. ขอควรทราบของการใชตวแปรในภาษาซมอะไรบางทสาคญ จงอธบายอยางละเอยด
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
บทท 4
ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
ในบทนจะกลาวถงชนดของขอมล (Data Type) ตวแปร (Variables) คาคงท
(Constant) และการรบและแสดงผลขอมล (Input and Output of Data) ในการเขยนโปรแกรมภาษาซหรอภาษาระดบสงอนๆ โดยสวนมากจะตองมการบอกถงชนดขอมลทจะนามาใชประมวลผล ชนดของตวแปรทจะทาการประกาศ คาคงททจะใชในโปรแกรม การนาขอมลมาประมวลผลและการแสดงผล ซงเปนกระบวนการพนฐานทสาคญในการเขยนโปรแกรม เปนสงทจาเปนทจะตองเขาใจรปแบบกอนทจะเรมเขยนโปรแกรมในระดบสงตอไป
ขอมลในภาษาซมหลายชนด แตละชนดจะเหมาะกบลกษณะของขอมลคนละแบบ ซงในการเขยนโปรแกรมคอมพวเตอรจะตองใชตวแปรหรอคาคงทในการเกบขอมล จะตองมการประกาศตวแปรหรอคาคงท โดยกาหนดชนดขอมลใหเหมาะสมกบชนดของขอมลทตองการเกบ เพอใหเกดความถกตองและประหยดเนอทหนวยความจาในการจดเกบ ในการเขยนโปรแกรมจะมการปอนขอมลเขาและแสดงผลขอมลออก ซงในบทนการนาขอมลมาประมวลผลจะอธบายการปอนขอมลผานทางคยบอรดเขามาในโปรแกรมเพอประมวลผลได
ซงหลงจากทไดมการประมวลผลแลวไดผลลพธ กจะสามารถแสดงผลออกทางจอภาพ
4.1 ชนดของขอมล (Data Type)
ชนดของขอมลคอสงทใชกาหนดลกษณะของขอมล และกาหนดขอบเขตของขอมล ขอมลในภาษาซมหลายชนด ซงแตละชนดมลกษณะและขอบเขตของขอมลทแตกตางกนไป
ในการเขยนโปรแกรมคอมพวเตอรจะตองมการประกาศตวแปรโดยกาหนดชนดขอมลใหเหมาะสมกบชนดของขอมลทตองการเกบ เพอใหเกดความถกตองและประหยดเนอทหนวยความจาในการจดเกบ ซงการกาหนดชนดของขอมลแตกตางกน จะทาใหลกษณะและ
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
92
ขนาดของขอมลทเกบไดแตกตางกน เราสามารถแบงได 4 ชนด คอ ชนดขอมลแบบวอยหรอดาง (Void) ชนดขอมลแบบตวอกษร (Character) ชนดขอมลแบบเลขจานวนเตม (Integer)
และชนดขอมลแบบเลขทศนยม (Floating Point) โดยชนดของขอมลมขนาดของชนดขอมลดงแสดงในตารางท 4.1
ตารางท 4.1 แสดงการเปรยบเทยบขนาดของขอมลชนดตางๆ
ชนดขอมล ขนาด (ไบต) การคดเครองหมาย คาตาสด คาสงสด
char 1 signed -128 127
unsigned 0 255
short int 2 signed -32,768 32,767
unsigned 0 65,535
int 2 signed -32,768 32,767
unsigned 0 65,535
long int 4 signed -2,147,483,648 2,147,483,647
unsigned 0 4,294,967,295
float 4 signed 3.4 10 -38
3.4 10 38
double 8 signed 1.710-308
1.710308
long double 10 signed 3.410-4932
1.1104932
ขอควรทราบของการใชตวแปรในภาษาซคอ ตองมการบอกใหตวแปลภาษา (Compiler) ทราบกอนวาตวแปรแตละตวนนใชเกบ
คาคงทแบบไหน (ดงเชน จานวนเตม ทศนยม อกษร ขอความ คาความจรง) เรยกวาการประกาศตวแปร (Variable Declaration)
เ มอตวแปลภาษาทางานมาจนถงบรรทดทประกาศตวแปร กจะทาการจองหนวยความจาขนาดเทากบขอมลทจะเกบ
การประกาศตวแปรควรประกาศตวแปรไวสวนตนของโปรแกรม ซงจะทาใหตวแปรทไดประกาศไวจะสามารถใชไดทงโปรแกรม
การกาหนดคาใหกบตวแปร (Variable Assignment) จะพรอมกบการประกาศตวแปรหรอหลงประกาศตวแปรกได
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
93
ถากาหนดคาใหกบตวแปรไมตรงกบชนดตวแปรทประกาศไว เชน การกาหนดคาสงเกนกวาทจะรบได (Overflow) การกาหนดคาตาเกนกวาจะรบได (Underflow) จะทาใหคาทเกบไวในตวแปรผดพลาดได
4.1.1 ชนดขอมลแบบวอย ชนดขอมลแบบวอย (void) เปนชนดขอมลทไมมคา (0 ไบต) ดงนนจะไมใชกาหนด
ใหกบตวแปร แตจะใชกาหนดใหกบฟงกชนในกรณทไมตองการใหฟงกชนรบหรอสงคาใดๆ เชน
#include <stdio.h> void main(void)
{ int a,b,c; a = 10; b = 20; c = a + b;
}
รปท 4.1 การประกาศตวแปรชนดขอมลแบบวอย
void main(void) หมายถงฟงกชน main จะไมรบหรอสงคาใดๆ กลาวคอ void ทอยขางหนาฟงกชน main คอจะไมมการสงคาใดๆ ออกไปจากฟงกชน main สวน void ทอยในวงเลบ คอจะไมมการรบคาใดๆ เขามาในฟงกชน main
4.1.2 ชนดขอมลแบบตวอกษร ชนดขอมลแบบตวอกษร (Character) เปนชนดขอมลทเกบขอมลได 1 ตวอกษร
เทานน ซงคอมพวเตอรจะเกบขอมลในลกษณะของรหสแอสก (American Standard Code
for Information Interchange: ASCII) 1 ไบต ซงทาใหชนดขอมลแบบตวอกษรเทยบไดกบขอมลชนดตวเลขจานวนเตมทมคาตงแต 0 ถง 255 สาหรบชนดขอมลแบบตวอกษรทไมคดเครองหมาย (Unsigned Char) และมคาตงแต -128 ถง 127 สาหรบชนดขอมลแบบตวอกษรทคดเครองหมาย (Signed Char) ดงนนจงสามารถนาขอมลแบบตวอกษร มากระทาการทางคณตศาสตรได และถาตองการกาหนดใหตวแปรเกบขอมลแบบตวอกษรใหกาหนด เปน char
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
94
สวนการกาหนดคาใหกบตวแปรทเกบขอมลตวอกษรนนตองระบในเครองหมาย (‘ ‘) เชน ถาตวแปรเกบขอมลคาเทากบ ‘A’ หมายความวาคอมพวเตอรจะเกบคาเทากบ 01000001 ซงกคอคา 65 นนเอง
ในกรณทมตวอกษรหลายๆ ตวรวมกนเราเรยกวา ขอความ (String) ซงกคอการนาเอาอกขระหลายๆ ตวมาเรยงตอกน ภายใตเครองหมาย " " ตวอยางเชน “CMU”, “Chula”,
“KKU”, “Kmitl”, “Mahidol”, “Kmitnb” และ “Kmutt” เปนตน
4.1.3 ชนดขอมลแบบเลขจานวนเตม
ชนดขอมลแบบเลขจานวนเตม (Integer) เปนชนดขอมลทเกบเลขจานวนเตมทงแบบทคดเครองหมายและไมคดเครองหมาย ซงถาเปนแบบคดเครองหมายจะกาหนดใหบตดานซายสดเกบคาเครองหมาย โดยถามคาเทากบ 0 แสดงวาเปนจานวนเตมบวก และถามคาเทากบ 1 แสดงวาเปนจานวนเตมลบ ซงจะเรยกบตดานซายสดวาบตเครองหมาย (Sign Bit)
ซงสามารถแบงออกเปน 3 ประเภทคอ
เลขจานวนเตมแบบสน (Short Integer) เปนชนดขอมลทเกบเลขจานวนเตมขนาด 2
ไบต มคาตงแต 0 ถง 65,535 สาหรบชนดขอมลแบบเลขจานวนเตมแบบสนทไมคดเครองหมาย และมคาตงแต -32,768 ถง 32,767 สาหรบชนดขอมลแบบเลขจานวนเตมแบบสนทคดเครองหมาย และถาตองการกาหนดใหตวแปรเกบขอมลเลขจานวนเตมแบบสนใหกาหนด เปน short int
เลขจานวนเตมแบบปกต (Integer) เปนชนดขอมลทเกบเลขจานวนเตมขนาด 2 ไบต
มคาตงแต 0 ถง 65,535 สาหรบชนดขอมลแบบเลขจานวนเตมแบบปกตทไมคดเครองหมาย และมคาตงแต -32,768 ถง 32,767 สาหรบชนดขอมลแบบเลขจานวนเตมแบบปกตทคดเครองหมายและถาตองการกาหนดใหตวแปรเกบขอมลเลขจานวนเตมแบบปกตใหกาหนด เปน int
เลขจานวนเตมแบบยาว (Long Integer) เปนชนดขอมลทเกบเลขจานวนเตมขนาด 4
ไบต มคาตงแต 0 ถง 4,294,967,295 สาหรบชนดขอมลแบบเลขจานวนเตมแบบยาวทไมคดเครองหมาย และมคาตงแต -2,147,483,648 ถง 2,147,483,647 สาหรบชนดขอมลแบบเลขจานวนเตมแบบสนทคดเครองหมาย และถาตองการกาหนดใหตวแปรเกบขอมลเลขจานวนเตมแบบยาวใหกาหนด เปน long int
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
95
#include <stdio.h> void main(void) { short int a; //การประกาศชนดของขอมลของเลขจานวนเตมแบบสน int b; //การประกาศชนดของขอมลของเลขจานวนเตมแบบเตมปกต long int c; //การประกาศชนดของขอมลของเลขจานวนเตมแบบยาว a = 15; b = 100000; c = 100000000; printf(" a = %i \n b = %i \n c = %li \n",a,b,c); }
รปท 4.2 การกาหนดชนดของขอมลแบบจานวนเตม
ในการกาหนดชนดขอมลขอทพงควรระวงจะตองกาหนดคาตวแปรไมใหเกนคาขอบเขตของชนดขอมลในแตละชนด ถากาหนดคามากเกนเกบ (Overflow) กาหนดคานอยเกนเกบ (Underflow) ซงจะทาใหคาทเกบไวในตวแปรมความผดพลาด ดงแสดงในตวอยางดงรปท 4.3 และรปท 4.4
#include <stdio.h> void main(void) { int a,b; a = 32767; b = 32768; printf(" a = %i \n b = %i \n",a,b); }
รปท 4.3 ตวอยางการกาหนดคามากเกนเกบ
จากรปท 4.3 ผลลพธทไดของตวแปร a = 32767 ซงเปนคาทถกตอง แตผลลพธของตวแปร b = -32768 ซงจะผดพลาดจากคาทตองการจะจดเกบเนองจากขอบเขตของชนดขอมลของเลขจานวนเตมแบบปกต (Integer) ซงเปนชนดขอมลทเกบเลขจานวนเตมขนาด 2
ไบต มคาตงแต -32,768 ถง 32,767 ดงนนถาเกนคาทกาหนดไวจะเปนคาทผดพลาด
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
96
#include <stdio.h> void main(void) { long int a,b; a = -2147483648; b = -2147483649; printf(" a = %li \n b = %li \n",a,b); }
รปท 4.4 ตวอยางการกาหนดคานอยเกนเกบ
จากรปท 4.4 ผลลพธทไดของตวแปร a = -2147483648 ซงเปนคาทถกตอง แตผลลพธของตวแปร b = 2147483647 ซงจะผดพลาดจากคาทตองการจะจดเกบเนองจากขอบเขตของชนดขอมลของเลขจานวนเตมแบบยาว (Long Integer) ซงเปนชนดขอมลทเกบเลขจานวนเตมขนาด 4 ไบต มคาตงแต -2,147,483,648 ถง 2,147,483,647 ดงนนถาเกนคาทกาหนดไวจะเปนคาทผดพลาด
4.1.4 ชนดขอมลแบบเลขทศนยม
ชนดขอมลแบบเลขทศนยม (Floating Point) เปนชนดขอมลทเกบเลขทศนยมหรอเลขจานวนจรง โดยจะเกบขอมลแบบคดเครองหมายเทานน สามารถแบงออกเปน 3 ประเภทคอ
เลขทศนยมแบบจดลอยตว float (Floating Point Number) เปนชนดขอมลทเกบเลขทศนยมขนาด 4 ไบต มคาตงแต 3.4 10
-38 ถง 3.4 10
38 และถาตองการกาหนดใหตวแปรเกบขอมลเลขทศนยมแบบจดลอยตว float ใหกาหนด เปน float
เลขทศนยมแบบดบเบล double (Double Precision Floating Point Number) เปนชนดขอมลทเกบเลขทศนยมขนาด 8 ไบต มคาตงแต 1.710
-308 ถง 1.710
308 และถาตองการกาหนดใหตวแปรเกบขอมลเลขทศนยมแบบดบเบล double ใหกาหนด เปน double
เลขทศนยมแบบดบเบลยาว long double (Long Double Precision Floating Point
Number) เปนชนดขอมลทเกบเลขทศนยมขนาด 10 ไบต มคาตงแต 3.410-4932
ถง 1.110
4932 และถาตองการกาหนดใหตวแปรเกบขอมลเลขทศนยมแบบดบเบลยาว long
double ใหกาหนด เปน long double
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
97
#include <stdio.h> void main(void) { float a; //การประกาศชนดของขอมลของเลขเทศนยม double b; //การประกาศชนดของขอมลของเลขเทศนยม long double c; //การประกาศชนดของขอมลของเลขเทศนยม a = 15.5644; b = 100.5749593434; c = 100.87084745278; printf(" a = %f \n b = %.30lf \n c = %.30Lf \n",a,b,c); }
รปท 4.5 การกาหนดชนดของขอมลแบบทศนยม
4.2 ตวแปร (Variables)
ตวแปร คอชอทกาหนดขนมา เพอใชเรยกสวนของหนวยความจาของคอมพวเตอรทใชเกบคาใดๆ ทสามารถเปลยนแปลงคาได เพอใหผ เขยนโปรแกรมสามารถเรยกใชคาทเกบอยในหนวยความจาของคอมพวเตอรไดสะดวกรวดเรว
ในการเขยนโปรแกรมคอมพวเตอรกระบวนการหนงทสาคญคอกระบวนการรบคาขอมลเขามา การแสดงผลขอมล การประมวลผลขอมล ซงเปนการกระทากบขอมล ซงขอมลตางๆ ทรบเขามาจะถกจดเกบไวทหนวยความจาของเครองคอมพวเตอรแลวสงไปประมวลผล จากนนกเกบไวทหนวยความจากอนไปแสดงผลลพธตางๆ ดงนนในการเขยนโปรแกรมคอมพวเตอรใหสามารถรบขอมลเขามา ประมวลผลขอมล และแสดงผลขอมล จะใชตวแปรเขามาชวยในการทางาน ซงแตกตางจากภาษาระดบตาทตองอางองหนวยความจา ในโปรแกรมภาษาระดบสงเมอมการสรางตวแปรขนมากจะเกดการจองพนทหนวยความจาโดยอตโนมต โดยทผ เขยนโปรแกรมไมจาเปนตองรวาตวแปรทสรางขนมาใชหนวยความจาตาแหนงไหน ซงการอางชอตวแปรในทนกเปรยบเสมอนการอางตาแหนงในหนวยความจานนเอง ซงจะงายกวาการเขยนโปรแกรมภาษาระดบตา เชนคาสง Add 0,1,2,3
(ภาษาระดบตา) ซงสมมตวาเปนการบวกคาตาแหนงท 0 ตาแหนงท 1 ตาแหนงท 2 แลวเกบไวทตาแหนงท 3 แตถาเปนการเขยนในโปรแกรมภาษาระดบสงกจะเขยนเปน d = a + b + c ดงตวอยางแสดงดงรป
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
98
รปท 4.6 การอางองขอมลในหนวยความจา
4.2.1 กฎการตงชอตวแปร ชอตวแปรตองขนตนดวยตวอกษรหรอเครองหมาย underscore (_)เทานน เชน
Name, _Name เปนตน
ภายในชอตวแปรสามารถประกอบดวยตวอกษร ตวเลข และเค รองหมาย underscore เทานน โดยหามมชองวางภายในชอ เชน Name, Name1, User_name เปนตน
ตวอกษรพมพเลก และตวอกษรพมพใหญ มความแตกตางกน เชน Name, NAME,
NaMe, NamE ถอวาเปนคนละชอกน
ชอตวแปรตองไมซากบคาสงวน (Reserve word) ซงคาสงวนตางๆ แสดงดงในตารางท 4.2
ตารางท 4.2 คาสงวน
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
99
ตวอยางการตงชอตวแปร Test ถกตอง _test ถกตอง Test1 ถกตอง 1test ผด เพราะขนตนดวยตวเลข User-name ผด เพราะมเครองหมาย (-) อยในชอ User1name ถก if ผด เพราะเปนคาสงวน
4.2.2 รปแบบการประกาศตวแปร การประกาศคาตวแปรสามารถกาหนดไดดงน
เชน
int score; เปนการประกาศตวแปร score ใหเกบขอมลชนดเลขจานวนเตม
char grade; เปนการประกาศตวแปร grade ใหเกบขอมลชนดตวอกษร
การประกาศคาตวแปรสามารถกาหนดคาเรมตนใหกบตวแปรได เชน
int score = 80; เปนการประกาศตวแปร score ใหเกบขอมลชนดเลขจานวนเตมโดยมคาเรมตน คอ 80
char grade = ‘A’ เปนการประกาศตวแปร grade ใหเกบขอมลชนดตวอกษร โดยมคาเรมตน คอ A
ชนดของตวแปรขนอยกบวาจะใชตวแปรนนเกบคาคงทชนดไหน ซงชนดของคาตวแปรมหลายรปแบบ ดงแสดงในตาราง 4.3
ชนดของขอมล ชอตวแปร[,ชอตวแปร];
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
100
ตารางท 4.3 ชนดของตวแปรประเภทตางๆ ในภาษาซ ชนดคาคงท ชนดตวแปรใน
ภาษาซ ตวอยางการประกาศตวแปร a
Character char char a
Integer int int a;
Unsigned integer unsigned unsigned a;
Long integer long long a;
Unsigned long integer unsigned long unsigned long a;
Floating point float float a;
Double precision floating point double double a;
Long double precision floating
point
long double long double a;
String (ตองระบวายาวกอกษร) char char a[ความยาว+1]
ตวอยางการประกาศตวแปรเชน
char a, b; ตวแปร a และ b ใชเกบคาคงทชนดตวอกษร long d; ตวแปร d ใชเกบชนดขอมลจานวนเตมแบบยาว float x, y, z; ตวแปร x, y และ z ใชเกบคาคงทชนดทศนยม
int ไมถกตองตามรปแบบ เพราะไมบอกชอตวแปร
4.2.3 ประเภทของตวแปร ประเภทของตวแปรสามารถแบงออกเปน 2 ประเภท คอ
ตวแปรสวนกลางหรอตวแปรแบบโกลบอล (Global Variable) คอตวแปรสาธารณะทประกาศไวนอกฟงกชนทกฟงกชน ดงนนทกฟงกชนสามารถเรยกใชตวแปรประเภทนได จะมคาเรมตนเปน 0 โดยอตโนมตถาไมไดกาหนดคาเรมตนใหกบตวแปร
ตวแปรเฉพาะท (Local Variable) หรอตวแปรแบบโลคอล คอตวแปรทประกาศไวในฟงกชนใดๆ ดงนนจะมเฉพาะฟงกชนททาการประกาศเทานนทสามารถเรยกใชได ไมมการกาหนดคาเรมตนโดยอตโนมต
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
101
ตวอยางท 4.1 โปรแกรมแสดงการประกาศตวแปรแตละประเภท
1 #include <stdio.h> 2 int x; //เปนการประกาศตวแปร x แบบโกลบอล 3 int y = 2; //เปนการประกาศตวแปร y แบบโกลบอล โดยมการกาหนดคาเรมตน 4 int test(int x){ 5 int i = 3; //เปนการประกาศตวแปร i แบบโลคอล 6 return x + y + i; 7 } 8 main(){ 9 int z; //เปนการประกาศตวแปร z แบบโลคอล 10 x = 5; 11 y = 10; 12 z = test(x); 13 printf(“x + y + i = %d\n”, z); 14 }
ผลลพธของโปรแกรม
x + y + i = 18
อธบายโปรแกรม
บรรทดท 2 : เปนการประกาศตวแปร x แบบโกลบอล บรรทดท 3 : เปนการประกาศตวแปร y แบบโกลบอล โดยมการกาหนดคาเรมตน
ใหกบตวแปร y
บรรทดท 4 : สรางฟงกชน test()
บรรทดท 5 : เปนการประกาศตวแปร i แบบโลคอล โดยมการกาหนดคาเรมตนใหกบตวแปร i โดยมฟงกชน test() เทานนทสามารถเรยกใชตวแปรน ได
บรรทดท 9 : เปนการประกาศตวแปร z แบบโลคอล โดยมฟงกชน main() เทานนทสามารถเรยกใชตวแปรนได
บรรทดท 10 : กาหนดคาใหตวแปร x
บรรทดท 11 : กาหนดคาใหตวแปร y
บรรทดท 12 : มการเรยกใชฟงกชน test() โดยสงคาพารามเตอรคอ x = 5 เขาไปประมวลผลในฟงกชน test() ซงฟงกชน test จะนาคา x มาบวกกบคา y ซงฟงกชน main() ไดกาหนดคาใหเทากบ 10 แลวนาไปบวกกบคา i ซงมคาเทากบ 3 ดงนนฟงกชน test() จะสงคา 18 กลบออกไปจากฟงกชน
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
102
4.2.4 ขอบเขตการทางานของตวแปร (Variable Storage Classes)
ขอบเขตการทางานของตวแปร คอการกาหนดวาฟงกชนใดสามารถใชตวแปรใดบาง และโปรแกรมสามารถเกบคาของตวแปรไวไดนานเทาใด แบงออกเปน 4 ประเภท คอ
ตวแปรอตโนมต (Automatic Variable) คอการกาหนดขอบเขตของตวแปรใหกบตวแปรแบบโลคอลเทานน โดยคาของตวแปรจะถกทาลายเมอออกจากฟงกชน และจะเรมตนคาใหมทกครงเมอมการเรยกใชฟงกชน โดยทวไปการประกาศตวแปรแบบโลคอลจะถกกาหนดใหเปนแบบนโดยอตโนมต เชน
ประกาศตวแปร int x = 5;
หมายถง การประกาศ auto x = 5; ซงไมจาเปนตองระบ auto กากบไว
ตวแปรเรจสเตอร (Register Variable) คอการกาหนดใหตวแปรถกเกบในเรจสเตอรของคอมพวเตอร แทนทจะเกบไวในหนวยความจาหลกเหมอนตวแปรโดยทวไป มขอดคอสามารถเขาถงตวแปรไดอยางรวดเรว แตมขอเสยคอ ขนาดของเรจสเตอรทจากดทาใหเกบขอมลไดนอย เชน
ประกาศตวแปร register int x = 5;
หมายถงจะมการทางานเชนเดยวกบการประกาศ int x = 5; เพยงแตมการเกบคาของตวแปรไวในเรจสเตอรแทนทจะเกบไวในหนวยความจาหลกนนเอง
ตวแปรภายนอก (External Variable) คอการกาหนดขอบเขตของตวแปรทอยในโปรแกรมไฟลใดๆ ทมการเรยกใชตวแปรแบบโกลบอลทมการประกาศอยในโปรแกรมไฟลอน
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
103
ตวอยางท 4.2 โปรแกรมแสดงการทางานของตวแปรแบบภายนอก
main_extern.c 1 #include <stdio.h> 2 #include "write_extern.c" 3 int a=10; 4 main(){ 5 write(); 6 }
write_extern.c 1 #include <stdio.h> 2 extern int a; 3 write(){ 4 printf("a = %d\n", a); 5 }
ผลลพธของโปรแกรม
a = 10
อธบายโปรแกรม (write_extern)
บรรทดท 2 ทาการประกาศตวแปร a เปนแบบ external หมายความวา มการอางองไปยงตวแปร a ในโปรแกรมไฟล main_extern ดงนนตวแปร a
ในโปรแกรมไฟล write_extern จงมคาเทากบ 10 และจะเปลยนแปลงตามคาของตวแปร a ในโปรแกรมไฟล main_extern
ตวแปรสถต (Static Variable) คอการกาหนดใหตวแปรแบบโลคอลเกบคาไวจนกวาจะจบการทางานของโปรแกรม คาของตวแปรจงจะถกทาลาย ดงนนเมอมการเรยกใชงานฟงกชนใดๆ อกครงหลงจากออกจากการใชงานฟงกชนนนๆ แลว คาของตวแปรจะยงคงอย สวนตวแปรโกลบอลจะถกกาหนดใหเปนตวแปรแบบสถตโดยอตโนมต เชน
ประกาศตวแปรโกลบอล int x = 5;
หมายถง การประกาศ static x = 5; ซงไมจาเปนตองระบ static กากบไว
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
104
ตวอยางท 4.3 โปรแกรมแสดงการทางานของตวแปรแบบสถต
main_static.c
1 #include <stdio.h> 2 #include "write_static.c" 3 int i; 4 main(){ 5 for(i = 1; i <= 3 ; i++){ 6 write_static(); 7 } 8 }
write_static.c
1 #include<stdio.h> 2 write_static(){ 3 extern int i; 4 int a = 4; 5 static int b = 4; 6 a = a + 1; 7 b = b + a; 8 printf("i = %d a = %d b = %d\n" ,i ,a ,b); 9 }
ผลลพธของโปรแกรม i = 1 a = 5 b = 9 i = 2 a = 5 b = 14 i = 3 a = 5 b = 19
อธบายโปรแกรม (write_static.c)
บรรทดท 3 : ประกาศตวแปร i เปนแบบภายนอก (Extern Variable) หมายความวา มการอางองไปยงตวแปร i ในโปรแกรมไฟล main_static ดงนนตวแปร i ในโปรแกรมไฟล write_static จะเปลยนแปลงตามคาของตวแปร i ในโปรแกรมไฟล main_static
บรรทดท 4 : ประกาศตวแปร a เปนแบบอตโนมต (Automatic Variable)
หมายความวา คาของตวแปรจะถกทาลายเมอออกจากฟงกชน
write_static() และจะเรมตนคาใหมทกครงเมอมการเรยกใชฟงกชน
write_static() ดงนนไมวาจะมการเรยกใชฟงกชน write_static() กครงกตามคาของตวแปร a จะมคาเทากบ 5 เสมอ
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
105
บรรทดท 5 : ประกาศตวแปร b เปนแบบสถต (Static Variable) หมายความวา คาของตวแปรจะถกเกบไว แมวาจะออกจากฟงกชน write_static()
ดงนนเมอมการเรยกใชฟงกชน write_static() จะมการนาคาของตวแปรทถกเกบไวมาใชงานตอ ดงนนจะเหนวาคาของตวแปร b จะเพมขนทละ 5 จากคาสง b = b+a;
4.3 คาคงท (Constant)
คาคงท คอคาของขอมลทแนนอน ไมสามารถเปลยนแปลงคาไดในขณะทโปรแกรมทางาน ตวแปรคาคงทคอตวแปรทกาหนดคาไดครงเดยว และคานนจะคงเดมจนจบโปรแกรม
มกใชเกบคาคงทสาหรบการคานวณเชน คา pi, คา e, จานวนชวโมงในหนงวน เปนตน
4.3.1 ชนดของคาคงท ชนดของคาคงทโดยทวไปจะเปนชนดตวเลขและตวอกษร ดงน
คาคงทชนดจานวนเตม (Integer Constant) เปนคาคงทชนดตวเลขทเปนจานวนเตมลบ และจานวนเตมบวก
คาคงทชนดจานวนเตมฐานสบ (Decimal Integer Constant) หมายถงตวเลขตงแต 0
ถง 9 ซงตวเลขแรกของขอมลตองไมเปน 0 เชน
o const int a = 120;
o const int b = 9999;
คาคงทชนดจานวนเตมฐานแปด (Octal Integer Constant) หมายถงตวเลขตงแต 0
ถง 7 โดยกาหนดใหตวเลขแรกของขอมลตองเปน 0 เชน
o const int a = 0170;
o const int b = 023417;
คาคงทชนดจานวนเตมฐานสบหก (Hexadecimal Integer Constant) หมายถงตวเลขตงแต 0 ถง 9 และ A ถง F โดยกาหนดใหม 0x หรอ 0X นาหนา เชน
o const int a = 0x78;
o const int b = 0x270F;
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
106
คาคงทชนดเลขทศนยม (Floating Point Constant) เปนคาคงททเปนเลขจานวนจรง
คาคงทชนดเลขทศนยมระบคาทศนยมแบบปกต หมายถงตวเลขตงแต 0 ถง 9 และจดทศนยม เชน
o const float a = 3.55;
o const float b = 0.03;
คาคงทชนดเลขทศนยมทเขยนแบบวทยาศาสตร หมายถงตวเลขทศนยมคณดวย 10n
เขยนแทนดวยอกษร E (หรอ e) ตามดวยเลขจานวนเตมบวกหรอจานวนเตมลบ เชน
o const float a = 1.0E2 หมายถง 1.0 * 102 = 100.0
o const float b = 23E-3 หมายถง 23 * 10-3 = 0.023
คาคงทชนดตวอกษร (Character Constant) เปนคาคงททเปนตวอกษรเพยงตวเดยว โดยกาหนดใหอยในเครองหมาย (‘ ‘) เชน
const char a = ‘a’;
const char grade = ‘A’;
คาคงทชนดตวอกษรทมไวเพอควบคมการทางานของคอมพวเตอร โดยจะไมแสดงอกษรใดๆ เรยกวาคาคงทตวอกษรพเศษหรอเอสเคปซเควนซ (Escape Sequence) ซงเปนคาคงททประกอบดวยเครองหมาย \ และตวอกษร โดยตองอยในเครองหมาย (‘ ‘) เชน ‘\n’ , ‘\t’
คาคงทประเภทนสามารถแสดงไดดงตารางท 4.4
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
107
ตารางท 4.4 คาคงทตวอกษรพเศษ
เอสเคปซเควนซ ชอ ความหมาย \a Alarm bell เสยงระฆงเตอน
\b Backspace ถอยกลบ
\f Formfeed ขนหนาใหม
\n Newline ขนบรรทดใหม
\r Return เคอรเซอรกลบไปอยทตนบรรทด
\t Tab เวนระยะ \\ Backslash พมพเครองหมาย \\ \’ Single quote พมพเครองหมาย ‘ \” Double quote พมพเครองหมาย “
\? Question mark พมพเครองหมาย ?
คาคงทชนดสายอกขระหรอขอความ (String) คอการนาตวอกษรมาเรยงตอกนภายใตเครองหมาย “” เชน
const char name[10] = ”wilaiporn”;
const char a[3] = “ab”;
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
108
ตวอยางท 4.4 โปรแกรมแสดงการกาหนดคาคงทพรอมการประกาศคาตวแปร
1 #include <stdio.h> 2 main(){ 3 const int a = 120; 4 const int b = 0170; 5 const int c = 0x78; 6 const float d = 3.55; 7 const float e = 23E-3; 8 const char f = '\?'; 9 const char grade = 'A'; 10 const char name[10] = "Ahumporn"; 11 printf("a = %d\n", a); 12 printf("b = %d\n", b); 13 printf("c = %d\n", c); 14 printf("d = %f\n", d); 15 printf("e = %f\n", e); 16 printf("f = %c\n", f); 17 printf("grade = %c\n", grade); 18 printf("name = %s\n", name); 19 }
ผลลพธของโปรแกรม a = 120 b = 120 c = 120 d = 3.550000 e = 0.023000 f = ? grade = A name = Ahumporn
อธบายโปรแกรม
บรรทดท 3 เปนการประกาศตวแปร a เกบคาคงทชนดจานวนเตมฐานสบ
บรรทดท 4 เปนการประกาศตวแปร b เกบคาคงทชนดจานวนเตมฐานแปด
บรรทดท 5 เปนการประกาศตวแปร c เกบคาคงทชนดจานวนเตมฐานสบหก บรรทดท 6 – 7 เปนการประกาศตวแปร d และ e เกบคาคงทชนดจานวนจรง บรรทดท 8 – 9 เปนการประกาศตวแปร f และ grade เกบคาคงทชนดตวอกษร
บรรทดท 10 เปนการประกาศตวแปร name เกบคาคงทชนดขอความ
จากโปรแกรมในตวอยางท 3.5 ถามการกาหนดคาใหกบตวแปรใหม จะพบวาโปรแกรมคอมไพลไมผาน เกดขอผดพลาด (error) ขน เชน เพมคาสง grade = ‘B’;
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
109
4.3.2 การกาหนดคาคงท การกาหนดคาคงทสามารถทาได 3 วธ คอ
คาคงททกาหนดในโปรแกรมโดยตรง (Literal Constant) คอคาคงททกาหนดในโปรแกรมโดยตรงโดยไมตองใชตวแปรในการเกบขอมล เชน
printf(“Score = %d”, 100);
printf(“Grade = %c”, ‘A’);
คาคงททกาหนดในสวนหวของโปรแกรม (Defined constant) คอคาคงททกาหนดในสวนหวของโปรแกรม (Preprocessing Directives) โดยมรปแบบการกาหนดดงน
ชอตวแปรทมการกาหนดคาคงททสวนหวของโปรแกรม มหลกเกณฑการตงชอเหมอนตวแปรทวไป แตมกนยมใชตวอกษรตวใหญทงหมด
ตวอยางท 4.5 โปรแกรมแสดงการกาหนดคาคงทไวทสวนหวของโปรแกรม
1 #include <stdio.h> 2 #define A 120 3 #define B 0170
4 #define C 0x78 5 #define D 3.55 6 #define E 23E-3 7 #define F '\?' 8 #define GRADE 'A' 9 #define NAME "Assit.Prof.Dr.Krit" 10 main(){ 11 printf("A = %d\n", A); 12 printf("B = %d\n", B); 13 printf("C = %d\n", C); 14 printf("D = %f\n", D); 15 printf("E = %f\n", E); 16 printf("F = %c\n", F); 17 printf("GRADE = %c\n", GRADE); 18 printf("NAME = %s\n", NAME); 19 }
ผลลพธของโปรแกรม A = 120 B = 120 C = 120 D = 3.550000 E = 0.023000 F = ?
#define ชอตวแปร คาคงท
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
110
GRADE = A NAME = Assit.Prof.Dr.Krit
คาคงททกาหนดใหพรอมกบการประกาศตวแปร (Memory Constant) คอคาคงททกาหนดใหพรอมกบการประกาศตวแปร มรปแบบการกาหนดดงน
เชน
const int tax = 7;
หมายความวา tax เปนคาคงททเกบขอมลจานวนเตม ซงมคาเทากบ 7
ตวอยางท 4.6 การประกาศตวแปรคาคงททกาหนดใหพรอมกบการประกาศตวแปร
1 #include <stdio.h> 2 const float a = 3.14; 3 const int b=10; 4 void main(void) 5 { 6 const int d=10; 7 8 }
การกาหนดคาคงทโดยทวไปนยมกาหนดเปนคาเฉพาะของตวเลขทใชในโปรแกรมทงหมดเชนคาตวเลขคงทตางๆ ของสมการคณตศาสตร ดงแสดงในตวอยางท 4.7 ซงแสดงใหเหนวาเราสามารถแทนตวอกษร pi แทนคาทางคณตศาสตรทกสวนของโปรแกรมไดทงหมด
ทาใหงายตอการเขยนโปรแกรม
ตวอยางท 4.7 การกาหนดคาคงททเปนคาทางคณตศาสตร 1 2 3 4 5 6 7 8
#include <stdio.h> #define pi 3.1416 void main(void) { int a; a = 2 * pi * 15; }
#include <stdio.h> #define pi 3.1416 void main(void) { int a; a = 2 * 3.1416* 15; }
const ชนดของขอมล ชอคาคงท = คาคงท;
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
111
4.4 การรบและแสดงผลขอมล (Input and Output of Data)
การรบและแสดงผลขอมลเปนการกระทาเกยวกบขอมลเบองตนวาจะมการรบขอมลเขามาประมวลผลอยางไร และเมอประมวลผลเรยบรอยแลวเราจะแสดงผลขอมลอยางไร ซงในทนเราไดใชฟงกชนทมอยแลวในภาษาซในการรบและแสดงผลดงน
4.4.1 การรบขอมลดวยฟงกชน scanf()
การรบขอมลเพอใหโปรแกรมประมวลผลสามารถทาไดหลายทางเชน คยบอรด เมาส สแกนเนอร เปนตน ในทนจะเนนการรบขอมลจากคยบอรด คาทไดรบมาจะเกบไวทตวแปรทกาหนด แลวนาตวแปรนนไปประมวลผลตอไป ฟงกชนทรบขอมลทนยมใชกนคอ scanf( ) ซงรบขอมลจากคยบอรดไดทกๆ ประเภท ไมวาจะเปน จานวนเตม ทศนยม อกษร ขอความ การใชฟงกชนนจะตองรวมไฟลสวนหวทชอวา “stdio.h” กอนจงจะใชได ดงตวอยางตอไปน
ฟงกชนทใชในการรบขอมลจากคยบอรด คอ ฟงกชน scanf (scan formatted) โดยมรปแบบการใชฟงกชนดงน
string_format คอตวแทนชนดขอมลทตองการรบเขามา เชน %d , %f เปนตน ซงตวแทนชนดขอมลสามารถแสดงไดดงตารางท 5.1
address_list คอทอย (address) ของตวแปรเพอเกบขอมลทรบเขามาจากคยบอรดไวในหนวยความจาตรงตาแหนงใดๆ ซงตองใชเครองหมายแอมเพอรแซนด (&) นาหนาชอตวแปรทตองการรบขอมลเขามาเกบไว ยกเวนการรบขอมลสายอกขระหรอขอความ ไมตองนาหนาชอตวแปรดวยเครองหมาย &
scanf(“string_format”, address_list);
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
112
ตารางท 4.5 ตวแทนชนดขอมล
ชนดขอมล ตวแทนชนดขอมล char %c
string %s
short int %hd
unsigned short int %hu
int %d หรอ %i
unsigned int %u
long int %Ld
unsigned long int %Lu
float %f
double %lf
long double %Lf
ตารางท 4.6 ตวแทนชนดขอมลอนๆ
ชนดของคางคงททตองการแสดงผล
รปแบบการแสดงผลทตองการ ตวแทนชนดขอมล
Character ตวอกษร %c
จานวนเตมฐานสบ %i หรอ %d
จานวนเตมฐานแปด ไมคดเครองหมาย %o
จานวนเตมฐานสบหก ไมคดเครองหมาย %x หรอ %X
Integer ตวอกษร (ถกตองเฉพาะ 0 - 255)
%c
จานวนเตมฐานสบ %i หรอ %d
จานวนเตมฐานแปด ไมคดเครองหมาย (ถกตองเฉพาะ Integer คาบวก)
%o
จานวนเตมฐานสบหก ไมคดเครองหมาย (ถกตองเฉพาะ Integer คาบวก)
%x หรอ %X
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
113
ชนดของคางคงททตองการแสดงผล
รปแบบการแสดงผลทตองการ ตวแทนชนดขอมล
Unsigned Integer ตวอกษร (ถกตองเฉพาะ 0 - 255)
%c
จานวนเตมฐานสบ %u
จานวนเตมฐานแปด ไมคดเครองหมาย %o
จานวนเตมฐานสบหก ไมคดเครองหมาย %x หรอ %X
Long Integer ตวอกษร (ถกตองเฉพาะ -0l - 255l)
%c
จานวนเตมฐานสบ %li หรอ %ld
จานวนเตมฐานแปด ไมคดเครองหมาย (ถกตองเฉพาะ Long Integer คาบวก)
%lo
จานวนเตมฐานสบหก ไมคดเครองหมาย (ถกตองเฉพาะ Long Integer คาบวก)
%lx หรอ %lX
Unsigned Long
Integer
ตวอกษร (ถกตองเฉพาะ 0ul - 255ul)
%c
จานวนเตมฐานสบ %lu
จานวนเตมฐานแปด ไมคดเครองหมาย %lo
จานวนเตมฐานสบหก ไมคดเครองหมาย %lx หรอ %lX
Floating Point ทศนยม %f
ทศนยมแบบวทยาศาสตร %e หรอ %E
Double Precision
Floating Point
ทศนยม %lf
ทศนยมแบบวทยาศาสตร
%le หรอ %lE
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
114
ชนดของคางคงททตองการแสดงผล
รปแบบการแสดงผลทตองการ ตวแทนชนดขอมล
Long Double
Precision Floating
Point
ทศนยม %Lf
ทศนยมแบบวทยาศาสตร %Le หรอ %LE
String
สายอกขระหรอขอความ %s
ตวอยางท 4.8 โปรแกรมแสดงการรบขอมลดวยฟงกชน scanf
1 #include<stdio.h> 2 main(){ 3 char a ,b[10]; 4 int c; 5 float d; 6 printf("Enter Character : "); 7 scanf("%c",&a); 8 printf("Enter String : "); 9 scanf("%s",b); 10 printf("Enter Integer : "); 11 scanf("%d",&c); 12 printf("Enter Float : "); 13 scanf("%f",&d); 14 printf("Character = %c String = %s Integer = %d
Float = %f",a,b,c,d); 15 }
ผลลพธของโปรแกรม Enter Character : a Enter String : witchakorn Enter Integer : 11 Enter Float : 11.1111 Character = a String = witchakorn Integer = 11 Float = 11.1111
ถาตองการรบขอมลใหกบตวแปรหลายๆ ตวในเวลาเดยวกน สามารถเขยนโดยการกาหนดตวแทนชนดขอมลทตองการรบเขามาเรยงตามลาดบโดยใหเวนวรรคระหวางตวแทนชนดขอมลแตละตว สวนการกาหนดชอตวแปรนน ใหเรยงตามลาดบโดยมเครองหมายจลภาคหรอคอมมา (,) คนระหวางตวแปร ดงตวอยางท 4.9
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
115
ตวอยางท 4.9 โปรแกรมแสดงการรบขอมลใหกบตวแปรหลายๆ ตวพรอมกน
1 #include<stdio.h> 2 main(){ 3 char a ,b[10]; 4 int c; 5 float d; 6 printf("Enter Character String Integer and Float : ");7 scanf("%c %s %d %f",&a ,b ,&c ,&d); 8 printf("Character = %c String = %s Integer = %d Float
= %f",a,b,c,d); 9 }
ผลลพธของโปรแกรม Enter Character String Integer and Float :a witchakorn 11
11.1111 Character = a String = witchakorn Integer = 11 Float = 11.1111
อธบายโปรแกรม
บรรทดท 6 แสดงขอมล Enter Character String Integer and Float :
บรรทดท 7 รบคาตวอกษร สตรง เลขจานวนเตม เลขทศนยม โดยใหผ ใชปอนคา ซงตองเวนวรรคเมอปอนหนงคา และกด Enter เมอปอนครบทกคาแลว
โปรแกรมตวอยางท 4.9 เปนโปรแกรมรบชอแลวแสดงคาพดทกทาย โปรแกรมนมขอเสยคอ เมอโปรแกรมทางานขนมา หนาจอจะปรากฏตวชตาแหนง (Cursor) กระพรบ ทาใหผใชไมทราบวา คอมพวเตอรรอคาจากคนใช หรอ คนใชรอใหคอมพวเตอรทางาน
ตวอยางท 4.10 โปรแกรมรบชอแลวแสดงคาพดทกทาย 1 #include <stdio.h> 2 void main(void) 3 { 4 char a[80+1]; 5 scanf("%80s",&a); 6 printf("Hi! %s",a); 7 }
ผลลพธของโปรแกรม Krit Somkantha //ปอนคาอนพต
Hi! Krit Somkantha
เพอแกปญหาในการเขยนโปรแกรมควรจะเพมประโยค printf( ) โดยจะเพมเขาไปกอนทจะใชคาสง scanf( ) เพอเปนการบอกแกผใชวา ขณะนคอมพวเตอรรอรบคาจากผใช
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
116
ตวอยางท 4.11 โปรแกรมรบชอแลวแสดงคาพดทกทาย 1 #include <stdio.h> 2 void main(void) 3 { 4 char a[80+1]; 5 printf("Input your name : "); 6 scanf("%80s",&a); 7 printf("Hi! %s",a); 8 }
ผลลพธของโปรแกรม Input your name : Krit Somkantha Hi! Krit Somkantha
4.4.2 การแสดงผลขอมลดวยฟงกชน printf()
ฟงกชนทใชในการแสดงผลขอมลออกทางจอภาพ คอ ฟงกชน printf (print
formatted) โดยมรปแบบการใชฟงกชนดงน
string_format คอสงทตองการแสดงผล ซงอาจเปนขอความทวๆ ไป ตวแทนชนดขอมลตามหรอเอสเคปซเควนซ
data_list คอขอมลทจะแสดงผล ซงอาจเปนคาคงท ตวแปร หรอนพจนใดๆ โดยมเครองหมายคอมมา (,) คนระหวางขอมล ซงจะจบคกบตวแทนชนดขอมลตามลาดบ
printf(“string_format”, data_list);
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
117
ตวอยางท 4.12 โปรแกรมแสดงผลขอมลดวยฟงกชน printf
1 #include<stdio.h> 2 main(){ 3 int score1 = 80 ,score2 = 90; 4 printf("My name is Witchakorn\n"); 5 printf("GPA = %f\n" ,3.88); 6 printf("Score1 = %d\t Score2 = %d\n\a",score1
,score2+5); 7 }
ผลลพธของโปรแกรม My name is Witchakorn GPA = 3.880000 Score1 = 80 Score2 = 95
อธบายโปรแกรม
บรรทดท 4 เปนการแสดงขอความทวๆ ไป ซงกคอ My name is Witchakorn
แลวใหขนบรรทดใหม
บรรทดท 5 เปนการแสดงขอความทวๆ ไป ซงกคอ GPA = แลวตามดวยตวแทนชนดขอมลเลขทศนยม โดยจะนาคาคงท 3.88 มาแสดงผล แลวใหขนบรรทดใหม
บรรทดท 6 เปนการแสดงขอความทวๆ ไป ซงกคอ Score1 = แลวตามดวยตวแทนชนดขอมลจานวนเตม โดยจะนาคาตวแปรตวแรกมาแสดงผล ซงกคอ ตวแปร score1 ซงมคา 80 แลวตามดวยการกดแทบ และขอความทวๆ ไป ซงกคอ Score2 = แลวตามดวยตวแทนชนดขอมลจานวนเตม โดยจะนาคาของนพจน score2 + 5 ซงมคา 95 มาแสดงผล แลวใหขนบรรทดใหม และสงเสยง 1 ครง
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
118
ในการแสดงผลขอมลดวยฟงกชน printf สามารถใสสวนขยายใหกบตวแทนชนดขอมลเพอแสดงผลลพธในตาแหนงตามตองการ ดงตวอยางท 4.13
ตวอยางท 4.13 โปรแกรมแสดงผลขอมลดวยฟงกชน printf โดยใสสวนขยายใหกบตวแทนชนดขอมล
1 #include<stdio.h> 2 main(){ 3 printf("%d\n" ,456); 4 printf("%7d\n" ,456); 5 printf("%07d\n" ,456); 6 printf("%f\n" ,456.55); 7 printf("%.4f\n" ,456.55); 8 printf("%11.4f\n" ,456.55); 9 printf("%-11.4f\n" ,456.55); 10 printf("%c\n",'A'); 11 printf("%11c\n",'A'); 12 printf("%s\n","AAAA"); 13 printf("%11s\n","AAAA"); 14 }
ผลลพธของโปรแกรม 456 456 0000456 456.550000 456.5500 456.5500 456.5500 A A AAAA AAAA
อธบายโปรแกรม
บรรทดท 3 ตวแทนชนดขอมลไมมสวนขยาย ดงนนจงแสดงผลขอมลจานวนเตมชดซาย
บรรทดท 4 ตวแทนชนดขอมลมสวนขยายคอ 7 ดงนนจงแสดงผลขอมลจานวนเตมตวสดทาย (ขวาสด) ทตาแหนงท 7
บรรทดท 5 ตวแทนชนดขอมลมสวนขยายคอ 07 ดงนนจงแสดงผลขอมลจานวนเตมตวสดทาย (ขวาสด) ทตาแหนงท 7 ซงถาจานวนเตมมไมถง 7
หลก จะเตม 0 เขาขางหนาตวเลขทตองการแสดงผลจนครบ 7 หลก
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
119
บรรทดท 6 ตวแทนชนดขอมลไมมสวนขยาย ดงนนจงแสดงผลขอมลทศนยมชดซาย โดยแสดงเลขทศนยม 6 ตาแหนง
บรรทดท 7 ตวแทนชนดขอมลมสวนขยายคอ .4 ดงนนจงแสดงผลขอมลทศนยมชดซาย โดยแสดงเลขทศนยม 4 ตาแหนง
บรรทดท 8 ตวแทนชนดขอมลมสวนขยายคอ 11.4 ดงนนจงแสดงผลขอมลตวสดทาย (ขวาสด) ทตาแหนงท 11 โดยแสดงเลขทศนยม 4 ตาแหนง
บรรทดท 9 ตวแทนชนดขอมลมสวนขยายคอ -11.4 ดงนนจงแสดงผลขอมลทศนยมชดซาย โดยแสดงขอมลทงหมด 11 ตาแหนง ซงจะเปนเลขทศนยม 4 ตาแหนง ซงถามขอมลไมครบ 11 ตาแหนง (รวมจดทศนยม) กจะไมแสดงขอมลอะไรเพมเตม
บรรทดท 10 ตวแทนชนดขอมลไมมสวนขยาย ดงนนจงแสดงผลขอมลตวอกษรชดซาย
บรรทดท 11 ตวแทนชนดขอมลมสวนขยายคอ 11 ดงนนจงแสดงผลขอมลตวอกษรทตาแหนงท 11
บรรทดท 12 ตวแทนชนดขอมลไมมสวนขยาย ดงนนจงแสดงผลขอมลสตรงชดซาย
บรรทดท 13 ตวแทนชนดขอมลมสวนขยายคอ 11 ดงนนจงแสดงผลขอมลสตรงตวสดทาย (ขวาสด) ทตาแหนงท 11
ตวอยางท 4.14 โปรแกรมแสดงการคานวณพนทรปสามเหลยมโดยการรบฐาน และความสงของรปสามเหลยมผานทางคยบอรด และแสดงผลฐาน ความสง และพนทของรปสามเหลยมผานทางหนาจอ
1 #include<stdio.h> 2 main(){ 3 float base ,height ,area; 4 printf("Base of triangle : "); 5 scanf("%f",&base); 6 printf("\nHeight of triangle : "); 7 scanf("%f",&height); 8 area = 0.5 * base * height; 9 printf("*****************************************
************\n"); 10 printf("Base \t\tHeight \t\tArea"); 11 printf("\n%.2f \t\t%.2f \t\t%.2f\n",base ,height
,area); 12 }
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
120
ผลลพธของโปรแกรม Base of triangle : 3.5 Height of triangle : 4 ************************************************************************************* Base Height Area 3.50 4.00 7.00
อธบายโปรแกรม
บรรทดท 4 แสดงขอความ “Base of triangle : ”
บรรทดท 5 รบคาฐานของรปสามเหลยมเปนเลขทศนยมไปเกบไวในตวแปร base
บรรทดท 5 ขนบรรทดใหม และแสดงขอความ “Height of triangle : ”
บรรทดท 6 รบคาความสงของรปสามเหลยมเปนเลขทศนยมไปเกบไวในตวแปร height
บรรทดท 8 คานวณพนทรปสามเหลยม
บรรทดท 9 ขนบรรทดใหม และแสดงขอความ
“*************************************”
บรรทดท 10 แสดงขอความ Base แลวเลอนไป 2 แทบ และแสดงขอความ
“Height” แลวเลอนไป 2 แทบ และแสดงขอความ “Area”
บรรทดท 11 แสดงคาฐานแลวเลอนไป 2 แทบ และคาความสง” แลวเลอนไป 2
แทบ และแสดงคาพนทของรปสามเหลยม โดยแตละคาแสดงทศนยม 2 ตาแหนง
4.4.3 การรบและแสดงผลขอมลดวยฟงกชน getchar() และ putchar()
ฟงกชน getchar() เปนฟงกชนทใชในการรบขอมลตวอกษร 1 ตวจากคยบอรด
ฟงกชน putchar() เปนฟงกชนทใชในการแสดงขอมลตวอกษร 1 ตวจากจอภาพ
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
121
ตวอยางท 4.15 โปรแกรมแสดงการใชฟงกชน getchar() และ putchar()
1 #include<stdio.h> 2 main(){ 3 char a; 4 printf("Enter a value : "); 5 a = getchar(); 6 printf("\n You entered : "); 7 putchar(a); 8 }
ผลลพธของโปรแกรม Enter a value : A You entered : A
อธบายโปรแกรม
บรรทดท 5 รบตวอกษร 1 ตว ไปเกบไวในตวแปร a ไมวาจะพมพอกษรเขาไปทางคยบอรดกตวกตาม เมอกด Enter คาจะถกเกบไวในตวแปรเพยงตวแรกทพมพเทานน
บรรทดท 7 แสดงคาตวแปร a
4.4.4 การรบและแสดงผลขอมลแบบสตรงดวยฟงกชน gets() และ puts()
ฟงกชน gets() มาจากคาวา get string เปนฟงกชนทใชในการรบขอมลสตรงจากคยบอรดมาเกบไวในตวแปรชนดอารเรย โดยสามารถปอนชองวาง (space) ได โดยจะสนสดการรบขอมลสตรงเมอกด Enter ซงฟงกชน gets() นจะใส ‘\0’ (null string) ปดทายใหกบขอความ
ฟงกชน puts() มาจากคาวา put string เปนฟงกชนทใชแสดงขอมลสตรงออกทางจอภาพ
ตวอยางท 4.16 โปรแกรมแสดงการใชฟงกชน gets() และ puts()
1 #include<stdio.h> 2 main(){ 3 char name[50]; 4 printf("Enter a value : "); 5 gets(name); 6 printf("\nYou entered : "); 7 puts(name); 8 }
ผลลพธของโปรแกรม Enter a value : Dr.Krit Somkantha You entered : Dr.Krit Somkantha
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
122
อธบายโปรแกรม
บรรทดท 5 รบคาสตรง ไปเกบไวในตวแปร name โดยสามารถรบคาชองวางได
จะหยดรบคาเมอกด Enter
บรรทดท 7 แสดงคาตวแปร name
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
123
บทสรป
ในบทนไดกลาวถงชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล ซงเปนพนฐานของการเขยนโปรแกรมภาษาซ ชนดของขอมลคอสงทใชกาหนดลกษณะของขอมล และกาหนดขอบเขตของขอมล ซงชนดของขอมลแตละชนดมลกษณะและขอบเขตของขอมลทแตกตางกนไป ในการเขยนโปรแกรมคอมพวเตอรจะตองมกาหนดชนดของขอมลใหกบคาตวแปรซงควรจะเหมาะสมกบชนดของขอมลทตองการเกบ เพอใหเกดความถกตองและประหยดเนอทหนวยความจาในการจดเกบ ตวแปร คอชอทกาหนดขนมา เพอใชเรยกสวนของหนวยความจาของคอมพวเตอรทใชเกบคาใดๆ ทสามารถเปลยนแปลงคาได ในการเขยนโปรแกรมคอมพวเตอรจะมการกระทากบขอมล ซงขอมลตางๆ ดงนนในการเขยนโปรแกรมคอมพวเตอรใหสามารถรบขอมลเขามา ประมวลผลขอมล และแสดงผลขอมล จะใชตวแปรเขามาชวยในการทางาน ซงแตกตางจากภาษาระดบตาทตองอางองหนวยความจา ในโปรแกรมภาษาระดบสงเมอมการสรางตวแปรขนมากจะเกดการจองพนทหนวยความจาโดยอตโนมต โดยทผ เขยนโปรแกรมไมจาเปนตองรวาตวแปรทสรางขนมาใชหนวยความจาตาแหนงไหน ซงการอางชอตวแปรในทนกเปรยบเสมอนการอางตาแหนงในหนวยความจานนเอง คาคงท คอคาของขอมลทแนนอน ไมสามารถเปลยนแปลงคาไดในขณะทโปรแกรมทางาน ตวแปรคาคงทคอตวแปรทกาหนดคาไดครงเดยว และคานนจะคงเดมจนจบโปรแกรม
มกใชเกบคาคงทสาหรบการคานวณเชน คา pi, คา e, จานวนชวโมงในหนงวน เปนตน คาคงทมหลายชนดเชนคาคงทชนดจานวนเตม คาคงทชนดเลขทศนยม และคาคงทชนดตวอกษรเปนตน การรบและแสดงผลขอมลเปนการกระทาเกยวกบขอมลตางๆ ซงขอมลทไดมาจากแหลงใดในบทนแสดงตวอยางของการรบและแสดงผลขอมลพนฐานของภาษาซ ดงเชนการรบขอมลดวยฟงกชน scanf() การแสดงผลขอมลดวยฟงกชน printf() การรบและแสดงผลขอมลดวยฟงกชน getchar() และ putchar() การรบและแสดงผลขอมลแบบสตรงดวยฟงกชน gets()
และ puts() เปนตน
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
124
แบบฝกหดทบทวน
1. ชนดขอมลคออะไร แบงออกเปนกชนดอะไรบาง 2. ตวแปรคออะไร มวธการประกาศคาตวแปรอยางไร 3. จงอธบายความแตกตางระหวางตวแปรแบบโกลบอล และตวแปรแบบโลคอล พรอมทงยกตวอยางประกอบ
4. คาคงทคออะไร มวธการกาหนดคาคงทอยางไร 5. จงพจารณาชอตวแปรตอไปน แลวบอกวาชอตวแปรแตละตวตงชอถกตองตามกฎการตงชอหรอไมอยางไร
a. password
b. password1
c. PASSWORD
d. Pass_Word
e. _Password
f. 1password
g. switch
h. pass word
i. pass@word
j. #password
6. จงหาผลลพธของโปรแกรมตอไปน
1 #include<stdio.h> 2 main(){ 3 char var = ‘P’; 4 var = var – 5; 5 printf(“Variable = %c\n”, var); 6 }
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
125
7. จงหาผลลพธของโปรแกรมตอไปน
1 2 3 4 5 6 7 8 9 10 11 12
#include<stdio.h> main(){ char a = ‘P’ ,d; int b = 10 ,e; float c = 10.5 ,f; d = a + b + c; e = a + b + c; f = a + b + c; printf(“Result = %c\n” ,d); printf(“Result = %d\n” ,e); printf(“Result = %f\n” ,f); }
8. จงหาผลลพธของโปรแกรมตอไปน main_test.c
1 2 3 4 5 6
#include <stdio.h> #include "write_test.c" float a=44.44; main(){ write(); }
write_test.c
1 2 3 4 5
#include <stdio.h> extern float a; write(){ printf("a = %f\n", a); }
9. จงหาผลลพธของโปรแกรมตอไปน
1 #include<stdio.h> 2 main(){ 3 printf("%d\n" ,1234); 4 printf("%7d\n" ,1234); 5 printf("%07d\n" ,1234); 6 printf("%f\n" ,1234.56); 7 printf("%.2f\n" ,1234.56); 8 printf("%c\n",'A'); 9 printf("%10c\n",'A'); 10 printf("%s\n","ABCD"); 11 printf("%10s\n","ABCD"); 12 }
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
126
10. จงหาผลลพธของโปรแกรมตอไปน
1 #include <stdio.h> 2 void main(void) 3 { 4 printf("%c\n",'A'); 5 printf("%i\n",'A'); 6 printf("%o\n",'A'); 7 printf("%x\n\n",'A'); 8 9 printf("%c\n",97); 10 printf("%i\n",97); 11 printf("%o\n",97); 12 printf("%x\n\n",97); 13 14 printf("%c\n",45678u); 15 printf("%u\n",45678u); 16 printf("%o\n",45678u); 17 printf("%x\n\n",45678u); 18 19 printf("%c\n",2147483514l); 20 printf("%li\n",2147483514l); 21 printf("%lo\n",2147483514l); 22 printf("%lx\n\n",2147483514l); 23 }
11. จงหาผลลพธของโปรแกรมตอไปน
1 #include <stdio.h> 2 void main(void) 3 { 4 printf("%f\n",321.123456789f); 5 printf("%e\n\n",321.0123456789f); 6 7 printf("%lf\n",-112.345678901234567890e60); 8 printf("%le\n\n",-112.345678901234567890e60); 9 10 printf("%Lf\n",-112.345678901234567890e360L); 11 printf("%Le\n\n",-112.345678901234567890e360L); 12 }
บทท 4 ชนดของขอมล ตวแปร คาคงท และการรบและแสดงผลขอมล
127
12. จงเขยนโปรแกรมเพอคานวณหาผลรวมและคาเฉลยของคะแนนของนกศกษา 3 วชา โดยใหผ ใชปอนขอมลคะแนนทง 3 วชาทางคยบอรด และแสดงผลรวมและคาเฉลยผานทางจอภาพ
ตวอยางหนาจอโปรแกรม คอ
13. จงเขยนโปรแกรมเพอคานวณหาพนทของวงกลมโดยรบคารศมของวงกลมทางคยบอรด
จากนนใหแสดงรศม และพนทของวงกลมออกทางหนาจอ 14. จงเขยนโปรแกรมเพอใหสามารถรบคายอดซอของลกคาทางคยบอรด แลวคานวณสวนลด
และราคาหลงหกสวนลด จากนนใหแสดงยอดซอ สวนลด และ ราคาหลงหกสวนลดผานทางจอภาพ
โดย สวนลด = ยอดซอ * 10 /100
ราคาหลงหกสวนลด = ยอดซอ – สวนลด
Input score : 76 99 87
sum = 262 average = 87.00
บทท 5 การดาเนนการในภาษาซ
บทท 5
การดาเนนการในภาษาซ
ในบทนจะกลาวถงตวดาเนนการ (Operator) ตวดาเนนการทางคณตศาสตร (Arithmetic Operators) ตวดาเนนการทางตรรกะ (Logical Operators) ตวดาเนนการเชงสมพนธ (Relational Operators) ตวดาเนนการระดบบต (Bitwise Operators) ตวดาเนนการกาหนดคา (Assignment Operator) ตวดาเนนการเงอนไข (Condition Operators) ลาดบการทางาน (Precedence) ในการเขยนโปรแกรมจะมการดาเนนการระหวางขอมลหรอตวแปรตางๆ เพอทาการประมวลผลใหไดผลลพธทตองการ ดงนนในการเขยนโปรแกรมจาเปนตองศกษาการดาเนนการตางๆ ในภาษาซ ซงจะทาใหสามารถเขยนโปรแกรมไดอยางถกตองและมประสทธภาพ ในการดาเนนการมองคประกอบทสาคญคอตวดาเนนการซงมกจะนามาใชรวมกบนพจนในรปแบบตางๆ ซงตวดาเนนการเมอนาไปใชกบนพจนกจะทาใหเกดการประมวลผลตางๆ ตวดาเนนการทใชในการประมวลผลขอมลในภาษาซมหลากหลายชนด ซงแตละชนดจะมลาดบความสาคญ และลาดบการทางานแตกตางกน ดงนนจงควรจะเขาใจขนตอนการประมวลผลขอมลดวยตวดาเนนการตางๆ เพอสามารถเลอกใชตวดาเนนการตางๆ ไดอยางถกตองและเหมาะสม
5.1 ตวดาเนนการ (Operator)
ตวดาเนนการคอเครองหมายทใชประมวลผลขอมล ซงอาจเปนการดาเนนการทางคณตศาสตร การดาเนนการทางตรรกศาสตร หรอการดาเนนการดานอนๆ ตวดาเนนการมหลายประเภท ในการศกษาตวดาเนนการในภาษาซจะมสงทจาเปนตองรคอ
บทท 5 การดาเนนการในภาษาซ
130
ตวถกดาเนนการ (Operand) คอตวถกกระทา ซงอาจเปนคาคงท นพจน ฟงกชน หรอตวแปรใดๆ กได
นพจน (Expression) คอการนาเอาตวดาเนนการ และตวถกดาเนนการมาสรางความสมพนธกน ดงเชนนพจนทางคณตศาสตรคอ 2X
2 และนพจนในภาษาซ คอ 2*(x*x)
ยนาร (Unary) คอตวดาเนนการทใชตวถกดาเนนการเพยงตวเดยวในการประมวลผล เชน ~a ,a++ เปนตน
ไบนาร (Binary) คอตวดาเนนการทใชตวถกดาเนนการสองตวในการประมวลผล เชน
a + b , a || b เปนตน
เทอนาร (Ternary) คอตวดาเนนการทใชตวถกดาเนนการสามตวในการประมวลผล เชน a ? b : c เปนตน
ตวดาเนนการมหลากหลายประเภทดงเชนตวดาเนนการทางคณตศาสตร (Arithmetic
Operators) ตวดาเนนการทางตรรกะ (Logical Operators) ตวดาเนนการเชงสมพนธ (Relational Operators) ตวดาเนนการระดบบต (Bitwise Operators) ตวดาเนนการกาหนดคา (Assignment Operator) และตวดาเนนการเงอนไข (Condition Operators) เปนตน ตวดาเนนการเมอนาไปใชกบนพจนจะทาใหเกดพจนในรปแบบตางๆ เพอทจะนาไปใชประมวลผล
5.2 ตวดาเนนการทางคณตศาสตร (Arithmetic Operators)
ตวดาเนนการทางคณตศาสตรหมายถงการนาคาตวถกดาเนนการมาประมวลผลตามชนดของตวดาเนนการทางคณตศาสตร ซงตวดาเนนการทางคณตศาสตรดงแสดงในตารางท
5.1 ซงจะแสดงตวอยางโดยการกาหนดตวแปร a และตวแปร b ใหมคาเทากบ 10 และ 6
ตามลาดบ
บทท 5 การดาเนนการในภาษาซ
131
ตารางท 5.1 ตวดาเนนการทางคณตศาสตร
ตวดาเนนการ ความหมาย ตวอยาง ผลลพธ + บวก a+b 16
- ลบ a-b 4
* คณ a*b 60
/ หาร a/b 1
% หารเอาเศษ a%b 4
++ ++a หมายถงการบวกคาของ a ดวย 1 กอน แลวจงนาคา a ไปใช
c=++a c = 11 ,a = 11
a++ หมายถงการนาคาของ a ไปใชกอน แลวจงนา a ไปบวกดวย 1
c = a++ c = 10 ,a = 11
-- --a หมายถงการลบคาของ a ดวย 1 กอน แลวจงนาคา a ไปใช
c = --a c = 9 ,a = 9
a-- หมายถงการนาคาของ a ไปใชกอน แลวจงนา a
ไปลบดวย 1
c = a-- c = 10 ,a = 9
บทท 5 การดาเนนการในภาษาซ
132
ตวอยางท 5.1 โปรแกรมแสดงการดาเนนการทางคณตศาสตร
1 #include<stdio.h> 2 main(){ 3 int a=10,b=6,c; 4 printf("a = %d, b = %d\n" ,a,b); 5 printf("a + b = %d\n" ,a + b); 6 printf("a - b = %d\n" ,a - b); 7 printf("a * b = %d\n" ,a * b); 8 printf("a / b = %d\n" ,a / b); 9 printf("a % b = %d\n" ,a % b); 10 c = ++a; 11 printf("c = ++a, c = %d a = %d\n" ,c ,a); 12 c = a++; 13 printf("c = a++, c = %d a = %d\n" ,c ,a); 14 c = --a; 15 printf("c = --a, c = %d a = %d\n" ,c ,a); 16 c = a--; 17 printf("c = a--, c = %d a = %d\n" ,c ,a); 18 }
ผลลพธของโปรแกรม a = 10, b =6 a + b = 16 a - b = 4 a * b = 60 a / b = 1 a % b = 4 c = ++a, c = 11 a =11 c = a++, c = 11 a =12 c = --a, c = 11 a = 11 c = a--, c = 11 a = 10
อธบายโปรแกรม
บรรทดท 5 เปนการแสดงผลลพธของ a + b
บรรทดท 6 เปนการแสดงผลลพธของ a - b
บรรทดท 7 เปนการแสดงผลลพธของ a * b
บรรทดท 8 เปนการแสดงผลลพธของ a / b
บรรทดท 9 เปนการแสดงผลลพธของ a % b
บรรทดท 10 สงให a บวก 1 แลวให c เทากบ a
บรรทดท 12 สงให c เทากบ a แลวให a บวก 1
บรรทดท 14 สงให a ลบ 1 แลวให c เทากบ a
บรรทดท 16 สงให c เทากบ a แลวให a ลบ 1
บทท 5 การดาเนนการในภาษาซ
133
ตวดาเนนการทางคณตศาสตรเราสามารถจาแนกออกเปน 4 กลมใหญ คอ ตวดาเนนการทางคณตศาสตรจานวนเตม (Integer Arithmetic Operator) ตวดาเนนการทางคณตศาสตรทศนยม (Floating Point Arithmetic Operator) ตวดาเนนการกาหนดคาทางคณตศาสตร (Arithmetic Assignment Operator) และตวดาเนนการทางคณตศาสตรเพมคาลดคา (Increment and Decrement Operator)
5.2.1 ตวดาเนนการทางคณตศาสตรจานวนเตม (Integer Arithmetic Operator)
ตวดาเนนการทางคณตศาสตรจานวนเตมเปนตวดาเนนการทางคณตศาสตรทเปนเลขจานวนเตมทใชกบตวถกดาเนนการทเปนเลขจานวนเตมและไดผลลพธเปนเลขจานวนเตม
ดงตวอยางทแสดงในตารางท 5.2
ตารางท 5.2 ตวดาเนนการทางคณตศาสตรจานวนเตม
ชอ เครองหมาย ตวอยางการใช
ความหมาย ผลลพธ
บวก (Add)
+ 1 + 2 หนงบวกสอง 3
ลบ
(Sub) - 1 – 2 หนงลบสอง -1
คณ
(Multiply) * 1 * 2 หนงคณสอง 2
หาร (Division)
/ 3 / 2 สามหารสอง 1 (ตอบเฉพาะจานวนเตม)
%
(Modulus) % 1 % 2 เศษจากหนงหารสอง 1
บทท 5 การดาเนนการในภาษาซ
134
ตวอยางท 5.2 โปรแกรมแสดงการดาเนนการทางคณตศาสตรทเปนเลขจานวนเตม
1 #include <stdio.h> 2 main() 3 { 4 printf("%i\n",1 + 2); 5 printf("%i\n",2 - 3); 6 printf("%i\n",3 * 4); 7 printf("%i\n",4 / 5); 8 printf("%i\n",6 % 7); 9 }
ผลลพธของโปรแกรม 3 -1 12 0 6
อธบายโปรแกรม
บรรทดท 4 เปนการบวกคาแลวแสดงผล บรรทดท 5 เปนการลบคาแลวแสดงผล บรรทดท 6 เปนการคณคาแลวแสดงผล บรรทดท 7 เปนการหารคาแลวแสดงผลซงจะได 0.8 แตในผลลพธจะแสดงคา 0
เพราะเปนเลขจานวนเตม
บรรทดท 8 เปนการหารเอาเศษแลวแสดงผล
5.2.2 ตวดาเนนการทางคณตศาสตรทศนยม (Floating Point Arithmetic Operator)
ตวดาเนนการทางคณตศาสตรทศนยมเปนตวดาเนนการทใชกบตวถกกระทาเลขทศนยมและไดผลลพธเปนเลขทศนยม ดงตวอยางทแสดงในตารางท 5.3
ตารางท 5.3 ตวดาเนนการทางคณตศาสตรทศนยม
ชอ เครองหมาย ตวอยางการใช ความหมาย ผลลพธ บวก (Add) + 1.0 + 2.0 หนงบวกสอง 3.0
ลบ (Sub) - 1.0 – 2.0 หนงลบสอง -1.0
คณ (Multiply) * 1.0 * 2.0 หนงคณสอง 2.0
หาร (Division) / 1.0 / 2.0 หนงหารสอง 0.5
บทท 5 การดาเนนการในภาษาซ
135
ตวอยางท 5.3 โปรแกรมแสดงการดาเนนการทางคณตศาสตรทเปนเลขทศนยม
1 #include <stdio.h> 2 main() 3 { 4 printf("%f\n",1.0f + 2.0f); 5 printf("%f\n",2.0f - 3.0f); 6 printf("%f\n",3.0f * 4.0f); 7 printf("%f\n",4.0f / 5.0f); 8 }
ผลลพธของโปรแกรม 3.000000 -1.000000 12.000000 0.800000
อธบายโปรแกรม
บรรทดท 4 เปนการบวกคาของเลขทศนยมแลวแสดงผล บรรทดท 5 เปนการลบคาของเลขทศนยมแลวแสดงผล บรรทดท 6 เปนการคณคาของเลขทศนยมแลวแสดงผล บรรทดท 7 เปนการหารคาของเลขทศนยมแลวแสดงผล
5.2.3 ตวดาเนนการกาหนดคาทางคณตศาสตร (Arithmetic Assignment Operator)
ตวดาเนนการกาหนดคาทางคณตศาสตรเปนการกาหนดคาทางคณตศาสตร ในประโยคกาหนดคาประโยคหนง หากมตวแปรตวหนงปรากฏในดานซายและขวาของเครองหมายเทากบ ประโยคนนกอาจถกเปลยนไปใชตวดาเนนการกาหนดคาทางคณตศาสตร ดงตวอยางทแสดงในตารางท 5.4
บทท 5 การดาเนนการในภาษาซ
136
ตารางท 5.4 ตวดาเนนการกาหนดคาทางคณตศาสตร คาเรมตน เครองหมาย ตวอยางการใช ความหมาย ผลลพธ
p = 3 += p += 5 p = p + 5 8
p = 3 -= p -= 5 p = p - 5 -2
p = 3 *= p *= 5 p = p * 5 15
p = 3 /= p /= 5 p = p / 5 0
q = 1.0 += p += 2.5 p = p + 2.5 3.5
q = 1.0 -= p -= 2.5 p = p - 2.5 -1.5
q = 1.0 *= p *= 2.5 p = p * 2.5 2.5
q = 1.0 /= p /= 2.5 p = p / 2.5 0.4
ตวอยางท 5.4 โปรแกรมแสดงตวดาเนนการกาหนดคาทางคณตศาสตร 1 #include <stdio.h> 2 3 main() 4 { 5 int x = 1; 6 x += 1; printf("%i\n",x); /* x = x + 1 */ 7 x *= 2; printf("%i\n",x); /* x = x * 2 */ 8 x -= 3; printf("%i\n",x); /* x = x – 3 */ 9 x /= 4; printf("%i\n",x); /* x = x / 4 */ 10 11 float y = 1.0f; 12 y += 1.0f; printf("%f\n",y);/* y = y + 1.0f */ 13 y *= 2.0f; printf("%f\n",y);/* y = y * 2.0f */ 14 y -= 3.0f; printf("%f\n",y);/* y = y – 3.0f */ 15 y /= 4.0f; printf("%f\n",y);/* y = y / 4.0f */ 16 }
ผลลพธของโปรแกรม 2 4 1 0 2.000000 4.000000 1.000000 0.250000
บทท 5 การดาเนนการในภาษาซ
137
อธบายโปรแกรม
บรรทดท 6 เปนการกาหนดคาทางคณตศาสตรโดยการบวกของเลขจานวนเตม
บรรทดท 7 เปนการกาหนดคาทางคณตศาสตรโดยการลบของเลขจานวนเตม
บรรทดท 8 เปนการกาหนดคาทางคณตศาสตรโดยการคณของเลขจานวนเตม
บรรทดท 9 เปนการกาหนดคาทางคณตศาสตรโดยการหารของเลขจานวนเตม
บรรทดท 12 เปนการกาหนดคาทางคณตศาสตรโดยการบวกของเลขทศนยม
บรรทดท 13 เปนการกาหนดคาทางคณตศาสตรโดยการลบของเลขทศนยม
บรรทดท 14 เปนการกาหนดคาทางคณตศาสตรโดยการคณของเลขทศนยม
บรรทดท 15 เปนการกาหนดคาทางคณตศาสตรโดยการหารของเลขทศนยม
จะเหนไดวาการเขยนโปรแกรมดวยการใชตวดาเนนการกาหนดคาทางคณตศาสตรในลกษณะนนนทาใหเขาใจโปรแกรมไดยาก แตขอดของการกาหนดคาในลกษณะนคอโปรแกรมจะทางานไดเรวขน เนองจากการคนหาตาแหนงของตวแปรในหนวยความจาของประโยค ดงเชน x += 1 ทาเพยงครงเดยวในขณะท x = x +1 ทาสองครง
5.2.4 ตวดาเนนการทางคณตศาสตรเพมคาและลดคา (Increment and Decrement
Operator)
ตวดาเนนการทางคณตศาสตรเพมคาและลดคาคอการเพมคาและการลดคาของตวแปรตางๆ เชนถาหากมการเพมคาของตวแปรขนหนง เชน x = x +1 อาจถกเปลยนเปน ++x
หรอ x++ และหากมประโยคทลดคาตวแปรลงหนงเชน x = x – 1 กอาจถกเปลยนเปน - - x
หรอ x - - ตวดาเนนการทางคณตศาสตรเพมคาและลดคาสามารถใชไดสองรปแบบคอ
แบบเตมหนา (Prefix) คอมเครองหมาย ++ หรอ - - นาหนาเชน - - x, ++x
แบบเตมหลง (Postfix) คอมเครองหมาย ++ หรอ - - ตามหลงเชน x- -, x++
กรณทเปนประโยคเดยวเชน x++ หรอ ++x จะใหความหมายเหมอนกน แตถามการใชกบคาอนๆ จะใหผลลพธทแตกตางกน โดยถาเปนแบบเตมหนาจะทาการประมวลผลเครองหมาย ++,- - กอน แตถาเปนแบบเตมหลงจะทาการประมวลผลเครองหมาย ++, - - ทหลง ดงตวอยางทแสดงในตารางท 5.5
บทท 5 การดาเนนการในภาษาซ
138
ตารางท 5.5 ตวดาเนนการทางคณตศาสตรเพมคาและลดคา คาเรมตน เครองหมาย ตวอยางการใช ขนตอนการทางาน ผลลพธ p = 3
q= 7
++ a = ++p + q p = p + 1
a = p + q
p = 4
q = 7
a = 11
p = 3
q= 7
++ a = (p++) + q a = p + q
p = p + 1
p = 4
q = 7
a = 10
p = 3
q= 7
++ a = (p++) + (++q) q = q + 1
a = p + q
p = p + 1
p = 4
q = 8
a = 11
p = 3
q= 7
- - a = - -p + q p = p - 1
a = p + q
p = 2
q = 7
a = 9
p = 3
q= 7
- - a = (p- -) + q a = p + q
p = p - 1
p = 2
q = 7
a = 10
p = 3
q= 7
- - a = (p- -) + (- -q) q = q - 1
a = p + q
p = p - 1
p = 2
q = 6
a = 9
p = 3
q= 7
- - a = (p- -) + (+ +q) q = q - 1
a = p + q
p = p - 1
p = 2
q = 8
a = 11
บทท 5 การดาเนนการในภาษาซ
139
ตวอยางท 5.5 โปรแกรมแสดงตวดาเนนการทางคณตศาสตรเพมคาและลดคา
1 #include <stdio.h> 2 main() 3 { 4 int x = 1; int y = 1; 5 x++; ++y; 6 printf("x=%i y=%i\n",x,y); 7 x--; --y; 8 printf("x=%i y=%i\n",x,y); 9 }
ผลลพธของโปรแกรม x=2 y=2 x=1 y=1
อธบายโปรแกรม
บรรทดท 5 เปนการดาเนนการทางคณตศาสตรโดยการเพมคา เครองหมายสวนเพม (Increment) ถกใชแบบประโยคเดยว ดงนนเราสามารถเปลยนบรรทดนเปน ++x; y++; ผลลพธกยงคงใหผลลพธเดม
บรรทดท 7 เปนการดาเนนการทางคณตศาสตรโดยการลบคา เครองหมายสวนลด (Decrement) ถกใชแบบประโยคเดยว ดงนนเราสามารถเปลยนบรรทดนเปน --x; --y; ผลลพธกยงคงใหผลลพธเดม
ตวอยางท 5.6 โปรแกรมแสดงตวดาเนนการทางคณตศาสตรเพมคาและลดคา
1 #include <stdio.h> 2 3 main() 4 { 5 int a,b; 6 int x = 1; int y = 1; 7 a = x++; b = ++y; 8 printf("x=%i y=%i\n",x,y); 9 printf("a=%i b=%i\n",a,b); 10 a = x--; b = --y; 11 printf("x=%i y=%i\n",x,y); 12 printf("a=%i b=%i\n",a,b); 13 }
ผลลพธของโปรแกรม x=2 y = 2 a=1 b=2 x=1 y = 1 a=2 b=1
บทท 5 การดาเนนการในภาษาซ
140
อธบายโปรแกรม
บรรทดท 7 เปนการดาเนนการทางคณตศาสตรโดยการเพมคา เครองหมายสวนเพม ถกใช รวมกบประโยคอน ดงนน ลาดบเครองหมายจงมความสาคญ a = x++; หมายความวาใหตวแปร a เกบคา x กอนแลวคอยทาการเพมคา x ทหลง และ b = ++y; หมายความวาใหทาการเพมคา y กอน แลวคอยสงคาใหตวแปร b
บรรทดท 10 เปนการดาเนนการทางคณตศาสตรโดยการลบคา เครองหมายสวนเพม ถกใช รวมกบประโยคอน ดงนน ลาดบเครองหมายจงมความสาคญ a = x--; หมายความวาใหตวแปร a เกบคา x กอนแลวคอยทาการลดคา x ทหลง และ b = --y; หมายความวาใหลดคา y
กอน แลวคอยสงคาใหกบตวแปร b
สาเหตทตองมการเขยน x = x + 1 ในรปของ x++ (หรอ ++x) และ x = x - 1 ในรปของ x-- (หรอ -- x) เนองจากหนวยประมวลผลจะมภาษาแอสเซมบลของแตหนวยประมวลผล ทสงใหบวกคาขนหนง (INC) และคาสงลดคาลงหนง (DEC) ดงนนการเขยนประโยค ++ หรอ -- จงเสมอนกบการเขยนภาษาเครองโดยตรงทาใหโปรแกรมมขนาดเลกลง ความเรวในการทางานสงขนและเขยนโปรแกรมสนลง
5.2.5 ลาดบการทางานของตวดาเนนการ คอการเรยงลาดบการทางานตามความสาคญของชนดของตวดาเนนการ โดยตว
ดาเนนการทมความสาคญมากกวาตวดาเนนการอนๆ ทอยในนพจนเดยวกนจะถกประมวลผลกอน แตถามตวดาเนนการทมความสาคญเทากนจะประมวลผลจากซายไปขวา ยกเวนตวดาเนนการ ++ และตวดาเนนการ -- ทจะประมวลผลจากขวาไปซาย โดยลาดบของความสาคญของตวดาเนนการสามารถแสดงไดดงตารางท 5.6 ซงแสดงใหเหนวา เครองหมายวงเลบมความสาคญเปนลาดบแรก ในขณะทเครองหมายบวก และเครองหมายลบมความสาคญเปนลาดบสดทาย
บทท 5 การดาเนนการในภาษาซ
141
ตารางท 5.6 ลาดบความสาคญของตวดาเนนการ ลาดบความสาคญ ตวดาเนนการ
1 ()
2 ++ ,--
3 - (เครองหมายลบหนาตวเลข) 4 * ,/ ,%
5 + ,-
ตวอยางท 5.7 จงหาคาของนพจน 2 + 3 * 4 – 5
วธทา 2 + 3 * 4 – 5 เครองหมาย * มความสาคญสงกวาเครองหมาย + , –
ดงนนจงประมวลผลกอน
2 + 12 – 5 เครองหมาย + มความสาคญเทากบเครองหมาย – แตอยดานซายสดจงประมวลผลกอนเครองหมาย –
14 – 5 เครองหมาย – ประมวลผลเปนลาดบสดทาย 9
ตวอยางท 5.8 จงหาคาของนพจน 2 + 3 * 4 – 5 % ( 6 / 3 )
วธทา 2 + 3 * 4 – 5 % ( 6 / 3 ) เครองหมาย () มความสาคญสงสด ดงนนจงทาในวงเลบกอน
2 + 3 * 4 – 5 % 2 เครองหมาย * มความสาคญเทากบเครองหมาย % แตอยดานซายจงประมวลผลกอนเครองหมาย /
2 + 12 – 5 % 2 เครองหมาย % มความสาคญสงกวาเครองหมาย + , –
ดงนนจงประมวลผลกอน
2 + 12 – 1 เครองหมาย + มความสาคญเทากบเครองหมาย – แตอยดานซายสดจงประมวลผลกอนเครองหมาย –
14 – 1 เครองหมาย – ประมวลผลเปนลาดบสดทาย 13
บทท 5 การดาเนนการในภาษาซ
142
5.2.6 การแปลงชนดขอมล ชนดขอมลของตวถกดาเนนการในนพจนใดๆ จะตองเปนชนดขอมลเดยวกน ดงนนถาตวถกดาเนนการมชนดขอมลแตกตางกน จะตองทาการแปลงใหเปนขอมลชนดเดยวกนกอน
แลวจงทาการประมวลผล ซงการแปลงชนดขอมลม 2 แบบ คอ
1. ตวแปลภาษาหรอคอมไพเลอรทาการแปลง (Implicit Type Conversion) คอคอมไพเลอรจะทาการแปลงชนดขอมลทมนยสาคญตาไปเปนชนดขอมลทมนยสาคญสงสดในนพจนใดๆ และถานพจนใดทมเครองหมายเทากบ (=) จะดาเนนการทางขวามอของเครองหมายเทากบกอน แลวจงแปลงชนดขอมลทางขวามอของเครองหมายเทากบใหเหมอนกบชนดขอมลทางซายมอของเครองหมายเทากบ โดยนยสาคญของตวถกดาเนนการสามารถแสดงไดดงตารางท 5.7 ซงแสดงใหเหนวา ชนดขอมลแบบ “long double” มนยสาคญสงสด ในขณะทชนดขอมลแบบ “char” มนยสาคญตาสด ตวอยางของการแปลงขอมลและชนดขอมลสดทายทไดจากการคานวณเชน
Data type of expression Final data type
char + float float
int – long long
int * double double
float / long double long double
การเปลยนขอมลลกษณะนจะรบประกนความถกตองของขอมลวาจะไมมการสญหายของขอมลเพราะเปนการแปลงชนดขอมลจากขนาดเลกไปเปนขนาดใหญ เรยกการแปลงชนดขอมลจากเลกไปใหญวา
บทท 5 การดาเนนการในภาษาซ
143
ตารางท 5.7 ลาดบนยสาคญของตวถกดาเนนการ ลาดบนยสาคญ ชนดขอมล
1 long double
2 double
3 float
4 unsigned long int
5 long int
6 unsigned int
7 int
8 short
9 char
ตวอยางท 5.9 โปรแกรมแสดงการแปลงชนดขอมลโดยคอมไพเลอร
1 #include<stdio.h> 2 main(){ 3 char a = 'K'; 4 int b = 5 ,d; 5 float c = 10.00; 6 d = a + b * c; 7 printf(“d = %d\n” , d); 8 printf("a + b * c = %f\n" , a + b * c); 9 printf("(a + b)* c = %f\n" , (a + b) * c); 10 }
ผลลพธของโปรแกรม d = 125 a + b * c = 125.000000 (a + b) * c = 800.000000
บรรทดท 6 ทาการคานวณคาระหวางขอมลชนดตวอกษร จานวนเตม และทศนยม จากนนแปลงผลลพธใหเปนชนดขอมลเดยวกบชนดขอมลของตวแปร d ซงกคอ จานวนเตมนนเอง
บรรทดท 8 - 9 ทาการคานวณคาระหวางขอมลชนดตวอกษร จานวนเตม และทศนยม ซงผลลพธทไดจะเปนขอมลชนดทมนยสาคญสงสด ซงกคอขอมลทศนยมนนเอง
บทท 5 การดาเนนการในภาษาซ
144
2. ผ เขยนโปรแกรมทาการแปลง (Explicit Type Conversion) คอผ เขยนโปรแกรมจะทาการแปลงชนดขอมลไปเปนชนดขอมลทตองการ มกเรยกวา “Casting” โดยมรปแบบการแปลงชนดขอมลดงน
ดงเชน
int a;
double b = 10.2;
a = (int)b;
หมายความวา แปลงคาทเกบใน b (คอ 10.2) ไปเปนจานวนเตม แลวเกบไวทตวแปร a
และ
int a;
a = (int)(12.5f / 3.2f);
หมายความวา แปลงคาผลลพธของเลขทศนยมไปเปนจานวนเตม แลวเกบไวทตวแปร a
ตวอยางท 5.10 โปรแกรมแสดงการแปลงชนดขอมลโดยผใช
1 #include<stdio.h> 2 main(){ 3 char a = 'K'; 4 int b = 5; 5 float c = 10.00; 6 printf("a + b * c = %d\n" , (int)(a + b * c)); 7 printf("(a + b)* c = %d\n" , (int)((a + b) *
c)); 8 }
ผลลพธของโปรแกรม a + b * c = 125 (a + b) * c = 800
(ชนดขอมลทตองการ)นพจนทตองการแปลงชนดขอมล
บทท 5 การดาเนนการในภาษาซ
145
อธบายโปรแกรม
บรรทดท 6 - 7 ทาการคานวณคาระหวางขอมลชนดตวอกษร จานวนเตม และทศนยม ซงผลลพธทไดจะเปนขอมลชนดทมนยสาคญสงสด ซงกคอขอมลทศนยม แลวทาการแปลงชนดขอมลใหเปนจานวนเตม
5.3 ตวดาเนนการทางตรรกะ (Logical Operators)
ตวดาเนนการทางตรรกะหมายถงการพจารณาเชงเหตและผลทเกยวของกบคาตรรกะ 2 คา คอ จรง (True) และเทจ (False) โดยจะถอวาเลข 0 เปนคาเทจ และเลข 1 หรอเลขอนๆ เปนคาจรง ซงตวดาเนนการทางตรรกะแบงออกเปน 3 ชนด ดงตารางท 5.8 ซงจะแสดงตวอยางโดยการกาหนดตวแปร A และตวแปร B ใหมคาเทากบ 1 และ 0 ตามลาดบ โดยทวไปตวดาเนนการทางตรรกะมกนยมใชกบคาสงควบคม
ตารางท 5.8 ตวดาเนนการทางตรรกะ ตวดาเนนการ ความหมาย ตวอยาง ผลลพธ
&& และ (AND) คาตรรกะจะเปนจรงในกรณทตวถกดาเนนการทงคเปนจรง
A && B เทจ
|| หรอ (OR) คาตรรกะจะเปนจรงในกรณทตวถกดาเนนการตวใดตวหนงเปนจรง
A || B จรง
! นเสธ (NOT) คาตรรกะจะมคาตรงขามกบคาของตวถกดาเนนการ
!A เทจ
บทท 5 การดาเนนการในภาษาซ
146
ตวอยางท 5.11 โปรแกรมแสดงการดาเนนการทางตรรกะ 1 #include <stdio.h> 2 main(){ 3 printf("1 && 1 = %d\n", 1 && 1); 4 printf("1 && 0 = %d\n", 1 && 0); 5 printf("0 && 1 = %d\n", 0 && 1); 6 printf("0 && 0 = %d\n", 0 && 0); 7 printf("1 || 1 = %d\n", 1 || 1); 8 printf("1 || 0 = %d\n", 1 || 0); 9 printf("0 || 1 = %d\n", 0 || 1); 10 printf("0 || 0 = %d\n", 0 || 0); 11 printf("!1 = %d\n", !1); 12 printf("!0 = %d\n", !0); 13 printf("(2+3*4) && 0 = %d\n", (2+3*4) && 0); 14 printf("(2+3*4) || 0 = %d\n", (2+3*4) || 0); 15 printf("!((2+3*4) && 0) = %d\n", !((2+3*4) && 0)); 16 printf("!(2+3*4) || 0) = %d\n", !((2+3*4) || 0)); 17 }
ผลลพธของโปรแกรม 1 && 1 = 1 1 && 0 = 0 0 && 1 = 0 0 && 0 = 0 1 || 1 = 1 1 || 0 = 1 0 || 1 = 1 0 || 0 = 0 !1 = 0 !0 = 1 (2+3*4) && 0 = 0 (2+3*4) || 0 = 1 !((2+3*4) && 0) = 1 !((2+3*4) || 0) = 0
อธบายโปรแกรม
บรรทดท 13 ผลลพธของ 2+3*4 = 14 ดงนน 14 && 0 เทากบ 0
บรรทดท 14 ผลลพธของ 2+3*4 = 14 ดงนน 14 || 0 เทากบ 1
บรรทดท 15 ผลลพธของ 14 && 0 เทากบ 0 ดงนน นเสธของ 0 เทากบ 1
บรรทดท 16 ผลลพธของ 14 || 0 เทากบ 1 ดงนน นเสธของ 1 เทากบ 0
บทท 5 การดาเนนการในภาษาซ
147
ตวอยางท 5.12 ตวอยางการใชงานตวดาเนนการทางตรรกะ คาเรมตน ตวอยางการใชงาน ความหมาย ผลลพธ a = 1
b = ‘B’
(a==1) && (b==‘B’) ตวแปร a มคาเทากบหนง และ ตวแปร b มคาเทากบอกษร B จรงหรอไม
จรง
a = 1
b = ‘B’
(a<=1) || (b!=‘B’) ตวแปร a มคานอยกวาหรอเทากบหนง หรอ
ตวแปร b มคาไมเทากบอกษร B จรงหรอไม จรง
a = 1
b = ‘B’
(a>1) || (‘A’>‘B’) ตวแปร a มคามากกวาหนง หรอ
อกษร A (มคา 65) มคามากกวาอกษร B (มคา 66) จรงหรอไม เทจ
ตวอยางท 5.13 โปรแกรมแสดงการดาเนนการทางตรรกะ 1 #include <stdio.h> 2 3 main() 4 { 5 int x=1, y=-1; 6 printf("%i\n",(x<0) && (y<0)); /* Is x < 0 and y < 0 ? */ 7 printf("%i\n",(x<0) || (y<0)); /* Is x < 0 or y < 0 ? */ 8 printf("%i\n",!(x<0)); /* Isn’t x < 0 ? */ 9 }
ผลลพธของโปรแกรม 0 1 1
อธบายโปรแกรม
บรรทดท 6 เปรยบเทยบ 1 < 0 เปนเทจ และ -1 < 0 เปนจรง เงอนไขใดเงอนไขหนงเปนเทจถอวาเปนเทจดงนนจงแสดง 0
บรรทดท 7 เปรยบเทยบ 1 < 0 เปนเทจ หรอ -1 < 0 เปนจรง เงอนไขใดเงอนไขหนงเปนจรงถอวาเปนจรงดงนนจงแสดง 1
บรรทดท 8 เปรยบเทยบ 1 < 0 เปนเทจ ไดผลลพธเปน 0 แต มนเสธ (NOT) คาตรรกะจะมคาตรงขามกบคาของตวถกดาเนนการดงนนผลลพธจงกลายเปน 1
บทท 5 การดาเนนการในภาษาซ
148
5.4 ตวดาเนนการเชงสมพนธ (Relational Operators)
ตวดาเนนการเชงสมพนธหมายถงการพจารณาความสมพนธของขอมลของตวถกดาเนนการ ซงเปนไปได 2 คา คอ จรง (True) และเทจ (False) โดยจะถอวาเลข 0 เปนคาเทจ และเลข 1 หรอเลขอนๆ เปนคาจรง ซงตวดาเนนการเชงสมพนธแบงออกเปน 6 ชนด ดงตารางท 5.9 ซงจะแสดงตวอยางโดยการกาหนดตวแปร A และตวแปร B ใหมคาเทากบ 10 และ 5
ตามลาดบ โดยทวไปมกใชตวดาเนนการเชงสมพนธกบโครงสรางโปรแกรมแบบตรวจสอบเงอนไข
ตารางท 5.9 ตวดาเนนการเชงสมพนธ ตวดาเนนการ ความหมาย ตวอยาง ผลลพธ
== ต ร ว จ ส อ บ ว า ค า ข อ ง ต ว ถ กดาเนนการมคาเทากนหรอไม ถาเทากนแสดงวา เ ปนจรง ถาไมแสดงวาเปนเทจ
A == B เทจ
!= ต ร ว จ ส อ บ ว า ค า ข อ ง ต ว ถ กดาเนนการมคาเทากนหรอไม ถาเทากนแสดงวา เ ปนเทจ ถาไมแสดงวาเปนจรง
A != B จรง
> ต ร ว จ ส อ บ ว า ค า ข อ ง ต ว ถ กดาเนนการดานซายมคามากกวาคาของตวถกดาเนนการดานขวาหรอไม ถาใชแสดงวาเปนจรง ถาไมแสดงวาเปนเทจ
A > B จรง
< ต ร ว จ ส อ บ ว า ค า ข อ ง ต ว ถ กดาเนนการดานซายมคานอยกวาคาของตวถกดาเนนการดานขวาหรอไม ถาใชแสดงวาเปนจรง ถาไมแสดงวาเปนเทจ
A < B เทจ
บทท 5 การดาเนนการในภาษาซ
149
ตวดาเนนการ ความหมาย ตวอยาง ผลลพธ >= ต ร ว จ ส อ บ ว า ค า ข อ ง ต ว ถ ก
ดาเนนการดานซายมคามากกวาห ร อ เ ท า ก บ ค า ข อ ง ต ว ถ กดาเนนการดานขวาหรอไม ถาใชแสดงวาเปนจรง ถาไมแสดงวาเปนเทจ
A >= B จรง
<= ต ร ว จ ส อ บ ว า ค า ข อ ง ต ว ถ กดาเนนการดานซายมคานอยกวาห ร อ เ ท า ก บ ค า ข อ ง ต ว ถ กดาเนนการดานขวาหรอไม ถาใชแสดงวาเปนจรง ถาไมแสดงวาเปนเทจ
A <= B เทจ
ตวอยางท 5.14 ตวอยางการดาเนนการเชงสมพนธ
ตวอยางการใช ความหมาย ผลลพธ 1 = = 2 หนงเทากบสองจรงหรอไม ไมจรง (เทจ) 1 ! = 2 หนงไมเทากบสองจรงหรอไม จรง 1 < 1 หนงนอยกวาหนงจรงหรอไม ไมจรง (เทจ) 1 <= 1 หนงนอยกวาหรอเทากบหนงจรงหรอไม จรง 1 > 1 หนงมากกวาหนงจรงหรอไม ไมจรง (เทจ) 1 >= 1 หนงมากกวาหรอเทากบหนงจรงหรอไม จรง
บทท 5 การดาเนนการในภาษาซ
150
ตวอยางท 5.15 โปรแกรมแสดงการดาเนนการเชงสมพนธ
1 #include <stdio.h> 2 main(){ 3 printf("10 == 5 is %d\n", 10 == 5); 4 printf("10 != 5 is %d\n", 10 != 5); 5 printf("10 > 5 is %d\n", 10 > 5); 6 printf("10 < 5 is %d\n", 10 < 5); 7 printf("10 >= 5 is %d\n", 10 >= 5); 8 printf("10 <= 5 is %d\n", 10 <= 5); 9 printf("(2+3*4)==((2+3)*4) is %d\n", (2+3*4)==
((2+3)*4)); 10 }
ผลลพธของโปรแกรม 10 == 5 is 0 10 != 5 is 1 10 > 5 is 1 10 < 5 is 0 10 >= 5 is 1 10 <= 5 is 0 (2+3*4) == ((2+3)*4) is 0
อธบายโปรแกรม
บรรทดท 9 ผลลพธของ 2+3*4 คอ 14 สวนผลลพธของ (2+3)*4 คอ 20 ดงนน
(2+3*4) == ((2+3)*4) จงเปนเทจ ซงมคาเทากบ 0
ตวอยางท 5.16 โปรแกรมแสดงการดาเนนการเชงสมพนธ
1 #include <stdio.h> 2 3 main() 4 { 5 int a=1,b=2; 6 7 printf("a=%i b=%i\n",a,b); 8 printf("a==a is %i\n",a==a); 9 printf("a!=a is %i\n",a!=a); 10 printf("a<b is %i\n",a<b); 11 printf("a>b is %i\n",a>b); 12 printf("a<=b is %i\n",a<=b); 13 printf("a>=b is %i\n",a>=b); 14 }
ผลลพธของโปรแกรม a=1 b=2 a==a is 1 a!=a is 0 a<b is 1 a>b is 0
บทท 5 การดาเนนการในภาษาซ
151
a<=b is 1 a>=b is 0
อธบายโปรแกรม
บรรทดท 8 เปรยบเทยบ 1 เทากบ 1 จรงหรอเทจ ซงไดแสดงผลลพธเปนจรง บรรทดท 9 เปรยบเทยบ 1 ไมเทากบ 1 จรงหรอเทจ ซงไดแสดงผลลพธเปนเทจ บรรทดท 10 เปรยบเทยบ 1 นอยกวา 2 จรงหรอเทจ ซงไดแสดงผลลพธเปนจรง บรรทดท 11 เปรยบเทยบ 1 มากกวา 2 จรงหรอเทจ ซงไดแสดงผลลพธเปนเทจ บรรทดท 12 เปรยบเทยบ 1 นอยกวาหรอเทากบ 2 จรงหรอเทจ ซงไดแสดงผล
ลพธเปนจรง บรรทดท 13 เปรยบเทยบ 1 มากกวาหรอเทากบ 2 จรงหรอเทจ ซงไดแสดงผล
ลพธเปนเทจ
5.5 ตวดาเนนการระดบบต (Bitwise Operators)
ตวดาเนนการระดบบตหมายถงการแปลงตวถกดาเนนการใหเปนเลขฐานสองกอนแลวจงนาคาแตละบตของตวถกดาเนนการมาประมวลผลดวยตวดาเนนการ ซงตวดาเนนการระดบบตแบงออกเปน 6 ชนด ดงตารางท 5.10 ตวถกดาเนนการทจะถกคานวณโดยตวดาเนนการระดบบตจะถกตความเปนเลขฐานสองกอนแลวคอยทาการคานวณ ซงจะใชไดกบขอมลประเภทจานวนเตม
ตารางท 5.10 ตวดาเนนการระดบบต
ตวดาเนนการ ความหมาย & Bitwise AND
| Bitwise OR
^ Bitwise XOR
~ Bitwise NOT
>> Right Shift
<< Left Shift
บทท 5 การดาเนนการในภาษาซ
152
ผลลพธของตวดาเนนการระดบบต & ,| ,^ ,~ สามารถแสดงไดดงตารางท 5.11
ตารางท 5.11 ผลลพธของตวดาเนนการระดบบต & ,| ,^ ,~
A B A & B A | B A ^ B ~A
1 1 1 1 0 0
1 0 0 1 1 0
0 1 0 1 1 1
0 0 0 0 0 1
“Left Shift” คอ การเลอนบตไปทางซายสวนทางขวามอสดใหเตมศนยไปหนงตวผลลพธทไดคอการคณสองคาเรมตน ในขณะท “Right shift” คอการเลอนบตไปทางขวามอสวนทางซายมอสดกเพมศนยไปอกตวหนงผลลพธทไดคอการ หาร 2 คาเรมตน (ผลหารทไดปดเศษลงเสมอ) แสดงตวอยางดงรป 5.1
รปท 5.1 แสดงการเลอนบตทางซายและการเลอนบตทางขวา
เหตผลทมการใชตวดาเนนการระดบบตเนองมาจากการคานวณระดบบตเปนการคานวณในเลขฐานสอง ซงสอดคลองกบลกษณะการทางานของคอมพวเตอร จงทาใหคาสงทใชตวดาเนนการระดบบตทางานไดเรวเมอเปรยบเทยบกบตวดาเนนการทางคณตศาสตรอนๆ อกทงในหนวยประมวลผลมคาสงสาหรบกระทาระดบบตโดยตรง ทาใหการใชงานเทยบเทากบคาสงภาษาเครอง สงผลใหโปรแกรมทางานไดเรว นกเขยนโปรแกรมทมประสบการณมกใชตว ดาเนนการระดบบตในการคานวณบางอยางทตองการความเรวสง และประหยดหนวยความจา
บทท 5 การดาเนนการในภาษาซ
153
ถากาหนดให a = 17 และ b = 28 และใหตวเลขตอไปนใชหนวยความจา 8 บต
ผลลพธจากการคานวณดวยตวกระทาระดบบตตางๆ แสดงดงในตารางท 5.12
ตารางท 5.12 ตวอยางการดาเนนการระดบบต
เครองหมาย ตวอยาง การใช
ขนตอนการทางาน ผลลพธ
& a & b 17 = 0001 0001 28 = 0001 1100 17 & 28 = 0001 0000
0001 0000 = 16
| a | b 17 = 0001 0001 28 = 0001 1100 17 | 28 = 0001 1101
0001 1101 = 29
^ a ^ b 17 = 0001 0001 28 = 0001 1100 17 ^ 28 = 0000 1101
0000 1101 = 13
<< a << 2 17 = 0001 0001 Left Shift first = 0010 0010 Left Shift second = 0100 0100
0100 0100 = 68
>> a >> 2 17 = 0001 0001 Right Shift first = 0000 1000 Right Shift second = 0000 0100
0000 0100 = 4
~ ~a 17 = 0001 0001 ~17 = 1110 1110
1110 1110 = -18
ตวอยางท 5.17 กาหนดให A = 45, B = 54 จงหาผลลพธตอไปน
1. A & B
2. A | B
3. A ^ B
4. ~A
5. A >> 2
6. A << 2
วธทา 45 เขยนในรปของบต คอ 0010 1101
54 เขยนในรปของบต คอ 0011 0110
A = 45 0010 1101
B = 54 0011 0110
A & B 0010 0100
เพราะฉะนน A & B คอ 36
บทท 5 การดาเนนการในภาษาซ
154
A = 45 0010 1101
B = 54 0011 0110
A | B 0011 1111
เพราะฉะนน A | B คอ 63
A = 45 0010 1101
B = 54 0011 0110
A ^ B 0001 1011
เพราะฉะนน A ^ B คอ 27
A = 45 0010 1101
~A 1101 0010
เพราะฉะนน ~A คอ -46
A 0010 1101
A >> 2 0000 1011 01
เพราะฉะนน A >> 2 คอ 11
A 0010 1101
A << 2 00 1011 0100
เพราะฉะนน A << 2 คอ 180
ตวอยางท 5.18 โปรแกรมแสดงการดาเนนการระดบบต
1 #include <stdio.h> 2 main(){ 3 printf("45 & 54 = %d\n", 45 & 54); 4 printf("45 | 54 = %d\n", 45 | 54); 5 printf("45 ^ 54 = %d\n", 45 ^ 54); 6 printf("~45 = %d\n", ~45); 7 printf("45 >> 2 = %d\n", 45 >> 2); 8 printf("45 << 2 = %d\n", 45 << 2); 9 }
ผลลพธของโปรแกรม 45 & 54 = 36 45 | 54 = 63 45 ^ 54 = 27 ~45 = -46 45 >> 2 = 11 45 << 2 = 180
บทท 5 การดาเนนการในภาษาซ
155
อธบายโปรแกรม
บรรทดท 3 กระทาการแอนด (AND) กนระหวางคาสองคาแลวแสดงผล บรรทดท 4 กระทาการออร (OR) กนระหวางคาสองคาแลวแสดงผล บรรทดท 5 กระทาการเอกซคลซพออร (XOR) กนระหวางคาสองคาแลว
แสดงผล บรรทดท 6 กระทาการนอต (NOT) กนระหวางคาสองคาแลวแสดงผล บรรทดท 7 กระทาการเลอนบตไปทางขวา 2 บต (Right Shift) แลวแสดงผล บรรทดท 8 กระทาการเลอนบตไปทางซาย 2 บต (Left Shift) แลวแสดงผล
ในการดาเนนการระดบบตสามารถทาไดอกรปแบบคอใชการกาหนดคาตวถกดาเนนการระดบบต ทมการคนหาตาแหนงของตวแปรในหนวยความจาเพยงครงเดยว ทาใหสามารถทางานไดเรวกวาการดาเนนการระดบบตแบบทวไป ดงแสดงในตวอยางในตารางท
5.13
ตารางท 5.13 การกาหนดคาตวถกดาเนนการระดบบต
คาเรมตน เครองหมาย ตวอยางการใช ขนตอนการทางาน
ผลลพธ
a = 17 &= a &= 28 a = a & 28 16
a = 17 |= a |= 28 a = a | 28 28
a = 17 ^= a ^= 28 a = a ^ 28 13
a = 17 <<= a <<= 2 a = a << 2 16
a = 17 >>= a >>= 2 a = a >> 2 4
ตวอยางท 5.19 โปรแกรมแสดงการดาเนนการระดบบต
1 #include <stdio.h> 2 void main(void) 3 { 4 int a = 17; /* 10001 */ 5 a &= 48; printf("%i\n",a); 6 a |= 8; printf("%i\n",a); 7 a ^= 14; printf("%i\n",a); 8 a <<= 2; printf("%i\n",a); 9 a >>= 3; printf("%i\n",a); 10 }
บทท 5 การดาเนนการในภาษาซ
156
ผลลพธของโปรแกรม 16 24 22 88 11
อธบายโปรแกรม
บรรทดท 5 กระทาการแอนด (AND) กนระหวางคาสองคาแลวแสดงผล บรรทดท 6 กระทาการออร (OR) กนระหวางคาสองคาแลวแสดงผล บรรทดท 7 กระทาการเอกซคลซพออร (XOR) กนระหวางคาสองคาแลว
แสดงผล บรรทดท 8 กระทาการเลอนบตไปทางซาย 2 บต (Left Shift) แลวแสดงผล
เชนเดยวกนกบ a = a << 2
บรรทดท 9 กระทาการเลอนบตไปทางขวา 3 บต (Right Shift) แลวแสดงผล เชนเดยวกนกบ a = a >> 3
5.6 ตวดาเนนการกาหนดคา (Assignment Operator)
ตวดาเนนการกาหนดคาหมายถงการกาหนดคาโดยใชเครองหมายเทากบ (=) โดยใหตวแปรซงเปนตวถกดาเนนการทอยดานซายของเครองหมายเทากบมคาเทากบคาทอยดานขวาของเครองหมายเทากบ ซงตวดาเนนการทใชในการกาหนดคาแบงออกเปน 11 ชนด
ดงตารางท 5.14
ตารางท 5.14 ตวดาเนนการกาหนดคา ตวดาเนนการ ความหมาย ตวอยาง
= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบคาของตวถกดาเนนการดานขวา
A = B + C หมายถง การกาหนดคาให A มคาเทากบ
B + C
+= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบคาของตวถกดาเนนการดานซายบวกดวยตวถกดาเนนการดานขวา
A += B หมายถง A = A +
B
บทท 5 การดาเนนการในภาษาซ
157
ตวดาเนนการ ความหมาย ตวอยาง -= กาหนดคาใหตวถกดาเนนการดานซายมคา
เทากบคาของตวถกดาเนนการดานซายลบดวยตวถกดาเนนการดานขวา
A -= B หมายถง A = A – B
*= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบคาของตวถกดาเนนการดานซายคณดวยตวถกดาเนนการดานขวา
A *= B หมายถง A = A * B
/= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบคาของตวถกดาเนนการดานซายหารดวยตวถกดาเนนการดานขวา
A /= B หมายถง A = A / B
%= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบคาของตวถกดาเนนการดานซายหารเอาเศษดวยตวถกดาเนนการดานขวา
A %= B หมายถง A = A % B
&= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบตวถกดาเนนการดานซาย Bitwise
AND ตวถกดาเนนการดานขวา
A &= 2 หมายถง A = A & 2
|= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบตวถกดาเนนการดานซาย Bitwise
OR ตวถกดาเนนการดานขวา
A |= 2 หมายถง A = A |2
^= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบตวถกดาเนนการดานซาย Bitwise
XORตวถกดาเนนการดานขวา
A ^= 2 หมายถง A = A ^ 2
>>= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบตวถกดาเนนการเลอนบตไปดานขวา
A >>= 2 หมายถง A = A >> 2
<<= กาหนดคาใหตวถกดาเนนการดานซายมคาเทากบตวถกดาเนนการเลอนบตไปดานซาย
A >>= 2 หมายถง A = A >> 2
บทท 5 การดาเนนการในภาษาซ
158
ตวอยางท 5.20 โปรแกรมแสดงการกาหนดคา
1 #include <stdio.h> 2 main(){ 3 int A = 45; 4 int B = 54; 5 printf("A += B is %d\n", A += B); 6 printf("A -= B is %d\n", A -= B); 7 printf("A *= B is %d\n", A *= B); 8 printf("A /= B is %d\n", A /= B); 9 printf("A %= B is %d\n", A %= B); 10 printf("A &= B is %d\n", A &= B); 11 printf("A |= B is %d\n", A |= B); 12 printf("A >>= 3 is %d\n", A >>= 3); 13 printf("A <<= 3 is %d\n", A <<= 3); 14 printf("A ^= B is %d\n", A ^= B); 15 }
ผลลพธของโปรแกรม A += B is 99 A -= B is 45 A *= B is 2430 A /= B is 45 A %= B is 45 A &= B is 36 A |= B is 54 A >>= 3 is 6 A <<= 3 is 48 A ^= B is 6
อธบายโปรแกรม
บรรทดท 5 กระทาการบวกระหวางสองคา แลวแสดงผล บรรทดท 6 กระทาการลบระหวางสองคา แลวแสดงผล บรรทดท 7 กระทาการคณระหวางสองคา แลวแสดงผล บรรทดท 8 กระทาการหารระหวางสองคา แลวแสดงผล บรรทดท 9 กระทาการหารเอาเศษระหวางสองคา แลวแสดงผล บรรทดท 10 กระทาการแอนดระหวางสองคา แลวแสดงผล บรรทดท 11 กระทาการออรระหวางสองคา แลวแสดงผล บรรทดท 12 กระทาการเลอนบตไปทางขวา 3 บต แลวแสดงผล บรรทดท 13 กระทาการเลอนบตไปทางซาย 3 บต แลวแสดงผล บรรทดท 14 กระทาการเอกซคลซพออร ระหวางคาสองคาแลวแสดงผล
บทท 5 การดาเนนการในภาษาซ
159
5.7 ตวดาเนนการเงอนไข (Condition Operators)
ตวดาเนนการเงอนไขหมายถงตวดาเนนการทใชตรวจสอบเงอนไขของนพจน (?:) โดยจะตรวจสอบวานพจนท 1 มคาเปนจรงหรอเทจ ถาเปนจรงจะประมวลผลนพจนท 2 แตถาเปนเทจจะประมวลผลนพจนท 3 มรปแบบการตรวจสอบ ดงน
ตวอยางท 5.21 โปรแกรมแสดงการดาเนนการตรวจสอบเงอนไข
1 #include <stdio.h> 2 main(){ 3 int a = 10 ,b = 15; 4 (a > b) ? printf("%d > %d\n",a ,b) : printf("%d
> %d\n",b ,a); 5 }
ผลลพธของโปรแกรม 15 > 10
อธบายโปรแกรม
บรรทดท 4 เปนการใชตวดาเนนการตรวจสอบเงอนไข ถา a > b จรง ใหพมพ a
> b แตถาไมใชใหพมพ b > a
5.8 ลาดบการทางาน (Precedence)
ลาดบการทางานคอการเรยงลาดบการทางานตามความสาคญของชนดของตวดาเนนการ โดยตวดาเนนการทมความสาคญมากกวาตวดาเนนการอนๆ ทอยในนพจนเดยวกนจะถกประมวลผลกอน แตถามตวดาเนนการทมความสาคญเทากนจะประมวลผลตามทศทางการการคานวณ (Associativity) วาจากซายไปขวา (Left Associativity) หรอขวาไปซาย (Right Associativity) โดยทศทางการคานวณสามารถแสดงไดดงตารางท 5.15
นพจน1 ? นพจน2 : นพจน3
บทท 5 การดาเนนการในภาษาซ
160
ตารางท 5.15 ทศทางการคานวณ
ประเภท ตวดาเนนการ ทศทางการคานวณ
ตวดาเนนการทางคณตศาสตร + ,- ,* ,/ ,% ซายไปขวา ตวดาเนนการทางตรรกะ && ,|| ซายไปขวา ตวดาเนนการเชงสมพนธ == ,!= , > ,< ,>= ,<= ซายไปขวา ตวดาเนนการระดบบต & ,| , ^ , >> ,<< ซายไปขวา ยนาร ++ ,-- ,! ,~ ,+ ,- ขวาไปซาย การกาหนดคาตวแปร = ,+= ,-= ,*= ,/= ,%= , &= ,|=
,^= ,>>= ,<<=
ขวาไปซาย
ตว ด า เ น น ก า รต ร ว จสอบเงอนไข
?: ขวาไปซาย
ตวอยางท 5.22 โปรแกรมแสดงทศทางการคานวณ
1 #include <stdio.h> 2 void main(void){ 3 printf("(2+3*4) && 0 || 1 = %d\n", (2+3*4) && 0 || 1); 4 printf("15 >> 3 << 2 = %d\n", 15 >> 3 << 2); 5 printf("10 == 5 != 3 is %d\n", 10 == 5 != 3); 6 printf("45 & 54 | 10 = %d\n", 45 & 54 | 10); 7 }
ผลลพธของโปรแกรม (2+3*4) && 0 || 1 =1 15 >> 3 << 2 =4 10 == 5 != 3 is 1 45 & 54 | 10 =46
อธบายโปรแกรม
บรรทดท 3 คานวณคาในวงเลบ (2+3*4) = 14 แลวนา 14 && 0 จะได 0 แลวนา 0 || 1 จะได 1
บรรทดท 4 นา 15 มาเลอนบตไปทางขวา 3 จะได 1 แลวเลอนบตไปทางซาย 2
จะได 4
บรรทดท 5 10 == 5 จะได 0 แลวนา 0 != 3 จะได 1
บรรทดท 6 นา 45 & 54 จะได 36 แลวนา 36 | 10 จะได 46
บทท 5 การดาเนนการในภาษาซ
161
บทสรป
ในบทนไดกลาวถงตวดาเนนการ ตวดาเนนการทางคณตศาสตร ตวดาเนนการทางตรรกะ ตวดาเนนการเชงสมพนธ ตวดาเนนการระดบบต ตวดาเนนการกาหนดคา ตวดาเนนการเงอนไข ลาดบการทางาน ซงเปนพนฐานของการดาเนนการตางๆ ในการเขยนโปรแกรมภาษาซ ในการดาเนนการมองคประกอบทสาคญคอตวดาเนนการตางๆ ทมอยหลากหลายชนด แตละชนดกเหมาะสาหรบการประมวลผลในแตละรปแบบ ตวดาเนนการคอเครองหมายทใชประมวลผลขอมล ซงอาจเปนการดาเนนการทางคณตศาสตร การดาเนนการทางตรรกศาสตร หรอการดาเนนการดานอนๆ ตวดาเนนการทางคณตศาสตรหมายถงการนาคาตวถกดาเนนการมาประมวลผลตามชนดของตวดาเนนการทางคณตศาสตร ซงตวดาเนนการทางคณตศาสตรสามารถจาแนกออกเปน 4 กลมใหญ คอ ตวดาเนนการทางคณตศาสตรจานวนเตม ตวดาเนนการทางคณตศาสตรทศนยม ตวดาเนนการกาหนดคาทางคณตศาสตร และตวดาเนนการทางคณตศาสตรเพมคาลดคา ตวดาเนนการทางตรรกะหมายถงการพจารณาเชงเหตและผลทเกยวของกบคาตรรกะ 2 คา คอ จรง (True) และเทจ (False) โดยจะถอวาเลข 0 เปนคาเทจ และเลข 1 หรอเลขอนๆ เปนคาจรง ซงตวดาเนนการทางตรรกะสามารถแบงออกเปน 3 ชนด ตวดาเนนการเชงสมพนธหมายถงการพจารณาความสมพนธของขอมลของตวถกดาเนนการ ซงเปนไปได 2 คา คอ จรง (True) และเทจ (False) โดยจะถอวาเลข 0 เปนคาเทจ และเลข 1 หรอเลขอนๆ เปนคาจรง ซงตวดาเนนการเชงสมพนธแบงออกเปน 6 ชนด ตวดาเนนการระดบบตหมายถงการแปลงตวถกดาเนนการใหเปนเลขฐานสองกอนแลวจงนาคาแตละบตของตวถกดาเนนการมาประมวลผลดวยตวดาเนนการ ซงตวดาเนนการระดบบตแบงออกเปน 6 ชนด ตวดาเนนการกาหนดคาหมายถงการกาหนดคาโดยใชเครองหมายเทากบ (=) โดยใหตวแปรซงเปนตวถกดาเนนการทอยดานซายของเครองหมายเทากบมคาเทากบคาทอยดานขวาของเครองหมายเทากบ ซงตวดาเนนการทใชในการกาหนดคาสามารถแบงออกเปน 11 ชนด ตวดาเนนการเงอนไขหมายถงตวดาเนนการทใชตรวจสอบเงอนไขของนพจน ลาดบการทางานคอการเรยงลาดบการทางานตามความสาคญของชนดของตวดาเนนการ โดยตวดาเนนการทมความสาคญมากกวาตวดาเนนการอนๆ ทอยในนพจนเดยวกนจะถกประมวลผลกอน แตถามตวดาเนนการทมความสาคญเทากนจะประมวลผลตามทศทางการการคานวณ
บทท 5 การดาเนนการในภาษาซ
162
แบบฝกหดทบทวน
1. ตวดาเนนการคออะไร จงอธบาย และมอะไรบาง 2. ตวถกดาเนนการคออะไร จงอธบาย พรอมทงยกตวอยาง 3. นพจนคออะไร จงอธบาย พรอมทงยกตวอยาง 4. จงหาคาของนพจนตอไปน
1. 2 + 3 * 4 -15 /5
2. (4 + 5 – (2 + 3)) * 5 % 6
3. 10 /5 * 2 + 3 % 5
4. 15 ^ 3
5. 15 & 3
6. 15 | 3
7. ~15
8. 15 >> 3 << 3
5. จงหาคาของ a เมอ a = 8 ,b = 4
1. a += b
2. a -=b
3. a*=b
4. a/=b
5. a %=b
6. จงหาคาของนพจนตอไปน
1. (20 >= 10) && (20 <= 10)
2. (10 != 1) && 0
3. (2 + 3 * 4) || 1
4. !(!1 || !0)
บทท 5 การดาเนนการในภาษาซ
163
7. จงหาผลลพธของโปรแกรมตอไปน
1 #include<stdio.h> 2 main(){ 3 int a = 2 ,b = 5 ,c; 4 c = (a++) + (++b); 5 printf("a = %d b = %d c = %d\n",a,b,c); 6 c = (--a) + (b--); 7 printf("a = %d b = %d c = %d\n",a,b,c); 8 c = c - a-- + b; 9 printf("a = %d b = %d c = %d\n",a,b,c); 10 c = c + ++a - b; 11 printf("a = %d b = %d c = %d\n",a,b,c); 12 }
8. จงหาผลลพธของโปรแกรมตอไปน
1 #include<stdio.h> 2 main(){ 3 char a = 'W'; 4 int b = 15 ,d; 5 float c = 5.00; 6 d = a + b * c /11; 7 printf("d = %d\n" , d); 8 printf("a + b * c / 11 = %f\n",a + b * c /11); 9 printf("(a + b)* c /11 = %f\n",(a + b) * c /11); 10 printf("a + b * c /11 = %d\n",(int)(a + b * c/11));11 }
9. จงเตมคาลงในตารางใหถกตอง คาเรมตน การใชงาน ขนตอนการทางาน ผลลพธ p = 3
q= 7
a = - - p + (++q) p =
q =
a =
p = 3
q= 7
a = (- -p) – (++q) p =
q =
a =
p = 3
q= 7
a = (++p) + (q++) p =
q =
a =
บทท 5 การดาเนนการในภาษาซ
164
คาเรมตน การใชงาน ขนตอนการทางาน ผลลพธ p = 3
q= 7
a = p++ * q p =
q =
a =
p = 3
q= 7
a = (p- -) / q p =
q =
a =
p = 3
q= 7
a = (q- -) % (- -p) p =
q =
a =
10. จงเตมคาลงในตารางใหถกตอง คาเรมตน ตวอยางการใชงาน ความหมาย ผลลพธ a = 1
b = ‘B’
(a!=1) || (b!=‘B’)
a = 1
b = ‘B’
(a>1) && (b==‘B’)
a = 1
b = ‘B’
(a<1) || (‘A’==‘B’)
11. จงเขยนผลลพธของโปรแกรมพรอมทงอธบายการทางานของโปรแกรม
1 #include <stdio.h> 2 void main(void) 3 { 4 int a = 1; 5 printf("%i\n",a++); 6 printf("%i\n",a); 7 printf("%i\n",++a); 8 printf("%i\n",a); 9 }
บทท 5 การดาเนนการในภาษาซ
165
1 #include <stdio.h> 2 void main(void) 3 { 4 int a = 2002;
5 printf("This year is %i and next year is %i\n",a++,a);
6 printf("%i",a); 7 }
12. จงเขยนโปรแกรมรบคาเลขจานวนเตมเขามา 3 คา แลวแสดงผลออกทางจอภาพ ดงตวอยาง
Please enter three numbers: 15 35 72 Your numbers forward: 15 35 72 Your numbers reversed: 72 35 15
13. จงเขยนโปรแกรมแปลงคาองศาเซลเซยส (Degree Celsius) เปนองศาฟาเรนไฮต (Degree Fahrenheit) ดงสมการน )
100
180(32 CF
14. จงเขยนโปรแกรม แปลงคาเงนบาทเปนดอลลารสหรฐ และโปรแกรมแปลงคาดอลลารสหรฐเปนเงนบาท
15. จงเขยนโปรแกรมแปลง พศ. เปน คศ. และ โปรแกรมแปลง คศ. เปน พศ.
16. จงเขยนโปรแกรมแปลงนาทเปนชวโมงพรอมทงระบเศษนาท
17. จงเขยนโปรแกรมเพอหาคาพนทของรปสามเหลยมดงรป
สง
ฐาน
จากสตร ½ * ฐาน * สง
a
b จากสตร
½ * a * b * sin
บทท 5 การดาเนนการในภาษาซ
166
a
b
c
จากสตร 2
))()((
cbas
csbsass
บทท 6 คาสงควบคม
บทท 6
คาสงควบคม
ในบทนจะกลาวถงพนฐานคาสงควบคมในภาษาซ (Fundamental of Control
Statement of C Language) คาสงแบบลาดบ (Sequential Statement) คาสงแบบเลอกหรอแบบมเงอนไข (Condition Statement) คาสงแบบวนซา (Repetition Statement) คาสงแบบกระโดด (Jump Statement) คาสงควบคมเปนกระบวนการในการควบคมลาดบการทางานของโปรแกรม ชวยควบคมทศทางของคาสงไปตามการทางานของโปรแกรมตางๆ เพอใหสามารถแกไขปญหาตางๆ ไดอยางเหมาะสม โดยทวไปการทางานของโปรแกรมคอมพวเตอรคาสงจะถกดาเนนการเปนคาสงแบบลาดบตงแตตนจนจบโปรแกรม แตในการเขยนโปรแกรมในการแกปญหางานทซบซอนตางๆ จะมการเปลยนแปลงคาสงของการทางานเชนกระโดดไปทางานในคาสงอน วนกลบมาทาซา หรอตรวจสอบเงอนไขเปนตน ซงลกษณะการทางานแบบนจาเปนตองใชคาสงควบคมจงจะสามารถเขยนโปรแกรมไดอยางมประสทธภาพ
6.1 พนฐานคาสงควบคมในภาษาซ (Fundamental of Control Statement of
C Language)
ในการเขยนโปรแกรมภาษาจะมรปแบบในการเขยนคาสงเพอแกปญหาหรอรปแบบในการเขยนโปรแกรมตางๆ เพอใหสามารถดาเนนการเขยนโปรแกรมนนอยางมประสทธภาพ
คาสงควบคมพนฐานในภาษาซสามารถเขยนคาสงควบคมได 4 รปแบบ นนคอ แบบเสนตรง (Sequential) แบบมทางเลอก (Selection) แบบทาซา (Repetition) และแบบกระโดด (Jump)
โดยแตละแบบกจะมโครงสรางการทางานทแตกตางกน ดงแสดงในรปท 6.1
บทท 6 คาสงควบคม
168
1
5
4
3
2
1
5
4
3
2
1
5
4
3
2
1
5
4
3
2
(ก) (ข) (ค) (ง)
รปท 6.1 รปแบบการเขยนคาสงของโปรแกรม
แบบเสนตรง รปท 6.1(ก) คอการทางานจากบนลงลาง เราจะตองทาตามคาสงทก ๆ คาสงทเขยน จากรปท 6.1(ก) จะเปนรปของคาสง 5 คาสงซงจะตองประมวลคาสงทกคาสง โดยจะตองเรยงจากบนลงลาง ลกษณะการทางานแบบนเปนลกษณะการทางานของโปรแกรมทวไป ดงตวอยางผงงานของการเขยนคาสงในรปท 6.2
รปท 6.2 คาสงแบบเรยงลาดบ
บทท 6 คาสงควบคม
169
แบบมเงอนไข รปท 6.1(ข) คอการทางานของโปรแกรมจะสามารถเลอกคาสงได โดยจะทาการตรวจสอบกบเงอนไขทไดตงไว จากรปท 6.1(ข) คาสงท 1 เปนคาสงเงอนไขเลอกทา ถาตรงกบเงอนไขแรกกจะทาคาสงท 2 และ 3 ถาตรงกบอกเงอนไขกจะทาคาสงท 4 และไปทาคาสงท 5 ถดไป จะเหนวาการประมวลผลในลกษณะนคาสงทกคาสงไมไดถกประมวลผลแบบเสนตรงแตจะมบางคาสงเทาทจะถกเรยกใหทางานตามทตองการในการเขยนโปรแกรม ดงตวอยางผงงานของการเขยนคาสงในรปท 6.3
(ก)
(ข)
บทท 6 คาสงควบคม
170
(ค)
รปท 6.3 ผงงานของคาสงแบบมเงอนไข (ก) แบบเงอนไข 1 ทางเลอก (ข) แบบเงอนไข 2 ทางเลอก (ค) แบบหลายเงอนไข
แบบทาซา รปท 6.1(ค) คอการทางานของคาสงทจะกระทาซา ซงจะมการทางานคาสงบางคาสงซากน ถาตรงกบเงอนไขทไดกาหนดไว จากรปท 6.1(ค) คาสงท 2 เปนคาสงตดสนใจวาจะทาซาหรอ ถาทาซาจะตองทาคาสงท 3 และ 4 ซาแลวไปตรวจสอบเงอนไขคาสงท 2 อกครงจนถกตองตามเงอนไขการหยดทาซากจะมาทางานถดไปในคาสงท 5 ดงตวอยางผงงานของการเขยนคาสงในรปท 6.4
(ก)
บทท 6 คาสงควบคม
171
(ข)
รปท 6.4 ผงงานของคาสงแบบทาซา (ก) แบบตรวจสอบเงอนไขกอนแลวจงทาซา (ข) แบบทากอนแลวจงตรวจสอบเงอนไขเพอทาซา
แบบกระโดด รปท 6.1(ง) คอการทางานของคาสงทกระโดดไปทางานในตาแหนงอนๆ ทตองการโดยไมมการตรวจสอบเงอนไขอะไร จากรปท 6.1(ง) เมอทาคาสงท 2 เสรจกจะโดดมาทาคาสงท 4 ทนทโดยไมมเงอนไข ดงตวอยางผงงานของการเขยนคาสงในรปท 6.5
รปท 6.5 รปแบบคาสงแบบแบบกระโดด
บทท 6 คาสงควบคม
172
6.2 คาสงแบบลาดบ (Sequential Statement)
คาสงแบบลาดบคอการเขยนคาสงในลกษณะจากบนลงลางโดยทวไป ในทกๆ คาสงตงแตตนจนจบโปรแกรม จนครบทกคาสง ในภาษาซจะตองลงทายดวยเครองหมายอฒภาคหรอเซมโคลอน (;) เพอเปนการบงบอกใหรจดสนสดของคาสง ถาไมมเครองหมายเซมโคลอน
(Semi Colon) ตวแปรภาษาจะแจงความผดพลาดวาโปรแกรมไมสามารถทาการแปลภาษาได
ในการเขยนโปรแกรมภาษาซจะมคาสงประเภทหนงทถกสรางมาจากหลายๆ คาสงประกอบกนซงเราเรยกวาคาสงเชงซอน (Compound Statement) โดยคาสงในลกษณะนจะอยภายในเครองหมายวงเลบปกกา ({ }) ซงหลงเครองหมายวงเลบปกกาเราไมตองใสเครองหมายเซมโคลอนตอทาย
ตวอยางท 6.1 โปรแกรมแสดงรปแบบการทางานของคาสงแบบลาดบ
1 #include <stdio.h> 2 main() 3 { 4 int x = 1; 5 int y = 1; 6 int z; 7 z = x + y; 8 printf("x + y = %i\n",z); 9 }
ผลลพธของโปรแกรม x + y = 2
ตวอยางท 6.2 โปรแกรมแสดงคาสงประเภทคาสงเชงซอน 1 #include <stdio.h> 2 main() 3 { 4 int a; 5 { 6 a = 10; 7 printf("%i",a); 8 } 9 }
อธบายโปรแกรม
บรรทดท 5 และ 8 เปนคาสงเชงซอน ซงภายในเครองหมายวงเลบปกกาจะมคาสงยอยหลายๆ คาสง
บทท 6 คาสงควบคม
173
6.3 คาสงแบบเลอกหรอแบบมเงอนไข (Condition Statement)
คาสงแบบเลอกหรอแบบมเงอนไขคอการเขยนคาสงในลกษณะตรวจสอบเงอนไขของชดคาสงวาตรงตามเงอนไขทกาหนดหรอไม ถาตรงตามเงอนไขกใหกระทาในสวนหนง ถาไมตรงตามเงอนไขกใหไปกระทาอกสวน ซงการเขยนโปรแกรมของคาสงในรปแบบนคาสงจะไมถกกระทาทงหมดเนองจากเปนการเลอกคาสงทจะกระทาการประมวลผล คาสงแบบเลอกเปนคาสงทมการทดสอบเงอนไขกอนทจะทางานอยางใดอยางหนง สามารถแบงออกเปน 4 ชนด คอ
6.3.1 คาสงทดสอบเงอนไข 1 ทางเลอก (if) คอมการทดสอบเงอนไขวาเปนจรงหรอเปนเทจ โดยจะทางานตามชดคาสงทกาหนด
ไว เฉพาะกรณทเงอนไขเปนจรงเทานน โดยมรปแบบคาสง คอ
รปท 6.6 ผงงานของคาสงแบบมเงอนไขแบบเงอนไข 1 ทางเลอก
if(เงอนไข){ ชดคาสง }
บทท 6 คาสงควบคม
174
ตวอยางท 6.3 โปรแกรมแสดงคาสงทดสอบเงอนไข 1 ทางเลอก ในการตรวจสอบเลขค
1 #include<stdio.h> 2 main(){ 3 int a; 4 printf("Enter number : "); 5 scanf("%d",&a); 6 printf("*******************\n"); 7 if(a%2==0){ 8 printf("Even number\n"); 9 } 10 printf("*******************\n"); 11 }
ผลลพธของโปรแกรม (รนครงท 1)
Enter number : 56 *********************** Even number ***********************
(รนครงท 2)
Enter number : 57 *********************** ***********************
อธบายโปรแกรม
บรรทดท 5 รบคาตวเลขจานวนเตม
บรรทดท 7 ตรวจสอบเงอนไขวาตวเลขจานวนเตมทรบเขามาเปนเลขคหรอไม
ถาใชใหแสดงผลวา “Even number” ในบรรทดท 8 แลวแสดงผลตอในบรรทดท 10 แตถาไมใชเลขคจะไมแสดงผลในบรรทดท 8 แตจะขามไปแสดงผลบรรทดท 10
บทท 6 คาสงควบคม
175
ตวอยางท 6.4 โปรแกรมแสดงคาสงทดสอบเงอนไข 1 ทางเลอก ในการตรวจคาลบและบวก
1 #include <stdio.h> 2 3 main() 4 { 5 int a; 6 scanf("%i",&a); 7 if(a<0) 8 { 9 printf("This is Negative"); 10 } 11 if(a>0) 12 { 13 printf("This is Positive"); 14 } 15 }
ผลลพธของโปรแกรม
(รนครงท 1)
-5 This is Negative
(รนครงท 2)
0 This is Positive
อธบายโปรแกรม
บรรทดท 6 รบคาตวเลขจานวนเตม
บรรทดท 7 ตรวจสอบเงอนไขวาตวแปร a มคานอยกวา 0 หรอไม ถานอยกวาใหกระทาคาสงในบรรทดท 9 และทาคาสงท 11 ถดไป ถามากกวาใหขามไปทาคาสงท 11
บรรทดท 11 ตรวจสอบเงอนไขวาตวแปร a มคามากกวา 0 หรอไม ถามากกวาใหกระทาคาสงในบรรทดท 13 และทาคาสงลาดบถดไป ถามากกวาใหขามไปสนสดทบรรทดท 15 กจะจบโปรแกรม
บทท 6 คาสงควบคม
176
ตวอยางท 6.5 โปรแกรมแสดงคาสงทดสอบเงอนไข 1 ทางเลอก ในการตรวจคาลบและบวก
1 #include <stdio.h> 2 3 main() 4 { 5 int a; 6 scanf("%i",&a); 7 if(a<0) 8 printf("This is Negative"); 9 if(a>0) 10 printf("This is Positive"); 11 }
ผลลพธของโปรแกรม
(รนครงท 1)
-5 This is Negative
(รนครงท 2)
0 This is Positive
อธบายโปรแกรม
บรรทดท 6 รบคาตวเลขจานวนเตม
บรรทดท 7 ตรวจสอบเงอนไขวาตวแปร a มคานอยกวา 0 หรอไม ถานอยกวาใหกระทาคาสงในบรรทดท 8 และทาคาสงท 9 ถดไป ถามากกวาใหขามไปทาคาสงท 9
บรรทดท 9 ตรวจสอบเงอนไขวาตวแปร a มคามากกวา 0 หรอไม ถามากกวาใหกระทาคาสงในบรรทดท 10 และทาคาสงลาดบถดไป ถามากกวาใหขามไปสนสดทบรรทดท 11 กจะจบโปรแกรม
บทท 6 คาสงควบคม
177
ตวอยางท 6.6 โปรแกรมแสดงคาสงทดสอบเงอนไข 1 ทางเลอก ในการตรวจคาลบและบวก
1 #include <stdio.h> 2 3 main() 4 { 5 int a; 6 scanf("%i",&a); 7 if(a<0) printf("This is Negative"); 8 if(a>0) printf("This is Positive"); 9 }
ผลลพธของโปรแกรม
(รนครงท 1)
-5 This is Negative
(รนครงท 2)
0 This is Positive
อธบายโปรแกรม
บรรทดท 6 รบคาตวเลขจานวนเตม
บรรทดท 7 ตรวจสอบเงอนไขวาตวแปร a มคานอยกวา 0 หรอไม ถานอยกวาใหกระทาคาสงดานหลง ถามากกวาใหขามไปทาคาสงท 8
บรรทดท 8 ตรวจสอบเงอนไขวาตวแปร a มคามากกวา 0 หรอไม ถามากกวาใหกระทาคาสงดานหลง ถามากกวาใหขามไปบรรทดท 9 สนสดโปรแกรม
จากตวอยางท 6.4, 6.5 และ 6.6 การทางานของโปรแกรมจะไดผลลพธทเหมอนกน
แตกตางกนตรงวธเขยนโปรแกรมในสวนเครองหมายวงเลบปกกา ({ }) ถาประโยคตามหลงคาสง if มเพยงประโยคเดยวไมจาเปนทจะตองมเครองหมายวงเลบปกกา แตถามหลายคาสงจะตองมเครองหมายวงเลบปกกาเพอบงบอกใหกระทาในคาสงใดบาง ดงตวอยางถดไป
สาหรบผ ทเรมตนแนะนาใหเขยนเครองหมายวงเลบปกกาเพอไมใหสบสน
บทท 6 คาสงควบคม
178
ตวอยางท 6.7 โปรแกรมแสดงคาสงทดสอบเงอนไข 1 ทางเลอก ในการตรวจคาลบ
1 #include <stdio.h> 2 main() 3 { 4 int a; 5 printf("Input a = "); scanf("%i",&a); 6 if (a<0) 7 { 8 printf("a less than zero\n"); 9 printf("a may be more than zero\n"); 10 } 11 printf("a = %i\n",a); 12 }
ผลลพธของโปรแกรม
(รนครงท 1)
Input a = -5 a less than zero a may be more than zero a = -5
(รนครงท 2)
Input a = 5 a = 5
อธบายโปรแกรม
บรรทดท 5 แสดงตวอกษรและรบคาตวเลขจานวนเตม
บรรทดท 6 ตรวจสอบเงอนไขวาตวแปร a มคานอยกวา 0 หรอไม ถานอยกวาใหกระทาคาสงในวงเลบปกกาทงหมด ในบรรทดท 8 และบรรทดท 9
จากนนกกระทาในบรรทดท 11 ถามากกวาใหขามไปทาคาสงท 11
บทท 6 คาสงควบคม
179
6.3.2 คาสงทดสอบเงอนไข 2 ทางเลอก (if-else)
คาสงทดสอบเงอนไข 2 ทางเลอกคอคาสงทมการทดสอบเงอนไขวาเปนจรง หรอเปนเทจ ถาเงอนไขเปนจรง ใหทางานตามชดคาสง A แตถาเงอนไขเปนเทจ ใหทางานตามชดคาสง B โดยมรปแบบคาสง คอ
รปท 6.7 ผงงานของคาสงแบบมเงอนไขแบบเงอนไข 2 ทางเลอก
ตวอยางท 6.8 โปรแกรมแสดงคาสงทดสอบเงอนไข 2 ทางเลอก ในการตรวจคาคและค
1 #include<stdio.h> 2 main(){ 3 int a; 4 printf("Enter number : "); 5 scanf("%d",&a); 6 printf("*******************\n"); 7 if(a%2==0){ 8 printf("Even number\n"); 9 } 10 else{ 11 printf("Odd number\n"); 12 } 13 printf("*******************\n"); 14 }
if(เงอนไข){ ชดคาสง A
}
else{
ชดคาสง B
}
บทท 6 คาสงควบคม
180
ผลลพธของโปรแกรม
(รนครงท 1)
Enter number : 56 *********************** Even number ***********************
(รนครงท 2)
Enter number : 57 *********************** Odd number ***********************
อธบายโปรแกรม
บรรทดท 5 รบคาตวเลขจานวนเตม
บรรทดท 7 ตรวจสอบวาตวเลขจานวนเตมทรบเขามาเปนเลขคหรอไม
ถาใชใหแสดงผลวา “Even number” ในบรรทดท 8 แลวแสดงผลตอในบรรทดท 13
แตถาไมใชเลขค (เลขค) จะแสดงผลวา “Odd number” ในบรรทดท
11 แลวแสดงผลตอในบรรทดท 13
ตวอยางท 6.9 โปรแกรมแสดงคาสงทดสอบเงอนไข 2 ทางเลอก ในการตรวจคาลบและบวก
1 #include <stdio.h> 2 main() 3 { 4 int a; 5 scanf("%i",&a); 6 if(a<0) 7 { 8 printf("This is Negative"); 9 } else 10 { 11 printf("This is Positive"); 12 } 13 }
ผลลพธของโปรแกรม
(รนครงท 1)
-5 This is Negative
(รนครงท 2)
0 This is Positive
บทท 6 คาสงควบคม
181
อธบายโปรแกรม
บรรทดท 5 รบคาตวเลขจานวนเตม
บรรทดท 6 ตรวจสอบเงอนไขวาตวแปร a มคานอยกวา 0 หรอไม ถานอยกวาใหกระทาคาสงในบรรทดท 9 จากนนกจะกระโดดไปบรรทดสดทาย ถามากกวาใหกระทาคาสงในบรรทดท 12 จากนนกจะกระโดดไปบรรทดสดทาย
เชนเดยวกนคาสง if มเพยงประโยคเดยวไมจาเปนทจะตองมเครองหมายวงเลบปกกา แตถามหลายคาสงจะตองมเครองหมายวงเลบปกกาเพอบงบอกใหกระทาในคาสงใดบาง ดงตวอยางถดไป
ตวอยางท 6.10 โปรแกรมแสดงคาสงทดสอบเงอนไข 2 ทางเลอก ในการตรวจคาลบและบวก
1 #include <stdio.h> 2 3 main() 4 { 5 int a; 6 scanf("%i",&a); 7 if(a<0) 8 9 printf("Negative"); 10 else 11 12 printf("Positive"); 13 14 }
ผลลพธของโปรแกรม
(รนครงท 1)
-5 This is Negative
(รนครงท 2)
0 This is Positive
บทท 6 คาสงควบคม
182
อธบายโปรแกรม
บรรทดท 6 รบคาตวเลขจานวนเตม
บรรทดท 7 ตรวจสอบเงอนไขวาตวแปร a มคานอยกวา 0 หรอไม ถานอยกวาใหกระทาคาสงในบรรทดท 9 จากนนกจะกระโดดไปบรรทดสดทาย ถามากกวาใหกระทาคาสงในบรรทดท 12 จากนนกจะกระโดดไปบรรทดสดทาย
ตวอยางท 6.11 โปรแกรมแสดงคาสงทดสอบเงอนไข 2 ทางเลอก ในการตรวจคาลบและบวก
1 #include <stdio.h> 2 main() 3 { 4 int a; 5 scanf("%i",&a); 6 if(a<0) printf("Negative"); 7 else printf("Positive"); 8 }
ผลลพธของโปรแกรม
(รนครงท 1)
-5 This is Negative
(รนครงท 2)
0 This is Positive
อธบายโปรแกรม
บรรทดท 5 รบคาตวเลขจานวนเตม
บรรทดท 6 ตรวจสอบเงอนไขวาตวแปร a มคานอยกวา 0 หรอไม ถานอยกวาใหกระทาคาสงดานหลง จากนนกจะกระโดดไปบรรทดสดทาย ถามากกวาใหกระทาคาสงในบรรทดท 7 จากนนกจะกระโดดไปบรรทดสดทาย
บทท 6 คาสงควบคม
183
ตวอยางท 6.12 จงตรวจสอบโปรแกรมดงตอไปน หากมการตดเครองหมายวงเลบปกกาในบรรทดท 7 และบรรทดท 10 ออก ผลลพธทไดจะแตกตางกนหรอเหมอนกน
1 #include <stdio.h> 2 main() 3 { 4 int a; 5 printf("Input a = "); scanf("%i",&a); 6 if (a<0) 7 { 8 printf("a less than zero\n"); 9 printf("a may be more than zero\n"); 10 } 11 printf("a = %i\n",a); 12 }
ผลลพธของโปรแกรม
(รนครงท 1 ในกรณทไมตดเครองหมายวงเลบปกกาออก) Input a = 5 a = 5
(รนครงท 2 ในกรณทตดเครองหมายวงเลกปกกาออก) Input a = 5 a may be more than zero a = 5
จากการประมวลผลโปรแกรมผลลพธทไดจะแตกตางกน ดงนนในการใชเครองหมายวงเลบปกกาควรจะใชอยางระมดระวง ซงอาจจะทาใหเกดขอผดพลาดได
บทท 6 คาสงควบคม
184
6.3.3 คาสงทดสอบเงอนไขหลายทางเลอก (nested if)
คาสงทดสอบเงอนไขหลายทางเลอกคอคาสงทมการทดสอบเงอนไขวาเปนจรง หรอเปนเทจ ถาเปนจรงในเงอนไขใด ใหทางานตามชดคาสงของเงอนไขนนๆ โดยสามารถทาการทดสอบเงอนไขตอเนองได มรปแบบคาสง คอ
รปท 6.8 ผงงานของคาสงแบบมเงอนไขแบบเงอนไขหลายทางเลอก
if(เงอนไข){ ชดคาสง A
}
else if(เงอนไข){ ชดคาสง B
}
else if(เงอนไข){ ชดคาสง C
}
บทท 6 คาสงควบคม
185
ตวอยางท 6.13 โปรแกรมแสดงคาสงทดสอบเงอนไขหลายทางเลอก ในการตดเกรด
1 #include<stdio.h> 2 main(){ 3 int score; 4 char grade; 5 printf("Enter score : "); 6 scanf("%d",&score); 7 printf("*******************\n"); 8 if(score>=80){ 9 grade = 'A'; 10 } 11 else if (score >= 70){ 12 grade = 'B'; 13 } 14 else if (score >= 60){ 15 grade = 'C'; 16 } 17 else if (score >= 50){ 18 grade = 'D'; 19 } 20 else{ 21 grade = 'F'; 22 } 23 printf("Grade = %c\n",grade); 24 printf("*******************\n"); 25 }
ผลลพธของโปรแกรม
(รนครงท 1)
Enter score : 56 *********************** Grade = D ***********************
(รนครงท 2)
Enter number : 97 *********************** Grade = A ***********************
อธบายโปรแกรม
บรรทดท 6 รบคาคะแนน
บรรทดท 8 ตรวจสอบวาคะแนนมากกวา 80 หรอไม ถาใชใหตวแปร grade เกบคา A แลวขามไปทาคาสงในบรรทดท 23 และ 24 ถาไมใชใหไปทาคาสงในบรรทดท 11
บทท 6 คาสงควบคม
186
บรรทดท 11 ตรวจสอบวาคะแนนมากกวา 70 หรอไม ถาใชใหตวแปร grade เกบคา B แลวขามไปทาคาสงในบรรทดท 23 และ 24 ถาไมใชใหไปทาคาสงในบรรทดท 14
บรรทดท 14 ตรวจสอบวาคะแนนมากกวา 60 หรอไม ถาใชใหตวแปร grade เกบคา C แลวขามไปทาคาสงในบรรทดท 23 และ 24 ถาไมใชใหไปทาคาสงในบรรทดท 17
บรรทดท 17 ตรวจสอบวาคะแนนมากกวา 50 หรอไม ถาใชใหตวแปร grade เกบคา D แลวขามไปทาคาสงในบรรทดท 23 และ 24 ถาไมใชใหตวแปร grade เกบคา F แลวขามไปทาคาสงในบรรทดท 23 และ 24
เชนเดยวกนคาสง if มเพยงประโยคเดยวไมจาเปนทจะตองมเครองหมายวงเลบปกกา แตถามหลายคาสงจะตองมเครองหมายวงเลบปกกาเพอบงบอกใหกระทาในคาสงใดบาง ดงตวอยางถดไป
ตวอยางท 6.14 โปรแกรมแสดงคาสงทดสอบเงอนไขหลายทางเลอก ในการตดเกรด
1 #include <stdio.h> 2 main() 3 { 4 int score; 5 scanf("%i",& score); 6 if(score <50) printf("F"); 7 else if(score <60) printf("D"); 8 else if(score <70) printf("C"); 9 else if(score <80) printf("B"); 10 else printf("A"); 11 }
ผลลพธของโปรแกรม
(รนครงท 1)
56 D
(รนครงท 2)
97 A
บทท 6 คาสงควบคม
187
อธบายโปรแกรม
บรรทดท 5 รบคาคะแนน
บรรทดท 6 ตรวจสอบวาคะแนนนอยกวา 50 หรอไม ถาใชใหแสดงคา F ถาไมใชใหไปบรรทดท 7
บรรทดท 7 ตรวจสอบวาคะแนนนอยกวา 60 หรอไม ถาใชใหแสดงคา D ถาไมใชใหไปบรรทดท 7
บรรทดท 8 ตรวจสอบวาคะแนนนอยกวา 70 หรอไม ถาใชใหแสดงคา C ถาไมใชใหไปบรรทดท 7
บรรทดท 9 ตรวจสอบวาคะแนนนอยกวา 80 หรอไม ถาใชใหแสดงคา B ถาไมใชใหไปบรรทดท 10 ใหแสดงคา A
ในการเขยนคาสงทดสอบเงอนไขหลายทางเลอกควรจะแสดงเครองหมายวงเลบปกกาเนองจากถาไมใสอาจจะทาใหสบสน วา if else ตวไหนจะคกน ดงแสดงในรปท 6.9
if(a>0) { if(a<=5) printf("s1"); else printf("s2"); }
if(a>0) { if(a<=5) printf("s1"); } else printf("s2");
แบบท 1 แบบท 2
รปท 6.9 คาสงทดสอบเงอนไขหลายทางเลอกทมความสบสน
จากรปท 6.9 ถาเรากาหนดคา a ทนอยกวาศนย ถาไมมการแสดงผลลพธทหนาจอภาพแสดงวาเปนแบบท 1 แตถามผลลพธแสดงทหนาจอภาพโดยพมพคาวา s2 ออกทางหนาจอ แสดงวาเปนแบบท 2 ดงนนการใชเครองหมายวงเลบปกกาควรจะใชอยางระวง โดยในภาษาซจะยดถอวา else นนเปนคของ if ตวทใกลทสด (The Most Recently Nested
Rule)
บทท 6 คาสงควบคม
188
6.3.4 คาสงเลอกเงอนไข (switch-case)
คาสงเลอกเงอนไขคอคาสงทมการเลอกทางานตามเงอนไขของคาของตวแปรหรอนพจนวาตรงกบกรณ (case) ใดๆ กลาวคอถามการเลอกคาตวแปรหรอนพจนตรงกบกรณใดๆ ใหทางานตามคาสงในกรณนนๆ แตถาไมตรงกบกรณใดๆ จะทางานตามคาสงในสวนของ default แตถาไมมสวนของ default กจะไมทางานตามคาสงภายใตเงอนไขใดๆ ดงนนในสวนของ default จะมหรอไมมกได คาสงเลอกเงอนไขมรปแบบคาสง ซงสามารถเขยนได 2 รปแบบดงน
switch(ตวแปรหรอนพจนทตรวจสอบ){
case คาท 1 :
ชดคาสง A;
break;
case คาท 2 :
ชดคาสง B;
break;
case คาท 3 :
ชดคาสง C;
break;
default :
ชดคาสง D;
}
switch(ตวแปรหรอนพจนทตรวจสอบ){
case คาท 1 :
ชดคาสง A;
case คาท 2 :
ชดคาสง B;
case คาท 3 :
ชดคาสง C;
default :
ชดคาสง D;
}
บทท 6 คาสงควบคม
189
ตวแปรหรอนพจนทตรวจสอบจะตองเปนเลขจานวนเตม หรอตวอกษรเทานน และในแตละกรณจะตองจบลงดวยคาสงหยด (break) เพอใหออกจากคาสงเลอกเงอนไข ถาไมมคาสงจะทางานตามคาสงถดไปดงแสดงในผงงานในรปท 6.10 (ก) แตถามคาสงหยดกจะกระทาคาสงในกรณนนจนเสรจและกออกจากกระบวนการไปดงแสดงในผงงานในรปท 6.10
(ข)
เงอนไข
ชดคำสง A
ชดคำสง C
ชดคำสง B
ชดคำสง D
case 1
case 2
case 3
Default
value
(ก) (ข)
รปท 6.10 รปแบบคาสงเลอกเงอนไข (ก) คาสงเลอกเงอนไขทไมมคาสงสนสด
(ข) คาสงเลอกเงอนไขทมคาสงสนสด
บทท 6 คาสงควบคม
190
ตวอยางท 6.15 โปรแกรมแสดงคาสงทดสอบเงอนไขหลายทางเลอก ไมใชจดสนสด
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 scanf("%i",&num); 6 switch(num) 7 { 8 case 1: 9 printf("One\n"); 10 11 case 2: 12 printf("Two\n"); 13 14 case 3: 15 printf("Three\n"); 16 17 default: 18 printf("No\n"); 19 20 }}
ผลลพธของโปรแกรม
(รนครงท 1)
5 No
(รนครงท 2)
3 Three No
(รนครงท 3)
1 One Two Three No
อธบายโปรแกรม
บรรทดท 5 รบคาอนพตเปนตวเลขเกบไวทตวแปร num
บรรทดท 6 ตรวจสอบเงอนไขวาตวเลขทไดรบตรงกบกรณไหน กใหทาในกรณนน เมอกระทาชดคาสงในกรณนนเสรจสนกกระทาในกรณถดไปจนจบโปรแกรม ซงในลกษณะแบบนอาจจะไมเหมาะสมนก ดงนนควรจะมคาสงสนสด เพราะโดยทวไปการเขยนโปรแกรมจะกระทาเฉพาะในกรณทตองการเทานน
บทท 6 คาสงควบคม
191
ตวอยางท 6.16 โปรแกรมแสดงคาสงทดสอบเงอนไขหลายทางเลอก โดยใชจดสนสด
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 scanf("%i",&num); 6 switch(num) 7 { 8 case 1: 9 printf("One"); 10 break; 11 case 2: 12 printf("Two"); 13 break; 14 case 3: 15 printf("Three"); 16 break; 17 default: 18 printf("No"); 19 break; 20 } 21 }
ผลลพธของโปรแกรม
(รนครงท 1)
5 No
(รนครงท 2)
3 Three
(รนครงท 3)
1 One
อธบายโปรแกรม
บรรทดท 5 รบคาอนพตเปนตวเลขเกบไวทตวแปร num
บรรทดท 6 ตรวจสอบเงอนไขวาตวเลขทไดรบตรงกบกรณไหน กใหทาในกรณนน สงเกตคาสงในทกกรณจะมคาสงหยด (break) ดงนนเมอกระทาชดคาสงในกรณนนเสรจสนกจะกระโดดมายงบรรทดสดทายของโปรแกรม
บทท 6 คาสงควบคม
192
ตวอยางท 6.17 โปรแกรมแสดงคาสงเลอกเงอนไข ในการเลอกคาทกทาย
1 #include<stdio.h> 2 main(){ 3 char choice,name[30]; 4 printf("************************\n"); 5 printf("Select choice\n"); 6 printf("************************\n"); 7 printf("a.Morning\n"); 8 printf("b.Afternoon\n"); 9 printf("c.Evening\n"); 10 printf("d.Night\n"); 11 printf("************************\n"); 12 printf("Enter choice : "); 13 scanf("%c",&choice); 14 printf("Enter name : "); 15 scanf("%s",name); 16 printf("************************\n"); 17 switch(choice){ 18 case 'a' : 19 printf("Good Morning!!! %s\n",name); 20 break; 21 case 'b' : 22 printf("Good Afternoon!!! %s\n",name); 23 break; 24 case 'c' : 25 printf("Good Evening!!! %s\n",name); 26 break; 27 case 'd' : 28 printf("Good Night!!! %s\n",name); 29 break; 30 default : 31 printf("Bye Bye!!! %s\n",name); 32 } 33 }
ผลลพธของโปรแกรม
(รนครงท 1)
************************ Select choice ************************ a.Morning b.Afternoon c.Evening d.Night ************************ Enter choice : a Enter name : Krit ************************ Good Morning!!! Krit
บทท 6 คาสงควบคม
193
(รนครงท 2)
************************ Select choice ************************ a.Morning b.Afternoon c.Evening d.Night ************************ Enter choice : c Enter name : Krit ************************ Good Evening!!! Krit
(รนครงท 3)
************************ Select choice ************************ a.Morning b.Afternoon c.Evening d.Night ************************ Enter choice : z Enter name : Krit ************************ Bye Bye!!! Krit
อธบายโปรแกรม
โปรแกรมนจะทาการรบคาตวอกษรมาเกบไวในตวแปร choice แลวทาการตรวจสอบวามคาเปนอะไร กรณท 1 คาเปน a จะทางานตามคาสงในบรรทดท 19 – 20
กรณท 2 คาเปน b จะทางานตามคาสงในบรรทดท 22 – 23
กรณท 3 คาเปน c จะทางานตามคาสงในบรรทดท 25 – 26
กรณท 4 คาเปน d จะทางานตามคาสงในบรรทดท 28 – 29
กรณทคาของตวแปร choice ไมใช a ,b ,c และ d จะทางานตามคาสงในบรรทดท 31
บทท 6 คาสงควบคม
194
ตวอยางท 6.18 โปรแกรมแสดงคาสงทดสอบเงอนไขหลายทางเลอก โดยใหรบคาเขามา ถาคาทรบเขามาเปนเลข 1 – 3 ใหกระทาในกรณท 1 ถาคาทรบเขามาเปนเลข 4 – 6 ใหกระทาในกรณท 2 ถาคาทรบเขามาเปนเลข 7 – 9 ใหกระทาในกรณท 3 ถาไมใชเลข 1-9 ใหพมพคาวา Error
1 #include <stdio.h> 2 main() 3 { 4 int a; 5 printf("Input Number = "); scanf("%i",&a); 6 switch(a); 7 { 8 case 1: case 2: case 3: 9 printf("D"); 10 break; 11 case 4: case 5: case 6: 12 printf("C"); 13 break; 14 case 7: case 8: case 9: 15 printf("D"); 16 break; 17 default: 18 printf("Error"); 19 break; 20 } 21 }
ผลลพธของโปรแกรม
(รนครงท 1)
Input Number = 2 D
(รนครงท 2)
Input Number = 5 C
(รนครงท 3)
Input Number = 10 Error
อธบายโปรแกรม
บรรทดท 5 แสดงตวอกษรและรบคาอนพตเกบไวทตวแปร a
บรรทดท 6 ตรวจสอบเงอนไขวาตวเลขทไดรบตรงกบกรณไหน กใหทาในกรณนน ถาคาทรบเขามาเปนเลข 1 – 3 จะกระทาในกรณท 1 ถาคาทรบเขามาเปนเลข 4 – 6 จะกระทาในกรณท 2 ถาคาทรบเขามาเปน
บทท 6 คาสงควบคม
195
เลข 7 – 9 จะกระทาในกรณท 3 ถาไมใชเลข 1-9 กระทาในกรณ
default ในบรรทดท 17,18 และ 19
ตวอยางท 6.19 จงเขยนโปรแกรมดงตอไปนใหอยในรปแบบของคาสงเลอกเงอนไข (switch-
case)
1 #include <stdio.h> 2 main() 3 { 4 int a; 5 printf("Input gift number : "); 6 scanf("%i",&a); 7 if(a==1) printf("Notebook"); 8 else if(a==2) printf("Computer Desktop"); 9 else if(a==3) printf("PDA"); 10 else if(a==4) printf("Disket"); 11 else printf("Invalid"); 12 }
จะได
1 #include <stdio.h> 2 main() 3 { 4 int a; 5 printf("Input gift number : "); 6 scanf("%i",&a); 7 switch(a) 8 { 9 case 1 : 10 printf("Notebook"); 11 break; 12 case 2 : 13 printf("Computer Desktop"); 14 break; 15 case 3 : 16 printf("PDA"); 17 break; 18 case 4 : 19 printf("Disket"); 20 break; 21 default : 22 printf("Invalid"); 23 break; 24 } 25 }
บทท 6 คาสงควบคม
196
6.4 คาสงแบบวนซา (Repetition Statement)
คาสงแบบวนซาคอการเขยนคาสงในลกษณะคาสงทมการทางานวนซาๆ เปนวงรอบหรอลป (Loop) จนกวาเงอนไขททดสอบจะเปนเทจ จงจะสามารถออกจากการทางานของคาสง แบงออกเปน 3 ชนด คอคาสงตรวจสอบเงอนไขกอนแลวจงทาซา (while) คาสงทากอนแลวจงตรวจสอบเงอนไขเพอทาซา (do-while) คาสงทาซาตามจานวนรอบทระบ (for)
6.4.1 คาสงตรวจสอบเงอนไขกอนแลวจงทาซา (while)
คาสงตรวจสอบเงอนไขกอนแลวจงทาซาจะใชในงานทมการตรวจสอบเงอนไขกอน ถาเงอนไขเปนจรง ใหทางานตามชดคาสงทตองการภายในลป จากนนกลบไปตรวจสอบเงอนไขอกครง ทางานซาๆ เชนน จนกวาเงอนไขจะเปนเทจ จงออกจากการทางานของคาสงน โดยมรปแบบคาสง คอ
รปท 6.11 ผงงานของคาสงแบบทาซาแบบตรวจสอบเงอนไขกอนแลวจงทาซา
while(เงอนไข){ ชดคาสง }
บทท 6 คาสงควบคม
197
หลกการทางานซาคอเมอทางานมาถงคาสง while กจะกระทาการตรวจสอบเงอนไข ถาเปนจรงกจะกระทาในคาสง เมอทาเสรจกจะกลบขนไปตรวจสอบเงอนไขอกครงจนกวาเงอนไขเปนเทจจงจะจบกระบวนการของคาสงน ดงนนในการเขยนคาสงในรปแบบนจะตองตรวจสอบใหดในการตรวจสอบเงอนไข เนองจากอาจจะทาใหเกดการวนลปทไมมทสนสด (วนซาตลอดกาล) ทาใหโปรแกรมเกดความผดพลาด
ตวอยางท 6.20 โปรแกรมแสดงคาสงตรวจสอบเงอนไขกอนแลวจงทาซา ในการตรวจคาทรบเขามา
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 printf("Input = "); scanf("%i",&num); 6 while(num==0) 7 { 8 printf("Input = ");scanf("%i",&num); 9 } 10 printf("Output = %i\n",num); 11 }
ผลลพธของโปรแกรม
(รนครงท 1) ในกรณทปอนคา 0 เขาไปจานวนหลายครง Input = 0 Input = 0 Input = 0
(รนครงท 2) ในกรณทปอนคาอน ทไมใช 0
Input = 5 Output = 5
อธบายโปรแกรม
บรรทดท 5 แสดงตวอกษรและรบคาอนพตเกบไวทตวแปร num
บรรทดท 6 ตรวจสอบเงอนไขวาตวเลขทไดรบเขามา = 0 หรอไม ถาเทากบ 0 ใหดาเนนการในสวนของคาสงบรรทดท 8 ซงเปนคาสงใหรบคาอนพตอก จากนนกจะดาเนนการตรวจสอบเงอนไขอกครงในบรรทดท 6
โดยจะทาการวนซาไปจนกวาจะปอนคาทไมใชเลข 0 ถาในกรณทปอนคาเลขอนทไมใชเลข 0 กจะดาเนนการในบรรทดท 10 และจบโปรแกรม
บทท 6 คาสงควบคม
198
ตวอยางท 6.21 โปรแกรมแสดงคาสงตรวจสอบเงอนไขกอนแลวจงทาซา โดยโปรแกรมจะรบคาตวเลขตงแต 1 – 10 ถาอยนอกชวงนใหทาการบใหมจนตวเลขนนอยในชวง 1 – 10 แลวแสดงคานนออกทางหนาจอ
1 10
x x
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 printf("Input = "); scanf("%i",&num); 6 while((num<1)||(num>10)) scanf("%i",&num); 7 printf("Output = %i\n",num); 8 }
ผลลพธของโปรแกรม
(รนครงท 1) ในกรณทปอนเลขทอยนอกเหนอเลข 1-10
Input = 15 -8 100
(รนครงท 2) ในกรณทปอนเลขทอยในชวงเลข 1-10
Input = 9 Output = 9
อธบายโปรแกรม
บรรทดท 5 แสดงตวอกษรและรบคาอนพตเกบไวทตวแปร num
บรรทดท 6 ตรวจสอบเงอนไขวาตวเลขทไดรบเขามานอยกวา 1 หรอมากกวา 10
หรอไม ถาใชกใหดาเนนการในสวนของคาสงดานหลงบรรทดท 5 ซงเปนคาสงใหรบคาอนพตอก จากนนกจะดาเนนการตรวจสอบเงอนไขอกครงในบรรทดท 6 โดยจะทาการวนซาไปจนกวาจะปอนคาทอยในชวงเลข 1-10 จากนนกจะแสดงผลของคาเลขทอยในชวง 1-10
บทท 6 คาสงควบคม
199
ตวอยางท 6.22 โปรแกรมแสดงคาสงตรวจสอบเงอนไขกอนแลวจงทาซา ในการหาคาผลรวมตงแตเลขทปอนเขาไปจนถงเลข 50
1 #include<stdio.h> 2 main(){ 3 int i,sum=0; 4 printf("Enter number : "); 5 scanf("%d",&i); 6 printf("#############################\n"); 7 while(i<=50){ 8 sum = sum+i; 9 printf("%d \t %d \n" ,i,sum); 10 i=i+1; 11 } 12 printf("#############################\n"); 13 }
ผลลพธของโปรแกรม
(รนครงท 1)
Enter number : 45 ############################# 45 45 46 91 47 138 48 186 49 235 50 285 #############################
(รนครงท 2)
Enter number : 57 ############################# #############################
อธบายโปรแกรม
บรรทดท 4,5,6 แสดงตวอกษรและรบคาอนพตเกบไวทตวแปร i บรรทดท 7 ตรวจสอบตวเลขทรบเขามาวามคานอยกวาหรอเทากบ 50 หรอไม
ถาใช จะทางานตามคาสงในบรรทดท 8 – 10 ทาซาไปเรอยๆ จนกวาคา i จะมากกวา 50 จงจะหยดทาซา และไปทางานตามคาสงในบรรทดท 12 ถาไมใช จะทางานตามคาสงในบรรทดท 12
บทท 6 คาสงควบคม
200
ตวอยางท 6.23 โปรแกรมแสดงเลข 1 ถง 100 ออกทางหนาจอโดยใชคาสงแบบวนซา
1 #include <stdio.h> 2 main() 3 { 4 int A=1; 5 while(A<=100) 6 { 7 printf("%i\n",A); 8 A++; 9 } 10 }
ผลลพธของโปรแกรม
1 2 3 4 . . . 96 97 98 99 100
อธบายโปรแกรม
บรรทดท 4 กาหนดคาเรมตนให A = 1 เพอเปนตวนบ
บรรทดท 5 ตรวจสอบเงอนไขวา A นอยกวาหรอเทากบ 100 หรอไม ถาใชกใหดาเนนการในสวนของคาสงบรรทดท 7 ซงเปนคาสงใหแสดงผลลพธคาคาตวแปรนน จากนนดาเนนการในสวนของการเพมคา A โดยเพมทละ 1 จากนนกจะดาเนนการตรวจสอบเงอนไขอกครง โดยจะกระทาซาไปเรอยๆ จนกวาคาตวแปร A จะมากกวา 100 กจะจบโปรแกรม
บทท 6 คาสงควบคม
201
ตวอยางท 6.24 โปรแกรมบวกเลข 1 ถง 100 แลวแสดงผลลพธ
1 #include <stdio.h> 2 main() 3 { 4 int A=1,sum=0; 5 while(A<=100) 6 { 7 sum = sum + A; 8 A++; 9 } 10 printf("%i",sum); 11 }
ผลลพธของโปรแกรม
5050
อธบายโปรแกรม
บรรทดท 4 กาหนดคาเรมตนให A = 1 เพอเปนตวนบ และ sum = 0 เพอใชเปนตวเกบคาผลรวม
บรรทดท 5 ตรวจสอบเงอนไขวา A นอยกวาหรอเทากบ 100 หรอไม ถาใชกใหดาเนนการในสวนของคาสงบรรทดท 7 ซงเปนคาสงใหทาการบวกคา แลวเกบไวทตวแปร sum และดาเนนการของคาสงในบรรทดท 8 ซงเปนคาสงในการการเพมคา A โดยเพมทละ 1 จากนนกจะดาเนนการตรวจสอบเงอนไขอกครง โดยจะกระทาซาไปเรอยๆ จนกวาคาตวแปร A จะมากกวา 100 กจะกระทาในบรรทดท 11 ซงเปนคาสงในการแสดงคาผลรวมทงหมด
6.4.2 คาสงทากอนแลวจงตรวจสอบเงอนไขเพอทาซา (do-while)
คาสงทากอนแลวจงตรวจสอบเงอนไขเพอทาซาคอคาสงทจะทางานคาสงกอนการตรวจสอบเงอนไข โดยทางานตามคาสงภายในลป 1 รอบ จากนนจงทาการทดสอบเงอนไขวาเปนจรง หรอเปนเทจ ถาเงอนไขเปนจรง ใหกลบไปทางานตามชดคาสงภายในลปอก ทางานซาๆ เชนน จนกวาเงอนไขจะเปนเทจ จงออกจากการทางานของคาสงน โดยมรปแบบคาสง คอ
บทท 6 คาสงควบคม
202
รปท 6.12 ผงงานของคาสงแบบทาซาแบบทากอนแลวจงตรวจสอบเงอนไขเพอทาซา
ตวอยางท 6.25 โปรแกรมแสดงคาสงทากอนแลวจงตรวจสอบเงอนไขในการรบคา ในการตรวจคาทรบเขามา
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 do 6 { 7 printf("Input = "); scanf("%i",&num); 8 } while(num==0); 9 printf("Output = %i\n",num); 10 }
ผลลพธของโปรแกรม
(รนครงท 1) ในกรณทปอนคา 0 เขาไปจานวนหลายครง Input = 0 Input = 0 Input = 0
(รนครงท 2) ในกรณทปอนคาอน ทไมใช 0
Input = 5 Output = 5
do{
ชดคาสง }while(เงอนไข);
บทท 6 คาสงควบคม
203
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา และใหทาคาสงบรรทดท 7
บรรทดท 7 แสดงตวอกษรและรบคาอนพตเกบไวทตวแปร num
บรรทดท 8 ตรวจสอบเงอนไขวาตวเลขทไดรบเขามา = 0 หรอไม ถาเทากบ 0 ใหดาเนนการในสวนของคาสงบรรทดท 5, 6 และ7 ใหม ซงเปนคาสงใหรบคาอนพตอก จากนนกจะดาเนนการตรวจสอบเงอนไขอกครงในบรรทดท 8 โดยจะทาการวนซาไปจนกวาจะปอนคาทไมใชเลข 0 ถาในกรณทปอนคาเลขอนทไมใชเลข 0 กจะดาเนนการในบรรทดท 9
และจบโปรแกรม
ตวอยางท 6.26 โปรแกรมแสดงคาสงทากอนแลวจงตรวจสอบเงอนไขเพอทาซาในการหาคาผลรวมตงแตเลขทปอนเขาไปจนถงเลข 50
1 #include<stdio.h> 2 main(){ 3 int i,sum=0; 4 printf("Enter number : "); 5 scanf("%d",&i); 6 printf("#############################\n"); 7 do{ 8 sum = sum+i; 9 printf("%d \t %d \n" ,i,sum); 10 i=i+1; 11 }while(i<=50); 12 printf("#############################\n"); 13 }
ผลลพธของโปรแกรม
(รนครงท 1)
Enter number : 45 ############################# 45 45 46 91 47 138 48 186 49 235 50 285 #############################
(รนครงท 2)
Enter number : 57 ############################# 57 57 #############################
บทท 6 คาสงควบคม
204
อธบายโปรแกรม
บรรทดท 4,5,6 แสดงตวอกษรและรบคาอนพตเกบไวทตวแปร i บรรทดท 7-11 โปรแกรมจะทางานตามคาสงในบรรทดท 8 – 10 จากนนตรวจสอบ
วาคาตวแปร i นอยกวาหรอเทากบ 50 หรอไม ถาใช จะกลบไปทางานตามคาสงในบรรทดท 8 – 10 ทาซาไปเรอยๆ จนกวาคา i จะมากกวา 50 จงจะหยดทาซา และไปทางานตามคาสงในบรรทดท 12
ถาไมใช จะทางานตามคาสงในบรรทดท 12
ตวอยางท 6.27 โปรแกรมบวกเลข 1 ถง 100 แลวแสดงผลลพธ
1 #include <stdio.h> 2 main() 3 { 4 int A,sum; 5 sum = 0; 6 A = 1; 7 do 8 { 9 sum = sum + A; 10 A++; 11 } while (A<=100); 12 printf("%i",sum); 13 }
ผลลพธของโปรแกรม
5050
อธบายโปรแกรม
บรรทดท 5,6 กาหนดคาเรมตนให A = 1 เพอเปนตวนบ และ sum = 0 เพอใชเปนตวเกบคาผลรวม
บรรทดท 7 ดาเนนการคาสงในบรรทดท 9 และ 10 จากนนตรวจสอบเงอนไขวา A นอยกวาหรอเทากบ 100 หรอไม ถาใชกใหดาเนนการของคาสงในบรรทดท 9 และ 10 ไปเรอยๆ จนกวาคาตวแปร A จะมากกวา 100 กจะกระทาในบรรทดท 11 ซงเปนคาสงในการแสดงคาผลรวมทงหมด
บทท 6 คาสงควบคม
205
6.4.3 คาสงทาซาตามจานวนรอบทระบ (for)
คาสงทาซาตามจานวนรอบทระบ จะใชในงานทสามารถระบจานวนรอบในการทาซาได โดยมรปแบบคาสง คอ
กาหนดคาเรมตนใหกบตวแปร เปนการกาหนดคาเรมตนใหกบตวแปรทใชในการตรวจสอบการทาซา เงอนไขทตองการตรวจสอบ เปนการตรวจสอบคาตวแปรทใชในการทาซา โดยถาคาเปนจรงจะทาซา แตถาคาเปนเทจจะหยดการทาซา การปรบคาของตวแปร เปนการเพมหรอลดคาตวแปรเพอใหสามารถทาซาหรอหยดการทาซาได
รปแบบคาสงทาซาตามจานวนรอบทระบกจะคลายกนกบรปแบบการวนซาของหวขอทไดกลาวกอนหนาน เพยงแตวารปแบบคาสงทาซาแบบนจะมการกาหนดในคาสงโดยตรง กาหนดคาเรมตน กาหนดเงอนไข กาหนดการปรบคาตวแปร ทาใหสะดวกตอการใชงาน ดงตวอยางของรปแบบคาสงทาซาตามจานวนรอบในรปท 6.13
รปท 6.13 ผงงานของคาสงแบบทาซาตามจานวนรอบ
for(กาหนดคาเรมตนใหกบตวแปร ; เงอนไขในการตรวจสอบ ; ปรบคาตวแปร){ ชดคาสง }
บทท 6 คาสงควบคม
206
ตวอยางท 6.28 โปรแกรมแสดงคาสงทาซาตามจานวนรอบทระบ โดยใหแสดงชอของนกศกษาออกทางหนาจอภาพจานวน 100 ครง
1 #include <stdio.h> 2 main() 3 { 4 int count; 5 for(count=0;count<100;count++) 6 { 7 printf("[%i] Asst.Prof.Dr.Krit\n",count); 8 } 9 }
ผลลพธของโปรแกรม
[0]Asst.Prof.Dr.Krit [1]Asst.Prof.Dr.Krit [2]Asst.Prof.Dr.Krit . . . [98]Asst.Prof.Dr.Krit [99]Asst.Prof.Dr.Krit
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให count = 0 และใหเปรยบเทยบเงอนไขวา count มคานอยกวา 100 หรอไม ถาใช (มคานอยกวา) ใหกระทาคาสงในบรรทดท 7 สดทายใหทาการปรบคา count เพมทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา count มคา = 100 จงจะหยดทางานของโปรแกรม
บรรทดท 7 แสดงตวอกษร
ตวอยางท 6.29 โปรแกรมแสดงคาสงทาซาตามจานวนรอบทระบ โดยใหแสดงเลข 10 ถง 100
ออกทางหนาจอภาพ
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 for(num=10;num<=100;num++) printf("[%i]\n",num); 6 }
บทท 6 คาสงควบคม
207
ผลลพธของโปรแกรม
[10] [11] [12] . . . [99] [100]
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให num = 10 และใหเปรยบเทยบเงอนไขวา num มคานอยกวาหรอเทากบ 100 หรอไม ถาใชใหกระทาคาสงถดไปคอคาสงแสดงผลตวเลข สดทายใหทาการปรบคา num เพมทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา num มคา = 101 จงจะหยดทางานของโปรแกรม
ตวอยางท 6.30 โปรแกรมแสดงคาสงทาซาตามจานวนรอบทระบ โดยใหแสดงเลข 100 ถง 1
ออกทางหนาจอภาพ
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 for(num=100;num>=1;num--) printf("[%i]\n",num); 6 }
ผลลพธของโปรแกรม
[100] [99] [98] . . . [2] [1]
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให num = 100 และใหเปรยบเทยบเงอนไขวา num มคามากกวาหรอเทากบ 1 หรอไม ถาใชใหกระทา
บทท 6 คาสงควบคม
208
คาสงถดไปคอคาสงแสดงผลตวเลข สดทายใหทาการปรบคา num
ลดทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา num มคา = 0 จงจะหยดทางานของโปรแกรม
ตวอยางท 6.31 โปรแกรมแสดงคาสงทาซาตามจานวนรอบทระบ โดยใหแสดงเลขค ตงแตเลข 1 ถง 10 ออกทางหนาจอภาพ
1 #include <stdio.h> 2 main() 3 { 4 int num; 5 for(num =1; num <=10; num +=2) 6 printf("[%i]\n", num); 7 }
ผลลพธของโปรแกรม
[1] [3] [5] [7] [9]
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให num = 1 และใหเปรยบเทยบเงอนไขวา num มคานอยกวาหรอเทากบ 10 หรอไม ถาใชใหกระทาคาสงถดไปคอคาสงแสดงผลตวเลขในบรรทดท 6 สดทายใหทาการปรบคา num โดยใหเพมคาทละ 2 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา num มคา = 11 จงจะหยดทางานของโปรแกรม
บรรทดท 7 แสดงตวอกษรผลลพธ
ตวอยางท 6.32 โปรแกรมแสดงคาสงทาซาตามจานวนรอบทระบ โดยใหแสดงผลรวมของเลขททาการแสดงผลทงหมดและแสดงหมายเลขของคาสง
1 #include<stdio.h> 2 main(){ 3 int i,sum=0; 4 for(i=1;i<=10;i++){ 5 sum = sum + i; 6 printf("%d \t %d \n" ,i,sum); 7 } 8 }
บทท 6 คาสงควบคม
209
ผลลพธของโปรแกรม 1 1 2 3 3 6 4 10 5 15 6 21 7 28 8 36 9 45 10 55
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให i = 1 และใหเปรยบเทยบเงอนไขวา i มคานอยกวาหรอเทากบ 10 หรอไม ถาใชใหกระทาคาสงบรรทดท 5
และบรรทดท 6 สดทายใหทาการปรบคา i โดยใหเพมคาทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา i มคาเกน 10 จงจะหยดทางานของโปรแกรม
บรรทดท 5 เกบคาผลรวม
บรรทดท 7 แสดงตวอกษรผลลพธ
การใชคาสง for ซอน for (nested for) เปนการนาคาสง for หลายๆ ชดมาทางานซอนกน ซงจะเรมจากลป for ทอยขางนอก ไปยงลป for ทอยขางใน โดยทางานลป for ทอยขางนอก แตละรอบ จะทางานลป for ทอยขางในจนครบทกรอบ แลวจงจะกลบไปทาลป for ทอยขางนอกรอบตอไป ทาจนกวาลป for นอกสดจะเปนเทจ
ตวอยางท 6.33 โปรแกรมแสดงคาสง for ซอน for ในการแสดงผลของสญลกษณ
1 #include<stdio.h> 2 main(){ 3 for(int i=5;i>=1;i--){ 4 printf("%d\n",i); 5 for(int j=1;j<=i;j++){ 6 printf("*"); 7 } 8 printf("\n"); 9 } 10 }
บทท 6 คาสงควบคม
210
ผลลพธของโปรแกรม 5 ***** 4 **** 3 *** 2 ** 1 *
อธบายโปรแกรม
บรรทดท 3 เรมคาสงวนซา โดยกาหนดให i = 5 และใหเปรยบเทยบเงอนไขวา i มคามากกวาหรอเทากบ 1 หรอไม ถาใชใหกระทาคาสงบรรทดท 4
ถงบรรทดท 6 ซงเปนการพมพเลขทประมวลผลตอนนนออกทางหนาจอภาพอกทงยงมการตรวจสอบเงอนไขอกชน สดทายใหทาการปรบคา i โดยใหลดคาทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา i มคานอยกวา 1 จงจะหยดทางานของโปรแกรม
บรรทดท 4 แสดงตวเลข บรรทดท 5 เรมคาสงวนซา โดยกาหนดให j = 1 และใหเปรยบเทยบเงอนไขวา j
มคามากกวาหรอเทากบ 1 หรอไม ถาใชใหกระทาคาสงบรรทดท 6
ซงเปนการพมพ * ออกทางหนาจอภาพ สดทายใหทาการปรบคา j โดยใหลดคาทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา j มคานอยกวา 1 จงจะหยดทางานของโปรแกรม
บรรทดท 6 แสดงสญลกษณ *
โปรแกรมนจะทางานลปนอก 5 รอบ คอ i เรมตนท 5 และลดคาทละ 1 จนกระทง i เปน 0 จงออกจากลปนอก โดยการทางานลปนอกแตละครงจะทาลปใน i รอบ เชน ถา i เปน 5
จะทาลปใน 5 รอบ คอการพมพเครองหมาย * 5 ครง และถา i เปน 4 จะทางานลปใน 4 รอบ
คอการพมพเครองหมาย * 4 ครง เปนตน
บทท 6 คาสงควบคม
211
ตวอยางท 6.34 โปรแกรมแสดงคาสง for ซอน for โดยพมพแมสตรคณตงแต แม 2 ถงแม 5
1 #include <stdio.h> 2 main() 3 { 4 int i,j; 5 for(i=2;i<=5;i++) 6 { 7 for(j=2;j<=12;j++) 8 { 9 printf("%i x %i = %i\n",i,j,i*j); 10 } 11 printf("\n"); 12 } 13 }
ผลลพธของโปรแกรม 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 2 x 7 = 14 2 x 8 = 16 2 x 9 = 18 2 x 10 = 20 2 x 11 = 22 2 x 12 = 24 . . . 3 x 2 = 6 3 x 3 = 9 3 x 4 = 12 . . . 5 x 10 = 50 5 x 11 = 55 5 x 12 = 60
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให i = 2 และใหเปรยบเทยบเงอนไขวา i มคานอยกวาหรอเทากบ 5 หรอไม ถาใชใหกระทาคาสงบรรทดท 7
ถงบรรทดท 11 สดทายใหทาการปรบคา i โดยใหเพมคาทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา i มคามากกวา 5
จงจะหยดทางานในสวนของการทาซาในสวนน
บทท 6 คาสงควบคม
212
บรรทดท 7 เรมคาสงวนซายอย โดยกาหนดให j = 2 และใหเปรยบเทยบเงอนไขวา j มคานอยกวาหรอเทากบ 12 หรอไม ถาใชใหกระทาคาสงบรรทดท 9 สดทายใหทาการปรบคา j โดยใหเพมคาทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา j มคามากกวา 12 จงจะหยดทางานในสวนของการทาซาในสวนน และไปกระทาในบรรทดท
11
บรรทดท 9 แสดงผลลพธ
คาสงทาซาตามจานวนรอบทระบของคาสง for ไมจาเปนตองเปนจานวนเตม โดยตวนบสามารถทจะเปนชนดขอมลใดกไดหรอแมแตไมมตวนบ ในกรณทใชตวนบเปนเลขทศนยมกกระทาไดแตการใชตวนบทเปนทศนยมมขอควรระวงคอ ไมควรใชการเปรยบเทยบคาโดยใช == หรอ != สาหรบเปนเงอนไขหยดการวนซาเพราะการเปรยบเทยบ == และ != ของเลขทศนยมจะไมไดผลลพธถกตองพอด ซงอาจทาใหเงอนไขการหยดไมเกดขน ดงนนในการเขยนโปรแกรมในการทาซาสาหรบผ เรมตนควรจะเขยนใหอยในรปของชนดขอมลแบบจานวนเตมกอน แลวถามปญหาใดทตองใชเลขทศนยมคอยปรบเปลยนการเขยนรปแบบใหเหมาะสม
ดงแสดงในตวอยางท 6.35
ตวอยางท 6.35 โปรแกรมแสดงคาสง for ซอน for ทตวนบเปนเลขทศนยมทผดพลาด
1 #include <stdio.h> 2 main() 3 { 4 float i; 5 for(i=0.1;i!=0.6;i+=0.1) 6 printf("%f\n",i); 7 }
ผลลพธของโปรแกรม 0.100000 0.200000 0.300000 0.400000 0.500000 0.600000 0.700000 . . .
บทท 6 คาสงควบคม
213
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให i = 0.1 และใหเปรยบเทยบเงอนไขวา i ไมเทากบ 0.6 หรอไม ถาใชใหกระทาคาสงบรรทดท 6 สดทายใหทาการปรบคา i โดยใหเพมคาทละ 0.1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา i = 0.6 จงจะหยดทางานของโปรแกรม
แตเมอนาโปรแกรมไปใชงานจรงปรากฏวาโปรแกรมทางานประโยค for ไปเรอยๆ ทเปนเชนนเพราะ i ไมใชคา 0.6 พอด ดงนนในโปรแกรมนกจะแสดงคาไปเรอยๆ ไมมทสนสด
บรรทดท 6 แสดงตวเลข
6.5 คาสงแบบกระโดด (Jump Statement)
คาสงแบบกระโดดคอการเขยนคาสงในลกษณะทกระโดดไปทาในคาสงบรรทดทตองการโดยไมมเงอนไขดงฟงกชน break, continue และ goto เปนตน
6.5.1 คาสงกระโดดโดยใชฟงกชน break
คาสง break จะวางอยในสวนของประโยค switch, while, do...while หรอ for โดยคาสงนจะไมสามารถทจะอยนอกสวนของประโยคเหลานนได ในการทางานกเปรยบเสมอนการทางานของคาสงวนซาตางๆ เพยงแตจะมการสนสดของโปรแกรมเกดขนเมอใชคาสง break และจะดาเนนตอไปทประโยคถดไป ดงแสดงในตวอยาง
ตวอยางท 6.36 โปรแกรมพมพเลขตงแต 1 ถง 5 แตเมอ i = 3 กจะทาประโยค if (i==3)
break; ซงเปนการกระโดดออกจาก Loop ไปเลย
1 #include <stdio.h> 2 main() 3 { 4 int i; 5 for(i=1;i<=5;i++) 6 { 7 if (i==3) break; 8 printf("%i\n",i); 9 } 10 }
บทท 6 คาสงควบคม
214
ผลลพธของโปรแกรม 1 2
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให i = 1 และใหเปรยบเทยบเงอนไขวา i มคานอยกวาหรอเทากบ 5 หรอไม ถาใชใหกระทาคาสงบรรทดท 7
ถงบรรทดท 8 สดทายใหทาการปรบคา i โดยใหเพมคาทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา i มคามากกวา 5
จงจะหยดทางานของโปรแกรม
บรรทดท 7 ตรวจสอบเงอนไข ถา i = 3 ให หยดโปรแกรมและออกจากสวนของการทาซา
บรรทดท 8 แสดงตวเลข
6.5.2 คาสงกระโดดโดยใชฟงกชน continue
คาสง break จะวางอยในสวนของประโยค while, do...while หรอ for เทานน ไมสามารถใชไดกบคาสง switch โดยคาสงนจะไมสามารถทจะอยนอกสวนของประโยคเหลานนได ในการทางานกเปรยบเสมอนการทางานของคาสงวนซาตางๆ เพยงแตจะมการเรมตนใหมเมอใชคาสง continue ดงแสดงในตวอยาง
ตวอยางท 6.37 โปรแกรมพมพเลขตงแต 1 ถง 5 โดยไมพมพเลข 2 ออกมา
1 #include <stdio.h> 2 main() 3 { 4 int i; 5 for(i=1;i<=5;i++) 6 { 7 if (i==2) continue; 8 printf("%i\n",i); 9 } 10 }
ผลลพธของโปรแกรม 1 3 4 5
บทท 6 คาสงควบคม
215
อธบายโปรแกรม
บรรทดท 5 เรมคาสงวนซา โดยกาหนดให i = 1 และใหเปรยบเทยบเงอนไขวา i มคานอยกวาหรอเทากบ 5 หรอไม ถาใชใหกระทาคาสงบรรทดท 7
ถงบรรทดท 8 สดทายใหทาการปรบคา i โดยใหเพมคาทละ 1 และทาการตรวจสอบเงอนไขตอไป ใหกระทาจนกวาคา i มคามากกวา 5
จงจะหยดทางานของโปรแกรม
บรรทดท 7 ตรวจสอบเงอนไข ถา i = 2 ใหเรมตนตรวจสอบเงอนไขใหมในบรรทดท 5
บรรทดท 8 แสดงตวเลข
6.5.3 คาสงกระโดดโดยใชฟงกชน goto
คาสง goto เปนคาสงทกระโดดไปยงคาสงทตองการโดยจะตองมการกาหนดปาย (Label) ซงเปนชอทใชอางองในตาแหนงทจะกระโดดไปทางาน โดยมขอบเขตวาการกระโดดไปยงคาสงทตองการจะตองอยภายในฟงกชนเดยวกนเทานน ดงแสดงในตวอยาง
ตวอยางท 6.38 โปรแกรมแสดงการใชคาสง goto
1 #include <stdio.h> 2 main() 3 { 4 int i = 1; 5 loop : 6 printf("%i\n",i++); 7 if (i <= 5) goto loop; 8 /* End of loop */ 9 }
ผลลพธของโปรแกรม 1 3 4 5
อธบายโปรแกรม
บรรทดท 5 กาหนดปาย (Label) ทใชระบตาแหนงทจะกระโดด
บรรทดท 6 แสดงตวเลข
บทท 6 คาสงควบคม
216
บรรทดท 7 ตรวจสอบเงอนไข ถา i <= 5 ใหกระโดดไปยงปายทชอวา loop ในบรรทดท 5 ถามากกวากจบโปรแกรม
จะเหนวาการใช goto จะหาจดสนสดของ loop ไดยากกวาการใชคาสงวนซา ดงนนในปจจบนเราจะไมนยมใช goto ในการกระโดดของโปรแกรมเพราะจะทาใหยากตอการทาความเขาใจโปรแกรม
บทท 6 คาสงควบคม
217
บทสรป
ในบทนไดกลาวถงพนฐานคาสงควบคมในภาษาซ คาสงแบบลาดบ คาสงแบบเลอกหรอแบบมเงอนไข คาสงแบบวนซา และคาสงแบบกระโดด ซงเปนพนฐานทสาคญในการเขยนโปรแกรมทาใหสามารถชวยควบคมการทางานของโปรแกรม ชวยใหคดวธการเขยนโปรแกรมเพอแกปญหาทซบซอนตางๆ ทาใหสามารถแกปญหาไดอยางเปนระบบ คาสงควบคมในการเขยนโปรแกรมม 4 รปแบบ นนคอ แบบเสนตรง แบบมทางเลอก แบบทาซา และแบบกระโดด โดยแตละแบบกจะมโครงสรางการทางานทแตกตางกน และนาไปใชในรปของปญหาทเหมาะสมกบงาน คาสงแบบลาดบคอการเขยนคาสงในลกษณะจากบนลงลางโดยทวไป ในทกๆ คาสงตงแตตนจนจบโปรแกรม จนครบทกคาสง คาสงแบบเลอกหรอแบบมเงอนไขคอการเขยนคาสงในลกษณะตรวจสอบเงอนไขของชดคาสงวาตรงตามเงอนไขทกาหนดหรอไม ถาตรงตามเงอนไขกใหกระทาในสวนหนง ถาไมตรงตามเงอนไขกใหไปกระทาอกสวน
เปรยบเสมอนการเลอกเสนทางในการดาเนนการของชดคาสง โดยในภาษาซมคาสงในการเลอกดงนคาสงทดสอบเงอนไข 1 ทางเลอก (if) คาสงทดสอบเงอนไข 2 ทางเลอก (if-else)
คาสงทดสอบเงอนไขหลายทางเลอก (nested if) และคาสงเลอกเงอนไข (switch-case) คาสงแบบวนซาคอการเขยนคาสงในลกษณะคาสงทมการทางานวนซาๆ เปนวงรอบหรอลป (Loop)
จนกวาเงอนไขททดสอบจะเปนเทจ จงจะสามารถออกจากการทางานของคาสง ในภาษาซสามารถแบงออกเปน 3 ชนด คอคาสงตรวจสอบเงอนไขกอนแลวจงทาซา (while) คาสงทากอนแลวจงตรวจสอบเงอนไขเพอทาซา (do-while) คาสงทาซาตามจานวนรอบทระบ (for)
คาสงแบบกระโดดคอการเขยนคาสงในลกษณะทกระโดดไปทาในคาสงบรรทดทตองการโดยไมมเงอนไขดงฟงกชน break, continue และ goto เปนตน
บทท 6 คาสงควบคม
218
แบบฝกหดทบทวน
1. จงหาคาผลลพธตวแปรของโปรแกรมดงตอไปน
int a = 10,count=0; if(a>0) { count++; }
int a = 10,count=0; if(a>10) { count++; }
int a = 10,count=0; if(a<10) { count++; }
int a = 10,count=0; if(a!=10) { count++; }
int a = 10,count=0; if(a-->10) { count++; }
int a = 10,count=0; if(++a>10) { count++; }
2. จงหาคาผลลพธตวแปรของโปรแกรมดงตอไปน
int a=-1,b=1,c=0,count=0; if( (a<0) && (b>0) ) { count++; }
int a=-1,b=1,c=0,count=0; if( (a<0) && (b<0) ) { count++; }
int a=-1,b=1,c=0,count=0; if( (a>0) && (b>0) ) { count++; }
int a=-1,b=1,c=0,count=0; if( (a>0) && (b<0) ) { count++; }
บทท 6 คาสงควบคม
219
3. จงแปลงโปรแกรมดงตอไปนใหอยในรปแบบคาสงเลอกเงอนไข (switch-case)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <stdio.h> main() { char grade; printf("Input grade "); scanf("%c",&grade); if(grade=='A') { printf("Excellent"); } else if(grade=='B') { printf("Good"); } else if(grade=='C') { printf("Fair"); } else if(grade=='D') { printf("Bad"); } else if(grade=='F') { printf("Fail"); } else { printf("Invalid"); } }
4. จงหาคาผลลพธตวแปรของโปรแกรมดงตอไปน
int a=1,count=0; while(a<10) { a++; }
int a=1,count=0; while(a<10) a++;
int a=1,count=0; while(a<10) a++;
int a=1,count=0; while(a<10) { a++; count++; }
int a=1,count=0; while(a<10) a++; count++;
int a=1,count=0; while(a<10) a++; count++;
บทท 6 คาสงควบคม
220
5. จงหาคาผลลพธตวแปรของโปรแกรมดงตอไปน
int a=-5,count=0; do { a++; } while(a<0);
int a=-5,count=0; do a++; while(a<0);
int a=-5,count=0; do a++; while(a<0);
int a=-5,count=0; do { a++; count++; } while(a<0);
int a=-5,count=0; do a++; count++; while(a<0);
int a=-5,count=0; do a++; count++; while(a<0);
6. จงหาคาผลลพธตวแปรของโปรแกรมดงตอไปน
int i,count=0; for(i=0;i<10;i++) { count++; }
int i,count=0; for(i=10;i<10;i++) { count++; }
int i=10,count=0; for(i=0;i<10;i++) { count++; }
int i=10,count=0; for(;i<10;i++) { count++; }
int i,count=0; for(i=20;i<10;i++) { count++; }
int i,count=0; for(i=0;1<10;i++) { count++; }
int i,count=0; for(i=0;1>10;i++) { count++; }
int i,count=0; for(i=0; ;i++) { count++; }
int i,count=0; for(i=0;i<10;i++) { count++; i++; }
บทท 6 คาสงควบคม
221
7. จงหาคาผลลพธตวแปรของโปรแกรมดงตอไปน
int i=0,j=0,count=0; while(i<5) { while(j<5) { count++; j++; } i++; }
int i=0,j=0,count=0; while(i<5) { do { i++; count++; } while(i<5); }
int i=0,j=0,count=0; while(i<5) { for(j=0;j<5;j++) count++; }
int i=0,j=0,count=0; do { while(i<5) { j++; count++; } i++; } while(i<5);
int i=0,j=0,count=0; do { do { j++; count++; } while(j<5); i++; } while(i<5);
int i=0,j=0,count=0; do { for(j=0;j<5;j++) count++; i++; } while(i<5);
int i=0;j=0;count=0; for(i=0;i<5;i++) { while(j<5) { count++; j++; } }
int i=0;j=0;count=0; for(i=0;i<5;i++) { do { j++; count++; } }
int i=0;j=0;count=0; for(i=0;i<5;i++) { for(j=0;j<5;j++) count++; }
บทท 6 คาสงควบคม
222
8. จงหาคาผลลพธตวแปรของโปรแกรมดงตอไปน
int i,j,k,count=0; int count_i=0,count_j=0,count_k=0; for(i=0;i<3;i++) { for(j=0;j<4;j++) { for(k=0;k<5;k++) { count++; count_k++; } count_j++; } count_i++; }
int i=3,j=3,k=3,count=0; int count_i=0,count_j=0,count_k=0; for(i=0;i<=j;i++) { for(j=0;j<=k;j++) { for(k=0;k<5;k++) { count++; count_k++; } count_j++; } count_i++; }
9. จงเขยนผลลพธของโปรแกรม
1 2 3 4 5 6 7 8 9 10 11 12 13
#include <stdio.h> main() { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { if ((i==1) && (j==1)) break; printf("i = %i j = %i\n",i,j); } printf("End j loop\n"); } }
10. จงเขยนโปรแกรมเพอรบคาคะแนนของนกศกษาทางคยบอรด แลวพจารณาวาถาคะแนนนอยกวา 50 ใหแสดงคาวา Fail ถามากกวานนใหแสดงคาวา Pass ทางหนาจอ
11. จงเขยนโปรแกรมเพอใหสามารถรบคายอดซอของลกคาทางคยบอรด แลวคานวณสวนลด
และราคาหลงหกสวนลด จากนนใหแสดงยอดซอ สวนลด และ ราคาหลงหกสวนลดออกทางหนาจอ โดยมเงอนไขการลดราคาสนคาใหกบลกคาดงน
- ยอดซอตงแต 3,000 – 4,999 บาท ลด 10%
- ยอดซอตงแต 5,000 – 7,999 บาท ลด 20%
- ยอดซอตงแต 8,000 บาท ขนไป ลด 30%
บทท 6 คาสงควบคม
223
12. จงเขยนโปรแกรมเพอรบคาอายของลกคาทางคยบอรดจานวน 10 คน เพอตรวจสอบวา มลกคาทมอายระหวาง 25-35 ป อยกคน โดยใหแสดงผลลพธออกทางหนาจอ
13. จงเขยนโปรแกรมเพอรบคาตวเลข 2 จานวน คอ A กบ B ทางคยบอรด โดย A,B เปนเลขจานวนเตมบวกใดๆ โดย A <= B แลว ใหแสดงตวเลขจาก A ถง B ออกทางหนาจอ
14. จงเขยนโปรแกรมเพอแสดงเลขคตงแต 1 ถง 100 ออกทางหนาจอพรอมทงแสดงคาผลรวมของเลขคออกทางหนาจอภาพดวย
15. จงเขยนโปรแกรมเพอแสดงเลขคตงแต 1 ถง 100 ออกทางหนาจอพรอมทงแสดงคาผลรวมของเลขคออกทางหนาจอภาพดวย
16. จงเขยนโปรแกรมเพอแสดงจานวนทอยระหวาง 1 ถง 100 โดยใหแสดงเฉพาะเลขทหารดวย 5 ลงตวพรอมทงแสดงคาผลรวมของเลขทหารดวย 5 ลงตวทงหมดตงแต 1 ถง 100
ออกทางหนาจอภาพ
17. จงเขยนโปรแกรมใหแสดงผลลพธดงรป โดยผใชปอนคาตวเลขสงสดทตองการแสดงผล
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
5 4 4 3 3 3 2 2 2 2 1 1 1 1 1
1 1 1 1 1 2 2 2 2 3 3 3 4 4 5
5 5 5 5 5 4 4 4 4 3 3 3 2 2 1
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
18. จงเขยนโปรแกรมหาคา Factorial โดย นยามของ Factorial คอ 0! = 1 1! = 0! * 1 = 1 * 1 2! = 1! * 2 = 1 * 1 * 2 3! = 2! * 3 = 1 * 1 * 2 * 3 4! = 3! * 4 = 1 * 1 * 2 * 3 * 4 ... n! = (n-1)! * n
บทท 7 แถวลาดบ
บทท 7
แถวลาดบ
ในบทนจะกลาวถง โครงสรางแถวลาดบ (Array Structure) แถวลาดบ 1 มต (One-
Dimensional Array) แถวลาดบแบบ 2 มต (Two-Dimensional Array) แถวลาดบ 3 มต
(Three-Dimension Array) ขนาดแถวลาดบอตโนมต (Automatic Size of Array) และแถวลาดบของสายอกขระ (Array of String) แถวลาดบเปนกลมของขอมลทมลกษณะของขอมลชนดเดยวกน ทาการจดกลมรวมกนโดยใชชอเดยวกนซงสามารถอางองขอมลโดยใชดรรชน
โดยแถวลาดบจะมขนาดคงท และมการจดเกบขอมลชนดใดชนดหนงตามทกาหนด
นอกจากนนสามารถกาหนดจานวนมตของแถวลาดบได จงสามารถนามาประยกตใชในการจดเกบขอมลประเภทตางๆ ไดอยางเหมาะสม และมประสทธภาพ ซงเปนโครงสรางทมความสาคญในการประยกตไปสการเขยนโปรแกรมระดบสง
7.1 โครงสรางแถวลาดบ (Array Structure)
ในการเขยนโปรแกรมถาเราตองการตวแปรหลายตวเพอเกบคาหลายคาทมลกษณะเดยวกน เชน ตองการประกาศตวแปรเพอเกบคาของคะแนนนกศกษาจานวน 150 คนกตองประกาศตวแปรจานวน 150 ตว ดงน int x1,x2,x3,...,x150; กจะทาใหเขยนโปรแกรมลาบาก ยากตอการจดการ ยงถามการบคาเขามาโดยใชคาสง scanf กจะตองใชคาสง scanf จานวน
150 คาสง ซงเปนเรองยงยาก ดงนนจงมแนวคดของแถวลาดบ (Array) ขนมาเพอใชจดการกบตวแปรทใชเกบคาลกษณะเดยวกน ดงนนถาตองการตวแปร 150 ตวเกบคาคะแนนนกศกษากประกาศตวแปรดงน int x[150]; และการอางองขอมลในแตละตวกสามารถกระทาไดโดยงายโดยใชดรรชนหรอหมายเลขระบตาแหนงของขอมลทตองการ ตวแปรภาษา (Compiler) จะทาการจองหนวยความจาสาหรบเกบตวแปรชนด int จานวน 150 ตวไว โดยตวแปรตวแรกคอ
บทท 7 แถวลาดบ
226
x[0] ตวแปรทสองคอ x[1] ... ตวแปรตวท 150 คอ x[149] โดยรปแบบนเราเรยกวาแถวลาดบ
1 มต
แถวลาดบหรออาเรย คอโครงสรางขอมลทใชตวแปรเดยวเกบกลมของขอมลชนดเดยวกนไว แถวลาดบเปนชนดขอมลประเภทหนง และจะกาหนดจานวนขอมล หรอสมาชกของแถวลาดบไวแนนอน โดยจะใชดรรชน (Index) ในการอางถงตาแหนงของขอมลในแถวลาดบ และตองระบดรรชนในเครองหมายวงเลบเหลยม [ ] ดงนนผ ใชสามารถเขาถงขอมลทตองการไดทนท (Direct Access) โดยไมตองเขาถงขอมลกอนหนา
คาของดรรชนจะตองเปนคาทมลาดบแนนอน โดยจะใชตวเลข เชน [0 : 9] จะมคาของดรรชน คอ 0, 1, 2,…,9
Index 0 1 2 3 4 5 6
value 56 76 55 33 12 22 59
รปท 7.1 โครงสรางขอมลแบบแถวลาดบ
จากภาพท 7.1 จะเหนวาตวแปร week เกบขอมลแบบแถวลาดบ และมสมาชก 7 คา โดยมดรรชนตงแต 0-6
การนาขอมลเขาแถวลาดบ สามารถเขยนไดดงน
หมายถง การนาคา x ไปเกบไวในแถวลาดบ week ดรรชนท i
การนาขอมลออกจากแถวลาดบ สามารถเขยนไดดงน
หมายถง การกาหนดใหคา x มคาเทากบคาของแถวลาดบ week ดรรชนท i
week
week[i] = x;
x = week[i];
บทท 7 แถวลาดบ
227
ขอควรระวงในการใชงานแถวลาดบ ในภาษาซจะไมมการกาหนดใหตรวจสอบขอบเขตของแถวลาดบ ดงนนจะตองพยายามเขยนโปรแกรมตรวจสอบขอบเขตของแถวลาดบ
หากมการอางองถงสมาชกตวแปรนอกขอบเขตทไดระบไว เชน week[7] สงทไดคอการอานขอมลในพนทของหนวยความจาอนๆ ทอาจจะเปนขอมลทเราไมตองการ
7.2 แถวลาดบ 1 มต (One-Dimensional Array)
แถวลาดบ 1 มต จะมการจดเกบขอมลในลกษณะตอเนองกนเปนแถว ซงจะตองมการกาหนดขนาดใหเพยงพอกบจานวนขอมลทตองการจดเกบ แตกไมใหมขนาดใหญมากเกนกวาจานวนขอมล เพราะจะเปนการสนเปลองพนทหนวยความจาโดยเปลาประโยชน
แถวลาดบแบบ 1 มต เปนโครงสรางของแถวลาดบทงายทสด โดย โครงสรางขอมลแถวลาดบแบบ 1 มต จะมการจดเกบขอมลในลกษณะตอเนองกน ดงตวอยางในรปท 7.2
0 1 2 3 4 5 6 7 01234567
Column
Row
รปท 7.2 รปแบบของแถวลาดบแบบ 1 มต
บทท 7 แถวลาดบ
228
7.2.1 การประกาศตวแปรแถวลาดบ 1 มต การประกาศตวแปรแถวลาดบ 1 มต มรปแบบคาสง คอ
เชน int a[10]; เปนการประกาศตวแปร a ใหเกบขอมลชนดเลขจานวนเตม โดยมขนาด 10
ชอง ซงขอมลชนดเลขจานวนเตมแบบ int จะมขนาด 2 ไบต ดงนน ตวแปร a จงมขนาด 20 ไบต
2
ไบต 2
ไบต 2
ไบต 2
ไบต 2
ไบต 2
ไบต 2
ไบต
2
ไบต
2
ไบต
2
ไบต
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
20 ไบต
สมมตถาตองการประกาศตวแปรแถวลาดบ 1มต ทสามารถเกบตวแปรไดจานวน 5
ตวแปร สามารถประกาศตวแปรไดดงน
int a[5]; ตวแปรตวท 1 คอ a[0]
ตวแปรตวท 2 คอ a[1]
ตวแปรตวท 3 คอ a[2]
ตวแปรตวท 4 คอ a[3]
ตวแปรตวท 5 คอ a[4]
float b[20]; เปนการประกาศตวแปร b ใหเกบขอมลชนดเลขทศนยม โดยมขนาด 20
ชอง ซงขอมลชนดเลขทศนยมแบบ float จะมขนาด 4 ไบต ดงนน ตวแปร b จงมขนาด 80 ไบต
4
ไบต 4
ไบต 4
ไบต 4
ไบต 4
ไบต 4
ไบต ……………….
[0] [1] [2] [17] [18] [19]
80 ไบต
ชนดขอมล ชอตวแปร[ขนาดของแถวลาดบ];
บทท 7 แถวลาดบ
229
char c[5]; เปนการประกาศตวแปร c ใหเกบขอมลชนดตวอกษรโดยมขนาด 5 ชอง ซงขอมลชนดตวอกษรจะมขนาด 1 ไบต ดงนน ตวแปร c จงมขนาด 5 ไบต
1
ไบต 1
ไบต 1
ไบต 1
ไบต 1
ไบต
[0] [1] [2] [3] [4]
5 ไบต
7.2.2 การกาหนดคาเรมตนใหกบแถวลาดบ 1 มต
การกาหนดคาเรมตนใหกบแถวลาดบ 1 มต เปนการกาหนดคาเรมตนใหกบตวแปรพรอมกบการประกาศใชตวแปร โดยตองระบไวในเครองหมายวงเลบปกกา { } และใหมเครองหมายจลภาค , คนระหวางขอมลแตละคา ยกเวนขอมลชนดตวอกษรทสามารถกาหนดขอมลเปนสายอกขระโดยกาหนดใหขอมลสายอกขระอยในเครองหมายอญประกาศ “ ” และถามการกาหนดคาเรมตนใหกบตวแปรพรอมกบการประกาศใชตวแปร ไมตองระบขนาดของแถวลาดบกได โดยตวแปรภาษา (Compiler) จะกาหนดขนาดของแถวลาดบเทากบจานวนของคาเรมตนทกาหนดให โดยมรปแบบคาสงทวไป คอ
เชน int a[5] = {80,78,99,65,68}; เปนการประกาศตวแปร a เปนแถวลาดบเกบขอมลชนดเลขจานวนเตม โดยมขนาด 5 ชอง กาหนดคาเรมตนเปน 80 ,78 ,99 ,65 และ 68
ตามลาดบ
80 78 99 65 68
[0] [1] [2] [3] [4]
ชนดขอมล ชอตวแปร[ขนาดของแถวลาดบ] = {คาขอมล ,คาขอมล ,………………};
บทท 7 แถวลาดบ
230
int a[5] = {80,78,99}; เปนการประกาศตวแปร a เปนแถวลาดบเกบขอมลชนดเลขจานวนเตม โดยมขนาด 5 ชอง กาหนดคาเรมตนเปน 80 ,78 และ 99 ตามลาดบ ซงอก 2 ชองทเหลอไมไดมการกาหนดคาเรมตนให แตจะเกบคาเรมตนเปน 0 โดยอตโนมต
80 78 99 0 0
[0] [1] [2] [3] [4]
int a[ ] = {80,78,99}; เปนการประกาศตวแปร a เปนแถวลาดบเกบขอมลชนดเลขจานวนเตม โดยมขนาด 3 ชอง กาหนดคาเรมตน เปน 80 ,78 และ 99 ตามลาดบ
80 78 99
[0] [1] [2]
float a[5] = {66.44,76.33,63.77}; เปนการประกาศตวแปร a เปนแถวลาดบเกบขอมลชนดเลขทศนยม โดยมขนาด 5 ชอง กาหนดคาเรมตนเปน 66.44 ,76.33 และ 63.77ตามลาดบ ซงอก 2 ชองทเหลอไมไดมการกาหนดคาเรมตนให แตจะเกบคาเรมตนเปน 0 โดยอตโนมต
66.44 76.33 63.77 0 0
[0] [1] [2] [3] [4]
char a[5] = {‘a’ ,’b’ ,’c’ ,’d’}; เปนการประกาศตวแปร a เปนแถวลาดบเกบขอมลชนดตวอกษร โดยมขนาด 5 ชอง กาหนดคาเรมตนเปน a ,b ,c และ d ตามลาดบ ซงชองสดทายของแถวลาดบจะตองเปน ‘\0’ เสมอ ดงนนแถวลาดบจงเตม ไมสามารถเพมขอมลเขาไปได
a b c d \0
[0] [1] [2] [3] [4]
บทท 7 แถวลาดบ
231
char a[5] = {‘a’ ,’b’ ,’c’}; เปนการประกาศตวแปร a เปนแถวลาดบเกบขอมลชนดตวอกษร โดยมขนาด 5 ชอง กาหนดคาเรมตนเปน a ,b และ c ตามลาดบ ซงชองสดทายของแถวลาดบจะตองเปน ‘\0’ เสมอ ดงนนแถวลาดบจงมชองวาง 1 ชองทสามารถเพมขอมลเขาไปได โดยจะเกบคาเรมตนเปน ‘\0’ โดยอตโนมต
a b c \0 \0
[0] [1] [2] [3] [4]
char a[5] = “abcd”; เปนการประกาศตวแปร a เปนแถวลาดบเกบขอมลชนดตวอกษร โดยมขนาด 5 ชอง กาหนดคาเรมตนเปน a ,b ,c และ d ตามลาดบ ซงชองสดทายของแถวลาดบจะตองเปน ‘\0’ เสมอ ดงนนแถวลาดบจงเตม ไมสามารถเพมขอมลเขาไปได
a b c d \0
[0] [1] [2] [3] [4]
การกาหนดตวแปรหลงจากการประกาศตวแปรสามารถกระทาไดโดย int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
บทท 7 แถวลาดบ
232
7.2.3 การเขาถงขอมลในแถวลาดบ 1 มต
การเขาถงขอมลในแถวลาดบ 1 มต จะใชดรรชน (Index) ในการเขาถงขอมลในแถวลาดบ ซงดรรชนเรมตนมคาเทากบ 0 เสมอ และดรรชนสดทายมคาเทากบขนาดของแถวลาดบลบดวยหนงเสมอ โดยมรปแบบคาสง คอ
เชน int a[5] = {80,78,99,65,68};
80 78 99 65 68
[0] [1] [2] [3] [4]
a[0] = 80
a[1] = 78
a[2] = 99
a[3] = 65
a[4] = 68
สามารถกาหนดคาใหกบตวแปรแถวลาดบได เชน a[3] = 55; จะได
80 78 99 55 68
[0] [1] [2] [3] [4]
a[0] = 80
a[1] = 78
a[2] = 99
a[3] = 55
a[4] = 68
ชอตวแปร[ดรรชน];
บทท 7 แถวลาดบ
233
ตวอยางท 7.1 โปรแกรมแสดงการใชแถวลาดบ 1 มต
1 #include<stdio.h> 2 main(){ 3 int a[5] = {80,78,99,65,68}; 4 int b[5] = {80,78,99}; 5 int c[] = {80,78,99}; 6 float d[5] = {66.44,76.33,63.77}; 7 char e[5] = "abcd"; 8 char f[5] = {'a','b','c','d'}; 9 char g[] = "abcd"; 10 a[3] = 55; 11 printf("a[0] = %d a[1] = %d a[2] = %d a[3] = %d
a[4] = %d\n",a[0],a[1],a[2],a[3],a[4]); 12 printf("b[0] = %d b[1] = %d b[2] = %d b[3] = %d
b[4] = %d\n",b[0],b[1],b[2],b[3],b[4]); 13 printf("c[0] = %d c[1] = %d c[2] =
%d\n",c[0],c[1],c[2]); 14 printf("d[0] = %.2f d[1] = %.2f d[2] = %.2f d[3]
= %.2f d[4] = %.2f\n",d[0],d[1],d[2],d[3],d[4]); 15 printf("e[0] = %c e[1] = %c e[2] = %c e[3] = %c
e[4] = %c\n",e[0],e[1],e[2],e[3],e[4]); 16 printf("f[0] = %c f[1] = %c f[2] = %c f[3] = %c
f[4] = %c\n",f[0],f[1],f[2],f[3],f[4]); 17 printf("g[0] = %c g[1] = %c g[2] = %c g[3] = %c
g[4] = %c\n",g[0],g[1],g[2],g[3],g[4]); 18 printf("e = %s\n",e); 19 printf("f = %s\n",f); 20 printf("g = %s\n",g); 21 }
ผลลพธของโปรแกรม a[0] = 80 a[1] = 78 a[2] = 99 a[3] = 55 a[4] = 68 b[0] = 80 b[1] = 78 b[2] = 99 b[3] = 0 b[4] = 0 c[0] = 80 c[1] = 78 c[2] = 99 d[0] = 66.44 d[1] = 76.33 d[2] = 63.77 d[3] = 0.00 d[4] = 0.00 e[0] = a e[1] = b e[2] = c e[3] = d e[4] = f[0] = a f[1] = b f[2] = c f[3] = d f[4] = g[0] = a g[1] = b g[2] = c g[3] = d g[4] = e = abcd f = abcd g = abcd
อธบายโปรแกรม
บรรทดท 3-5 ประกาศตวแปรชนดแถวลาดบ ทเปนชนดเลขจานวนเตม พรอมกาหนดคาเรมตน
บรรทดท 6 ประกาศตวแปรชนดแถวลาดบ ท เปนชนดเลขทศนยม พรอมกาหนดคาเรมตน
บทท 7 แถวลาดบ
234
บรรทดท 7-9 ประกาศตวแปรชนดแถวลาดบ ท เปนชนดสายอกขระ พรอมกาหนดคาเรมตน
บรรทดท 11-20 แสดงผลลพธทไดจากการประมวลผล
ตวอยางท 7.2 โปรแกรมแสดงการคานวณหาคะแนนเฉลยของวชาคอมพวเตอรของนกศกษาทงหมด 10 คน โดยรบคาคะแนนทางคยบอรด และแสดงคาเฉลยผานทางหนาจอ
1 #include<stdio.h> 2 main(){ 3 int score[10],sum = 0,i,avg; 4 for(i=0;i<10;i++){ 5 printf("Input score[%d] : ",i); 6 scanf("%d",&score[i]); 7 sum = sum + score[i]; 8 } 9 avg = sum/10; 10 printf("Average Score = %d\n",avg); 11 }
ผลลพธของโปรแกรม Input score[0] : 76 Input score[1] : 84 Input score[2] : 65 Input score[3] : 98 Input score[4] : 72 Input score[5] : 66 Input score[6] : 83 Input score[7] : 49 Input score[8] : 52 Input score[9] : 90 Average Score = 73
อธบายโปรแกรม
บรรทดท 3 ประกาศตวแปร score เปนตวแปรชนดแถวลาดบ ทเปนชนดเลขจานวนเตม พรอมกาหนดคาเรมตน และประกาศตวแปร sum และ avg เปนเลขจานวนเตม
บรรทดท 4-8 รบคาคะแนนของนกศกษาจานวน 10 คน แลวหาผลรวมของคะแนนของนกศกษา
บรรทดท 9 หาคาเฉลยของคะแนนวชาคอมพวเตอรของนกศกษา โดยการนาผลรวมของคะแนนมาหารดวยจานวนนกศกษาทงหมด
บทท 7 แถวลาดบ
235
ตวอยางท 7.3 โปรแกรมแสดงการคานวณหาคะแนนสงสด และคะแนนตาสดของวชาคอมพวเตอรของนกศกษาทงหมด 5 คน โดยรบคาคะแนนทางคยบอรด
1 #include<stdio.h> 2 main(){ 3 int num[5],i,max,min; 4 for(i=0;i<5;i++){ 5 printf("Input number[%d] : ",i); 6 scanf("%d",&num[i]); 7 } 8 max = num[0]; 9 min = num[0]; 10 for(i=1;i<5;i++){ 11 if(num[i]>max) 12 max = num[i]; 13 if(num[i]<min) 14 min = num[i]; 15 } 16 printf("Max = %d\t Min = %d\n",max,min); 17 }
ผลลพธของโปรแกรม Input number[0] : 76 Input number[1] : 84 Input number[2] : 65 Input number[3] : 98 Input number[4] : 72 Max = 98 Min = 65
อธบายโปรแกรม
บรรทดท 4 – 7 ทาการรบคาตวเลขมาเกบไวในตวแปรแถวลาดบ 5 คา บรรทดท 10 – 15 ทาการหาคาทมากทสดและนอยทสด
บทท 7 แถวลาดบ
236
7.3 แถวลาดบแบบ 2 มต (Two-Dimensional Array)
แถวลาดบแบบ 2 มต จะมการจดเกบขอมลในลกษณะของเมทรกซ (Matrix) กลาวคอ จะมรปแบบเปนตารางทประกอบไปดวย แถว (Row) และคอลมน (Column) ดงนนการอางองถงขอมล จะตองอางองดวยตวเลข 2 ชด คอ แถว และคอลมน เชน a[0][0], a[0][1] เปนตน
ดงตวอยางแสดงในรปท 7.3
รปท 7.3 รปแบบของแถวลาดบแบบ 2 มตหรอเมทรกซ (เมทรกซขนาด 5x5)
7.3.1 การประกาศตวแปรแถวลาดบ 2 มต การประกาศตวแปรแถวลาดบ 2 มต มรปแบบคาสง คอ
เชน int a[3][4]; เปนการประกาศตวแปร a ใหเกบขอมลชนดเลขจานวนเตม โดยมขนาด
3 แถว 4 คอลมน ดงนน ตวแปร a จงเกบขอมลได 3 * 4 = 12 คา ขนาด 48 ไบต
คอลมน
0 1 2 3
แถว 0 a[0][0] a[0][1] a[0][2] a[0][3]
1 a[1][0] a[1][1] a[1][2] a[1][3]
2 a[2][0] a[2][1] a[2][2] a[2][3]
ชนดขอมล ชอตวแปร[ขนาดของแถว][ขนาดของคอลมน];
บทท 7 แถวลาดบ
237
7.3.2 การกาหนดคาเรมตนใหกบแถวลาดบ 2 มต
การกาหนดคาเรมตนใหกบแถวลาดบ 2 มต เปนการกาหนดคาเรมตนใหกบตวแปรพรอมกบการประกาศใชตวแปร โดยตองระบไวในเครองหมายวงเลบปกกา { } และใหมเครองหมายจลภาค , คนระหวางขอมลแตละคา เชน int a[3][4] = { 2 ,5 ,3 ,6 ,9 ,43 ,5 ,67 ,34 ,12 ,10 ,44};
int a[4][3] = { 2 ,5 ,3 ,6 ,9 ,43 ,5 ,67 ,34 ,12 ,10 ,44};
สามารถกาหนดคาเรมตนใหกบตวแปร โดยระบขอมลทละแถวไวในเครองหมายวงเลบปกกา และใหมเครองหมายจลภาคคนระหวางขอมลแตละคา และขอมลแตละแถว โดยขอมลของทกแถวอยในเครองหมายวงเลบปกกา
คอลมน
0 1 2 3
แถว 0 2 5 3 6
1 9 43 5 67
2 34 12 10 44
คอลมน
0 1 2
แถว
0 2 5 3
1 6 9 43
2 5 67 34
3 12 10 44
บทท 7 แถวลาดบ
238
เชน int a[3][4] = { {2 ,5 ,3 ,6} ,{9 ,43 ,5 ,67} ,{34 ,12 ,10 ,44} };
int a[4][3] = { {2 ,5 ,3} ,{6 ,9 ,43} ,{5 ,67 ,34} ,{12 ,10 ,44} };
สมมตถาตองการประกาศตวแปรแถวลาดบ 2 มต ทสามารถเกบตวแปรไดจานวน 6
ตวแปร สามารถประกาศตวแปรไดดงน
int a[2][3];
ตวแปรตวท 1 คอ a[0][0] ตวแปรตวท 2 คอ a[0][1] ตวแปรตวท 3 คอ a[0][2]
ตวแปรตวท 4 คอ a[1][0] ตวแปรตวท 5 คอ a[1][1] ตวแปรตวท 6 คอ a[1][2]
int a[3][2];
ตวแปรตวท 1 คอ a[0][0] ตวแปรตวท 2 คอ a[0][1]
ตวแปรตวท 3 คอ a[1][0] ตวแปรตวท 4 คอ a[1][1]
ตวแปรตวท 5 คอ a[2][0] ตวแปรตวท 6 คอ a[2][1]
คอลมน
0 1 2 3
แถว 0 2 5 3 6
1 9 43 5 67
2 34 12 10 44
คอลมน
0 1 2
แถว
0 2 5 3
1 6 9 43
2 5 67 34
3 12 10 44
บทท 7 แถวลาดบ
239
7.3.3 การเขาถงขอมลในแถวลาดบ 2 มต
การเขาถงขอมลในแถวลาดบ 2 มต จะใชดรรชนแถว และดรรชนคอลมนในการเขาถงขอมลในแถวลาดบ 2 มต โดยจะตองระบดรรชนแถว และดรรชนคอลมน ซงดรรชนแถว และดรรชนคอลมนเรมตนมคาเทากบ 0 เสมอ และดรรชนสดทายของดรรชนแถว และดรรชนคอลมนมคาเทากบขนาดของแถว และขนาดของคอลมน ลบดวยหนงเสมอ โดยมรปแบบคาสง คอ
เชน int a[3][4] = { {2 ,5 ,3 ,6} ,{9 ,43 ,5 ,67} ,{34 ,12 ,10 ,44} };
a[0][0] = 2 a[0][1] = 5 a[0][2] = 3 a[0][3] = 6
a[1][0] = 9 a[1][1] = 43 a[1][2] = 5 a[1][3] = 67
a[2][0] = 34 a[2][1] = 12 a[2][2] = 10 a[2][3] = 44
int a[4][3] = { {2 ,5 ,3} ,{6 ,9 ,43} ,{5 ,67 ,34} ,{12 ,10 ,44} };
คอลมน
0 1 2 3
แถว 0 2 5 3 6
1 9 43 5 67
2 34 12 10 44
คอลมน
0 1 2
แถว
0 2 5 3
1 6 9 43
2 5 67 34
3 12 10 44
ชอตวแปร[ดรรชนแถว][ดรรชนคอลมน];
บทท 7 แถวลาดบ
240
a[0][0] = 2 a[0][1] = 5 a[0][2] = 3
a[1][0] = 6 a[1][1] = 9 a[1][2] = 43
a[2][0] = 5 a[2][1] = 67 a[2][2] = 34
a[3][0] = 12 a[3][1] = 10 a[3][2] = 44
สามารถกาหนดคาใหกบตวแปรแถวลาดบได เชน a[2][2] = 99; จะได
a[0][0] = 2 a[0][1] = 5 a[0][2] = 3
a[1][0] = 6 a[1][1] = 9 a[1][2] = 43
a[2][0] = 5 a[2][1] = 67 a[2][2] = 99
a[3][0] = 12 a[3][1] = 10 a[3][2] = 44
ตวอยางท 7.4 โปรแกรมแสดงการใชแถวลาดบ 2 มต กาหนดคาและแสดงผลลพธ 1 #include <stdio.h> 2 main() 3 { 4 char a[2][3]; 5 a[0][0]='A'; a[0][1]='B'; a[0][2]='C'; 6 a[1][0]='D'; a[1][1]='E'; a[1][2]='F'; 7 printf("%c %c %c\n",a[0][0],a[0][1],a[0][2]); 8 printf("%c %c %c\n",a[1][0],a[1][1],a[1][2]); 9 }
ผลลพธของโปรแกรม A B C D E F
คอลมน
0 1 2
แถว
0 2 5 3
1 6 9 43
2 5 67 99
3 12 10 44
บทท 7 แถวลาดบ
241
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ 2 มต ทเปนชนดสายอกขระ บรรทดท 5-6 กาหนดคาใหกบตวแปร บรรทดท 7-8 แสดงผลลพธ
ตวอยางท 7.5 โปรแกรมแสดงการใชแถวลาดบ 2 มต รบคาเกบไวในตวแปรและแสดงผล 1 #include <stdio.h> 2 main() 3 { 4 float a[2][2]; 5 scanf("%f",&a[0][0]); 6 scanf("%f",&a[0][1]); 7 scanf("%f",&a[1][0]); 8 scanf("%f",&a[1][1]); 9 printf("%f\n",a[0][0]); 10 printf("%f\n",a[0][1]); 11 printf("%f\n",a[1][0]); 12 printf("%f\n",a[1][1]); 13 }
ผลลพธของโปรแกรม 5 4 3 2 5.000000 4.000000 3.000000 2.000000
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ 2 มต ทเปนชนดทศนยม
บรรทดท 5-8 ทาการรบคาและเกบไวทตวแปรแถวลาดบ
บรรทดท 9-12 แสดงผลลพธ
บทท 7 แถวลาดบ
242
ตวอยางท 7.6 โปรแกรมแสดงการใชแถวลาดบ 2 มต สรางตวแปรแถวลาดบพรอมทงกาหนดคา และแสดงผล
1 #include<stdio.h> 2 main(){ 3 int a[3][4] = { 2 ,5 ,3 ,6 ,9 ,43 ,5 ,67 ,34 ,12 ,10
,44}; 4 int b[4][3] = { 2 ,5 ,3 ,6 ,9 ,43 ,5 ,67 ,34 ,12 ,10
,44}; 5 int c[3][4] = { {2 ,5 ,3 ,6} ,{9 ,43 ,5 ,67} ,{34 ,12
,10 ,44} }; 6 int d[4][3] = { {2 ,5 ,3} ,{6 ,9 ,43} ,{5 ,67 ,34}
,{12 ,10 ,44} }; 7 a[2][2]=99; 8 printf("a[0][0] = %d\t a[0][1] = %d\t a[0][2] = %d\t
a[0][3] = %d\n",a[0][0],a[0][1],a[0][2],a[0][3]); 9 printf("a[1][0] = %d\t a[1][1] = %d\t a[1][2] = %d\t
a[1][3] = %d\n",a[1][0],a[1][1],a[1][2],a[1][3]); 10 printf("a[2][0] = %d\t a[2][1] = %d\t a[2][2] = %d\t
a[2][3] = %d\n",a[2][0],a[2][1],a[2][2],a[2][3]); 11 printf("b[0][0] = %d\t b[0][1] = %d\t b[0][2] =
%d\n",b[0][0],b[0][1],b[0][2]); 12 printf("b[1][0] = %d\t b[1][1] = %d\t b[1][2] =
%d\n",b[1][0],b[1][1],b[1][2]); 13 printf("b[2][0] = %d\t b[2][1] = %d\t b[2][2] =
%d\n",b[2][0],b[2][1],b[2][2]); 14 printf("b[3][0] = %d\t b[3][1] = %d\t b[3][2] =
%d\n",b[3][0],b[3][1],b[3][2]); 15 printf("c[0][0] = %d\t c[0][1] = %d\t c[0][2] = %d\t
c[0][3] = %d\n",c[0][0],c[0][1],c[0][2],c[0][3]); 16 printf("c[1][0] = %d\t c[1][1] = %d\t c[1][2] = %d\t
c[1][3] = %d\n",c[1][0],c[1][1],c[1][2],c[1][3]); 17 printf("c[2][0] = %d\t c[2][1] = %d\t c[2][2] = %d\t
c[2][3] = %d\n",c[2][0],c[2][1],c[2][2],c[2][3]); 18 printf("d[0][0] = %d\t d[0][1] = %d\t d[0][2] =
%d\n",d[0][0],d[0][1],d[0][2]); 19 printf("d[1][0] = %d\t d[1][1] = %d\t d[1][2] =
%d\n",d[1][0],d[1][1],d[1][2]); 20 printf("d[2][0] = %d\t d[2][1] = %d\t d[2][2] =
%d\n",d[2][0],d[2][1],d[2][2]); 21 printf("d[3][0] = %d\t d[3][1] = %d\t d[3][2] =
%d\n",d[3][0],d[3][1],d[3][2]); 22 }
ผลลพธของโปรแกรม a[0][0] = 2 a[0][1] = 5 a[0][2] = 3 a[0][3] = 6 a[1][0] = 9 a[1][1] = 43 a[1][2] = 5 a[1][3] = 67 a[2][0] = 34 a[2][1] = 12 a[2][2] = 99 a[2][3] = 44 b[0][0] = 2 b[0][1] = 5 b[0][2] = 3 b[1][0] = 6 b[1][1] = 9 b[1][2] = 43 b[2][0] = 5 b[2][1] = 67 b[2][2] = 34
บทท 7 แถวลาดบ
243
b[3][0] = 12 b[3][1] = 10 b[3][2] = 44 c[0][0] = 2 c[0][1] = 5 c[0][2] = 3 c[0][3] = 6 c[1][0] = 9 c[1][1] = 43 c[1][2] = 5 c[1][3] = 67 c[2][0] = 34 c[2][1] = 12 c[2][2] = 10 c[2][3] = 44 d[0][0] = 2 d[0][1] = 5 d[0][2] = 3 d[1][0] = 6 d[1][1] = 9 d[1][2] = 43 d[2][0] = 5 d[2][1] = 67 d[2][2] = 34 d[3][0] = 12 d[3][1] = 10 d[3][2] = 44
อธบายโปรแกรม
บรรทดท 3-6 ประกาศตวแปรชนดแถวลาดบ 2 มต ทเปนชนดเลขจานวนเตม
พรอมกาหนดคาเรมตน
บรรทดท 7 กาหนดคาใหตวแถวลาดบตาแหนง แถวท 2 คอลมน ท 2 โดยใหเกบคา 99
บรรทดท 8-21 แสดงผลลพธจากการประมวลผล
ตวอยางท 7.7 โปรแกรมแสดงการคานวณหาคะแนนเฉลยของวชาคอมพวเตอร คณตศาสตร และฟสกส โดยมนกศกษาวชาละ 5 คน โดยใหรบคาคะแนนผานทางคยบอรด จากนนใหแสดงคะแนนของนกศกษาแตละคน และแสดงคะแนนเฉลยของแตละวชาผานทางจอภาพ
1 #include<stdio.h> 2 main(){ 3 int score[5][3],sum[3] = {0,0,0},avg[3] = {0,0,0},i,j; 4 for(i=0;i<5;i++){ 5 for(j=0;j<3;j++){ 6 printf("Input score[%d][%d] : ",i+1,j+1); 7 scanf("%d",&score[i][j]); 8 } 9 } 10 for(i=0;i<5;i++){ 11 sum[0] = sum[0] + score[i][0]; 12 sum[1] = sum[1] + score[i][1]; 13 sum[2] = sum[2] + score[i][2]; 14 } 15 avg[0] = sum[0]/5; 16 avg[1] = sum[1]/5; 17 avg[2] = sum[2]/5; 18 printf("**************************************\n");19 printf("\t\t\tComputer\tMath\t\tPhysic\n"); 20 printf("**************************************\n");21 for(i=0;i<5;i++){ 22 printf("\nStudent%d",i+1);
บทท 7 แถวลาดบ
244
23 for(j=0;j<3;j++){ 24 printf("\t\t%d",score[i][j]); 25 } 26 } 27 printf("\n************************************\n");28 printf("Average Score of Computer = %d\n",avg[0]); 29 printf("Average Score of Math = %d\n",avg[1]); 30 printf("Average Score of Physic = %d\n",avg[2]); 31 }
ผลลพธของโปรแกรม Input score[1][1] : 60 Input score[1][2] : 67 Input score[1][3] : 73 Input score[2][1] : 80 Input score[2][2] : 78 Input score[2][3] : 81 Input score[3][1] : 97 Input score[3][2] : 67 Input score[3][3] : 84 Input score[4][1] : 56 Input score[4][2] : 70 Input score[4][3] : 80 Input score[5][1] : 65 Input score[5][2] : 49 Input score[5][3] : 70 ************************************************************** Computer Math Physic **************************************************************Student1 60 67 73 Student2 80 78 81 Student3 97 67 84 Student4 56 70 80 Student5 65 49 70 **************************************************************Average Score of Computer = 71 Average Score of Math = 66 Average Score of Physic = 77
อธบายโปรแกรม
บรรทดท 4 – 9 วนลปรบคาคะแนนมาเกบไวในตวแปรแถวลาดบ15 คา (นกศกษา5 คน คนละ 3 วชา)
บรรทดท 10 – 14 วนลปรวมคะแนนในแตละวชา บรรทดท 15 คานวณคะแนนเฉลยของวชาคอมพวเตอร บรรทดท 16 คานวณคะแนนเฉลยของวชาคณตศาสตร บรรทดท 17 คานวณคะแนนเฉลยของวชาฟสกส บรรทดท 21 – 26 วนลปแสดงคะแนนของนกศกษาแตละคน
บทท 7 แถวลาดบ
245
7.4 แถวลาดบ 3 มต (Three-Dimension Array)
แถวลาดบแบบ 3 มต จะมลกษณะเหมอนกบการนาแถวลาดบแบบ 2 มต มาเรยงซอนกนหลายๆ ชน ทาใหแถวลาดบแบบ 3 มต มชน แถว และคอลมน ดงนนการอางองถงขอมล จะตองอางองดวยตวเลข 3 ชด คอ ชน แถว และคอลมน เชน a[0][0][1], a[0][0][2]
เปนตน ดงตวอยางแสดงในรปท 7.4
รปท 7.4 รปแบบของแถวลาดบแบบ 3 มต (เมทรกซขนาด 2x5x5)
จากรป แถวลาดบ 3 มตจะม 3 แกนดงรป ซงจะมแกน X (แถว) แกน Y (คอลมน) และ แกน Z (ชน)
7.4.1 การประกาศตวแปรแถวลาดบ 3 มต การประกาศตวแปรแถวลาดบ 3 มต มรปแบบคาสง คอ
เชน int a[2][3][4]; เปนการประกาศตวแปร a ใหเกบขอมลชนดเลขจานวนเตม โดยม 2
ชน แตละชนม 3 แถว 4 คอลมน ดงนน ตวแปร a จงเกบขอมลไดทงหมด 2*3*4 = 24
คา มขนาด 96 ไบต
ชนดขอมล ชอตวแปร[ขนาดของชน][ขนาดของแถว][ขนาดของคอลมน];
บทท 7 แถวลาดบ
246
7.4.2 การกาหนดคาเรมตนใหกบแถวลาดบ 3 มต
การกาหนดคาเรมตนใหกบแถวลาดบ 3 มต เปนการกาหนดคาเรมตนใหกบตวแปรพรอมกบการประกาศใชตวแปร โดยตองระบไวในเครองหมายวงเลบปกกา { } และใหมเครองหมายจลภาค , คนระหวางขอมลแตละคา เชน int a[2][3][4] = { 2 ,5 ,3 ,6 ,9 ,43 ,5 ,67 ,34 ,12 ,10 ,44 ,11 ,12 ,13 ,34 ,23 ,54
,55 ,53 ,34 ,45 ,4 ,9};
สามารถกาหนดคาเรมตนใหกบตวแปร โดยระบขอมลทละแถวไวในเครองหมายวงเลบปกกา และใหมเครองหมายจลภาคคนระหวางขอมลแตละคา และขอมลแตละแถว โดยขอมลของทกแถวทอยในชนเดยวกนจะอยในเครองหมายวงเลบปกกาและขอมลทกชนอยในเครองหมายวงเลบปกกาโดยมเครองหมายจลภาคคนระหวางชน
เชน int a[2][3][4] = { { {2 ,5 ,3 ,6} ,{9 ,43 ,5 ,67} ,{34 ,12 ,10 ,44}} ,{ {11 ,12 ,13
,34} ,{23 ,54 ,55 ,53} ,{34 ,45 ,4 ,9} } };
แถว 0
แถว 1
แถว 2 ชน 0
a[0][2][0]
a[0][1][0]
11
a[0][2][1]
a[0][1][1]
12
a[0][2][2]
a[0][1][2]
13
a[0][2][3]
a[0][1][3]
34
คอลมน 0 คอลมน 1 คอลมน 2 คอลมน 3
34
9
12
43
10
5
44
67
2 5 3 6
ชน 1
แถว 0
แถว 1
แถว 2 ชน 0
a[0][2][0]
a[0][1][0]
11
a[0][2][1]
a[0][1][1]
12
a[0][2][2]
a[0][1][2]
13
a[0][2][3]
a[0][1][3]
34
คอลมน 0 คอลมน 1 คอลมน 2 คอลมน 3
34
9
12
43
10
5
44
67
2 5 3 6
ชน 1
บทท 7 แถวลาดบ
247
สมมตถาตองการประกาศตวแปรแถวลาดบ 3 มต ทสามารถเกบตวแปรไดจานวน 12
ตวแปร สามารถประกาศตวแปรไดดงน
int a[2][2][3];
ตวแปรตวท 1 คอ a[0][0][0] ตวแปรตวท 2 คอ a[0][0][1]
ตวแปรตวท 3 คอ a[0][0][2] ตวแปรตวท 4 คอ a[0][1][0]
ตวแปรตวท 5 คอ a[0][1][1] ตวแปรตวท 6 คอ a[0][1][2]
ตวแปรตวท 7 คอ a[1][0][0] ตวแปรตวท 8 คอ a[1][0][1]
ตวแปรตวท 9 คอ a[1][0][2] ตวแปรตวท 10 คอ a[1][1][0]
ตวแปรตวท 11 คอ a[1][1][1] ตวแปรตวท 12 คอ a[1][1][2]
เราสามารถกาหนดคาเรมตนของ int d [2][3][5]; ไดดงน
d[0][0][0] = 0; d[1][0][0] = 15;
d[0][0][1] = 1; d[1][0][1] = 16;
d[0][0][2] = 2; d[1][0][2] = 17;
d[0][0][3] = 3; d[1][0][3] = 18;
d[0][0][4] = 4; d[1][0][4] = 19;
d[0][1][0] = 5; d[1][1][0] = 20;
d[0][1][1] = 6; d[1][1][1] = 21;
d[0][1][2] = 7; d[1][1][2] = 22;
d[0][1][3] = 8; d[1][1][3] = 23;
d[0][1][4] = 9; d[1][1][4] = 24;
d[0][2][0] = 10; d[1][2][0] = 25;
d[0][2][1] = 11; d[1][2][1] = 26;
d[0][2][2] = 12; d[1][2][2] = 27;
d[0][2][3] = 13; d[1][2][3] = 28;
d[0][2][4] = 14; d[1][2][4] = 29;
หรอ int d [2][3][5] ={ { {0,1,2,3,4} , {5,6,7,8,9} , {10,11,12,13,14} },
{ {15,16,17,18,19} , {20,21,22,23,24} , {25,26,27,28,29} } };
บทท 7 แถวลาดบ
248
7.4.3 การเขาถงขอมลในแถวลาดบ 3 มต
การเขาถงขอมลในแถวลาดบ 3 มต จะใชดรรชนชน ดรรชนแถว และดรรชนคอลมนในการเขาถงขอมลในแถวลาดบ 3 มต โดยจะตองระบดรรชนชน ดรรชนแถว และดรรชนคอลมน
ซงดรรชนชน ดรรชนแถว และดรรชนคอลมนเรมตนมคาเทากบ 0 เสมอ และดรรชนสดทายของดรรชนชน ดรรชนแถว และดรรชนคอลมนมคาเทากบขนาดของชน ขนาดของแถว และขนาดของคอลมน ลบดวยหนงเสมอ โดยมรปแบบคาสง คอ
เชน int a[2][3][4] = { { {2 ,5 ,3 ,6} ,{9 ,43 ,5 ,67} ,{34 ,12 ,10 ,44}} ,{ {11 ,12 ,13
,34} ,{23 ,54 ,55 ,53} ,{34 ,45 ,4 ,9} } };
a[0][0][0] = 2 a[0][0][1] = 5 a[0][0][2] = 3 a[0][0][3] = 6
a[0][1][0] = 9 a[0][1][1] = 43 a[0][1][2] = 5 a[0][1][3] = 67
a[0][2][0] = 34 a[0][2][1] = 12 a[0][2][2] = 10 a[0][2][3] = 44
a[1][0][0] = 11 a[1][0][1] = 12 a[1][0][2] = 13 a[1][0][3] = 34
a[1][1][0] = 23 a[1][1][1] = 54 a[1][1][2] = 55 a[1][1][3] = 53
a[1][2][0] = 34 a[1][2][1] = 45 a[1][2][2] = 4 a[1][2][3] = 9
สามารถกาหนดคาใหกบตวแปรแถวลาดบได เชน a[0][2][2] = 99; จะได
ชอตวแปร[ดรรชนชน][ดรรชนแถว][ดรรชนคอลมน];
แถว 0
แถว 1
แถว 2 ชน 0
a[0][2][0]
a[0][1][0]
11
a[0][2][1]
a[0][1][1]
12
a[0][2][2]
a[0][1][2]
13
a[0][2][3]
a[0][1][3]
34
คอลมน 0 คอลมน 1 คอลมน 2 คอลมน 3
34
9
12
43
10
5
44
67
2 5 3 6
ชน 1
บทท 7 แถวลาดบ
249
a[0][0][0] = 2 a[0][0][1] = 5 a[0][0][2] = 3 a[0][0][3] = 6
a[0][1][0] = 9 a[0][1][1] = 43 a[0][1][2] = 5 a[0][1][3] = 67
a[0][2][0] = 34 a[0][2][1] = 12 a[0][2][2] = 99 a[0][2][3] = 44
a[1][0][0] = 11 a[1][0][1] = 12 a[1][0][2] = 13 a[1][0][3] = 34
a[1][1][0] = 23 a[1][1][1] = 54 a[1][1][2] = 55 a[1][1][3] = 53
a[1][2][0] = 34 a[1][2][1] = 45 a[1][2][2] = 4 a[1][2][3] = 9
ตวอยางท 7.8 โปรแกรมแสดงการใชแถวลาดบ 3 มต
1 #include<stdio.h> 2 main(){ 3 int a[2][3][4] = { {{2 ,5 ,3 ,6} ,{9 ,43 ,5 ,67} ,{34
,12 ,10 ,44}},{{11 ,12 ,13 ,34},{23 ,54 ,55 ,53},{34 ,45 ,4,9}}};
4 a[0][2][2]=99; 5 printf("a[0][0][0] = %d a[0][0][1] = %d
a[0][0][2] = %d a[0][0][3] = %d\n",a[0][0][0],a[0][0][1],a[0][0][2],a[0][0][3]);
6 printf("a[0][1][0] = %d a[0][1][1] = %d a[0][1][2] = %d a[0][1][3] = %d\n",a[0][1][0],a[0][1][1],a[0][1][2],a[0][1][3]);
7 printf("a[0][2][0] = %d a[0][2][1] = %d a[0][2][2] = %d a[0][2][3] = %d\n",a[0][2][0],a[0][2][1],a[0][2][2],a[0][2][3]);
8 printf("a[1][0][0] = %d a[1][0][1] = %d a[1][0][2] = %d a[1][0][3] = %d\n",a[1][0][0],a[1][0][1],a[1][0][2],a[1][0][3]);
9 printf("a[1][1][0] = %d a[1][1][1] = %d a[1][1][2] = %d a[1][1][3] = %d\n",a[1][1][0],a[1][1][1],a[1][1][2],a[1][1][3]);
10 printf("a[1][2][0] = %d a[1][2][1] = %d a[1][2][2] = %d a[1][2][3] = %d\n",a[1][2][0],a[1][2][1],a[1][2][2],a[1][2][3]);
11 }
แถว 0
แถว 1
แถว 2 ชน 0
a[0][2][0]
a[0][1][0]
11
a[0][2][1]
a[0][1][1]
12
a[0][2][2]
a[0][1][2]
13
a[0][2][3]
a[0][1][3]
34
คอลมน 0 คอลมน 1 คอลมน 2 คอลมน 3
34
9
12
43
99
5
44
67
2 5 3 6
ชน 1
บทท 7 แถวลาดบ
250
ผลลพธของโปรแกรม a[0][0][0] = 2 a[0][0][1] = 5 a[0][0][2] = 3 a[0][0][3] = 6 a[0][1][0] = 9 a[0][1][1] = 43 a[0][1][2] = 5 a[0][1][3] = 67 a[0][2][0] = 34 a[0][2][1] = 12 a[0][2][2] = 99 a[0][2][3] = 44 a[1][0][0] = 11 a[1][0][1] = 12 a[1][0][2] = 13 a[1][0][3] = 34 a[1][1][0] = 23 a[1][1][1] = 54 a[1][1][2] = 55 a[1][1][3] = 53 a[1][2][0] = 34 a[1][2][1] = 45 a[1][2][2] = 4 a[1][2][3] = 9
อธบายโปรแกรม
บรรทดท 3 ประกาศตวแปรชนดแถวลาดบ 3 มต ทเปนชนดจานวนเตมพรอมทงกาหนดคาเรมตน
บรรทดท 4 กาหนดคาใหกบตวแปร บรรทดท 5-10 แสดงผลลพธ
7.5 ขนาดแถวลาดบอตโนมต (Automatic Size of Array)
7.5.1 การกาหนดขนาดแถวลาดบโดยอตโนมต ในการกาหนดขนาดของแถวลาดบจะเปนการกาหนดโดยไมสามารถเปลยนแปลงคาได ดงนนหากมการอางคาตวแปรทอยนอกเหนอจากขนาดทกาหนดกจะกระทาใหเกดความผดพลาด ปญหาทพบบอยสาหรบการกาหนดคาเรมตนใหกบแถวลาดบคอการกาหนดคาเรมตนเกนขนาดของแถวลาดบเชน
int a[3] = {1,2,3,4};
แถวลาดบมสามเกบขอมลได 3 ตวแปร แตกาหนดคาเรมตน 4 ตว ซงจะทาใหเกดความผดพลาดขณะประมวลผลเนองจากกาหนดคาเกนขนาดของแถวลาดบ ดงนนในบางครงเพอหลกเลยงปญหาน ภาษาซจงมกลไกสาหรบหาขนาดของแถวลาดบใหโดยอตโนมต ซงถาใชกลไกนแลว การประกาศคาเรมตนกจะเปน
int a[] = {1,2,3,4};
จะเหนไดวาวธดงกลาวมขอดคอ ลดปญหาเรองการกาหนดคาเรมตนเกนขนาดของแถวลาดบ และสามารถขยายคาเรมตนใหมจานวนมากขนไดงาย ขอเสยคอ ผ เขยนโปรแกรมจะตองเขยนโปรแกรมเพอหาขนาดของแถวลาดบเอง
บทท 7 แถวลาดบ
251
สาหรบกรณแถวลาดบขนาดสองมตขนไปนน ในมตทสองเปนตนไปไมสามารถกาหนดขนาดของแถวลาดบอตโนมตได เชน
int a[ ][ ] = { {1,2,3} , {4,5,6} };
int a[2][ ] = { {1,2,3} , {4,5,6} };
ถาใหมตทหนงมการกาหนดขนาดอตโนมตจะสามารถกระทาไดเชน
int a[ ][2] = { {1,2} , {4,5} , {6,7} };
ซงถกตความเปน
int a[3][2] = { {1,2} , {4,5} , {6,7} };
ตวอยางการกาหนดขนาดของแถวลาดบโดยอตโนมต เชน
การกาหนดคา char a[] = {'A','E','I','O','U'};
ความหมาย char a[5] = {'A','E','I','O','U'};
การกาหนดคา int a[] = {0};
ความหมาย int a[1] = {0};
การกาหนดคา int a[] = { };
ความหมาย เกดความผดพลาด เนองจากเปนการกาหนดใหแถวลาดบ a มขนาด 0
การกาหนดคา int a[][3] = { {1,2,3}, {4,5,6} };
ความหมาย int a[2][3] = { {1,2,3}, {4,5,6} };
การกาหนดคา int a[][2] = { {1,2} ,{3,4} ,{5,6} };
ความหมาย int a[][2] = { {1,2} ,{3,4} ,{5,6} };
การกาหนดคา int a[][3] = {1,2,3,4,5,6};
ความหมาย int a[2][3] = { {1,2,3} ,{4,5,6} };
การกาหนดคา int a[][2] = {1,2,3,4,5,6};
ความหมาย int a[3][2] = { {1,2} ,{3,4} ,{5,6} };
บทท 7 แถวลาดบ
252
การกาหนดคา int a[][4] = {1,2,3,4,5,6};
ความหมาย เกดความผดพลาด เนองจากจานวนสมาชกในแถวลาดบหาร 4ไมลงตวทาใหหาขนาดในมตท 1 ไมได
การกาหนดคา int a[][3][2] = {{1,2},{3,4},{5,6},{7,8},{9,0},{1,2}}
ความหมาย int a[2][3][2] = { {{1,2},{3,4},{5,6}}, {{7,8},{9,0},{1,2}} }
การกาหนดคา int a[][3][2] = {1,2,3,4,5,6,7,8,9,0,1,2};
ความหมาย int a[2][3][2] = { {{1,2},{3,4},{5,6}}, {{7,8},{9,0},{1,2}} }
การกาหนดคา int a[][2][3] = { 1,2,3,4,5,6,7,8,9,0,1,2 };
ความหมาย int a[][2][3] = { {1,2,3},{4,5,6},{7,8,9},{0,1,2} };
7.5.2 การหาขนาดของแถวลาดบโดยฟงกชน sizeof()
การหาขนาดของแถวลาดบโดยฟงกชน sizeof() เปนการหาขนาดของแถวลาดบ โดยฟงกชน sizeof( ) โดยหนาทของ sizeof( ) คอ
หาขนาดหนวยความจาชนดตวแปรตางๆ หาขนาดหนวยความจาทตวแปรนนๆ ใช
ตวอยางท 7.9 โปรแกรมการใชฟงกชน sizeof รวมกบชนดตวแปรทมอยในภาษาซ 1 #include <stdio.h> 2 main() 3 { 4 printf("short = %i\n",sizeof(short)); 5 printf("int = %i\n",sizeof(int)); 6 printf("unsigned int = %i\n",sizeof(unsigned int)); 7 printf("long int = %i\n",sizeof(long int)); 8 printf("float = %i\n",sizeof(float)); 9 printf("double = %i\n",sizeof(double)); 10 printf("long double = %i\n",sizeof(long double)); 11 }
ผลลพธของโปรแกรม short = 2 int = 2 unsigned int = 2 long int = 4 float = 4
บทท 7 แถวลาดบ
253
double = 8 long double = 10
อธบายโปรแกรม
บรรทดท 4-10 หาคาขนาดของหนวยความจาตามประเภทชนดของตวแปลตาง และแสดงผล โดยผลลพธทไดคอขนาดหนวยความจาของชนดตวแปรแบบตาง ๆ (มหนวยเปนไบต) และแสดงผล
ตวอยางท 7.10 โปรแกรมการใชฟงกชน sizeof รวมกบชนดตวแปรทมอยในภาษาซ 1 #include <stdio.h> 2 main() 3 { 4 int a[3]; 5 printf("int = %i\n",sizeof(int)); 6 printf("a = %i\n",sizeof(a)); 7 printf("a[0] = %i\n",sizeof(a[0])); 8 printf("a[1] = %i\n",sizeof(a[1])); 9 printf("a[2] = %i\n",sizeof(a[2])); 10 }
ผลลพธของโปรแกรม int = 2 a = 6 a[0] = 2 a[1] = 2 a[2] = 2
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ ทเปนชนดจานวนเตม
บรรทดท 5 หาคาขนาดของหนวยความจาตามประเภทชนดของตวแปลตาง และแสดงผล
บรรทดท 6 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ทงหมด และแสดงผล
บรรทดท 7-8 หาคาขนาดของหนวยความจาในแตละตวแปร ของตวแปร a ทละตว และแสดงผล
บทท 7 แถวลาดบ
254
ตวอยางท 7.11 โปรแกรมการหาจานวนสมาชกของแถวลาดบ 1 มต
1 #include <stdio.h> 2 main() 3 { 4 int a[3]; 5 printf("int = %i\n",sizeof(int)); 6 printf("a = %i\n",sizeof(a)); 7 printf("Array have %i element",sizeof(a)/sizeof(int)); 8 }
ผลลพธของโปรแกรม int = 2 a = 6 Array have 3 element
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ ทเปนชนดจานวนเตม
บรรทดท 5 หาคาขนาดของหนวยความจาตามประเภทชนดของตวแปลตาง และแสดงผล
บรรทดท 6 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ทงหมด และแสดงผล
บรรทดท 7 ทาการคานวณหาจานวนสมาชกของตวแปร โดยนาคาขนาดของหนวยความจาตวแปร a ทงหมด หารดวยขนาดของหนวยความจาของตวแปร a แตละตว และแสดงผล
จากโปรแกรมทาใหทราบวาตวแปร a มจานวนสมาชกทงหมด 3 ตว แตถาตองการเขยนโปรแกรมเพอหาจานวนสมาชกทงหมดกอาศยความรทวาสมาชกทกตวในแถวลาดบจะตองมชนดตวแปรเหมอนกน (ทาใหใชหนวยความจาเทากนดวย) ดงนนถานาเอาขนาดหนวยความจาทตวแปรแถวลาดบใชหารดวยขนาดของชนดตวแปรแถวลาดบกจะไดจานวนสมาชกของแถวลาดบทงหมด
ตวอยางท 7.12 โปรแกรมการหาจานวนสมาชกของแถวลาดบ 2 มต
1 #include <stdio.h> 2 main() 3 { 4 int a[2][3]; 5 printf("int = %i\n",sizeof(int)); 6 printf("a = %i\n",sizeof(a)); 7 printf("Array have %i element",sizeof(a)/sizeof(int)); 8 }
บทท 7 แถวลาดบ
255
ผลลพธของโปรแกรม int = 2 a = 12 Array have 6 element
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ ทเปนชนดจานวนเตม
บรรทดท 5 หาคาขนาดของหนวยความจาตามประเภทชนดของตวแปลตาง และแสดงผล
บรรทดท 6 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ทงหมด และแสดงผล
บรรทดท 7 ทาการคานวณหาจานวนสมาชกของตวแปร โดยนาคาขนาดของหนวยความจาตวแปร a ทงหมด หารดวยขนาดของหนวยความจาของตวแปร a แตละตว และแสดงผล
ตวอยางท 7.12 โปรแกรมการหาขนาดของแถวลาดบทมการกาหนดขนาดอตโนมต
1 #include <stdio.h> 2 main() 3 { 4 int a[] = {1,2,3,4,5,6,7,8}; 5 printf("int = %i\n",sizeof(int)); 6 printf("a = %i\n",sizeof(a)); 7 printf("Array have %i element",sizeof(a)/sizeof(int)); 8 }
ผลลพธของโปรแกรม int = 2 a = 16 Array have 8 element
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ ทเปนชนดจานวนเตมโดยกาหนดขนาดอตโนมต
บรรทดท 5 หาคาขนาดของหนวยความจาตามประเภทชนดของตวแปลตาง และแสดงผล
บรรทดท 6 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ทงหมด และแสดงผล
บทท 7 แถวลาดบ
256
บรรทดท 7 ทาการคานวณหาจานวนสมาชกของตวแปร โดยนาคาขนาดของหนวยความจาตวแปร a ทงหมด หารดวยขนาดของหนวยความจาของตวแปร a แตละตว และแสดงผล
ตวอยางท 7.13 โปรแกรมการหาขนาดของมตทหนงของแถวลาดบ 2 มต
1 #include <stdio.h> 2 void main(void) 3 { 4 int a[2][5] = {1,2,3,4,5,6,7,8,9,0}; 5 printf("int = %i\n",sizeof(int)); 6 printf("a = %i\n",sizeof(a)); 7 printf("a[0] = %i\n",sizeof(a[0])); 8 printf("a[1] = %i\n",sizeof(a[1])); 9 }
ผลลพธของโปรแกรม int = 2 a = 20 a[0] = 10 a[1] = 10
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ ทเปนชนดจานวนเตม
บรรทดท 5 หาคาขนาดของหนวยความจาตามประเภทชนดของตวแปลตาง และแสดงผล
บรรทดท 6 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ทงหมด และแสดงผล
บรรทดท 7 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ในแถวแรก และแสดงผล
บรรทดท 8 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ในแถวทสอง และแสดงผล
โปรแกรมขางตนมการใชแถวลาดบสองมตคอตวแปร a โดยปกตแลวการอางถงตวแปรแถวลาดบทเปนสองมตแลวจะตองระบคาตวแปรทงมตท 1 และมตท 2 เชน a[0][2],
a[1][4] เปนตน แตถาเราอางเฉพาะมตแรกเทานนเชน a[0], a[1] กจะหมายรวมถงสมาชกทก
บทท 7 แถวลาดบ
257
ตวทอยในมตถดไป (มตท 2,3,4,...) แสดงเปนรปขางลาง ดงนนถาใช sizeof(a[i]) กจะไดขนาดของสมาชกแถวลาดบ 5 ตว ซงมขนาดเปน 10 นนเอง
1 2 3 4 5
6 7 8 9 0
a[0]
a[1]
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
ตวอยางท 7.14 โปรแกรมการหาขนาดของมตทหนงของแถวลาดบ 2 มต
1 #include <stdio.h> 2 void main(void) 3 { 4 int a[][3][2] = {1,2,3,4,5,6,7,8,9,0,1,2}; 5 printf("int = %i\n",sizeof(int)); 6 printf("a = %i\n",sizeof(a)); 7 printf("a[0] = %i\n",sizeof(a[0])); 8 printf("First Dimention =
%i\n",sizeof(a)/sizeof(a[0])); 9 }
ผลลพธของโปรแกรม int = 2 a = 24 a[0] = 12 First Dimention = 2
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรชนดแถวลาดบ 3 มต ทเปนชนดจานวนเตม
บรรทดท 5 หาคาขนาดของหนวยความจาตามประเภทชนดของตวแปลตาง และแสดงผล และแสดงผล
บรรทดท 6 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ทงหมด และแสดงผล
บรรทดท 7 หาคาขนาดของหนวยความจาของตวแปรชนดแถวลาดบ ของตวแปร a ในแถวแรก และแสดงผล
บรรทดท 8 ทาการคานวณหาจานวนสมาชกของตวแปร โดยนาคาขนาดของหนวยความจาตวแปร a ทงหมด หารดวยขนาดของหนวยความจาของตวแปร a ของแถวแรก และแสดงผล
บทท 7 แถวลาดบ
258
7.6 แถวลาดบของสายอกขระ (Array of String)
แถวลาดบของสายอกขระหรอสตรงเปนแถวลาดบทนาชนดขอมลของสายอกขระหรอตวอกษรมาสรางเปนแถวลาดบ ในการสรางแถวลาดบของสายอกขระมขอควรทราบคอ
ตองทราบจานวนอกษรสงสดทตวแปรนนรบได เพราะในภาษาซไมมการตรวจสอบการใชแถวลาดบของสายอกขระเกนขอบเขต ดงนนจงเปนหนาทของผ เขยนโปรแกรมจะตองระวงในเรองน
ฟงกชนทรบขอมลจากผ ใชควรมการตรวจสอบความยาวของขอความดวยวาเกนขนาดสงสดทรบไดหรอไมดวย กอนทจะนาคาทรบจากผ ใชเกบไวในตวแปรเพอเปนการปองกนความผดพลาดทจะเกดขน
ในการสรางแถวลาดบของสายอกขระสามารถกระทาไดโดยการประกาศตวแปรดงน
char name[10]; //เปนการสรางแถวลาดบทเปนชนดของสายอกขระจานวน
10 ตวอกษร char address[50]; //เปนการสรางแถวลาดบทเปนชนดของสายอกขระจานวน 50 ตวอกษร
การประกาศตวแปรในลกษณะนเปรยบเสมอนการจองเนอทในหนวยความจาดงรปท
7.5 โดยเปนการจองหนวยความจาของตวแปรทชอ name ทมขนาดสงสดในการเกบตวอกษรไดสงสด 6 ตว ซงในการเขยนโปรแกรมตวสดทายจะกาหนดใหเปน \0 ซงเปนจดสนสดของสายอกขระ
Index 0 1 2 3 4 5 6
value ‘D’ ‘R’ ‘K’ ‘R’ ‘I’ ‘T’ \0
รปท 7.5 การจองหนวยความจาของตวแปร char name[6];
ในการกาหนดคาใหกบสายอกขระสามารถกระทาไดหลายลกษณะดงเชนการกาหนดคาใหกบแถวลาดบทตวหรอกาหนดคาเรมตนพรอมกบการประกาศตวแปร
name
บทท 7 แถวลาดบ
259
การกาหนดคาใหกบแถวลาดบทตวดงเชน
char name[5];
name[0] = ‘D’;
name[1] = ‘r’;
name[2] = ‘.’;
name[3] = ‘K’;
name[4] = ‘\0’;
การกาหนดคาเรมตนพรอมกบการประกาศตวแปรดงเชน
char name[] = {‘D’,’r’,’.’,’K’,’\0’};
char name[4] = {‘D’,’r’,’.’,’K’,’\0’};
จากการประกาศตวแปรแถวลาดบของสายอกขระสงเกตดวาจะมตวอกษร ‘\0’ ซงเปนตวอกษรทบงบอกการปดทายในสวนของสายอกขระหรอบงบอกจดสนสดของสายอกขระ
ตวอยางท 7.15 โปรแกรมในการประกาศตวแปรแถวลาดบของสายอกขระโดยกาหนดคาพรอมกบการประกาศตวแปร
1 #include <stdio.h> 2 void main(void) 3 { 4 char name[8] = {'D','R','.','K','r','i','t','\0'}; 5 printf("%s \n",name); 6 char surname[]={'S','o','m','k','a','n','t', 'a',
'r','\0'}; 7 printf("%s \n",surname); 8 char nickname[] = "My nickname is Q"; 9 printf("%s \n",nickname); 10 char othername[21] = "My other name is Aob"; 11 printf("%s \n",othername); 12 }
ผลลพธของโปรแกรม
DR.Krit Somkantar My nickname is Q My other name is Aob
บทท 7 แถวลาดบ
260
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรสายอกขระทมจานวนตวอกษรได 8 ตว พรอมทงกาหนดคาเรมตนใหกบตวแปร
บรรทดท 6 ประกาศตวแปรสายอกขระทไมกาหนดขนาดเรมตน แตเปนการกาหนดขนาดอตโนมตโดยขนาดขนอยกบตวแปรเรมตนทไดประกาศไว
บรรทดท 8 ประกาศตวแปรสายอกขระทไมกาหนดขนาดเรมตน แตเปนการกาหนดขนาดอตโนมตโดยขนาดขนอยกบตวแปรเรมตนทเปนขอความจะอยภายในเครองหมายอญประกาศ (“ ”)
บรรทดท 10 ประกาศตวแปรสายอกขระทกาหนดขนาดเรมตน พรอมทงประกาศคาตวแปร ตวแปรเรมตนทเปนขอความจะอยภายในเครองหมายอญประกาศ (“ ”) ซงการประกาศลกษณะนจะไมนยมกาหนดคาเรมตน เพราะถากาหนดขนาดผดพลาดนอยกวาจานวนตวอกษรกจะเกดความผดพลาด โดยทวไปถาตองการกาหนดตวแปรในลกษณะนจะนยมกระทาการประกาศตวแปรดงบรรทดท 8
ตวอยางท 7.16 โปรแกรมในการประกาศตวแปรแถวลาดบของสายอกขระโดยกาหนดคาหลงจากการประกาศตวแปร
1 #include <stdio.h> 2 void main(void) 3 { 4 char name[20]; 5 name[0] = 'D'; 6 name[1] = 'r'; 7 name[2] = '.'; 8 name[3] = 'K'; 9 name[4] = 'r'; 10 name[5] = 'i'; 11 name[6] = 't'; 12 name[7] = '\0'; 13 printf("%s \n",name); 14 }
ผลลพธของโปรแกรม
DR.Krit
บทท 7 แถวลาดบ
261
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรสายอกขระทมจานวนตวอกษรได 20 ตว พรอมทงกาหนดคาเรมตนใหกบตวแปร
บรรทดท 5-12 กาหนดคาตวแปรในแตแถวลาดบของสายอกขระ
บทท 7 แถวลาดบ
262
บทสรป
ในบทนไดกลาวถงโครงสรางแถวลาดบ แถวลาดบ 1 มต แถวลาดบแบบ 2 มต แถวลาดบ 3 มต ขนาดแถวลาดบอตโนมต และแถวลาดบของสายอกขระ แถวลาดบหรออาเรย คอโครงสรางขอมลทใชตวแปรเดยวเกบกลมของขอมลชนดเดยวกนไว แถวลาดบเปนชนดขอมลประเภทหนง และจะกาหนดจานวนขอมล หรอสมาชกของแถวลาดบไวแนนอน โดยจะใชดรรชน ในการอางถงตาแหนงของขอมลในแถวลาดบ และตองระบดรรชนในเครองหมายวงเลบเหลยม แถวลาดบ 1 มต จะมการจดเกบขอมลในลกษณะตอเนองกนเปนแถว ซงจะตองมการกาหนดขนาดใหเพยงพอกบจานวนขอมลทตองการจดเกบ แตกไมใหมขนาดใหญมากเกนกวาจานวนขอมล เพราะจะเปนการสนเปลองพนทหนวยความจาโดยเปลาประโยชน ซงเปนโครงสรางของแถวลาดบทงายทสด แถวลาดบแบบ 2 มต จะมการจดเกบขอมลในลกษณะของเมทรกซ โดยจะมรปแบบเปนตารางทประกอบไปดวยแถวและคอลมน ซงการอางองขอมล จะตองอางองดวยตวเลข 2 ชด คอ แถวและคอลมน แถวลาดบแบบ 3 มต จะมลกษณะเหมอนกบการนาแถวลาดบแบบ 2 มต มาเรยงซอนกนหลายๆ ชน ทาใหแถวลาดบแบบ 3 มต
มชน แถว และคอลมน ดงนนการอางองถงขอมล จะตองอางองดวยตวเลข 3 ชด คอ ชน แถว และคอลมน การกาหนดขนาดแถวลาดบโดยอตโนมตกลไกสาหรบหาขนาดของแถวลาดบใหโดยอตโนมตเนองจากถามการกาหนดขนาดของแถวลาดบจะไมสามารถเปลยนแปลงคาได
ดงนนหากมการอางคาตวแปรทอยนอกเหนอจากขนาดทกาหนดกจะกระทาใหเกดความผดพลาด ดงนนในบางครงเพอหลกเลยงปญหาน ภาษาซจงมวธการกาหนดขนาดแถวลาดบโดยอตโนมต เพอใหสามารถใชงานไดอยางมประสทธภาพมากขน การหาขนาดของแถวลาดบเปนการหาขนาดของแถวลาดบโดยใชฟง กชนในภาษาซเ พอใหสามารถหาขนาดหนวยความจาชนดตวแปรตางๆ และหาขนาดหนวยความจาทตวแปรนนใชได แถวลาดบของสายอกขระหรอสตรงเปนแถวลาดบทนาชนดขอมลของสายอกขระหรอตวอกษรมาสรางเปนแถวลาดบ
บทท 7 แถวลาดบ
263
แบบฝกหดทบทวน
1. จงเขยนโปรแกรมเพอแสดงวาเลข 5 อยทตาแหนงใดในแถวลาดบ 1 มต ตอไปน {1 ,2 ,3
,4 ,5 ,6 ,7 ,8 ,9 ,10}
2. จงเขยนโปรแกรมเพอแสดงวาเลข 5 อยทตาแหนงใดในแถวลาดบ 2 มต ตอไปน { {1 ,2 ,3
,4} ,{5 ,6 ,7 ,8} ,{9 ,10 ,11 ,12}}
3. จงเขยนโปรแกรมเพอแสดงวาเลข 15 อยทตาแหนงใดในแถวลาดบ 3 มต ตอไปน { { {1 ,2
,3 ,4} ,{5 ,6 ,7 ,8} ,{9 ,10 ,11 ,12} } , { {13 ,14 ,15 ,16} ,{17 ,18 ,19 ,20} ,{21 ,22 ,23
,24} } }
4. จงเขยนโปรแกรมแสดงการคานวณหาจานวนนกศกษาทไดคะแนนตงแต 60 ถง 80
คะแนน โดยใหรบคาคะแนนผานทางคยบอรดจานวน 10 คน จากนนใหแสดงคะแนนของนกศกษาแตละคน และแสดงจานวนนกศกษาทไดคะแนนตงแต 60 ถง 80 คะแนน
5. จงเขยนโปรแกรมแสดงการคานวณหาคะแนนสงสดของวชาคอมพวเตอร คณตศาสตร และฟสกส โดยมนกศกษาวชาละ 5 คน โดยใหรบคาคะแนนผานทางคยบอรด จากนนใหแสดงคะแนนของนกศกษาแตละคน และแสดงคะแนนสงสดของแตละวชาผานทางจอภาพ
6. จงเขยนโปรแกรมบวกเลขของเมทรกซขนาด 3 แถว 3 คอลมน โดยใหมการรบคาเขามาเพอทาการประมวลผล
7. จงเขยนโปรแกรมคานวณหาเฉลยของเลข 10 จานวน โดยใชโครงสรางของแถวลาดบและใหทาการรบคาเขามาเพอทาการประมวลผล
8. จงเขยนโปรแกรมเพอหาคาตาสดและสงสด ของเมทรกซขนาด 5 แถว 5 คอลมน
9. จงเขยนโปรแกรมหาคาผลรวมของคาแนวทแยง ของเมทรกซขนาด 5 แถว 5 คอลมน
10. จงเขยนโปรแกรมคณเลขของเมทรกซขนาด ขนาด 3 แถว 3 คอลมน
บทท 8 ฟงกชน
บทท 8
ฟงกชน
ในบทนจะกลาวถงแนวคดของฟงกชน (Concept of Functions) ฟงกชนมาตรฐาน
(Standard Library Function) ฟงกชนทสรางขนมา (User-Defined Functions) และการประกาศตวแปรของเรองฟงกชน (Variable Declaration of Functions) ซงในการเขยนโปรแกรมคอมพวเตอรมกจะมคาสงจานวนมากทาใหเกดเปนโปรแกรมขนาดใหญ ทาใหยากตอการเขยนโปรแกรม ยากตอการเขาใจ มความซบซอน และมความยงยากในการแกไขเปลยนแปลงโปรแกรม สงผลทาใหการพฒนาโปรแกรมเปนไปอยางไมมประสทธภาพ ดงนนจงมการเขยนโปรแกรมใหเปนสวนเลกๆ จานวนหลายสวนเพอทาใหเกดความสะดวกตอการออกแบบ สะดวกในการสราง แกไขปรบปรงไดโดยงาย และพฒนาตอไดโดยสะดวก ซงฟงกชนเปนการกระจายโปรแกรมออกเปนสวนเลกสงผลทาใหสามารถชวยแกปญหาการเขยนโปรแกรมทมความซบซอน ในปจจบนการเขยนโปรแกรมโดยการเขยนแบบฟงกชนเปนวธการทนยมและมประสทธภาพใชกนอยางแพรหลาย ทาใหสามารถพฒนาโปรแกรมขนาดใหญไดอยางมประสทธภาพ
8.1 แนวคดของฟงกชน (Concept of Functions)
ฟงกชนเปรยบเสมอนกลมของคาสงโปรแกรมกลมหนงททาหนาทบางอยางตามทหนาทของฟงกชนนนตองการ ซงในมมมองของผ เรยกใชฟงกชนนนฟงกชนเปรยบเสมอนกลองดา ผ เรยกใชไมจาเปนตองทราบวาฟงกชนทจะเรยกใชนนมขนตอนการทางานอยางไร สงทผเรยกใชสนใจกคอผลลพธของการเรยกใชฟงกชนเทานน และเพอใหผลการทางานถกตองตามทผ เรยกใชตองการ ผ เรยกใชจะตองทราบขอตกลงของการเรยกใชงานฟงกชนวาจะตองสงอะไรไปใหฟงกชนบาง และผลลพธของโปรแกรมควรเปนเชนไร ในมมมองของผสรางฟงกชน
ผสรางจะตองแจงใหผใชทราบถงรปแบบการใชงานตางๆ ของฟงกชน และในการสรางฟงกชน
บทท 8 ฟงกชน
266
นนกจะตองทาการเขยนโปรแกรมใหตรงตามขอกาหนดของฟงกชนนน ซงถาไมกระทาตามขอกาหนดจะสงผลใหเกดความผดพลาดได รปแบบของฟงกชนเปรยบเสมอนเปนสวนของโปรแกรมยอยอนๆ ททาหนาทเฉพาะอยาง จะเรยกใชงานเมอสวนของโปรแกรมหลกตองการประมวลผลในสวนยอยนน ซงเมอเสรจสนกระบวนการของฟงกชนกจะกลบมายงสวนโปรแกรมหลก ซงรปแบบตวอยางดงแสดงในรปท 8.1
รปท 8.1 รปแบบตวอยางการทางานของฟงกชน
ในการออกแบบฟงกชนควรจะตองวางแผนขอมลเขาและขอมลออกของฟงกชนเนองจากการสรางฟงกชนมจดมงหมายเพอใหสามารถใชงานไดโดยสะดวก โดยอาจจะไมตองเขาใจการทางานภายในของฟงกชน แตตองการแคปอนคาเขาไปในฟงกชนและสนใจเฉพาะคาทเปนผลลพธทไดจากฟงกชน ในการออกแบบฟงกชนจะประกอบไปดวย ขอมลเขา กระบวนการ และขอมลออก ในมมมองของผใชจะสนใจเฉพาะขอมลเขาและขอมลออก
ขอมลเขา หมายถงขอมลทจาเปนตองปอนขอมลเขาสฟงกชนเพอทาการประมวลผล กระบวนการ หมายถงกระบวนการตางๆ ของฟงกชนเพอใหไดงานตามทตองการ เชน
กระบวนการคานวณคาสมการในการหาพนทตางๆ ขอมลออก หมายถงขอมลทไดจากการประมวลผลของฟงกชน โดยจะมการสงคา
ผลลพธทไดจากการประมวลผล
บทท 8 ฟงกชน
267
ตวอยางท 8.1 แนวคดการออกแบบฟงกชนในการคานวณหาพนทสเหลยมผนผา
ในการสรางฟงกชนน สามารถแบงออกเปนงานยอย ๆ ดงน
� ขอมลเขา จะเปนการรบขอมล 2 จานวนจากผใช แลวทาการสงคาไปยงฟงกชน
� กระบวนการ จะเปนการคานวณหาพนทสเหลยมผนผา (กวาง x ยาว) โดยคาทนามาทาการประมวลผลเปนคาทไดจากในสวนของขอมลเขา หลงจากการประมวลผลแลวเกบผลลพธ � ขอมลออก แสดงผลลพธของการประมวลผลโดยการสงคาคน
โครงสรางรปแบบฟงกชนคอ <return type> function_name(<parameter>)
โดยท
function_name คอชอของฟงกชน โดยชอของฟงกชนจะใชหลกการตงชอเชนเดยวกบกบการตงชอตวแปร
parameter คอคาทตองใชประกอบการทางาน ถาไมมใหเขยนคาวา void หรอไมเขยนเลย
return type คอชนดขอมลทฟงกชนจะคนใหกบผ ทเรยกใชฟงกชน (ถาม) ถาไมมใหเขยนวา void แตถาไมระบจะถอวามคาทคนเปนชนดจานวนเตม (Integer)
บทท 8 ฟงกชน
268
ตวอยางโปรแกรมตอประสานฟงกชน (Function Interface) พรอมความหมาย Function Interface Function Name Parameter Return Type
void main(void) main void void main() main void int void randomize(void) randomize void void void closegraph(void) closegraph void void int getch(void) getch void int int getdisk(void) getdisk void int int flushall(void) flushall void int int wherex(void) wherex void int void sound(unsigned frequency) sound unsigned void double sin(double x) sin double double int isdigit(int c) isdigit int int
ตวอยางการเรยกใชงานฟงกชน
randomize() //เปนการเรยกใชฟงกชนสม
gotoxy(12,35) //เปนการเรยกใชฟงกชนทไปยงตาแหนงทตองการ โดยเปนการใสตาแหนงทตองการโดยตรง
gotoxy(a,b) //เปนการเรยกใชฟงกชนทไปยงตาแหนงทตองการ โดยท a กบ b เปนตวแปรชนดจานวนเตม (int)
gotoxy(12,b) //เปนการเรยกใชฟงกชนทไปยงตาแหนงทตองการ โดยทตวแปร b เปนตวแปรชนดจานวนเตม (int)
a = sin(2.3) //เปนการเรยกใชฟงกชนการคานวณคา sin
a = sin(sin(2.5)) //เปนการเรยกใชฟงกชนการคานวณคา sin โดยเปนการเรยกฟงกชนซอนฟงกชน
จากตวอยางการเรยกใชงานขางบนน ไดขอสรปวา การใชงานฟงกชนนนกตองสงคาใหสอดคลองกบตวแปรเสรมฟงกชน (Function
Parameter) ทกาหนด
ถาไมมตวแปรเสรมฟงกชน ใหละเวนการเขยน ดงตวอยางของฟงกชน ramdomize
ถาฟงกชนมการคนคาจะมตวแปรมารบคานน ดงตวอยางฟงกชน sin
บทท 8 ฟงกชน
269
8.2 ฟงกชนมาตรฐาน (Standard Library Functions)
ฟงกชนมาตรฐาน คอฟงกชนทภาษาซไดจดเตรยมไวเพอใหสามารถเรยกใชงานฟงกชนพนฐานทจาเปนไดโดยงาย โดยจะเกบอยในแฟมสวนหว (Header File) ฟงกชนมาตรฐานจะอยในรปแบบของรหสจดหมาย (Object Code) ซงภาษาซแฟมสวนหวคอแฟมทมนามสกล *.h ตางๆ เมอตองการใชฟงกชนใด จะตองรวาฟงกชนนนอยในไฟลสวนหวใด เพอระบคาสง #include<header file.h> ไวทสวนหวของโปรแกรม จากนนจงสามารถเรยกใชฟงกชนโดยตองเขยนชอฟงกชนตามดวยวงเลบซงภายในเปนขอมลทฟงกชนตองการใช ในการใชงานฟงกชนใดทเปนฟงกชนมาตรฐานจาเปนจะตองรลกษณะการทางานของฟงกชน วาจะตองทาการปอนคาอะไรเขาไป ประมวลผลอะไร และคนคาผลลพธอะไร จงจะสามารถใชงานไดอยางถกตอง ซงโดยทวไปหากจารปแบบไมไดกจะมคาอธบายของรปแบบฟงกชนมาตรฐานในสวนชวยเหลอ (Help) ทจะอธบายการทางานของฟงกชนและพรอมแสดงตวอยาง อยางงาย
ตวอยางของฟงกชนมาตรฐาน โดยแยกตามแฟมสวนหวพรอมตวอยางการใชงานดงตารางท 8.1, 8.2, 8.3 และ 8.4 ซงฟงกชนในตารางทงหมดทไดกลาวถงเปนเพยงสวนหนงของฟงกชนมาตรฐาน ในการเขยนโปรแกรมใชงานควรจะตองศกษาฟงกชนมาตรฐานเพมเตม ซงโดยทวไปจะมสวนชวยเหลอ (Help) ในการอธบายฟงกชนตางๆ อย
8.2.1 ฟงกชนในแฟมสวนหว math.h
ตารางท 8.1 แฟมสวนหว math.h
โปรแกรมตอประสานฟงกชน
[math.h]
ความหมาย
double cos(double x) หาคา Cosine
double sin(double x) หาคา Sine
double tan(double x) หาคา Tangent
double acos(double x) หาคา Arccosine
double asin(double x) หาคา Arcsine
double atan(double x) หาคา Arctangent
double cosh(double x) หาคา Hyperbolic cosine
double sinh(double x) หาคา Hyperbolic sine
บทท 8 ฟงกชน
270
double tanh(double x) หาคา Hyperbolic tangent
double exp(double x) หาคา ex เมอ e เปนคาคงทประมาณ 2.71
double log(double x) หาคา log ฐาน e หรอ ln(x)
double log10(double x) หาคา log ฐาน 10 ของคา x
double pow(double x, double y) หาคา xy
double sqrt(double x) หาคารากทสองของ x
int abs(int x) หาคาสมบรณของจานวนเตม x
long int labs(long int x) หาคาสมบรณของจานวนเตมแบบยาว x
double fabs(double x) หาคาสมบรณของทศนยม x
double ceil(double x) การปดเศษขนของทศนยม x
celi(2.538) =
3.000
celi(2.857) =
3.000
celi(2.000) =
2.000
celi(-2.75) = -
2.000
double floor(double x) การปดเศษลงของทศนยม x
floor(2.538) =
2.000
floor(2.857) =
2.000
floor(2.000) =
2.000
floor(-2.75) = -
3.000
ฟงกชนในแฟมสวนหว math.h เปนฟงกชนทใชสาหรบการคานวณทางคณตศาสตร ตวแปรรบคาทฟงกชนสงกลบจะตองมชนดขอมลเปนเลขทศนยมแบบดบเบล(double)
เนองจากฟงกชนจะสงคากลบออกไปจากฟงกชนเปนชนดขอมลแบบเลขทศนยมแบบดบเบล นอกจากนชนดขอมลทรบเขามาในฟงกชนเปนชนดขอมลแบบเลขทศนยมแบบดบเบล เชนกน
บทท 8 ฟงกชน
271
สาหรบฟงกชนทจะกลาวถงตอไปน เปนฟงกชนทมการใชงานบอยๆ ไดแก ฟงกชน double sqrt(double x)
เปนฟงกชนทใชในการคานวณหารากท 2 ของตวแปร x
ฟงกชน double pow(double x,double y)
เปนฟงกชนทใชในการคานวณหาคาเลขยกกาลง ซงกคอ ตวแปร x ยกกาลงตวแปร y
ฟงกชน double ceil(double x)
เปนฟงกชนทใชในการปดเศษของตวแปร x ขน
ฟงกชน double floor(double x)
เปนฟงกชนทใชในการปดเศษของตวแปร x ลง ฟงกชน double fabs(double x)
เปนฟงกชนทใชในการหาคาสมบรณของตวแปร x
ฟงกชน double sin(double x)
เปนฟงกชนทใชในการหาคา sine ทางตรโกณมต ของตวแปร x ซงเกบคามมทตองการ ฟงกชน double cos(double x)
เปนฟงกชนทใชในการหาคา cosine ทางตรโกณมต ของตวแปร x ซงเกบคามมทตองการ ฟงกชน double tan(double x)
เปนฟงกชนทใชในการหาคา tangent ทางตรโกณมต ของตวแปร x ซงเกบคามมทตองการ
บทท 8 ฟงกชน
272
ตวอยางท 8.1 โปรแกรมแสดงการใชฟงกชนในไฟลสวนหว math.h
1 #include<stdio.h> 2 #include<math.h> 3 main(){ 4 double a=16,b=2,c=3.3,d=3.5,e=-4,f=60; 5 printf("Square root of %.2f = %.2f\n",a,sqrt(a)); 6 printf("%.2f power %.2f = %.2f\n",a,b,pow(a,b)); 7 printf("Ceil of %.2f = %.2f\n",c,ceil(c)); 8 printf("Floor of %.2f = %.2f\n",c,floor(c)); 9 printf("Ceil of %.2f = %.2f\n",d,ceil(d)); 10 printf("Floor of %.2f = %.2f\n",d,floor(d)); 11 printf("Absolute of %.2f = %.2f\n",e,fabs(e)); 12 printf("Sin of %.2f = %.2f\n",f,sin(f)); 13 printf("Cos of %.2f = %.2f\n",f,cos(f)); 14 printf("tan of %.2f = %.2f\n",f,tan(f)); 15 }
ผลลพธของโปรแกรม Square root of 16.00 = 4.00 16.00 power 2.00 = 256.00 Ceil of 3.30 = 4.00 Floor of 3.30 = 3.00 Ceil of 3.50 = 4.00 Floor of 3.50 = 3.00 Absolute of -4.00 = 4.00 Sin of 60.00 = -0.30 Cos of 60.00 = -0.95 Tan of 60.00 = 0.32
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรของขอมลเปนเลขทศนยมแบบดบเบล บรรทดท 5-14 เรยกใชงานฟงกชนพรอมทงสงคาเขาไปในฟงกชนเพอทาการ
ประมวลผลและแสดงผลลพธทไดจากการเรยกใชงานฟงกชน
บทท 8 ฟงกชน
273
ตวอยางท 8.2 โปรแกรมแสดงการใชฟงกชนในไฟลสวนหว math.h
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 double a,b,c,d,e,f,g,h; 6 a = sin(45.0); /* Find sine 45 radian */ 7 b = cos(45.0); /* Find cosine 45 radian */ 8 c = tan(45.0); /* Equal sin(45)/cos(45) */ 9 d = exp(1.0); /* Equal 2.71^1.0 */ 10 e = log(2.71); /* Equal ln(2.71) */ 11 f = log10(100.0); /* Equal log base 10 of 100 */ 12 g = pow(5.0,3.0); /* Equal 5^3 */ 13 h = sqrt(100.0); /* Equal root of 100 */ 14 15 printf("sin(45) = %lf\n",a); 16 printf("cos(45) = %lf\n",b); 17 printf("tan(45) = %lf\n",c); 18 printf("e^1.0 = %lf\n",d); 19 printf("ln(2.71) = %lf\n",e); 20 printf("log(100) = %lf\n",f); 21 printf("5^3 = %lf\n",g); 22 printf("root(100) = %lf\n",h); 23 }
ผลลพธของโปรแกรม sin(45) = 0.850904 cos(45) = 0.525322 tan(45) = 1.619775 e^1.0 = 2.718282 ln(2.71) = 0.996949 log(100) = 2.000000 5^3 = 125.000000 root(100) = 10.000000
อธบายโปรแกรม
บรรทดท 5 ประกาศตวแปรของขอมลเปนเลขทศนยมแบบดบเบล บรรทดท 6-13 ทาการเรยกใชงานฟงกชน
บรรทดท 15-22 แสดงผลลพธของฟงกชน
บทท 8 ฟงกชน
274
8.2.2 ฟงกชนในแฟมสวนหว ctype.h
ตารางท 8.2 แฟมสวนหว ctype.h
โปรแกรมตอประสานฟงกชน
[ctype.h]
ความหมาย
int isalnum(int c) ใหคาจรงถาอกขระ c เปนอกขระ A – Z, a – z, 0 – 9
int isalpha(int c) ใหคาจรงถาอกขระ c เปนอกขระ A – Z, a – z
int isdigit(int c) ใหคาจรงถาอกขระ c เปนอกขระตวเลข 0 – 9
int islower(int c) ใหคาจรงถาอกขระ c เปนอกขระตวเลกในภาษาองกฤษ
int isupper(int c) ใหคาจรงถาอกขระ c เปนอกขระตวใหญในภาษาองกฤษ
char tolower(char ch) ทาการแปลงอกขระ ch จากอกษรตวใหญปนอกษรตวเลก
char toupper(char ch) ทาการแปลงอกขระ ch จากอกษรตวเลกเปนอกษรตวใหญ
ฟงกชนในแฟมสวนหว ctype.h เปนฟงกชนทใชสาหรบตวอกษรเทานน สาหรบฟงกชนทจะกลาวถงตอไปน เปนฟงกชนทมการใชงานบอยๆ ไดแก
ฟงกชน int islower(char x);
เปนฟงกชนทใชในการตรวจสอบวาคาของตวแปร x เปนตวอกษรพมพเลกหรอไม ถาใชจะคนคาจานวนเตมทไมใช 0 กลบมา แตถาไมใชจะคนคา 0 กลบมา
ฟงกชน int isupper(char x);
เปนฟงกชนทใชในการตรวจสอบวาคาของตวแปร x เปนตวอกษรพมพใหญหรอไม ถาใชจะคนคาจานวนเตมทไมใช 0 กลบมา แตถาไมใชจะคนคา 0 กลบมา
ฟงกชน int isalnum(char x)
เปนฟงกชนทใชในการตรวจสอบวาคาของตวแปร x เปนตวอกษรหรอตวเลขหรอไม
ถาใชจะคนคาจานวนเตมทไมใช 0 กลบมา แตถาไมใชจะคนคา 0 กลบมา ฟงกชน int isalpha(char x);
เปนฟงกชนทใชในการตรวจสอบวาคาของตวแปร x เปนตวอกษรหรอไม ถาใชจะคนคาจานวนเตมทไมใช 0 กลบมา แตถาไมใชจะคนคา 0 กลบมา
บทท 8 ฟงกชน
275
ฟงกชน int isdigit(char x);
เปนฟงกชนทใชในการตรวจสอบวาคาของตวแปร x เปนตวเลขหรอไม ถาใชจะคนคาจานวนเตมทไมใช 0 กลบมา แตถาไมใชจะคนคา 0 กลบมา
ฟงกชน char tolower(char x);
เปนฟงกชนทใชในการแปลงคาของตวแปร x ใหเปนตวอกษรพมพเลก ฟงกชน char toupper(char x);
เปนฟงกชนทใชในการแปลงคาของตวแปร x ใหเปนตวอกษรพมพใหญ
ตวอยางท 8.3 โปรแกรมแสดงการใชฟงกชนในแฟมสวนหว ctype.h
1 #include<stdio.h> 2 #include<ctype.h> 3 main(){ 4 char a='A',b='a',c='5',d='*'; 5 printf("%c is lower : %d\n",a,islower(a)); 6 printf("%c is lower : %d\n",b,islower(b)); 7 printf("%c is upper : %d\n",a,isupper(a)); 8 printf("%c is upper : %d\n",b,isupper(b)); 9 printf("%c is alpha or digit : %d\n",a,isalnum(a));10 printf("%c is alpha or digit : %d\n",c,isalnum(c));11 printf("%c is alpha or digit : %d\n",d,isalnum(d));12 printf("%c is alpha : %d\n",a,isalpha(a)); 13 printf("%c is alpha : %d\n",c,isalpha(c)); 14 printf("%c is alpha : %d\n",d,isalpha(d)); 15 printf("%c is digit : %d\n",a,isdigit(a)); 16 printf("%c is digit : %d\n",c,isdigit(c)); 17 printf("%c is digit : %d\n",d,isdigit(d)); 18 printf("%c tolower : %c\n",a,tolower(a)); 19 printf("%c tolower : %c\n",b,tolower(b)); 20 printf("%c toupper : %c\n",a,toupper(a)); 21 printf("%c toupper : %c\n",b,toupper(b)); 22 }
ผลลพธของโปรแกรม A is lower : 0 a is lower : 2 A is upper : 1 a is upper : 0 A is alpha of digit : 1 5 is alpha of digit : 4 * is alpha of digit : 0 A is alpha : 1 5 is alpha : 0 * is alpha : 0 A is digit : 0 5 is digit : 4 * is digit : 0
บทท 8 ฟงกชน
276
A tolower : a a tolower : a A toupper : A a toupper : A
บรรทดท 4 ประกาศตวแปรของขอมลเปนขอมลแบบตวอกษร (Character)
บรรทดท 5-21 สงคาเขาไปในฟงกชนเพอทาการประมวลผลและแสดงผลลพธทไดจากการเรยกใชงานฟงกชน
ตวอยางท 8.4 โปรแกรมแสดงการใชฟงกชนในแฟมสวนหว ctype.h
1 #include <ctype.h> 2 #include <stdio.h> 3 main() 4 { 5 int a,b,c,d,e; 6 a=isalnum('5'); /* 5 is alphabet or number */ 7 b=isalpha('5'); /* 5 is alphabet */ 8 c=isdigit('5'); /* 5 is digital */ 9 d=isupper('A'); /* A is upper case */ 10 e=islower('A'); /* A is lower case */ 11 12 char f,g; 13 f = tolower('A'); /* convert A -> a */ 14 g = toupper('a'); /* convert a -> A */ 15 16 printf("isalnum('5') = %i\n",a); 17 printf("isalpha('5') = %i\n",b); 18 printf("isdigit('5') = %i\n",c); 19 printf("isupper('A') = %i\n",d); 20 printf("islower('A') = %i\n",e); 21 printf("tolower('A') = %c\n",f); 22 printf("toupper('a') = %c\n",g); 23 }
ผลลพธของโปรแกรม isalnum('5') = 2 isalpha('5') = 0 isdigit('5') = 2 isupper('A') = 4 islower('A') = 0 tolower('A') = a toupper('a') = A
บทท 8 ฟงกชน
277
อธบายโปรแกรม
บรรทดท 5 ประกาศตวแปรของขอมลเปนขอมลแบบเลขจานวนเตม (Integer)
บรรทดท 6-10 ทาการเรยกใชงานฟงกชน
บรรทดท 11 ประกาศตวแปรของขอมลเปนขอมลแบบตวอกษร (Character)
บรรทดท 13-14 ทาการเรยกใชงานฟงกชน
บรรทดท 16-22 แสดงผลลพธของฟงกชน
8.2.3 ฟงกชนในแฟมสวนหว string.h
ตารางท 8.3 แฟมสวนหว string.h
โปรแกรมตอประสานฟงกชน[string.h]
ความหมาย
int strcmp(const char *str1, const
char*str2)
ทาการเปรยบเทยบขอความ str1 และ str2 วาขอความใดมากอนกนถาเรยงตามรหสแอสก คาทไดจะมอยสามกรณดงน
นอยกวาศนยถา str1 มากอน str2
เทากบศนยถา str1 เหมอนกบ str2
มากกวาศนยถา str2 มากอน str1
char *strcpy(char *str1, const
char *str2)
ทาการสาเนาขอความในตวแปร str1 เกบไวในตวแปร str2
char *strcat(char *str1, const
char *str2)
นาเอาขอความทอยในตวแปร str1 ไปตอกบขอความทมอยในตวแปร str2
int strlen(const char *str) หาความยาวของขอความ str โดยไมนบ Null Character
ฟงกชนในแฟมสวนหว string.h เปนฟงกชนทใชกบขอมลสายอกขระ (String) สาหรบฟงกชนทจะกลาวถงตอไปน เปนฟงกชนทมการใชงานบอยๆ ไดแก
บทท 8 ฟงกชน
278
ฟงกชน char strcpy(char str1[ ],char str2[ ])
เปนฟงกชนทใชในการสาเนาขอมลจากสายอกขระตวท 2 (str2) ไปยงสายอกขระตวท
1 (str1)
ฟงกชน char strcat(cha str1[ ],char str2[ ])
เปนฟงกชนทใชในการนาสายอกขระตวท 2 (str2) ไปเชอมตอสายอกขระตวท 1
(str1) แลวเกบผลลพธไวในสายอกขระตวท 1 (str1)
ฟงกชน int strlen(char str1[ ])
เปนฟงกชนทใชในการหาความยาวของสายอกขระ
ตวอยางท 8.5 โปรแกรมแสดงการใชฟงกชนในแฟมสวนหว string.h
1 #include<stdio.h> 2 #include<string.h> 3 main(){ 4 char str1[30]="Hi",str2[30]="Hello"; 5 strcpy(str1,str2); 6 printf("%s\n",str1); 7 strcpy(str1,"Good Morning"); 8 printf("%s\n",str1); 9 strcat(str1,str2); 10 printf("%s\n",str1); 11 printf("%d\n",strlen(str1)); 12 }
ผลลพธของโปรแกรม Hello Good Morning Good MorningHello 17
อธบายโปรแกรม
บรรทดท 4 ประกาศตวแปรของขอมลเปนขอมลแบบสายอกขระ (String)
บรรทดท 5-6 ทาการสาเนาขอความของตวแปร str2 ไปยง str1 และแสดงผลลพธ บรรทดท 7-8 ทาการสาเนาขอความ "Good Morning" ไปยง str1 และแสดง
ผลลพธ บรรทดท 9-10 ทาการเชอมตอขอความของตวแปร str2 ไปยง str1 และแสดง
ผลลพธ บรรทดท 11 แสดงผลลพธของความยาวสายอกขระของตวแปร str1
บทท 8 ฟงกชน
279
8.2.4 ฟงกชนในแฟมสวนหว stdlib.h
ตารางท 8.4 แฟมสวนหว stdlib.h
โปรแกรมตอประสานฟงกชน
[stdlib.h]
ความหมาย
int atoi(const char *str) เปลยนสายอกขระ str ไปเปนจาเตม
long atol(const char *str) เปลยนสายอกขระ str ไปเปนจาเตมแบบยาว double atof(const char *str) เปลยนสายอกขระ str ไปเปนเลขทศนยม
void randomize(void) ทาหนาทเตรยมการสมคาตวเลข ตองเรยกใชฟงกชนน กอน rand( ) และ random( ) เสมอ
int rand(void) ทาการสมคาจานวนเตมระหวาง 0 ถง RAND_MAX
int random(int num) ทาการสมคาจานวนเตมตงแต 0 ถง num-1
void exit(int status) ทาการออกจากโปรแกรมพรอมทง คนคาสถานะ (Status) ใหกบผ ทเรยกใชโปรแกรมน (ระบบปฏบตการ) โดยถาสถานะมคาเปนศนยแสดงวาโปรแกรมทางานเสรจสนอยางสมบรณ
void abort(void) ทาการหยดการทางานของโปรแกรมโดยทนท พรอมทงแสดงคาวา “Abnormal termination program” ออกทางหนาจอ
สาหรบฟงกชนทจะกลาวถงตอไปน เปนฟงกชนทมการใชงานบอยๆ ไดแก ฟงกชน int atoi(char str[ ])
เปนฟงกชนทใชในการเปลยนสายอกขระทตองการใหเปนเลขจานวนเตม เชน
“123445” ของสายอกขระกจะกลายเปนเลข 123445 ของเลขจานวนเตม
ฟงกชน double atof(const char str[ ])
เปนฟงกชนทใชในการเปลยนสายอกขระทตองการใหเปนเลขทศนยม เชน “123.99”
ของสายอกขระกจะกลายเปนเลข 123.99 ของเลขจานวนเตม
ฟงกชน int random(int num)
เปนฟงกชนทใชในการสมคาตงแตเลข 0 ถง num -1 โดยจะตองมการเรยกใชฟงกชน
void randomize(void) กอนเสมอเพอเตรยมการสมคาตวเลข
บทท 8 ฟงกชน
280
ตวอยางท 8.6 โปรแกรมแสดงการใชฟงกชนในแฟมสวนหว stdlib.h
1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 int a = atoi("123.45"); 6 long int b = atol("99999.88"); 7 double c = atof("99999.88"); 8 printf("%i\n%li\n%lf",a,b,c); 9 }
ผลลพธของโปรแกรม 123 99999 99999.880000
อธบายโปรแกรม
บรรทดท 5 ทาการแปลงคาสายอกขระ "123.45" ใหเปนเลขจานวนเตม ซงเวลาแปลงจะไดเฉพาะคา 123
บรรทดท 6 ทาการแปลงคาสายอกขระ "99999.88" ใหเปนเลขจานวนเตม แบบยาว ซงเวลาแปลงจะไดเฉพาะคา 99999
บรรทดท 7 ทาการแปลงคาสายอกขระ "99999.88" ใหเปนเลขทศนยม ซงเวลาแปลงจะไดคาทเปนทศนยมดวย
บรรทดท 8 แสดงผลลพธของคาทงสาม
ตวอยางท 8.7 โปรแกรมแสดงการใชฟงกชนในแฟมสวนหว stdlib.h
1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 int a,b; 6 randomize(); 7 a = rand(); 8 b = random(100); /* Random between 0 -99 */ 9 printf("%i \n%i",a,b); 10 }
ผลลพธของโปรแกรม 32350 30
บทท 8 ฟงกชน
281
อธบายโปรแกรม
บรรทดท 6 เตรยมการสมคา บรรทดท 7 ทาการสมคาแลวคนคาเกบไวยงตวแปร a
บรรทดท 8 ทาการสมคาตงแต 0 ถง 99 แลวคนคาเกบไวยงตวแปร b
บรรทดท 9 แสดงผลลพธของคาทงสาม
8.3 ฟงกชนสรางเอง (User-Defined Functions)
ฟงกชนทสรางขนมาคอฟงกชนยอยททางานใดงานหนงโดยเฉพาะ ถกสรางอยภายนอกฟงกชนหลกและถกเรยกใชโดยฟงกชนตางๆ โครงสรางของฟงกชนสรางเองมรปแบบ
คอ
เชน int sum(int a, int b)
{
int c;
c = a + b;
return c;
}
หมายถง สรางฟงกชน sum() ขนมา โดยทาการรบคาขอมลชนดจานวนเตมผานทางตวแปร a และตวแปร b เขามาในฟงกชน หลงจากทางานเสรจเรยบรอยจะสงผลลพธเปนขอมลชนดจานวนเตมผานทางตวแปร c ออกไปจากฟงกชน
ชนดขอมลทตองการสงกลบ ชอฟงกชน(ชนดขอมลทรบเขามา ชอตวแปรทรบเขามา){ .....
}
บทท 8 ฟงกชน
282
float sum(float a, float b){
float c;
c = a + b;
return c;
}
หมายถง สรางฟงกชน sum() ขนมา โดยทาการรบคาขอมลชนดจานวนจรงผานทางตวแปร a และตวแปร b เขามาในฟงกชน หลงจากทางานเสรจเรยบรอยจะสงผลลพธเปนขอมลชนดจานวนจรงผานทางตวแปร c ออกไปจากฟงกชน
การทางานของภาษาซมลกษณะทางานจากบนลงลาง ดงนนถาเขยนฟงกชนหลงฟงกชนหลก (main()) จะไมสามารถถกเรยกใชงานได ดงแสดงในรปท 8.2
Funtion B
Funtion A
main( )
Funtion C
Funtion C
Funtion B
Function A
main( )
(ก) (ข)
รปท 8.2 รปแบบตวอยางการเรยกใชงานฟงกชน
บทท 8 ฟงกชน
283
จากการเรยกใชฟงกชนในรปท 8.2(ก) การเรยกใชฟงกชน C จะไมสามารถกระทาได
แตถาตองการเรยกใชฟงกชน C จะตองเขยนฟงกชนดงรป 8.2(ข) ดงนนการสรางฟงกชนขนมานน จะตองเขยนไวกอนฟงกชนทเรยกใชเสมอ เพราะหากไมเขยนไวกอนจะเกดขอผดพลาดขน เพราะฟงกชนทเรยกใชจะไมรจกฟงกชนทสรางขนมา แตหากตองการเขยนไวทหลงฟงกชนทเรยกใช สามารถทาไดโดยการประกาศตนแบบของฟงกชน (Function
Prototype) ไวทสวนหวของโปรแกรม มรปแบบคอ
ตวอยางท 8.8 โปรแกรมแสดงการเรยกใชฟงกชนทไมสามารถเรยกใชงานได
1 #include <stdio.h> 2 main() 3 { 4 int a=-3,b; 5 b = abs(a) - abs(-4) - 5; 6 b = abs(b); 7 printf("%i",b); 8 } 9 int abs(int a) 10 { 11 if(a<0) return(-a); 12 else return(a); 13 }
อธบายโปรแกรม
บรรทดท 9 –13 คอฟงกชนสรางเองซงเปนการสรางฟงกชนหลงการเรยกใช สงผลใหโปรแกรมไมสามารถประมวลผลได
ชนดขอมลทตองการสงกลบ ชอฟงกชน(ชนดขอมลทรบเขามา ชอตวแปรทรบเขามา);
บทท 8 ฟงกชน
284
ตวอยางท 8.9 โปรแกรมแสดงการเรยกใชฟงกชนทสามารถเรยกใชงานได
1 #include <stdio.h> 2 int abs(int a);
3 main() 4 { 5 int a=-3,b; 6 b = abs(a) - abs(-4) - 5; 7 b = abs(b); 8 printf("%i",b); 9 } 10 int abs(int a) 11 { 12 if(a<0) return(-a); 13 else return(a); 14 }
อธบายโปรแกรม
บรรทดท 2 การประกาศตนแบบของฟงกชน (Function Prototype) ไวทสวนหวของโปรแกรม ทาใหสามารถสรางฟงกชนหลงจากฟงกชน main() ได
บรรทดท 10–14 คอฟงกชนสรางเองซงเปนการสรางฟงกชนหลงการเรยกใช แตสามารถเรยกใชไดเนองจากมการประกาศตนแบบของฟงกชนไวกอน
8.3.1 ฟงกชนทไมมการรบคาเขามาในฟงกชน และไมมการสงคากลบออกไปจากฟงกชน
ฟงกชนทไมมการรบคาเขามาในฟงกชนและไมมการสงคากลบออกไปจากฟงกชนเปนฟงกชนทสรางขนมาเพอเรยกใชโดยไมสงคาไปและสงคากลบเพยงแตเปนการเรยกใชในสวนของโปรแกรมยอยทตองการใหกระทา โดยมรปแบบฟงกชน คอ
การเรยกใชงานฟงกชน มรปแบบคาสง คอ
void ชอฟงกชน(void){
….
}
ชอฟงกชน()
บทท 8 ฟงกชน
285
ตวอยางท 8.10 โปรแกรมแสดงการใชฟงกชนทไมมการรบคาเขามาในฟงกชน และไมมการสงคากลบออกไปจากฟงกชน
1 #include<stdio.h> 2 void show(void){ 3 char name[30]; 4 printf("Enter name :"); 5 scanf("%s",name); 6 printf("Hello !!! %s\n",name); 7 } 8 main(){ 9 printf("**************************\n"); 10 printf("*********Greeting*********\n"); 11 printf("**************************\n"); 12 show(); 13 }
ผลลพธของโปรแกรม *********************************************** ******************Greeting******************* *********************************************** Enter name :Witchakorn Hello !!! Witchakorn
อธบายโปรแกรม
บรรทดท 2 – 7 สรางฟงกชน show()
บรรทดท 12 ฟงกชนหลก main() เรยกใชงานฟงกชน show() ซงทาใหมการทางานในบรรทดท 2 – 7 โดยจะทาการรบชอและแสดงผลการทกทาย จากนนกจะกลบไปสการทางานของฟงกชนหลกในบรรทดตอไป
บทท 8 ฟงกชน
286
ตวอยางท 8.11 โปรแกรมแสดงการใชฟงกชนทไมมการรบคาเขามาในฟงกชน และไมมการสงคากลบออกไปจากฟงกชน
1 #include<stdio.h> 2 void sum(void){ 3 int a,b,c; 4 printf("Enter a :"); 5 scanf("%d",&a); 6 printf("Enter b :"); 7 scanf("%d",&b); 8 c = a + b; 9 printf("%d + %d = %d\n",a,b,c); 10 } 11 main(){ 12 printf("**************************\n"); 13 printf("*********Sum*********\n"); 14 printf("**************************\n"); 15 sum(); 16 sum(); 17 }
ผลลพธของโปรแกรม *********************************************** ******************Sum******************* *********************************************** Enter a :111 Enter b :123 111 + 123 = 234 Enter a :222 Enter b :234 222+234 = 456
อธบายโปรแกรม
บรรทดท 2 – 10 สรางฟงกชน sum()
บรรทดท 15 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 10 โดยจะทาการรบคาตวเลขจานวนเตม 2 คา แลวหาผลรวม และแสดงผลรวมทได จากนนกจะกลบไปสการทางานของฟงกชนหลกในบรรทดตอไป
บรรทดท 16 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 10 โดยจะทาการรบคาตวเลขจานวนเตม 2 คา แลวหาผลรวม และแสดงผลรวมทได จากนนกจะกลบไปสการทางานของฟงกชนหลกในบรรทดตอไป
บทท 8 ฟงกชน
287
ตวอยางท 8.12 โปรแกรมแสดงการประกาศตนแบบของฟงกชน เมอมการเขยนฟงกชนไวหลงฟงกชนทเรยกใช
1 #include<stdio.h> 2 void sum(void);
3 main(){ 4 printf("**************************\n"); 5 printf("*********Sum*********\n"); 6 printf("**************************\n"); 7 sum(); 8 sum(); 9 } 10 void sum(void){ 11 int a,b,c; 12 printf("Enter a :"); 13 scanf("%d",&a); 14 printf("Enter b :"); 15 scanf("%d",&b); 16 c = a + b; 17 printf("%d + %d = %d\n",a,b,c); 18 }
ผลลพธของโปรแกรม *********************************************** ******************Sum******************* *********************************************** Enter a :111 Enter b :123 111 + 123 = 234 Enter a :222 Enter b :234 222+234 = 456
8.3.2 ฟงกชนทมการรบคาเขามาในฟงกชน แตไมมการสงคากลบออกไปจากฟงกชน
ฟงกชนทมการรบคาเขามาในฟงกชน แตไมมการสงคากลบออกไปจากฟงกชน เปนฟงกชนทสรางขนมาเพอเรยกใชโดยมการสงคาไปเพอทาการประมวลผลซงผลลพธทไดจากการประมวลผลจะไมสงคากลบ มรปแบบฟงกชนคอ
void ชอฟงกชน(ชนดขอมลทรบเขามา ชอตวแปรทรบเขามา){ ….
}
บทท 8 ฟงกชน
288
การเรยกใชงานฟงกชน มรปแบบคาสง คอ
ตวอยางท 8.13 โปรแกรมแสดงการใชฟงกชนทมการรบคาเขามาในฟงกชน แตไมมการสงคากลบออกไปจากฟงกชน
1 #include<stdio.h> 2 void sum(int a,int b){ 3 int c; 4 c = a + b; 5 printf("%d + %d = %d\n",a,b,c); 6 } 7 main(){ 8 int num1,num2; 9 printf("**************************\n"); 10 printf("*********Sum*********\n"); 11 printf("**************************\n"); 12 printf("Enter num1 :"); 13 scanf("%d",&num1); 14 printf("Enter num2 :"); 15 scanf("%d",&num2); 16 sum(num1,num2); 17 printf("Enter num1 :"); 18 scanf("%d",&num1); 19 printf("Enter num2 :"); 20 scanf("%d",&num2); 21 sum(num1,num2); 22 }
ผลลพธของโปรแกรม *********************************************** ******************Sum******************* *********************************************** Enter a :111 Enter b :123 111 + 123 = 234 Enter a :222 Enter b :234 222 + 234 = 456
อธบายโปรแกรม
บรรทดท 2 – 6 สรางฟงกชน sum()
ชอฟงกชน(พารามเตอรทตองการสงไปฟงกชน)
บทท 8 ฟงกชน
289
บรรทดท 16 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 6 โดยจะสงคาตวเลขจานวนเตม 2 คา เพอไปหาผลรวมในฟงกชน sum() และแสดงผลรวมทได จากนนกจะกลบไปสการทางานของฟงกชนหลกในบรรทดตอไป
บรรทดท 21 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 6 โดยจะสงคาตวเลขจานวนเตม 2 คา เพอไปหาผลรวมในฟงกชน sum() และแสดงผลรวมทได จากนนกจะกลบไปสการทางานของฟงกชนหลกในบรรทดตอไป
8.3.3 ฟงกชนทมการรบคาเขามาในฟงกชน และมการสงคากลบออกไปจากฟงกชน
ฟงกชนทมการรบคาเขามาในฟงกชนและมการสงคากลบออกไปจากฟงกชนเปนฟงกชนทสรางขนมาเพอเรยกใชโดยมการสงคาไปเพอทาการประมวลผลซงผลลพธทไดจากการประมวลผลกจะสงคากลบยงฟงกชนทมการเรยกใช มรปแบบฟงกชนคอ
การเรยกใชงานฟงกชน มรปแบบคาสง คอ
ตวอยางท 8.14 โปรแกรมแสดงการใชฟงกชนทมการรบคาเขามาในฟงกชน และมการสงคากลบออกไปจากฟงกชน
1 #include<stdio.h> 2 int sum(int a,int b){ 3 printf("%d + %d = %d\n",a,b,a+b); 4 return a + b; 5 } 6 main(){ 7 int num1,num2,result1,result2,total; 8 printf("**************************\n"); 9 printf("*********Sum*********\n");
ชนดขอมลทตองการสงกลบ ชอฟงกชน(ชนดขอมลทรบเขามา ชอตวแปรทรบเขามา){ ….
return คาทตองการสงกลบออกไปจากฟงกชน
}
ตวแปรรบคาทฟงกชนสงกลบ = ชอฟงกชน(พารามเตอรทตองการสงไปฟงกชน)
บทท 8 ฟงกชน
290
10 printf("**************************\n"); 11 printf("Enter num1 :"); 12 scanf("%d",&num1); 13 printf("Enter num2 :"); 14 scanf("%d",&num2); 15 result1 = sum(num1,num2); 16 printf("Enter num1 :"); 17 scanf("%d",&num1); 18 printf("Enter num2 :"); 19 scanf("%d",&num2); 20 result2 = sum(num1,num2); 21 printf("**************************\n"); 22 total= sum(result1,result2); 23 }
ผลลพธของโปรแกรม *********************************************** ******************Sum******************* *********************************************** Enter num1 :111 Enter num2 :123 111 + 123 = 234 Enter num1 :222 Enter num2 :234 222 + 234 = 456 *********************************************** 234 + 456 = 690
อธบายโปรแกรม
บรรทดท 2 – 5 สรางฟงกชน sum()
บรรทดท 15 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 5 โดยจะสงคาตวเลขจานวนเตม 2 คา เพอไปหาผลรวมในฟงกชน sum() และสงผลรวมทไดกลบออกมาทฟงกชนหลก จากนนกจะกลบไปสการทางานของฟงกชนหลก
บรรทดท 20 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 5 โดยจะสงคาตวเลขจานวนเตม 2 คา เพอไปหาผลรวมในฟงกชน sum() และสงผลรวมทไดกลบออกมาทฟงกชนหลก จากนนกจะกลบไปสการทางานของฟงกชนหลก
บรรทดท 22 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 5 โดยจะสงคาตวเลขจานวนเตม 2 คา เพอไปหาผลรวมในฟงกชน sum() และสงผลรวมทไดกลบออกมาทฟงกชนหลก จากนนกจะกลบไปสการทางานของฟงกชนหลก
บทท 8 ฟงกชน
291
ตวอยางท 8.15 โปรแกรมแสดงการใชฟงกชนทมการรบคาเขามาในฟงกชน และมการสงคากลบออกไปจากฟงกชน โดยเปนฟงกชนสาหรบหาคาสมบรณของเลขจานวนเตม
1 #include <stdio.h> 2 int abs(int a) 3 { 4 if(a<0) 5 return(-a); 6 else 7 return(a); 8 } 9 void main(void) 10 { 11 int a,b; 12 printf("Input number = "); 13 scanf("%i",&a); 14 b = abs(a); 15 printf("Output Absolute = %i\n",b); 16 }
ผลลพธของโปรแกรม
อธบายโปรแกรม
บรรทดท 2 – 8 สรางฟงกชน abs() เพอใชในการหาคาสมบรณของเลขทรบเขามา โดยทาการตรวจสอบเลขทรบเขามา ถาเปนเลขจานวนเตมบวกใหคนคาจานวนเดมกลบไป แตถาหากเปนเลขจานวนเตมลบใหคนคาจานวนเตมลบกลบไป
บรรทดท 14 ทาการเรยกใชฟงกชน โดยมการสงคา a ไป และ ใหรบคากลบโดยใหเกบไวทตวแปร b
ตวอยางท 8.16 โปรแกรมแสดงการใชฟงกชนทมการรบคาเขามาในฟงกชน และมการสงคากลบออกไปจากฟงกชน โดยเปนฟงกชนแปลงคาเงนโดยมการรบคาเขามา 2 ตวคอ ตวแรกเปนจานวนเงนบาท ตวทสองเปนจานวนเตมบอกสกลเงนเปาหมายทตองการแปลงโดยท
1=US, 2=Euro, 3=Yen
1 #include <stdio.h> 2 double convert(double bath,int dest) 3 { 4 switch(dest) 5 { 6 case 1 : //US
บทท 8 ฟงกชน
292
7 return(bath/42.5); 8 break; 9 case 2 : //EURO 10 return(bath/43.45); 11 break; 12 case 3 : //YEN 13 return(bath*0.123); 14 break; 15 } 16 } 17 18 void main(void) 19 { 20 double a = convert(100,1); 21 printf("100 bath = %f us\n",a); 22 printf("100 bath = %f euro\n",convert(100.0,2)); 23 printf("100 bath = %f yen\n",convert(100.0,3)); 24 }
ผลลพธของโปรแกรม 100 bath = 2.352941 us 100 bath = 2.301496 euro 100 bath = 12.300000 yen
อธบายโปรแกรม
บรรทดท 2–16 สรางฟงกชน convert() เพอแปลงสกลเงน โดยใหมการปอนคาตวเลอกทตองการจะแปลง
บรรทดท 20 ประกาศตวแปรและเรยกใชฟงกชน convert เพอทาการแปลงสกลเงน และมการคนคาทไดจากฟงกชนยอยเกบไวทตวแปร a
บรรทดท 21-23 แสดงคาผลลพธออกทางหนาจอภาพ
8.3.4 ฟงกชนทไมมการรบคาเขามาในฟงกชน แตมการสงคากลบออกไปจากฟงกชน
ฟงกชนทไมมการรบคาเขามาในฟงกชนแตมการสงคากลบออกไปจากฟงกชนเปนฟงกชนทสรางขนมาเพอเรยกใชโดยไมมการสงคาไปในสวนของฟงกชนยอย แตผลลพธทไดจากฟงกชนยอยจะสงคากลบยงฟงกชนทมการเรยกใช มรปแบบฟงกชนคอ
ชนดขอมลทตองการสงกลบ ชอฟงกชน(void){
….
return คาทตองการสงกลบออกไปจากฟงกชน;
}
บทท 8 ฟงกชน
293
การเรยกใชงานฟงกชน มรปแบบคาสง คอ
ตวอยางท 8.17 โปรแกรมแสดงการใชฟงกชนทไมมการรบคาเขามาในฟงกชน แตมการสงคากลบออกไปจากฟงกชน
1 #include<stdio.h> 2 int sum(void){ 3 int a,b,c; 4 printf("Enter a :"); 5 scanf("%d",&a); 6 printf("Enter b :"); 7 scanf("%d",&b); 8 c = a + b; 9 printf("%d + %d = %d\n",a,b,c); 10 return c; 11 } 12 void main(void){ 13 int result1,result2,result3; 14 printf("**************************\n"); 15 printf("*********Sum*********\n"); 16 printf("**************************\n"); 17 result1 = sum(); 18 result2 = sum(); 19 result3 = result1*result2; 20 printf("**************************\n"); 21 printf("%d * %d = %d\n",result1,result2,result3); 22 }
ผลลพธของโปรแกรม *********************************************** ******************Sum******************* *********************************************** Enter a :111 Enter b :123 111 + 123 = 234 Enter a :222 Enter b :234 222 + 234 = 456 *********************************************** 234 * 456 = 106704
ตวแปรรบคาทฟงกชนสงกลบ = ชอฟงกชน()
บทท 8 ฟงกชน
294
อธบายโปรแกรม
บรรทดท 2 – 11 สรางฟงกชน sum()
บรรทดท 17 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 11 โดยจะทาการรบคาตวเลขจานวนเตม 2 คา แลวหาผลรวม และสงผลรวมทไดกลบออกมาทฟงกชนหลก จากนนกจะกลบไปสการทางานของฟงกชนหลก
บรรทดท 18 ฟงกชนหลก main() เรยกใชงานฟงกชน sum() ซงทาใหมการทางานในบรรทดท 2 – 11 โดยจะทาการรบคาตวเลขจานวนเตม 2 คา แลวหาผลรวม และสงผลรวมทไดกลบออกมาทฟงกชนหลก จากนนกจะกลบไปสการทางานของฟงกชนหลก
8.3.5 การใชแถวลาดบในฟงกชน
การใชแถวลาดบในฟงกชนเปนกระบวนการใชงานตวแปรชด เนองจากการสงคาในฟงกชนจากทไดกลาวในหวขอขางตนสามารถสงขอมลไดทละคา แตถาหากมจานวนขอมลจานวนมากกจะทาใหการเขยนโปรแกรมไมสะดวก ซงในภาษาซเราสามารถใชแถวลาดบในการใชงานฟงกชนได โดยมรปแบบฟงกชน คอ
การเรยกใชงานฟงกชน มรปแบบคาสง คอ
ชนดขอมลทตองการสงกลบ ชอฟงกชน(ชนดขอมลทรบเขามา ชอตวแปรแถวลาดบ[ขนาดของแถวลาดบ]){
….
}
ตวแปรรบคาทฟงกชนสงกลบ = ชอฟงกชน(ชอตวแปรแถวลาดบ)
บทท 8 ฟงกชน
295
ตวอยางท 8.18 โปรแกรมแสดงการสงคาแถวลาดบเขาไปในฟงกชน
1 #include<stdio.h> 2 int i; 3 int FindMax(int a[]){ 4 int max = a[0]; 5 for(i=1;i<5;i++){ 6 if(a[i]>max) 7 max = a[i]; 8 } 9 return max; 10 } 11 int FindMin(int a[]){ 12 int min = a[0]; 13 for(i=1;i<5;i++){ 14 if(a[i]<min) 15 min = a[i]; 16 } 17 return min; 18 } 19 void show(int a[]){ 20 for(i=0;i<5;i++){ 21 printf("%d\t ",a[i]); 22 } 23 } 24 void main(void){ 25 int maximum,minimum; 26 int num[5]={14,25,3,12,15}; 27 maximum = FindMax(num); 28 minimum = FindMin(num); 29 show(num); 30 printf("\nMax = %d\t Min = %d\n",maximum,minimum); 31 }
ผลลพธของโปรแกรม 14 25 3 12 15 Max = 25 Min = 3
อธบายโปรแกรม
บรรทดท 3–10 สรางฟงกชน FindMax() เพอหาคาสงสดและมการคนคา บรรทดท 11–18 สรางฟงกชน FindMin()เพอหาคาตาสดและมการคนคา บรรทดท 19– 23 สรางฟงกชน show() เพอแสดงคาของแถวลาดบ
บรรทดท 27 เรยกใชฟงกชน FindMax() แลวคนคาไวยงตวแปร maximum
บรรทดท 28 เรยกใชฟงกชน FindMin()แลวคนคาไวยงตวแปร minimum
บรรทดท 29 เรยกใชฟงกชน show()
บทท 8 ฟงกชน
296
ตวอยางท 8.19 โปรแกรมแสดงการสงคาแถวลาดบเขาไปในฟงกชน โดยการสงคาแถวลาดบ
1 มตไปยงฟงกชนเพอหาคาเลขยกกาลงสองและแสดงผล 1 #include <stdio.h> 2 void mul(int a[5]) 3 { 4 for(int i=0;i<5;i++) a[i] *= a[i]; 5 printf("\ntest() : "); 6 for(i=0;i<5;i++) printf("%i ",a[i]); 7 printf("\n"); 8 } 9 void main(void) 10 { 11 int p[5] = {1,2,3,4,5}; 12 printf("Before : "); 13 for(int i=0;i<5;i++) printf("%i ",p[i]); 14 mul(p); 15 printf("After : "); 16 for(i=0;i<5;i++) printf("%i ",p[i]); 17 }
ผลลพธของโปรแกรม Before : 1 2 3 4 5 test() : 1 4 9 16 25 After : 1 4 9 16 25
อธบายโปรแกรม
บรรทดท 2–9 สรางฟงกชน mul() เพอหาเลขยกกาลงสองและมการคนคา บรรทดท 14 เรยกใชฟงกชน mul()
บรรทดท 15-16 แสดงผลลพธ
ตวอยางท 8.20 โปรแกรมแสดงการสงคาแถวลาดบเขาไปในฟงกชน โดยการสงคาแถวลาดบ
2 มตไปยงฟงกชนเพอแสดงผลการสลบคาตาแหนงแถวและหลก (Transpose)
1 #include <stdio.h> 2 void P_Array(int a[3][5]) 3 { 4 for(int i=0;i<3;i++) 5 { 6 for(int j=0;j<5;j++) printf("%i ",a[i][j]); 7 printf("\n"); 8 } 9 } 10 void P_Transpose(int a[3][5]) 11 { 12 for(int j=0;j<5;j++)
บทท 8 ฟงกชน
297
13 { 14 for(int i=0;i<3;i++) printf("%i ",a[i][j]); 15 printf("\n"); 16 } 17 } 18 void main(void) 19 { 20 int p[3][5] = { { 1, 2, 3, 4, 5}, 21 { 10, 11, 12, 12, 14}, 22 {20, 21, 22, 23, 24}}; 23 printf("Data\n"); P_Array(p); 24 printf("Transpose\n"); P_Transpose(p); 25 }
ผลลพธของโปรแกรม Data 1 2 3 4 5 10 11 12 12 14 20 21 22 23 24 Transpose 1 10 20 2 11 21 3 12 22 4 12 23 5 14 24
อธบายโปรแกรม
บรรทดท 2–9 สรางฟงกชน P_Array เพอแสดงผลของแถวลาดบทสงคาเขามา บรรทดท 10–17 สรางฟงกชน P_Transpose เพอแสดงผลของแถวลาดบทมการ
สลบคาหลกสลบคาแถว (Transpose)
บรรทดท 20 ประกาศตวแปรใหเปนแถวลาดบ 2 มต
บรรทดท 23 เรยกใชฟงกชน P_Array พรอมสงคาตวแปรของแถวลาดบ 2 มต
บรรทดท 24 เรยกใชฟงกชน P_Transpose พรอมสงคาตวแปรของแถวลาดบ 2
มต
บทท 8 ฟงกชน
298
8.4 การประกาศตวแปรของเรองฟงกชน (Variable Declaration of
Functions)
การประกาศตวแปรของฟงกชนเปนสวนทแจงใหตวแปลภาษาทราบวาเราตองการใชตวแปรใดในการแทนขอมล ขอมลทใชเปนขอมลชนดใด (Data Type) ซงการประกาศตวแปรของเรองฟงกชนกจะเปนการประกาศตวแปรเชนเดยวกบการประกาศตวแปรในบทกอนหนาน โดยเขยนอยในรปแบบดงน
ชนดขอมล (data_type) ชอตวแปร (variable_name);
ดงเชน
int number;
float image;
int a,b,c,d;
ในภาษาซไดมการแบงตวแปรทใชในฟงกชนออกเปนชนดตางๆ ดงน
ตวแปรสวนกลาง (Global Variable)
ตวแปรเฉพาะท (Local Variable)
ตวแปรสถต (Static Variable)
ตวแปรเรจสเตอร (Register Variable)
8.4.1 ตวแปรสวนกลาง (Global Variable)
ตวแปรสวนกลางหรอตวแปรภายนอก (External Variable) ซงเปนการประกาศตวแปรขนมาแลวสามารถใชทกสวนของโปรแกรม สามารถใชไดทงฟงกชนหลก และฟงกชนอนๆ ของโปรแกรม โดยการประกาศตวแปรสวนกลางจะประกาศไวภายนอกของฟงกชน ดงตวอยางโปรแกรม
บทท 8 ฟงกชน
299
ตวอยางท 8.21 โปรแกรมแสดงการใชงานของตวแปรสวนกลาง
1 #include <stdio.h> 2 int a; //Global Variable
3 void test2(void) 4 { 5 a = 2; 6 printf("In test2() a = %i\n",a); 7 } 8 void test1(void) 9 { 10 a = 1; 11 printf("In test1() a = %i\n",a); 12 test2(); 13 } 14 void main(void) 15 { 16 a = 0; 17 printf("Before () a = %i\n",a); 18 test1(); 19 printf("After () a = %i\n",a); 20 }
ผลลพธของโปรแกรม Before () a = 0 In test1() a = 1 In test2() a = 2 After () a = 2
อธบายโปรแกรม
บรรทดท 2 ประกาศตวแปร a เปนแบบตวแปรสวนกลาง บรรทดท 3–7 สรางฟงกชน test2 โดยกาหนดคา a = 2 และแสดงผลของคาตว
แปร a
บรรทดท 8–13 สรางฟงกชน test1 โดยกาหนดคา a = 1 แสดงผลของคาตวแปร a
และเรยกใชฟงกชน test2
บรรทดท 14-20 ฟงกชนหลกของโปรแกรม โดยในฟงกชนประกอบดวยการกาหนดคาตวแปร a = 0 แสดงผลลพธของตวแปร a และมการเรยกใชงานฟงกชน test1
บทท 8 ฟงกชน
300
8.4.2 ตวแปรเฉพาะท (Local Variable)
ตวแปรเฉพาะทหรอตวแปรอตโนมต (Automatic Variable) ซงเปนการประกาศตวแปรขนมาใชในเฉพาะสวนของโปรแกรม เฉพาะเจาะจงของโปรแกรม โดยคาของตวแปรจะถกทาลายเมอออกจากฟงกชน และจะเรมตนคาใหมทกครงเมอมการเรยกใชฟงกชน
ตวอยางท 8.22 โปรแกรมแสดงการใชงานของตวแปรเฉพาะท
1 #include <stdio.h> 2 void test2(void) 3 { 4 int a = 2; 5 printf("In test2() a = %i\n",a); 6 } 7 void test1(int a) 8 { 9 printf("In test1() a = %i\n",a); 10 test2(); 11 } 12 void main(void) 13 { 14 int a = 0; 15 printf("Before () a = %i\n",a); 16 test1(1); 17 printf("After () a = %i\n",a); 18 }
ผลลพธของโปรแกรม Before () a = 0 In test1() a = 1 In test2() a = 2 After () a = 0
อธบายโปรแกรม
บรรทดท 2–6 สรางฟงกชน test2 โดยประกาศตวแปรเฉพาะทพรอมทงกาหนดคา a = 2 และแสดงผลของคาตวแปร a
บรรทดท 7–11 สรางฟงกชน test1 โดยแสดงผลของคาตวแปร a ทรบเขามา พรอมทงเรยกใชฟงกชน test2
บรรทดท 12-18 ฟงกชนหลกของโปรแกรม โดยประกาศตวแปรเฉพาะทพรอมทงกาหนดคา a = 0 แสดงผลลพธของตวแปร a และมการเรยกใชงานฟงกชน test1
บทท 8 ฟงกชน
301
8.4.3 ตวแปรสถต (Static Variable)
คอการกาหนดใหตวแปรแบบเฉพาะทเกบคาไวจนกวาจะจบการทางานของโปรแกรม
คาของตวแปรจงจะถกทาลาย ดงนนเมอมการเรยกใชงานฟงกชนใดๆ อกครงหลงจากออกจากการใชงานฟงกชนนนๆ แลว คาของตวแปรจะยงคงอย สวนตวแปรสวนกลางจะถกกาหนดใหเปนตวแปรแบบสถตโดยอตโนมต เชน
static int x = 5;
หมายถงจะมการทางานเชนเดยวกบการประกาศ int x = 5; เพยงแตเมอสนสดการทางานของฟงกชนแลวคาตวแปรเหลานยงคงอย
ตวอยางท 8.23 โปรแกรมแสดงการทางานของตวแปรแบบสถต
1 #include <stdio.h> 2 void write_static(void) 3 { 4 int a = 4; 5 static int b = 4; 6 a = a + 1; 7 b = b + a; 8 printf("a = %d b = %d\n" ,a ,b); 9 } 10 void main(void) 11 { 12 int i; 13 for(i = 1;i<=3;i++) 14 { 15 write_static(); 16 } 17 }
ผลลพธของโปรแกรม a = 5 b = 9 a = 5 b = 14
a = 5 b = 19
อธบายโปรแกรม
บรรทดท 2–9 สรางฟงกชน write_static
บทท 8 ฟงกชน
302
บรรทดท 5 : ประกาศตวแปร b เปนแบบสถต (Static Variable) หมายความวา คาของตวแปรจะถกเกบไว แมวาจะออกจากฟงกชน write_static()
ดงนนเมอมการเรยกใชฟงกชน write_static() จะมการนาคาของตวแปรทถกเกบไวมาใชงานตอ ดงนนจะเหนวาคาของตวแปร b จะเพมขนทละ 5 จากคาสง b = b+a;
บรรทดท 10-17 ฟงกชนหลกของโปรแกรม โดยทาการวนซาจานวน 3 ครง ในแตละครงมการเรยกใชงานฟงกชน write_static()
8.4.4 ตวแปรเรจสเตอร (Register Variable)
ตวแปรเรจสเตอรคอการกาหนดใหตวแปรถกเกบในเรจสเตอรของคอมพวเตอร แทนทจะเกบไวในหนวยความจาหลกเหมอนตวแปรโดยทวไป มขอดคอสามารถเขาถงตวแปรไดอยางรวดเรว แตมขอเสยคอ ขนาดของเรจสเตอรทจากดทาใหเกบขอมลไดนอย การประกาศขอมลชนดนดงเชน
register int x = 5;
หมายถงจะมการทางานเชนเดยวกบการประกาศ int x = 5; เพยงแตมการเกบคาของตวแปรไวในรจสเตอรแทนทจะเกบไวในหนวยความจาหลกนนเอง ในการใชตวแปรเรจสเตอรมกนยมใชกบตวแปรทมการเปลยนแปลงบอยครง ดงนนในการประกาศตวแปรเรจสเตอรควรจะดการใชงานของตวแปรวาเหมาะสมหรอไม ตวแปรเรจสเตอรเปนหนวยความจาทมขนาดเลกจงสามารถใชไดเฉพาะตวแปรบางชนด
ตวอยางท 8.24 โปรแกรมแสดงการทางานของตวแปรแบบเรจสเตอร
1 #include <stdio.h> 2 void write_static(void) 3 { 4 int a = 4; 5 register int b = 4; 6 a = a + 1; 7 b = b + a; 8 printf("a = %d b = %d\n" ,a ,b); 9 } 10 void main(void) 11 { 12 int i; 13 for(i = 1;i<=3;i++)
บทท 8 ฟงกชน
303
14 { 15 write_static(); 16 } 17 }
ผลลพธของโปรแกรม a = 5 b = 9 a = 5 b = 9
a = 5 b = 9
อธบายโปรแกรม
บรรทดท 2–9 สรางฟงกชน write_static
บรรทดท 5 : ประกาศตวแปร b เปนแบบเรจสเตอร (Register Variable)
บรรทดท 10-17 ฟงกชนหลกของโปรแกรม โดยทาการวนซาจานวน 3 ครง ในแตละครงมการเรยกใชงานฟงกชน write_static()
บทท 8 ฟงกชน
304
บทสรป
ในบทนไดกลาวถงแนวคดของฟงกชน ฟงกชนมาตรฐาน ฟงกชนทสรางขนมา และการประกาศตวแปรของเรองฟงกชน ฟงกชนเปรยบเสมอนกลมของคาสงโปรแกรมกลมหนงททาหนาทบางอยางตามทหนาทของฟงกชนนนตองการ ซงในมมมองของผ เรยกใชฟงกชนนนฟงกชนเปรยบเสมอนกลองดา ผ เรยกใชไมจาเปนตองทราบวาฟงกชนทจะเรยกใชนนมขนตอนการทางานอยางไร สงทผ เรยกใชสนใจกคอผลลพธของการเรยกใชฟงกชนเทานน ในมมมองของผสรางฟงกชน ผสรางจะตองแจงใหผ ใชทราบถงรปแบบการใชงานตางๆ ของฟงกชน และในการสรางฟงกชนนนกจะตองทาการเขยนโปรแกรมใหตรงตามขอกาหนดของฟงกชนนน ซงถาไมกระทาตามขอกาหนดจะสงผลใหเกดความผดพลาดได ฟงกชนมาตรฐาน คอฟงกชนทภาษาซไดจดเตรยมไวเพอใหสามารถเรยกใชงานฟงกชนพนฐานทจาเปนไดโดยงาย โดยจะเกบอยในแฟมสวนหว (Header File) ฟงกชนมาตรฐานจะอยในรปแบบของรหสจดหมาย (Object Code) ซงภาษาซแฟมสวนหวคอแฟมทมนามสกล *.h ตางๆ เมอตองการใชฟงกชนใด จะตองรวาฟงกชนนนอยในไฟลสวนหวใด เพอระบคาสง #include<header file.h> ไวทสวนหวของโปรแกรม จากนนจงสามารถเรยกใชฟงกชนโดยตองเขยนชอฟงกชนตามดวยวงเลบซงภายในเปนขอมลทฟงกชนตองการใช โดยฟงกชนสรางเอง คอฟงกชนยอยททางานใดงานหนงโดยเฉพาะ ถกสรางอยภายนอกฟงกชนหลกและถกเรยกใชโดยฟงกชนตางๆ แบงออกเปน 5 ชนด ไดแก ฟงกชนทไมมการรบคาเขามาในฟงกชน และไมมการสงคากลบออกไปจากฟงกชน ฟงกชนทมการรบคาเขามาในฟงกชน แตไมมการสงคากลบออกไปจากฟงกชน
ฟงกชนทมการรบคาเขามาในฟงกชน และมการสงคากลบออกไปจากฟงกชน ฟงกชนทไมมการรบคาเขามาในฟงกชน แตมการสงคากลบออกไปจากฟงกชน และการใชแถวลาดบในฟงกชน การประกาศตวแปรของเรองฟงกชนเปนสวนทแจงใหตวแปลภาษาทราบวาเราตองการใชตวแปรใดในการแทนขอมล ขอมลทใชเปนขอมลชนดใด ในภาษาซไดมการแบงตวแปรทใชในฟงกชนออกเปนชนด 4 ชนด ไดแก ตวแปรสวนกลาง ตวแปรเฉพาะท ตวแปรสถต
และตวแปรเรจสเตอร
บทท 8 ฟงกชน
305
แบบฝกหดทบทวน
1. จงหาคาผลลพธของฟงกชนเมอกาหนดคาของตวแปรตางๆ ดงน
a = -3 ,b = 3 ,c = 4 ,d = 2. 8 ,e = A ,f = # ,g = Hello ,h = World
1.1 sqrt(a+b*c)
1.2 pow(b,c)
1.3 ceil(d)
1.4 floor(d)
1.5 fabs(a)
1.6 tolower(e)
1.7 isalpha(e)
1.8 isalnum(f);
1.9 strcpy(g,h)
1.10 strlen(strcat(g,h))
2. จงเขยนฟงกชนโปรแกรมแปลงคาองศาเซลเซยส (Degree Celsius) เปนองศาฟาเรนไฮต
(Degree Fahrenheit) ดงสมการน )100
180(32 CF
3. จงเขยนฟงกชนโปรแกรม แปลงคาเงนบาทเปนดอลลารสหรฐ และโปรแกรมแปลงคาดอลลารสหรฐเปนเงนบาท โดยใหมการเลอกการแปลงสกลคาเงน เชนถาเลอก 1 ใหแปลงคาเงนบาทเปนดอลลารสหรฐ และถาเลอก 2 ใหแปลงคาดอลลารสหรฐเปนเงนบาท
4. จงเขยนฟงกชนโปรแกรมแปลง พศ. เปน คศ. และ โปรแกรมแปลง คศ. เปน พศ. โดยใหมการเลอกการแปลง เชนถาเลอก 1 ใหแปลง พศ. เปน คศ.และถาเลอก 2 ใหแปลง คศ.
เปน พศ.
5. จงเขยนฟงกชนโปรแกรมสาหรบการหาคา Factorial
6. จงเขยนฟงกชนโปรแกรมหาคาสงสดและตาสดในแถวลาดบ โดยใหทาการเลอกขอมลเขาวาจะหาคาตาสดหรอสงสด
7. จงเขยนฟงกชนโปรแกรมหาคาเลขคและเลขคในแถวลาดบ โดยใหทาการเลอกขอมลเขาวาจะหาคาเลขคหรอหาคาเลขค พรอมทงแสดงคาผลรวมของคาผลลพธ
บทท 8 ฟงกชน
306
8. จงเขยนฟงกชนโปรแกรมการคานวณการบวกเลขของแถวลาดบ 2 มต ขนาด 3 แถว 3
คอลมน โดยใหรบคาอนพตเขามา 9. จงเขยนฟงกชนโปรแกรมตรวจสอบจานวนตวอกษรตวเลก ตวอกษรตวใหญ และตวอกษรทงหมดของประโยคททาการรบคาเขามา
10. จงเขยนฟงกชนโปรแกรมเพอหาคา x ดงสมการ
a
acbbx
2
42
โดยใหทาการรบคาตวแปร a, b และ c เพอทาการหาคา x
บทท 9 โครงสรางและยเนยน
บทท 9
โครงสรางและยเนยน
ในบทนจะกลาวถงขอมลแบบโครงสราง (Structure) และขอมลแบบยเนยน (Unions)
โดยขอมลแบบโครงสรางจะเปนชนดขอมลทมการรวมขอมลหลายๆ ชนด ทมความสมพนธกนรวมเขาไวดวยกน ซงชนดขอมลแตละตวอาจจะเปนคนละชนดกนซงแตกตางจากขอมลแบบแถวลาดบทจะตองเปนขอมลชนดเดยวกน ทาใหขอมลแบบโครงสรางจดการขอมลไดอยางมประสทธภาพ และเมอมการอางองในสวนของขอมลกสามารถอางองชอของกลมขอมลไดโดยสะดวก สวนขอมลแบบยเนยนจะมความคลายคลงกบขอมลแบบโครงสรางแตแตกตางกนทหนวยความจาทใชในการเกบขอมลโดยขอมลแบบยเนยนตวแปรหลายตวสามารถใชหนวยความจารวมกนได ซงเนอหาในบทนจะเปนพนฐานในการจดเกบขอมลเปนหมวดหมใหเหมาะสมเพอทจะนาไปใชงานอยางมประสทธภาพ
9.1 โครงสราง (Structure)
ในงานเขยนโปรแกรมโดยทวไปตวแปรแตละตวจะมคาใดคาหนงแตบางสถานการณตวแปรตองมคามากกวาหนงคาดงนนปญหาในลกษณะนจงใหมการยอมใหผ เขยนโปรแกรมนยามชนดขอมลทมลกษณะเปนกลมเรยกกวาชนดขอมลแบบโครงสราง (Structure Data
Type) ซงนนกคอการรวมกลมของตวแปรตางๆ จานวนหลายตวแปรเขาไวดวยกนภายใตชอเพยงชอเดยว ซงจะทาใหเราสามารถจดกลมของขอมลและการนาไปประยกตสามารถกระทาไดสะดวกยงขนเชนการเกบขอมลหนงของบคคลหนงอาจจะตองมขอมลจานวนหลายตวแปรดงเชน อาย เพศ ชอ นามสกล ตาแหนง เงนเดอน เปนตน ในหวขอนจะกลาวถง ความหมาย และการประกาศขอมลแบบโครงสราง การกาหนดคาเรมตนใหกบตวแปรภายในขอมลแบบโครงสราง การเขาถงตวแปรภายในขอมลแบบโครงสราง การรบขอมลของตวแปรภายในขอมล
บทท 9 โครงสรางและยเนยน
308
แบบโครงสราง ขอมลแบบโครงสรางซอนขอมลแบบโครงสราง และแถวลาดบกบขอมลแบบโครงสราง
9.1.1 ความหมายและการประกาศขอมลแบบโครงสราง ขอมลแบบโครงสราง คอการรวมกลมของขอมลทมชนดขอมลแตกตางกน แตมความสมพนธกน มาเกบเขาไวภายในโครงสรางเดยวกนภายใตชอเพยงชอเดยว เชน ขอมลของพนกงานทตองเกบรหส ชอ นามสกล แผนก เงนเดอน ซงถาตองการนาขอมลเหลานไปเกบไวในหนวยความจา จะตองเตรยมตวแปรใหกบขอมล โดยทาการเกบ รหส ชอ นามสกล แผนก เปนสตรง สวนเงนเดอนเปนจานวนจรง เชน
ขอมล ชอตวแปร ชนดขอมล รหส id char[10]
ชอ name char[15]
นามสกล surname char[15]
แผนก department char[15]
เงนเดอน salary float
การประกาศขอมลแบบโครงสรางสามารถทาได 2 รปแบบ คอ รปแบบท 1
ตวแปรทกาหนดใหชนดขอมลเปนโครงสรางสามารถกาหนดไดมากกวา 1 ตว โดยใชเครองหมายจลภาคหรอคอมมา (,) คนระหวางชอตวแปรชนดโครงสรางเชน
struct ชอขอมลแบบโครงสราง{ ชนดของขอมลตวท 1 ชอตวแปรตวท 1;
ชนดของขอมลตวท 2 ชอตวแปรตวท 2;
ชนดของขอมลตวท n ชอตวแปรตวท n;
}ชอตวแปรชนดโครงสราง[,ชอตวแปรชนดโครงสราง,ชอตวแปรชนดโครงสราง];
บทท 9 โครงสรางและยเนยน
309
struct employee //สรางตวแปร emp เปนขอมลชนดโครงสราง {
char id[10];
char name[15];
char surname[15];
char department[15];
float salary;
}emp;
struct student
{
char name[80+1];
long int code;
float point;
} a;
//สรางตวแปร a เปนขอมลชนดโครงสราง
struct complex
{
float r,i;
} a,b,c;
//สรางตวแปร a,b,c เปนขอมลชนดโครงสราง โดยจะใชเปนตวแทนของจานวนเชงซอนสามจานวน
struct Customer
{
char code[15+1];
int sex;
char name[80+1];
int age;
char address[255+1];
char phone[30+1];
} p,q,r;
//สรางตวแปร p,q,r เปนขอมลชนดโครงสราง โดยจะใชเปนตวแทนของขอมลลกคาสามคน
บทท 9 โครงสรางและยเนยน
310
struct point
{
float x,y,z;
} a[10];
//สรางตวแปร a เปนขอมลชนดโครงสรางแบบแถวลาดบ
รปแบบท 2
เชน
struct employee
{
char id[10];
char name[15];
char surname[15];
char department[15];
float salary;
};
struct employee emp; //สรางตวแปร emp เปนขอมลชนดโครงสราง
struct ชอขอมลแบบโครงสราง{ ชนดของขอมลตวท 1 ชอตวแปรตวท 1;
ชนดของขอมลตวท 2 ชอตวแปรตวท 2;
ชนดของขอมลตวท n ชอตวแปรตวท n;
};
struct ชอขอมลแบบโครงสราง ชอตวแปรชนดโครงสราง[,ชอตวแปรชนดโครงสราง];
บทท 9 โครงสรางและยเนยน
311
struct student
{
char name[80+1];
long int code;
float point;
};
struct employee a; //สรางตวแปร a เปนขอมลชนดโครงสราง
struct point
{
float x,y,z;
};
struct point a[10]; //สรางตวแปร a เปนขอมลชนดโครงสรางแบบแถวลาดบ
struct Customer
{
char code[15+1];
int sex;
char name[80+1];
int age;
char address[255+1];
char phone[30+1];
};
struct Customer a,b,c; //สรางตวแปร a,b,c เปนขอมลชนดโครงสราง โดยจะ ใชเปนตวแทนของขอมลลกคาสามคน
บทท 9 โครงสรางและยเนยน
312
การประกาศขอมลแบบโครงสรางสามารถทาไดทง 2 แบบ ผ เขยนโปรแกรมสามารถเลอกประกาศแบบใดกไดแลวแตความเหมาะสม เพราะรปแบบทง 2 แบบใหความหมายทเหมอนกน
การกาหนดใหตวแปรอนๆ มชนดขอมลเหมอนกบขอมลแบบโครงสรางทประกาศไวแลว มรปแบบ คอ
ตวแปรทกาหนดใหชนดขอมลเปนโครงสรางสามารถกาหนดไดมากกวา 1 ตว โดยใชเครองหมายจลภาค (,) คนระหวางชอตวแปรชนดโครงสราง เชน
struct employee emp1 ,emp2;
หมายความวา ประกาศใหตวแปร emp1 และตวแปร emp2 เปนตวแปรชนดโครงสรางทมโครงสรางขอมลเหมอนกบชอขอมลแบบโครงสราง employee ทไดประกาศไว
9.1.2 การกาหนดคาเรมตนใหกบตวแปรภายในขอมลแบบโครงสราง การกาหนดคาเรมตนใหกบตวแปรภายในขอมลแบบโครงสราง สามารถทาไดโดยกาหนดคาเรมตนไวภายในในเครองหมายวงเลบปกกา { } และแยกคาของแตละขอมลดวยเครองหมายจลภาค (,) เชน
struct student
{
char name[15];
int score;
}std = {“Witcharkorn”, 89};
struct ชอขอมลแบบโครงสราง ชอตวแปรชนดโครงสราง[,ชอตวแปรชนดโครงสราง];
บทท 9 โครงสรางและยเนยน
313
หมายถง การกาหนดใหตวแปร std มชนดขอมลแบบโครงสราง student โดยใหตวแปรภายในขอมลแบบโครงสรางซงไดแก ตวแปร name และตวแปร score มคาเรมตนเปน
Witcharkorn และ 89 ตามลาดบ
struct employee
{
char id[10];
char name[15];
char surname[15];
char department[15];
float salary;
}emp = {“001”,”Prof.Dr.Prabhas”,”Chongstitvattana”};
หมายถง การกาหนดใหตวแปร emp มชนดขอมลแบบโครงสราง employee โดยใหตวแปรภายในขอมลแบบโครงสรางซงไดแก ตวแปร id มคาเรมตนเปน 001 ตวแปร name มคาเรมตนเปน Prof.Dr.Prabhas ตวแปร surname มคาเรมตนเปน Chongstitvattana ตวแปร department และตวแปร salary ไมไดกาหนดคาเรมตน จะถกแทนคาดวย null (\0) และ 0.0
ตามลาดบ เนองจากมชนดขอมลสายอกขระ และชนดขอมลจานวนจรงตามลาดบ
9.1.3 การเขาถงตวแปรภายในขอมลแบบโครงสราง
การเขาถงตวแปรภายในขอมลแบบโครงสรางจะขนตนดวยชอตวแปรชนดโครงสรางตามดวยเครองหมายจด (Dot Operator) และตามดวยชอสมาชกตวแปรในขอมลแบบโครงสรางนน มรปแบบดงนคอ
เชน
emp.id หมายถงรหสของพนกงาน
emp.name หมายถงชอของพนกงาน
emp.surname หมายถงนามสกลของพนกงาน
emp.department หมายถงแผนกของพนกงาน
emp.salary หมายถงเงนเดอนของพนกงาน
ชอตวแปรชนดโครงสราง.ตวแปรภายในขอมลแบบโครงสราง
บทท 9 โครงสรางและยเนยน
314
ตวอยางท 9.1 โปรแกรมแสดงการเขาถงตวแปรภายในขอมลแบบโครงสราง
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include<stdio.h> main(){ struct student{ char name[15]; int score; }std1 = {"Dr.Krit", 89},std2 = {"Witchakorn", 99}; printf("Student1\n"); printf("Name = %s\n",std1.name); printf("Score = %d\n",std1.score); printf("*********************************\n"); printf("Student2\n"); printf("Name = %s\n",std2.name); printf("Score = %d\n",std2.score); }
ผลลพธของโปรแกรม Student1 Name = Dr.Krit Score = 89 ***************************************************** Student2 Name = Witchakorn Score = 99
อธบายโปรแกรม
บรรทดท 3–6 สรางขอมลแบบโครงสรางชอ student โดยมตวแปร name และ score เปนตวแปรภายในขอมลแบบโครงสราง และกาหนดตวแปร std1 และ std2 เปนตวแปรชนดโครงสราง พรอมทงกาหนดคาเรมตนให
บรรทดท 8 แสดงคาของตวแปร name ทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร std1
บรรทดท 9 แสดงคาของตวแปร score ทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร std1
บรรทดท 12 แสดงคาของตวแปร name ทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร std2
บรรทดท 13 แสดงคาของตวแปร score ทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร std2
บทท 9 โครงสรางและยเนยน
315
ตวอยางท 9.2 โปรแกรมแสดงการเขาถงและการกาหนดคาตวแปรภายในขอมลแบบโครงสราง 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
20 21
22
#include<stdio.h> main(){ struct data{ int a; float b; char c; char d[10]; }test1,test2; test1.a=11; test1.b=11.11; test1.c='A'; strcpy(test1.d,"AAA"); test2.a=22; test2.b=22.22; test2.c='B'; strcpy(test2.d,"BBB"); printf("Test1\n"); printf("a = %d\tb = %.2f\tc = %c\td = %s\n",test1.a,test1.b,test1.c,test1.d); printf("***************************************\n"); printf("Test2\n"); printf("a = %d\tb = %.2f\tc = %c\td = %s\n",test2.a,test2.b,test2.c,test2.d); }
ผลลพธของโปรแกรม Test1 a = 11 b = 11.11 c = A d = AAA ******************************************************** Test2 a = 22 b = 22.22 c = B d = BBB
อธบายโปรแกรม
บรรทดท 3–8 สรางขอมลแบบโครงสรางชอ data โดยมตวแปร a, b, c และ d เปนตวแปรภายในขอมลแบบโครงสราง และกาหนดตวแปร test1 และ test2 เปนตวแปรชนดโครงสราง
บรรทดท 9–16 กาหนดคาใหกบตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสราง
บรรทดท 18 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร test1
บทท 9 โครงสรางและยเนยน
316
บรรทดท 21 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร test2
ตวอยางท 9.3 โปรแกรมแสดงการเขาถงและการกาหนดคาตวแปรภายในขอมลแบบโครงสราง
1 2 3 4 5 6 7 8 9 10 11
#include <stdio.h> main() { struct complex { float x,y; } a,b; a.x = 20.0f; a.y = 3.2f; b.x = 12.5f; b.y = 3.0f; printf("(20+3.2i)+(12.5+3i) = %f+%fi",a.x+b.x,a.y+b.y); }
ผลลพธของโปรแกรม (20+3.2i)+(12.5+3i) = 32.500000+6.200000i
อธบายโปรแกรม
บรรทดท 4–7 สรางขอมลแบบโครงสรางชอ complex โดยมตวแปร a, b เปนตวแปรภายในขอมลแบบโครงสราง
บรรทดท 8–9 กาหนดคาใหกบตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสราง
บรรทดท 10 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสราง
บทท 9 โครงสรางและยเนยน
317
ตวอยางท 9.4 โปรแกรมแสดงการเขาถงและการกาหนดคาตวแปรภายในขอมลแบบโครงสราง 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <stdio.h> #include <string.h> void main(void) { struct student { long int code; char name[80]; } A,B; A.code = 451350001; strcpy(A.name,"One"); B.code = 451310001; strcpy(B.name,"Two"); printf("Code : %li\tName : %s\n",A.code,A.name); printf("Code : %li\tName : %s\n",B.code,B.name); }
ผลลพธของโปรแกรม Code : 11111 Name : One Code : 22222 Name : Two
อธบายโปรแกรม
บรรทดท 5–9 สรางขอมลแบบโครงสรางชอ student โดยมตวแปร A, B เปนตวแปรภายในขอมลแบบโครงสราง
บรรทดท 10–13 กาหนดคาใหกบตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสรางโดยฟงกชน strcpy เปนฟงกชนสาหรบสาเนาขอมล
บรรทดท 14-15 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสราง
บทท 9 โครงสรางและยเนยน
318
9.1.4 การรบขอมลของตวแปรภายในขอมลแบบโครงสราง การรบขอมลจากแปนพมพสามารถใชฟงกชน gets() ในการรบขอมลสตรง และ getchar() ในการรบขอมลตวอกษรได เชน
gets(emp.name);
หมายถง การรบขอมลจากแปนพมพมาเกบไวในตวแปร name ทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร emp ซงตวแปร name จะตองเกบขอมลสตรง
std1.grade = getchar()
หมายถง การรบขอมลจากแปนพมพมาเกบไวในตวแปร grade ทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร std1 ซงตวแปร grade จะตองเกบขอมลตวอกษร
ตวอยางท 9.5 โปรแกรมแสดงการรบขอมลของตวแปรภายในขอมลแบบโครงสราง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22
#include<stdio.h> #include<stdlib.h> main(){ struct data{ int a; float b; char c[10]; char d; }test; char temp[10]; printf("Enter Integer :"); gets(temp); test.a = atoi(temp); printf("Enter Float :"); gets(temp); test.b = atof(temp); printf("Enter String :"); gets(test.c); printf("Enter Character :"); test.d = getchar(); printf("a = %d\tb = %.2f\tc = %s\td = %c\n",test.a,test.b,test.c,test.d); }
ผลลพธของโปรแกรม Enter Integer :99 Enter Float :89 Enter String :AAAA Enter Character :A a = 99 b = 89.00 c = AAAA d = A
บทท 9 โครงสรางและยเนยน
319
อธบายโปรแกรม
บรรทดท 2 ทาการรวมไฟลสวนหว stdlib.h เขาไวในการแปลโปรแกรม เพอเรยกใชฟงกชนมาตรฐาน atoi() และ atof()
บรรทดท 4–9 สรางขอมลแบบโครงสรางชอ data โดยมตวแปร a, b, c และ d เปนตวแปรภายในขอมลแบบโครงสราง และกาหนดตวแปร test เปนตวแปรชนดโครงสราง
บรรทดท 12-13 รบคาขอมลสายอกขระจากแปนพมพ เขามาเกบไวในตวแปรชวคราว ซงกาหนดเปนตวแปร temp จากนนใชฟงกชนมาตรฐาน atoi()
แปลงชนดขอมลของตวแปร temp จากสายอกขระเปนเลขจานวนเตม แลวจงเกบคาลงในตวแปร a
บรรทดท 15-16 รบคาขอมลสายอกขระจากแปนพมพ เขามาเกบไวในตวแปรชวคราว ซงกาหนดเปนตวแปร temp จากนนใชฟงกชนมาตรฐาน atof()
แปลงชนดขอมลของตวแปร temp จากสายอกขระเปนเลขจานวนจรง แลวจงเกบคาลงในตวแปร b
บรรทดท 18 รบคาขอมลสายอกขระจากแปนพมพ แลวเกบคาลงในตวแปร c
บรรทดท 20 รบคาขอมลตวอกษรจากแปนพมพ แลวเกบคาลงในตวแปร d
บรรทดท 21 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร test
การคดลอกขอมลระหวางตวแปรทมชนดขอมลแบบโครงสราง สามารถทาไดโดยใชตวดาเนนการเทากบ (=)
เชน
struct student{
char name[15];
int score;
}std1 = {“Somkantha”,90} ,std2 ={“Witchakorn”,88};
บทท 9 โครงสรางและยเนยน
320
เมอใชคาสง std1 = std2; จะไดผลลพธดงน
std1.name = Somkantha std1.score = 90
std2.name = Wilaiporn std2.score = 90
ตวอยางท 9.6 โปรแกรมแสดงการคดลอกขอมลระหวางตวแปรทมชนดขอมลแบบโครงสราง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#include<stdio.h> #include<stdlib.h> main(){ struct student{ char name[15]; int score; }std1,std2; char temp[10]; printf("Enter Name :"); gets(std1.name); printf("Enter Score :"); gets(temp); std1.score = atoi(temp); std2 = std1; printf("*********************************\n"); printf("Student1\n"); printf("Name = %s\n",std1.name); printf("Score = %d\n",std1.score); printf("*********************************\n"); printf("Student2\n"); printf("Name = %s\n",std2.name); printf("Score = %d\n",std2.score); }
ผลลพธของโปรแกรม Enter Name :Asst.Prof.Krit Enter Score :99 ********************************* Student1 Name = Asst.Prof.Krit Score = 99 ********************************* Student2 Name = Asst.Prof.Krit Score = 99
บทท 9 โครงสรางและยเนยน
321
อธบายโปรแกรม
บรรทดท 2 ทาการรวมไฟลสวนหว stdlib.h เขาไวในการแปลโปรแกรม เพอเรยกใชฟงกชนมาตรฐาน atoi()
บรรทดท 4–7 สรางขอมลแบบโครงสรางชอ student โดยมตวแปร name และ score เปนตวแปรภายในขอมลแบบโครงสราง และกาหนดตวแปร std1 และ std2 เปนตวแปรชนดโครงสราง
บรรทดท 10 รบคาขอมลสตรงจากแปนพมพ แลวเกบคาลงในตวแปร name
บรรทดท 12-13 รบคาขอมลสตรงจากแปนพมพ เขามาเกบไวในตวแปรชวคราว ซงกาหนดเปนตวแปร temp จากนนใชฟงกชนมาตรฐาน atoi() แปลงชนดขอมลของตวแปร temp จากสตรงเปนเลขจานวนเตม แลวจงเกบคาลงในตวแปร score
บรรทดท 14 คดลอกขอมลของตวแปร std1 ไปยงตวแปร std2
9.1.5 ขอมลแบบโครงสรางซอนขอมลแบบโครงสราง จากเนอหาทผานมาชนดขอมลแบบโครงสรางสามารถประกอบดวยสมาชกตางๆ ทมชนดขอมลทแตกตางกนได แตนอกเหนอจากการกาหนดตวแปรดงกลาวยงสามารถนาโครงสรางหนงใหเปนสมาชกของโครงสรางตวอนไดดวย เปรยบเสมอนการซอนกนของโครงสราง ซงเราเรยกวาขอมลแบบโครงสรางซอนขอมลแบบโครงสราง โดยสามารถกาหนดขอมลแบบโครงสรางเปนสมาชกของขอมลแบบโครงสรางไดเชน
struct score{
int midterm;
int final;
};
struct student{
char name[15];
char surname[15];
struct score s;
}std1;
บทท 9 โครงสรางและยเนยน
322
สามารถกาหนดคาเรมตนใหกบขอมลแบบโครงสรางซอนขอมลแบบโครงสราง เชน
struct score{
int midterm;
int final;
};
struct student{
char name[15];
char surname[15];
struct score s;
}std1 = {“Krit”,”Somkantha”,{66,28}};
การเขาถงสมาชกขอมลแบบโครงสรางซอนขอมลแบบโครงสรางมรปแบบ คอ
ดงเชน
struct_var.nest_struct_var.mem_nest_struct_var
โดย struct_var คอตวแปรชนดโครงสราง nest_struct_var คอตวแปรชนดโครงสรางทซอนอยในขอมลแบบโครงสราง
mem_nest_struct_var คอสมาชกหรอตวแปรของขอมลแบบโครงสรางทซอนอยในขอมลแบบโครงสราง
เชน
struct score{
int midterm;
int final;
};
ชอตวแปรชนดโครงสราง.ตวแปรชนดโครงสรางทซอนอยในขอมลแบบโครงสราง.สมาชกหรอตวแปรของขอมลแบบโครงสรางทซอนอยในขอมลแบบโครงสราง
บทท 9 โครงสรางและยเนยน
323
struct student{
char name[15];
char surname[15];
struct score s;
}std1 = {“Krit”,”Somkantha”,{66,28}};
เมอระบ std1.name จะไดคาคอ Krit
เมอระบ std1.surname จะไดคาคอ Somkantha
เมอระบ std1.s จะไดคาคอ 66 และ 28 ซงเปนคาของสมาชกหรอตวแปรทกตวของขอมลแบบโครงสราง score
เมอระบ std1.s.midterm จะไดคาคอ 66 ซงเปนคาของสมาชกหรอตวแปร midterm
ของขอมลแบบโครงสราง score
เมอระบ std1.s.final จะไดคาคอ 28 ซงเปนคาของสมาชกหรอตวแปร midtermของขอมลแบบโครงสราง score
ตวอยางท 9.7 โปรแกรมแสดงการใชขอมลแบบโครงสรางซอนขอมลแบบโครงสราง 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23
24
#include<stdio.h> main(){ struct score{ int midterm; int final; }; struct student{ char name[15]; char surname[15]; struct score s; }std1 = {"Krit","Somkantha",{66,28}},std2 = {"Witchakorn","Somkantha",{68,29}}; printf("Student1\n"); printf("Name = %s\n",std1.name); printf("Surname = %s\n",std1.surname); printf("Midterm = %d\n",std1.s.midterm); printf("Final = %d\n",std1.s.final); printf("Total score = %d\n",std1.s.midterm+std1.s.final); printf("****************************\n"); printf("Student2\n"); printf("Name = %s\n",std2.name); printf("Surname = %s\n",std2.surname); printf("Midterm and Final = %d and %d\n",std2.s); printf("Total score = %d\n",std2.s.midterm+std2.s.final); }
บทท 9 โครงสรางและยเนยน
324
ผลลพธของโปรแกรม Student1 Name = Krit Surname = Somkantha Midterm = 66 Final = 28 Total score = 94 **************************** Student2 Name = Witchakorn Surname = Somkantha Midterm and Final = 68 and 29 Total score = 97
อธบายโปรแกรม
บรรทดท 3–6 สรางขอมลแบบโครงสรางชอ score โดยมตวแปร midterm และ final เปนตวแปรภายในขอมลแบบโครงสราง
บรรทดท 7–11 สรางขอมลแบบโครงสรางชอ student โดยมตวแปร name,
surname และตวแปร s ทมชนดขอมลแบบโครงสราง เปนตวแปรภายในขอมลแบบโครงสราง และกาหนดตวแปร std1 และ std2 เปนตวแปรชนดโครงสราง โดยมการกาหนดคาเรมตนของตวแปร std1
และ std2
บรรทดท 13-17 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร std1
บรรทดท 20-23 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสรางภายใตตวแปร std2
บทท 9 โครงสรางและยเนยน
325
9.1.6 แถวลาดบกบขอมลแบบโครงสราง การสรางตวแปรแถวลาดบใหมชนดขอมลแบบโครงสราง มรปแบบ คอ
การเขาถงสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบโครงสราง มรปแบบ คอ
เชน struct employee{
char id[10];
char name[15];
char surname[15];
char department[15];
float salary;
}emp[10];
emp[4].id คอการเขาถงรหสของพนกงานคนท 5
emp[9].department คอการเขาถงแผนกของพนกงานคนท 10
emp[0].name คอการเขาถงชอของพนกงานคนท 1
struct ชอขอมลแบบโครงสราง{ ชนดของขอมลตวท 1 ชอตวแปรตวท 1;
ชนดของขอมลตวท 2 ชอตวแปรตวท 2;
ชนดของขอมลตวท n ชอตวแปรตวท n;
}ชอตวแปรชนดโครงสราง[ขนาดของแถวลาดบ];
ชอตวแปรชนดโครงสราง[ดรรชน].ชอสมาชกของขอมลแบบโครงสราง
บทท 9 โครงสรางและยเนยน
326
ตวอยางท 9.8 โปรแกรมแสดงการสรางตวแปรแถวลาดบใหมชนดขอมลแบบโครงสราง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
#include<stdio.h> #include<stdlib.h> main(){ struct student{ char name[15]; int score; }std1[5]; char temp[10]; int i,sum=0; float avg; for(i=0;i<5;i++){ printf("Enter Name[%d] :",i+1); gets(std1[i].name); printf("Enter Score[%d] :",i+1); gets(temp); std1[i].score = atoi(temp); sum = sum + std1[i].score; } avg = sum/5; printf("*********************************\n"); for(i=0;i<5;i++){ printf("Student[%d]\n",i+1); printf("\tName = %s\n",std1[i].name); printf("\tScore = %d\n",std1[i].score); } printf("*********************************\n"); printf("Average Score = %.2f\n",avg); }
ผลลพธของโปรแกรม Enter Name[1] :Inson Enter Score[1] : 89 Enter Name[2] :Ahumporn Enter Score[2] :67 Enter Name[3] :Prawphan Enter Score[3] :78 Enter Name[4] :Krit Enter Score[4] :65 Enter Name[5] :Witchakorn Enter Score[5] :99 ******************************************************** Student[1] Name = Inson Score = 89 Student[2] Name = Ahumporn Score = 67 Student[3] Name = Prawphan Score = 78
บทท 9 โครงสรางและยเนยน
327
Student[4] Name = Krit Score = 65 Student[5] Name = Witchakorn Score = 99 ******************************************************** Average Score = 79.00
อธบายโปรแกรม
บรรทดท 4 – 7 สรางขอมลแบบโครงสรางชอ student โดยมตวแปร name และ score เปนตวแปรภายในขอมลแบบโครงสราง และกาหนดใหตวแปร std เปนตวแปรแถวลาดบขนาด 5 ชอง ใหเปนตวแปรชนดโครงสราง
บรรทดท 11–18 วนซารบคาสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบโครงสราง จานวน 5 รอบ เพอหาคะแนนเฉลยของนกศกษาทง 5 คน
บรรทดท 21–25 วนซาแสดงคาสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบโครงสราง จานวน 5 รอบ
บรรทดท 27 แสดงคะแนนเฉลย
ตวอยางท 9.9 โปรแกรมแสดงการสรางตวแปรแถวลาดบใหมชนดขอมลแบบโครงสราง 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <stdio.h> #include <stdlib.h> main() { int i; struct student { long int code; char name[80+1]; }; struct student cpe[5]; for(int i=0;i<5;i++) { printf("Input Code Student NO.%i : ",i+1); scanf("%li",&cpe[i].code); printf("Input name student NO.%i : ",i+1); scanf("%80s",&cpe[i].name); } for(i=0;i<5;i++) { printf("Code : %li\t",cpe[i].code); printf("Name : %s\n",cpe[i].name); } }
บทท 9 โครงสรางและยเนยน
328
ผลลพธของโปรแกรม Input Code Student NO.1 : 0001 Input name student NO.1 : Asst.Prof.Dr.Krit Input Code Student NO.2 : 0002 Input name student NO.2 : Prof.Dr.Boontee Input Code Student NO.3 : 0003 Input name student NO.3 : Prof.Dr.Niphon Input Code Student NO.4 : 0004 Input name student NO.4 : Prof.Dr.Prabhas Input Code Student NO.5 : 0005 Input name student NO.5 : Prof.Dr.Chidchanok Code : 1 Name : Asst.Prof.Dr.Krit Code : 2 Name : Prof.Dr.Boontee Code : 3 Name : Prof.Dr.Niphon Code : 4 Name : Prof.Dr.Prabhas Code : 5 Name : Prof.Dr.Chidchanok
อธบายโปรแกรม
บรรทดท 6 –10 สรางขอมลแบบโครงสรางชอ student โดยมตวแปร code และ name เปนตวแปรภายในขอมลแบบโครงสราง
บรรทดท 11 กาหนดใหตวแปร cpe เปนตวแปรแถวลาดบขนาด 5 ชอง ใหเปนตวแปรชนดโครงสราง
บรรทดท 12-18 วนซา รบคาสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบโครงสราง จานวน 5 รอบ เพอรบคา code และ name
บรรทดท 19-23 วนซาแสดงคาสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบโครงสราง จานวน 5 รอบ
บทท 9 โครงสรางและยเนยน
329
ตวอยางท 9.10 โปรแกรมแสดงการสรางตวแปรแถวลาดบใหมชนดขอมลแบบโครงสรางโดยการกาหนดคาเรมตนใหกบแถวลาดบของตวแปรโครงสราง
1 2 3 4 5 6 7 8 9
10 11 12
#include <stdio.h> main() { struct student { long int code; char name[80]; }; struct student s[2] = { {36000001,"One"}, {36000002,"Two"} }; printf("Code : %li\tName : %s\n",s[0].code,s[0].name); printf("Code : %li\tName : %s\n",s[1].code,s[1].name); }
ผลลพธของโปรแกรม Code : 36000001 Name : One Code : 36000002 Name : Two
อธบายโปรแกรม
บรรทดท 4 –9 สรางขอมลแบบโครงสรางชอ student โดยมตวแปร code และ name เปนตวแปรภายในขอมลแบบโครงสราง
บรรทดท 9 กาหนดใหตวแปร s เปนตวแปรแถวลาดบขนาด 2 ชอง ใหเปนตวแปรชนดโครงสราง และกาหนดคาเรมตนใหกบแถวลาดบของตวแปรโครงสราง
บทท 9 โครงสรางและยเนยน
330
9.2 ยเนยน (Unions)
9.2.1 ความหมายและการประกาศขอมลแบบยเนยน
ยเ นยนจะมความคลายคลงกบ ขอมลชนดของโครงสรางแตแตกตางกน ทหนวยความจาทใชในการเกบขอมลโดยขอมลแบบยเนยนตวแปรหลายตวสามารถใชหนวยความจารวมกนได จากขอมลชนดโครงสรางทไดศกษาในเนอหากอนหนานสมาชกแตละตวจะใชหนวยความจาในการจดเกบขอมลทแยกกน ดงรปตวอยางการเปรยบเทยบการเกบขอมลชนดของโครงสรางและชนดของยเนยน
รปท 9.1 โครงสรางการจดเกบขอมลชนดโครงสราง
รปท 9.2 โครงสรางการจดเกบขอมลชนดยเนยน
บทท 9 โครงสรางและยเนยน
331
ยเนยนจะพจารณาขนาดของสมาชกของตวแปรแตละตววาตวไหนมคาขนาดของขอมลมากทสด กจะกระทาการจองพนทเทากบขนาดของตวแปรทมคามากทสด ทาใหการใชงานประหยดหนวยความจาไดดกวาการประกาศตวแปรชนดโครงสราง
สงสาคญทขอมลแบบยเนยนแตกตางจากขอมลแบบโครงสรางคอวธการจดการหนวยความจา โดยการจดการหนวยความจาของยเนยนจะใชพนทหนวยความจาเดยวกน
สมาชกทกตวจะใชพนทหนวยความจาเดยวกน ทาใหตวแปรชนดยเนยนสามารถใชสมาชกไดทละตวเทานน ดวยเหตนทาใหขนาดหนวยความจาของตวแปรยเนยนนอยกวาแบบโครงสรางทมสมาชกเหมอนกนเสมอ โดยขนาดหนวยความของยเนยนจะเทากบขนาดหนวยความจาสงสดของสมาชกใดๆ ในขณะทขอมลแบบโครงสรางจะใชหนวยความจาเทากบจานวนหนวยความจาทสมาชกทกตวรวมกน
การประกาศตวแปรประเภทยเนยนสามารถกระทาไดเชนเดยวกนกบการประกาศขอมลมลแบบโครงสรางดงน
รปแบบท 1
ตวแปรทกาหนดใหชนดขอมลเปนยเนยนสามารถกาหนดไดมากกวา 1 ตว โดยใชเครองหมายจลภาค (,) คนระหวางชอตวแปรชนดยเนยนเชน
union ชอขอมลแบบยเนยน{
ชนดของขอมลตวท 1 ชอตวแปรตวท 1;
ชนดของขอมลตวท 2 ชอตวแปรตวท 2;
ชนดของขอมลตวท n ชอตวแปรตวท n;
}ชอตวแปรชนดยเนยน[,ชอตวแปรชนดยเนยน,ชอตวแปรชนดยเนยน];
บทท 9 โครงสรางและยเนยน
332
union employee //สรางตวแปร emp เปนขอมลชนดยเนยน
{
char id[10];
char name[15];
char surname[15];
char department[15];
float salary;
}emp;
union student
{
char name[80+1];
long int code;
float point;
} a;
//สรางตวแปร a เปนขอมลชนดยเนยน
union complex
{
float r,i;
} a,b,c;
//สรางตวแปร a,b,c เปนขอมลชนดยเนยน โดยจะใชเปนตวแทนของจานวนเชงซอนสามจานวน
union Customer
{
char code[15+1];
int sex;
char name[80+1];
int age;
char address[255+1];
char phone[30+1];
} p,q,r;
//สรางตวแปร p,q,r เปนขอมลชนดยเนยน โดยจะใชเปนตวแทนของขอมลลกคาคาสามคน
บทท 9 โครงสรางและยเนยน
333
รปแบบท 2
เชน
union employee
{
char id[10];
char name[15];
char surname[15];
char department[15];
float salary;
};
union employee emp; //สรางตวแปร emp เปนขอมลชนดยเนยน
union student
{
char name[80+1];
long int code;
float point;
};
union employee a; //สรางตวแปร a เปนขอมลชนดยเนยน
union ชอขอมลแบบยเนยน{
ชนดของขอมลตวท 1 ชอตวแปรตวท 1;
ชนดของขอมลตวท 2 ชอตวแปรตวท 2;
ชนดของขอมลตวท n ชอตวแปรตวท n;
};
struct ชอขอมลแบบยเนยน ชอตวแปรชนดยเนยน[,ชอตวแปรชนดยเนยน];
บทท 9 โครงสรางและยเนยน
334
union point
{
float x,y,z;
};
union point a[10]; //สรางตวแปร a เปนขอมลชนดยเนยนแบบแถวลาดบ
union Customer
{
char code[15+1];
int sex;
char name[80+1];
int age;
char address[255+1];
char phone[30+1];
};
union Customer a,b,c; //สรางตวแปร a,b,c เปนขอมลชนดยเนยน โดยจะ ใชเปนตวแทนของขอมลลกคาคาสามคน
การประกาศขอมลแบบยเนยนสามารถทาไดทง 2 แบบ ผ เขยนโปรแกรมสามารถเลอกประกาศแบบใดกไดแลวแตความเหมาะสม เพราะรปแบบทง 2 แบบใหความหมายทเหมอนกน
การกาหนดใหตวแปรอนๆ มชนดขอมลเหมอนกบขอมลแบบยเนยนทประกาศไวแลว มรปแบบ คอ
ตวแปรทกาหนดใหชนดขอมลเปนยเนยนสามารถกาหนดไดมากกวา 1 ตว โดยใชเครองหมายจลภาค (,) คนระหวางชอตวแปรชนดยเนยน
union ชอขอมลแบบยเนยน ชอตวแปรชนดยเนยน[,ชอตวแปรชนดยเนยน];
บทท 9 โครงสรางและยเนยน
335
เชน
union employee emp1 ,emp2;
หมายความวา ประกาศใหตวแปร emp1 และตวแปร emp2 เปนตวแปรชนดยเนยนทมโครงสรางขอมลเหมอนกบชอขอมลแบบยเนยน employee ทไดประกาศไว
ตวอยางท 9.11 โปรแกรมแสดงการใชหนวยความจาของตวแปรชนดยเนยนและโครงสราง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include<stdio.h> main(){ struct st_struct { long int code; int num; char name[80+1]; }; union st_union { long int code; int num; char name[80+1]; }; printf("sizeof(long int) = %i\n",sizeof(long int)); printf("sizeof(int) = %i\n",sizeof(int)); printf("sizeof(char [80+1])=%i\n",sizeof(char [80+1])); printf("sizeof(st_struct) = %i\n",sizeof(st_struct)); printf("sizeof(st_union) = %i\n",sizeof(st_union)); }
ผลลพธของโปรแกรม sizeof(long int) = 4 sizeof(int) = 2 sizeof(char [80+1]) = 81 sizeof(st_struct) = 87 sizeof(st_union) = 81
จากโปรแกรมแสดงใหเหนวาตวแปรชนดและยเนยนมขนาดของขอมลทแตกตางกนโดยขนาดของตวแปรชนดขอมลแบบโครงสรางจะมขนาดขอมลทใหญกวานนคอ 87 สวน
ขนาดของตวแปรชนดขอมลแบบยเนยนจะมขนาดขอมล 81 นนกคอขนาดสงสดของการประกาศตวแปร char name[80+1] ซงกคอ 81 นนเอง
บทท 9 โครงสรางและยเนยน
336
อธบายโปรแกรม
บรรทดท 3–8 สรางขอมลแบบโครงสรางชอ st_struct
บรรทดท 9–14 สรางขอมลแบบยเนยนชอ st_union
บรรทดท 18-20 แสดงคาขนาดของขอมลแตละชนด
9.2.2 การกาหนดคาเรมตนใหกบตวแปรภายในขอมลแบบยเนยน
การกาหนดคาเรมตนใหกบตวแปรภายในขอมลแบบยเนยน สามารถทาไดโดยกาหนดคาเรมตนไวภายในในเครองหมายวงเลบปกกา { } โดยชนดขอมลแบบยเนยนจะสามารถกาหนดไดทละ 1 ตวเทานน เนองจากหนวยความจาของยเนยนจะใชพนทหนวยความจาเดยวกน ดงนนสมาชกทกตวจะใชพนทหนวยความจาเดยวกน ทาใหตวแปรชนดยเนยนสามารถใชสมาชกไดทละตวเทานน
union student
{
char name[15];
int score;
}std = {“Witcharkorn”};
หมายถง การกาหนดใหตวแปร std มชนดขอมลแบบยเนยน student โดยใหตวแปรภายในขอมลแบบยเนยนซงไดแก ตวแปร name และตวแปร score มคาเรมตนเปน
Witcharkorn
union student
{
char name[15];
int score;
}std = {99};
หมายถง การกาหนดใหตวแปร std มชนดขอมลแบบยเนยน student โดยใหตวแปรภายในขอมลแบบยเนยนซงไดแก ตวแปร name และตวแปร score มคาเรมตนเปน 99
บทท 9 โครงสรางและยเนยน
337
9.2.3 การเขาถงตวแปรภายในขอมลแบบยเนยน
การเขาถงตวแปรภายในขอมลแบบยเนยนจะขนตนดวยชอตวแปรชนดยเนยนตามดวยเครองหมายจด (Dot Operator) และตามดวยชอสมาชกตวแปรในขอมลแบบยเนยนนน
จากวธการเขาถงตวแปรสงเกตไดวาจะมวธการเขาถงเหมอนกบการเขาถงตวแปรภายในขอมลแบบโครงสราง แตควรสงเกตวายเนยนจะใชหนวยความจารวมกนดงนนจะมขอแตกตางบางประการระหวางขอมลแบบยเนยนและแบบโครงสราง โดยการเขาถงตวแปรภายในขอมลแบบยเนยนมรปแบบดงนคอ
เชน
emp.id หมายถงรหสของพนกงาน
emp.name หมายถงชอของพนกงาน
ตวอยางท 9.12 โปรแกรมแสดงการเขาถงตวแปรภายในขอมลแบบยเนยน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<stdio.h> #include<string.h> main(){ union student{ char name[15]; int score; }std1,std2; strcpy(std1.name,"Dr.Krit"); std1.score = 89; strcpy(std2.name,"Witcharkorn"); std2.score = 99; printf("Student1\n"); printf("Name = %s\n",std1.name); printf("Score = %d\n",std1.score); printf("*********************************\n"); printf("Student2\n"); printf("Name = %s\n",std2.name); printf("Score = %d\n",std2.score); }
ผลลพธของโปรแกรม Student1 Name = Y Score = 89 *********************************
ชอตวแปรชนดยเนยน.ตวแปรภายในขอมลแบบยเนยน
บทท 9 โครงสรางและยเนยน
338
Student2 Name = c Score = 99
สงเกตผลลพธจากโปรแกรมแสดงใหเหนวา Name จะแสดงผลลพธทผดพลาดซงผลลพธแสดงตางจากคาทตองการทงนเนองจากเรมแรกหนวยความจาจะเกบตวแปรประเภทสายอกขระกอนจากนนกจะเกบตวแปรจานวนเตม ซงตวแปรจานวนเตมจะไปแทนทในสวนของหนวยความจาทาใหคาทไดผดพลาด ดงนนในการใชควรระวงการใชงานใหจาไวเสมอวา หนวยความจาของยเนยนจะใชพนทหนวยความจาเดยวกน ดงนนสมาชกทกตวจะใชพนทหนวยความจาเดยวกน ทาใหตวแปรชนดยเนยนสามารถใชสมาชกไดทละตวเทานน
อธบายโปรแกรม
บรรทดท 4–7 สรางขอมลแบบยเนยนชอ student โดยมตวแปร name และ score
เปนตวแปรภายในขอมลแบบยเนยน และกาหนดตวแปร std1 และ std2 เปนตวแปรชนดยเนยน
บรรทดท 8–11 กาหนดคาเรมตนใหขอมลชนดยเนยน
บรรทดท 13 แสดงคาของตวแปร name ทเปนสมาชกของขอมลแบบยเนยนภายใตตวแปร std1
บรรทดท 14 แสดงคาของตวแปร score ทเปนสมาชกของขอมลแบบยเนยนภายใตตวแปร std1
บรรทดท 17 แสดงคาของตวแปร name ทเปนสมาชกของขอมลแบบยเนยนภายใตตวแปร std2
บรรทดท 18 แสดงคาของตวแปร score ทเปนสมาชกของขอมลแบบยเนยนภายใตตวแปร std2
บทท 9 โครงสรางและยเนยน
339
ตวอยางท 9.13 โปรแกรมแสดงการเขาถงและการกาหนดคาตวแปรภายในขอมลแบบยเนยน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#include <stdio.h> #include <string.h> void main(void) { struct student2 { long int code; char name[80]; } A,B; union student1 { long int code; char name[80]; } C,D; //Structure A.code = 551350001; strcpy(A.name,"One"); B.code = 551310002; strcpy(B.name,"Two"); printf("Code : %li\tName : %s\n",A.code,A.name); printf("Code : %li\tName : %s\n",B.code,B.name); //Union C.code = 551350001; printf("Code : %li\t",C.code); strcpy(C.name,"One"); printf("Name : %s\n",C.name); D.code = 551310002; printf("Code : %li\t",D.code); strcpy(D.name,"Two"); printf("Name : %s\n",D.name); }
ผลลพธของโปรแกรม Code : 551350001 Name : One Code : 551310002 Name : Two Code : 551350001 Name : One Code : 551310002 Name : Two
จากตวอยางของโจทยในสวนของลกษณะขอมลตวแปรแบบยเนยนจะเปนการใชหนวยความจารวมกนดงนนจะมเพยงสมาชกเพยงตวเดยวเทานนทใชหนวยความจาในขณะนน หากตองการแสดงผลลพธควรจะสงพมพคาของสมาชกตวดงกลาวกอนแลวคอย
บทท 9 โครงสรางและยเนยน
340
กาหนดคาใหกบสมาชกตวอนตอไป ดงแสดงในตวอยางโปรแกรมในบรรทดท 25-33 ดงนนการใชตวแปรประเภทนจงควรระวงเปนพเศษ
อธบายโปรแกรม
บรรทดท 5–9 สรางขอมลแบบโครงสรางชอ student1 โดยม A, B เปนตวแปรชนดขอมลแบบโครงสราง
บรรทดท 10–14 สรางขอมลแบบยเนยนชอ student2 โดยม C, D เปนตวแปรชนดขอมลแบบยเนยน
บรรทดท 17-22 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบโครงสราง บรรทดท 25-33 แสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบยเนยน
9.2.4 การรบขอมลของตวแปรภายในขอมลแบบยเนยน
การรบขอมลจากแปนพมพสามารถใชฟงกชน gets() ในการรบขอมลสตรง และ getchar() ในการรบขอมลตวอกษรได เชนเดยวกนกบตวแปรชนดโครงสราง เชน
gets(emp.name);
หมายถง การรบขอมลจากแปนพมพมาเกบไวในตวแปร name ทเปนสมาชกของขอมลแบบยเนยนภายใตตวแปร emp ซงตวแปร name จะตองเกบขอมลสตรง
std1.grade = getchar()
หมายถง การรบขอมลจากแปนพมพมาเกบไวในตวแปร grade ทเปนสมาชกของขอมลแบบยเนยนภายใตตวแปร std1 ซงตวแปร grade จะตองเกบขอมลตวอกษร
บทท 9 โครงสรางและยเนยน
341
ตวอยางท 9.14 โปรแกรมแสดงการรบขอมลของตวแปรภายในขอมลแบบยเนยน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
#include<stdio.h> #include<stdlib.h> main(){ struct data{ int a; float b; char c[10]; char d; }test; char temp[10]; printf("Enter Integer :"); gets(temp); test.a = atoi(temp); printf("a = %d\n",test.a); printf("Enter Float :"); gets(temp); test.b = atof(temp); printf("b = %.2f\n",test.b); printf("Enter String :"); gets(test.c); printf("c = %s\n",test.c); printf("Enter Character :"); test.d = getchar(); printf("d = %c\n",test.d); }
ผลลพธของโปรแกรม Enter Integer :99 a = 99 Enter Float :88.88 b = 88.88 Enter String :Hello Dr. c = Hello Dr. Enter Character :A d = A
อธบายโปรแกรม
บรรทดท 2 ทาการรวมไฟลสวนหว stdlib.h เขาไวในการแปลโปรแกรม เพอเรยกใชฟงกชนมาตรฐาน atoi() และ atof()
บทท 9 โครงสรางและยเนยน
342
บรรทดท 4–9 สรางขอมลแบบยเนยนชอ data โดยมตวแปร a, b, c และ d เปนตวแปรภายในขอมลแบบยเนยน และกาหนดตวแปร test เปนตวแปรชนดยเนยน
บรรทดท 10-14 รบคาขอมลสายอกขระจากแปนพมพ เขามาเกบไวในตวแปรชวคราว ซงกาหนดเปนตวแปร temp จากนนใชฟงกชนมาตรฐาน atoi()
แปลงชนดขอมลของตวแปร temp จากสายอกขระเปนเลขจานวนเตม แลวจงเกบคาลงในตวแปร a และสดทายแสดงคาตวแปรททาการรบคาเขามา
บรรทดท 16-19 รบคาขอมลสายอกขระจากแปนพมพ เขามาเกบไวในตวแปรชวคราว ซงกาหนดเปนตวแปร temp จากนนใชฟงกชนมาตรฐาน atof()
แปลงชนดขอมลของตวแปร temp จากสายอกขระเปนเลขจานวนจรง แลวจงเกบคาลงในตวแปร b และสดทายแสดงคาตวแปรททาการรบคาเขามา
บรรทดท 21-23 รบคาขอมลสายอกขระจากแปนพมพ แลวเกบคาลงในตวแปร c
และสดทายแสดงคาตวแปรททาการรบคาเขามา บรรทดท 25-27 รบคาขอมลตวอกษรจากแปนพมพ แลวเกบคาลงในตวแปร d และ
สดทายแสดงคาตวแปรททาการรบคาเขามา
9.2.5 ขอมลแบบยเนยนซอนขอมลแบบยเนยน
จากเนอหาทผานมาชนดขอมลแบบยเนยนสามารถประกอบดวยสมาชกตางๆ ทมชนดขอมลทแตกตางกนได แตนอกเหนอจากการกาหนดตวแปรดงกลาวยงสามารถนายเนยนหนงใหเปนสมาชกของยเนยนตวอนไดดวย เปรยบเสมอนการซอนกนของยเนยน ซงจะมความคลายคลงเชนเดยวกบโครงสรางซอนโครงสราง แตเรามกจะไมนยมการทายเนยนซอนยเนยนเนองจากหนวยความจาของยเนยนจะใชพนทหนวยความจาเดยวกน ดงนนสมาชกทกตวจะใชพนทหนวยความจาเดยวกน ทาใหตวแปรชนดยเนยนสามารถใชสมาชกไดทละตวเทานน ซงการใชงานจะตองใชอยางระมดระวงไมเชนนนแลวจะเกดความผดพลาดของขอมล สวนการเขาถงสมาชกขอมลแบบยเนยนซอนขอมลแบบยเนยนมรปแบบเชนเดยวกนกบขอมลแบบโครงสราง
บทท 9 โครงสรางและยเนยน
343
ตวอยางท 9.15 โปรแกรมแสดงการใชขอมลแบบยเนยนซอนขอมลแบบยเนยน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<stdio.h> main(){ union score{ int midterm; int final; }; union student{ union score s; }std1,std2; std1.s.midterm = 50; printf("Midterm = %d\n",std1.s.midterm); std1.s.final = 30; printf("Final = %d\n",std1.s.final); printf("Total score = d\n",std1.s.midterm+std1.s.final); printf("****************************\n"); }
ผลลพธของโปรแกรม Midterm = 50 Final = 30 Total score = 60 ****************************
สงเกตในสวนของ Total score = 60 จะมความผดพลาด ซงในการเขยนโปรกรมจะตองระวงขอผดพลาดในสวนน ทาใหลกษณะการทางานในรปแบบนไมเปนทนยมนกในหมนกเขยนโปรแกรม ถงแมวาจะเปนการประหยดหนวยความจาแตกอาจจะทาใหมความผดพลาดของขอมลเกดขนได
อธบายโปรแกรม
บรรทดท 3–6 สรางขอมลแบบยเนยนชอ score โดยมตวแปร midterm และ final
เปนตวแปรภายในขอมลแบบยเนยน
บรรทดท 7–9 สรางขอมลแบบยเนยน ชอ student โดยมตวแปร s ทมชนดขอมลแบบยเนยน เปนตวแปรภายในขอมลแบบยเนยน และกาหนดตวแปร std1 และ std2 เปนตวแปรชนดยเนยน
บรรทดท 11-18 กาหนดคาใหกบตวแปรชนดยเนยนและแสดงคาของตวแปรแตละตวทเปนสมาชกของขอมลแบบยเนยน
บทท 9 โครงสรางและยเนยน
344
9.2.6 แถวลาดบกบขอมลแบบยเนยน
การสรางตวแปรแถวลาดบใหมชนดขอมลแบบยเนยน มรปแบบ คอ
การเขาถงสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบยเนยน มรปแบบ คอ
เชน union employee{
char id[10];
char name[15];
char surname[15];
char department[15];
float salary;
}emp[10];
emp[4].id คอการเขาถงรหสของพนกงานคนท 5
emp[9].department คอการเขาถงแผนกของพนกงานคนท 10
emp[0].name คอการเขาถงชอของพนกงานคนท 1
union ชอขอมลแบบยเนยน{
ชนดของขอมลตวท 1 ชอตวแปรตวท 1;
ชนดของขอมลตวท 2 ชอตวแปรตวท 2;
ชนดของขอมลตวท n ชอตวแปรตวท n;
}ชอตวแปรชนดยเนยน[ขนาดของแถวลาดบ];
ชอตวแปรชนดยเนยน[ดรรชน].ชอสมาชกของขอมลแบบยเนยน
บทท 9 โครงสรางและยเนยน
345
ตวอยางท 9.16 โปรแกรมแสดงการสรางตวแปรแถวลาดบใหมชนดขอมลแบบยเนยน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include<stdio.h> #include<stdlib.h> main(){ union student{ int score; }std1[5]; char temp[10]; int i,sum=0; float avg; for(i=0;i<3;i++){ printf("Enter Score[%d] :",i+1); gets(temp); std1[i].score = atoi(temp); sum = sum + std1[i].score; } avg = sum/3; printf("*********************************\n"); for(i=0;i<3;i++){ printf("Student[%d]\n",i+1); printf("\tScore = %d\n",std1[i].score); } printf("*********************************\n"); printf("Average Score = %.2f\n",avg); }
ผลลพธของโปรแกรม Enter Score[1] :80 Enter Score[2] :90 Enter Score[3] :100 ********************************* Student[1] Score = 80 Student[2] Score = 90 Student[3] Score = 100 ********************************* Average Score = 90.00
อธบายโปรแกรม
บรรทดท 4–6 สรางขอมลแบบยเนยนชอ student โดยมตวแปร score เปนตวแปรภายในขอมลแบบยเนยนและกาหนดใหตวแปร std เปนตวแปรแถวลาดบขนาด 5 ชอง ใหเปนตวแปรชนดยเนยน
บทท 9 โครงสรางและยเนยน
346
บรรทดท 10–15วนซารบคาสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบยเนยน
จานวน 3 รอบ เพอหาคะแนนเฉลยของนกศกษาทง 3 คน
บรรทดท 17–21วนซาแสดงคาสมาชกของตวแปรแถวลาดบทมชนดขอมลแบบยเนยน
จานวน 3 รอบ
บรรทดท 23 แสดงคะแนนเฉลย
บทท 9 โครงสรางและยเนยน
347
บทสรป
ในบทนไดกลาวถงขอมลแบบโครงสรางและขอมลแบบยเนยนโดยขอมลแบบโครงสรางคอการรวมกลมของขอมลทมชนดขอมลแตกตางกน แตมความสมพนธกน มาเกบเขาไวภายในโครงสรางเดยวกนภายใตชอเพยงชอเดยว ดงเชนการเกบขอมลของนกศกษาของแตละคนอาจจะมขอมลในการจดเกบคอ ชอ นามสกล รหสนกศกษา เกรดเฉลย ประวตนกศกษา เปนตน การนาเอาขอมลตางๆ มารวมไวภายในโครงสรางเดยวกนเพอความเหมาะสมในการเขยนโปรแกรมเปนหมวดหมสงผลทาใหการเขยนโปรแกรมมประสทธภาพมากยงขน ขอมลแบบยเนยนจะมความคลายคลงกบขอมลชนดของโครงสรางแตแตกตางกนทหนวยความจาทใชในการเกบขอมลโดยขอมลแบบยเนยนตวแปรหลายตวสามารถใชหนวยความจารวมกนได สวนขอมลแบบโครงสรางสมาชกแตละตวจะใชหนวยความจาในการจดเกบขอมลทแยกกนสงผลทาใหมการใชหนวยความจาทนอยกวาขอมลแบบโครงสราง แตอยางไรกตามขอมลแบบยเนยนไมเปนทนยมใชกนเนองจากหนวยความจาของขอมลแบบยเนยนจะใชพนทหนวยความจาเดยวกน ดงนนสมาชกทกตวจะใชพนทหนวยความจาเดยวกน
ทาใหตวแปรชนดยเนยนสามารถใชสมาชกไดทละตวเทานนไมสามารถใชพรอมกนได เพราะถาใชพรอมกนจะเกดการซาซอนของขอมลสงผลทาใหขอมลมความผดพลาด
บทท 9 โครงสรางและยเนยน
348
แบบฝกหดทบทวน
1. ขอมลแบบโครงสรางคออะไรจงอธบายพรอมยกตวอยาง 2. จงอธบายขอดของการเขยนโปรแกรมแบบโครงสรางและประโยชน
3. จงสรางขอมลชนดโครงสรางทมลกษณะดงน
3.1 เศษสวน ซงประกอบดวย เศษ และ สวน
3.2 ขอมลบคคล ซงประกอบดวย ชอ สวนสง นาหนก 3.3 วนท ซงประกอบดวยขอมลยอยคอ วนท เดอนท ป
3.4 เวลา ซงประกอบดวย ชวโมง นาท วนาท
3.5 ขอมลนกศกษา ซงประกอบดวย รหสประจาตว เพศ ชอนกศกษา วนเกด อาย ทอย และเบอรโทรศพท
4. จงอธบายวธการเขาถงตวแปรภายในขอมลแบบโครงสรางพรอมยกตวอยางใหชดเจน
5. ใหออกแบบชนดขอมลโครงสรางดงตอไปน
Name Height Krit 175 Noi 170 Porn 165 In 170 Meaw 166
พรอมทงเขยนโปรแกรมเพอหาคาเฉลยของสวนสงทงหมดแลวแสดงผลลพธออกทางหนาจอ 6. จงตรวจสอบโปรแกรมดงตอไปนวามขอผดพลาดตรงไหนและใหแกไขใหถกตองพรอมทงแสดงผลลพธของโปรแกรม
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <stdio.h> #include <string.h> void main(void) { struct student { long int code; char name[80]; } A,B; A.code = 451350001; A.name = "One"; B.code = 451310001; B.name = "Two"); printf("Code : %li\tName : %s\n",A.code,A.name); printf("Code : %li\tName : %s\n",B.code,B.name); }
บทท 9 โครงสรางและยเนยน
349
7. จงอธบายถงความแตกตางระหวางโครงสรางและยเนยนพรอมทงยกตวอยางใหชดเจน
8. จงอธบายถงหนวยความจาทใชระหวางโครงสรางและยเนยน พรอมทงยกตวอยางในการเขยนโปรแกรมของทงสองแบบเพอแสดงใหเหนภาพผลลพธทชดเจน
9. จงตรวจสอบโปรแกรมดงตอไปนวามขอผดพลาดตรงไหนและใหแกไขใหถกตองพรอมทงแสดงผลลพธของโปรแกรม
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <stdio.h> #include <string.h> void main(void) { union student { long int code; int sex; char name[80+1]; } a; a.code = 50123001; printf("code : %li\n",a.code); strcpy(a.name,"test"); printf("name : %s\n",a.name); printf("code : %li\tname : %s\n",a.code,a.name); }
10. จงเขยนโปรแกรมดงตอไปนใหอยในรปแบบยเนยน โดยใหแสดงผลลพธไดเชนเดม
1 2 3 4 5 6 7 8 9
10 11 12
#include <stdio.h> void main(void) { struct student { long int code; char name[80]; }; struct student s[2] = { {36000001,"One"}, {36000002,"Two"} }; printf("Code : %li\tName : %s\n",s[0].code,s[0].name); printf("Code : %li\tName : %s\n",s[1].code,s[1].name); }
บทท 10 ตวช
บทท 10
ตวช
ในบทนจะกลาวถงพนฐานเกยวกบตวชและทอยหนวยความจา (Introduction to
Pointer and Memory Address) สญลกษณสาหรบตวช (Symbol of Pointer) การประกาศตวแปรของตวช (Declarations of Pointer) การกาหนดคาเรมตนของตวช (Initialization of
Pointer) ตวชของตวช (Pointer of Pointer) และตวชและแถวลาดบ (Pointer and Array) โดยตวชจะเปนตวแปรประเภทหนงทถกสรางขนมาโดยอาศยรปแบบของตวชไปยงขอมลตางๆ โดยตวชจะเกบคาทอยของตวแปรแทนทจะเกบขอมลโดยตรง ซงคาทอยจะถกอางองไปยงขอมล ทาใหสามารถนาไปประยกตใชงานในการเขยนโปรแกรมเพอเพมประสทธภาพในการเขยนโปรแกรมบางประเภททเหมาะสม ทาใหโปรแกรมมประสทธภาพทดขน ดงเชนมประโยชนในการลดปรมาณหนวยความจาในการเขยนโปรแกรม หรอมประโยชนในดานการจดการโครงสรางขอมล เปนตน
10.1 พนฐานเกยวกบตวชและทอยหนวยความจา (Introduction to Pointer and Memory Address)
ตวช (Pointer) เปนตวแปรชนดหนงทเกบตาแหนงทอย (Address) แทนการเกบขอมลโดยตรง โดยจะใชคาทอยเปนตวอางองไปยงขอมลทเกบไว โดยหนาทหลกของตวชคอการชไปยงทอยใดๆ เพอจดการกบขอมลตางๆ ทเกบอยในทอยเหลานน ดงนนคาทตวชเกบอยจะไมใชคาขอมลทแทจรงแตเปนคาทอยของตวแปรอน ซงจะตองนาคานชไปยงทอยของตวแปรอนเสยกอนจงจะไดคาทแทจรง
บทท 10 ตวช
352
ลกษณะการทางานของคอมพวเตอรในการนาขอมลตางๆ มาใชงานเชน ตวแปร ขอมล หรอไฟล ตางๆ ซงการทคอมพวเตอรจะเขาถงขอมลเหลานได คอมพวเตอรจะตองนาเอาขอมลเหลานลงหนวยความจาเสยกอน เปนผลทาใหขอมลทตองการเขาถงมทอยทแนนอนในหนวยความจา ดงตวอยางแสดงในรปท 10.1
A B C
Variable
File
Database
B
C
A
File
Database
0005
0011
0015
0030
0033
0040
0045
0016
รปท 10.1 ตวอยางรปแบบของขอมลทจดเกบในหนวยความจา
จากรปเปนการนาเอาขอมลแบบตาง ๆ เขาไวในหนวยความจา โดยทตวแปร A, B, C
ถกเกบไวทตาแหนง 0005 ถง 0016 ซงตวแปรแตละตวกจะมตาแหนงหนวยความจาทถกกาหนดไว สวนแฟมขอมลและฐานขอมลกจะถกจดเกบตามตาแหนงตางๆ ซงการเกบขอมลในลกษณะนทาใหเราสามารถอางองขอมลโดยผานตาแหนงทอยไดโดยงาย ซงเครองมอทใชในการอางองขอมลตางๆ โดยผานตาแหนงทอยคอตวชนนเอง ดงนนถาตองการเปลยนคาตวแปร A กทาการแกไขขอมลทหนวยความจาตาแหนง 0015 ถาตองการแกไขขอมลในไฟล กทาการแกไขขอมลทหนวยความจาตาแหนง 0040 ซงสรปไดวาตวชเปนกลไกในการเขาถงขอมลผานทางหนวยความจานนเอง โดยเราเรยกตวแปรทใชเกบตาแหนงของหนวยความจาทตองการเขาถงวาตวแปรตวช
บทท 10 ตวช
353
จากบททผานมาในการประกาศตวแปรทวไปเปนชนดขอมลพนฐาน เชน int k = 100;
ซงกคอการประกาศตวแปร k มคาเทากบ 100 ทเปนเลขจานวนเตม โดยตวแปร k เกบคาตวเลขจานวนเตม 100 ไว แตถาเปนการประกาศตวแปรทเปนตวชจะกาหนด 100 ใหกบตวแปร k โดยตรงไมได เนองจากหนาทหลกของตวชคอการช ดงนนจะตองชไปยงทอยของตวแปรเสยกอนแลวจงดาเนนการจดการกบขอมลของตวแปรนนได
การกาหนดตาแหนงทอยหนวยความจาขนอยกบสถาปตยกรรมทางดานฮารดแวรและซอฟตแวร เชน MCS-51 อนญาตใหใชตาแหนงหนวยความจาทบซอนกนไดระหวางหนวยความจาภายในและหนวยความจาภายนอก เชน หนวยความจาตาแหนง 20 อาจหมายความถงตาแหนงหนวยความภายในหรอภายนอกกได Z80 บงคบใหหนวยความจาภายในและภายนอกตองไมซากน 80386 หรอสงกวา มกลไกอางองหนวยความจามากกวาทมอยจรงเรยกวาหนวยความจาเสมอน โดยการนาเอาจานบนทกแบบแขง (Hard disk) มาทาเปนหนวยความจา แตถาไมตองการตดตอกบฮารดแวรโดยตรง กจะกระทาผานทางระบบปฏบตการ ซงการอางองตาแหนงหนวยความจาของแตละระบบปฏบตการกไมเหมอนกนอกเชนระบบปฏบตการดอส (DOS) สามารถอางองหนวยความจาได 1 เมกะไบต เทานน สวน EMM386 เปนกลไกททาใหระบบปฏบตการดอสสามารถอางองหนวยความจาไดเกน 1 เมกะไบต โดยทาหนาทสลบเปลยนขอมลทตองการใชงานจรงไวใน 1 เมกะไบต แรก และสลบเอาขอมลทไมไดใชไวในหนวยความจาตาแหนงสงกวา 1 เมกะไบต สวนระบบปฏบตการยนกซ (UNIX) และวนโดวส (Windows) สามารถอางองหนวยความจาไดมากกวาระบบเดมซงสามารถอางองไดจานวนมาก และสนบสนนการใชหนวยความจาเสมอน
ซงจานวนหนวยความจาสงสดทอางองไดขนอยกบรนของระบบปฏบตการ ในปจจบนการอางองตาแหนงทอยสามารถอางองไดจานวนมากทงนเนองจากประสทธภาพของฮารดแวรและประสทธภาพของระบบปฏบตการทมประสทธภาพสงมากขน สวนในการเขยนโปรแกรมภาษาซจะกาหนดตวชเขาถงขอมลทมอยจรงในหนวยความจาเทานน เพราะถาใหผ เขยนโปรแกรมเขาถงหนวยความจาไดทกสวน กอาจจะทาใหผ เขยนโปรแกรมทาการเขาถงตาแหนงหนวยความจาทอาจจะผดพลาดได หรออาจจะไปทาใหสวนของขอมลอนๆ เกดความเสยหายในสวนของระบบปฏบตการจองอย
บทท 10 ตวช
354
10.2 สญลกษณสาหรบตวช (Symbol of Pointer)
ตวชมสญลกษณทสาคญอย 2 ตวคอ สญลกษณแอมเพอรแซนด & และสญลกษณดอกจน * ซงจะเปนสญลกษณทจาเปนสาหรบการใชงานตวชอยางถกตอง
สญลกษณแอมเพอรแซนด &
คอสญลกษณ ทใ ช เ มอตองการเอาคา ตาแหนง ทอย ของตวแปร ท เ กบไ วในหนวยความจาออกมาใชงาน เปนการกาหนดคาวาตองการใหตวช ชไปยงตาแหนงทอยของตวแปรใดๆ ดงแสดงในตวอยาง
ตวอยางท 10.1 ตวอยางการใชงานตวแปรตวชในการใชสญลกษณ &
int *Ptr, a = 100;
Ptr = &a; // หมายความวาตวช Prt เกบคาตาแหนงทอยของตวแปร a
ซงจะหมายความวาตวแปร Ptr ซงเปนตวแปรตวชจะเกบคา AAAA ทซงเปนตาแหนงทอยของตวแปร a ดงแสดงในรปท
รปท 10.2 ตวอยางการใชงานสญลกษณ &
สญลกษณดอกจน *
คอสญลกษณทใชเมอตองการคาทอยในตาแหนงทตวแปรตวชนนชอยออกมาดาเนนการประมวลผลตางๆ ซงเปนการนาคาขอมลทแทจรงทไดมาจากทตวแปรตวช ชไปยงตาแหนงทอยของตวแปรใดๆ ดงแสดงในตวอยาง
บทท 10 ตวช
355
ตวอยางท 10.2 ตวอยางการใชงานตวแปรตวชในการใชสญลกษณดอกจน *
int *Ptr,count,val;
count = 1000;
Ptr = &count; // หมายความวาตวช Prt เกบคาตาแหนงทอยของตวแปร count
val = *Ptr; // หมายความวา val มคาเทากบคาทตวช Ptr ชอย
ซงลกษณะการเกบขอมลในหนวยความจาจะมลกษณะแสดงดงรปท 10.3
0000
FFFF
b
a
BBBBPtr
AAAA
Address
1000val
1000count BBBB
รปท 10.3 ตวอยางการใชงานสญลกษณดอกจน *
ตวอยางท 10.3 ตวอยางการใชงานตวแปรตวชในการใชสญลกษณดอกจน * และแอมเพอรแซนด &
int a,b,c,*d,*Ptr;
a = 25;
Ptr = &a;
b = a;
c = *Ptr;
d = Ptr;
ซงลกษณะการเกบขอมลในหนวยความจาจะมลกษณะแสดงดงรปท 10.4
บทท 10 ตวช
356
รปท 10.4 ตวอยางการทางานของตวแปรตวชในการใช
สญลกษณแอมเพอรแซนด & และดอกจน *
บทท 10 ตวช
357
10.3 การประกาศตวแปรของตวช (Declarations of Pointer)
ตวแปรทจะทาหนาทเปนตวชจะตองดาเนนการประกาศตวแปรของตวชในตอนตนของโปรแกรมกอน จงจะสามารถกาหนดตวแปรนนใหเปนตวแปรทเปนตวชได โดยรปแบบของการประกาศตวแปรตวชคอ
เชน
int *a; ตวแปร a เปนตวแปรตวชชนดขอมลเลขจานวนเตมโดยขนาดขอมลทสามารถเขาถงไดมขนาดเทากบ int (16 บต)
float *b; ตวแปร b เปนตวแปรตวชชนดขอมลเลขจานวนจรงโดยขนาดขอมลทสามารถเขาถงไดมขนาดเทากบ float (32 บต)
long double *c; ตวแปร b เปนตวแปรตวชชนดขอมลเลขจานวนจรงโดยขนาดขอมลทสามารถเขาถงไดมขนาดเทากบ long double (80 บต
char *d; ตวแปร d เปนตวแปรตวชชนดขอมลตวอกษร
ในการประกาศตวแปรตวชหากมการประกาศตวแปรใหเปนชนดขอมลประเภทใดแลว ตวแปรตวชจะตองชไปยงตวแปรทมชนดขอมลชนดเดยวกนหากไมเชนนนแลวจะเกดความผดพลาดของโปรแกรม ดงเชนกาหนดให
int a = 5;
int *Ptr1;
char b = 10;
char *Ptr2;
float c = 9.99;
float *Ptr3;
ชนดขอมล *ชอตวแปรตวช;
บทท 10 ตวช
358
ดงนนหากมการกาหนด
Ptr1 = &a; ถกตองตามรปแบบ เปนรปแบบของขอมลประเภทเดยวกน
300Ptr1
5a
100
Address
300
Address
Ptr1=&a;
Ptr2 = &b; ถกตองตามรปแบบ เปนรปแบบของขอมลประเภทเดยวกน
400Ptr2
Ab
100
Address
400
Address
Ptr2=&b;
Ptr3 = &c; ถกตองตามรปแบบ เปนรปแบบของขอมลประเภทเดยวกน
บทท 10 ตวช
359
Ptr1 = &b; จะเกดความผดพลาดของโปรแกรม เนองจากตวตวตวชเปนชนดขอมลจานวนเตม แตชไปยงตวแปร b ทมชนดขอมลเปนตวอกษร (คนละรปแบบของขอมล)
Ptr2 = &c; จะเกดความผดพลาดของโปรแกรม เนองจากตวตวตวชเปนชนดขอมลตวอกษร แตชไปยงตวแปร c ทมชนดขอมลเปนจานวนจรง (คนละรปแบบของขอมล)
ในการใชงานตวแปรตวชสามารถชไปยงตวแปรตวเดยวได เชนกาหนดให
int a = 10;
int *x,*y,*z;
x = &a;
y = &b;
z = &c;
บทท 10 ตวช
360
`ในการใชงานของตวแปรตวชในภาษาซ การกาหนดตาแหนงหนวยความจาทตองการเขาถง เราไมสามารถกาหนดไดโดยตรงเชน
int *a;
a = 0xFFFF;
เพราะถาใหผ เขยนโปรแกรมเขาถงหนวยความจาไดอยางเสร จะทาใหผ เขยนโปรแกรมทาการเขาถงตาแหนงหนวยความจาทไมมขอมลอยจรง จะทาใหผ เขยนโปรแกรมอาจทาการแกไขขอมลในหนวยความจาในตาแหนงทโปรแกรมอนทางานอย ทาใหโปรแกรมอนทางานผดพลาดได และอาจจะทาใหผ เขยนโปรแกรมอาจทาการแกไขคาในหนวยความจาทระบบปฏบตการจองอย ทาใหระบบปฏบตการทางานผดพลาด จนทาใหระบบเกดความเสยหาย ดงนนในภาษาซจงกาหนดตวชเขาถงขอมลทมอยจรงในหนวยความจาเทานน เชนถาเรามตวแปร a ในหนวยความจา เราสามารถขอทราบตาแหนงของตวแปร a ไดโดยการวางเครองหมายแอมเพอรแซนดหรอเรยกวาแอนด & ไวขางหนาตวแปรดงน
int a;
int *Ptr;
Ptr = &a;
กจะทาใหตวแปร Ptr เกบตาแหนงหนวยความจาทตวแปร a จองไว
บทท 10 ตวช
361
สาหรบวธการกาหนดคาในหนวยความจาผานตวแปรตวชจะตองมเครองหมายดอกจน * เหมอนกบตอนประกาศตวแปรและเราสามารถตวแปรตวชเปรยบเสมอนกบตวแปรธรรมดาทวไป เชนจากโปรแกรมน บรรทดสดทายใหความหมายเหมอนกน
int a;
int *Ptr;
Ptr = &a;
a = 10
int a;
int *Ptr;
Ptr = &a;
*Ptr = 10
ตวอยางท 10.4 การประกาศและใชงานตวแปรตวช
1 #include <stdio.h> 2 main() 3 { 4 int a=5; 5 float b=9.99f; 6 int *Ptra; 7 float *Ptrb; 8 Ptra = &a; 9 Ptrb = &b; 10 printf("a = %i\n",a); 11 printf("*Ptra = %i\n",*Ptra); 12 printf("Ptra = %p\n",Ptra); 13 printf("b = %f\n",b); 14 printf("*Ptrb = %f\n",*Ptrb); 15 printf("Ptrb = %p\n",Ptrb); 16 }
ผลลพธของโปรแกรม a = 5 *Ptra = 5 Ptra = FFF4 b = 9.9900000 *Ptrb = 9.9900000 Ptrb = FFF0
อธบายโปรแกรม
บรรทดท 4-5 เปนการประกาศตวแปร a และประกาศตวแปร b
บรรทดท 6-7 เปนการประกาศตวแปรตวช
บทท 10 ตวช
362
บรรทดท 8-9 เปนการกาหนดใหตวแปร Ptra เกบตาแหนงหนวยความจาตวแปร a
และตวแปร Ptrb เกบตาแหนงหนวยความจาตวแปร b ตามลาดบ
บรรทดท 10-15 เปนการแสดงคาผลลพธเพอแสดงใหเหนวา *Ptra ใหผลลพธเชนเดยวกนกบตวแปร a และ *Ptrb ใหผลลพธเชนเดยวกบตวแปร b
เมอนาเอาตาแหนงของตวแปร a และ b มาเขยนเปนแผนภาพจะแสดงใหเหนดงรปท
10.5
รปท 10.5 ตวอยางตาแหนงหนวยความจาของขอมลในการใชตวแปรตวช
ตวอยางท 10.5 การประกาศและใชงานตวแปรตวช 2 ตว ชไปยงหนวยความจาตาแหนงเดยวกน
1 #include <stdio.h> 2 main() 3 { 4 int a=10; 5 int *x,*y; 6 x = y = &a; 7 printf("%i %i %i\n",a,*x,*y); 8 *x = 20; 9 printf("%i %i %i\n",a,*x,*y); 10 *y = 30; 11 printf("%i %i %i\n",a,*x,*y); 12 }
ผลลพธของโปรแกรม 10 10 10 20 20 20 30 30 30
บทท 10 ตวช
363
อธบายโปรแกรม
บรรทดท 4-5 เปนการประกาศตวแปร a และประกาศตวแปร x และ y เปนตวแปรตวช
บรรทดท 6 เปนการกาหนดใหทงตวแปรตวช x และ y เกบตาแหนงหนวยความจาของตวแปร a ดงนนการแกไขคาหนวยความจาตาแหนงนผานตวแปร x ในบรรทดท 8 กจะทาใหคาของ a เปลยนไปตาม แตเรากสามารถแกไขคาในหนวยความตาแหนงตวแปร a ดวยแปร y ไดดวยเชนกนแสดงในบรรทดท 10
บรรทดท 8,10 การแกไขคาหนวยความจาตาแหนงนผานตวแปร x และ y ซงสงผลทาใหคาของตวแปรเปลยนตาม
บรรทดท 7,9,11 เปนการแสดงคาผลลพธเพอแสดงใหเหนวาตวแปรตวช ชไปยงหนวยความจาตาแหนงเดยวกน
ตวอยางท 10.6 การประกาศและใชงานตวแปรตวช ทชหนวยความจาตาแหนงทมชนดขอมลไมตรงกน
1 #include <stdio.h> 2 main() 3 { 4 int a=99; 5 float b=99.99; 6 int *Ptra; 7 float *Ptrb; 8 Ptra = b; 9 Ptrb = a; 10 }
ผลลพธของโปรแกรม error C2440: '=' : cannot convert from 'int' to 'float *'
อธบายโปรแกรม
บรรทดท 4-5 เปนการประกาศตวแปร a เปนชนดขอมลจานวนเตม และประกาศตวแปร b เปนชนดขอมลทศนยม
บรรทดท 6-7 เปนการประกาศตวแปรตวช Ptra เกบตาแหนงหนวยความจาขนาด16 บต ตามขนาดขอมลของตวแปรชนดทเปนจานวนเตม (int) และ Ptrb เกบตาแหนงหนวยความจาขนาด 32 บต ตามขนาดขอมลของตวแปรชนดทเปนทศนยม (float)
บทท 10 ตวช
364
บรรทดท 8-9 กาหนดใหตวแปร Ptra เกบตาแหนงขอมลของ b และกาหนดใหตวแปร Ptrb เกบตาแหนงขอมลของ a ซงจดนจะทาใหการแปลโปรแกรมไมผานเนองจากขนาดขอมลไมเทากน และเปนคนละชนดขอมล
ตวอยางท 10.7 การใชงานตวแปรตวชและฟงกชน scanf
1 #include <stdio.h> 2 main() 3 { 4 int a,*Ptra; 5 Ptra = &a; 6 scanf("%i",&a); 7 printf("%i\n",a); 8 scanf("%i",Ptra); 9 printf("%i\n",*Ptra); 10 }
ผลลพธของโปรแกรม 5 5 10 10
อธบายโปรแกรม
บรรทดท 4 เปนการประกาศตวแปร a เปนชนดขอมลจานวนเตม และประกาศตวแปร Ptra เปนตวแปรตวช
บรรทดท 5 เปนการกาหนดตวแปรตวช Ptra เกบตาแหนงหนวยความจาของตวแปร a
บรรทดท 6,8 เปนการรบคาขอมลเพอเกบไวยงตวแปร โดยจะตองระบตาแหนงหนวยความจาของตวแปรในกรณใชในรปแบบปกต แตถาใชในกรณตวแปรตวชเราสามารถใชตวชเพอแทนได
บรรทดท 7,9 เปนการแสดงคาผลลพธ
บทท 10 ตวช
365
ตวอยางท 10.8 การใชงานตวแปรตวชและฟงกชน scanf ทผดวธ
1 #include <stdio.h> 2 main() 3 { 4 int *Ptra; 5 scanf("%i",Ptra); 6 printf("%i\n",*Ptra); 7 }
ผลลพธของโปรแกรม
อธบายโปรแกรม
บรรทดท 4 เปนการประกาศตวแปร Ptra เปนตวแปรตวช บรรทดท 5 เปนการรบคาขอมลจากแผงแปนอกขระแลวเกบคาลงในตาแหนงท
ไมสามารถระบได ซงอาจจะเปนตาแหนงของโปรแกรมอนๆ ซงอาจจะทาใหเกดความผดพลาดได
บรรทดท 6 เปนการแสดงคาผลลพธ
10.4 การกาหนดคาเรมตนของตวช (Initialization of Pointer)
การกาหนดคาเรมตนของตวชคอการกาหนดคาเรมตนของตวชวาใหชไปยงตาแหนงใดในหนวยความจา การกาหนดคาเรมตนไมวาจะเปนการประกาศกบตวแปรใดๆ เชนตวแปรพนฐานทวไปหรอตวแปรแบบแถวลาดบ ถาเราไมกาหนดคาเรมตนกจะไมสามารถทราบคาขอมลทจะดาเนนการ ซงถาเราไมกาหนดคาเรมตนอาจจะเปนคาทไมมความหมายใดๆ เปนคาทไมตองการและเมอนามาประมวลผลของโปรแกรมกจะเกดความผดพลาด ดงนนการใชงานตวชจะตองมการกาหนดคาเรมตนของตวชกอน ดงเชนตวแปรตวช x ไมทราบตาแหนงทจะชไปดงรปท 10.6
รปท 10.6 การประกาศตวแปรตวชทไมกาหนดคาเรมตน
บทท 10 ตวช
366
รปแบบของการกาหนดคาเรมตนตวแปรตวชคอ
เชน
int a = 100;
int *Ptr;
จากรปในขนตอนนเปนการประกาศตวแปร a และ ประกาศตวแปรตวช Ptr ซงยงไมไดมการชไปยงตาแหนงใดๆ Ptr = &a;
จากรปในขนตอนนเปนการชไปยงตวแปร a ดงนน ตวแปรตวชจงเกบคาตาแหนงทอยของตวแปร a นนคอ ตาแหนงท 300
ตวแปรตวช = &ชอตวแปรทตองการช;
บทท 10 ตวช
367
*Ptr = 50;
จากรปในขนตอนนเปนนาคา 50 ไปเกบไวยง *Ptr ทชอย นนกคอเกบไวทตวแปร a
เพราะการกระทาใดๆ กบคาของตวแปร *Ptr กเปนการกระทากบคาของตวแปร a นนเอง ซง *Ptr = 50; กมความหมายเชนเดยวกนกบ a = 50;
ในการกาหนดคาเรมตนของการดาเนนการกบตวแปรตวชสามารถกระทาได 2 วธดงน
วธท 1 ประกาศตวแปรตวชและการกาหนดคาเรมตนพรอมกน ในชดคาสงเดยวกนเชน
int x;
int *Ptr = &x;
วธท 2 ประกาศตวแปรตวชหลงจากนนกาหนดคาเรมตนในคาสงถดไป
int x;
int *Ptr;
Ptr = &x;
บทท 10 ตวช
368
ตวอยางท 10.9 การใชงานตวแปรตวชในการบวกเลข 2 จานวน
1 #include <stdio.h> 2 main() 3 { 4 int a,b,c; 5 int *Ptra = &a; 6 int *Ptrb = &b; 7 int *Ptrc = &c; 8 printf("First Number = "); 9 scanf("%d",Ptra); 10 printf("Second Number = "); 11 scanf("%d",Ptrb); 12 *Ptrc = *Ptra + *Ptrb; 13 printf("%d + %d = %d ",*Ptra,*Ptrb,*Ptrc);
14 }
ผลลพธของโปรแกรม First Number = 100 Second Number = 200 100 + 200 = 300
อธบายโปรแกรม
บรรทดท 4 เปนการประกาศตวแปร a,b,c เปนจานวนเตม
บรรทดท 5-7 เปนการประกาศตวแปร Ptra, Ptrb, และ Ptrc เปนตวแปรตวช บรรทดท 8,10 แสดงขอความทหนาจอแสดงผล บรรทดท 9,11 รบขอมลผานทางแผงแปนอกขระ บรรทดท 12 ทาการบวกคาของเลขทรบเขาทตวแปรตวช ชอย บรรทดท 13 แสดงผลลพธของโปรแกรม
บทท 10 ตวช
369
10.5 ตวชของตวช (Pointer of Pointer)
ตวชของตวชคอการใชตวแปรตวชทชไปยงทตวชอกตว ซงจะทาใหตวชเกบตาแหนงหนวยของจาของตวแปรตวชได ซงแตกตางจากการทางานแบบเดมทไดกลาวไปในหวขอกอนหนาน โดยตวแปรตวชแบบเดมนนจะเปนตวแปรตวชทชไปยงตาแหนงทอยของตวแปรอนโดยตรง แตตวแปรตวชของตวชจะชไปยงตวชอกตวหนง ดงตวอยางแสดงในรปท 10.7
300Ptr1
5a
100
Address
300
Address
(ก) ตวอยางตวชธรรมดา
(ข) ตวอยางตวชของตวช
รปท 10.7 เปรยบเทยบตวอยางของตวแปรตวชของตวช
จากรปตวแปรตวชของตวชจะชไปยงตาแหนงทอยถดไปดงเชนตวแปรตวช Ptr1 ชไปยงตาแหนงทอยของตวแปร a คอตาแหนงท 300 จากนนชไปยงตาแหนงถดไปโดยชไปยงทอยตาแหนงท 500 อกทหนง
บทท 10 ตวช
370
รปแบบของการประกาศคาตวแปรตวชของตวชสามารถกาหนดโดยมรปแบบดงน
เชน
int **Ptr; เปนการประกาศตวแปรตวชของตวชทชไปยงตวชตวอน
char **Ptr; เปนการประกาศตวแปรตวชของตวชทชไปยงตวชตวอน
การกาหนดคาเรมตนใหกบตวแปรตวชของตวชสามารถกาหนดโดยมรปแบบดงน
เชน
a = 9;
Ptr2 = &a; เปนการกาหนดใหตวแปรตวช ชไปยงตาแหนงทอยของตวแปร a
Ptr1 = &Ptr2; เปนการกาหนดใหตวแปรตวช Ptr1 ชไปยงตาแหนงทอยของตวแปรตวช Ptr2
แสดงดงตวอยางในรปท 10.8
รปท 10.8 ตวอยางการกาหนดคาเรมตนใหกบตวแปรตวชของตวช
ชนดของขอมล **ชอตวแปรตวช;
ตวแปรตวชของตวช = &ชอตวแปรตวชทชไปยงตวแปรอนๆ;
บทท 10 ตวช
371
ตวอยางท 10.10 การใชงานตวแปรตวชของตวช 2 ตวช
1 #include <stdio.h> 2 main() 3 { 4 int a=99; 5 int *Ptr2 = &a; 6 int **Ptr1 = &Ptr2; 7 printf("Address a is %p value is %i\n",&a,a); 8 printf("Address Ptr2 is %p value is %p\n",&Ptr2,Ptr2); 9 printf("Address Ptr1 is %p value is %p\n",&Ptr1,Ptr1); 10 **Ptr1 = 100; 11 printf("a = %i\n",a);12 }
ผลลพธของโปรแกรม Address a is F790 value is 99 Address Ptr2 is F784 value is F790 Address Ptr1 is F778 value is F784 a = 100
อธบายโปรแกรม
บรรทดท 4 เปนการประกาศตวแปร a เปนจานวนเตม
บรรทดท 5 เปนการประกาศตวแปร Ptr2 และชไปยงตาแหนงหนวยความจาของตวแปร a
บรรทดท 6 เปนการประกาศตวแปร Ptr1 และชไปยงตาแหนงหนวยความจาของตวแปร Ptr2
บรรทดท 7-9 เปนการแสดงผลลพธของตวแปรตางๆ บรรทดท 10 กาหนดใหตวแปรตวชของตวช มคาเทากบ 100 ซงแสดงวาท
ตาแหนงทตวแปรตวช Ptr1 ชอยจะมคาเทากบ 100
บรรทดท 11 เปนการแสดงผลลพธของตวแปร a วามการเปลยนแปลงหรอไมหลงจากการใชตวแปรตวชของตวชในการกาหนดคาใหมให
เมอนาเอาตาแหนงของตวแปร a, Ptr1 และ Ptr2 มาเขยนเปนแผนภาพจะแสดงใหเหนดงรปท 10.9
บทท 10 ตวช
372
Ptr1
Ptr2
F778
Address
F784
Address
99Address
F790a
รปท 10.9 แผนภาพการชตาแหนงตางๆ ของขอมลของโปรแกรม
ตวอยางท 10.11 การใชงานตวแปรตวชของตวช 3 ตวช
1 #include <stdio.h> 2 main() 3 { 4 int a=99; 5 int *Ptr3 = &a; 6 int **Ptr2 = &Ptr3; 7 int ***Ptr1 = &Ptr2; 8 printf("Address a is %p value is %i\n",&a,a); 9 printf("Address Ptr3 is %p value is %p\n",&Ptr3,Ptr3); 10 printf("Address Ptr2 is %p value is %p\n",&Ptr2,Ptr2); 11 printf("Address Ptr1 is %p value is %p\n",&Ptr1,Ptr1); 12 ***Ptr1 = 100; 13 printf("a = %i\n",a);14 }
ผลลพธของโปรแกรม Address a is F878 value is 99 Address Ptr3 is F86C value is F878 Address Ptr2 is F860 value is F86C Address Ptr1 is F854 value is F860 a = 100
อธบายโปรแกรม
บรรทดท 4 เปนการประกาศตวแปร a เปนจานวนเตม
บทท 10 ตวช
373
บรรทดท 5 เปนการประกาศตวแปร Ptr3 และชไปยงตาแหนงหนวยความจาของตวแปร a
บรรทดท 6 เปนการประกาศตวแปร Ptr2 และชไปยงตาแหนงหนวยความจาของตวแปร Ptr3
บรรทดท 7 เปนการประกาศตวแปร Ptr1 และชไปยงตาแหนงหนวยความจาของตวแปร Ptr2
บรรทดท 8-11 เปนการแสดงผลลพธของตวแปรตางๆ บรรทดท 12 กาหนดใหตวแปรตวชของตวช มคาเทากบ 100 ซงแสดงวาท
ตาแหนงทตวแปรตวช Ptr1 ชอยจะมคาเทากบ 100 ซงจะเปนการช ไปยงตวแปรตวชของตวชจานวน 3 ระดบ
บรรทดท 13 เปนการแสดงผลลพธของตวแปร a วามการเปลยนแปลงหรอไมหลงจากการใชตวแปรตวชของตวชในการกาหนดคาใหมให
เมอนาเอาตาแหนงของตวแปร a, Ptr1, Ptr2 และ Ptr3 มาเขยนเปนแผนภาพจะแสดงใหเหนดงรปท 10.10
รปท 10.10 แผนภาพการชตาแหนงตางๆ ของขอมลตวชของตวช 3 ตวช
บทท 10 ตวช
374
10.6 ตวชและแถวลาดบ (Pointer and Array)
10.6.1 การใชงานตวชและแถวลาดบ
จากบททผานมาเรองแถวลาดบจะมการอางสมาชกแตละตวโดยจะใชเครองหมายวงเลบเหลยม [ ] แตในการเขยนโปรแกรมภาษาซตวชและแถวลาดบมความสมพนธตอกน
ดงนนเราสามารถใชตวแปรตวช ชไปยงขอมลในแตละชองของแถวลาดบได โดยการกาหนดใหตวแปรตวช ชไปยงตาแหนงทอยทตองการอางถง การระบใหตวแปรตวช ชไปยงชองแรกของแถวลาดบทาไดโดยการกาหนดชอของแถวลาดบใหกบตวแปรตวชซงสามารถทาได 2 รปแบบ
ดงน
รปแบบท 1 กาหนดชอของแถวลาดบใหกบตวแปรตวชโดยตรงดงเชน
int data[10];
int *Ptr;
Ptr = data; กาหนดชอของแถวลาดบใหกบตวแปรตวชโดยตรง โดยจะชไปยงตาแหนงแรกนนคอ data[0]
รปแบบท 2 กาหนดตาแหนงทอยชองแรกของแถวลาดบใหกบตวแปรตวชดงเชน
int data[10];
int *Ptr;
Ptr = &data[0]; กาหนดตาแหนงทอยโดยอางตาแหนงหนวยความจาชองแรกของแถวลาดบ
ในการอางตวแปรแถวลาดบสามารถอางองโดยการเพมหรอลดคาตวแปรตวช ดงนนในการอางองสมาชกในแถวลาดบดวยตวแปรตวชสามารถกระทาไดดงตวอยางดงตอไปน
การอางองตวแปรตวชของแถวลาดบ 1 มต
int a[5] = {1,2,3,4,5,6}
แถวลาดบ ตวแปรตวช a[0] a[1] a[2] a[3] a[4] a[5]
*(a+0) or *(a) or *a *(a+1) *(a+2) *(a+3) *(a+4) *(a+5)
บทท 10 ตวช
375
รปท 10.11 การอางองตวแปรตวชของแถวลาดบ 1 มต
การอางองตวแปรตวชของแถวลาดบ 2 มต
int a[2][5] = { {1,2,3,4,5} , {6,7,8,9,0} }
แถวลาดบ ตวแปรตวช a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
*(a[0]+0) or *(*(a+0)+0) or *(*(a)+0) or *(*(a)) or **a *(a[0]+1) or *(*(a+0)+1) or *(*a+1) *(a[0]+2) or *(*(a+0)+2) or *(*a+2) *(a[0]+3) or *(*(a+0)+3) or *(*a+3) *(a[0]+4) or *(*(a+0)+4) or *(*a+4) *(a[1]+0) or *(*(a+1)+0) or *(*(a+1)) or **(a+1) *(a[1]+1) or *(*(a+1)+1) *(a[1]+2) or *(*(a+1)+2) *(a[1]+3) or *(*(a+1)+3) *(a[1]+4) or *(*(a+1)+4)
1 2 3 4 5
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
*(a[0]+0) *(a[0]+1) *(a[0]+2) *(a[0]+3) *(a[0]+4)
a[0]
6 7 8 9 0
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
*(a[1]+0) *(a[1]+1) *(a[1]+2) *(a[1]+3) *(a[1]+4)
a[1]
1 2 3 4 5
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
*(*(a+0)+0) *(*(a+0)+1) *(*(a+0)+2) *(*(a+0)+3) *(*(a+0)+4)
a[0]
6 7 8 9 0
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
*(*(a+1)+0) *(*(a+1)+1) *(*(a+1)+2) *(*(a+1)+3) *(*(a+1)+4)
a[1]
รปท 10.12 การอางองตวแปรตวชของแถวลาดบ 2 มต
บทท 10 ตวช
376
การอางองตวแปรตวชของแถวลาดบ 3 มต
int a[2][2][4] = { {{1,2,3,4} , {5,6,7,8}}, {{9,10,11,12}, {13,14,15,16}} }
แถวลาดบ ตวแปรตวช a[0][0][0] a[0][0][1] a[0][0][2] a[0][0][3] a[0][1][0] a[0][1][1] a[0][1][2] a[0][1][3] a[1][0][0] a[1][0][1] a[1][0][2] a[1][0][3] a[1][1][0] a[1][1][1] a[1][1][2] a[1][1][3]
*(a[0][0]+0) or *(*(*(a+0)+0)+0) or ***a *(a[0][0]+1) or *(*(*(a+0)+0)+1) *(a[0][0]+2) or *(*(*(a+0)+0)+2) *(a[0][0]+3) or *(*(*(a+0)+0)+3) *(a[0][1]+0) or *(*(*(a+0)+1)+0) *(a[0][1]+1) or *(*(*(a+0)+1)+1) *(a[0][1]+2) or *(*(*(a+0)+1)+2) *(a[0][1]+3) or *(*(*(a+0)+1)+3) *(a[1][1]+0) or *(*(*(a+1)+1)+0) *(a[1][1]+1) or *(*(*(a+1)+1)+1) *(a[1][1]+2) or *(*(*(a+1)+1)+2) *(a[1][1]+3) or *(*(*(a+1)+1)+3) *(a[1][1]+0) or *(*(*(a+1)+1)+0) *(a[1][1]+1) or *(*(*(a+1)+1)+1) *(a[1][1]+2) or *(*(*(a+1)+1)+2) *(a[1][1]+3) or *(*(*(a+1)+1)+3)
a[0][1][0] a[0][1][1] a[0][1][2] a[0][1][3]
1 2 3 4
*(*(*(a+0)+0)+0) *(*(*(a+0)+0)+1) *(*(*(a+0)+0)+2) *(*(*(a+0)+0)+3)
5 6 7 8
*(*(*(a+0)+1)+0) *(*(*(a+0)+1)+1) *(*(*(a+0)+1)+2) *(*(*(a+0)+1)+3)
a[0][0][0] a[0][0][1] a[0][0][2] a[0][0][3]
a[1][1][0] a[1][1][1] a[1][1][2] a[1][1][3]
9 0 10 11
*(*(*(a+1)+0)+0) *(*(*(a+1)+0)+1) *(*(*(a+1)+0)+2) *(*(*(a+1)+0)+3)
12 13 14 15
*(*(*(a+1)+1)+0) *(*(*(a+1)+1)+1) *(*(*(a+1)+1)+2) *(*(*(a+1)+1)+3)
a[1][0][0] a[1][0][1] a[1][0][2] a[1][0][3]
รปท 10.13 การอางองตวแปรตวชของแถวลาดบ 3 มต
บทท 10 ตวช
377
ตวอยางท 10.12 การใชงานตวแปรตวชกบแถวลาดบ
1 #include <stdio.h> 2 main() 3 { 4 int a[5] = {1,2,3,4,5}; 5 int *Ptr; 6 Ptr = a; 7 printf("%i \n",a[0]); 8 printf("%i \n",*Ptr); 9 printf("%i \n",*Ptr + 1); 10 printf("%i \n",*Ptr + 2); 11 printf("%i \n",*(a+3)); 12 printf("%i \n",*(a+4)); 13 printf("%i \n",Ptr[3]);14 }
ผลลพธของโปรแกรม 1 1 2 3 4 5 4
อธบายโปรแกรม
บรรทดท 4 เปนการประกาศตวแปรแถวลาดบทเปนชนดจานวนเตม
บรรทดท 5 เปนการประกาศตวแปร Ptr เปนตวแปรตวช บรรทดท 6 กาหนดตวชของแถวลาดบโดยจะชไปยงตาแหนงแรกนนคอ a[0]
บรรทดท 7-13 เปนการแสดงผลลพธของตวอยางในการใชงานตวแปรตวชกบแถวลาดบ
ตวอยางท 10.13 การใชงานตวแปรตวชกบแถวลาดบ
1 #include <stdio.h> 2 main() 3 { 4 int a[3] = {10,20,30};
5 int b[2][3] = {10,20,30,40,50,60};
6 printf("%i %i %i\n",a[0],a[1],a[2]);
7 printf("%i %i %i\n\n",*(a+0),*(a+1),*(a+2));
8 printf("%i %i %i\n",b[0][0],b[0][1],b[0][2]);
9 printf("%i %i %i\n\n",b[1][0],b[1][1],b[1][2]);
10 printf("%i %i %i\n",*(b[0]+0),*(b[0]+1),*(b[0]+2));
11 printf("%i %i %i\n\n",*(b[1]+0),*(b[1]+1),*(b[1]+2));
12 printf("%i %i %i\n",*(*(b+0)+0),*(*(b+0)+1),*(*(b+0)+2));
บทท 10 ตวช
378
13 printf("%i %i %i\n\n",*(*(b+1)+0),*(*(b+1)+1),*(*(b+1)+2));
14 }
ผลลพธของโปรแกรม 10 20 30 10 20 30 10 20 30 40 50 60 10 20 30 40 50 60 10 20 30 40 50 60
อธบายโปรแกรม
บรรทดท 4 เปนการประกาศตวแปรแถวลาดบ 1 มต ทเปนชนดจานวนเตม
บรรทดท 5 เปนการประกาศตวแปรแถวลาดบ 2 มต ทเปนชนดจานวนเตม
บรรทดท 6-13 เปนการแสดงผลลพธของตวอยางในการใชงานตวแปรตวชกบแถวลาดบ
10.6.2 การสรางแถวลาดบจากตวช ในการใชงานแถวลาดบสามารถสรางตวแปรชดซงสะดวกตอการใชงานในการเขยนโปรแกรมระดบสง แตอยางไรกตามตวแปรชดทถกสรางขนมาอาจจะไมไดถกใชงานตลอดเวลา ซงอาจจะมการใชเพยงชวงใดชวงหนงของแถวลาดบเทานนสงผลทาใหสนเปลองหนวยความจา โดยปญหานสามารถแกไขไดโดยใชกลไกของตวแปรตวชทสามารถยกเลกตวแปรเหลานนได ซงกคอกลไกในการสรางแถวลาดบจากตวช สงทแตกตางของแถวลาดบปกตและแถวลาดบทสรางจากตวชคอการของหนวยความจา โดยแถวลาดบทสรางจากตวช สามารถทจะจองหนวยความจาขณะทโปรแกรมทางานได ในขณะทแถวลาดบปกตจะจองหนวยความจาในขณะการแปลโปรแกรม
ในการจองหนวยความจาในการทาแถวลาดบจะใชฟงกชน malloc() และการคนคาหนวยความจาจะใชฟงกชน free() ซงในการใชฟงกชนเหลานจะตองประกาศในไฟลสวนหวในสวนของ stdlib.h ดวย โดยการจองหนวยความจาและการคนคาหนวยความจามตวอยางรปแบบดงน
บทท 10 ตวช
379
void *malloc(memory_size); free(variable);
โดยคาสง malloc() คอฟงกชนทใชในการจองหนวยความจา ซงจะนาเอาหนวยความจาทจองไวไปใชงานตางๆ ซงในทนเราจะใชฟงกชนนจองหนวยความจาสาหรบการสรางแถวลาดบ โดยฟงกชนนตองการอารกวเมนตขนาดเทากบหนวยความจาทตองการจอง ซงถามการจองหนวยความจาทมากเกนไปกจะไมสามารถจดสรรพนทสาหรบการจองใหไดกจะคนคาศนยกลบมา (NULL) แตถาจองสาเรจกจะคนคาออกมาเปนตวช ดงนนในการใชฟงกชนนจะตองมการตรวจสอบทกครงจงจะทาใหโปรแกรมมประสทธภาพ สวนในการตรวจสอบขนาดของตวแปรจะใชฟงกชน sizeof()
ในการประกาศตวชทจะใชทาเปนแถวลาดบจะตองระบดวยวาเปนแถวลาดบกมตโดยเครองหมายดอกจน * ซง 1 ตวกจะหมายถงแถวลาดบ 1 มต 2 ตวกจะหมายถงแถวลาดบ 2
มต เปนตน ดงแสดงในตารางท 10.1
ตารางท 10.1 การประกาศแถวลาดบแบบปกตและแถวลาดบแบบตวแปรตวช การประกาศแถวลาดบแบบปกต การประกาศแถวลาดบโดยใชตวแปรตวช int a[3]; int *a
int a[3][ 3]; int **a
int a[3][ 3][ 3]; int ***a
ตวอยางท 10.14 การสรางแถวลาดบ 1 มต จากตวแปรตวช
1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 int *Ptr; 6 Ptr = (int *)malloc(3*sizeof(int)); 7 if (Ptr==NULL) 8 { 9 printf("Cannot allocate memory\n"); 10 exit(1); 11 } 12 Ptr[0] = 1; Ptr[1] = 2; Ptr[2] = 3; 13 printf("%i %i %i",*Ptr,*(Ptr+1),*(Ptr+2)); 14 free(Ptr);
15 }
บทท 10 ตวช
380
ผลลพธของโปรแกรม 1 2 3
อธบายโปรแกรม
บรรทดท 5 เปนการประกาศตวแปร Ptr เปนตวแปรตวช บรรทดท 6 เปนการสรางแถวลาดบ 1 มต จากตวแปรตวช ซงถาเปนการสราง
แถวลาดบแบบปกตกจะประกาศเปน int Ptr[3] ซงกคอการสรางแถวลาดบเชนเดยวกนตางกนแตวธการสราง
บรรทดท 7-11 เปนการตรวจสอบวาตวแปรตวชสามารถจดสรรพนทไดหรอไม
บรรทดท 12 เปนการกาหนดคาใหกบแถวลาดบ
บรรทดท 13 เปนการแสดงคาผลลพธในแถวลาดบแตละสมาชก บรรทดท 14 เปนการคนคาหนวยความจา
จากโปรแกรมหากไมมการกาหนดคาใหกบแถวลาดบในบรรทดท 12 ซงจะเปนการนาเอาแถวลาดบมาใชงานโดยไมมการกาหนดคาเรมตนสงผลทาใหไดคาทไมตองการ ซงเปนจดดอยของแถวลาดบทถกสรางโดยตวแปรตวช ซงเมอเปรยบเทยบกบแถวลาดบแบบปกตทสามารถกาหนดคาเรมตนไปพรอมๆ กบการประกาศตวแปร ดงนนเพอแกปญหานจะมการใชฟงกชน calloc() ซงเปนฟงกชนทกาหนดคาเรมตนใหกบแถวลาดบทสรางจากตวแปรตวชใหมคาเปนศนย
ตวอยางท 10.15 การสรางแถวลาดบ 1 มต จากตวแปรตวช โดยกาหนดคาเรมตนพรอมกบการสรางตวแปรแถวลาดบ
1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 int *Ptr; 6 Ptr = (int *)calloc(3 , sizeof(int)); 7 If (Ptr==NULL) 8 { 9 printf("Cannot allocate memory\n"); 10 exit(1); 11 } 12 printf("%i %i %i",* Ptr,*( Ptr +1),*( Ptr +2)); 13 free(Ptr);
14 }
บทท 10 ตวช
381
ผลลพธของโปรแกรม 0 0 0
อธบายโปรแกรม
บรรทดท 5 เปนการประกาศตวแปร Ptr เปนตวแปรตวช บรรทดท 6 เปนการสรางแถวลาดบ 1 มต จากตวแปรตวช โดยจะมการใช
ฟงกชน calloc ในการกาหนดคาเรมตนใหกบแถวลาดบใหมคาเปนศนยในทกสมาชกของแถวลาดบ
บรรทดท 7-11 เปนการตรวจสอบวาตวแปรตวชสามารถจดสรรพนทไดหรอไม
บรรทดท 12 เปนการแสดงคาผลลพธในแถวลาดบแตละสมาชก บรรทดท 13 เปนการคนคาหนวยความจา
สาหรบการสรางแถวลาดบ 2 มต โดยตวแปรตวชจะสามารถสรางไดดงน
เชน
int **a;
การประกาศในลกษณะนหนวยความจายงไมไดถกจองและการแปลโปรแกรมยงไมทราบวาแถวลาดบมขนาดเทาไหร แสดงดงตวอยาง
?
?
a = (int **)malloc(4*sizeof(int *));
การประกาศในลกษณะนทาการระบวาแถวลาดบมตแรกมขนาดเทาไหรแตยงไมทราบขนาดของมตทสอง ซงถามการประกาศในรปแบบนจะสามารถบอกไดวามตแรกมขนาดเทาไหร แสดงดงตวอยาง
บทท 10 ตวช
382
a[0] = (int *)malloc(3*sizeof(int));
a[1] = (int *)malloc(3*sizeof(int));
a[2] = (int *)malloc(3*sizeof(int));
a[3] = (int *)malloc(3*sizeof(int));
a[4] = (int *)malloc(3*sizeof(int));
การประกาศในลกษณะนทาการระบทงสองมตวาแตละมตมขนาดเทาไหรซงหลงจากการประกาศในลกษณะนกสามารถใชงานแถวลาดบไดอยางมประสทธภาพ
a[0]
a1]
a[2]
a[3]
a[4]
เ มอตองการยกเลกการใชงานแถวลาดบทสรางโดยตวแปรตวช ก ทาการคนหนวยความจามตทสองทกๆ ตวกอน ดงน
free(b[0]);
free(b[1]);
free(b[2]);
free(b[3]);
free(b[4]);
บทท 10 ตวช
383
หลงจากนนทาการคนคาหนวยความจามตแรก ดงน
free (a);
?
?
ตวอยางท 10.16 การสรางแถวลาดบ 2 มต จากตวแปรตวช
1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 int **a,i,j; 6 a = (int **)malloc(5*sizeof(int *)); 7 for(i=0;i<5;i++) 8 a[i] = (int *)malloc(2*sizeof(int)); 9 for(i=0;i<5;i++) 10 for(j=0;j<2;j++) 11 { 12 a[i][j] = i*3+j; 13 printf("a[%i][%i] = %i\n",i,j,a[i][j]); 14 } 15 for(i=0;i<5;i++) free(a[i]); 16 free(a);
17 }
ผลลพธของโปรแกรม a[0][0] = 0 a[0][1] = 1 a[1][0] = 3 a[1][1] = 4 a[2][0] = 6 a[2][1] = 7 a[3][0] = 9
บทท 10 ตวช
384
a[3][1] = 10 a[4][0] = 12 a[4][1] = 13
อธบายโปรแกรม
บรรทดท 5 เปนการประกาศตวแปร a เปนตวแปรตวช และตวแปร i และ j เปนตวแปรปกตของเลขจานวนเตม
บรรทดท 6 เปนการจองหนวยความจาของแถวลาดบในมตทหนง บรรทดท 7-8 เปนการจองหนวยความจาของแถวลาดบในมตทสอง บรรทดท 9-14 เปนการกาหนดคาใหกบแถวลาดบ 2 มต และแสดงผลลพธ บรรทดท 15-16 เปนการคนคาหนวยความจา
จากการดาเนนการสรางแถวลาดบจากตวแปรตวชจะเหนวาในขนตอนของการระบในมตทสองนนไมไดกาหนดใหทกๆ แถวมขนาดเทากน ดงนนเราสามารถกาหนดใหแตละแถวมสมาชกทจานวนไมเทากนได ทาใหประหยดหนวยความจาไดมากกวาการสรางแถวลาดบทปกต ซงมกจะใชในกรณทตองการประหยดหนวยความจา เชน
int **a;
a = (int **)malloc(5*sizeof(int *));
a [0] = (int *)malloc(4*sizeof(int));
a [1] = (int *)malloc(2*sizeof(int));
a [2] = (int *)malloc(1*sizeof(int));
a [3] = (int *)malloc(5*sizeof(int));
a [4] = (int *)malloc(3*sizeof(int));
บทท 10 ตวช
385
10.6.3 การเปลยนขนาดของแถวลาดบ
ในการใชงานแถวลาดบทสรางจากตวแปรตวชสามารถเปลยนแปลงไดใหมขนาดทใหญขนไดโดยขอมลยงคงอย ซงในการเปลยนขนาดของแถวลาดบจะใชคาสง realloc() ซงจะตองประกาศไฟลสวนหว stdlib.h เพอใหสามารถใชงานฟงกชนนได ซงมรปแบบในการใชงานคอ
เชน
Ptr = (int *)realloc(Ptr,5*sizeof(int));
Ptr = (char *)realloc(Ptr, 5*sizeof(char));
ซงกคอการเปลยนขนาดของพนทหนวยความจาในการเกบขอมลของแถวลาดบทตวช Ptr ชอยใหสามารถเกบขอมลไดจานวน 5 ตว โดยขอมลเดมยงคงอย
ตวอยางท 10.17 การเปลยนขนาดของแถวลาดบ
1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 int *Ptr; 6 Ptr = (int *)malloc(4*sizeof(int)); 7 if (Ptr==NULL) 8 { 9 printf("Cannot allocate memory\n"); 10 exit(1); 11 } 12 Ptr[0]=0;Ptr[1]=1;Ptr[2]=2;Ptr[3]=3; 13 printf("%i %i %i %i\n",*Ptr,*(Ptr+1),*(Ptr+2),*(Ptr+3)); 14 Ptr = (int *)realloc(Ptr,6*sizeof(int)); 15 Ptr[4]=4;Ptr[5]=5; 16 printf("%i %i %i %i %i %i \n”, *Ptr,*(Ptr+1),
*(Ptr+2),*(Ptr+3),*(Ptr+4),*(Ptr+5)); 17 free(Ptr);
18 }
ผลลพธของโปรแกรม 0 1 2 3 0 1 2 3 4 5
void *realloc(ชอตวแปรตวชทจะเปลยน, ขนาดใหมของหนวยความจาทตองการ)
บทท 10 ตวช
386
อธบายโปรแกรม
บรรทดท 5 เปนการประกาศตวแปร Ptr เปนตวแปรตวช บรรทดท 6 เปนการสรางแถวลาดบ 1 มต จากตวแปรตวช โดยจะมจานวน
สมาชกเปนเลขจานวนเตมจานวน 4 ตว บรรทดท 7-11 เปนการตรวจสอบวาตวแปรตวชสามารถจดสรรพนทไดหรอไม
บรรทดท 12 เปนการกาหนดคาใหกบสมาชกของแถวลาดบแตละตว ซงจะมการกาหนดจานวนสมาชกจานวน 4 ตว
บรรทดท 13 เปนการแสดงคาผลลพธในแถวลาดบแตละสมาชก บรรทดท 14 เปนการเปลยนขนาดของแถวลาดบจากเดมจานวน 4 ตว เปน 6 ตว บรรทดท 15 เปนการกาหนดคาใหกบสมาชกของแถวลาดบเพมอกจานวน 2 ตว บรรทดท 16 เปนการแสดงคาผลลพธในแถวลาดบแตละสมาชก บรรทดท 17 เปนการคนคาหนวยความจา
บทท 10 ตวช
387
บทสรป
ในบทนไดกลาวถงพนฐานเกยวกบตวชและทอยหนวยความจา สญลกษณสาหรบตวช การประกาศตวแปรของตวช การกาหนดคาเรมตนของตวช ตวชของตวช และตวชและแถวลาดบ ซงเปนตวแปรตวหนงททาหนาทชไปยงขอมลตางๆ ทาใหเราสามารถอางองหรอจดการเกยวกบขอมลไดมประสทธภาพมากยงขน เชนการจดการหนวยความจาของขอมลทถกสรางโดยตวแปรตวชจะใชปรมาณหนวยความจาทนอยกวาเปนตน ตวชเปนตวแปรพเศษชนดหนงทเกบตาแหนงทอยแทนการเกบขอมลโดยตรง โดยจะใชคาทอยเปนตวอางองไปยงขอมลทเกบไว โดยหนาทหลกของตวชคอการชไปยงทอยใดๆ เพอจดการกบขอมลตางๆ ทเกบอยในทอยเหลานน ตวชมสญลกษณทสาคญอย 2 ตวคอ สญลกษณแอมเพอรแซนด & และสญลกษณดอกจน * โดยสญลกษณแอมเพอรแซนคอสญลกษณทใชเมอตองการเอาคาตาแหนงทอยของตวแปรทเกบไวในหนวยความจาออกมาใชงาน เปนการกาหนดคาวาตองการใหตวช ชไปยงตาแหนงทอยของตวแปรใดๆ สวนสญลกษณดอกจนคอสญลกษณทใชเมอตองการคาทอยในตาแหนงทตวแปรตวชนนชอยออกมาดาเนนการประมวลผลตางๆ ซงเปนการนาคาขอมลทแทจรงทไดมาจากทตวแปรตวช ชไปยงตาแหนงทอยของตวแปรใดๆ ในการประกาศตวแปรตวชจะตองดาเนนการประกาศตวแปรของตวชในตอนตนของโปรแกรมกอนซงในการประกาศตวแปรตวชหากมการประกาศตวแปรใหเปนชนดขอมลประเภทใดแลว ตวแปรตวชจะตองชไปยงตวแปรทมชนดขอมลชนดเดยวกนหากไมเชนนนแลวจะเกดความผดพลาดของโปรแกรม การกาหนดคาเรมตนของตวชคอการกาหนดคาเรมตนของตวชวาใหชไปยงตาแหนงใดในหนวยความจา ซงถาเราไมกาหนดคาเรมตนอาจจะเปนคาทไมมความหมายใดๆ เปนคาทไมตองการและเมอนามาประมวลผลของโปรแกรมกจะเกดความผดพลาด ดงนนการใชงานตวช จะตองมการกาหนดคาเรมตนของตวชกอน ตวชของตวชคอการใชตวแปรตวชทชไปยงทตวช อกตว ซงจะทาใหตวชเกบตาแหนงหนวยของจาของตวแปรตวชได ตวแปรตวชและแถวลาดบคอตวแปรตวชทดาเนนการกบแถวลาดบซงจากเดมแถวลาดบจะมการอางสมาชกแตละตวโดยจะใชเครองหมายวงเลบเหลยม [ ] แตถาใชตวแปรตวชกบแถวลาดบเราสามารถใชตวแปรตวช ชไปยงขอมลในแตละชองของแถวลาดบได โดยการกาหนดใหตวแปรตวช ชไปยงตาแหนงทอยทตองการอางถง ซงถามการสรางแถวลาดบจากตวแปรตวชจะสามารถทาการเพมประสทธภาพของหนวยความจาทอาจจะมการใชปรมาณทนอยกวาเดมอกทงสามารถเพมจานวนขนาดของหนวยความจาของตวแปรแถวลาดบไดจากเดมจะไมสามารถกระทาได
บทท 10 ตวช
388
ดงนนตวแปรตวชจงเปนตวแปรทมลกษณะเฉพาะพเศษตวแปรหนง ทสามารถเพมประสทธภาพในการเขยนโปรแกรมใหมประสทธภาพยงขนได
บทท 10 ตวช
389
แบบฝกหดทบทวน
1. จงอธบายเกยวกบตวแปรตวช คออะไร มหลกการอยางไร พรอมทงประโยชนของตวแปรชนดน
2. จงอธบายสญลกษณ & และสญลกษณ * ในการใชงานกบตวแปรตวช พรอมทงยกตวอยางประกอบ
3. การสรางแถวลาดบจากตวชมขอดกวาการสรางแถวลาดบแบบปกตอยางไร จงอธบาย 4. จงอธบายการใชงานฟงกชน malloc(), free(), calloc(), sizeof() และ realloc() พรอมทงยกตวอยางการใชงานของฟงกชน
5. จงเขยนผลลพธของโปรแกรมดงตอไปน
1 #include <stdio.h> 2 main() 3 { 4 int a=100; 5 float b=100.999f; 6 int *Ptra; 7 float *Ptrb; 8 Ptra = &a; 9 Ptrb = &b; 10 printf("a = %i\n",a); 11 printf("*Ptra = %i\n",*Ptra); 12 printf("Ptra = %p\n",Ptra); 13 printf("b = %f\n",b); 14 printf("*Ptrb = %f\n",*Ptrb); 15 printf("Ptrb = %p\n",Ptrb); 16 }
6. จงเขยนผลลพธของโปรแกรมดงตอไปน
1 #include <stdio.h> 2 main() 3 { 4 int a=5,b=10; 5 int *pa = &a; 6 void *px; 7 printf("a=%i b=%i\n",a,b); 8 px = pa; 9 b = *((int *)px); 10 printf("a=%i b=%i",a,b);11 }
บทท 10 ตวช
390
7. จงเขยนผลลพธของโปรแกรมดงตอไปน หากมความผดพลาดใหแกไขใหถกตองและเขยนผลลพธของโปรแกรม
1 #include <stdio.h> 2 3 main() 4 { 5 int **a,i,j; 6 a = (int **)malloc(5*sizeof(int *)); 7 for(i=0;i<5;i++) 8 a[i] = (int *)malloc(2*sizeof(int)); 9 for(i=0;i<5;i++) 10 for(j=0;j<2;j++) 11 { 12 a[i][j] = i*2+j; 13 printf("a[%i][%i] = %i\n",i,j,a[i][j]); 14 } 15 for(i=0;i<5;i++) free(a[i]); 16 free(a);
17 }
8. จงเขยนการอางองของตวแปรตวชในแถวลาดบดงน
แถวลาดบ ตวแปรตวช a[0] a[1] a[2] a[3] a[4] a[5]
แถวลาดบ ตวแปรตวช a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
บทท 10 ตวช
391
แถวลาดบ ตวแปรตวช a[0][0][0] a[0][0][1] a[0][0][2] a[0][0][3] a[0][1][0] a[0][1][1] a[0][1][2] a[0][1][3] a[1][0][0] a[1][0][1] a[1][0][2] a[1][0][3] a[1][1][0] a[1][1][1] a[1][1][2] a[1][1][3]
9. จงเขยนโปรแกรมคานวณหาคาเฉลยของเลข n จานวน โดยใชโครงสรางของแถวลาดบทสรางจากตวแปรตวชทสามารถเพมขนาดของจานวนสมาชกของแถวลาดบ โดย n จานวน
คอจานวนสมาชกของแถวลาดบทสามารถเปลยนแปลงไดจากการรบคาทผใชตองการ) 10. จงเขยนโปรแกรมบวกเลขของเมทรกซขนาด ขนาด 3 แถว 3 คอลมน โดยใชโครงสรางของแถวลาดบทสรางจากตวแปรตวช
บทท 11 แฟมขอมล
บทท 11
แฟมขอมล
ในบทนจะกลาวถงพนฐานแฟมขอมล (Fundamental of File) การทางานเกยวกบแฟมขอมลขอความ (Text File) ฟงกชนในการจดการแฟมขอมล (Function of File
Manipulation) การทางานเกยวกบแฟมฐานสอง (Binary File) และการเขาถงขอมลแบบสม
(Random Access) ลกษณะของขอมลของตวแปรไมวาจะเปนขอมลนาเขา หรอขอมลทไดจากการประมวลผลของโปรแกรม จะถกเกบในหนวยความจาขณะทประมวลผลโปรแกรมเทานน ดงนนจงไมสามารถนากลบมาใชใหมได หากตองการทจะเกบขอมลไวจะตองเกบไวในรปของแฟมขอมล (File) ซงจะถกเกบในหนวยความจาทสามารถเกบไดถาวรเชนจากหนวยความจาประเภทจานแมเหลกเปนตน ซงจะเปนประโยชนในการเขยนโปรแกรมในระดบสงตอไปอยางมประสทธภาพ เชนเปนประโยชนในการรบและแสดงผลขอมลจานวนมากได ซงถาเปนการรบและแสดงผลในลกษณะเดมจะสามารถกระทาไดครงละ 1 รายการ ทาใหไมกอใหเกดความสะดวกในการใชงาน เปนตน
11.1 พนฐานแฟมขอมล (Fundamental of File)
แฟมขอมลคอขอมลทถกจดเกบในรปแบบของแฟมทสามารถจดเกบไวในทเกบขอมลแบบถาวรได ซงจะทาใหเราสามารถเรยกใชงานแฟมขอมลไดตลอดเวลาเนองจากขอมลไมสญหาย แฟมขอมลเปรยบเสมอนกบการรวมขอมลทมความสมพนธกนหรอทเกยวของกนมาเกบไวในแฟมเดยวกน ทาใหสะดวกในการเรยกใชงาน โดยทวไปแฟมขอมลจะแบงออกเปนการบนทกขอมลลงแฟมขอมลและการอานขอมลจากแฟมขอมล ซงจะมขนตอนการทางานทคลายกนนนคอเรมตนจากการเปดแฟมขอมล (Open File) จากนนทาการบนทกขอมลลงแฟมขอมลหรออานแฟมขอมลจากแฟมขอมล (Write File and Read File) สดทายคอการปดแฟมขอมล (Close File) ดงแสดงในตวอยางในรปท 11.1
บทท 11 แฟมขอมล
394
รปท 11.1 ลกษณะรปแบบของการทางานของแฟมขอมล
นกเขยนโปรแกรม (Programmer) เมอดาเนนการเขยนโปรแกรมเกยวกบขอมลตางๆ เมอไดขอมลทตองการสามารถทจะนาไปบนทกลงไปในแฟมขอมลโดยการเปดแฟมขอมลใหเรยบรอยซงจะทาใหมตวชตาแหนงแฟมขอมล (File Pointer) โดยจะชทตาแหนงแรกสดของแฟมขอมล และจะมการเตรยมทพกขอมลหรอบฟเฟอร ทเปนทเกบขอมลชวคราว โดยขอมลจะถกนาไปเกบทพกขอมลกอนทจะนาลงไปบนทกทไฟล ซงในการบนทกแตละครงกจะทาใหตาแหนงของตวชเปลยนแปลงไป ในการบนทกขอมลลงในทพกขอมลเปรยบเสมอนการบนทกขอมลลงในแฟมขอมลซงถาทพกขอมลเตมกจะดาเนนการบนทกขอมลลงในแฟมขอมลโดยอตโนมตและถาหากไมเตมในทพกขอมลแตมการปดแฟมขอมลกจะมการบนทกขอมลทเหลอลงแฟมขอมลกอนจะปดแฟมขอมลนน สวนในการอานขอมลเมอมการอานขอมลกจะนาขอมลมาเกบไวยงทพกขอมล โดยในการอานในแตละครงจะไดขอมลตาแหนงทตวชตาแหนงขอมลในแฟมนนชอย ซงจะทาการอานขอมลจนสนสดแฟมขอมล (End of File)
ในภาษาซแฟมขอมลจะแบงออกเปน 2 ประเภทใหญๆ คอแฟมขอความและแฟมฐานสองโดยนกเขยนโปรแกรมจะเปนผ กาหนดชนดของแฟมขอมล
แฟมขอความ (Text File)
แฟมขอความคอแฟมขอมลทเกบขอมลในรปแบบของตวอกษร ทแยกแตละบรรทดของแฟมขอความโดยเครองหมาย “\n” ซงหมายถงการขนบรรทดใหม
แฟมทวภาคหรอแฟมฐานสอง (Binary File)
แฟมทวภาคคอแฟมขอมลทเกบขอมลในรปแบบของเลขฐานสองซงเปนรปแบบเฉพาะของคอมพวเตอร
บทท 11 แฟมขอมล
395
11.2 การทางานกบแฟมขอความ (Text Files)
การทางานกบแฟมขอความนน โปรแกรมจะตองมตวแปรซงเปนตวชขอมลในแฟมขอมลหรอตวชแฟมขอมล (File Pointer) ซงการประกาศตวแปรจะกาหนดใหเปนชนด
FILE โดยมรปแบบดงน
การกาหนดลกษณะนใหกบตวแปรจาเปนตองรวมไฟลสวนหว “stdio.h” เขาไวในการแปลโปรแกรมดวย เชน
FILE *input, *output;
เปนการกาหนดใหตวแปร input และตวแปร output เปนตวชแฟมขอมล
การเปดไฟล มรปแบบดงน
fopen() คอฟงกชนทสงใหมการเปดไฟลขน เพอดาเนนการใดๆ ตามทระบไวในสวนของ mode ซงโหมดการทางานของแฟมขอความแบงออกเปน 6 ชนด ดงตารางท 11.1
ตารางท 11.1 โหมดการทางานของแฟมขอความ
โหมด ความหมาย r เปดแฟมขอมลขนมาเพออานขอมลขางใน
- ถามแฟมขอมลอยแลว จะทาการกาหนดตาแหนงไปทตาแหนงเรมตนของแฟมขอมล
- ถายงไมมแฟมขอมล จะเกดขอผดพลาด (error) ขน
w เปดแฟมขอมลขนมาเพอเขยนขอมลลงไป
- ถามแฟมขอมลอยแลว แฟมขอมลนนจะถกลบแลวสรางขนใหม
- ถายงไมมแฟมขอมล จะสรางแฟมขอมลขนมาใหม
FILE *ชอตวแปรทกาหนดขนเพอเปนตวชขอมลในแฟมขอมล;
ชอตวแปรตวชแฟมขอมล = FILE *fopen(“ชอแฟมขอมลทตองการเปดใชงาน”,”mode”);
บทท 11 แฟมขอมล
396
a เปดแฟมขอมลขนมาเพอเขยนขอมลตอทายขอมลเดม
- ถามแฟมขอมลอยแลว จะทาการกาหนดตาแหนงไปทตาแหนงสดทายของแฟมขอมล เพอเรมตนเขยนขอมลตอทายขอมลเดม
- ถายงไมมแฟมขอมล จะสรางแฟมขอมลขนมาใหม
r+ เปดแฟมขอมลขนมาเพออานหรอเขยนขอมลทบแฟมขอมลเกา w+ เปดแฟมขอมลขนมาเพออานหรอเขยนขอมลทบแฟมขอมลเกา หรอสราง
แฟมขอมลใหมขนมาเพออานหรอเขยนขอมล a+ เปดแฟมขอมลขนมาเพอเขยนขอมลตอทายขอมลเกา หรอสราง
แฟมขอมลใหมขนมาเพอเขยนขอมล
เชน
input = fopen(“data.txt”,“r”);
เปนการเปดแฟมขอมลชอ data.txt จากสารบบ (Directory) ปจจบนทใชงานอย เพอทาการอานขอมล โดยกาหนดใหตวแปร input เปนตวชแฟมขอมล เพอใชในการอางถงขอมลในแฟมขอมล output = fopen(“c:\\data.txt”,“w”);
เปนการเปดแฟมขอมลชอ data.txt จากสารบบ c:\\ เพอทาการเขยนขอมลลงในแฟมขอมล โดยกาหนดใหตวแปร output เปนตวชแฟมขอมล เพอใชในการอางถงขอมลในแฟมขอมล
หากตวแปรตวชแฟมขอมล (input,output) มคาเทากบ NULL แสดงวาการเปดแฟมขอมลไมสาเรจ ซงในการเขยนโปรแกรมจะทาการแจงโดยใชคาสง exit(1) ซงเปนคาสงออกจากโปรแกรมในกรณทการจบการทางานของโปรแกรมโดยไมสมบรณแบบซงกคอเกดความผดพลาด แตถาจบการทางานของโปรแกรมโดยสมบรณแบบจะใชคาสง exit(0) ซงกคอไมเกดความผดพลาดนนเอง (คา 0 หมายถงสมบรณ คา 1 หมายถงผดพลาด) ในการใชงานฟงกชน exit() จะตองรวมไฟลสวนหว “stdlib.h” เขาไปในโปรแกรมดวย
บทท 11 แฟมขอมล
397
(ก) โหมด “r” กาหนดตวชแฟมขอมลไปยงตาแหนงเรมตนของแฟม
(ข) โหมด “w” กาหนดตวชแฟมขอมลไปยงตาแหนงเรมตนของแฟมขอมลเพอเขยน
ขอมลใหม
(ค) โหมด “a” กาหนดตวชแฟมขอมลไปยงตาแหนงสดทายของแฟมเพอเพมขอมล
ตอทายขอมลเดม
รปท 11.2 รปแสดงการทางานของแฟมขอความในโหมดตางๆ
การปดไฟล มรปแบบดงน
fclose() คอฟงกชนทสงใหมการปดแฟมขอมล ซงจะตองทาการปดแฟมขอมลทกครงทดาเนนการกบแฟมขอมลเสรจเรยบรอยแลว
fclose(ชอตวแปรตวชแฟมขอมล);
บทท 11 แฟมขอมล
398
ตวอยางท 11.1 โปรแกรมแสดงการเปดปดแฟมขอมล
1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 FILE *Ptr; 6 Ptr = fopen("c:\\data.txt","w"); 7 if(Ptr==NULL){ 8 printf("Cannot open file\n"); 9 exit(0); 10 } 11 fclose(Ptr); 12 }
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6 ใชฟงกชน fopen() เปดแฟมขอมล data.txt เพอเขยนขอมล บรรทดท 7-10 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม ถาไมสาเรจ (Ptr =
NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บรรทดท 11 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล data.txt นนเอง (ในกรณทเปดไฟลสาเรจ)
บทท 11 แฟมขอมล
399
11.3 ฟงกชนในการจดการแฟมขอมล (Function of File Manipulation)
การจดการแฟมขอมลจะมฟงกชนในการจดการแฟมขอมลทงในรปแบบของตวอกขระ (Character) และในรปแบบของขอความ (String) ซงจะมฟงกชนใชทแตกตางกนทงในสวนของการรบขอมลและการแสดงผลขอมล ซงในหวขอนจะแสดงตวอยางของฟงกชนทสาคญในการจดการแฟมขอมล และเพอแสดงใหเหนตวอยางทชดเจนในหวขอนจะแบงการจดการแฟมขอมลออกเปน 2 ประเภท
11.3.1 ฟงกชนในการจดการแฟมขอมลในรปแบบตวอกขระ ฟงกชนในการจดการแฟมขอมลในรปแบบตวอกขระจะเปนการประมวลผลทละ 1 ตว
อกขระหรอ 1 ตวอกษร โดยสามารถใชฟงกชน putc(), fputc(), getch(),และ fgetc() ในการจดการแฟมขอมลทละ 1 ตวอกขระ โดยแตละฟงกชนมรปแบบดงน
ฟงกชน putc() และ fputc()
ฟงกชน putc() และ fputc() คอฟงกชนในการบนทกขอมลทละ 1 ตวอกขระ เพอเกบลงในแฟมขอมลทตวชแฟมขอมลชอย เมอบนทกขอมลเรยบรอยแลวจะทาการเลอนตาแหนงของตวชไป 1 ตาแหนง โดยมรปแบบการใชงานดงน
เชน
FILE *Ptr;
char ch;
putc(ch,fPtr);
fputc(ch,fPtr);
putc(ตวแปรทเกบคาอกขระทตองการบนทก,ตวชแฟมขอมลทตองการบนทกขอมล);
fputc(ตวแปรทเกบคาอกขระทตองการบนทก,ตวชแฟมขอมลทตองการบนทกขอมล);
บทท 11 แฟมขอมล
400
ฟงกชน getc() และ fgetc()
ฟงกชน getc() และ fgetc() คอฟงกชนในการอานขอมลทละ 1 ตวอกขระ จากตาแหนงตวชแฟมขอมล โดยฟงกชนนจะมรปแบบการทางานทคลายกบฟงกชน getchar()
เพยงแตแตกตางกนในสวนของฟงกชน getchar() จะทาการอานตวอกขระทละตวจากอปกรณรบรองมาตรฐานแตฟงกชน getc() และ fgetc() จะทาการอานตวอกขระทละตวจากแฟมขอมล โดยมรปแบบการใชงานดงน
เชน
FILE *Ptr;
getc (Ptr);
fgetc(Ptr);
ในการอานขอมลจากแฟมขอมลถาเปนแฟมขอความจะอานจนจบแฟมขอมลแลวใหคา EOF ซงเปนการบอกวาจบแฟมขอมลแตถาเปนแฟมฐานสอง (Binary File) จะใชฟงกชน
feof() ตรวจสอบการสนสดของแฟมขอมล
getc(ตวชแฟมขอมลทตองการอานขอมล);
fgetc(ตวชแฟมขอมลทตองการอานขอมล);
บทท 11 แฟมขอมล
401
ตวอยางท 11.2 โปรแกรมรบขอมลจากแผงแปนอกขระบนทกลงแฟมขอมล จานวน 5 ตวอกขระ
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 char ch; 7 int i; 8 if((Ptr = fopen("data.txt","w")) == NULL) 9 { 10 printf("Cannot Open File \n"); exit(0); 11 } 12 for(i =1; i<=5;i++) 13 { 14 ch = getchar(); 15 fputc(ch,Ptr); 16 } 17 fclose(Ptr);18 }
ผลลพธของโปรแกรม abcde
ผลลพธในสวนของแฟมขอมล
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6-7 กาหนดตวแปร ch เปนตวแปรอกขระ และกาหนดตวแปร i เปนตวแปรของเลขจานวนเตม
บรรทดท 8-11 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไมโดยจะทาการเปดแฟมขอมลเพอทาการเขยนขอมลลงไปใหมจากแฟมในโหมด “w”
ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file”
แลวออกจากโปรแกรม
บรรทดท 12-16 ทาการรบตวอกขระจากแผงแปนอกขระจานวน 5 ตวอกขระ จากนนใหทาการบนทกลงในแฟมขอมล
บรรทดท 17 ใชฟงกชน fclose() ปดแฟมขอมล
บทท 11 แฟมขอมล
402
ตวอยางท 11.3 โปรแกรมบนทกตวอกขระตงแตตวอกขระ a-z ลงในแฟมขอมล
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 char ch; 7 int i = 0; 8 if((Ptr = fopen("data.txt","w")) == NULL) 9 { 10 printf("Cannot Open File \n");exit(0); 11 } 12 for(ch='a';ch<='z';ch++) 13 { 14 fputc(ch,Ptr); 15 } 16 fclose(Ptr);
17 }
ผลลพธในสวนของแฟมขอมล
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6-7 กาหนดตวแปร ch เปนตวแปรอกขระ และกาหนดตวแปร i เปนตวแปรของเลขจานวนเตม
บรรทดท 8-11 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการเขยนขอมลลงไปใหมจากแฟมในโหมด “w”
ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file”
แลวออกจากโปรแกรม
บรรทดท 12-15 ทาการบนทกตวอกขระ a-z ลงในแฟมขอมล บรรทดท 17 ใชฟงกชน fclose() ปดแฟมขอมล
บทท 11 แฟมขอมล
403
ตวอยางท 11.4 โปรแกรมอานขอมลจากแฟมขอมล data.txt ทมขอมลตวอกษรตงแตตว a-z
แฟมขอมล data.txt มขอมลดงน
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 char ch; 7 if((Ptr = fopen("data.txt","r")) == NULL) 8 { 9 printf("Cannot Open File \n");exit(0); 10 } 11 ch = fgetc(Ptr); 12 while(ch != EOF) 13 { 14 putchar(ch); 15 ch = fgetc(Ptr); 16 } 17 fclose(Ptr);18 }
ผลลพธของโปรแกรม abcdefghijklmnopqrstuvwxyz
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6-7 กาหนดตวแปร ch เปนตวแปรอกขระ และกาหนดตวแปร i เปนตวแปรของเลขจานวนเตม
บรรทดท 8-11 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการอานขอมลจากแฟมในโหมด “r” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บทท 11 แฟมขอมล
404
บรรทดท 12-16 ทาการตรวจสอบและอานขอมลทละตวอกขระโดยจะทาการตรวจสอบกบคา EOF (End of Line) วาจบแฟมขอมลแลวหรอไม
ถายงไมจบแฟมขอมลใหทาการอานขอมลทละอกขระไปจนกวาจะจบแฟมขอมล
บรรทดท 17 ใชฟงกชน fclose() ปดแฟมขอมล
11.3.2 ฟงกชนในการจดการแฟมขอมลในรปแบบขอความ
ฟงกชนในการจดการแฟมขอมลในรปแบบขอความจะเปนการประมวลผลทละ 1 สายอกขระหรอขอความ (String) จานวนหลายตวอกขระ โดยสามารถใชฟงกชน fputs(), fgets(),
fprint() และ fscanf() ในการจดการแฟมขอมลทละสายอกขระโดยแตละฟงกชนมรปแบบดงน
ฟงกชน fputs() และ fgets()
ฟงกชน fputs() และ fgets() คอฟงกชนในการบนทกขอมลและอานขอมลทละสายอกขระ โดยฟงกชน fputs() จะเปนฟงกชนในการบนทกขอมลลงในแฟมขอมลทเปนสายอกขระซงถาเกดคาผดพลาดจะคนคา NULL กลบมา สวนฟงกชน fgets() จะเปนฟงกชนในการอานขอมลสายอกขระจากแฟมขอมลโดยจะนาเขามาเกบทตวแปรแถวลาดบ โดยจะอานขอมลสายอกขระจนกวาจะพบ “\n” ซงถาเกดคาผดพลาดกจะคนคา NULL กลบมา โดยฟงกชนทงสองมรปแบบการใชงานดงน
เชน
FILE *Ptr;
char name[20];
fputs(name,Ptr);
และ FILE *Ptr;
char str[128];
fgets(str,126,Ptr);
fputs(ตวแปรทเกบคาสายอกขระทตองการบนทก,ตวชแฟมขอมลทตองการบนทกขอมล);
fgets(ตวแปรแถวลาดบทจะเกบขอมลจากการอาน,จานวนไบตของขอมลทตองการอานขอมลในแตละครง,ตวชแฟมขอมลทตองการบนทกขอมล);
บทท 11 แฟมขอมล
405
ตวอยางท 11.5 โปรแกรมรบคาสายอกขระจานวน 3 สายอกขระแลวบนทกลงในแฟมขอมล
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 char str[30]; 7 int i; 8 if((Ptr = fopen("data.txt","w")) == NULL) 9 { 10 printf("Cannot Open File \n");exit(0); 11 } 12 for(i=1;i<=3;i++) 13 { 14 printf("Input name [%i] ",i); 15 gets(str); 16 fputs(str,Ptr); 17 } 18 fclose(Ptr); 19 }
ผลลพธของโปรแกรม Input name [1] Asst.Prof.Dr. Input name [2] Krit Input name [3] Somkantha
ผลลพธในสวนของแฟมขอมล
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6-7 กาหนดตวแปร str เปนตวแปรสายอกขระ และกาหนดตวแปร i เปนตวแปรของเลขจานวนเตม
บรรทดท 8-11 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการเขยนขอมลลงไปใหมจากแฟมในโหมด “w” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บทท 11 แฟมขอมล
406
บรรทดท 12-17 ทาการรบคาขอความสายอกขระจานวน 3 ขอความจากแผงแปนอกขระ และบนทกคาขอความสายอกขระลงในแฟมขอมล
บรรทดท 18 ใชฟงกชน fclose() ปดแฟมขอมล
ตวอยางท 11.6 โปรแกรมอานขอมลสายอกขระจากแฟมขอมลทละ 10 ตวอกขระ แลวนาไปแสดงผลทจอภาพทละ 10 ตวอกขระ
แฟมขอมล data.txt มขอมลดงน
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 char str[20]; 7 int i; 8 if((Ptr = fopen("data.txt","r")) == NULL) 9 { 10 printf("Cannot Open File \n");exit(0); 11 } 12 while(!feof(Ptr)) 13 { 14 fgets(str,11,Ptr); 15 printf("%s \n",str); 16 } 17 fclose(Ptr);
18 }
ผลลพธของโปรแกรม 1111111111 2222222222 2222222222 3333333333 4444444444 55555
บทท 11 แฟมขอมล
407
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6-7 กาหนดตวแปร str เปนตวแปรสายอกขระ และกาหนดตวแปร i เปนตวแปรของเลขจานวนเตม
บรรทดท 8-11 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการอานขอมลจากแฟมในโหมด “r” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บรรทดท 12-16 ทาการตรวจสอบตาแหนงปจจบนของตวชแฟมขอมลวาเปนตาแหนงสนสดของแฟมขอมลหรอไม ถาไมสนสดใหทาการอานแฟมขอมลทละ 11 ตว เกบไวยงตวแปรแถวลาดบ str (ซงในโปรแกรมกาหนด 11
ตวเพอทาการเกบตวอกขระจานวน 10 ตว โดยจะทาใหโปรแกรมแสดงผลทละ 10 ตวออกทางจอภาพ) จากนนทาการแสดงผลขอมลทอยในแถวลาดบ str ออกทางจอภาพทละสายอกขระทอานเขามา และใหทาไปจนสนสดของแฟมขอมล
บรรทดท 17 ใชฟงกชน fclose() ปดแฟมขอมล
ฟงกชน fprintf() และ fscanf()
ฟงกชน fprintf() และ fscanf() คอฟงกชนในการบนทกขอมลและอานขอมลทสามารถกาหนดรปแบบของการประมวลผลได ซงฟงกชนทงสองจะมลกษณะการทางานทคลายกนกบฟงกชน printf() และ scanf() เพยงแตแตกตางกนตรงทฟงกชน fprintf() และ fscanf() เปนการบนทกขอมลและอานขอมลกบแฟมขอมล ฟงกชน fscanf จะคนคาออกมาเปนเลขจานวนเตม
ซงบอกสถานะของการอานขอมล หากมการสงใหอานขอมลใดๆ แตขอมลไมมใหอานเนองจากตวชแฟมขอมลชไปทตาแหนงสดทายของไฟล ฟงกชน fscanf จะคนคาออกมาเปน
EOF (End Of File)
บทท 11 แฟมขอมล
408
โดยฟงกชนทงสองมรปแบบการใชงานดงน
รหสรปแบบของการบนทกและการอานขอมลคอตวแทนชนดขอมลทตองการบนทกและการอานขอมล ตวอยางรหสรปแบบคอ %i, %d , %f, %s เปนตน
เชน
FILE *Ptr;
float a,b,c;
fprintf(Ptr,”%f %f %f”,a,b,c);
และ FILE *Ptr;
char str[128];
fscanf(Ptr,”%s”,char);
ตวแปรทจะเกบขอมลจากการอานคอทอยของตวแปรเพอเกบขอมลทรบเขามาจากการอานจากแฟมขอมล ในหนวยความจาตรงตาแหนงใดๆ ซงตองใชเครองหมายแอมเพอรแซนด & นาหนาชอตวแปรทตองการรบขอมลเขามาเกบไว ยกเวนการรบขอมลสายอกขระ ไมตองนาหนาชอตวแปรดวยเครองหมายแอมเพอรแซนด
fprintf(ตวชตาแหนงขอมลในแฟมขอมล,“รหสรปแบบของการบนทกขอมล”,ตวแปรทเกบคาสายอกขระทตองการบนทก);
fscanf(ตวชตาแหนงขอมลในแฟมขอมล,“รหสรปแบบของการอานขอมล”,ตวแปรทจะเกบขอมลจากการอาน);
บทท 11 แฟมขอมล
409
ตวอยางท 11.7 โปรแกรมอานขอมลสายอกขระจากแฟมขอมล แลวนาไปแสดงผลทจอภาพทละบรรทด
แฟมขอมล data.txt มขอมลดงน
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 char id[5],name[20]; 7 int midterm,final; 8 Ptr = fopen("data.txt","r"); 9 if(Ptr==NULL){ 10 printf("Cannot open file\n"); 11 exit(0); 12 } 13 else{ 14 printf("Id\tName\t\tMidterm\tFinal\n"); 15 while(fscanf(Ptr,"%s %s %d %d",id ,name ,
&midterm,&final)!= EOF) 16 { 17 printf("%s \t%s \t%d \t%d\n",id,name,midterm,final); 18 } 19 fclose(Ptr); 20 }
21 }
ผลลพธของโปรแกรม Id Name Midterm Final 001 Wilaiporn 67 25 002 Witchakorn 66 29 003 Ahumporn 70 30
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บทท 11 แฟมขอมล
410
บรรทดท 6-7 กาหนดตวแปร id และ name เปนตวแปรสายอกขระ และกาหนดตวแปร midterm และ final เปนตวแปรของเลขจานวนเตม
บรรทดท 8-12 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการอานขอมลจากแฟมในโหมด “r” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม ถาเปดแฟมขอมลสาเรจใหไปทางานในบรรทดท 13
บรรทดท 13-18 ทาการตรวจสอบตาแหนงปจจบนของตวชแฟมขอมลวาเปนตาแหนงสนสดของแฟมขอมลหรอไม ถาไมสนสดใหทาการอานแฟมขอมลทละบรรทดโดยเกบไวทตวแปร 4 ตว (id, name, midterm, final)
จากนนใหแสดงผลลพธทอานจากแฟมขอมลทเกบไวในตวแปรทง 4
ตวออกทางจอภาพ และใหทาซาไปจนสนสดของแฟมขอมล บรรทดท 19 ใชฟงกชน fclose() ปดแฟมขอมล
ตวอยางท 11.8 โปรแกรมแสดงการเขยนขอมลลงในแฟมขอความ
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 void main(void) 5 { 6 FILE *Ptr; 7 char id[5],name[20],ans; 8 int midterm,final,i; 9 Ptr = fopen("output.txt","w"); 10 if(Ptr==NULL){ 11 printf("Cannot open file\n"); 12 exit(0); 13 } 14 else{ 15 i=0; 16 do{ 17 printf("\nEnter id,name,midterm and final of student
%d :",i+1); 18 scanf("%s %s %d %d",id,name,&midterm,&final); 19 fprintf(Ptr,"%s \t%s \t%d \t%d\n"
,id,name,midterm,final); 20 printf("\nDo you want to add data?\n"); 21 printf("Yes(press y) or No(press any key) :"); 22 ans = getche(); 23 i++; 24 }while(ans=='y'); 25 fclose(Ptr); 26 }
27 }
บทท 11 แฟมขอมล
411
ผลลพธของโปรแกรม Enter id,name,midterm and final of student 1 :001 Krit 70 30 Do you want to add data? Yes(press y) or No(press any key) : Enter id,name,midterm and final of student 2 :002 Aumporn 69 29 Do you want to add data? Yes(press y) or No(press any key) : Enter id,name,midterm and final of student 3 :003 Insol 65 25 Do you want to add data? Yes(press y) or No(press any key) : n
ผลลพธในสวนของแฟมขอมล
อธบายโปรแกรม
บรรทดท 6 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 7-8 กาหนดตวแปร id, และ name เปนตวแปรสายอกขระ กาหนดตวแปร ans เปนตวแปรอกขระ และกาหนดตวแปร midterm, final และ i เปนตวแปรของเลขจานวนเตม
บรรทดท 9-13 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการเขยนขอมลลงไปใหมจากแฟมในโหมด “w” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม ถาเปดแฟมขอมลสาเรจใหไปทางานบรรทดท 14
บรรทดท 14-24 ทาการรบขอมลสายอกขระทางแผงแปนอกขระเพอนาไปเกบไวในตวแปรทง 4 ตว (id, name, midterm, final) จากนนใหบนทกขอมลลงในแฟมขอมลทตวชแฟมขอมลชอย (Ptr) เมอทาการบนทกขอมลเรยบรอยใหตรวจสอบวาตองการเพมขอมลลงแฟมขอมลอกหรอไมผานตวแปร ans ถาตองการเพมขอมลพมพ “y” กจะทาการรบขอมล
บทท 11 แฟมขอมล
412
สายอกขระทางแผงแปนอกขระอกทง 4 ตวและนาไปบนทกขอมล ถาไมตองการใหพมพตวอกขระอนๆ จะเปนการกระโดดไปบรรทดท 25
บรรทดท 25 ใชฟงกชน fclose() ปดแฟมขอมล
ตวอยางท 11.9 โปรแกรมแสดงการเขยนขอมลตอทายลงในแฟมขอมลเกา
แฟมขอมลเกา output.txt
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 void main(void) 5 { 6 FILE *Ptr; 7 char id[5],name[20],ans; 8 int midterm,final,i; 9 Ptr = fopen("output.txt","a"); 10 if(Ptr==NULL){ 11 printf("Cannot open file\n"); 12 exit(0); 13 } 14 else{ 15 i=0; 16 do{ 17 printf("\nEnter id,name,midterm and final of student
%d :",i+1); 18 scanf("%s %s %d %d",id,name,&midterm,&final); 19 fprintf(Ptr,"%s \t%s \t%d \t%d\n"
,id,name,midterm,final); 20 printf("\nDo you want to add data?\n"); 21 printf("Yes(press y) or No(press any key) :"); 22 ans = getche(); 23 i++; 24 }while(ans=='y'); 25 fclose(Ptr); 26 }
27 }
บทท 11 แฟมขอมล
413
ผลลพธของโปรแกรม Enter id,name,midterm and final of student 1 :004 Wilai 65 15 Do you want to add data? Yes(press Y) or No(press any key) :Y Enter id,name,midterm and final of student 2 :005 Witcha 70 30 Do you want to add data? Yes(press Y) or No(press any key) :n
ผลลพธในสวนของแฟมขอมลใหม
อธบายโปรแกรม
บรรทดท 6 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 7-8 กาหนดตวแปร id, และ name เปนตวแปรสายอกขระ กาหนดตวแปร ans เปนตวแปรอกขระ และกาหนดตวแปร midterm, final และ i เปนตวแปรของเลขจานวนเตม
บรรทดท 9-13 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเกาเพอทจะทาการบนทกขอมลตอทายในโหมด “a” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม ถาเปดแฟมขอมลสาเรจใหไปทางานในบรรทดท
14 ซงในโปรแกรมนจะแตกตางตรงการกาหนดคาโหมด “w” และ โหมด “a” โดยโหมด “w” จะเปนการเปดแฟมขอมลขนมาเพอเขยนขอมลลงไปใหม สวนโหมด “a” จะเปนการเปดแฟมขอมลขนมาเพอเขยนขอมลตอทายขอมลเดม
บทท 11 แฟมขอมล
414
บรรทดท 14-24 ทาการรบขอมลสายอกขระทางแผงแปนอกขระเพอนาไปเกบไวในตวแปรทง 4 ตว (id, name, midterm, final) จากนนใหบนทกขอมลลงในแฟมขอมลทตวชแฟมขอมลชอย (Ptr) เมอทาการบนทกขอมลเรยบรอยใหตรวจสอบวาตองการเพมขอมลลงแฟมขอมลอกหรอไมผานตวแปร ans ถาตองการเพมขอมลพมพ “y” กจะทาการรบขอมลสายอกขระทางแผงแปนอกขระอกทง 4 ตวและนาไปบนทกขอมล ถาไมตองการใหพมพตวอกขระอนๆ กจะเปนการกระโดยไปยงบรรทดท
25
บรรทดท 25 ใชฟงกชน fclose() ปดแฟมขอมล
ตวอยางท 11.10 โปรแกรมแสดงการสาเนาขอมลระหวางแฟมขอมล output.txt ไปยงแฟมขอมล output1.txt
แฟมขอมลเกา output.txt ทมอยแลว
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 void main(void) 5 { 6 FILE *Ptr,*Ptr1; 7 char id[5],name[20]; 8 int midterm,final; 9 Ptr = fopen("output.txt","r"); 10 if(Ptr ==NULL){ 11 printf("Cannot open file\n"); 12 exit(0); 13 } 14 Ptr1 = fopen("output1.txt","w"); 15 if(Ptr1==NULL){ 16 printf("Cannot open file\n"); 17 exit(0); 18 }
บทท 11 แฟมขอมล
415
19 while(fscanf(Ptr,"%s %s %d %d",id,name,&midterm,&final) != EOF){
20 fprintf(Ptr1,"%s \t%s \t%d \t%d\n",id,name,midterm,final); 21 } 22 printf("File copy complete\n"); 23 fclose(Ptr); 24 fclose(Ptr1);25 }
ผลลพธของโปรแกรม File copy complete
ผลลพธในสวนของแฟมขอมลใหม output1.txt
อธบายโปรแกรม
บรรทดท 6 กาหนดตวแปร Ptr และ Ptr1 เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 7-8 กาหนดตวแปร id, และ name เปนตวแปรสายอกขระ และกาหนดตวแปร midterm และ final เปนตวแปรของเลขจานวนเตม
บรรทดท 9-13 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการอานขอมลจากแฟมในโหมด “r” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม ถาเปดแฟมขอมลสาเรจใหไปทางานในบรรทดท 14
บรรทดท 14-18 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการเขยนขอมลลงไปใหมจากแฟมในโหมด “w”
ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file”
แลวออกจากโปรแกรม ถาเปดแฟมขอมลสาเรจใหไปทางานในบรรทดท 19
บทท 11 แฟมขอมล
416
บรรทดท 19-21 อานขอมลจากแฟมขอมล output.txt เพอไปเกบไวในตวแปร id
,name ,midterm และ final ถามขอมลใหทาบรรทดท 20 ถาไมมขอมลแลวใหทาบรรทดท 22 โดยในบรรทดท 20 จะเปนการบนทกคาของขอมลลงแฟมขอมล output1.txt ซงจะทาการทาซาไปจนกวาจะสนสดขอมล
บรรทดท 23 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล output.txt
บรรทดท 24 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr1 เลกการชไปทแฟมขอมล output1.txt
11.4 การทางานเกยวกบแฟมฐานสอง (Binary File)
แฟมขอมลฐานสองหรอแฟมฐานสองคอชนดของขอมลทอยในรปของเลขฐานสองซงเปนรปแบบเฉพาะของคอมพวเตอร ในภาษาซแบงชนดของแฟมขอมลออกเปน 2 ชนด นนคอแฟมขอความ (Text File) และ แฟมฐานสอง (Binary File) ซงผ เขยนโปรแกรมจะเปนผ กาหนดชนดของแฟมขอมลทใช ซงจากหวขอทผานมาไดกลาวถงแฟมขอความและวธการใชงานตางๆ ในสวนนจะกลาวถงแฟมฐานสองโดยจะมรปแบบของการทางานคลายกนกบการทางานของแฟมทวไป ซงการประกาศตวแปรจะกาหนดใหเปนชนด FILE ในรปแบบของแฟมฐานสองโดยมรปแบบดงน
FILE *input, *output;
เปนการกาหนดใหตวแปร input และตวแปร output เปนตวชแฟมขอมล
การเปดไฟล มรปแบบดงน
FILE *ชอตวแปรทกาหนดขนเพอเปนตวชขอมลในแฟมขอมล;
ชอตวแปรตวชแฟมขอมล = FILE *fopen(“ชอแฟมขอมลทตองการเปดใชงาน”,“mode”);
บทท 11 แฟมขอมล
417
fopen() คอฟงกชนทสงใหมการเปดไฟลขน เพอดาเนนการใดๆ ตามทระบไวในสวนของ mode ซงโหมดการทางานของเทกซไฟลแบงออกเปน 6 ชนด ดงตารางท 11.2
ตารางท 11.2 โหมดการทางานของแฟมขอความชนดแฟมฐานสอง
โหมด ความหมาย rb เปดแฟมฐานสองขนมาเพออานขอมลขางใน โดยถายงไมมแฟมฐานสอง
จะเกดขอผดพลาด (error) ขน
wb เปดแฟมฐานสองขนมาเพอเขยนขอมลลงไป
- ถามแฟมขอมลอยแลว แฟมขอมลนนจะถกลบแลวสรางขนใหม
- ถายงไมมแฟมขอมล จะสรางแฟมขอมลขนมาใหม
ab เปดแฟมฐานสองขนมาเพอเขยนขอมลตอทายขอมลเดม
- ถามแฟมขอมลอยแลว จะทาการกาหนดตาแหนงไปทตาแหนงสดทายของแฟมขอมล เพอเรมตนเขยนขอมลตอทายขอมลเดม
- ถายงไมมแฟมขอมล จะสรางแฟมขอมลขนมาใหม
r+b หรอ rb+ เปดแฟมฐานสองขนมาเพออานหรอเขยนขอมลทบแฟมขอมลเกา w+b หรอ wb+ เปดแฟมฐานสองขนมาเพออานหรอเขยนขอมลทบแฟมขอมลเกา หรอ
สรางแฟมขอมลใหมขนมาเพออานหรอเขยนขอมล a+b หรอ ab+ เปดแฟมฐานสองขนมาเพอเขยนขอมลตอทายขอมลเกา หรอสราง
แฟมขอมลใหมขนมาเพอเขยนขอมลฐานสองใหม
เชน
input = fopen(“data.txt”,“rb”);
เปนการเปดแฟมฐานสองชอ data.txt จากสารบบ (Directory) ปจจบนทใชงานอย เพอทาการอานขอมลฐานสอง โดยกาหนดใหตวแปร input เปนตวชแฟมขอมล เพอใชในการอางถงขอมลในแฟมขอมล output = fopen(“c:\\data.txt”,“wb”);
บทท 11 แฟมขอมล
418
เปนการเปดแฟมฐานสองชอ data.txt จากสารบบ c:\\ เพอทาการเขยนขอมลลงในแฟมขอมล โดยกาหนดใหตวแปร output เปนตวชแฟมขอมล เพอใชในการอางถงขอมลในแฟมขอมล
การปดไฟล มรปแบบดงน
fclose() คอฟงกชนทสงใหมการปดแฟมฐานสอง เชนเดยวกนกบแฟมขอความ ซงจะตองทาการปดแฟมขอมลทกครงทดาเนนการกบแฟมขอมลเสรจเรยบรอยแลว
ตวอยางท 11.11 โปรแกรมแสดงการเปดปดแฟมฐานสอง
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 Ptr = fopen("c:\\data.txt","wb"); 7 if(Ptr==NULL){ 8 printf("Cannot open file\n"); 9 exit(0); 10 } 11 fclose(Ptr); 12 }
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6 ใชฟงกชน fopen() เปดแฟมฐานสองชอ data.txt เพอเขยนขอมล บรรทดท 7-10 ทาการตรวจสอบวาเปดแฟมฐานสองสาเรจหรอไม ถาไมสาเรจ (Ptr
= NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บรรทดท 11 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล data.txt นนเอง (ในกรณทเปดไฟลสาเรจ)
fclose(ชอตวแปรตวชแฟมขอมล);
บทท 11 แฟมขอมล
419
ในการทางานเกยวกบแฟมฐานสองจะมฟงกชนทสาคญทใชในการจดการกบแฟมฐานสองคอ ฟงกชน fread() และ fwrite() ซงเปนฟงกชนทใชอานและเขยนกบแฟมฐานสองโดยมรปแบบการใชงานของฟงกชนดงน
ในการใชฟงกชนนควรจะมการตรวจสอบการจบแฟมขอมลโดยฟงกชน feof() เพอตรวจสอบการจบแฟมขอมล
ตวอยางท 11.12 โปรแกรมแสดงการเขยนแฟมฐานสอง
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 int i; 7 if((Ptr = fopen("data.txt","wb")) == NULL) 8 { 9 printf("Cannot Open File \n"); exit(0); 10 } 11 i = 100; 12 fwrite(&i,sizeof(int),1,Ptr); 13 fclose(Ptr);14 }
ผลลพธในสวนของแฟมขอมลใหม data.txt
หลงจากเขยนแฟมฐานสองเรยบรอยเมอทาการเปดไฟล data.txt จะปรากฏตวอกษร “d” ซงกคอ “64” ในเลขฐานสบหก “01100100” ในเลขฐานสอง และ “100” ในเลขฐานสบ
fread(ตาแหนงของหนวยความจาทตองการนาขอมลจากแฟมมาเกบไว,ขนาดของขอมล, จานวนขอมลทตองการอาน,ชอตวแปรตวชแฟมขอมล);
fwrite(ตาแหนงของหนวยความจาทตองการบนทกลงในแฟม,ขนาดของขอมล, จานวนขอมลทตองการเขยน,ชอตวแปรตวชแฟมขอมล);
บทท 11 แฟมขอมล
420
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 6 ใชฟงกชน fopen() เปดแฟมฐานสองชอ data.txt เพอเขยนขอมล บรรทดท 7-10 ทาการตรวจสอบวาเปดแฟมฐานสองสาเรจหรอไม โดยจะทาการ
เปดแฟมขอมลเพอทาการเขยนขอมลจากแฟมในโหมด “wb” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บรรทดท 11 กาหนดคาตวแปรจานวนเตม
บรรทดท 12 ใชฟงกชน fwrite() เขยนแฟมฐานสอง โดยระบขนาดของขอมลทตองการเขยนเปน sizeof(int) และระบจานวน 1 ครง
บรรทดท 13 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล data.txt นนเอง
ตวอยางท 11.13 โปรแกรมแสดงการอานแฟมฐานสองจากแฟม data.txt ของอยางกอนหนา
1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(void) 4 { 5 FILE *Ptr; 6 int i; 7 if((Ptr = fopen("data.txt","rb")) == NULL) 8 { 9 printf("Cannot Open File \n"); exit(0); 10 } 11 fread(&i,sizeof(int),1,Ptr); 12 printf("Data is %i",i); 13 fclose(Ptr);
14 }
ผลลพธของโปรแกรม Data is 100
อธบายโปรแกรม
บรรทดท 5 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บทท 11 แฟมขอมล
421
บรรทดท 6 ใชฟงกชน fopen() เปดแฟมฐานสองชอ data.txt เพอเขยนขอมล บรรทดท 7-10 ทาการตรวจสอบวาเปดแฟมฐานสองสาเรจหรอไม โดยจะทาการ
เปดแฟมขอมลเพอทาการอานขอมลจากแฟมในโหมด “rb” ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บรรทดท 11 ใชฟงกชน fread() อานแฟมฐานสอง โดยระบขนาดของขอมลทตองการเขยนเปน sizeof(int) และระบจานวน 1 ครง
บรรทดท 12 แสดงผลลพธของขอมลททาการอานจากไฟล บรรทดท 13 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล data.txt นนเอง
11.5 การเขาถงขอมลแบบสม (Random Access)
การเขาถงขอมลแบบสมคอการเขาถงขอมลโดยตรงทาใหสามารถดาเนนการประมวลผลขอมลทตองการไดทนท ซงจากการใชงานแฟมขอมลทผานจะเปนการเขาถงแบบลาดบโดยจะอานขอมลขนมาทละลาดบจนกวาจะถงตาแหนงสดทายของขอมล ซงจะทาใหเสยเวลาในการดาเนนการ แตการเขาถงขอมลแบบสมสามารถเขาถงขอมลทตองการทนท ซงในการเขาถงขอมลแบบสมจะมการใชฟงกชนทสาคญคอ ฟงกชน rewind() ฟงกชน ftell() และ ฟงกชน fseek() เปนตน
ฟงกชน rewind()
ฟงกชน rewind() คอฟงกชนในการยายตาแหนงของตวช (Pointer) ไปยงตาแหนงเรมตนของขอมล ซงประโยชนของฟงกชนนเชนการนามาใชกบการเปดแฟมขอมลเกาเพออานหรอเขยนขอมลทบขอมลเดมหรอสรางแฟมขอมลใหม ซงเมอทาการเขยนขอมลเรยบรอยและถาตองการอานขอมลจากแฟมขอมลใหมจะไมสามารถอานขอมลไดเนองจากตวชจะชไปยงตาแหนงสดทายของแฟมขอมลดงนนจะตองใชฟงกชน rewind() เพอใหตวชชไปยงตาแหนงเรมตนของแฟมขอมลกอน จงจะสามารถอานขอมลได โดยฟงกชนมรปแบบการใชงานดงน
rewind(ตวแปรตวชทชไปยงแฟมขอมล);
บทท 11 แฟมขอมล
422
เชน
FILE *Ptr;
rewind(Ptr);
abcdefghijklmnop
Ptr
abcdefghijklmnop
Ptr
rewind(Ptr)
รปท 11.3 แสดงตวอยางการใชฟงกชน rewind()
จากรปท 11.3 แสดงใหเหนวาเมอเขยนขอมลเสรจสนตาแหนงตวชจะชไปยงตาแหนงสดทายของแฟมขอมลนนแตเมอใชคาสง rewind(Ptr) แลวตาแหนงตวชจะชไปยงตาแหนงเรมตนของขอมลทชไปยงตว “a”
ตวอยางท 11.14 โปรแกรมแสดงการใชฟงกชน rewind() โดยจะสาเนาขอมลระหวางแฟมขอมล output.txt ไปยงแฟมขอมล output1.txt ซงจะทาการสาเนาในสวนของแฟมขอมล output1.txt ดวย
แฟมขอมลเกา output.txt ทมอยแลว
บทท 11 แฟมขอมล
423
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 void main(void) 5 { 6 FILE *Ptr,*Ptr1; 7 char id[5],name[20]; 8 int midterm,final; 9 Ptr = fopen("output.txt","r"); 10 if(Ptr ==NULL){ 11 printf("Cannot open file\n"); 12 exit(0); 13 } 14 Ptr1 = fopen("output1.txt","a"); 15 if(Ptr1==NULL){ 16 printf("Cannot open file\n"); 17 exit(0); 18 } 19 fscanf(Ptr,"%s %s %d %d",id,name,&midterm,&final); 20 fprintf(Ptr1,"%s \t%s \t%d \t%d\n",id,name,midterm,final); 21 rewind(Ptr1); 22 fscanf(Ptr1,"%s %s %d %d",id,name,&midterm,&final); 23 fprintf(Ptr1,"%s \t%s \t%d \t%d\n",id,name,midterm,final); 24 printf("File copy complete\n"); 25 fclose(Ptr); 26 fclose(Ptr1);
27 }
ผลลพธของโปรแกรม File copy complete
ผลลพธในสวนของแฟมขอมลใหม output1.txt
อธบายโปรแกรม
บรรทดท 6 กาหนดตวแปร Ptr และ Ptr1 เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 7-8 กาหนดตวแปร id, และ name เปนตวแปรสายอกขระ และกาหนดตวแปร midterm และ final เปนตวแปรของเลขจานวนเตม
บรรทดท 9-13 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการอานขอมลจากแฟมในโหมด “r” ถาไมสาเรจ
บทท 11 แฟมขอมล
424
(Ptr = NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม ถาเปดแฟมขอมลสาเรจใหไปทางานในบรรทดท 14
บรรทดท 14-18 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการเขยนขอมลลงไปใหมจากแฟมในโหมด “a”
ถาไมสาเรจ (Ptr = NULL) จะแสดงขอความ “Cannot open file”
แลวออกจากโปรแกรม ถาเปดแฟมขอมลสาเรจใหไปทางานในบรรทดท 19
บรรทดท 19 อานขอมลจากแฟมขอมล output.txt ทตวช Ptr ชอย เพอไปเกบไวในตวแปร id ,name ,midterm และ final
บรรทดท 20 บนทกคาของขอมลลงแฟมขอมล output1.txt ทตวช Ptr1 ชอย ซงจะทาบนทกและทาใหคาตวช Ptr1 ชไปยงตาแหนงสดทายของขอมล
บรรทดท 21 ใชฟงกชน rewind() เพอใหตวช Ptr1 ชไปยงตาแหนงเรมตนของไฟล ถาไมมฟงกชนนในสวนถดไปจะไมสามารถอานไฟลไดเนองจากตาแหนงของตวชอยทตาแหนงสดทาย
บรรทดท 22 อานขอมลจากแฟมขอมล output1.txt (อานจากตวแฟมขอมลเดมซา) ทตวช Ptr1 ชอย เพอไปเกบไวในตวแปร id ,name ,midterm
และ final
บรรทดท 23 บนทกคาของขอมลลงแฟมขอมล output1.txt ทตวช Ptr1 ชอย ซงจะทาบนทกตอทายแฟมขอมลเดม
บรรทดท 25 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล output.txt
บรรทดท 26 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr1 เลกการชไปทแฟมขอมล output1.txt
ฟงกชน ftell()
ฟงกชน ftell() คอฟงกชนในการบอกตาแหนงของตวช (Pointer) เพอใหทราบวาตาแหนงตวชอยตาแหนงใดเพอใชในการเขยนโปรแกรมในกรณทตองการรตาแหนงของตวชเปนตน
โดยฟงกชนมรปแบบการใชงานดงน
ตวแปรรบคาตาแหนงของตวช = ftell(ตวแปรตวชทชไปยงแฟมขอมล);
บทท 11 แฟมขอมล
425
เชน
FILE *Ptr;
Position = ftell(Ptr);
abcdefghijklmnop
Ptr
abcdefghijklmnop
Ptr
Return คา 0
Return คา 12
abcdefghijklmnop
Ptr
Return คา 4
รปท 11.4 แสดงตวอยางการใชฟงกชน ftell()
จากรปท 11.4 แสดงใหเหนการคนคาตาแหนงตวชโดยใชฟงกชน ftell() ซงคาเรมตนแรกคอคา “0” จากนนเมอตวชดาเนนการตอและหยดทตว “e” และเมอใชฟงกชน ftell() กจะคนคา “4” สดทายตวชดาเนนการถงตว “m” และเมอใชฟงกชน ftell() กจะคนคา 12
ตวอยางท 11.15 โปรแกรมแสดงการใชฟงกชน ftell() โดยจะเขยนขอมลลงแฟมขอมล ทรบจากแผงแปนอกขระลงแฟมขอมล output.txt โดยจะทาการดตาแหนงของตวชตงแตกอนเขยนขอมลและหลงเขยนขอมล
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 void main(void) 5 { 6 FILE *Ptr; 7 int pos1,pos2,pos3; 8 char id[5],name[10]; 9 int midterm,final; 10 Ptr = fopen("output.txt","w"); 11 if(Ptr ==NULL){ 12 printf("Cannot open file\n"); 13 exit(0);
บทท 11 แฟมขอมล
426
14 } 15 pos1 = ftell(Ptr); 16 printf("Input : id name midterm final\n"); 17 scanf("%s %s %d %d",id,name,&midterm,&final); 18 fprintf(Ptr,"%s \t%s \t%d \t%d\n",id,name,midterm,final); 19 pos2 = ftell(Ptr); 20 rewind(Ptr); 21 pos3 = ftell(Ptr); 22 printf("Position of pointer is%i %i %i\n",pos1,pos2,pos3); 23 fclose(Ptr);
26 }
ผลลพธของโปรแกรม Input : id name midterm final 001 Krit 60 30 Position of pointer is 0 19 0
ผลลพธในสวนของแฟมขอมลใหม output.txt
อธบายโปรแกรม
บรรทดท 6 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 7-9 กาหนดตวแปร pos1, pos2 และ pos 3 เปนตวแปรของเลขจานวนเตม กาหนดตวแปร id, และ name เปนตวแปรสายอกขระ และกาหนดตวแปร midterm และ final เปนตวแปรของเลขจานวนเตม
บรรทดท 10-14 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการเขยนขอมลในโหมด “w” ถาไมสาเรจ (Ptr =
NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บรรทดท 15 ทาการบอกตาแหนงของตวชโดยใชฟงกชน ftell(Ptr) ซงตาแหนงแรกจะเปนตาแหนงท “0”
บรรทดท 16-17 ทาการแสดงรายการเพอดาเนนการปอนขอความตามทโปรแกรมกาหนดเชนปอนคา 001 Krit 60 40 เปนตน โดยคาแรกคอรหส คาทสองคอชอ คาทสามและสคอคะแนน ตามลาดบ
บทท 11 แฟมขอมล
427
บรรทดท 18 บนทกคาของขอมลลงแฟมขอมล output1.txt ทตวช Ptr ชอย ซงจะทาบนทกและทาใหคาตวช Ptr ชไปยงตาแหนงสดทายของขอมล
บรรทดท 19 ทาการบอกตาแหนงของตวชโดยใชฟงกชน ftell(Ptr) ซงตาแหนงตวช จะเปลยนไปโดยจะเปนตาแหนงสดทาย ซงถาปอนตามตวอยางจะไดคาตาแหนงของตวชคอ "19”
บรรทดท 20 ใชฟงกชน rewind() เพอใหตวช Ptr ชไปยงตาแหนงเรมตนของไฟล บรรทดท 21 ทาการบอกตาแหนงของตวชโดยใชฟงกชน ftell(Ptr) ซงหลงจากทใช
ฟงกชน rewind() จะทาใหตาแหนงแรกจะเปนตาแหนงท “0”
บรรทดท 22 แสดงตาแหนงของขอมล ตงแตกอนเขยนขอความ หลงเขยนขอความ
บรรทดท 23 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล output.txt
ฟงกชน fseek()
ฟงกชน fseek() คอฟงกชนทตองการเขาถงขอมลโดยตรง ณ ตาแหนงทเจาะจงลงไป
ซงจะเปนการยายตาแหนงตวชไปยงตาแหนงทตองการภายในแฟมขอมล ฟงกชนจะคนคา “0”
ถาหากทางานไดสาเรจ โดยฟงกชนมรปแบบการใชงานดงน
ความเฉ (Offset) หรอออฟเซต ซงเปนคาทใชสาหรบการรวมกบตาแหนงเรมตนตามรปแบบทกาหนดเพอใหชไปยงตาแหนงของแฟมขอมลทตองการ โดยจะม 3 รปแบบ ทสามารถกาหนดไดคอ รปแบบท 1 คอตาแหนงเรมตนของแฟมขอมล (Beginning of File)
รปแบบท 2 คอตาแหนงปจจบน (Current Position) และรปแบบท 3 คอตาแหนงสดทายของแฟมขอมล (End of File) การกาหนดคารปแบบสามารถทาได 2 รปแบบคอกาหนดคาดวยชอแมโคร (Macro) หรอ คาคงท (Constant) ดงแสดงในตารางท 11.3
fseek(ตวแปรตวชทชไปยงแฟมขอมล,ความเฉ,รปแบบ);
บทท 11 แฟมขอมล
428
ตารางท 11.3 รปแบบการกาหนดรปแบบของตาแหนงตวช
ชอแมโคร คาคงท ความหมาย SEEK_SET 0 ชทตาแหนงเรมตนของแฟมขอมล SEEK_CUR 1 ชทตาแหนงปจจบนของแฟมขอมล SEEK_END 2 ชทตาแหนงสดทายของแฟมขอมล
เชน
FILE *Ptr;
fseek(Ptr,25L,SEEK_SET); หรอ fseek(Ptr,25L,0);
หมายถงทาการเลอนตวชจากตาแหนงเรมตนของแฟมขอมลไปอก 25 ไบต ซงหมายความวาจะเลอนไปตาแหนงท 26 ของแฟมขอมล
ตวอยางท 11.17 โปรแกรมแสดงการใชฟงกชน fseek() โดยจะทาการอานขอมลจากแฟมขอมล output.txt และใหทาการเลอกตาแหนงทตองการจะช และใหแสดงผลคา ณ
ตาแหนงทช แฟมขอมลเกา output.txt ทมอยแลว
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 void main(void) 5 { 6 FILE *Ptr; 7 int pos,pos_next; 8 Ptr = fopen("output.txt","r"); 9 if(Ptr ==NULL){ 10 printf("Cannot open file\n"); 11 exit(0); 12 } 13 printf("Enter byte to seek :"); 14 scanf("%d",&pos); 15 fseek(Ptr,pos,0);
บทท 11 แฟมขอมล
429
16 printf("Value at pos %d is %c \n",pos,getc(Ptr)); 17 pos_next = ftell(Ptr); 18 printf("Next position is %i",pos_next); 19 fclose(Ptr);
20 }
ผลลพธของโปรแกรม Enter byte to seek :10 Value at pos 10 is k Next position is 11
อธบายโปรแกรม
บรรทดท 6 กาหนดตวแปร Ptr เปนตวชแฟมขอมล เพอใชเปนตวอางองแฟมขอมล
บรรทดท 7 กาหนดตวแปร pos และ pos_next เปนตวแปรของเลขจานวนเตม
บรรทดท 8-12 ทาการตรวจสอบวาเปดแฟมขอมลสาเรจหรอไม โดยจะทาการเปดแฟมขอมลเพอทาการอานขอมลในโหมด “r” ถาไมสาเรจ (Ptr =
NULL) จะแสดงขอความ “Cannot open file” แลวออกจากโปรแกรม
บรรทดท 13-14 ทาการแสดงรายการเพอดาเนนการปอนขอความตามทโปรแกรมกาหนดเชนปอนคา 10 เปนตน ซงกคอตาแหนงทจะทาการบวกเพมของตาแหนงตวชจากจดเรมตน
บรรทดท 15-16 ทาการเขาถงตาแหนงของขอมลในรปแบบ SEEK_SET คอตงแตเรมตนของแฟมขอความ โดยจะทาการชไปอกตามคาทปอนเขามา เชนถาปอนคา 10 กจะทาการชไป 10 ตาแหนง ดงนนตวชจะชไปยงตวอกษรตว “k” ซงกจะแสดงผลลพธคอตวอกษร “k”
บรรทดท 17-18 ทาการบอกตาแหนงของตวชโดยใชฟงกชน ftell(Ptr) ซงกคอตาแหนงถดไปดงนนผลลพธคอตาแหนงท 11
บรรทดท 19 ใชฟงกชน fclose() ปดแฟมขอมล กลาวคอเปนการสงใหตวแปร Ptr
เลกการชไปทแฟมขอมล output.txt
บทท 11 แฟมขอมล
430
บทสรป
ในบทนไดกลาวถงพนฐานแฟมขอมล การทางานเกยวกบแฟมขอมลขอความ ฟงกชนในการจดการแฟมขอมล การทางานเกยวกบแฟมฐานสอง และการเขาถงขอมลแบบสม ซงจะถกจดเกบในรปแบบของแฟมขอความทสามารถนากลบมาใชใหมได ทาใหสามารถบนทกสงตางๆ ทโปรแกรมไดจดทาขนมาหรอการประมวลผลตางๆ ไดอยางมประสทธภาพ แฟมขอมลคอขอมลทถกจดเกบในรปแบบของแฟมทสามารถจดเกบไวในทเกบขอมลแบบถาวรได ซงจะทาใหเราสามารถเรยกใชงานแฟมขอมลไดตลอดเวลาเนองจากขอมลไมสญหาย แฟมขอมลเปรยบเสมอนกบการรวมขอมลทมความสมพนธกนหรอทเกยวของกนมาเกบไวในแฟมเดยวกน ทาใหสะดวกในการเรยกใชงาน การทางานกบแฟมขอความนน โปรแกรมจะตองมตวแปรซงเปนตวชขอมลในแฟมขอมลหรอตวชแฟมขอมลซงการประกาศตวแปรจะกาหนดใหเปนชนด FILE จงจะสามารถดาเนนการกบแฟมขอความได ซงจะมขนตอนการทางานทเรมตนจากการเปดแฟมขอมล จากนนทาการบนทกขอมลลงแฟมขอมลหรออานแฟมขอมลจากแฟมขอมล และสดทายคอการปดแฟมขอมล ฟงกชนในการจดการแฟมขอมลจะมทงในรปแบบของตวอกขระและในรปแบบของขอความซงจะมฟงกชนใชทแตกตางกนทงในสวนของการรบขอมลและการแสดงผลขอมล ฟงกชนในการจดการแฟมขอมลในรปแบบตวอกขระจะเปนการประมวลผลทละ 1 ตวอกขระหรอ 1 ตวอกษร โดยสามารถใชฟงกชน putc(), fputc(),
getch(),และ fgetc() ในการจดการแฟมขอมลทละ 1 ตวอกขระ ฟงกชนในการจดการแฟมขอมลในรปแบบขอความจะเปนการประมวลผลทละ 1 สายอกขระหรอขอความ (String)
จานวนหลายตวอกขระ โดยสามารถใชฟงกชน fputs(), fgets(), fprint() และ fscanf() ในการจดการแฟมขอมล แฟมขอมลฐานสองหรอแฟมฐานสองคอชนดของขอมลทอยในรปของเลขฐานสองซงเปนรปแบบเฉพาะของคอมพวเตอร ซงในการเขยนโปรแกรมบางครงจาเปนทจะตองทางานรวมกบเลขฐานสอง ซงจะทาใหสามารถใชงานโดยสะดวก และสดทายการเขาถงขอมลแบบสมคอการเขาถงขอมลโดยตรงทาใหสามารถดาเนนการประมวลผลขอมลทตองการไดทนท โดยการเขาถงขอมลแบบสมสามารถเขาถงขอมลทตองการทนท ซงในการเขาถงขอมลแบบสมจะมการใชฟงกชนทสาคญคอ ฟงกชน rewind() ฟงกชน ftell() และ ฟงกชน fseek()
บทท 11 แฟมขอมล
431
แบบฝกหดทบทวน
1. จงอธบายถงความหมายของแฟมขอมลพรอมทงยกตวอยางของแฟมขอมล 2. จงอธบายถงความหมายของโหมดในการทางานของแฟมขอความดงน
โหมด ความหมาย r
w
a
r+
w+
a+
3. จงอธบายถงความหมายของโหมดในการทางานของแฟมฐานสองดงน
โหมด ความหมาย rb
wb
ab
r+b หรอ rb+
w+b หรอ wb+
a+b หรอ ab+
4. จงอธบายวธการใชฟงกชน putc(), fputc(), getch(),และ fgetc() พรอมทงยกตวอยางประกอบการอธบาย
5. จงอธบายวธการใชฟงกชน fputs(), fgets(), fprint() และ fscanf()พรอมทงยกตวอยางประกอบการอธบาย
6. จงอธบายวธการใชฟงกชน rewind(), ftell() และ fseek()พรอมทงยกตวอยางประกอบการอธบาย
7. จงเขยนโปรแกรมบวกเลขจากแฟมขอมล data.txt โดยในแฟมขอมล โดยใหแสดงผลทหนาจอภาพ ซงขอมลจากแฟมจะมตวเลขดงน
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
บทท 11 แฟมขอมล
432
8. จงเขยนโปรแกรมบวกเลขจากแฟมขอมล data.txt ในแตละแถว โดยใหเกบผลลพธตอทายแถวนน ซงขอมลจากแฟมจะมตวเลขดงน
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
โดยผลลพธทไดจะเปน
1 2 3 4 5 = 15
2 3 4 5 6 = 20
3 4 5 6 7 = 25
9. จงเขยนโปรแกรมทรบคาชอ ขอมลเงนเดอน จากแผงแปนอกขระ จานวน 3 คน แลวนามาหาคาภาษทจะตองเสย ลงแฟมขอมล โดยภาษจะกาหนดดงน
รายได < 10000 ไมตองเสยภาษ
รายได < 20000 เสยภาษ 10% ของรายได
รายได < 50000 เสยภาษ 20% ของรายได
รายได >=50000 เสยภาษ 30% ของรายได
10. จงเขยนโปรแกรมสลบคาตาแหนงของขอมลในแตละหลกจากแฟมขอมล data.txt โดยจะบนทกลงในแฟมขอมลเดม ซงขอมลจากแฟมจะมขอมลดงน
Krit 0001
Witchakorn 0002
Ahumporn 0003
Insol 0004
Wilaiporn 0005
โดยผลลพธทไดจะเปน
0001 Krit
0002 Witchakorn
0003 Ahumporn
0004 Insol
0005 Wilaiporn
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
บทท 12
การประยกตภาษาซใชในงานดานสถตวจย
ในบทนจะกลาวถงการวดแนวโนมเขาสสวนกลาง (Measures of Central Tendency)
การวดการกระจายของขอมล (Measures of Dispersion of Variability) การคานวณสมการถดถอย (Regression Equation) และการคนหาขอมลและการจดเรยงขอมล (Searching and
Sorting) ซงจะเปนการเขยนโปรแกรมเพอประยกตใชงานในดานสถตเพอการวจยเพอใหนกศกษาสามารถนาไปประยกตใชงานไดอยางมประสทธภาพ วธการทางสถตเปนวธการหนงทมประสทธภาพและเหมาะสมสาหรบการประยกตใชในงานวจย เชนวธการทางสถตสามารถคานวณคาขอมลทกระจดกระจายมาจดเปนหมวดหมทเหมาะสม ทาใหสามารถนาเอาขอมลทเปนหมวดหมไปประยกตในงานวจย ดงนนเพอเปนพนฐานในการนาไปประยกตในงานวจยจาเปนจะตองมความรพนฐานทางดานสถตเพอนาไปสการประยกตใชงาน ดงนนในบทนจะเปนการเขยนโปรแกรมเพอคานวณทางสถตทนยมมการนาไปประยกตใชงาน
12.1 การวดแนวโนมเขาสสวนกลาง (Measures of Central Tendency)
การวดแนวโนมเขาสสวนกลางเปนการหาคากลางของขอมล หรอหาคาทเปนตวแทนของขอมล เพอใชอธบายลกษณะของขอมล โดยสถตทนยมใชวดแนวโนมเขาสสวนกลางคอตวกลางเลขคณต (Arithmetic Mean) มธยฐาน (Median) และฐานนยม (Mode)
12.1.1 ตวกลางเลขคณต (Arithmetic Mean)
ตวกลางเลขคณตคอคาเฉลยของกลมขอมล สญลกษณทใชสาหรบตวกลางเลขคณตคอ X โดยสามารถคานวณไดจากสมการท 12.1 ดงน
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
434
N
XX
(12.1)
ทซง X คอคาของขอมลแตละตว N คอจานวนขอมล
ตวอยางท 12.1 โปรแกรมคานวณหาคากลางเลขคณตของขอมลคะแนนนกศกษาจานวน 5
คน
1 #include <stdio.h> 2 main() 3 { 4 float num_st[5]; 5 float sum = 0; 6 float mean; 7 int i; 8 int number_student = sizeof(num_st)/2; 9 for(i=0;i<number_student;i++) 10 { 11 printf("Data[%i] = ",i); 12 scanf("%f",&num_st[i]); 13 } 14 for(i=0;i<number_student;i++) 15 { 16 sum = sum + num_st[i]; 17 } 18 mean = sum/number_student; 19 printf("Mean = %f",mean);20 }
ผลลพธของโปรแกรม Data[0] = 10 Data[1] = 20 Data[2] = 30 Data[3] = 40 Data[4] = 50 Mean = 30.00
อธบายโปรแกรม
บรรทดท 4-7 กาหนดตวแปร num_st เปนตวแปรแถวลาดบเพอเกบขอมลคะแนน
กาหนดตวแปร sum และ mean เปนตวแปรแบบเลขทศนยม และ i เปนตวแปรเลขจานวนเตม
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
435
บรรทดท 8 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมลโดยถาเปนเลขทศนยมจะหารดวย 4 แตถาเปนเลขจานวนเตมจะหารดวย 2 ตามขนาดของชนดขอมล (แตถาเขยนโปรแกรมในโปรแกรม
Microsoft Visual Studio ถาเปนเลขจานวนเตมและเลขทศนยมจะตองหารดวย 4 ทงค เพราะในโปรแกรมจะมขนาดของขอมลเทากน)
บรรทดท 9-13 การรบคาขอมลเกบไวในแถวลาดบ num_st
บรรทดท 14-17 คานวณหาคาผลรวมของขอมล บรรทดท 18 คานวณหาคาเฉลยตามสมการในการหาคาเฉลยของขอมล บรรทดท 19 แสดงผลลพธของคาเฉลย
12.1.2 มธยฐาน (Median)
มธยฐานคอคาขอมลทอยระหวางกลางของขอมลหรอกงกลางของกลม สญลกษณทใชสาหรบมธยฐานคอ Med หรอ Mdn ซงเปนสถตทบงบอกสภาพโดยรวมของกลมนยมใชกบขอมลทมการกระจายตวเปนวงกวางเพราะถาใชคากลางเลขคณตจะทาใหเกดความคลาดเคลอนสง โดยสามารถคานวณคามธยฐานได 2 กรณ คอกรณทขอมลเปนเลขคคานวณจากสมการท 12.2
2
1NMed
(12.2)
ทซง N คอจานวนขอมล
ขอมลเปนเลขคคานวณจากสมการท 12.3
2
12
N2Data
2
N1Data
Med
(12.3)
ทซง N คอจานวนขอมล 1Data คอขอมลตวท 1 ทตาแหนง
2
N
2Data คอขอมลตวท 2 ทตาแหนง
12
N
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
436
การคานวณหาคามธยฐานจะตองทาการเรยงลาดบขอมลกอน โดยจะเรยงจากนอยไปมาก ซงการเรยงขอมลมอยหลากหลายวธการดงเชนการเรยงลาดบแบบเลอก (Selection
Sort) การเรยงลาดบแบบแทรก (Insertion Sort) และการเรยงลาดบแบบฟอง (Bubble Sort)
เปนตน ซงตวอยางการเรยงลาดบจะกลาวถงในหวขอการคนหาขอมลและการจดเรยงขอมล (Searching and Sorting)
ตวอยางท 12.2 โปรแกรมคานวณหาคามธยฐานของขอมลคะแนนนกศกษาจานวน 5 คน
1 #include <stdio.h> 2 main() 3 { 4 float num_st[5]; 5 int i; 6 int Med; 7 int number_student = sizeof(num_st)/2; 8 for(i=0;i<number_student;i++) 9 { 10 printf("Data[%i] = ",i); 11 scanf("%f",&num_st[i]); 12 } 13 Med = (number_student + 1)/2; 14 printf("Med = %f",num_st[Med-1]);15 }
ผลลพธของโปรแกรม Data[0] = 1 Data[1] = 2 Data[2] = 3 Data[3] = 4 Data[4] = 5 Med = 3.00
อธบายโปรแกรม
บรรทดท 4-6 กาหนดตวแปร num_st เปนตวแปรแถวลาดบเพอเกบขอมลคะแนน
กาหนดตวแปร i และ Med เปนตวแปรเลขจานวนเตม
บรรทดท 7 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 8-12 การรบคาขอมลเกบไวในแถวลาดบ num_st โดยคาทปอนเขามา
จะตองเปนคาทเรยงลาดบจากนอยไปมาก บรรทดท 13 คานวณหาตาแหนงทเปนคามธยฐานของขอมล บรรทดท 19 แสดงผลลพธของคามธยฐานโดยคาตาแหนงจะตองลบดวยหนง
เนองจากแถวลาดบเรมตนทศนย
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
437
ตวอยางท 12.3 โปรแกรมคานวณหาคามธยฐานของขอมลคะแนนนกศกษาจานวน 6 คน
1 #include <stdio.h> 2 main() 3 { 4 float num_st[6]; 5 int i,Data1,Data2; 6 float Med; 7 int number_student = sizeof(num_st)/2; 8 for(i=0;i<number_student;i++) 9 { 10 printf("Data[%i] = ",i); 11 scanf("%f",&num_st[i]); 12 } 13 Data1 = (number_student + 1)/2; 14 Data2 = ((number_student + 1)/2)+1; 14 Med = (num_st[Data1-1] + num_st[Data2-1])/2; 14 printf("Med = %.2f",Med);15 }
ผลลพธของโปรแกรม Data[0] = 1 Data[1] = 2 Data[2] = 3 Data[3] = 4 Data[4] = 5 Data[5] = 6 Med = 3.50
อธบายโปรแกรม
บรรทดท 4-6 กาหนดตวแปร num_st เปนตวแปรแถวลาดบเพอเกบขอมลคะแนน
กาหนดตวแปร i, Data1 และ Data2 เปนตวแปรเลขจานวนเตม และกาหนดตวแปร Med เปนตวแปรเลขทศนยม
บรรทดท 7 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 8-12 การรบคาขอมลเกบไวในแถวลาดบ num_st
บรรทดท 13-14 คานวณหาตาแหนงทเปนคามธยฐานของขอมล บรรทดท 15 คานวณหาคามธยฐานของขอมล บรรทดท 19 แสดงผลลพธของคามธยฐาน
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
438
12.1.3 ฐานนยม (Mode)
ฐานนยมคอคาขอมลทมความถสงสดในชดขอมลเดยวกนหรอขอมลทมการซากนมากทสด ซงโดยทวไปฐานนยมมกนาไปใชกบขอมลเชงคณภาพ ลกษณะของฐานนยมถากลมของขอมลไมมการซากนของขอมลจะถอวากลมของขอมลนนไมมฐานนยม ถากลมของขอมลมการซากนของขอมลทเทากนจานวน 2 คา แสดงวากลมของขอมลนนมฐานนยมจานวน 2 คา ดงนนฐานนยมอาจจะมหรอไมมขนอยกบขอมล
ตวอยางท 12.4 โปรแกรมคานวณหาคาฐานนยมของขอมลคะแนนนกศกษาจานวน 10 คน
1 #include <stdio.h> 2 main() 3 { 4 int num_st[10]; 5 int frequency_num[10]; 6 int i,j,frequency,max; 7 int number_student = sizeof(num_st)/2; 8 for(i=0;i<number_student;i++) 9 { 10 printf("Data[%i] = ",i); 11 scanf("%i",&num_st[i]); 12 } 13 for(i=0;i<number_student;i++) 14 { 15 frequency = 1; 16 for(j=0;j<number_student;j++) 17 { 18 if ((num_st[i] == num_st[j])&&(i!=j)) 19 frequency = frequency + 1; 20 if ((num_st[i] == num_st[j])&&(i<j)) 21 frequency = 0; 22 } 23 frequency_num[i] = frequency; 24 } 25 max = frequency_num[0]; 26 for(i=1;i<number_student-1;i++) 27 { 28 if(max<frequency_num[i]) 29 max = frequency_num[i]; 30 } 31 if(max>1) 32 { 33 for(i=0;i<number_student;i++) 34 { 35 if(max==frequency_num[i]) 36 printf("Mode is %i\n",num_st[i]); 37 } 38 }else
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
439
39 { 40 printf("No Mode"); 41 }
42 }
ผลลพธของโปรแกรม Data[0] = 1 Data[1] = 1 Data[2] = 2 Data[3] = 2 Data[4] = 2 Data[5] = 3 Data[6] = 4 Data[7] = 4 Data[8] = 4 Data[9] = 5 Mode is 2 Mode is 4
จากผลลพธของโปรแกรมแสดงใหเหนวาจะมฐานนยมอย 2 คา นนคอคา 2 และคา 4
อธบายโปรแกรม
บรรทดท 4-6 กาหนดตวแปร num_st และ frequency_num เปนตวแปรแถวลาดบเพอเกบขอมลคะแนน กาหนดตวแปร i, j, frequency และ max เปนตวแปรเลขจานวนเตม และกาหนดตวแปร Med เปนตวแปรเลขทศนยม
บรรทดท 7 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 8-12 การรบคาขอมลเกบไวในแถวลาดบ num_st
บรรทดท 13-24 คานวณหาคาความถของขอมลของตวเลขทซากนโดยจะเกบผลการนบความถของขอมลไวทตวแปร frequency_num โดยตวทซากนจะปรบใหเปนศนยในกรณทในตาแหนงทคนหาไดมการคนหาแลวไดคาผลลพธทเหมอนกน เชนถาขอมลเปน 1 1 2 2 3 ตวแปร frequency_num กจะเกบ 0 2 0 2 1 เปนตน ซงจะเปนตวแสดงตาแหนงของคาความถทตองการ
บรรทดท 25 กาหนดคา max เทากบคาตาแหนงแรกของ frequency_num
บรรทดท 26-30 คานวณหาความถสงสดจาก frequency_num เชน เกบคา 0 2 0 2
1 แสดงวาคา max = 2
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
440
บรรทดท 31-41 ทาการตรวจสอบคาฐานนยมจากขอมลวามขอมลทซากนมากกวาหนงคาหรอไมถามแสดงวามฐานนยมโดยใหแสดงผลลพธของฐานนยมโดยดจากตวแปร frequency_num ซงเปนตวแปรทบงบอกตาแหนงของฐานนยม
12.2 การวดการกระจายของขอมล (Measures of Dispersion of Variability)
การวดการกระจายของขอมลเปนการวดหาดชนทเหมาะสมเพออธบายลกษณะของขอมลวามลกษณะของขอมลเปนอยางไร ซงเปนการสรปลกษณะของขอมลวามลกษณะการกระจายตวของขอมลเปนอยางไร วธการวดการกระจายตวของขอมลทนยมใชกนดงเชน พสย (Range) พสยควอรไทลและสวนเบยงเบนควอรไทล (Quartile Range and Quartile
Deviation) และสวนเบยงเบนมาตรฐานและความแปรปรวน (Standard Deviation and
Variance)
12.2.1 พสย (Range)
พสยคอวธการวดการกระจายของขอมลโดยดจากคาขอมลทมากทสดและคาขอมลทนอยทสด โดยสามารถคานวณไดจากสมการท 12.4 ดงน
MINMAX XXR (12.4)
ทซง MAXX คอคาของขอมลทมากทสด
MINX คอคาของขอมลทนอยทสด
เชนถามคาขอมลคอ [1 2 3 4 5 6 7 8 9] ดงนน MAXX คอ 9 และ MINX คอ 1 ซงจากสมการจะสามารถคานวณ R = 9 -1 = 8 หมายความวาความแตกตางของขอมลหรอพสยมคาเทากบ 8
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
441
ตวอยางท 12.5 โปรแกรมคานวณหาคาพสยของขอมลคะแนนนกศกษาจานวน 10 คน
1 #include <stdio.h> 2 main() 3 { 4 int num_st[10]; 5 int i,j,max,min,range; 6 int number_student = sizeof(num_st)/2; 7 for(i=0;i<number_student;i++) 8 { 9 printf("Data[%i] = ",i); 10 scanf("%i",&num_st[i]); 11 } 12 max = num_st[0]; 13 min = num_st[0]; 14 for(i=1;i<number_student;i++) 15 { 16 if(max<num_st[i]) 17 max = num_st[i]; 18 if(min>num_st[i]) 19 min = num_st[i]; 20 } 21 range = max-min; 22 printf("Range of data is %i",range);
23 }
ผลลพธของโปรแกรม Data[0] = 1 Data[1] = 2 Data[2] = 3 Data[3] = 4 Data[4] = 5 Data[5] = 6 Data[6] = 7 Data[7] = 8 Data[8] = 9 Data[9] = 10 Range of data is 9
อธบายโปรแกรม
บรรทดท 4-5 กาหนดตวแปร num_st เปนตวแปรแถวลาดบเพอเกบขอมลคะแนน
กาหนดตวแปร i, j, max, min และ range เปนตวแปรเลขจานวนเตม
บรรทดท 6 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 7-11 การรบคาขอมลเกบไวในแถวลาดบ num_st
บรรทดท 14-20 คานวณหาสงสด (Max) และคานวณหาคาตาสด (Min)
บรรทดท 21 คานวณหาคาพสย บรรทดท 22 แสดงผลลพธของคาพสย
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
442
12.2.2 พสยควอรไทลและสวนเบยงเบนควอรไทล (Quartile Range and Quartile
Deviation)
พสยควอรไทลเปนคาทใชวดการกระจายของขอมลรอบคามธยฐาน (Median) โดยสามารถหาไดจากการหาผลตางระหวางคาควอรไทลท 1 (Q1) และคาควอรไทลท 3 (Q3) โดยสามารถคานวณคาพสยควอรไทลไดจากสมการท 12.5 (ขอมลจะตองมการจดเรยงคาขอมลจากนอยไปมากกอนทจะคานวณ)
13 QQQR (12.5)
ทซง 3Q คอคาคะแนน ณ ตาแหนงควอรไทลท 3
1Q คอคาคะแนน ณ ตาแหนงควอรไทลท 1
สวนเบยงเบนควอรไทลเปนคาทใชวดการกระจายของขอมลรอบคามธยฐาน
(Median) ซงจะมคาเทากบครงหนงของผลตางระหวางคาควอรไทลท 1 (Q1) และคาควอรไทลท 3 (Q3) โดยสามารถคานวณคาสวนเบยงเบนควอรไทลไดจากสมการท 12.6 (ขอมลจะตองมการจดเรยงคาขอมลจากนอยไปมากกอนทจะคานวณ)
2
QQDQ 13 (12.6)
ทซง 3Q คอคาคะแนน ณ ตาแหนงควอรไทลท 3
1Q คอคาคะแนน ณ ตาแหนงควอรไทลท 1
สวนเบยงเบนควอรไทลถามคามากแสดงวาขอมลมการกระจายมากและถาสวนเบยงเบนควอรไทลมคานอยแสดงวาขอมลมการกระจายตวนอย ในการวดตาแหนงเปนการแปลงขอมลแตละชดใหอยในลกษณะทใกลเคยงกนมความเหมาะสมทจะนาไปใชงาน เพอประโยชนในการเปรยบเทยบปรมาณของขอมลระหวางขอมลคนละกลม ถาการวดตาแหนงแบงขอมลออกเปน 4 สวนเราเรยกวาควอรไทล ซงคอตาแหนงของคาคะแนนคาหนงทแสดงวามขอมลกสวนจาก 4 สวน ทมคานอยกวาคาน โดยสามารถคานวณคาตาแหนงควอรไทลไดจากสมการท 12.7
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
443
4
XNR (12.7)
ทซง X คอตาแหนงควอรไทลทกาหนด (คา 1, 2, 3 และ 4)
N คอจานวนขอมลทงหมดในกลมขอมล
โดยคาทคานวณไดหากมทศนยมตงแต 0.5 ขนไปใหปดเศษขน แตถามทศนยมทนอยกวา 0.5 ใหปดเศษลงตวอยางเชนมขอมลอย 10 คา คอ [10 20 30 40 50 60 70 80 90 100]
คาตาแหนงควอรไทลท 1 (Q1) คอ 4/)10)(1(R = 2.5 ใหปดเศษขนกจะมคาเปน 3 แสดงวาคาตาแหนงควอรไทลท 1 อยตาแหนงท 3 คอคา 30 สวนคาตาแหนงควอรไทลท 3 (Q3) คอ
4/)10)(3(R = 7.5 ใหปดเศษขนกจะมคาเปน 8 แสดงวาคาตาแหนงควอรไทลท 3 อยตาแหนงท 8 คอคา 80 (ขอมลจะตองมการจดเรยงคาขอมลจากนอยไปมากกอนทจะคานวณถายงไมไดจดเรยงจะตองทาการจดเรยงขอมลกอนการคานวณ) ซงตวอยางการเรยงลาดบจะกลาวถงในหวขอการคนหาขอมลและการจดเรยงขอมล (Searching and Sorting)
ตวอยางท 12.6 โปรแกรมคานวณหาคาพสยควอรไทลและสวนเบยงเบนควอรไทลของขอมลจานวน 10 คา (โดยขอมลทปอนเปนขอมลทเรยงลาดบจากคานอยไปคามาก)
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 float num_st[10]; 6 float X1,X3,C1,C3; 7 int Q1,Q3; 8 float QR,QD; 9 int i; 10 float number_student = sizeof(num_st)/4; 11 for(i=0;i<number_student;i++) 12 { 13 printf("Data[%i] = ",i); 14 scanf("%f",&num_st[i]); 15 } 16 X1 = ((1)* number_student)/4; 17 C1 = (int) ((1)* number_student)/4; 18 X3 = ((3)* number_student)/4; 19 C3 = (int) ((3)* number_student)/4; 20 if((X1-C1)>=0.5) 21 { 22 X1 = ceil(X1); 23 } 24 else 25 {
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
444
26 X1 = floor(X1); 27 } 28 if((X3-C3)>=0.5) 29 { 30 X3 = ceil(X3); 31 } 32 else 33 { 34 X3 = floor(X3); 35 } 36 Q1 = (int) X1; 37 Q3 = (int) X3; 38 QR = num_st[Q3-1]-num_st[Q1-1]; 39 QD = (num_st[Q3-1]-num_st[Q1-1])/2; 40 printf("Quartile Range = %.2f\n",QR); 41 printf("Quaritile Deviation = %.2f\n",QD);
42 }
ผลลพธของโปรแกรม Data[0] = 25 Data[1] = 31 Data[2] = 39 Data[3] = 45 Data[4] = 52 Data[5] = 60 Data[6] = 68 Data[7] = 74 Data[8] = 77 Data[9] = 80 Quartile Range = 35.00 Quaritile Deviation = 17.50
อธบายโปรแกรม
บรรทดท 5-9 กาหนดตวแปร num_st เปนตวแปรแถวลาดบเพอเกบขอมลคะแนน
กาหนดตวแปร X1, X3, C1 และ C3, เปนตวแปรแบบเลขทศนยมเพอใชในการหาตาแหนงทมการปดเศษขนหรอลง กาหนดตวแปร QD และ QR เปนตวแปรแบบเลขทศนยมเพอใชในการคานวณหาคา เปนตวแปรแบบเลขทศนยมเพอใชในการ กาหนดตวแปร Q1 และ Q3 เปนตวแปรเลขจานวนเตมเพอใชในการบงบอกตาแหนงของแถวลาดบ และกาหนดตวแปร i เปนตวแปรเลขจานวนเตม
บรรทดท 10 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 11-15 การรบคาขอมลเกบไวในแถวลาดบ num_st โดยขอมลทปอนเขา
จะตองเปนขอมลทมการเรยงลาดบจากนอยไปมาก
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
445
บรรทดท 16-19 คานวณหาคาตาแหนงควอรไทลท 1 และควอรไทลท 3 ซงคาทไดจะเปนเลขทศนยมทยงมไดปดเศษ
บรรทดท 20-35 เปนการปดเศษขนและปดเศษลง ในกรณทมคาทศนยมเทากบ 0.5
หรอมากกวาใหปดเศษขน แตถานอยกวา 0.5 ใหปดเศษลง บรรทดท 36-37 แปลงขอมลตวเลขทอยในรปแบบของเลขทศนยมใหอยในรปแบบ
ของเลขจานวนเตมเพอใชเปนตวบงบอกตาแหนงขอมลในแถวลาดบ
บรรทดท 38-39 คานวณหาคาพสยควอรไทลและสวนเบยงเบนควอรไทลของขอมล บรรทดท 40-41 แสดงผลลพธของคาพสยควอรไทลและสวนเบยงเบนควอรไทลของ
ขอมล
12.2.3 สวนเบยงเบนมาตรฐานและความแปรปรวน (Standard Deviation and
Variance)
สวนเบยงเบนมาตรฐานคอการวดการกระจายของขอมลโดยเฉลยทขอมลแตละตวมสวนเบยงเบนจากตวกลางเลขคณต หรอกลาวไดวาเปนการวดการกระจายของคะแนนรอบๆ ตวกลางเลขคณต วธการนเปนวธการทเปนทนยมและแพรหลายในงานดานตางๆ เชนทางดานสถต ทางดานปญญาประดษฐ และทางดานการประมวลผลภาพเปนตน วธการคานวณสวนเบยงเบนกระทาไดโดยการหาผลตางระหวางขอมลแตละตวกบคากลางเลขคณต (Mean)
จากนนทาการหาคาเฉลยโดยการหารดวยจานวนขอมล ซงจากการหาผลตางในบางครงคาทไดอาจจะเปนคาลบทาใหเมอนาไปใชกจะทาใหไมสามารถคานวณไดถกตองดงนนจงไดมการคานวณโดยการยกกาลงสองของคาผลตางแลวทาการถอดรากทสอง กจะไดคาเบยงเบนมาตรฐานทตองการ โดยสามารถคานวณคาสวนเบยงเบนมาตรฐานไดจากสมการท 12.8
N
)X(XSD
2 หรอ
1N
)X(XSD
2
(12.8)
ทซง X คอคาขอมลแตละตว X คอคากลางเลขคณตหรอคาเฉลยของกลมขอมลนน
N คอจานวนขอมล จากสตรทงสองจะแตกตางในสวนของ N และ N-1 ซงจากเดมจะเปน N-1 เพราะเปนการประมาณคาความแปรปรวนของขอมลไดดเหมาะสาหรบขอมลขนาดเลกแตอยางไรกตามในปจจบนนยมใช N เนองจากขอมลทใชงานจรงในปจจบนจะเปนขอมลทมขนาดใหญ ซงกเปนการประมาณคาความแปรปรวนของขอมลทมประสทธภาพ
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
446
ความแปรปรวนคอการวดการกระจายของขอมลโดยเฉลยทขอมลแตละตวมสวนเบยงเบนจากตวกลางเลขคณตเชนเดยวกนกบสวนเบยงเบนมาตรฐานซงกจะเปนวธการประมาณคาการกระจายของขอมลทมประสทธภาพอกวธการหนง ซงสญลกษณทใชแสดงเปนคาความแปรปรวนคอ โดยสามารถคานวณคาความแปรปรวนไดจากสมการท 12.9
2SDσ หรอ N
)X(X 2 (12.9)
ตวอยางท 12.7 โปรแกรมคานวณหาคาสวนเบยงเบนมาตรฐานและคาความแปรปรวนของขอมลจานวน 10 คา
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 float num_st[10]; 6 float sum = 0; 7 float mean; 8 float SD_Total = 0; 9 float SD,Variance; 10 int i; 11 int number_student = sizeof(num_st)/2; 12 for(i=0;i<number_student;i++) 13 { 14 printf("Data[%i] = ",i); 15 scanf("%f",&num_st[i]); 16 } 17 for(i=0;i<number_student;i++) 18 { 19 sum = sum + num_st[i]; 20 } 21 mean = sum/number_student; 22 for(i=0;i<number_student;i++) 23 { 24 SD_Total = SD_Total + pow((num_st[i]-mean),2); 25 } 26 SD = sqrt(SD_Total/number_student); 27 Variance = pow(SD,2); 28 printf("Standard Deviation = %.2f\n",SD); 29 printf("Variance = %.2f\n",Variance);30 }
ผลลพธของโปรแกรม Data[0] = 1 Data[1] = 2 Data[2] = 3 Data[3] = 4 Data[4] = 5 Data[5] = 6
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
447
Data[6] = 7 Data[7] = 8 Data[8] = 9 Data[9] = 10 Standard Deviation = 2.87 Variance = 8.25
อธบายโปรแกรม
บรรทดท 5-10 กาหนดตวแปร num_st เปนตวแปรแถวลาดบเพอเกบขอมลคะแนน
กาหนดตวแปร sum, mean, SD_Total, SD และ Variance เปนตวแปรแบบเลขทศนยม และ i เปนตวแปรเลขจานวนเตม
บรรทดท 11 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 12-16 การรบคาขอมลเกบไวในแถวลาดบ num_st
บรรทดท 17-20 คานวณหาคาผลรวมของขอมล บรรทดท 21 คานวณหาคาเฉลยตามสมการในการหาคาเฉลยของขอมล บรรทดท 22-25 คานวณหาคาผลรวมของความแตกตางระหวางคาขอมลและ
คาเฉลย บรรทดท 26 คานวณหาคาสวนเบยงเบนมาตรฐาน
บรรทดท 27 คานวณหาคาความแปรปรวน
บรรทดท 28-29 แสดงผลลพธของคาเฉลย
12.3 การคานวณสมการถดถอย (Regression Equation)
การคานวณสมการถดถอยเปนเทคนคหนงทใชวเคราะหความสมพนธระหวางตวแปรโดยมจดมงหมายเพอการพยากรณ (Predict) คาของตวแปรทตองการ เมอทราบคาของตวแปรอกตวหนงหรออกหลายตว โดยตวแปรทเราตองการพยากรณเรยกวาตวแปรตามหรอตวแปรเกณฑ และตวแปรทใชเพอการพยากรณเรยกวาตวแปรอสระหรอตวแปรพยากรณซงอาจจะม 1 ตว หรอหลายตวแปรกได
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
448
12.3.1 การคานวณสมการถดถอยโดยใชสมการเสนตรง การคานวณสมการถดถอยจะเปนการหาสมการถดถอยของเสนถดถอย (Regression
Line) ทซงคอเสนทแสดงความสมพนธระหวางตวแปร โดยจะมลกษณะของเสนหลากหลายรปแบบทใชในการพยากรณเชนสมการเสนตรง (Linear Regression) ซงในหวขอนจะเสนอในแบบสมการเสนตรงเพอใหนกศกษานาไปประยกตใชงานในการพยากรณตางๆ ไดโดยงาย วธการหนงทเหมาะสมในการหาเสนพยากรณหรอในการปรบเสนพยากรณคอวธกาลงสองนอยทสด (Least Square) ดงนนในการพยากรณโดยใชสมการถดถอยแบบเสนตรงสามารถคานวณไดจากสมการท 12.10
bXaY (12.10)
ทซง Y คอคาของตวแปรตาม ทไดจากสมการพยากรณเมอทราบคา X
a คอคาตดแกน Y (Y-Intercept)
b คอคาความชน (Slope) = คาสมประสทธถดถอย X คอคาตวแปรอสระหรอตวแปรพยากรณ
คาตดแกน y (a) และคาความชน (b) สามารถคานวณไดจากสมการท 12.11 และสมการท 12.12
n
X)b(Y
a
(12.11)
22 X)(Xn
Y)(X)(XYn
b (12.12)
ทซง X คอคาตวแปรอสระหรอตวแปรพยากรณ
Y คอคาตวแปรตาม
N คอจานวนคของขอมล(ตวแปรอสระและตวแปรตาม)
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
449
ตวอยางท 12.8 จงคานวณการสรางสมการถดถอยแบบเสนตรงเพอใชในการพยากรณคาคะแนนการสอบจากคาสตปญญา (IQ) ดงขอมลดงตอไปน
ลาดบ คาสตปญญา คะแนนสอบ
1 118 66
2 99 50
3 118 73
4 121 69
5 123 72
6 98 54
7 131 74
8 121 70
9 108 65
10 111 62
11 118 65
12 112 63
13 113 67
14 111 59
15 106 60
16 102 59
17 113 70
18 101 57
จากตารางขอมลกาหนดใหคาสตปญญาคอตวแปรอสระ (X) และกาหนดใหคะแนนสอบคอตวแปรตาม (Y) ดงนนเราจะทาการพยากรณคะแนนการสอบโดยสมการถดถอยแบบเสนตรงจากการนาเอาขอมลทงสองชดมาคานวณหาคา a และคา b เพอนามาสรางสมการถดถอย โดยคานวณจากสมการ
n
X)b(Y
a
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
450
22 X)(Xn
Y)(X)(XYn
b
ทาการคานวณหา XY , X , Y , 2
X ดงแสดงในตาราง ลาดบ X Y X
2 XY
1 118 66 13924 7788
2 99 50 9801 4950
3 118 73 13924 8614
4 121 69 14641 8349
5 123 72 15129 8856
6 98 54 9604 5292
7 131 74 17161 9694
8 121 70 14641 8470
9 108 65 11664 7020
10 111 62 12321 6882
11 118 65 13924 7670
12 112 63 12544 7056
13 113 67 12769 7571
14 111 59 12321 6549
15 106 60 11236 6360
16 102 59 10404 6018
17 113 70 12769 7910
18 101 57 10201 5757
รวม 2,024 1,155 228,978 130,806
จากนนนาไปแทนคาในสมการ
6708.0)024,2()978,228)(18(
)155,1)(2024()806,130)(18(
X)(Xn
Y)(X)(XYn
b2
22
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
451
25.1118
)024,2)(6708.0(155,1
n
X)b(Y
a
ดงนนจะไดสมการถดถอยคอ X0.670811.25bXaY
จากสมการเราสามารถนาไปพยากรณคะแนนสอบได โดยเราจะตองทราบคาสตปญญาของคนทตองการพยากรณดงเชนเราทราบวานกเรยนคนทตองการพยากรณมคาสตปญญาเทากบ 100 จะมคาการพยากรณของคะแนนสอบคอ
58.55)1000.6708(11.25bXaY
แสดงวาคาพยากรณคาคะแนนสอบของนกเรยนคนนนคอ 55.58
ตวอยางท 12.9 โปรแกรมคานวณหาสมการพยากรณแบบเสนตรงโดยมตวแปรอสระ 1 ตว ตวแปรตาม 1 ตว โดยใหทาการรบตวแปรอสระและตวแปรตาม 18 คา และใหปอนคาอนพตตามตวอยางท 12.8
1 #include <stdio.h> 2 main() 3 { 4 float X[18],Y[18],XX[18],XY[18]; 5 float a,b; 6 int i; 7 float sumX = 0, sumY = 0; 8 float sumXX = 0, sumXY = 0; 9 float num = sizeof(X)/4; 10 for(i=0;i<num;i++) 11 { 12 printf("X[%i] Y[%i] = ",i,i); 13 scanf("%f %f",&X[i],&Y[i]); 14 } 15 for(i=0;i<num;i++) 16 { 17 XX[i] = X[i]*X[i]; 18 XY[i] = X[i]*Y[i]; 19 } 20 for(i=0;i<num;i++) 21 { 22 sumX = sumX + X[i]; 23 sumY = sumY + Y[i]; 24 sumXX = sumXX + XX[i]; 25 sumXY = sumXY + XY[i];
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
452
26 } 27 b = ((num*sumXY)-(sumX*sumY))/((num*sumXX)-(sumX*sumX)); 28 a = (sumY-(b*sumX))/num; 29 printf("Regression Equation of Data is Y=%.2f+%.2fX",a,b); 30 }
ผลลพธของโปรแกรม X[0] Y[0] = 118 66 X[1] Y[1] = 99 50 X[2] Y[2] = 118 73 X[3] Y[3] = 121 69 X[4] Y[4] = 123 72 X[5] Y[5] = 98 54 X[6] Y[6] = 131 74 X[7] Y[7] = 121 70 X[8] Y[8] = 108 65 X[9] Y[9] = 111 62 X[10] Y[10] = 118 65 X[11] Y[11] = 112 63 X[12] Y[12] = 113 67 X[13] Y[13] = 111 59 X[14] Y[14] = 106 60 X[15] Y[15] = 102 59 X[16] Y[16] = 113 70 X[17] Y[17] = 101 57 Regression Equation of Data is Y = -11.26+0.67X
อธบายโปรแกรม
บรรทดท 4-8 กาหนดตวแปร X, Y, XX และ XY เปนตวแปรแถวลาดบโดยตวแปร X
สาหรบเกบคาตวแปรอสระและตวแปร Y เกบคาตวแปรตาม ตวแปร XX และ XY เกบคาการดาเนนการทางคณตศาสตร กาหนดตวแปร a
และ b เปนตวแปรแบบเลขทศนยมเพอใชเกบคาจากการคานวณหาคาจากพารามเตอรของสมการในการพยากรณ sumX, sumY,
sumXX และ sumYY เปนตวแปแบบเลขทศนยมเพอใชเกบคาผลรวมของคาตวแปร และกาหนดตวแปร i เปนตวแปรเลขจานวนเตม
บรรทดท 9 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 10-14 การรบคาขอมลเกบไวในแถวลาดบ X และ Y โดยจะทาการรบคาท
ละคจนครบทงหมด
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
453
บรรทดท 15-19 คานวณหาคาการยกกาลงสองของตวแปร X และการคณกนของตวแปร X และ Y แลวเกบคาลงในตวแปร XX และ XY ซงเปนตวแปรแถวลาดบ
บรรทดท 20-26 คานวณหาคาผลรวมของตวแปร X ผลรวมของตวแปร Y ผลรวมของการยกกาลงสองของตวแปร X และผลรวมของการคณกบระหวางตวแปร X และ Y
บรรทดท 27-28 คานวณหาคาตวแปร a และ ตวแปร b เพอใชเปนตวแปรในการพยากกรณ
บรรทดท 29 แสดงผลลพธของสมการณในการพยากรณทคานวณไดจากวธการทนาเสนอ
ตวอยางท 12.10 โปรแกรมคานวณการพยากรณแบบเสนตรงทไดจากตวอยางท 12.8 ดงสมการ X0.670811.25bXaY โดยใหปอนคาตวแปรอสระจานวน 1 ตวแปร เพอใชในการณพยากรณตวแปรตาม และกาหนดใหทาซาจานวน 5 ครง ในการพยากรณ
1 #include <stdio.h> 2 main() 3 { 4 float a,b; 5 int i; 6 float X,Y; 7 a = -11.25; 8 b = 0.6708; 9 for(i=0;i<5;i++) 10 { 11 printf("X[%i] = ",i+1); 12 scanf("%f",&X); 13 Y = a+(b*X); 14 printf("Prediction Results of Y[%i] = %.2f\n",i,Y); 15 }
16 }
ผลลพธของโปรแกรม X[1] = 100 Prediction Results of Y[0] = 55.83 X[2] = 90 Prediction Results of Y[1] = 49.12 X[3] = 80 Prediction Results of Y[2] = 42.41 X[4] = 70 Prediction Results of Y[3] = 35.71 X[5] = 60 Prediction Results of Y[4] = 29.00
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
454
อธบายโปรแกรม
บรรทดท 4-6 กาหนดตวแปร a และ b เปนตวแปรแบบเลขทศนยมเพอใชในการเกบคาพารามเตอรสาหรบการพยากรณ กาหนดตวแปร X และ Y
เปนตวแปรแบบเลขทศนยมเพอใชในการเกบคาตวแปรอสระและตวแปรตามทคานวณได และกาหนดตวแปร i เปนตวแปรเลขจานวนเตม
บรรทดท 7-8 กาหนดคาพารามเตอรตามสมการทกาหนดเพอใชในการคานวณ
บรรทดท 9-15 ทาการวนซาจานวน 5 รอบ โดยจะทาการรบคาตวแปรอสระทละตวและทาการพยากรณตวแปรตามทละตว จนครบ 5 ครง ในบรรทดท
13 คอการพยาการณตวแปรตาม ซงเปนการพยากรณตามทโจทยตองการ และบรรทดท 14 ทาการแสดงผลของตวแปรอสระและตวแปรตามทเปนผลลพธทคานวณได
12.3.2 การวดประสทธภาพของการพยากรณ
หลงจากทไดสมการของการพยากรณไปแลว ขนตอนถดไปกคอการนาขอมลมาวเคราะหเพอจะทาการพยากรณตอไปโดยการตรวจสอบความแมนยาของการพยากรณ ในการพยากรณคอการคาดการถงสงในอนาคตทยงไมเกดขนดงนนจงมโอกาสทผดพลาด ดงนนสมการของการพยากรณทสรางขนมาจะมความถกตองมากนอยเพยงใดจะตองมการวดประสทธภาพของการพยากรณโดยดจากการพยากรณของขอมลในอดตททราบขอมลแลวจากสมการพยากรณทคานวณเพอเปรยบเทยบคาจรงกบคาทพยากรณ โดยการวดประสทธภาพการพยากรณสามารถกระทาไดหลายวธ ซงในสวนนผ เขยนตาราขอเสนอวธการทใชวดประสทธภาพของการพยากรณจากงานวจยของผ เขยนตารานนคอวธการวดประสทธภาพการพยากรณโดยใชคาเบยงเบนสมบรณเฉลย (Mean Absolute Deviation: MAD) คาความคลาดเคลอนกาลงสองเฉลย (Mean Square Error: MSE) คาเปอรเซนตความคลาดเคลอนเฉลย (Mean Percentage Error: MPE) และคาเปอรเซนตความคลาดเคลอนสมบรณเฉลย (Mean
Absolute Percentage Error: MAPE) โดยวธการวดประสทธภาพทงหมดนเปนวธการทเปนทนยมในงานวจยและใชกนอยางแพรหลายซงมความเหมาะสมในการวดประสทธภาพการพยากรณ
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
455
1) คาเบยงเบนสมบรณเฉลย (Mean Absolute Deviation: MAD) เปนการวดความแมนยาทวดจากคาความคลาดเคลอนของการพยากรณ โดยไมคานงถงทศทางของความคลาดเคลอนโดยจะมหนวยวดเหมอนกบคาสงเกต โดยสามารถคานวณคาเบยงเบนสมบรณเฉลยจากสมการท 12.13
n
YY
MAD
n
1i
(12.13)
ทซง Y คอคาจากการพยากรณทไดจากสมการพยากรณ
Y คอคาขอมลจรงททราบคา n คอจานวนขอมลทงหมด (ในอดตทจะนามาใชในการหาประสทธภาพ)
2) คาความคลาดเคลอนกาลงสองเฉลย (Mean Square Error: MSE) เปนการวดความแมนยาจากคาเฉลยผลรวมกาลงสองของคาความคลาดเคลอนของการพยากรณ คาความคลาดเคลอนกาลงสองเฉลยจะไวตอความคลาดเคลอนทมขนาดใหญเพราะไดจากการนาเอาคาความคลาดเคลอนมายกกาลงสอง โดยสามารถคานวณคาความคลาดเคลอนกาลงสองเฉลยจากสมการท 12.14
n
)Y(Y
MSE
n
1i
2 (12.14)
ทซง Y คอคาจากการพยากรณทไดจากสมการพยากรณ
Y คอคาขอมลจรงททราบคา n คอจานวนขอมลทงหมด (ในอดตทจะนามาใชในการหาประสทธภาพ)
3) เปอรเซนตความคลาดเคลอนเฉลย (Mean Percentage Error: MPE) เปนการวดความแมนยาจากคาความคลาดเคลอนของการพยากรณเทยบกบคาขอมลจรงโดยใหคาผลลพธออกมาเปนเปอรเซนตความคลาดเคลอนเฉลย โดยสามารถคานวณเปอรเซนตความคลาดเคลอนเฉลยจากสมการท 12.15
n
100Y
YY
MPE
n
1i
(12.15)
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
456
ทซง Y คอคาจากการพยากรณทไดจากสมการพยากรณ
Y คอคาขอมลจรงททราบคา n คอจานวนขอมลทงหมด (ในอดตทจะนามาใชในการหาประสทธภาพ)
4) เปอรเซนตความคลาดเคลอนสมบรณเฉลย (Mean Absolute Percentage Error: MAPE)
เปนการวดความแมนยาจากคาความคลาดเคลอนของการพยากรณเทยบกบคาขอมลจรง โดยจะทาใหคาความแตกตางเปนคาสมบรณทไมคดเครองหมายทาใหไมไดรบผลกระทบจากขนาดของตวเลข จงเหมาะทจะใชกบการเปรยบเทยบอนกรมเวลาหลายชดเมอใชวธการพยากรณเดยวกนหรอเปรยบเทยบวธการพยากรณหลายวธเมอใชอนกรมเวลาชดเดยวกน โดยสามารถคานวณเปอรเซนตความคลาดเคลอนสมบรณเฉลยจากสมการท 12.16
n
100Y
YY
APEM
n
1i
(12.16)
ทซง Y คอคาจากการพยากรณทไดจากสมการพยากรณ
Y คอคาขอมลจรงททราบคา n คอจานวนขอมลทงหมด (ในอดตทจะนามาใชในการหาประสทธภาพ)
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
457
ตวอยางท 12.11 จงคานวณประสทธภาพของการพยากรณโดยใชคาเบยงเบนสมบรณเฉลย (Mean Absolute Deviation: MAD) คาความคลาดเคลอนกาลงสองเฉลย (Mean Square
Error: MSE) คาเปอรเซนตความคลาดเคลอนเฉลย (Mean Percentage Error: MPE) และคาเปอรเซนตความคลาดเคลอนสมบรณเฉลย (Mean Absolute Percentage Error: MAPE)
โดยมขอมลตางๆ ดงน
ลาดบ ขอมลจรง ขอมลพยากรณ
1 22 26
2 25 28
3 39 32
4 40 41
5 42 38
6 45 40
7 36 39
8 38 32
9 40 42
10 39 36
จากตารางขอมลกาหนดใหคาขอมลจรงคอตวแปร Y และคาขอมลพยากรณคอ Y
ดงนนเราจะทาการทดสอบประสทธภาพการพยากรณโดยคานวณคาเบยงเบนสมบรณเฉลย (MAD) คาความคลาดเคลอนกาลงสองเฉลย (MSE) คาเปอรเซนตความคลาดเคลอนเฉลย (MPE) และคาเปอรเซนตความคลาดเคลอนสมบรณเฉลย (MAPE) โดยคานวณจากสมการดงน
n
YY
MAD
n
1i
n
)Y(Y
MSE
n
1i
2
n
100Y
YY
MPE
n
1i
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
458
n
100Y
YY
APEM
n
1i
ทาการคานวณหา MAPEMPE,MSE,MAD, ดงแสดงในตาราง
ลาดบ Y Y YY
YY 2)Y(Y 100YY
Y
100YY
Y
1 22 26 -4 4 16 -18.18 18.18
2 25 28 -3 3 9 -12.00 12.00
3 39 32 7 7 49 17.95 17.95
4 40 41 -1 1 1 -2.50 2.50
5 42 38 4 4 16 9.25 9.25
6 45 40 5 5 25 11.11 11.11
7 36 39 -3 3 9 -8.33 8.33
8 38 32 6 6 36 15.79 15.79
9 40 42 -2 2 4 -5.00 5.00
10 39 36 3 3 9 7.69 7.69
รวม 366 354 38 174 16.05 108.07
จากนนนาไปแทนคาในสมการ
8.310
38
n
YY
MAD
n
1i
4.1710
174
n
)Y(Y
MSE
n
1i
2
605.110
05.16
n
100Y
YY
MPE
n
1i
807.1010
07.108
n
100Y
YY
MAPE
n
1i
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
459
ตวอยางท 12.12 โปรแกรมคานวณหาคาเบยงเบนสมบรณเฉลย (Mean Absolute
Deviation: MAD) โดยใหรบคาขอมลจรงและคาขอมลพยากรณจานวน 10 คา 1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 float X[10],Y[10]; 6 float MAD; 7 int i; 8 float sum = 0; 9 float num = sizeof(X)/4; 10 for(i=0;i<num;i++) 11 { 12 printf("Real[%i] Prediction[%i] = ",i,i); 13 scanf("%f %f",&X[i],&Y[i]); 14 } 15 for(i=0;i<num;i++) 16 { 17 sum = sum + fabs(X[i]-Y[i]); 18 } 19 MAD = sum /num; 20 printf("Mean Absolute Deviation is %.2f",MAD);
21 }
ผลลพธของโปรแกรม Real[0] Prediction[0] = 22 26 Real[1] Prediction[1] = 25 28 Real[2] Prediction[2] = 39 32 Real[3] Prediction[3] = 40 41 Real[4] Prediction[4] = 42 38 Real[5] Prediction[5] = 45 40 Real[6] Prediction[6] = 36 39 Real[7] Prediction[7] = 38 32 Real[8] Prediction[8] = 40 42 Real[9] Prediction[9] = 39 36 Mean Absolute Deviation is 3.80
อธบายโปรแกรม
บรรทดท 5-8 กาหนดตวแปร X และ Y เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมลจรงและตวแปร Y เกบคาตวขอมลพยากรณ
กาหนดตวแปร MAD เปนตวแปรแบบเลขทศนยมเพอใชเกบคาผลลพธทไดจากการคานวณ กาหนดตวแปร sum เปนตวแปรแบบเลขทศนยมเพอใชเกบคาผลรวมของคาตวแปร และกาหนดตวแปร i เปนตวแปรเลขจานวนเตม
บรรทดท 9 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
460
บรรทดท 10-14 การรบคาขอมลเกบไวในแถวลาดบ X และ Y โดยจะทาการรบคาทละคจนครบทงหมด
บรรทดท 15-18 คานวณหาคาผลรวมของคาสมบรณระหวางคาขอมลจรงและคาขอมลพยากรณ โดยใชฟงกชน fabs() ในการหาคาสมบรณของตวแปรเลขทศนยม
บรรทดท 19 คานวณหาคาเบยงเบนสมบรณเฉลย (MAD)
บรรทดท 20 แสดงผลลพธของคาเบยงเบนสมบรณเฉลย
ตวอยางท 12.13 โปรแกรมคานวณหาคาความคลาดเคลอนกาลงสองเฉลย (Mean Square
Error: MSE) โดยใหรบคาขอมลจรงและคาขอมลพยากรณจานวน 10 คา 1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 float X[10],Y[10]; 6 float MSE; 7 int i; 8 float sum = 0; 9 float num = sizeof(X)/4; 10 for(i=0;i<num;i++) 11 { 12 printf("Real[%i] Prediction[%i] = ",i,i); 13 scanf("%f %f",&X[i],&Y[i]); 14 } 15 for(i=0;i<num;i++) 16 { 17 sum = sum + pow(X[i]-Y[i],2); 18 } 19 MSE = sum /num; 20 printf("Mean Square Error is %.2f",MSE);
21 }
ผลลพธของโปรแกรม Real[0] Prediction[0] = 22 26 Real[1] Prediction[1] = 25 28 Real[2] Prediction[2] = 39 32 Real[3] Prediction[3] = 40 41 Real[4] Prediction[4] = 42 38 Real[5] Prediction[5] = 45 40 Real[6] Prediction[6] = 36 39 Real[7] Prediction[7] = 38 32 Real[8] Prediction[8] = 40 42 Real[9] Prediction[9] = 39 36 Mean Square Error is 17.40
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
461
อธบายโปรแกรม
บรรทดท 5-8 กาหนดตวแปร X และ Y เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมลจรงและตวแปร Y เกบคาตวขอมลพยากรณ
กาหนดตวแปร MSE เปนตวแปรแบบเลขทศนยมเพอใชเกบคาผลลพธทไดจากการคานวณ กาหนดตวแปร sum เปนตวแปรแบบเลขทศนยมเพอใชเกบคาผลรวมของคาตวแปร และกาหนดตวแปร i เปนตวแปรเลขจานวนเตม
บรรทดท 9 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 10-14 การรบคาขอมลเกบไวในแถวลาดบ X และ Y โดยจะทาการรบคาท
ละคจนครบทงหมด
บรรทดท 15-18 คานวณหาคาผลรวมของคาสมบรณระหวางคาขอมลจรงและคาขอมลพยากรณ โดยใชฟงกชน pow() ในการหาคาการยกกาลงสองของผลลบระหวางคาขอมลจรงและคาพยากรณ
บรรทดท 19 คานวณหาคาความคลาดเคลอนกาลงสองเฉลย (MSE)
บรรทดท 20 แสดงผลลพธของคาความคลาดเคลอนกาลงสองเฉลย
ตวอยางท 12.14 โปรแกรมคานวณหาคาเปอรเซนตความคลาดเคลอนเฉลย (Mean
Percentage Error: MPE) โดยใหรบคาขอมลจรงและคาขอมลพยากรณจานวน 10 คา
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 float X[10],Y[10]; 6 float MPE; 7 int i; 8 float sum = 0; 9 float num = sizeof(X)/4; 10 for(i=0;i<num;i++) 11 { 12 printf("Real[%i] Prediction[%i] = ",i,i); 13 scanf("%f %f",&X[i],&Y[i]); 14 } 15 for(i=0;i<num;i++) 16 { 17 sum = sum + (((X[i]-Y[i])/X[i])*100); 18 } 19 MPE = sum /num; 20 printf("Mean Percentage Error is %.2f",MPE); 21 }
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
462
ผลลพธของโปรแกรม Real[0] Prediction[0] = 22 26 Real[1] Prediction[1] = 25 28 Real[2] Prediction[2] = 39 32 Real[3] Prediction[3] = 40 41 Real[4] Prediction[4] = 42 38 Real[5] Prediction[5] = 45 40 Real[6] Prediction[6] = 36 39 Real[7] Prediction[7] = 38 32 Real[8] Prediction[8] = 40 42 Real[9] Prediction[9] = 39 36 Mean Percentage Error is 1.61
อธบายโปรแกรม
บรรทดท 5-8 กาหนดตวแปร X และ Y เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมลจรงและตวแปร Y เกบคาตวขอมลพยากรณ
กาหนดตวแปร MPE เปนตวแปรแบบเลขทศนยมเพอใชเกบคาผลลพธทไดจากการคานวณ กาหนดตวแปร sum เปนตวแปรแบบเลขทศนยมเพอใชเกบคาผลรวมของคาตวแปร และกาหนดตวแปร i เปนตวแปรเลขจานวนเตม
บรรทดท 9 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 10-14 การรบคาขอมลเกบไวในแถวลาดบ X และ Y โดยจะทาการรบคาท
ละคจนครบทงหมด
บรรทดท 15-18 คานวณหาคาผลรวมของคาเปอรเซนตความคลาดเคลอน
บรรทดท 19 คานวณหาคาเปอรเซนตความคลาดเคลอนเฉลย (MPE)
บรรทดท 20 แสดงผลลพธของคาเปอรเซนตความคลาดเคลอนเฉลย
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
463
ตวอยางท 12.15 โปรแกรมคานวณหาเปอรเซนตคาความคลาดเคลอนสมบรณเฉลย (Mean
Absolute Percentage Error: MAPE) โดยใหรบคาขอมลจรงและคาขอมลพยากรณจานวน
10 คา
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 float X[10],Y[10]; 6 float MAPE; 7 int i; 8 float sum = 0; 9 float num = sizeof(X)/4; 10 for(i=0;i<num;i++) 11 { 12 printf("Real[%i] Prediction[%i] = ",i,i); 13 scanf("%f %f",&X[i],&Y[i]); 14 } 15 for(i=0;i<num;i++) 16 { 17 sum = sum + ((fabs(X[i]-Y[i])/X[i])*100); 18 } 19 MAPE = sum /num; 20 printf("Mean Absolute Percentage Error is %.2f",MAPE);21 }
ผลลพธของโปรแกรม Real[0] Prediction[0] = 22 26 Real[1] Prediction[1] = 25 28 Real[2] Prediction[2] = 39 32 Real[3] Prediction[3] = 40 41 Real[4] Prediction[4] = 42 38 Real[5] Prediction[5] = 45 40 Real[6] Prediction[6] = 36 39 Real[7] Prediction[7] = 38 32 Real[8] Prediction[8] = 40 42 Real[9] Prediction[9] = 39 36 Mean Absolute Percentage Error is 10.81
อธบายโปรแกรม
บรรทดท 5-8 กาหนดตวแปร X และ Y เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมลจรงและตวแปร Y เกบคาตวขอมลพยากรณ
กาหนดตวแปร MAPE เปนตวแปรแบบเลขทศนยมเพอใชเกบคาผลลพธทไดจากการคานวณ กาหนดตวแปร sum เปนตวแปรแบบ
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
464
เลขทศนยมเพอใชเกบคาผลรวมของคาตวแปร และกาหนดตวแปร i เปนตวแปรเลขจานวนเตม
บรรทดท 9 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 10-14 การรบคาขอมลเกบไวในแถวลาดบ X และ Y โดยจะทาการรบคาท
ละคจนครบทงหมด
บรรทดท 15-18 คานวณหาคาผลรวมของคาเปอรเซนตความคลาดเคลอนโดยใชฟงกชน fabs() ในการหาคาสมบรณของตวแปรเลขทศนยม
บรรทดท 19 คานวณหาคาความคลาดเคลอนสมบรณเฉลย (MAPE)
บรรทดท 20 แสดงผลลพธของคาความคลาดเคลอนสมบรณเฉลย
12.4 การคนหาขอมลและการจดเรยงขอมล (Searching and Sorting)
12.4.1 การคนหาขอมล การคนหาขอมลเปนกระบวนการทจาเปนในทางสถตเพอใชในการคนหาขอมลท
ตองการ ในชวตประจาวนของเราจะมความสมพนธกบการคนหาขอมล ซงการไดขอมลทรวดเรวยอมสงผลทาใหไดประสทธภาพทดตามไปดวย ตวอยางการคนหาขอมลเชน การคนหาขอมลทตองการ การคนหาขอมลในฐานขอมล การคนหาขอมลของเสนทางทสนทสดสาหรบการเดนทาง การคนหาขอมลของทางเดนของหนยนต การคนหาขอมลของการคนหาลกษณะของหลกการกลายพนธ และการคนหาขอมลของโรค นอกจากนในปจจบนยงไดนาความรทางดานสถตและระบบปญญาประดษฐ (Artificial Intelligence) มาชวยในการคนหา และการพยากรณเหตการณ (Forecasting) ทจะเกดขนในอนาคต การคนหาในหวขอนจะเปนการคนหาขอมลเบองตนเพอทจะนาไปพฒนาตอยอดใหมประสทธภาพยงขน ในหวขอนจะกลาวถง การคนหาขอมลแบบลาดบ (Sequential Search) และการคนหาขอมลแบบทวภาค
(Binary Search) ซงเปนวธการทเปนทนยมใชกนอยางแพรหลายและนาไปประยกตใชงาน
ขนตอนวธการคนหาขอมลแบบลาดบ (Sequential Search)
การคนหาขอมลแบบลาดบ จะเปนการคนหาขอมลตงแตตวแรก และทาการคนไปจนกวาจะพบขอมลตวทตองการคนหา หรอถาคนหาจนถงขอมลตวสดทายแลวยงไมพบขอมลทตองการคนหา แสดงวาไมมขอมลตวทตองการคนหา ซงเหมาะสมการคนหาขอมลทมจานวนไมมากนกและขอมลไมจาเปนตองผานการจดเรยงลาดบ วธคนหาขอมลแบบลาดบ
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
465
เปนการคนหาในลกษณะเชงเสน เปนวธทงายทสดเพอแสดงใหเหนกระบวนการคนหาเพอนาไปประยกตใชงานตอไป ตวอยางการคนหาขอมลแบบลาดบดงเชนตองการคนหาขอมลทมคา 32 เรมแรกกจะดาเนนการหาคาโดยกาหนด index = 0 ณ ตาแหนง A[0] และดาเนนการหาคาตาแหนง A[1] ไปจนกวาจะเจอขอมลทตองการ ซงในตวอยางนขอมลทตองการคอตาแหนง A[4]
รปท 12.1 การคนหาขอมลแบบลาดบ
A[0] A[1] A[2] A[3] A[4] A[5] A[6]
7 8 9 10 32 8 92
A[0] A[1] A[2] A[3] A[4] A[5] A[6]
7 8 9 10 32 8 92
A[0] A[1] A[2] A[3] A[4] A[5] A[6]
7 8 9 10 32 8 92
A[0] A[1] A[2] A[3] A[4] A[5] A[6]
7 8 9 10 32 8 92
A[0] A[1] A[2] A[3] A[4] A[5] A[6]
7 8 9 10 32 8 92
index=0
index=1
index=2
index=4
index=3
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
466
การคนหาขอมลแบบลาดบเปนการคนหาขอมลแบบลาดบโดยจะทาการคนหาขอมลจากตวแรกไปจนถงตวทเจอขอมล เทคนคนเปนขนตอนวธทไมซบซอนและกระทาไดโดยงายแตอยางไรกตามขอเสยของวธการนคอในกรณทขอมลทมปรมาณมากและขอมลทตองการอยตาแหนงทาย จะทาใหตองเสยเวลามากในการคนหามาก ดงนนประสทธภาพของขนตอนวธของการคนหาขอมลแบบลาดบในกรณทแยทสดคอ O(n) ซงคอสญกรณโอใหญ (Big-Oh
Notation) โดยสญกรณโอใหญเปนสญกรณคณตศาสตรทใชแสดงแนวโนมการเตบโตทางเวลา (Growth in Run Time) โดยบรรยายพฤตกรรมเชงเสนกากบของฟงกชน เพอใชอธบายประสทธภาพของขนตอนวธเชงเวลาทไดออกแบบไว สญลกษณของสญกรณโอใหญจะแทนดวยเครองหมาย O( )
ตวอยางท 12.16 โปรแกรมคนหาตาแหนงของขอมลทตองการคนหา โดยใหรบคาขอมลจานวน 10 คา และใหกาหนดคาทตองการคนหาโดยทาการระบตาแหนงทเจอขอมล โดยวธการคนหาขอมลแบบลาดบ
1 #include <stdio.h> 2 main() 3 { 4 int X[10]; 5 int i; 6 int Position = 0; 7 int search; 8 int num = sizeof(X)/2; 9 for(i=0;i<num;i++) 10 { 11 printf("Input[%i] = ",i); 12 scanf("%i",&X[i]); 13 } 14 printf("Number of Finding = "); 15 scanf("%i",&search); 16 for(i=0;i<num;i++) 17 { 18 if(X[i]==search) 19 { 20 Position = i; 21 printf("Position of Searching is %i",i); 22 break; 23 } 24 if(i>=num-1) 25 { 26 printf("Can not Find"); 27 } 28 }
29 }
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
467
ผลลพธของโปรแกรม (รนครงท 1)
Input[0] = 10 Input[1] = 11 Input[2] = 13 Input[3] = 34 Input[4] = 56 Input[5] = 32 Input[6] = 14 Input[7] = 77 Input[8] = 88 Input[9] = 99 Number of Finding = 14 Position of Searching is 6
(รนครงท 2)
Input[0] = 1 Input[1] = 2 Input[2] = 3 Input[3] = 4 Input[4] = 5 Input[5] = 6 Input[6] = 7 Input[7] = 8 Input[8] = 9 Input[9] = 10 Number of Finding = 100 Can not Find
อธบายโปรแกรม
บรรทดท 4-7 กาหนดตวแปร X เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมล กาหนดตวแปร Position และ search เปนตวแปรแบบเลขจานวนเตม โดยตวแปร Position เพอใชเกบคาผลลพธตาแหนงของตวชทคนพบขอมล ตวแปร search เพอใชเกบคาทตองการคนหา และกาหนดตวแปร i เปนตวแปรเลขจานวนเตมเพอเปนตวชขอมลในการคนหาแบบลาดบ
บรรทดท 8 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 9-13 การรบคาขอมลเกบไวในแถวลาดบ X จานวน 10 คาเพอเปนขอมล
สาหรบการคนหา บรรทดท 14-15 แสดงขอความและรบคาขอมลทตองการคนหา
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
468
บรรทดท 16-28 คานวณหาคาตาแหนงของขอมล ถาเจอขอมลใหแสดงตาแหนงของขอมล ถาไมเจอขอมลใหแสดงขอความวาไมพบขอมล
ขนตอนวธการคนหาขอมลแบบทวภาค (Binary Search)
การคนหาขอมลแบบทวภาคเปนวธการทเพมประสทธภาพในการคนหาขอมลและมประสทธภาพมากกวาวธการคนหาขอมลแบบลาดบ โดยขอมลจะตองมการจดเรยงกอนทจะดาเนนการคนหา โดยมลาดบขนตอนวธการคนหาจะทาการตรวจสอบตาแหนงกงกลางของขอมลทนามาคนหาโดยคานวณจากตาแหนงขอมลแรกรวมกบตาแหนงขอมลสดทายแลวหารดวยสองจากนนนาขอมลตวทตองการคนหาไปเปรยบเทยบวาเทากบคาของตาแหนงกงกลางหรอไม ถาเทากนแสดงวาพบขอมลทตองการคนหาในตาแหนงกงกลาง และถาไมเทากนใหเปรยบเทยบวาคาทตองการคนหามคามากกวาคาในตาแหนงกงกลางหรอไม โดยถามากกวาใหคนหาขอมลทางดานขวาของตาแหนง แตถานอยกวาใหคนหาขอมลดานซายของตาแหนง ทาซาไปจนกวาจะเจอขอมล แตถาไมเจอแสดงวาไมมขอมลทตองการคนหา
ตวอยางท 12.17 จากขอมล [10, 12, 15, 20, 28, 30, 45, 60] จงคนหาขอมล 28 ดวยวธการคนหาขอมลแบบทวภาค
Search = 28
รอบท 1 mid = (first+last)/2 = (0+7)/2 = 3
data index 0 1 2 3 4 5 6 7
value 10 12 15 20 28 30 45 60
first mid last
Search > data[mid] เพราะฉะนน first=4 และ last=7
รอบท 2 mid = (first+last)/2 = (4+7)/2 = 5
data index 0 1 2 3 4 5 6 7
value 10 12 15 20 28 30 45 60
first mid last
Search < data[mid] เพราะฉะนน first=4 และ last=4
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
469
รอบท 3 mid = (first+last)/2 = (4+4)/2 = 4
data index 0 1 2 3 4 5 6 7
value 10 12 15 20 28 30 45 60
first
last
mid
Search = data[mid] เพราะฉะนนพบขอมล 28 ตาแหนงหรอดรรชนท 4
ประสทธภาพการคนหาขอมลแบบทวภาคจะมประสทธภาพมากกวาวธการคนหาขอมลแบบลาดบซงเปรยบเสมอนการพบกระดาษทละครงไปจนกวาจะเจอสงทตองการ ดงนนประสทธภาพของขนตอนวธของการคนหาขอมลแบบทวภาคในกรณทแยทสดคอ O(log n)
ตวอยางท 12.18 โปรแกรมคนหาตาแหนงของขอมลทตองการคนหา โดยใหรบคาขอมลจานวน 10 คา และใหกาหนดคาทตองการคนหาโดยทาการระบตาแหนงทเจอขอมลโดยวธการคนหาขอมลแบบทวภาค
1 #include <stdio.h> 2 main() 3 { 4 int X[10]; 5 int i; 6 int first,last,mid; 7 int Position = 0; 8 int search; 9 int num = sizeof(X)/2; 10 for(i=0;i<num;i++) 11 { 12 printf("Input[%i] = ",i); 13 scanf("%i",&X[i]); 14 } 15 printf("Number = "); 16 scanf("%i",&search); 17 last = num-1; 18 first = 0; 19 i = 0; 20 while((i<num)||(first>=last)) 21 { 22 mid = (first + last)/2; 23 if(X[mid]==search) 24 { 25 Position = mid;
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
470
26 printf("Position of Searching is %i",mid); 27 break; 28 }else if(search > X[mid]) 29 { 30 first = mid+1; 31 i = first; 32 }else if(search < X[mid]) 33 { 34 last = last-1; 35 i = last; 36 } 37 } 38 if(first>=last) 39 { 40 printf("Can not Find"); 41 }
42 }
ผลลพธของโปรแกรม (รนครงท 1)
Input[0] = 1 Input[1] = 2 Input[2] = 3 Input[3] = 4 Input[4] = 5 Input[5] = 6 Input[6] = 7 Input[7] = 8 Input[8] = 9 Input[9] = 10 Number = 9 Position of Searching is 8
(รนครงท 2)
Input[0] = 10 Input[1] = 20 Input[2] = 30 Input[3] = 40 Input[4] = 50 Input[5] = 60 Input[6] = 70 Input[7] = 80 Input[8] = 90 Input[9] = 100 Number = 20 Position of Searching is 1
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
471
อธบายโปรแกรม
บรรทดท 4-8 กาหนดตวแปร X เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมล กาหนดตวแปร Position และ search เปนตวแปรแบบเลขจานวนเตม โดยตวแปร Position เพอใชเกบคาผลลพธตาแหนงของตวชทคนพบขอมล ตวแปร search เพอใชเกบคาทตองการคนหา กาหนดตดแปร first, mid, last เปนตวแปรแบบเลขจานวนเตม และกาหนดตวแปร i เปนตวแปรเลขจานวนเตมเพอเปนตวชขอมลในการคนหาแบบทวภาค
บรรทดท 9 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 10-14 การรบคาขอมลเกบไวในแถวลาดบ X จานวน 10 คาเพอเปนขอมล
สาหรบการคนหา บรรทดท 15-16 แสดงขอความและรบคาขอมลทตองการคนหา บรรทดท 17-19 กาหนดคาเรมตนของตวแปรเพอเปนตาแหนงของขอมลทจะทาการ
เปรยบเทยบ
บรรทดท 20-37 คานวณหาคาตาแหนงของขอมล ถาเจอขอมลใหแสดงตาแหนงของขอมล ถาไมเจอขอมลใหแสดงขอความวาไมพบขอมล โดยใหทาซาไปจนกวา (i<num)หรอ(first>=last)วธการคนหาทวภาคจะทาการหาคากงกลางแลวนามาเปรยบเทยบดงแสดงในบรรทดท 22-36 โดยถาตาแหนงกงกลางคอขอมลทคนหาแสดงวาเจอขอมลทตองการ ถาคาทตองการคนหามากกวาคาตาแหนงกงกลาง ให first = mid+1;
และถาคาทตองการคนหานอยกวาคาตาแหนงกงกลางให last =
last-1; ใหทาซาจนกวาจะเจอขอมล โดยถาไมเจอแสดงวาไมพบขอมลจะแสดงคาวา “Can not Find” ทหนาจอภาพ
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
472
12.4.2 การจดเรยงขอมล การเรยงลาดบขอมลเปนหวขอหนงทสาคญในดานสถตเนองจากในการดาเนนการ
ทางสถตบางอยางจาเปนทจะตองมการเรยงลาดบขอมลกอนทจะมการประมวลผลดานสถต
ดงเชนการหาคามธยฐาน การหาคาพสยควอรไทล และการหาคาสวนเบยงเบนควอรไทลเปนตน ในการเรยงลาดบขอมลเปนงานพนฐานทใชในโปรแกรมประยกตตางๆ ขนตอนวธทใชเพอการเรยงลาดบขอมลแตละวธมหลากหลายวธและมขอดขอเสยแตกตางกน ซงในบางครงกขนอยกบจานวน ชนดของขอมล การกาหนดคาตอนเรมตน ขนาด และคาของขอมลทจะทาการเรยงลาดบ ดงนนขนตอนวธในการจดเรยงขอมลจงเปนขนตอนทมความจาเปนในการพฒนาไปสการเขยนโปรแกรมเพอใหสามารถดาเนนการเขยนโปรแกรมไปในทศทางทตองการได ซงในหวขอการจดเรยงขอมลจะกลาวถงวธการจดเรยงทนยมใชกนอยางแพรหลายดงเชนวธการเรยงลาดบแบบเลอก (Selection Sort) การเรยงลาดบแบบแทรก (Insertion Sort) และการเรยงลาดบแบบฟอง (Bubble Sort) เพอเปนพนฐานการเขยนโปรแกรมในการจดเรยงขอมลอยางมประสทธภาพ
ขนตอนวธการจดเรยงขอมลแบบเลอก (Selection Sort)
ขนตอนวธการเรยงลาดบขอมลดวยวธการเรยงลาดบแบบเลอกเปนวธทงายและกเปนวธทใชงานมากทสด แตมขอเสยในกรณทมขอมลจานวนมาก แตถาขอมลทมนอยนบวาเปนวธการทเหมาะสมเนองจากไมซบซอนและสามารถเขยนโปรแกรมไดไมยาก การเรยงลาดบแบบเลอก สามารถแสดงขนตอนวธไดโดยกาหนดใหตาแหนงแรกของขอมล เปนตาแหนงทพจารณาจากนนคนหาขอมลตวทมคานอยทสดของขอมลทอยตาแหนงถดจากตาแหนงทพจารณาแลวทาการเปรยบเทยบวาขอมลททาการเปรยบเทยบมคานอยกวาขอมลตาแหนงทพจารณาหรอไม ถาใชใหสลบตาแหนงกน และใหตรวจสอบวามขอมลทอยถดจากตาแหนงทพจารณา และตองไมเปนขอมลตวสดทายของขอมลทนามาจดเรยงหรอไม ถามใหกาหนดตาแหนงของขอมลนนเปนตาแหนงทพจารณา แลวกลบไปคนหาตาแหนงทนอยทสด แตถาไมมแสดงวาการเรยงลาดบเสรจสมบรณ ดงเชนการเรยงลาดบขอมล [44 17 40 32 9 14] แสดงการเรยงลาดบดงน
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
473
รอบท 0 44 17 40 32 9 14
รอบท 1 9 17 40 32 44 14
รอบท 2 9 14 40 32 44 17
รอบท 3 9 14 17 32 44 40
รอบท 4 9 14 17 32 44 40
รอบท 5 9 14 17 32 40 44
ประสทธภาพการเรยงลาดบแบบเลอกจะใชเวลาสวนใหญในการเปรยบเทยบขอมลทงหมดในแตละครงจนพบขอมลทตองการจงทาการสลบคา ดงนนเวลาสวนใหญจะเปนการเปรยบเทยบขอมล ดงนนประสทธภาพของขนตอนวธของการเรยงลาดบแบบเลอกในกรณทแยทสดคอ O(n
2)
ตวอยางท 12.19 โปรแกรมจดเรยงขอมล โดยใหรบคาขอมลจานวน 10 คา โดยวธการจดเรยงขอมลแบบเลอก
1 #include <stdio.h> 2 main() 3 { 4 int X[10]; 5 int i,j,temp; 6 int num = sizeof(X)/2; 7 for(i=0;i<num;i++) 8 { 9 printf("Input[%i] = ",i); 10 scanf("%i",&X[i]); 11 } 12 for(i=0;i<num;i++) 13 { 14 for(j=i+1;j<num;j++) 15 { 16 if(X[i]>X[j]) 17 {
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
474
18 temp=X[i]; 19 X[i]=X[j]; 20 X[j]=temp; 21 } 22 } 23 } 24 printf("Selection Sort is: "); 25 for(i=0;i<num;i++) 26 { 27 printf(" %d",X[i]); 28 }
29 }
ผลลพธของโปรแกรม Input[0] = 1 Input[1] = 3 Input[2] = 5 Input[3] = 7 Input[4] = 9 Input[5] = 2 Input[6] = 4 Input[7] = 6 Input[8] = 8 Input[9] = 10 Selection Sort is: 1 2 3 4 5 6 7 8 9 10
อธบายโปรแกรม
บรรทดท 4-5 กาหนดตวแปร X เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมล กาหนดตวแปร i, j และ temp เปนตวแปรเลขจานวนเตม โดยตวแปร i และ j เปนตวกาหนดตาแหนงของขอมลทจะใชในวธการจดเรยงขอมล และตวแปร temp เพอเปนทเกบขอมลชวคราวในการสลบตาแหนงของขอมล
บรรทดท 6 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 7-11 การรบคาขอมลเกบไวในแถวลาดบ X จานวน 10 คา เพอเปนคา
เรมตนสาหรบการจดเรยงขอมล บรรทดท 12-23 ทาการจดเรยงขอมลโดยจะดาเนนการดาเนนการเปรยบเทยบ
ตาแหนงถดไปเรอยๆ จนกวาจะถงตวสดทายของขอมล โดยทาการเปรยบเทยบคาทพจารณาและคาทเปรยบเทยบ ถาขอมลททาการเปรยบเทยบมคานอยกวาขอมลตาแหนงทพจารณาใหสลบตาแหนงกน และใหตรวจสอบวามขอมลทอยถดจากตาแหนงทพจารณา และตองไมเปนขอมลตวสดทายของขอมลทนามาจดเรยงหรอไม ถามให
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
475
กาหนดตาแหนงของขอมลนนเปนตาแหนงทพจารณา แลวกลบไปคนหาตาแหนงทนอยทสด แตถาไมมแสดงวาการเรยงลาดบเสรจสมบรณ
บรรทดท 24-28 แสดงผลลพธของการจดเรยงขอมล
ขนตอนวธการจดเรยงขอมลแบบแทรก (Insertion Sort)
ขนตอนวธการเรยงลาดบขอมลดวยวธการเรยงลาดบแบบแทรกเปนอกวธการทไมซบซอนและเหมาะสาหรบการนาไปประยกตใชงานโดยมแนวความคดอยทการนาเอาขอมลใหมเพมเขาไปในชดขอมลทมการเรยงลาดบอยแลว โดยขอมลใหมทนาเขามาแทรกอยในตาแหนงทางขวาของขอมลชดเดม และยงคงทาใหขอมลทงหมดมการเรยงลาดบ โดยเรมตนจากการเรยงลาดบขอมล 2 ตว จากนนกกระทาการเพมขอมลเขามาพรอมทงทาการเปรยบเทยบ วธนเรมตนโดยการเรยงลาดบขอมล 2 ตวแรกของชดขอมล หลงจากนนเพมขอมลตวท 3 เขามาและทาการแทรกในตาแหนงทจดเรยง จากนนกจะกระทาไปจนกวาจะครบขอมลททาการจดเรยง ซงเปรยบเสมอนเทคนคทนาไปใชกบการเรยงไพ ดงเชนการเรยงลาดบขอมล [44 17 40 32 9 14] แสดงการเรยงลาดบดงน
รอบท 0 44 17 40 32 9 14
รอบท 1 17 44 40 32 9 14
รอบท 2 17 40 44 32 9 14
รอบท 3 17 32 40 44 9 14
รอบท 4 9 17 32 40 44 14
รอบท 5 9 14 17 32 40 44
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
476
การเรยงลาดบแบบแทรกนเปนวธการทงายไมซบซอนแนวความคดอยทการนาเอาขอมลใหมเพมเขาไปในชดขอมลทมการเรยงลาดบอยแลว ดงนนประสทธภาพการเรยงลาดบแบบแทรกโดยทวไปจะคานวณจากจานวนครงของการเปรยบเทยบขอมลในลกษณะยอนกลบในแตละรอบของการเรยง ดงนนประสทธภาพของขนตอนวธของการเรยงลาดบแบบแทรกในกรณทแยทสดคอ O(n
2)
ตวอยางท 12.20 โปรแกรมจดเรยงขอมล โดยใหรบคาขอมลจานวน 10 คา โดยวธการจดเรยงขอมลแบบแทรก
1 #include <stdio.h> 2 main() 3 { 4 int X[10]; 5 int i,j,temp; 6 int num = sizeof(X)/2; 7 for(i=0;i<num;i++) 8 { 9 printf("Input[%i] = ",i); 10 scanf("%i",&X[i]); 11 } 12 for(i=1;i<num;i++) 13 { 14 temp=X[i]; 15 j=i-1; 16 while((temp<X[j])&&(j>=0)) 17 { 18 X[j+1]=X[j]; 19 j=j-1; 20 } 21 X[j+1]=temp; 22 } 23 printf("Insearch Sort is: "); 24 for(i=0;i<num;i++) 25 { 26 printf(" %d",X[i]); 27 }28 }
ผลลพธของโปรแกรม Input[0] = 2 Input[1] = 4 Input[2] = 6 Input[3] = 7 Input[4] = 9 Input[5] = 8 Input[6] = 1 Input[7] = 3 Input[8] = 5 Input[9] = 10 Insearch Sort is: 1 2 3 4 5 6 7 8 9 10
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
477
อธบายโปรแกรม
บรรทดท 4-5 กาหนดตวแปร X เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมล กาหนดตวแปร i, j และ temp เปนตวแปรเลขจานวนเตม โดยตวแปร i และ j เปนตวกาหนดตาแหนงของขอมลทจะใชในวธการจดเรยงขอมล และตวแปร temp เพอเปนทเกบขอมลชวคราวในการสลบตาแหนงของขอมล
บรรทดท 6 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 7-11 การรบคาขอมลเกบไวในแถวลาดบ X จานวน 10 คา เพอเปนคา
เรมตนสาหรบการจดเรยงขอมล บรรทดท 12-22 ทาการจดเรยงขอมลโดยวธการจดเรยงแบบแทรกโดยเรมจากขอมล
สองตวแรกทาการเปรยบเทยบจากนนกกระทาการเพมขอมลเขามาพรอมทงทาการเปรยบเทยบ ถาขอมลททาการเปรยบเทยบมคานอยกวาใหทาการแทรกขอมลโดยจะทาการจดเรยงขอมล จากนน
จากนนกจะกระทาไปจนกวาจะครบขอมลททาการจดเรยง บรรทดท 23-27 แสดงผลลพธของการจดเรยงขอมล
ขนตอนวธการจดเรยงขอมลแบบฟอง (Bubble Sort)
ขนตอนวธการเรยงลาดบขอมลดวยวธการเรยงลาดบแบบฟองเปนการเรยงลาดบขอมลทดจากคาทพจารณาและคาทเปรยบเทยบขางเคยง โดยคาทพจารณามคามากกวาคาเปรยบเทยบใหสลบตาแหนงกน และจะกระทาการเปรยบเทยบกบคาทเปรยบเทยบไปจนถงขอมลตาแหนงสดทาย กจะไดคาทมากทสดอยดานขวา (เปรยบเสมอนการลอยของฟองทจะลอยไปหลงสด) จากนนเมอเสรจกระบวนการนแลวกจะดาเนนการทาซาโดยดจากคาทพจารณาและคาทเปรยบเทยบไปจนกวาจะไดขอมลทมการจดเรยง ดงเชนการเรยงลาดบขอมล [44 17 40 32 9 14] แสดงการเรยงลาดบดงน
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
478
รอบท 0 44 17 40 32 9 14
รอบท 1 17 40 32 9 14 44
รอบท 2 17 32 9 14 40 44
รอบท 3 17 9 14 32 40 44
รอบท 4 9 14 17 32 44 40
รอบท 5 9 14 17 32 40 44
การเรยงลาดบแบบฟองเปนการเปรยบเทยบคาสองคาทอยใกลกนตอเนองกนไปเรอยๆ และตดสนใจวาจะทาการสลบตาแหนงกนหรอไม ดงนนประสทธภาพการเรยงลาดบแบบฟองจะมลกษณะคลายกนกบวธการเรยงขอมลแบบเลอกดงนนประสทธภาพของขนตอนวธของการเรยงลาดบแบบฟองในกรณทแยทสดคอ O(n
2)
ตวอยางท 12.20 โปรแกรมจดเรยงขอมล โดยใหรบคาขอมลจานวน 10 คา โดยวธการจดเรยงขอมลแบบฟอง
1 #include <stdio.h> 2 main() 3 { 4 int X[10]; 5 int i,j,temp; 6 int num = sizeof(X)/4; 7 for(i=0;i<num;i++) 8 { 9 printf("Input[%i] = ",i); 10 scanf("%i",&X[i]); 11 } 12 for(i=num-2;i>=0;i--) 13 { 14 for(j=0;j<=i;j++) 15 { 16 if(X[j]>X[j+1])
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
479
17 { 18 temp=X[j]; 19 X[j]=X[j+1]; 20 X[j+1]=temp; 21 } 22 } 23 } 24 printf("Buble Sort is: "); 25 for(i=0;i<num;i++) 26 { 27 printf(" %d",X[i]); 28 } 29 }
ผลลพธของโปรแกรม Input[0] = 2 Input[1] = 1 Input[2] = 4 Input[3] = 3 Input[4] = 6 Input[5] = 5 Input[6] = 8 Input[7] = 7 Input[8] = 9 Input[9] = 11 Buble Sort is: 1 2 3 4 5 6 7 8 9 11
อธบายโปรแกรม
บรรทดท 4-5 กาหนดตวแปร X เปนตวแปรแถวลาดบ โดยตวแปร X สาหรบเกบคาตวแปรคาขอมล กาหนดตวแปร i, j และ temp เปนตวแปรเลขจานวนเตม โดยตวแปร i และ j เปนตวกาหนดตาแหนงของขอมลทจะใชในวธการจดเรยงขอมล และตวแปร temp เพอเปนทเกบขอมลชวคราวในการสลบตาแหนงของขอมล
บรรทดท 6 เปนการหาคาขนาดของแถวลาดบเพอใชในการบงบอกจานวนขอมล บรรทดท 7-11 การรบคาขอมลเกบไวในแถวลาดบ X จานวน 10 คา เพอเปนคา
เรมตนสาหรบการจดเรยงขอมล
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
480
บรรทดท 12-23 ทาการจดเรยงขอมลโดยวธการจดเรยงแบบฟอง โดยการเรยงลาดบจะมขอมลทดจากคาทพจารณาและคาทเปรยบเทยบขางเคยง โดยคาทพจารณามคามากกวาคาเปรยบเทยบใหสลบตาแหนงกน และจะกระทาการเปรยบเทยบกบคาทเปรยบเทยบไปจนถงขอมลตาแหนงสดทาย กจะไดคาทมากทสดอยดานขวา จากนนเมอเสรจกระบวนการนแลวกจะดาเนนการทาซาไปจนกวา i>=0 และ j<=i
ซงกจะเสรจสนการจดเรยงขอมลแบบฟอง บรรทดท 24-28 แสดงผลลพธของการจดเรยงขอมล
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
481
บทสรป
ในบทนไดกลาวถงการวดแนวโนมเขาสสวนกลาง การวดการกระจายของขอมล การคานวณสมการถดถอย และการคนหาขอมลและการจดเรยงขอมล โดยการวดแนวโนมเขาสสวนกลางเปนวธการทใชในการบรรยายลกษณะของขอมลทรวบรวมมาได โดยใชตวเลขเพยงจานวนเดยวหรอคาเดยว แทนลกษณะของขอมลชดนน โดยสถตทนยมใชวดแนวโนมเขาสสวนกลางคอตวกลางเลขคณต มธยฐาน และฐานนยม การวดการกระจายของขอมล เปนสถตประเภทหนงทคานวณคาเพอใชอธบายลกษณะการกระจายของขอมล ซงเปนการสรปลกษณะของขอมลวามลกษณะการกระจายตวของขอมลเปนอยางไร วธการวดการกระจายตวของขอมลทนยมใชกนดงเชน พสย พสยควอรไทลและสวนเบยงเบนควอรไทล และสวนเบยงเบนมาตรฐานและความแปรปรวน การคานวณสมการถดถอยเปนเทคนคหนงทใชวเคราะหความสมพนธระหวางตวแปรโดยมจดมงหมายเพอการพยากรณ คาของตวแปรทตองการ เมอทราบคาของตวแปรอกตวหนงหรออกหลายตว เมอไดทาการพยากรณแลวสงทจาเปนในลาดบถดไปจากการพยากรณคอการวดประสทธภาพของการพยากรณซงจะมอยหลากหลายวธการดงเชนวธการวดประสทธภาพการพยากรณโดยใชคาเบยงเบนสมบรณเฉลย คาความคลาดเคลอนกาลงสองเฉลย คาเปอรเซนตความคลาดเคลอนเฉลย และคาเปอรเซนตความคลาดเคลอนสมบรณเฉลย ซงเปนเทคนคในการวดประสทธภาพในการพยากรณทใชเปนทนยมและใชกนอยางแพรหลายในงานวจยตางๆ สดทายคอการคนหาขอมลและการจดเรยงขอมลซงเปนสงจาเปนในทางสถตวจยทไดกลาวในบทน ซงในบางครงอาจจะมความจาเปนในการคนหาขอมลทสาคญจากกลมขอมลขนาดใหญเพอมาคานวณคาทางสถต หรอมการจดเรยงขอมลกอนทจะดาเนนการประมวลผลทางวธการทางสถตเปนตน ในการคนหาขอมลในบทนไดกลาวถงการเขยนโปรแกรมในการคนหาขอมลแบบลาดบ และการคนหาขอมลแบบทวภาค ซงเปนวธการทเปนทนยมใชกนอยางแพรหลายและการประประยกตใชงาน
สวนการจดเรยงขอมลไดกลาวถงการเขยนโปรแกรมในจดเรยงขอมลแบบเลอก การจดเรยงขอมลแบบแทรก และการจดเรยงขอมลแบบฟอง ซงเปนวธการจดเรยงขอมลทกระทาไดโดยงายและเหมาะสมกบการนาไปประยกตใชงาน
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
482
แบบฝกหดทบทวน
1. จงอธบายการวดแนวโนมเขาสสวนกลางคออะไร และมประโยชนอยางไร พรอมทงยกตวอยางการนาไปใชงาน
2. จงอธบายการวดการกระจายของขอมลคออะไร และมประโยชนอยางไร พรอมทงยกตวอยางการนาไปใชงาน
3. จงอธบายการคานวณสมการถดถอยคออะไร และมประโยชนอยางไร พรอมทงยกตวอยางการนาไปใชงาน
4. จงเขยนโปรแกรมคานวณคาตวกลางเลขคณต (Arithmetic Mean) มธยฐาน (Median)
และฐานนยม (Mode) จากขอมลทงหมด 10 คา โดยคาอนพตทปอนเขาไปไมจาเปนตองเรยงลาดบคาขอมล
5. จงเขยนโปรแกรมคานวณคาพสย (Range) พสยควอรไทลและสวนเบยงเบนควอรไทล (Quartile Range and Quartile Deviation) และสวนเบยงเบนมาตรฐานและความแปรปรวน (Standard Deviation and Variance) จากจานวนขอมลทงหมด 10 คา โดยคาอนพตทปอนเขาไปไมจาเปนตองเรยงลาดบคาขอมล
6. จงอธบายคาการพยากรณโดยใชคาเบยงเบนสมบรณเฉลย (Mean Absolute Deviation:
MAD) คาความคลาดเคลอนกาลงสองเฉลย (Mean Square Error: MSE) คาเปอรเซนตความคลาดเคลอนเฉลย (Mean Percentage Error: MPE) และคาเปอรเซนตความคลาดเคลอนสมบรณเฉลย (Mean Absolute Percentage Error: MAPE) คออะไร และมประโยชนอยางไร พรอมทงยกตวอยางการนาไปใชงาน
7. จงเขยนโปแกรมเพอคานวณการสรางสมการถดถอยแบบเสนตรงเพอใชในการพยากรณ
โดยสามารถกาหนดคาจานวนอนพตทปอนเขาไป และเมอคานวณไดสมการถดถอยแลวใหคานวณหาคาประสทธภาพของการพยากรณโดยใชคาความคลาดเคลอนกาลงสองเฉลย (Mean Square Error: MSE) และคาเปอรเซนตความคลาดเคลอนสมบรณเฉลย (Mean Absolute Percentage Error: MAPE)
บทท 12 การประยกตภาษาซใชในงานดานสถตวจย
483
8. ใหนกศกษาหาขอมลงานวจยในการพยากรณตางๆ จานวน 1 งานวจย เชนการพยากรณปรมาณนาฝน การพยากรณสนคา การพยากรณการซอขายตลาดหน และการพยากรณปรมาณการใชไฟฟาเปนตน โดยหาขอมลคาตวแปรอสระ (X) และตวแปรตาม (Y) เพอนาขอมลทไดมาสรางโปรแกรมพยากรณพรอมทงทดสอบประสทธภาพของการพยากรณโดยใชคาเบยงเบนสมบรณเฉลย (Mean Absolute Deviation: MAD) และคาเปอรเซนตความคลาดเคลอนเฉลย (Mean Percentage Error: MPE)
9. ใหนกศกษาคดกลมขอมลทจะทาการการพยากรณโดยวธการพยากรณจานวน 3 กลมขอมล และใหศกษาความเปนไปไดในการพยากรณวาจะมประสทธภาพมากนอยเพยงไร
10. จงเขยนโปรแกรมการเรยงลาดบแบบเลอก (Selection Sort) การเรยงลาดบแบบแทรก (Insertion Sort) และการเรยงลาดบแบบฟอง (Bubble Sort) โดยใหสามารถเลอกคาจานวนอนพตทตองการได และสามารถเลอกวธการทตองการเรยงลาดบ
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
บทท 13
การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
ในบทนจะกลาวถงทฤษฎการวเคราะหขอสอบ (Item Analysis) ทฤษฎขนตอนวธเชงพนธกรรม (Genetic Algorithm) และการเขยนโปรแกรมในการสรางขอสอบอตโนมตโดยขนตอนวธเชงพนธกรรม (Programming Language for Creating the Automatic
Examinations by Genetic Algorithm) โดยในบทนสวนแรกจะเรมตนศกษาทฤษฎการวเคราะหขอสอบและทฤษฎขนตอนวธเชงพนธกรรม จากนนในสวนถดไปจะเปนการนาเอาทฤษฎทไดศกษาไปเขยนโปรแกรมเพอจะนาไปสการเขยนโปรแกรมในการสรางขอสอบอตโนมต ซง เ ปนบทประยกตในการเ ขยนโปรแกรมภาษาซในงานทางเทคโนโลยปญญาประดษฐเพอเขยนโปรแกรมใหคอมพวเตอรสามารถทางานไดเองโดยอตโนมตเพอให
สามารถทางานไดแทนมนษยไดอยางมประสทธภาพ และเปนตวอยางทมการเขยนโปรแกรมทใชในงานวจยเพอใหนกศกษาสามารถเขาใจและนาไปประยกตตอไป
13.1 ทฤษฎการวเคราะหขอสอบ (Item Analysis)
การวเคราะหขอสอบหมายถงการแยกสงหรอเรองราวใดๆ ออกเปนสวนยอยเพอคนหาองคประกอบหรอคณลกษณะ หรอคณภาพของสวนยอยนน การวเคราะหขอสอบหมายถงการคนหาคณลกษณะ คณภาพ ของคาถามและตวเลอก ซงเปนสวนทประกอบกนขนมาเปนขอสอบ วาเปนอยางไร ดหรอไม งายหรอยาก เมอครสรางขอสอบขนมาใชสอบนกเรยนครงแรก แมจะไดยดหลกเกณฑวธการสรางขอสอบอยางดแลวกตาม กยงไมยอมรบวาขอสอบนนดโดยสมบรณเชน สรางขอสอบใหเทยงตรงตามเนอหา คาถามและตวเลอกถกตองตามคณลกษณะทกประการ จดวาเปนคณลกษณะทดของขอสอบเพยงบางสวนเทานน
คณลกษณะทดของขอสอบทเกยวของกบเรองการวเคราะหขอสอบ เชน ความยากงาย และ
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
486
อานาจจาแนกของขอสอบ ดงนนการวเคราะหขอสอบจงเปนการตรวจสอบหาความยากงายของขอสอบ จะกลาวไมไดเลยวาขอสอบทสรางขนมานนยากงายพอเหมาะ หากยงไมไดวเคราะหขอสอบนน และเปนการตรวจหาอานาจจาแนกวาขอสอบนนแยกเดกออนเดกเกงไดจรงหรอไม โดยเฉพาะเดกทมความสามารถใกลเคยงกนหรอ แตกตางกนเพยงเลกนอยทถกทควรจะเปนคอขอสอบควรแยกหรอจาแนกวาใครเกงกวา ใครออนกวาได
การจะวเคราะหขอสอบพจารณาประเดนดงตอไปนคอ 1. ความยากงาย (Difficulty)
2. อานาจจาแนก (Discrimination)
3. ความเปนปรนย (Objectivity)
4. ความมประสทธภาพ (Efficiency)
5. ความยตธรรม (Fairness)
6. ความเทยงตรงของแบบทดสอบ (Validity)
7. ความเชอมน (Reliability)
โดยทวไปการวเคราะหขอสอบสามารถกระทาได 2 ประเภทคอ ประเภทท 1 คอการวเคราะหขอสอบแบบรายขอ ซงจะเปนการวเคราะหคาความยากงาย และคาอานาจจาแนก ประเภทท 2 คอการวเคราะหขอสอบทงฉบบซงจะวเคราะหความเทยงตรง และความเชอมนของขอสอบ ในสวนของตาราเลมนจะกลาวถงการวเคราะหขอสอบแบบรายขอเพอใชในงานวจยในการสรางขอสอบอตโนมตซงจะกลาวถงในหวขอในสวนของการเขยนโปรแกรมและสรางขอสอบอตโนมต
ประโยชนของการวเคราะหขอสอบมประโยชนเปนอยางมากเชน ทาใหรคณภาพของขอสอบวาขอสอบขอนนดหรอไม หรอมความยากงายเพยงใด สามารถแยกกลมคนเกงออกจากกลมคนไมเกงไดหรอไม ชวยใหครสรางขอสอบใหมไดดยงขน ชวยใหสามารถปรบปรงคณภาพขอสอบไดถกจดทาใหทราบประสทธภาพของตวเลอก เปนขอมลในการปรบปรงการเรยนการสอนเพราะการวเคราะหขอสอบชวยใหทราบจดบกพรองของการเรยนการสอน เปนจดเรมตนของการสรางขอสอบมาตรฐาน และเปนแนวทางสรางคลงขอสอบทมคณภาพในอนาคต
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
487
13.1.1 ความยากงายของขอสอบ (Difficulty)
ความยากงายของขอสอบคอคาระดบความยากและความงายของขอสอบหรอสดสวนของจานวนผ ทตอบถกตอจานวนผตอบทงหมดเพอดความยากงายของขอสอบ การหาคาความยากงายของขอสอบมกจะหาความยากงายในการวดผลแบบองกลม โดยความยากงายของขอสอบวดผลแบบองกลมหรอการวดผลแบบองกลม ตองการวดตาแหนงความแตกตางทนกเรยนสมฤทธผลการเรยน คะแนนสอบจงควรกระจายกวาง ขอสอบทนกเรยนสวนมากตอบถก ซงถอเปนของายกไมควรใชสอบ และขอสอบทนกเรยนทกคนตอบผดซงเปนขอยาก 100
เปอรเซนต กไมควรใชสอบ ควรใชขอสอบทสามารถแยกความแตกตางของนกเรยนไดมากทสด และมจดประสงคตองการใหตาแหนงของนกเรยนมความเชอมนไดวา ใครเกงกวาใครอยางแทจรง คะแนนทนกเรยนสอบไดควรแตกตางกนมากทสด โดยมคะแนนเฉลยใกลๆ กบคะแนนกงกลางของคะแนนสอบทงหมด และมพสยของคะแนนทงหมด และมพสยของคะแนนจาก “ใกลศนย” ถง “ใกลคะแนนเตม” ตวอยาง คะแนนเตม 100 เราอยากจะใหคะแนนกระจายระหวาง 5 ถง 95 และมคะแนนถวเฉลยประมาณ 50 คะแนน ถวเฉลยสาหรบขอสอบแบบเลอกตอบควรอยกงกลางระหวางคะแนนทมโอกาสจะได (เปอรเซนตทจะตอบไดถก) กบคะแนนทมโอกาสจะไดสงสด (คะแนนเตมทงหมด) ดงนน คะแนนเฉลยอดมคตของขอสอบ 100 ขอ สาหรบขอสอบแบบตางๆ ควรเปนดงน
% ตอบถก คะแนนเฉลยอดมคต
ขอสอบ 2 ตวเลอก (แบบถก-ผด) 50 75
ขอสอบ 3 ตวเลอก 33 67
ขอสอบ 4 ตวเลอก 25 62
ขอสอบ 5 ตวเลอก 20 60
เพอจงใจในการสอบ ขอสอบ 2-3 ขอแรก ควรจะใหงายๆ นกเรยนสวนมากทาถก ในทานองเดยวกน ขอสอบกไมควรยากจนกระทงนกเรยนตอบผดกนหมด เพราะจะทาใหไมสามารถจาแนกไดใครเกงหรอออนกวากน แตขอสอบทสรางขนมาครงแรกเราไมทราบวามความยากงายเทาไร จงจาเปนตองหาความยากงายภายหลงจากทใชสอบนกเรยนแลว ขอสอบทจะหาความยากงายนน เปนขอสอบทใชเฉพาะการวดผลแบบองกลมเทานน การหาความยากงายของขอสอบ เปนการหารอยละของจานวนนกเรยนผตอบขอนนไดถก เชน
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
488
นกเรยน 40 คน ตอบถก ขอท 1 จานวน 18 คน
นกเรยน 100 คน ตอบถก ขอท 1 จานวน 18
10040
= 45 คน
เรยกวา ขอท 1 มความยากงาย 45 %
ตามความหมายของความยากงายของขอสอบ อาจเขยนเปนสตรสาหรบหาความยากงายของขอสอบได (P) ดงสมการท 13.1
N
LHP
(13.1)
ทซง H คอจานวนคนทตอบขอสอบขอนนถกในกลมคนเกง (ตามสตรน คนเกงคอคนทไดคะแนนสงสด 25 % แรกของกลมผสอบทงหมด)
L คอจานวนคนทตอบขอสอบขอนนถกในกลมคนไมเกง (ตามสตรน คนไมเกงคอคนทไดคะแนนตาสด 25% ทายของกลมผสอบทงหมด) N คอจานวนคนทงสองกลมรวมกน
คาของความยากงายแทนดวย P ซงจะมคาอยระหวาง 0 – 1.00 โดยคาทไดจะอานความหมายไดดงน
คา P = 0 - 0.19 หมายความวา เปนขอสอบทยากมาก คา P = 0.20 - 0.39 หมายความวา เปนขอสอบทคอนขางยาก คา P = 0.40 - 0.60 หมายความวา เปนขอสอบทยากงายปานกลาง คา P = 0.61 - 0.80 หมายความวาเปนขอสอบทคอนขางงาย คา P = 0.81 - 1.00 หมายความวาเปนขอสอบทงายมาก
สาหรบความยากงายของตวเลอกอนๆ กสามารถหาได โดยใชสตรนเชนเดยวกนคอ เราหาวานกเรยนทงสองกลมเลอกตอบตวเลอกนนๆ รอยละเทาไร นนเอง ตามอดมคตของการทดสอบวดผลแบบองกลม ตองการใหคะแนนสอบของนกเรยนกระจายเปนลกษณะของโคงปรกต กลาวคอ คะแนนกงกลางของคะแนนเตมจะมคนไดมากทสด และจานวนคนทไดคะแนนถดตอๆ ไปทงสองขางของคะแนนกงกลางนนจะคอยๆ ลดลงเรอยๆ จนถงคะแนนปลายๆ ทงสองขาง มคนไดเพยงคนหรอสองคน แบบทดสอบทใชสอบนกเรยนและทาให
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
489
คะแนนมลกษณะเปนโคงปรกตดงกลาวน จดเปนแบบทดสอบทมความยากงาย ปานกลางหรอพอด แตถาแบบทดสอบใดทมคนไดคะแนนสงๆ เปนสวนมากจดเปนแบบทดสอบทงาย ในทางตรงกนขาม ถาแบบทดสอบใดทไดคะแนนนอยเปนสวนมาก จดเปนขอสอบทยาก ตวอยางการหาคาความยากงาย แสดงดงน (ขอ ข เปนคาตอบทถกตอง)
ตวเลอก จานวนผ เลอกตอบ
ก ข ค ง ว รวมกลมสง 4 12 3 1 0
รวมกลมตา 3 6 7 4 0
รวมตอบทงสองกลมตวเลอก 7 18 10 5 0
ตวเลอก ก ข ค ง
4 + 3
40
12 + 6
40
3 + 7
40
1 + 4
40
= 0.17 = 0.45 = 0.22 = 0.12
ดงนนความยากงายเทากบ 0.45
ความยากงายของตวขอสอบทเปนอดมคตมคา 0.5 ถอวาเปนขอสอบทมความยากงาย ปานกลางพอดๆ หมายถงวา ขอสอบขอนนมนกเรยนตอบถกทงหมด 50% ทาผด 50%
เราถอเอาความยากงาย 0.5 เปนเกณฑของขอสอบทมความยากงายพอด ถาขอสอบขอใดทเขาใกล 1 แสดงวาเปนขอสอบทงาย และถาขอสอบขอใดทเขาใกล 0 แสดงวาเปนขอสอบทยาก ดงนนในการเลอกขอสอบทมคณภาพควรจะเลอกขอสอบทมคาความยากงายประมาณ
0.5
ขอสอบทมความยากงาย 0.5 พอดนนในความเปนจรงจะหาไดยากมากดงนนจงอาจจะมการขยายเกณฑออกไปเพอไดขอสอบทเหมาะสม แบบทดสอบฉบบหนงจานวน 100
ขอ เมอวเคราะหแลวจะมขอทมความยากงาย 0.5 สก 3-5 ขอ ซงกถอวานอยเกนไปทจะนาไปเปนขอสอบใหม ดงนนจงอาจจะมการขยายเกณฑออกไปใหกวางเปนประมาณ 0.3-0.7
เพอทจะม คาถามดมากขอขน
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
490
13.1.2 อานาจจาแนก (Discrimination)
อานาจจาแนกหรอการจาแนกคอคาสถตทใชอธบายคณภาพของขอสอบ ขอสอบทดตองมอานาจจาแนกไดวาเดกคนใดเกง คนใดออนกวากน แมจะเกงหรอออนกวากนเพยงเลกนอย กสามารถจาแนกบอกไดโดยละเอยดและถกตอง ขอสอบทมคาอานาจจาแนกทดจะมคณสมบตสามารถจาแนกเดกเกงหรอเดกออนได เดกเกงจะตอบถก เดกออนจะตอบผด และเดกไมมโอกาสจะเดาคาตอบไดถกเลย การหาคาอานาจจาแนกของขอสอบ (r) สามารถทาไดโดยเอาจานวนผตอบถกกลมตาลบออกจากจานวนผตอบถกในกลมสง แลวหารดวยครงหนงของจานวนนกเรยนทงสองกลม หรอหารดวยจานวนนกเรยนกลมใดกลมหนงนนเอง ดงแสดงในสมการท 13.2
1n
LHr
(13.2)
ทซง H คอจานวนคนทตอบขอสอบขอนนถกในกลมสง (ตามสตรน คนในกลมสงคอคนทไดคะแนนสงสด 25 % แรกของกลมผสอบทงหมด)
L คอจานวนคนทตอบขอสอบขอนนถกในกลมตา (ตามสตรน คนในกลมตาคอคนทไดคะแนนตาสด 25% ทายของกลมผสอบทงหมด) 1n คอจานวนผ เขาสอบกลมสงหรอกลมตา
คาอานาจจาแนกทหาไดจากจานวนผตอบถกทงสองกลมน เปนอานาจจาแนกของขอนนๆ หากจะหาคาอานาจจาแนกของตวเลอกอนๆ กใชสตรเดยวกน ตวอยางการหาคาอานาจจาแนกแสดงตวอยางดงน โดยมจานวนผ เขาสอบกลมกลมละ 20 คน
ตวเลอก จานวนผ เลอกตอบ
ก ข ค ง ว รวมกลมสง 10 12 3 10 0
รวมกลมตา 2 6 7 5 0
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
491
ตวอยางจากขอมล
อานาจจาแนก ขอ 1 (ตวเลอก ข) = = 0.30
ขอ 2 (ตวเลอก ง) = = = .25
ขอ 60 (ตวเลอก ก) = = = .40
พจารณากรณตอไปน ถามผตอบกลมละ 20 คน
สมมต 1. ถาขอใด กลมสงตอบถกหมดทกคน และกลมตาผดหมดทกคน ดงนน
อานาจจาแนก = = 1.00 = 1
2. ถาขอใด ทงกลมสงและกลมตา ตอบถกจานวนเทากน เชนตอบถก กลมละ 7 คนดงนน
อานาจจาแนก = = 0.00
3. ถาขอใด กลมสงตอบถกนอยกวากลมตา คาอานาจจาแนกจะเปนลบเชนกลมสงตอบถก 12 คน ดงนน
คาอานาจจาแนก = = -0.02
หากกรณทขอใดกลมสงตอบถกนอยลง แตกลมตากลบตอบถกมากขน คาอานาจจาแนกจะเปนลบมากขนจนกระทงถากลมสงตอบผดหมดกลมตาตอบถกหมด คาอานาจจาแนกจะเทากบ –1.00
จากทสมมต กรณท 1 อานาจจาแนกเทากบ 1.00 จดเปนขอสอบทมอานาจจาแนกทดทสดโดยสามารถจาแนกได 100 % วาเดกกลมสงเปนเดกเกงจรงและเดกกลมตาเปนเดกเปนเดกออนจรง กรณท 2 อานาจจาแนกเทากบ 0.00 จดเปนขอสอบทไมมอานาจจาแนกเลยเพราะทงสองกลมตอบถกเทากน ไมทราบวากลมใดเกงกวากนแน อาจจะเกงกไดหรอออนกได
12 - 6
20
10 - 5
20
10 - 2
20
20 - 0
20
7 - 7
20
8 - 12
20
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
492
กลมท 3 อานาจจาแนกเปนคาลบ ถอวาไมดเปนอยางมากหรอกรณผดปกตวสยทกลมตาตอบถกมากกวากลมสง ในกรณอาจเกดขนในกรณท ขอสอบกากวม กาหนดคาตอบผด หรอพมพขอสอบผด
คาของอานาจจาแนกจะขนลงระหวาง 1.00 กบ –1.00 ไมมากไมนอยกวานไปอก ขอทมคาเปนบวกเทานนจงจะด กลาววานกวดผลไดตกลงตงเกณฑกนไววา ขอคาถามจะตองมคาอานาจจาแนกตงแต 0.2 ขนไป จงจะนยมยอมรบวาเปนขอด แตถาคาอานาจจาแนกเขาใกลคา1 จะเปนขอสอบทมคณภาพทดมาก แตอยางไรกตามในความเปนจรงจะไมมขอสอบขอไหนทเขาใกล 1 ทงหมด ดงนนนกวดผลจงมกใชขอสอบทมคาจาแนกมากกวา 0.2
13.1.3 ความเปนปรนย (Objectivity)
ความเปนปรนยในทนหมายถง ความชดเจน ความถกตอง และการเขาใจตรง โดยยดหลกความถกตองทางวชาการเปนเกณฑ มความหมายตรงกนขามกบความเปนอตนยซงยดถอความคดเหนความรสกและเหตผลของแตละบคคลเปนสาคญ เหตผลทบคคลหนงเหนวาถกตอง อาจจะไมถกตองในทศนะของอกบคคลหนงซงเหตผลของแตละคนตางกถกตอง แตในแงมมหรอสถานทตางกน ในการวดผลหรอสรางขอสอบเราจาเปนตองมหลกเกณฑทเปนทยอมรบสาหรบทกๆคนในการตดสนพจารณาวาสงใดผดหรอถก ดงนน ความชดเจนและถกตองตามหลกวชาหรอทเรยกวาความเปนปรนยของแบบทดสอบ จงเปนเรองสาคญประการหนง การพจารณาความเปนปรนยของแบบทดสอบมหลายประการ คณสมบตความเปนปรนยของแบบทดสอบทสาคญ ไดแกคณสมบต 3 ประการ ดงน
1. ชดแจงในความหมายของคาถาม ขอสอบทมความเปนปรนย ทกคนทอานขอสอบไมวาจะเปนผสอบหรอผตรวจขอสอบยอมจะเขาใจตรงกน ไมตความไปคนละแงแตกตางกน
2. ตรวจใหคะแนนไดตรงกน ความหมายของการตรวจใหคะแนน ในทนหมายถงการเฉลยขอสอบ ขอสอบทมความเปนปรนย ไมวาจะเปนผออกขอสอบหรอใครกตามสามารถตรวจสอบไดตรงกนหรอเฉลยไดตรงกน ขอสอบทผตรวจเฉลยไมตรงกน แสดงใหเหนถงความไมชดเจนในคาถามหรอคาตอบ
3. แปลความหมายของคะแนนไดตรงกน โดยทวไปขอสอบปรนยนนผตอบถกจะได 1
คะแนน ตอบผดจะได 0 คะแนน จานวนคะแนนทไดจะแทนจานวนขอทถก ทาใหสามารถแปลความหมายไดชดเจนวาใครเกงออนอยางไรตอบถกมากนอยตางกนเพยงไร
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
493
13.1.4 ความมประสทธภาพ (Efficiency)
เครองมอวดผลทมประสทธภาพหมายถงเครองมอททาใหไดขอมลไดถกตอง เชอถอไดโดยลงทนนอยทสดไมวาจะเปนการลงทนในแงเวลา แรงงาน และทนทรพยรวมทงความสะดวกสบายคลองตวในการรวบรวมขอมล ขอสอบทมประสทธภาพสามารถใหคะแนนไดเทยงตรงและเชอถอมากทสดโดยใชเวลา แรงงาน และเงนนอยทสด แตประโยชนทไดจากการสอบคมคา ขอสอบทพมพผดตกหลนมาก จานวนหนาไมครบ รปแบบของขอสอบเรยงไมเปนระเบยบ ทาใหผสอบเกดความสบสน มผลตอคะแนนทไดจากการทาแบบทดสอบทงสน
การจดรปแบบของขอสอบปรนยแบบเลอกตอบเพอใหดงายมความเปนระเบยบเรยบรอย นยมพมพแบงครงหนากระดาษ
13.1.5 ความยตธรรม (Fairness)
ขอสอบทดตองไมเปดโอกาสใหเดกไดเปรยบเสยเปรยบกน เชน ขอสอบบางฉบบครไปเนนเรองใดเรองหนงซงไปตรงกบเรองทนกเรยนคนควาทารายงานในบางกลม ทาใหกลมนนไดเปรยบคนอนๆ ขอสอบบางขอใชคาถามทแนะนาคาตอบใหนกเรยนใชไหวพรบเดาได
13.1.6 ความเทยงตรงของขอสอบ (Validity)
เครองมอทมความเทยงตรงสงมากสามารถทาหนาทรวบรวมขอมลของสงทเราตองการวดไดโดยตรงตามจดมงหมายทตองการวด ความเทยงตรงม 4 ลกษณะ คอ
1. เทยงตรงตามเนอหา (Content Validity) หมายถงสามารถวดเนอหาสาระทตองการวดไดครบถวน ขอสอบทมความเทยงตรงตามเนอหาหมายถงขอสอบทสามารถวดเนอหาไดครบถวนตรงตามทกาหนดไวในหลกสตร หรอวดไดครบตามจดประสงคการเรยนรทกาหนดไว นอกจากวดเนอหาไดครบแลวยงวดไดตรงตามลกษณะธรรมชาตของเนอหาวชานนดวย เชน ไมถามดวยศพทภาษาองกฤษมากเกนไปในวชาสงคมศกษาจนกลายเปนวาผ ทตอบถกคอผ ทเกงภาษาองกฤษเทานน ผ ทตอบผดไมใชเพราะไมมความรในเนอหาวชานนแตเปนเพราะไมรความหมายของภาษาองกฤษในคาถามนนถามอะไร หรอในวชาเกษตรกเชนกนควรระวงไมถามเกยวกบสตรหรอสญลกษณทางเคมอยางละเอยดในคาถามเกยวกบเนอหาเรองป ยจนดเหมอนวาเปนการสอบวชาเคมไป เปนตน
2.เทยงตรงตามโครงสราง (Construct Validity) หมายถงเครองมอนนสามารถวดพฤตกรรม และสมรรถภาพดานตางๆไดตามจดมงหมายทกาหนดไว และเปนไปตามหลกการของทฤษฎนนๆ การสรางแบบทดสอบใหมความเทยงตรงตามโครงสราง ผสรางจะตองศกษา
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
494
จดมงหมายของการเรยนการสอนของวชานนๆจากหลกสตรกอนวามพฤตกรรมใดบางทกาหนดไวในจดมงหมายนนๆแบบทดสอบตองวดจดมงหมายนนๆอยางครบถวน มใชถามแตความจาเปนสวนใหญ การศกษาองคประกอบของลกษณะบคคลดานอารมณ จตใจและทศนะคต เพอนามาเปนแนวทางในการสรางสถานการณ หรอขอคาถามเพอวดลกษณะเหลานนเปนวธการทจะทาใหเครองมอนนมความเทยงตรงตามโครงสราง
3.เทยงตรงตามสภาพ (Concurrent Validity) หมายถงลกษณะของเครองมอทสามารถวดไดโดยตรงตามสภาพความเปนจรงของผ ทถกวดในขณะนน เชนคนทสามารถทาโจทยเลขบวกลบมาตราเงนในหองเรยนไดด จะสามารถคดเงนทอนในการซอขายทตลาดไดเชนกน ความเทยงตรงตามสภาพนเราไมสามารถวดไดจรงโดยใชแบบทดสอบแตเราตองเอาคะแนนของเดกไปเปรยบเทยบสภาพจรงของเดกดวาสอดคลองกนหรอไม การทคนเกงคณตศาสตรในชวตจรงแตทาขอสอบคณตศาสตรไดคะแนนนอย ควรจะถอวาเปนความบกพรองของขอสอบทวดไดไมตรงกบลกษณะจรงของเขา
4.เทยงตรงตามพยากรณ (Predictive Validity) หมายถงเครองมอวดทสามารถใหขอมลไดสอดคลองกบผลการเรยนในภายหนา วธหาความเทยงตรงของแบบทดสอบชนดนทาไดโดยนาคะแนนทสอบไดไปหาความสมพนธกบคะแนนทไดในอนาคตวามความสอดคลองกนตรงกนนาเชอถอไดหรอไมเพยงใด การวดผลโดยใชขอสอบลกษณะความเทยงตรงตามเนอหาและความเทยงตรงตามโครงสรางมความสาคญมาก เพราะทาใหขอสอบนนวดเนอหาไดครบถวน และตรงตามจดมงหมายของการวด การสรางขอสอบใหมความเทยงตรงตามเนอหาและโครงสรางสามารถทาไดโดยสรางคาถามวดเนอหาและพฤตกรรมตามตารางจาแนกเนอหาและพฤตกรรม เราสามารถตรวจสอบความเทยงตรงของขอสอบทงสองประเภทนไดงายๆกอนจะมการสอบ โดยเพยงแตตรวจสอบดวาขอสอบนนถามเนอหาและพฤตกรรมตามทกาหนดไวในตารางจาแนกเนอหาและพฤตกรรม
13.1.7 ความเชอมน (Reliability)
เครองมอทเชอมนไดหมายถงเครองมอนนสามารถใหขอมลทคงทแนนอนไมเปลยนไปมา การวดครงแรกเปนอยางไร เมอวดซากครงกไดผลเหมอนเดมหรอการวดแตละครงจะใหผลสอดคลองตองกนเสมอ แบบทดสอบทเชอมนไดจะสามารถใหคะแนนไดคงทแนนอน
ปกตในการสอบแตละครงคะแนนทไดมกไมคงท แตถาอนดบทของผสอบยงคงทเหมอนเดมกยงถอวาขอสอบนนมความเชอมนสง เนองจากความเชอมนของขอสอบหมายถงความคงทของคะแนนทไดจากการสอบของคนกลมเดมหลายๆครง
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
495
13.2 ขนตอนวธเชงพนธกรรม (Genetic Algorithm)
13.2.1 ขนตอนวธเชงพนธกรรมเบองตน
ขนตอนวธเชงพนธกรรมคอเทคนควธหนงทางปญญาประดษฐเพอใชในการหาผลลพธหรอคาตอบของปญหา ขนตอนวธเชงพนธกรรมเปนอกวธหนงทจาลองรปแบบวธการทางชววทยาในการใหกาเนดประชากรรนใหม หรอขยายเผาพนธในรนลก รนหลานตอไป ซงอาศยพนฐานความคดของววฒนาการทางธรรมชาตถายทอดลกษณะตางๆ ทางพนธกรรม
โดยปฏบตตามกระบวนการทางพนธศาสตร เพอจะใชในการหาคาตอบทดทสดหรอใกลเคยงทสดของปญหา ขนตอนวธเชงพนธกรรมเปนทฤษฎววฒนาการทางธรรมชาตในการกาเนดประชากร สงมชวตในรนๆ ตอไป โดยกระบวนการธรรมชาตทางชววทยาประกอบดวยการคดเลอกทางธรรมชาต คอสงมชวตใดแขงแรงกวายอมมโอกาสอยรอดไดมากกวา นนหมายถงการมโครโมโซมซงประกอบดวยสงทสบตอพนธกรรมหรอยน (Gene) ตางๆ ทมลกษณะทด นนจะมโอกาสอยรอดไดมากกวา โครโมโซมทสามารถอยรอดไดกจะถกถายทอดยนทมลกษณะทดเหลานนไปยงลกหลานไดมากกวาเชนกน โดยในการประยกตใชงานในดานตางๆ จะตองมการปรบปญหาตางๆ ใหอยในรปแบบของขนตอนวธเชงพนธกรรมใหเหมาะสมเพอทจะดาเนนการทางพนธศาสตรเพอหาคาตอบไดอยางมประสทธภาพ ดงแสดงในรปท 13.1
รปท 13.1 ปรบปญหาเขาสขนตอนวธเชงพนธกรรม
จากรปท 13.1 แสดงหลกการเบองตน โดยจะตองมการปรบปรงรปแบบของปญหา ซงเปนการปรบปญหาทจะดาเนนการแกไขใหอยในรปแบบทสามารถดาเนนการขนตอนวธได
ขนตอนวธเชงพนธกรรมเปนวธการคนหาคาตอบโดยอาศยวธการเลยนแบบการคดเลอกทางธรรมชาตและธรรมชาตทางพนธกรรม โดยการรวมกนหรอสลบเปลยนตวแปรตางๆ อนเปน
ปญหา
ปรบรปแบบของปญหา
ขนตอนวธเชงพนธกรรม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
496
องคประกอบโครงสรางของปญหาทใหคาตอบทตองการ โดยอาศยหลกการสม เพอปรบปรงความสามารถในการคนหาคาตอบทดยงขน การคนหาคาตอบจากรนหนงไปรนถดไปตามววฒนาการทางธรรมชาตนน คาตอบในรนใหมทเกดขนจากการสรางความสมพนธของโครงสรางตางๆ ทประกอบดวยคาตวแปรทเหมาะสมดในรนกอนๆ ดงนนจงทาใหได คาตอบทนาจะดขน จะเหนไดวาวธการพนฐานของ ขนตอนวธเชงพนธกรรมเปนแบบการสม แตมหลกการและประสทธภาพจากการคาดเดาคาตอบใหมจากสถตคาตอบเดมทด ขนตอนวธเชงพนธกรรมถอไดวาไดจดใหอยในกลมของการคานวณเชงววฒนาการ (Evolutionary
Computation) ปจจบนไดมการนาไปใชในเกอบทกสาขาวชาเ ชน การสอสารและโทรคมนาคม , ดานการแพทย , ดานการขนสง , ดานการประมวลผลภาพดจทล, ดานวทยาศาสตร และดานการเงนเปนตน ซงในปจจบน ขนตอนวธเชงพนธกรรมมการนาไปประยกตใชอยางตอเนองและวจยพฒนาแนวคดออกมาหลายรปแบบ ตามแนวคดของนกวจยแตละคนเพอพฒนาไปสการหาคาตอบทมประสทธภาพ
13.2.2 ฟงกชนเปาหมายกบฟงกชนความเหมาะสม (Object Function and Fitness
Function)
ฟงกชนเปาหมายและฟงกชนความเหมาะสมเปนสงสาคญเปนอยางยงในการคดเลอกคาตอบทด เปนการประเมนคาตอบของโครโมโซม โดยฟงกชนเปาหมายจะเปนการประเมนคาตอบของโครโมโซมโดยเทยบกบเปาหมายของระบบ หรอเปนคาตอบทใกลเคยงกบคาตอบทตองการหรอไมจากฟงกชนเปาหมาย (Object Function) ในแตละปญหาจะสามารถกาหนดฟงกชนเปาหมายไดตามรปแบบของปญหา สวนฟงกชนความเหมาะสมเปนการประเมนคาตอบในแตละโครโมโซมเพอทาการเปรยบเทยบกนเองในกลมประชากร เปรยบเสมอนคาความสามารถในการอยรอดของแตละโครโมโซมและเปนฟงกชนทกาหนดโอกาส หรอสดสวนทแตละโครโมโซมเหมาะสมจะถกคดเลอกไปใชมากนอยเพยงใด นนคอ ฟงกชนความเหมาะสมจะเปนฟงกชนทแสดงถงคาคาตอบทเกดขนจากชดตวแปรของปญหาในโครโมโซมนนวาดเพยงใด
13.2.3 รปแบบโครโมโซม
รปแบบโครโมโซมคอรปแบบของโครโมโซมในปญหาของคอมพวเตอร โดยจะมการปรบรปแบบของปญหาจรงเขาสรปแบบของโครโมโซมทจะนามาใชในการหาคาตอบทดทสดโดยคอมพวเตอรอยางไร ในการแกปญหาจะมองปญหาเทยบเทากบโครโมโซมชนดหนงซงจะ
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
497
ประกอบดวยสงสบตอพนธกรรมหรอยน ลกษณะตางๆ ซงหมายถงขอมล เมอแปลความหมายแลวจะใหคาของคาตอบคาหนง ในขนตอนวธเชงพนธกรรมยนทอยในโครโมโซมเปนตวแสดงคาคาตอบคาตอบหนงของปญหา ทแปรผนไปตามการประยกตใชงาน ซงโดยทวไปยนหมายถงตวแปร พารามเตอร เงอนไข หรอ ขอกาหนด ตางๆ ทเปนองคประกอบของปญหา การกาหนดรปแบบของแตละโครโมโซมทาไดโดยการแปลงตวแปร พารามเตอร เงอนไข หรอขอกาหนดตางๆ ใหอยในรปลาดบของยนบนโครโมโซม
13.2.4 ขนตอนการทางานของวธเชงพนธกรรมพนฐาน
ขนตอนการทางานของวธเชงพนธกรรมหรอวฏจกรการทางานของขนตอนวธเชงพนธกรรม (Genetic Algorithm Cycle) คอกระบวนการทางานทวไปของขนตอนวธเชงพนธกรรม ซงโดยปกตขนตอนพนฐานจะม 4 ขนตอน คอ
ขนตอนท 1 สรางประชากรโครโมโซมรนเกา ตามรปแบบโครโมโซมทกาหนดไว โดยประชากรตนกาเนด (Initial Population) โดยการสม
ขนตอนท 2 วเคราะหคาความเหมาะสมของแตละโครโมโซม เนองจากระบบไมสามารถเขาใจคาของโครโมโซมในแตละตว ดงนนจงมการถอดรหสกอนเพอทจะนาไปประมวลผลตอไป
ขนตอนท 3 สรางชดโครโมโซมตนแบบหรอชดโครโมโซมพอแม (Mating pool) ทเปนตนแบบ ซงอาศยการจาลองการคดเลอกทางธรรมชาต โดยพจารณาถวงนาหนกจากคาความเหมาะสมของแตละโครโมโซม หากโครโมโซมใดมคาความเหมาะสมสงกจะมโอกาสถกคดเลอกเปนตนแบบสง
ขนตอนท 4 ดาเนนการทางพนธศาสตรโดยจบคโครโมโซมตนแบบเพอสรางประชากรในโครโมโซมรนใหม เปนกรรมวธเปลยนแปลงโครโมโซมดวยวธทางพนธกรรม เปนการสรางลกหลานทเกดจากการรวมของตนกาเนดพนธ หรอจากการแปรผนยนของตนกาเนด
เพอทเกดสายพนธใหม ซงตวดาเนนการทางพนธศาสตรประกอบดวย สลบสายพนธ โดยแลกเปลยนคายนบางสวนของโครโมโซมซงกนและกลายพนธโดยการสมเปลยนคายนบางยนของแตละโครโมโซม เปนตน
การคนหาคาตอบของขนตอนวธเชงพนธกรรม จะประมวลผลซาไปจนกวาจะไดรบคาตอบทพอใจตามเกณฑทตงไว หรอประมวลผลจนมฟงกชนเปาหมายทเหมาะสม หรอในระยะเวลาตามจานวนรนทดาเนนการตามตองการ ขนตอนการทางานของขนตอนวธเชงพนธกรรมพนฐานแสดงดงรปท 13.2
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
498
เรมตน
หยด
Generation = 0
Max = จำนวนสงสดของ Generation
สรางประชากรเรมตน
วเคราะหคาความเหมาะสม(Fitness Function)Generation + 1
ตวเลอกสรางตนแบบ
ปฏบตการทางพนธศาสตร
ประชากรรนใหม
Gen > Max
ใช
ไมใช
รปท 13.2 วฏจกรขนตอนวธเชงพนธกรรมพนฐาน
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
499
เพอใหเขาใจกระบวนการของขนตอนวธเชงพนธกรรมเบองตน จะกาหนดฟงกชนความเหมาะสม คอ F = X
2 โดยมปญหาคอการหาคาสงสดของฟงกชน y = x
2 ท x มคา
ระหวางจานวนเตม I[0,31] ซงคาตอบทดทสดคอคา x ทมคาความเหมาะสมสงสด โดยจะกาหนดรปแบบโครโมโซมเปนแบบทวภาค (Binary) คอ ประกอบดวย บตทมคาเปน 0 หรอ 1
ซงเปนคาในเลขฐานสอง และมความยาว (Chromosome Length: lchrom) ตามแตจะกาหนด ซงแสดงดวยสญลกษณไดดงน
B1 B2 B3 B4 B5
รปท 13.3 รปแบบของโครโมโซม
ตวอยาง: วธการเขารหสแบบทวภาคโดยแปลงคาพารามเตอร x ใหอยในรปทวภาค 5
บต (lchrom = 5 ) ดงนนโครโมโซมของปญหาจะมคาอยในชวง 00000 ถง 11111 ซงเมอถอดรหสเสรจสนจะทาให x มคาอยในชวง 0 ถง 31 ตามทตองการ
การสรางประชากรเรมตน (Initial Population)
การสรางประชากรเรมตน จากตวอยางทกาหนดคอการสมตวเลขจานวน 5 บต
จานวนเทากบจานวนโครโมโซมทตองการ โดยประชากรเรมตนจะเรมทรนท 0 (Generation 0)
เชนตองการสรางประชากรเรมตนจานวน 4 โครโมโซม ดงเชน
คอในสวนของรายละเอยดขนตอนการทางานของขนตอนวธเชงพนธกรรมแบบงายจะเปนขนตอนพนฐานเบองตนแบบงายประกอบดวย
ตวอยาง: ลาดบ โครโมโซม
1 0 1 1 1 0
2 1 1 0 0 1
3 0 1 0 0 0
4 1 0 0 1 1
ชดโครโมโซมรนนเปนชดโครโมโซมรนเรมตนทกาหนดโดยการสม ซงประกอบดวยจานวนโครโมโซมจานวน 4 โครโมโซม โดยแตละโครโมโซมประกอบดวย คาทวภาค
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
500
การวเคราะหคาความเหมาะสม (Fitness Function)
การวเคราะหคาความเหมาะสม คอขนตอนการถอดรหสจากรปแบบโครโมโซมทกาหนดไว เพอคานวณคาความเหมาะสมตามฟงกชนความเหมาะสมของปญหา ในทน ฟงกชนความเหมาะสมคอ F = x
2 ดงนนการวเคราะหคาความเหมาะสมจงเปนการถอดรหส
เลขฐานสองของแตละโครโมโซมเปนคาตวแปร x และคานวณคาความเหมาะสมคอ คา x2 ซง
สามารถวเคราะหคาความเหมาะสมไดดงน
ตวอยาง : ลาดบ โครโมโซม x คาความเหมาะสม
1 0 1 1 1 0 14 196
2 1 1 0 0 1 25 625
3 0 1 0 0 0 8 64
4 1 0 0 1 1 19 361
ตวเลอกสรางตนแบบหรอการคดเลอก (Selection)
การคดเลอกคอการคดเลอกโครโมโซมพอแมเพอดาเนนการทางพนธศาสตร โดยจะพจารณาจากคาความเหมาะสม ถาโครโมโซมใดมคาความเหมาะสมมากกมโอกาสอยรอดสงตามไปดวย การคดเลอกเปนขนตอนทจาลองการคดเลอกทางธรรมชาตโดยคดเลอกชดโครโมโซมรนเกาใหเปนโครโมโซมตนแบบ เพอใชสรางโครโมโซมรนถดไป การคดเลอกของขนตอนวธเชงพนธกรรมแบบงาย จะใชคาความเหมาะสมเปนตวตดสนวาโครโมโซมใดจะมโอกาสถกเลอกเปนโครโมโซมสาหรบดาเนนการ โครโมโซมทมคาความเหมาะสมทดจะถกกาหนดนาหนกคาความนาจะเปนทจะถกเลอกแตละครงสง โดยจะนาคาความเหมาะสมของโครโมโซมแตละตวมาแทนสาหรบการคดเลอก ซงการคดเลอกกมอยหลายวธเชน วธวงลอเสยงทาย (Roulette Wheel Selection) การคดเลอกแบบสมอยางทวถง (Stochastic
Universal Sampling) การคดเลอกแบบแขงขน(Tournament Selection) การคดเลอกแบบแบงเปนสดสวน (Proportionate Selection) และการคดเลอกแบบจดอนดบ (Ranking
Selection) เปนตน ในเนอหาบทนจะกลาวถงการคดเลอกโดยใชวงลอเสยงทายเนองจากเปนวธทนยมใชกนอยางแพรหลาย โดยการสมในวงลอเสยงทาย (Roulette Wheel Selection) จะหมนสมเลอกไปจนกวาจะไดโครโมโซมพอแมตามจานวนทตองการ จากตวอยางนจะมการสมเลอกโครโมโซมพอแมจานวน 4 ครง
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
501
ตารางท 13.1 ตวอยางของการหาคาของสมการ ลาดบโครโมโซม
โครโมโซม X คาความ
เหมาะสม
(F)
คาความเหมาะสมแบบสดสวนเพอใชในวงลอเสยง
ทาย
1
2
3
4
0 1 1 1 0
1 1 0 0 1
0 1 0 0 0
1 0 0 1 1
14
25
8
19
196
625
64
361
(196/1246)x100 = 15.73)
(625/1246)x100 = 50.16)
(64/1246)x100 = 5.13)
(361/1246)x100 = 28.97)
รวม 1246 1.000
ตวอยางของฟงกชนความเหมาะสมของแตละโครโมโซมของประชากรชดนแสดงใหเหนวาโครโมโซมท 2 มสดสวนในวงลอเสยงทายสงทสด และโครโมโซมตวท 3 มสดสวนในวงลอเสยงทายตาทสด ซงจะเหนวาโอกาสในการเลอกไดโครโมโซมท 2 มโอกาสเปนไปไดมากทสด เปรยบเสมอนโครโมโซมทแขงแรงโอกาสทจะอยรอดกจะสงตามไปดวย แตอยางไรกไมทงโครโมโซมทออนแอ เพราะในบางครงโครโมโซมทออนแอเมอดาเนนการทางพนธศาสตรไปแลวกอาจจะเปนโครโมโซมทแขงแรงได ตวอยางของวงลอเสยงทายดงแสดงในรปท 13.4
รปท 13.4 ตวอยางวงลอเสยงทาย
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
502
ปฏบตการทางพนธศาสตร (Genetic Operation)
การดาเนนการทางพนธศาสตร เปนขนตอนทจาลองแบบธรรมชาตทางพนธกรรม ซงตวดาเนนการทางพนธศาสตรของขนตอนวธเชงพนธกรรมคอการสลบสายพนธและการกลายพนธหรอการกลายพนธซงมรายละเอยดดงน
สลบสายพนธ (Crossover)
เปนตวดาเนนการในการแลกเปลยนสวนของโครโมโซมพอ-แม ตามการกาหนดอตราความนาจะเปนของการสลบสายพนธ (Probability of Crossover: Pc) การกาหนดอตราความนาจะเปนของการสลบสายพนธ มหลากหลายวธเพอใหไดประสทธภาพสงสดดงเชนการกาหนดอตราความนาจะเปนของการสลบสายพนธขนมาเองซงโดยทวไปอตราความนาจะเปนของการสลบสายพนธจะอยในชวง 0.7-1 และเมอกาหนดอตราการสลบสายพนธแลวกจะใชการคานวณอยางงายเชนถาจานวนประชากรแตละรน (Population Size) คอ 30 และกาหนดให Pc = 0.6 แลวจานวนการสลบสายพนธเทากบ Pcx (Population Size / 2) = 0.6 x
(30 / 2) = 9 ครง ในการสรางชดโครโมโซมรนใหม จะทาการสลบสายพนธกนโดยการแลกเปลยนยน ซงการสลบสายพนธ กมหลายแบบ เชน การสลบสายพนธแบบจดเดยว (Single-Point Crossover) และการสลบสายพนธแบบหลายจด (Multiple-point Crossover)
เปนตน
คโครโมโซมพอ-แม
d1 d2 d3 dpos dpos + 1 dlchrom
m1 m2 m3 mpos mpos + 1 mlchrom
โครโมโซมลก d1 d2 d3 dpos mpos + 1 mlchrom
m1 m2 m3 mpos dpos + 1 dlchrom
( pos คอตาแหนงทสมได)
รปท 13.5 สลบสายพนธแบบ 1 จด
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
503
คโครโมโซมพอ-แม
d1 d2 d3 dpos dpos + 1 dlchrom
m1 m2 m3 mpos mpos + 1 mlchrom
โครโมโซมลก d1 d2 d3 dpos mpos + 1 dlchrom
m1 m2 m3 mpos dpos + 1 mlchrom
( pos และ pos+1 คอตาแหนงทสมได)
รปท 13.6 สลบสายพนธแบบ 2 จด
กลายพนธ (Mutation)
เปนตวดาเนนการผาเหลาหรอกลายพนธตวหนงทอาจชวยใหโครโมโซมอาจจะมคาความเหมาะสมดขนหลงจากการสลบสายพนธ โดยกลบคาบตเปนคาใหมในตาแหนงบตทสมได ตามอตราความนาจะเปนของการกลายพนธในแตละบต (Probability of Mutation: Pm) ทกาหนด โดยทวไปกาหนดใหอยระหวาง 0.02 – 0.18 เชนถาจานวนประชากรแตละรนเทากบ
30 และแตละโครโมโซมประกอบดวย 5 บต โดยกาหนดให Pm = 0.02 แลวจานวนการกลายพนธในแตละรนเทากบ Pm x Population Size x lchrom = 0.02 x 30 x 5 = 3 บต จดประสงคของการกลายพนธเพอใหสามารถหลดพนออกจากคาตอบทเหมาะสมทสดในวงแคบ ตวอยางการกลายพนธของขนตอนวธเชงพนธกรรมแบบงายนนเปนการกลายพนธแบบทวภาค (Binary
Mutation) โดยกลบคาบต เชนจาก ‘0’ เปน ‘1’ หรอจาก ‘1’ เปน ‘0’ แสดงดงรปท 13.7
กอนกลายพนธ c1 c2 c3 cpos clchrom
หลงกลายพนธ c1 c2 c3 c’pos clchrom
(pos คอตาแหนงทสมได)
รปท 13.7 กลายพนธแบบทวภาค
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
504
ประชากรรนใหม (New Population)
ประชากร รนใหม คอประชากรกลมใหม โดยอาจจะไ ดมากจากการแทนท
(Replacement) ซงการแทนทเปนขนตอนหลงจากทไดโครโมโซมททาการสลบสายพนธและกลายพนธ เรยกวาเปนโครโมโซมลกหลาน นาไปแทนทโครโมโซมในประชากรรนเกา เพอใหไดเปนโครโมโซมทดกวา ซงมหลายวธเชน
1. แทนทประชากรทงรน (Generation) เปนการนาโครโมโซมทไดใหมจากกระบวนการทางพนธศาสตรไปแทนโครโมโซมเดมทงหมดซงเปนวธทงาย แตขอเสยคอทาใหโครโมโซมทดในรนเดมถกแทนทไปดวย ซงอาจจะทาใหฟงกชนวตถประสงคมคาทอาจจะดหรอไมดสลบกนไปมาได เพราะรนใหมทงรนอาจจะไดคาทไมดกได แตการแทนทประชากรทงรนสามารถแกปญหาอยางงายโดยคดเลอกโครโมโซมทดทสดในรนเดม 2-3 ตว ออกมากอนทจะทาการแทนท เรยกวากลยทธคดเลอกหวกระท (Elitist Strategy) แตประชากรทเหลออาจถกหวกระทครอบงา คอโครโมโซมทดทสดในรนกอนจะถกเกบไวตลอดไป และไมทาใหเกดการเปลยนแปลงใดๆขน ทาใหระบบไมสามารถสรางววฒนาการ โครโมโซมใหมๆขนมาได ถงแมจะมผลกระทบทเกดขนดงกลาว แตโดยรวมแลวจะทาใหระบบดขนไปเรอย
2. แทนทประชากรบางสวน (Partial) เปนการนาโครโมโซมลกหลานไปแทนทเพยงบางสวน ดงนนจงมการคดเลอกโครโมโซมทจะถกแทนท ซงโดยปกตกจะพจารณาจากคาความเหมาะสมซงจะถกแทนทดวยโครโมโซมจานวน 1 หรอ 2 ตว โดยการแทนทอาจจะแทนทโครโมโซมทออนแอทสด หรอใชวธการสมเลอก เปนตน
13.3 การเขยนโปรแกรมการวเคราะหขอสอบ และการสรางขอสอบอตโนมตโดยขนตอนวธเชงพนธกรรม (Programming Language for Item
Analysis and Automatic Examinations by Genetic Algorithm)
13.3.1 การเขยนโปรแกรมในการวเคราะหขอสอบ
ในหวขอนจะเปนตวอยางของการเขยนโปรแกรมเพอทาการวเคราะหขอสอบ โดยจะทาการเขยนโปรแกรมในการวเคราะหขอสอบรายขอ ซงจะประกอบไปดวยการวเคราะหคาความยากงาย (P) และคาอานาจจาแนก (r)
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
505
การหาคาความยากงาย (P) สามารถคานวณไดจาก
N
LHP
การหาคาอานาจจาแนก (r) สามารถคานวณไดจาก
1n
LHr
ทซง H คอจานวนคนทตอบขอสอบขอนนถกในกลมคนเกง (ตามสตรน คนเกงคอคนทไดคะแนนสงสด 25 % แรกของกลมผสอบทงหมด)
L คอจานวนคนทตอบขอสอบขอนนถกในกลมคนไมเกง (ตามสตรน คนไมเกงคอคนทไดคะแนนตาสด 25% ทายของกลมผสอบทงหมด) N คอจานวนคนทงสองกลมรวมกน
1n คอจานวนผ เขาสอบกลมสงหรอกลมตา
ตวอยางท 13.1 โปรแกรมคานวณหาคาอานาจจาแนกและคาความยากงาย โดยใหปอนคาจานวนขอสอบไดตามตองการ โดยสมมตรปแบบในการปอนคามรปแบบดงน
ขอท จานวนผตอบถก (กลมสง)
จานวนผตอบถก (กลมตา)
1 9 2
2 8 3
3 7 4
4 6 5
5 7 4
6 6 5
7 7 4
. . .
10 8 4
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
506
1 #include <stdio.h> 2 #include <conio.h> 3 #include <math.h>
4 void main(void) 5 { 6 int n,i,b; 7 float x[50],y[50]; 8 float p[50],r[50]; 9 printf("Difficalty and Discrimenation \n"); 10 printf("------------------------------------\n"); 11 printf("Number of students = "); scanf("%d",&n); 12 printf("Number of Item = "); scanf("%d",&b); 13 printf("------------------------------------\n"); 14 printf("Hight Score Group \n"); 15 input(x,b); 16 printf("------------------------------------\n"); 17 printf("Low Score Group \n"); 18 input(y,b); 19 printf("------------------------------------\n"); 20 for(i=1;i<=b;i++) 21 { 22 p[i] = (x[i]+y[i])/n; 23 r[i] = (x[i]-y[i])/(n/2); 24 printf("Item[%d] Difficalty = %.2f
Discrimenation = %.2f\n",i,p[i],r[i]); 25 } 26 printf("------------------------------------\n"); 27 } 28 void input(float *a,int b) 29 { 30 int i; 31 printf("------------------------------------\n"); 32 for(i=1;i<=b;i++) 33 { 34 printf("Input Data[%d] = ",i);scanf("%f",&a[i]); 35 }
36 }
ผลลพธของโปรแกรม Difficalty and Discrimenation ------------------------------------ Number of students = 30 Number of Item = 8 ------------------------------------ Hight Score Group ------------------------------------ Input Data[1] = 9 Input Data[2] = 8 Input Data[3] = 7 Input Data[4] = 6 Input Data[5] = 7 Input Data[6] = 8 Input Data[7] = 9 Input Data[8] = 8
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
507
------------------------------------ Low Score Group ------------------------------------ Input Data[1] = 1 Input Data[2] = 2 Input Data[3] = 3 Input Data[4] = 4 Input Data[5] = 5 Input Data[6] = 6 Input Data[7] = 7 Input Data[8] = 8 ------------------------------------ Item[1] Difficalty = 0.33 Discrimenation = 0.53 Item[2] Difficalty = 0.33 Discrimenation = 0.40 Item[3] Difficalty = 0.33 Discrimenation = 0.27 Item[4] Difficalty = 0.33 Discrimenation = 0.13 Item[5] Difficalty = 0.40 Discrimenation = 0.13 Item[6] Difficalty = 0.47 Discrimenation = 0.13 Item[7] Difficalty = 0.53 Discrimenation = 0.13 Item[8] Difficalty = 0.53 Discrimenation = 0.00 ------------------------------------
อธบายโปรแกรม
บรรทดท 6-8 กาหนดตวแปร n, i และ b เปนตวแปรแบบเลขจานวนเตม โดยตวแปร n สาหรบเกบคาจานวนของนกศกษา ตวแปร i สาหรบการทาซา ตวแปร b สาหรบเกบคาจานวนของขอสอบททาการวเคราะห
กาหนดตวแปร x, y, p, r โดยตวแปร x สาหรบเกบคาผตอบถกกลมสง ตวแปร y สาหรบเกบคาผตอบถกกลมตา ตวแปร p สาหรบเกบคาผลลพธของคาความยากงาย และตวแปร r สาหรบเกบคาผลลพธของคาอานาจจาแนก
บรรทดท 9-13 เปนการแสดงผลขอความและรบคาจานวนของนกศกษาพรอมทงจานวนของขอสอบทจะทาการวเคราะห
บรรทดท 14-19 เปนการแสดงผลขอความและใหสงคาไปยงฟงกชน input โดยการเรยกฟงกชนครงแรกจะสงจานวนผตอบถกในกลมสงและจานวนของขอสอบ ในครงทสองจะสงจานวนผตอบถกในกลมตาและจานวนของขอสอบ ซงจะเปนการรบคาเขามาเกบไวยงตวแปรแถวลาดบ x
และตวแปรแถวลาดบ y
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
508
บรรทดท 20-25 คานวณหาคาความยากงายและคาอานาจจาแนกโดยจะเกบคาผลลพธไวทตวแปรแถวลาดบ p และตวแปรแถวลาดบ r และใหแสดงผลลพธของคาความยากงายและคาอานาจจาแนก
บรรทดท 28-36 ฟงกชนในการรบคาผ ทตอบถก หรอตอบผดในแตละขอ เพอนามาใชในการวเคราะหขอสอบ
13.3.2 การเขยนโปรแกรมในการสรางขอสอบอตโนมตโดยขนตอนวธเชงพนธกรรม
ในหวขอนจะเปนตวอยางของการเขยนโปรแกรมเพอทาการสรางขอสอบอตโนมตโดยขนตอนวธเชงพนธกรรมพนฐาน ซงอาจจะมการเปลยนแปลงกระบวนขนตอนบางอยางเพอใหมความเหมาะสมในการสรางขอสอบโดยอตโนมต โดยในการเขยนโปรแกรมจะทาเปนลาดบขนตอนดงน
ขนตอน 1 ทาการปรบปญหาใหอยในรปแบบของโครโมโซม
ทาการปรบปญหาใหอยในรปแบบของโครโมโซมในการตดสนใจคดเลอกขอสอบเพอสรางแบบทดสอบทมคณภาพใหเขากบขนตอนวธเชงพนธกรรม จากขอมลของขอสอบทงหมดจดใหอยรปแบบของโครโมโซม โดยแตละโครโมโซมจะประกอบดวยขอสอบจานวนหลายขอ (จานวนขอสอบทเราตองการ) ซงความยาวของโครโมโซมนนจะเทากบจานวนบททเราใชในวชาททดสอบ จะเกบไวในตวแปรแถวลาดบ 2 มต ชอ node_string[ ][ ] โดยจะมลกษณะในการกาหนดรปแบบของโครโมโซมทใชแทนปญหา ดงตวอยางการแทนรปแบบของปญหาแสดงในรปท 13.8
รปท 13.8 ปรบรปแบบของปญหาใหเขาสในรปแบบทเหมาะสม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
509
ในแตละโครโมโซมจะประกอบไปดวยสถานเชอมตอ (Node) จานวนหลายสถานเชอมตอเรยงกนเปนโครโมโซม โดยในแตละสถานเชอมตอประกอบไปดวย ตาแหนงของขอสอบ (ขอท), บททของขอสอบ คาความยากงาย, คาอานาจจาแนก และเครองหมาย ดงรปท 13.9
ตาแหนง (number)
บทท
(chapter)
คาความยากงาย (fitness1)
คาอานาจจาแนก (fitness2)
เครองหมาย (mark)
รปท 13.9 ขอมลแตละสถานเชอมตอ
โดยจะมการประกาศตวแปรเปนชนดขอมลแบบโครงสราง (Structure Data Type) ซงนนกคอการรวมกลมของตวแปรตางๆ จานวนหลายตวแปรเขาไวดวยกนภายใตชอเพยงชอเดยว ซงจะทาใหเราสามารถจดกลมของขอมลและการนาไปประยกตสามารถกระทาไดสะดวกยงขน
1 struct node 2 { 3 int number; 4 int chapter; 5 double fitness1; 6 double fitness2; 7 int mark; 8 }
อธบายโปรแกรม
บรรทดท 1 ประกาศชนดขอมลแบบโครงสรางโดยมกลมของขอมลของตวแปรทแสดงดงในรปท 13.9 เพอใชเปนแตละยนของโครโมโซมทจะนามาใชกบขนตอนวธเชงพนธกรรม
บรรทดท 3-7 เปนกลมของขอมลในแตละยนของโครโมโซม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
510
ขนตอนท 2 กาหนดฟงกชนเปาหมาย (Fitness Function)
กาหนดฟงกชนเปาหมายของขอสอบในแตละชดหรอในแตละโครโมโซม ซงเปรยบเสมอนคาความสามารถในการอยรอดของแตละโครโมโซม ฟงกชนเปาหมายจะหาจากคาความยากงายและคาอานาจจาแนก คาความยากงายทดทสดจะอยในชวง 0.5 และคาอานาจจาแนกทดทสดอยในชวง 1 ดงนนสมการจะมการปรบใหอยในรปแบบทเหมาะสม ซงจะถกปรบใหอยในชวง 0-1 โดย ถาเขาใกล 0 แสดงวาเปนขอสอบทไมด และถาเขาใกล 1
แสดงวาเปนขอสอบทดทสด โดยฟงกชนความเหมาะสมสามารถหาไดจากดงสมการดงน
แสดงถงการหาคาฟงกชนความเหมาะสมในแตละสถานเชอมตอ (Node)
5.02
2
1
5.0
1
5.02
2
1
5.0
)(
P
DP
P
DP
inodeFitness (13.3)
แสดงถงการหาคาฟงกชนความเหมาะสมในแตละชดขอสอบหรอแตละโครโมโซม
n
inodeFitness
ChromosomeFitness
n
i
0
)(
(13.4)
P คอ คาความยากงาย D คอ คาอานาจจาแนก n คอ จานวนสถานเชอตอ (Node) ในโครโมโซม
ขนตอนท 3 สรางโปรแกรมคอมพวเตอรตามขนตอนวธเชงพนธกรรม ดาเนนการเขยนโปรแกรมในการตดสนใจคดเลอกขอสอบทมคณภาพโดยขนตอน
วธเชงพนธกรรม ซงในทนจะดาเนนการเขยนโปรแกรมตามกระบวนการดงผงงานในรปท
13.10
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
511
รปท 13.10 ผงงานหลกในการเขยนโปรแกรมโดยขนตอนวธเชงพนธกรรมพนฐาน
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
512
ขนตอนท 3.1 สรางประชากรตนแบบจากฟงกชน select_chromosome()
สรางประชากรตนแบบโดยการสมจากแถวลาดบ 2 มต node_string[ ][ ] โดยจะสามารถเลอกจานวนขอไดตามตองการ ในการสรางประชากรตนแบบจะใชฟงกชน
select_chormosome() ในการสรางประชากรตนแบบ ซงผลลพธทไดจากประชากรตนแบบจะถกเกบไวในตวแปร chromosome[ ] [ ] โดยจะถกเกบไวจานวน 10 โครโมโซม (Population
Size = 10) ในทนจานวนขอสอบทเราตองการคอความยาวของโคโมโซม เชนเราตองการขอสอบ 10 ขอ จะทาการสมเปนลาดบบททคอ 1,2,3,4,5,1,2,3,4,5 ซงจะได 1 โครโมโซมทมจานวน 10 ขอ ในการเขยนโปรแกรมนเรากาหนดประชากรเรมตนคอ 10 ดงนนจะทาการสมขอสอบหรอโครโมโซมจานวน 10 ขอ โดยในแตละโครโมโซมจะประกอบดวยจานวนโครโมโซมละ 2 บท แสดงตวอยางดงรปท 13.11
รปท 13.11 แสดงรปตวอยางของการสรางประชากรตนแบบโดยการสม
1 void select_chromosome(int lp) 2 { 3 int last_position = lp; 4 int i = 0; 5 int check_last_position = 0; 6 int result,result_s; 7 int aa = 0; 8 int kk = 0; 9 for(i=0;i<popsize;i++) 10 { 11 while(check_last_position < last_position) 12 { 13 result = aa % max_chapter; 14 result_s= random_int(position_chapter_number[result]-1); 15 while(node_string[result][result_s].mark!=0) 16 { 17 result = aa % max_chapter; 18 result_s=random_int(position_chapter_number[result]-1); 19 } 20 chromosome[i][kk].index_class = result; 21 chromosome[i][kk].index_depth = result_s; 22 node_string[result][result_s].mark = 1; 23 check_last_position++;
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
513
24 kk++; 25 aa++; 26 } 27 aa=0; 28 kk=0; 29 check_last_position = 0; 30 } 31 }
อธบายโปรแกรม
บรรทดท 1 ประกาศฟงกชน select_chromosome(int lp) ในการคดเลอกเพอนามาสรางเปนโครโมโซมตามจานวนขอสอบทตองการจะสราง โดยจะเปนฟงกชน ท รบคา จานวนของขอสอบเขามาเ พอทาการประมวลผลในฟงกชนเพอคดเลอกขอสอบตามจานวนขอสอบทรบเขามา โดยผลลพธจะเกบไวทตวแปรแถวลาดบ 2 มต
chromosome[ ] [ ] โดยจะทาการสมเลอกจนกวาจะไดจานวนประชากรตนแบบทกาหนดคอจานวน 10 โครโมโซม
บรรทดท 3-8 เปนการประกาศตวแปรเพอใชในการประมวลผลในฟงกชน ตวแปร last_position เกบคาจานวนขอสอบทตองการจากผ ใช ตวแปร i, check_last_position, result, result_s, aa และ kk เปนตวแปรสาหรบการทาซ าและเกบตาแหนง ทใ ชในตวแปรแถวลาดบ
chromosome
บรรทดท 11-30 เปนการทาซาเพอคดเลอกประชากรตนแบบทจะนามาดาเนนการทางพนธศาสตร โดยจะทาการสมการคดเลอกในแตละโครโมโซมตามจานวนขอสอบทตองการ และเมอไดในแตละโครโมโซมกจะกระทาซาไปจนกวาจะไดชดขอสอบหรอประชากรตนแบบทตองการคอ 10 โครโมโซม ในการสมจะมการตรวจสอบตาแหนง (Mark) ของขอสอบดวยเนองจากหากมขอสอบขอไหนถกเลอกไปแลวจะไมนามาเลอกซา ถาสมซาจะตองมการสมใหมจนกวาจะไดขอสอบทไมซากนในประชากรรนน สดทายผลลพธจะเกบไวทตวแปรแถวลาดบ
2 มต chromosome[ ][ ] โดยตวแปรแถวลาดบนจะประกอบดวยสมาชก 2 ตวคอ int index_class; และ int index_depth; ซงจะเกบตาแหนงแถวและตาแหนงหลกเพอทจะนาไปใชในการประมวลผลในโปรแกรม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
514
ขนตอนท 3.2 คานวณหาคาความเหมาะสมจากฟงกชน evaluate()
ในการคานวณคาฟงกชนความเหมาะสมจะใชฟงกชน evaluate() เปนฟงกชนทคานวณคาความเหมาะสมของชดขอสอบ โดยผลลพธจะเกบผลลพธของฟงกชนความเหมาะสมในแตละตวทตวแปร fitness[ ] ดงแสดงในฟงกชน evaluate()
1 void evaluate(int lp) 2 { 3 int last_position = lp; 4 int i,j; 5 int aa,bb; 6 double sum=0; 7 double total_sum = 0; 8 double p,d; 9 for(i=0;i<popsize;i++) 10 { 11 for(j=0;j < last_position;j++) 12 { 13 aa = chromosome[i][j].index_class; 14 bb = chromosome[i][j].index_depth; 15 p = node_string[aa][bb].fitness1; 16 d = node_string[aa][bb].fitness2; 17 if( p <= 0.5 ) 18 { 19 sum = ((p/0.5)+((d+1)/2))/2; 20 } 21 if( p > 0.5) 22 { 23 sum = (((1-p)/0.5)+((d+1)/2))/2; 24 } 25 total_sum = total_sum + sum; 26 } 27 fitness[i] = total_sum/(last_position); 28 total_sum = 0; 29 } 30 }
อธบายโปรแกรม
บรรทดท 1 ประกาศฟงกชน evaluate(int lp) ในการคานวณคาฟงกชนความเหมาะสม (Fitness Function) โดยจะเปนฟงกชนทรบคาจานวนของขอสอบเขามาเพอทาการประมวลผลในฟงกชนเพอหาคาฟงกชนความเหมาะสม ซงจะเกบคาผลลพธคาความเหมาะสมของแตละโครโมโซมทตวแปร fitness[ ]
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
515
บรรทดท 3-8 เปนการประกาศตวแปรเพอใชในการประมวลผลในฟงกชน ตวแปร last_position เกบคาจานวนขอสอบทตองการจากผ ใช ตวแปร i,j,aa,bb เปนตวแปรสาหรบการทาซาและเกบตาแหนงทใชในตวแปรแถวลาดบ node_string ตวแปร sum และ total_sum เปนตวแปรสาหรบเกบคาผลรวมทคานวณได และสดทายตวแปร p และ d
คอตวแปรทใชเกบคาความยากงายและคาอานาจจาแนก บรรทดท 9-29 เปนการทาซาเพอคานวณหาคาฟงกชนความเหมาะสมของในแตละ
สถานเชอมตอหรอยน และในแตละชดขอสอบหรอโครโมโซมดงสมการในการหาคาความเหมาะสม โดยผลลพธของฟงกชนความเหมาะสมในแตละโครโมโซมจะถกเกบไวในตวแปร fitness[ ]
ขนตอนท 3.3 เกบคาโครโมโซมทดจากฟงกชน keep_best_chromosome()
ขนตอนการเกบคาโครโมโซมทดเปนการเกบคาโครโมโซมทดไวเพอใชแทนทโครโมโซมทแยทสดในรนถดไป ซงจะเปนการรกษาโครโมโซมทดไว เนองจากขนตอนวธเชงพนธกรรมหากไมมการเกบคาทดไวในบางครงอาจจะทาใหผลลพธในแตละรนกจะดบางและไมดบาง อาจจะไดผลลพธทดมาเรอยๆ แตพอมาถงจดหนงผลลพธอาจจะไดไมด แตถาหากมการเกบคาโครโมโซมทดไวจะเปนการการนตวาในแตละรนจะตองไดคาตอบทดขนเรอยๆ ซงเปนเทคนคหนงทชวยเพมประสทธภาพของขนตอนวธเชงพนธกรรมใหดยงขน ดงฟงกชน
keep_best_chromosome()
1 void keep_best_chromosome(int lp) 2 { 3 int last_position = lp; 4 int iii,jjj,aa,bb; 5 double max[keep_chromosome]; 6 double max_temp = 0; 7 double check_fitness[popsize]; 8 9 for(iii=0;iii<popsize;iii++) 10 { 11 check_fitness[iii] = fitness[iii]; 12 } 13 for(iii=0;iii<keep_chromosome;iii++) 14 { 15 max[iii] = 0; 16 } 17 for(iii=0;iii<keep_chromosome;iii++) 18 { 19 for(jjj=0;jjj<popsize;jjj++)
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
516
20 { 21 max[iii] = check_fitness[jjj]; 22 if(max[iii] > max_temp) 23 { 24 max_temp = max[iii]; 25 position_max[iii] = jjj; 26 } 27 } 28 check_fitness[position_max[iii]] = 0; 29 max[iii] = 0; 30 max_temp = 0; 31 } 32 33 for(iii=0;iii<keep_chromosome;iii++) 34 { 35 for(jjj=0;jjj < last_position;jjj++) 36 { 37 aa = chromosome[position_max[iii]][jjj].index_class; 38 bb = chromosome[position_max[iii]][jjj].index_depth; 39 best_old_chromosome[iii][jjj].index_class = aa; 40 best_old_chromosome[iii][jjj].index_depth = bb; 41 } 42 aa=0; 43 bb=0; 44 } 45 46 47 for(iii=0;iii<keep_chromosome;iii++) 48 { 49 fitness_best_chromosome[iii]=fitness[position_max[iii]]; 50 } 51 }
อธบายโปรแกรม
บรรทดท 1 ประกาศฟงกชน keep_best_chromosome(int lp) ในการเกบโครโมโซมทดทสดตามจานวนทตองการ เชนอาจจะเกบ 1 ตว หรอ 2
ตว ซงขนอยกบการกาหนดคาของผ ใช ซงในโปรแกรมจะกาหนดใหเกบโครโมโซมทดทสดในแตละรนจานวน 1 ตว ซงจะเกบคาผลลพธของตาแหนง ท เ ปนโครโมโซมท ด ทสดในแตละ รนในตวแปร fitness_best_chromosome[ ] และเกบคาทดทสดในแตละรนไวทตวแปร best_old_chromosome[ ][ ]
บรรทดท 3-7 เปนการประกาศตวแปรเพอใชในการประมวลผลในฟงกชน ตวแปร last_position เกบคาจานวนขอสอบทตองการจากผ ใช ตวแปร iii,jjj,aa,bb เปนตวแปรสาหรบการทาซาและเกบตาแหนงทใชในตว
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
517
แปรแถวลาดบ ตวแปร max[ ] และ max_temp เปนตวแปรสาหรบหาคาสงสด ตวแปร check_fitness[ ] เปนตวแปรทใชตรวจคาฟ ง ก ช น ค ว า ม เ ห ม า ะ ส ม ข อ ง แ ต ล ะ โ ค ร โ ม โ ซ ม ต ว แ ป ร keep_chromosome คอจานวนของโครโมโซมทตองการจดเกบซงจะประกาศเปนตวแปรแบบโกลบอลหรอครอบคลม ซงจะประกาศนอกฟงกชนน
บรรทดท 9-50 เปนการทาซาเพอคานวณหาคาทดทสดของโครโมโซมในแตละรนตามจานวนทตองการเกบคาทดทสด ซงในโปรแกรมจะกาหนดใหเกบ 1 โครโมโซมในแตละรนทดทสด เรมตนจะทาการหาตาแหนงของโครโมโซมทดทสดจากตวแปร fitness[ ] เพอใหทราบถงตาแหนงท ต อ ง ก า ร จ า ก น น ท า ก า ร เ ก บ ค า ท ด ท ส ด ไ ว ท ต ว แ ป ร fitness_best_chromosome[ ] และเกบโครโมโซมทดทสดไวทตวแปร best_old_chromosome[ ][ ]
ขนตอนท 3.4 ดาเนนการสลบสายพนธจากฟงกชน crossover()
ในขนตอนนจะทาการจะเปนการดาเนนในการแลกเปลยนบางสวนของโครโมโซมพอ-แม ตามการกาหนดอตราความนาจะเปนของการสลบสายพนธ (Probability of Crossover:
Pc) เพอสรางชดโครโมโซมรนใหมหรอโครโมโซมลก ในสวนของฟงกชนจะเปนสลบสายพนธแบบ 1 จด ดงแสดงในตวอยางในรปท 13.12
กอนการสลบสายพนธ
หลงการสลบสายพนธ
รปท 13.12 ตวอยางของการสลบสายพนธแบบ 1 จด
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
518
ในการสลบสายพนธ จะเรมจากการสมโครโมโซมพอ-แมจากประชากรเรมตน
(chromosome[ ][ ]) ทมอยจานวน 10 โครโมโซม โดยจะทาการทาซาของการสมในโปรแกรมนจะดาเนนการสลบสายพนธจานวน 4 ครง จากนนกจะดาเนนการสมในแตละยน วาจะดาเนนการสลบสายพนธ ท ตาแหนงใด และเมอไดตาแหนงทตองการทงหมดแลวกจะดาเนนการสลบสายพนธดงฟงกชน crossover()
1 void crossover(int lp) 2 { 3 int last_position = lp; 4 int parent1,parent2; 5 int position_crossover; 6 int x,y,xx,yy; 7 int i =0; 8 int loop; 9 loop = m_population; 10 11 while(i <loop) 12 { 13 parent1 = random_int(m_population-1); 14 parent2 = random_int(m_population-1); 15 while(parent1==parent2) 16 { 17 parent1 = random_int(m_population-1); 18 parent2 = random_int(m_population-1); 19 } 20 21 position_crossover = random_int(last_position-1); 22 while(position_crossover == 0) 23 { 24 position_crossover = random_int(last_position-1); 25 } 26 27 while(position_crossover <= last_position) 28 { 29 x=chromosome[parent1][position_crossover].index_class; 30 y=chromosome[parent1][position_crossover].index_depth; 31 xx=chromosome[parent2][position_crossover].index_class; 32 yy=chromosome[parent2][position_crossover].index_depth; 33 if(position_crossover <= last_position) 34 { 35 chromosome[parent1][position_crossover].index_class=xx; 36 chromosome[parent1][position_crossover].index_depth=yy; 37 chromosome[parent2][position_crossover].index_class=x; 38 chromosome[parent2][position_crossover].index_depth=y; 39 position_crossover++; 40 } 41 } 42 i++; 43 } 44 }
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
519
อธบายโปรแกรม
บรรทดท 1 ประกาศฟงกชน crossover(int lp) ในการสลบตาแหนงบางสวนของยนหรอขอสอบตามจานวนครงทกาหนดซงในโปรแกรมจะกาหนดจานวน 4 ครง โดยผลลพธทไดจะถกเกบไวทตวแปรแถวลาดบ 2 มต
chromosome[ ][ ]
บรรทดท 3-8 เปนการประกาศตวแปรเพอใชในการประมวลผลในฟงกชน ตวแปร last_position เกบคาจานวนขอสอบทตองการจากผ ใช ตวแปร parent1, parent2 และ position_crossover เกบตาแหนงโครโมโซมและเกบตาแหนงทจะทาการสลบสายพนธ ตวแปร x, y, xx และ yy
เปนตวแปรสาหรบการทาซาและเกบตาแหนงทใชในตวแปรแถวลาดบ ตวแปร loop คอตวแปรทเกบจานวนครงของการทาสลบสายพนธ ซงในโปรแกรมกาหนดไวเทากบ 4
บรรทดท 10-25 เปนการทาซาเพอหาตาแหนงของโครโมโซมพอ-แม และตาแหนงทจะดาเนนการสลบสายพนธ ตามจานวนทกาหนดไว
บรรทดท 26-43 เปนการทาซาเพอการดาเนนการทางพนธศาสตรในการสลบสายพนธ โดยจะเกบคาผลลพธไวทตวแปรแถวลาดบ 2 มต
chromosome[ ][ ]
ขนตอนท 3.5 ดาเนนการกลายพนธจากฟงกชน mutation()
ในขนตอนนจะทาการจะเปนการดาเนนในการกลายพนธ ห รอในทน คอการเปลยนแปลงขอสอบจากประชากรตนแบบโดยจะกลายพนธ นาขอสอบในสวนอนเขามาสประชากรตนแบบ ตามการกาหนดอตราความนาจะเปนของการกลายพนธ (Probability of
Mutation: Pm) โดยในโปรแกรมนในการกลายพนธนนตวทจะมาแทนจะตองอยในตาแหนงของบทเดยวกนจงจะสามารถทาการกลายพนธได ดงแสดงในตวอยางในรปท 13.13 ซงสมมตวาไดตาแหนงท 3 ทจะทาการกลายพนธ ซงตาแหนงท 3 ในทนคอบทท 3 ดงนนตาแหนงขอสอบทจะมาแทนจะตองอยในบทท 3 เทานน
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
520
กอนการกลายพนธ
หลงการกลายพนธ
รปท 13.13 ตวอยางของการกลายพนธ
ในการกลายพนธจะเรมจากการสมโครโมโซมจากประชากรเรมตนทถกเกบขอมลทแถวลาดบ 2 มต (chromosome[ ][ ]) ทมอยจานวน 10 โครโมโซม โดยจะทาการทาซาของการสมในโปรแกรมนจะดาเนนการกลายพนธ จานวน 4 ครง จากนนกจะดาเนนการสมในแตละยน วาจะดาเนนการสลบสายพนธทตาแหนงใด และเมอไดตาแหนงทตองการทงหมดแลวกจะดาเนนการกลายพนธดงฟงกชน mutation()
1 void mutation(int lp) 2 { 3 int last_position = lp; 4 int x,y; int new_mutation; 5 int i = 0; 6 int chap; 7 int check_loop_exit = 0; 8 int number_mutation = m_population; 9 int position_mutation = 0; 10 int position_class_mutation = 0; 11 int position_depth_mutation = 0; 12 while(i<number_mutation) 13 { 14 position_class_mutation = random_int(m_population-1); 15 position_depth_mutation = random_int(last_position-1); 16 x = chromosome[position_class_mutation]
[position_depth_mutation].index_class; 17 y = chromosome[position_class_mutation]
[position_depth_mutation].index_depth; 18 chap = node_string[x][y].chapter; 19 if(chap>0) 20 { 21 new_mutation = random_int(position_chapter_number[chap-1]-
1); 22 while((node_string[chap-1]
[new_mutation].mark!=0)&&(check_loop_exit < 20)) 23 { 24 new_mutation = random_int(position_chapter_number[chap-1]-
1); 25 check_loop_exit++; 26 }
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
521
27 if(node_string[chap-1][new_mutation].mark == 0) 28 { 29 node_string[x][y].mark = 0; 30 chromosome[position_class_mutation]
[position_depth_mutation].index_class = chap - 1; 31 chromosome[position_class_mutation]
[position_depth_mutation].index_depth = new_mutation; 32 i++; 33 node_string[chap-1][new_mutation].mark = 1; 34 } 35 } 36 }
อธบายโปรแกรม
บรรทดท 1 ประกาศฟงกชน mutation(int lp) เพอใชในการกลายพนธซงในทน คอการเปลยนบางสวนของโครโมโซมตามจานวนครงทกาหนด ซงในโปรแกรมจะกาหนดจานวน 4 ครง โดยผลลพธทไดจะถกเกบไวทตวแปรแถวลาดบ 2 มต chromosome[ ][ ]
บรรทดท 3-11 เปนการประกาศตวแปรเพอใชในการประมวลผลในฟงกชน ตวแปร last_position เกบคาจานวนขอสอบทตองการจากผใช ตวแปร i, x
และ y เปนตวแปรสาหรบการทาซาและเกบตาแหนงทใชในตวแปรแถวลาดบ ตวแปร chap เปนตวแปรสาหรบการเกบคาบทของขอสอบ ตวแปร new_mutation เปนตวแปรสาหรบการเกบคาตวทกลายพนธตวใหม ตวแปร check_loop_exit เปนตวแปรสาหรบการตรวจสอบการทาซา ตวแปร number_mutation เปนตวแปรทกาหนดจานวนครงของการกลายพนธซงในโปรแกรมจะกาหนดเทากบ 4 ตวแปร position_mutation, position_class_mutation,
และ position_depth_mutation เปนตวแปรสาหรบเกบตาแหนงของการกลายพนธเพอใชในการระบตาแหนงเพอทจะเปลยนแปลง
บรรทดท 12-35 เปนการทาซาเพอการดาเนนการทางพนธศาสตรในการกลายพนธ โดยจะเกบคาผลลพธไวทตวแปรแถวลาดบ 2 มต chromosome[ ][ ]
โดยในการกลายพนธจากโปรแกรมจะมการตรวจสอบตาแหนงของบททจะทาการกลายพนธเพอใหไดตาแหนงทถกตอง บรรทดท 14-17
เปนการสมตาแหนงทจะดาเนนการกลายพนธ บรรทดท 19-35 เปนการตรวจสอบเงอนไขของการกลายพนธและทาการกลายพนธเพอใหไดโครโมโซมทดขน
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
522
ขนตอนท 3.6 คานวณหาคาความเหมาะสมจากฟงกชน evaluate()
ในการคานวณคาฟงกชนความเหมาะสมจะใชฟงกชน evaluate() เชนเดยวกนกบขนตอนท 3.2 เพอคานวณคาความเหมาะสมของชดขอสอบ โดยการคานวณในสวนนจะเปนการคานวณคาความเหมาะสมของประชากรทไดผานการดาเนนการทางพนธศาสตรเพอใหไดประชากรรนใหมหรอประชากรรนถดไป
ขนตอนท 3.7 ดาเนนการเกบแทนทโครโมโซมทแยทสด จากฟงกชน survive()
เปนกระบวนการในการตดสนใจคดเลอกโครโมโซมทดไว เนองจากในบางครงการคนหาคาตอบของขนตอนวธเชงพนธกรรมนนมโอกาสทจะสญเสยโครโมโซมในรนเกาทมคาความเหมาะสมทดไปได ซงจะทาใหไดคาตอบในรนถดไปนนดมากหรอนอยลง ดงนนจงมการปรบปรงใหควบคมการคนหาคาตอบ โดยรกษาโครโมโซมทดไวแลวจะชวยใหววฒนาการคาตอบในรนถดไปดขนเรอยๆ ดงนนในขนตอนนจะดาเนนการคดเลอกโครโมโซมในรนใหมหลงจากท มการดาเ นนทางพนธศาสตร โดยจะนาโครโมโซมท ด ทสดจากฟงกชน
keep_best_chromosome() มาแทนทโครโมโซมรนใหมทแยทสดในรนถดไปตามจานวนทตองการ ซงในโปรแกรมไดกาหนดไวท 1 ตว แสดงวาจะนาโครโมโซมตวเกาจากประชากรรนเกามาแทนทตวทแยทสดในประชากรรนใหม ซงจะเปนเทคนคทชวยเพมประสทธภาพในการหาคาตอบใหดยงขน
1 void survive(int lp) 2 { 3 int last_position = lp; 4 int i,j,ii; 5 int same_chromosome = 0; 6 double low[keep_chromosome]; 7 double low_temp = 1; 8 double check_fitness[popsize]; 9 int check_keep_chromosome = keep_chromosome; 10 int aaa,bbb; 11 for(i=0;i<m_population;i++) 12 { 13 check_fitness[i] = fitness[i]; 14 } 15 for(i=0;i<check_keep_chromosome;i++) 16 { 17 low[i] = 1; 18 } 19 for(i=0;i<check_keep_chromosome;i++) 20 { 21 for(j=0;j<m_population;j++) 22 { 23 low[i] = check_fitness[j];
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
523
24 if(low[i] < low_temp) 25 { 26 low_temp = low[i]; 27 position_low[i] = j; 28 } 29 } 30 check_fitness[position_low[i]] = 1; 31 low[i] = 1; 32 low_temp = 1; 33 } 34 for(ii=0;ii<check_keep_chromosome;ii++) 35 { 36 for(j=0;j<m_population;j++) 37 { 38 if(fitness_best_chromosome[ii] == fitness[j]) 39 { 40 same_chromosome++; 41 } 42 } 43 if((same_chromosome == 0)&&(fitness_best_chromosome[ii]
> fitness[position_low[ii]])) 44 { 45 for(j=0;j<last_position;j++) 46 { 47 aaa = chromosome[position_low[ii]][j].index_class; 48 bbb = chromosome[position_low[ii]][j].index_depth; 49 node_string[aaa][bbb].mark = 0; 50 chromosome[position_low[ii]][j].index_class =
best_old_chromosome[ii][j].index_class; 51 chromosome[position_low[ii]][j].index_depth =
best_old_chromosome[ii][j].index_depth; 52 node_string[chromosome[position_low[ii]][j].index_class]
[chromosome[position_low[ii]][j].index_depth].mark = 1; 53 } 54 fitness[position_low[ii]] = fitness_best_chromosome[ii]; 55 } 56 same_chromosome = 0; 57 } 58 }
อธบายโปรแกรม
บรรทดท 1 ประกาศฟงกชน survive(int lp) ในการแทนทโครโมโซมรนใหมทแยทสดโดยโครโมโซมรนเกาทดทสดเพอรกษาโครโมโซมทดไวมใหสญหาย ทาใหไดคาตอบทดขนเรอยๆ ในแตละรน ซงในฟงกชนนจะกาหนดใหแทนทเพยง 1 ตว โดยโครโมโซมตวทดทสดของรนเกา 1
ตว จะแทนทโครโมโซมตวทแยทสดในรนใหม 1 ตว จากนนผลลพธจะถกเกบไวทตวแปรแถวลาดบ 2 มต chromosome[ ][ ] เชนเดม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
524
บรรทดท 3-10 เปนการประกาศตวแปรเพอใชในการประมวลผลในฟงกชน ตวแปร last_position เกบคาจานวนขอสอบทตองการจากผใช ตวแปร i, j, ii, aaa, และ bbb เปนตวแปรสาหรบการทาซาและเกบตาแหนงทใชในต ว แ ป ร แ ถ ว ล า ด บ ใ น ก า ร แ ท น ท โ ค ร โ ม โ ซ ม ต ว แ ป ร same_chromosome เปนตวแปรทใชตรวจสอบการซากนของโครโมโซม ตวแปร low และ low_temp เปนตวแปรทถกใชเกบคาตาแหนงของโครโมโซมทแยทสด ตวแปร check_fitness[ ] เปนตวแปรแถวลาดบ 1 มต ทใชตรวจสอบฟงกชนความเหมาะสม ตวแปร check_keep_chromosome เปนตวแปรทเกบคาจานวนครงของการแทนทเพอตรวจสอบดวาตองการแทนทกครง
บรรทดท 11-33 เปนการทาซาเพอหาตาแหนงของโครโมโซมทแยทสดของประชากรรนใหมตามจานวนทตองการแทนท ซงในโปรแกรมกาหนดใหการแทนทโครโมโซมจานวน 1 โครโมโซม ซงผลลพธจะถกเกบไวทตวแปรแถวลาดบ 1 มต position_low[ ] โดยจะเกบตาแหนงของโครโมโซมทแยทสด
บรรทดท 34-57 เปนการทาซาเพอการดาเนนการแทนทโครโมโซมตวทแยทสดในรนใหมโดยตวทดทสดในรนเกา ซงจะมการเปรยบเทยบการซากนของโครโมโซมเพอใหมความถกตองยงขน โดยผลลพธของโครโมโซมในประชากรรนใหมจะเกบคาผลลพธไวทตวแปรแถวลาดบ 2 มต
chromosome[ ][ ]
ขนตอนท 3.7 ตรวจสอบเงอนไขของการสรางประชากรรนใหม
คอขนตอนตรวจสอบการหยดการทาซาของขนตอนวธเชงพนธกรรม ซงอาจจะหยดจากการทไดคาตอบทดทสดแลว หรออาจจะหยดจากไดคาทเหมาะสมแลว หรออาจจะหยดจากการกาหนดจานวนการสรางประชากรรนใหม ซงในโปรแกรมนจะเปนการหยดจากการกาหนดจานวนการสรางประชากรนใหมจากผ ใช โดยสามารถกาหนดไดเทาไหรกไดเชน
กาหนด 1 ครง 100 ครง และ 1000 ครง เปนตน ในการตรวจสอบถายงไมหยดการสรางประชากรรนใหมกจะดาเนนการทาซาไปยงขนตอนท 3.3 จนกวาเงอนไขทไดจะไดตามทตองการ
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
525
ขนตอนท 3.8 เลอกโครโมโซมทดทสดเปนคาตอบของปญหา ขนตอนนจะเปนการเลอกโครโมโซมทดทสดซงในทนคอชดขอสอบทดทสดจากประชากรรนสดทายจากแถวลาดบ chromosome[ ][ ] ทเกบตาแหนงของขอสอบ และ fitness[ ] ทเกบคาฟงกชนความเหมาะสมของขอสอบ โดยจะเรมจากการหาโครโมโซมหรอชดขอสอบทดทสดจากประชากรรนสดทาย จากนนจะทาการเกบคาชดขอสอบทดไวทตวแปรแถวลาดบ exam_best[ ], chapter_exam[ ], fitnessP[ ] และ fitnessR[ ] ซงเปนตวแปรสาหรบเกบคาทกอยางทงขอท บทท คาความยากงาย และคาอานาจจาแนก เพอนาไปใชงานตอไป
ดงแสดงในโปรแกรมดงน
1 void best_exam(int lp) 2 { 3 int last_position = lp; 4 int iii,jjj,aa,bb,j; 5 double max[keep_chromosome]; 6 double max_temp = 0; 7 double check_fitness[popsize]; 8 for(iii=0;iii<m_population;iii++) 9 { 10 check_fitness[iii] = fitness[iii]; 11 } 12 iii = 0; 13 max[iii] = 0; 14 for(jjj=0;jjj<m_population;jjj++) 15 { 16 max[iii] = check_fitness[jjj]; 17 if(max[iii] > max_temp) 18 { 19 max_temp = max[iii]; 20 position_max[iii] = jjj; 21 } 22 } 23 check_fitness[position_max[iii]] = 0; 24 max[iii] = 0; 25 max_temp = 0; 26 the_best_exam = position_max[0]; 27 iii = the_best_exam; 28 for(j=0;j < last_position;j++) 29 { 30 aa = chromosome[iii][j].index_class; 31 bb = chromosome[iii][j].index_depth; 32 exam_best[j] = node_string[aa][bb].number; 33 chapter_exam[j] = node_string[aa][bb].chapter; 34 fitnessP[j] = node_string[aa][bb].fitness1; 35 fitnessR[j] = node_string[aa][bb].fitness2; 36 } 37 }
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
526
อธบายโปรแกรม
บรรทดท 1 ประกาศฟงกชน best_exam(int lp) ในการเลอกและจดเกบคาโครโมโซมทดทสดในประชากรรนสดทายเพอทจะนาไปเปนคาตอบในการสรางขอสอบอตโนมตโดยเทคโนโลยทางปญญาประดษฐทดทสด ผลลพธจะถกเกบไวทตวแปรแถวลาดบ 1 มต exam_best[ ],
chapter_exam[ ], fitnessP[ ] และ fitnessR[ ]
บรรทดท 3-7 เปนการประกาศตวแปรเพอใชในการประมวลผลในฟงกชน ตวแปร last_position เกบคาจานวนขอสอบทตองการจากผใช ตวแปร iii, jjj, aa, bb และ j เปนตวแปรสาหรบการทาซาและเกบตาแหนงทใชในตวแปรแถวลาดบในการแทนทโครโมโซม ตวแปร max และ max_temp เปนตวแปรทถกใชเกบคาตาแหนงของโครโมโซมทดทสด
ตวแปร check_fitness[ ] เปนตวแปรแถวลาดบ 1 มต ทใชตรวจสอบฟงกชนความเหมาะสม
บรรทดท 8-25 เปนการทาซาเพอหาตาแหนงของโครโมโซมทดทสดของประชากรรนสดทาย ซงผลลพธจะถกเกบไวทตวแปรแถวลาดบ 1 มต
position_max[ ] โดยจะเกบตาแหนงของโครโมโซมทดทสด
บรรทดท 26-36 เปนการทาซาเพอการดาเนนการเกบคาโครโมโซมหรอขอสอบทดทสด ซงจะเกบคาผลลพธไวทตวแปรแถวลาดบ exam_best[ ],
chapter_exam[ ], fitnessP[ ] และ fitnessR[ ] เพอใชเปนคาตอบของการคดเลอกขอสอบทดทสดโดยขนตอนวธเชงพนธกรรม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
527
ตวอยางท 13.2 โปรแกรมสรางขอสอบอตโนมตโดยขนตอนวธเชงพนธกรรม โดยสมมตมขอมลของขอสอบทจะดาเนนการสรางขอสอบคอ ขอท (ตาแหนง) บทท คาความยากงาย และคาอานาจจาแนก จานวน 200 ขอสอบ ทมการบอกคาความยากงายและคาอานาจจาแนก โดยใหทาการคดเลอกชดขอสอบทดทสดตามจานวนทตองการและแสดงผลของขอมลของแตละขอเพอแสดงใหเหนถงประสทธภาพในการสรางขอสอบ
ขอท บทท คาความยากงาย คาอานาจจาแนก 1
2
3
.
.
200
ตวอยางแฟมขอมล (File) text.txt ซงจะประกอบไปดวยขอสอบจานวน 200 ขอ เพอนามาใชทดสอบโปรแกรมทสรางจากขนตอนวธเชงพนธกรรม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
528
1 #include <string.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <time.h> 5 #include <math.h> 6 #define popsize 10 7 #define Maxline 100 8 #define keep_chromosome 1 9 int position_max[keep_chromosome]; 10 int position_low[keep_chromosome]; 11 double fitness_best_chromosome[keep_chromosome]; 12 int max_chapter = 5; 13 int position_chapter_number[50]; 14 int m_population = 4; 15 double fitness[popsize]; 16 int exam_best[100]; 17 int chapter_exam[100]; 18 double fitnessP[300]; 19 double fitnessR[300]; 20 int the_best_exam; 21 22 struct node 23 { 24 int number; 25 int chapter; 26 double fitness1; 27 double fitness2; 28 int mark; 29 }; 30 node node_string[5][100]; 31 32 struct population 33 { 34 int index_class; 35 int index_depth; 36 }; 37 38 population chromosome[popsize][100]; 39 population best_old_chromosome[keep_chromosome][100]; 40 41 int random_int(int max); 42 float random_real(); 43 void show_result(int lp); 44 void read_file(); 45 void select_chromosome(int lp); 46 void evaluate(int lp); 47 void keep_best_chromosome(int lp); 48 void crossover(int lp); 49 void mutation(int lp); 50 void survive(int lp); 51 void best_exam(int lp); 52 53 int random_int(int max) // random int from 0 - max 54 {
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
529
55 int result; 56 randomize(); 57 result = random(max+1); 58 return result; 59 } 60 61 float random_real() 62 { 63 float result; 64 randomize(); 65 result = float (rand()%100)/100; 66 return result; 67 } 68 69 void show_result(int lp) 70 { 71 int last_position = lp; 72 int ii; 73 printf("\n-------------------------The Best Item
----------------------------------\n"); 74 printf(" Item Chapter\tDifficulty
Discrimination\n"); 75 for(ii=0;ii<last_position;ii++) 76 { 77 printf("[%i] %i \t %i \t %.2f \t %.2f
\t\n",ii+1,exam_best[ii],chapter_exam[ii], fitnessP[ii],fitnessR[ii]);
78 } 79 printf("-----------------------------------
--------------------------------------\n"); 80 81 } 82 83 void read_file() 84 { 85 int result_position; 86 int ii; 87 FILE *Ptr; 88 int number,chapter; 89 float fitness1,fitness2; 90 max_chapter = 5; 91 Ptr = fopen("text.txt","r"); 92 if(Ptr==NULL){ 93 printf("Cannot open file\n"); 94 exit(0); 95 } 96 else{ 97 while(fscanf(Ptr,"%d %d %f
%f",&number,&chapter,&fitness1,&fitness2)!= EOF) 98 { 99 printf("%d \t%d \t%.2f\t%.2f\n",
number,chapter,fitness1,fitness2); 100 result_position = position_chapter_number[chapter-1]; 101 node_string[chapter-1][result_position].number = number; 102 node_string[chapter-1][result_position].chapter = chapter;
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
530
103 node_string[chapter-1][result_position].fitness1 = fitness1; 104 node_string[chapter-1][result_position].fitness2 = fitness2; 105 node_string[chapter-1][result_position].mark = 0; 106 result_position++; 107 position_chapter_number[chapter - 1] = result_position; 108 } 109 fclose(Ptr); 110 } 111 } 112 113 void main(void) 114 { 115 int last_position; 116 int gen = 1; 117 int generation; 118 read_file(); 119 printf("\nNumber of Items = "); 120 scanf("%i",&last_position); 121 select_chromosome(last_position); 122 evaluate(last_position); 123 printf("Number of Generation = "); 124 scanf("%i",&generation); 125 do{ 126 keep_best_chromosome(last_position); 127 crossover(last_position); 128 mutation(last_position); 129 evaluate(last_position); 130 survive(last_position); 131 gen++; 132 }while(gen < generation); 133 best_exam(last_position); 134 show_result(last_position); 135 }
ผลลพธของโปรแกรม
(รนครงท 1)
1 1 0.30 -0.70 2 2 0.20 -0.80 3 3 0.30 -0.60 . . . . . . 198 3 0.80 0.80 199 4 0.90 1.00 200 5 1.00 0.50 Number of Items = 10 Number of Generation = 1 -------------------------The Best Item--------------------- Item Chapter Difficulty Discrimination [1] 121 1 0.10 0.80 [2] 107 2 0.70 0.20 [3] 158 3 0.80 -0.60
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
531
[4] 144 4 0.40 1.00 [5] 140 5 1.00 0.20 [6] 186 1 0.60 0.60 [7] 187 2 0.70 0.80 [8] 98 3 0.80 0.80 [9] 19 4 0.90 0.40 [10] 95 5 0.50 0.20 -----------------------------------------------------------
(รนครงท 2) ในสวนนไมไดแสดงผลในสวนของขอมลเขา ซงจะเปนขอมลเดมเชนเดยวกนกบขอมลครงแรก Number of Items = 10 Number of Generation = 30 -------------------------The Best Item--------------------- Item Chapter Difficulty Discrimination [1] 111 1 0.10 1.00 [2] 42 2 0.20 0.60 [3] 198 3 0.80 0.80 [4] 144 4 0.40 1.00 [5] 75 5 0.50 0.60 [6] 156 1 0.60 -1.00 [7] 187 2 0.70 0.80 [8] 53 3 0.30 0.60 [9] 54 4 0.40 0.80 [10] 10 5 0.50 1.00 -----------------------------------------------------------
(รนครงท 3) ในสวนนไมไดแสดงผลในสวนของขอมลเขา ซงจะเปนขอมลเดมเชนเดยวกนกบขอมลครงแรก Number of Items = 10 Number of Generation = 100 -------------------------The Best Item--------------------- Item Chapter Difficulty Discrimination [1] 76 1 0.60 0.80 [2] 177 2 0.70 1.00 [3] 133 3 0.30 1.00 [4] 144 4 0.40 1.00 [5] 75 5 0.50 0.60 [6] 86 1 0.60 0.60 [7] 187 2 0.70 0.80 [8] 53 3 0.30 0.60 [9] 54 4 0.40 0.80 [10] 10 5 0.50 1.00 -----------------------------------------------------------
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
532
(รนครงท 4) ในสวนนไมไดแสดงผลในสวนของขอมลเขา ซงจะเปนขอมลเดมเชนเดยวกนกบขอมลครงแรก Number of Items = 15 Number of Generation = 30 -------------------------The Best Item--------------------- Item Chapter Difficulty Discrimination [1] 186 1 0.60 0.60 [2] 77 2 0.70 1.00 [3] 28 3 0.80 0.00 [4] 54 4 0.40 0.80 [5] 10 5 0.50 1.00 [6] 176 1 0.60 0.80 [7] 147 2 0.70 -0.60 [8] 183 3 0.30 0.00 [9] 44 4 0.40 1.00 [10] 95 5 0.50 0.20 [11] 126 1 0.60 -0.40 [12] 32 2 0.20 0.80 [13] 8 3 0.80 0.40 [14] 64 4 0.40 0.60 [15] 55 5 0.50 1.00 -----------------------------------------------------------
หมายเหต ในสวนของฟงกชนทไมไดปรากฏในสวนนคอในสวนของฟงกชนในการดาเนนการทางพนธศาสตรของขนตอนวธเชงพนธกรรม ดงนนจะตองนาฟงกชนในหวขอกอนหนานมาใชในโปรแกรม จงจะทาใหโปรแกรมสมบรณ
อธบายโปรแกรม
บรรทดท 1-5 ประกาศไฟลสวนหว (Head File) ทใชในโปรแกรม
บรรทดท 6-8 กาหนดคาคงทใหกบโปรแกรม ตวแปร popsize คอตวแปรทกาหนดจานวนประชากรของขนตอนวธ ซงในทนกาหนดเทากบ 10 แสดงวาจะมจานวนประชากรในแตละรนเทากบ 10 โครโมโซม ตวแปร Maxline คอตวแปรเ กบความยาวสงสด ตวแปร keep_chromosome เปนตวแปรทกาหนดจานวนการเกบโครโมโซมทดทสดในแตละรนซงในทนกาหนดเทากบ 1 แสดงวามการกาหนดจานวนโครโมโซมทดทสดในแตละรนเทากบ 1 ซงในการเขยนโปรแกรมสามารถเปลยนแปลงไดตามความเหมาะสม หรอสามารถเปลยนแปลงเพอทดสอบประสทธภาพตางๆ ของโปรแกรม
บรรทดท 9-20 ประกาศตวแปรสวนกลาง (Global Variable) ทใชในทกฟงกชนของโปรแกรม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
533
บรรทดท 22-30 สรางตวแปร node เปนชนดขอมลแบบโครงสราง (Structure Data
Type) และประกาศตวแปร node_string[ ][ ] เปนตวแปรแถวลาดบ
2 มต ทเปนชนดขอมลแบบโครงสราง ซงประกอบไปดวย ตาแหนงของขอสอบ (ขอท), บททของขอสอบ คาความยากงาย, คาอานาจจาแนก และตาแหนงทใชในการเปรยบเทยบขอมลทนาไปใชและยงไมไดนาไปใช
บรรทดท 32-39 สรางตวแปร population เปนชนดขอมลแบบโครงสราง (Structure
Data Type) และประกาศตวแปร chromosome[ ][ ] และ best_old_chromosome[ ][ ] เปนตวแปรแถวลาดบ 2 มต ทเปนชนดขอมลแบบโครงสราง เพอใชเกบประชากรทใชในขนตอนวธเชงพนธกรรม
บรรทดท 41-51 เปนการประกาศตนแบบของฟงกชน (Function Prototype) ไวทสวนหวของโปรแกรม
บรรทดท 53-67 เปนฟงกชนในการสมตวเลขทงตวเลขจานวนเตมและจานวนเลขทศนยมเพอใชในขนตอนวธเชงพนธกรรม
บรรทดท 69-81 เปนฟงกชนในการแสดงผลลพธของโปรแกรมโดยจะแสดงโครโมโซมทดทสดหรอในทนคอขอสอบทดทสดตามจานวนขอสอบทเราตองการสราง โดยจะแสดงตาแหนงของขอสอบ (ขอท), บททของขอสอบ คาความยากงาย และคาอานาจจาแนก
บรรทดท 83-111เปนฟงกชนอานไฟล text.txt ทประกอบดวยตาแหนงของขอสอบ
(ขอท), บททของขอสอบ คาความยากงาย และคาอานาจจาแนก โดยจะเกบไวทตวแปรแถวลาดบ 2 มต node_string[ ][ ] เพอนาไปใชในขนตอนวธเชงพนธกรรมตอไป
บรรทดท 113-115 เปนฟงกชนหลกของโปรแกรม โดยในฟงกชนหลกจะดาเนนการเปนลาดบดงขนตอนวธเชงพนธกรรมทมการปรบปรงใหเหมาะสมในการคดเลอกขอสอบทมคณภาพโดยอตโนมต โดยจะทาซาหรอสรางประชากรรนใหมไปจนถงจานวนรอบทเรากาหนด ถาเกนจานวนรอบทกาหนดกจะแสดงผลลพธของคาตอบทดทสด ดงแสดงในผลลพธของโปรแกรม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
534
บทสรป
ในบทนไดกลาวถงทฤษฎการวเคราะหขอสอบ ทฤษฎขนตอนวธเชงพนธกรรม และการเขยนโปรแกรมในการสรางขอสอบอตโนมตโดยขนตอนวธเชงพนธกรรม ซงเปนบทประยกตการเขยนโปรแกรมภาษาซในงานวจยทางดานปญญาประดษฐ โดยประยกตเขากบงานทางดานการศกษาเพอพฒนาระบบการศกษาใหมประสทธภาพมากยงขน การวเคราะหขอสอบหมายถงการคนหาคณลกษณะ คณภาพ ของคาถามและตวเลอก ซงเปนสวนทประกอบกนขนมาเปนขอสอบ วาเปนอยางไร ดหรอไม งายหรอยาก คณลกษณะทดของขอสอบทเกยวของกบเรองการวเคราะหขอสอบ เชน คาความยากงาย และคาอานาจจาแนกของขอสอบ เปนตน โดยคาความยากงายของขอสอบคอคาระดบความยากและความงายของขอสอบหรอสดสวนของจานวนผ ทตอบถกตอจานวนผตอบทงหมดเพอดความยากงายของขอสอบ คาอานาจจาแนกของขอสอบคอคาสถตทใชอธบายคณภาพของขอสอบโดยขอสอบทดตองมอานาจจาแนกไดวาเดกคนใดเกง เดกคนใดออนกวากน ทฤษฎขนตอนวธเชงพนธกรรมคอเทคนควธหนงทางปญญาประดษฐเพอใชในการหาผลลพธหรอคาตอบของปญหาทเหมาะสม ซงจาลองรปแบบวธการทางชววทยาในการใหกาเนดประชากรรนใหม โดยอาศยพนฐานความคดของววฒนาการทางธรรมชาตถายทอดลกษณะตางๆ ทางพนธกรรม โดยปฏบตตามกระบวนการทางพนธศาสตรเพอจะใชในการหาคาตอบทดทสดหรอใกลเคยงทสดของปญหา ซงในปจจบนขนตอนวธเชงพนธกรรมไดมการนาไปใชในหลากหลายดานเพอหาคาตอบทดทสด และในทนกนาไปใชในการพฒนาทางการศกษาเพอคนหาขอสอบทดทสดแทนอาจารย โดยมประสทธภาพทดกวา สดทายการเขยนโปรแกรมในการสรางขอสอบอตโนมตโดยขนตอนวธเชงพนธกรรมคอการเขยนโปรแกรมโดยภาษาซเพอใชในงานวจยในการพฒนาระบบทสามารถสรางขอสอบไดโดยอตโนมต สามารถทางานแทนคนไดอยางมประสทธภาพ ซงในหวขอนจะแสดงการเขยนโปรแกรมทงในสวนของโปรแกรมในการวเคราะหขอสอบและโปรแกรมในการสรางขอสอบอตโนมต โดยในสวนของการสรางขอสอบจะอธบายเปนขนตอนตามกระบวนการของขนตอนวธเชงพนธกรรมทอาจจะมบางสวนทมการปรบปรงเพอใหมความเหมาะสมในการหาขอสอบทมประสทธภาพ ในบทนเปนบททมการประยกตใชกบงานวจยเพอใหนกศกษาสามารถนาไปเปนพนฐานในการเขยนโปรแกรมและการทาวจยตอไปในอนาคตไดอยางมประสทธภาพ โดยคาดหวงวาในสวนของโปรแกรมนจะเปนตนแบบในการเขยนโปรแกรมในภาษาระดบสงอนๆ ตอไปเพอพฒนาใหดยงขนตอไป
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
535
แบบฝกหดทบทวน
1. คาความยากงายคออะไร จงอธบาย พรอมยกตวอยางในการคานวณใหชดเจน
2. คาอานาจจาแนกคออะไร จงอธบาย พรอมยกตวอยางในการคานวณใหชดเจน
3. เมอทาการคานวณคาความยากงายและคาอานาจจาแนกเสรจสนเราจะทราบไดอยางไรวาขอสอบขอไหนยาก ขอไหนงาย หรอมคาอานาจจาแนกเทาไหรจงจะดหรอไมด จงอธบายใหชดเจน
4. จงอธบายประโยชนของการวเคราะหขอสอบ จานวน 3 ขอ 5. ขนตอนวธเชงพนธกรรมคออะไรจงอธบาย 6. จงยกตวอยางของการนาเอาขนตอนวธเชงพนธกรรมไปใชจานวน 3 หวเรอง โดยใหอธบายใหชดเจนวานาไปใชอยางไร
7. ฟงกชนเปาหมายและฟงกชนความเหมาะสมคออะไรจงอธบาย พรอมทงอธบายถงความแตกตางของทงสองอยาง
8. จงเขยนโปรแกรมคานวณหาคาอานาจจาแนกและคาความยากงาย โดยใหอานคาจากแฟมขอมล (ใหสรางแฟมขอมล test.txt โดยมจานวนขอสอบ 100 ขอ) ในแฟมขอมลประกอบไปดวย ขอท จานวนผตอบถก(กลมสง) และจานวนผตอบถก(กลมตา) โดยขอมลจานวนผตอบถกใหนกศกษาสมมตตามความเหมาะสม
9. จงเขยนโปรแกรมในการคดเลอกโครโมโซมพอแมเพอดาเนนการทางพนธศาสตร โดยใช วธวงลอเสยงทาย (Roulette Wheel Selection) เลอกจานวน 4 ตว สมมตมจานวนโครโมโซมทงหมด 10 ตว และสมมตใหกาหนดคาฟงกชนความเหมาะสมตามตองการ โดยจะทาการรบคาฟงกชนความเหมาะสมจากการปอนขอมล ในสวนของการแสดงผลใหแสดงจานวนประชากรทงหมดจานวน 10 ตว พรอมแสดงคาฟงกชนความเหมาะสมในแตละโครโมโซม และแสดงผลลพธจากการเลอกประชากรจานวน 4 ตว พรอมแสดงคาฟงกชนความเหมาะสมในแตละโครโมโซม
10. จากโปรแกรมทไดศกษาในสวนของโปรแกรมในการสรางขอสอบโดยขนตอนวธเชงพนธกรรม จงปรบปรงโปรแกรมโดยการเปลยนแปลงประชากรตนแบบ (Population Size)
แลวใหสงเกตวาการเปลยนแปลงประชากรตนแบบ ทาใหเกดผลกระทบอะไรกบโปรแกรม
บทท 13 การประยกตภาษาซในงานวจยทางปญญาประดษฐในการสรางขอสอบอตโนมต
536
11. จงเขยนโปรแกรมของขนตอนวธเชงพนธกรรมเพอหาคาทดทสดของเลขจานวน 10 บต
(ความยาวโครโมโซม) โดยกาหนดฟงกชนความเหมาะสมคอ F = x2 คาทดทสดคอ
12. จากโปรแกรมทไดศกษาในสวนของโปรแกรมในการสรางขอสอบโดยขนตอนวธเชงพนธกรรม จงทดสอบโปรแกรมโดยการลบกระบวนการรกษาโครโมโซมทดทสด
(keep_best_chromosome()) และการเกบแทนทโครโมโซมทแยทสด (survive()) แลวใหสงเกตผลลพธของโปรแกรมเปรยบเทยบกบโปรแกรมเดมวามผลอยางไร ดขนหรอแยลง และทาใหเกดผลกระทบอะไรกบโปรแกรม
13. จงเขยนโปรแกรมคดเลอกขอสอบทมคณภาพโดยอตโนมตโดยวธขนตอนวธเชงพนธกรรมจากขอมลของขอสอบจานวน 166 ขอ (ขอมลอยในภาคผนวก โดยใหเกบขอมลตามความเหมาะสมเชนอาจจะเกบขอมลลงแฟมขอมล) โดยสามารถเลอกจานวนขอสอบไดตามตองการ และใหแสดงผลลพธออกทางหนาจอภาพพรอมทงบนทกผลลพธเปนแฟมขอมลทพรอมจะนาไปใชงาน (ผลลพธในแฟมขอความแสดงตวอยางดงรป ซงจะมทงขอคาถาม
ขอเลอก และคาตอบแบบฝกหดทถกในแตละขอ)
บรรณานกรม
ขนษฐา นาม, โครงสรางขอมลและอลกอรธม, นนทบร: ไอดซ อนโฟ ดสทรบวเตอร เซนเตอร จากด, 2548.
ไพศาล โมลสกลมงคล, ประสงค ประณตพลกรง, อนโชต วฒพรพงษ และ ศรายธ คลงทอง, สถาปตยกรรมคอมพวเตอร (Computer Architecture)., กรงเทพฯ, 2547.
ธรวฒน ประกอบผล, คมอการเขยนโปรแกรมภาษา PASCAL, กรงเทพฯ, 2550.
ธรวฒน ประกอบผล, คมอการเขยนโปรแกรมภาษา C, กรงเทพฯ, 2550. 2553.
บญเจรญ ศรเนาวกล และพพฒน ศภศรสนต, โครงสรางขอมลและอลกอรทม, กรงเทพฯ: บรษท สานกพมพทอป จากด, 2550.
วเชยร ศรพระจนทร, ภาษาโปรแกรมคอมพวเตอร., กรงเทพฯ, 2542
วไลพร กลตงวฒนา, โครงสรางขอมลและขนตอนวธ, 2554.
วจกษณ ศรสจจะเลศวาจา และดษฏ ประเสรฐฐตพงษ, การเขยนโปรแกรมภาษาซ, ภาควชาวทยาการคอมพวเตอร คณะวทยาศาสตร มหาวทยาลยเชยงใหม, 2545.
สานนท เจรญฉาย, โปรแกรม C คานวณสถต, โรงพมพจฬาลงกรราชวทยาลย, กรงเทพฯ, 2545.
อรพน ประวตบรสทธ, คมอเรยน ภาษาซ ฉบบปรบปรงใหม, โปรวชนจากด, 2552.
A. Drozdex, Data Structures and Algorithms in C++, PWS Publishing Company, 1996.
B.W. Kernighan and D.M. Ritchie, The C Programming Language, Second Edition,
Prentice Hall, United States of America, 1988.
K. Somkantha, The Development an Automatic Examination Items Generator System
by Genetic Algorithm, The 3rd International Conference on Education and
Information System Technologies and Applications: EISTA05, Orlando Florida,
USA, 2005.
P. Prinz and T. Crawford, C in A Nutshell: A Desktop Quick Reference, 2006.
R.L. Wood, Manufacturing Engineering Modular Series: C Programming for Scientists
& Engineers, Penton Press, 2002.
538
S. Gough, Programming in C, Oxford University Computing Services, 1996.
S. Siamak Sarmady, Learn’em Programming Courses: Programming in C in 7 days,
2008.
D.E Goldberg, Genetic Algorithms in Search, Optimization, and Machine Learning,
Massachusetts : Addison-Wesley Publishing Company, Inc., 1989.
W. Stallings, Computer Organization and Architecture Designing for Performance:
Sixth Edition , Prentice Hall, 2003.
Z. Michalewicz, Genetic Algorithms + Data Structures = Evolution Program. London :
Springer, 1996.
ภาคผนวก
540
ภาคผนวก
ตวอยางขอมลขอสอบจานวน 166 ขอ
541
ภาคผนวก
ขอท บทท คาความยากงาย คาอานาจจาแนก ขอทถก
1=ก, 2=ข, 3=ค, 4=ง 1 1 0.9 0.9 2
2 2 0.45 -0.2 4
3 3 0.29 0.8 4
4 4 0.1 0.9 1
5 5 0.9 0.69 2
6 6 0.59 -0.1 2
7 1 0.45 0.55 1
8 2 0.65 -0.75 2
9 3 0.2 0.5 2
10 4 0.65 0.84 4
11 5 0.1 0.1 2
12 6 0.65 0.45 1
13 1 0.25 0.84 1
14 2 0.5 0.5 2
15 3 0.5 0.9 3
16 4 0.65 0.75 1
17 5 0.5 0.98 4
18 6 0.34 0.14 2
19 1 0.89 0.75 3
20 2 0.35 0.45 4
21 3 0.75 0.45 1
22 4 0.65 -0.5 3
23 5 0.11 0.5 2
24 6 0.66 -0.47 2
25 1 0.44 0.23 3
26 2 0.65 0.86 3
27 3 0.88 0.88 1
28 4 0.65 -0.1 4
542
ภาคผนวก
29 5 0.1 0.1 3
30 6 0.9 0.9 4
31 1 0.8 0.4 1
32 2 0.75 0.35 3
33 3 0.45 0.65 1
34 4 0.25 0.65 2
35 5 0.45 0.75 2
36 6 0.5 0.5 2
37 1 0.45 0.86 3
38 2 0.97 0.98 1
39 3 0.45 0.65 1
40 4 0.25 0.45 4
41 5 0.45 0.34 1
42 6 0.84 -0.29 2
43 1 0.54 0.34 3
44 2 0.75 0.84 2
45 3 0.84 0.84 4
46 4 0.78 -0.5 1
47 5 0.58 -0.2 4
48 6 0.45 0.56 1
49 1 0.65 0.78 3
50 2 0.57 0.96 1
51 3 0.75 0.8 2
52 4 0.75 0.45 3
53 5 0.84 0.89 3
54 6 0.45 0.78 2
55 1 0.23 0.75 4
56 2 0.88 0.29 3
57 3 0.25 0.65 3
58 4 0.84 0.54 2
543
ภาคผนวก
59 5 0.25 0.68 3
60 6 0.8 0.45 1
61 1 0.65 0.34 4
62 2 0.97 0.55 2
63 3 0.46 0.75 2
64 4 0.55 -0.55 2
65 5 0.75 -0.57 4
66 6 0.84 -0.1 1
67 1 0.55 0.75 2
68 2 0.65 0.45 1
69 3 0.45 0.84 2
70 4 0.83 -0.78 2
71 5 0.45 -0.2 4
72 6 0.45 0.65 3
73 1 0.45 0.55 2
74 2 0.94 0.75 2
75 3 0.45 0.84 4
76 4 0.5 0.75 4
77 5 0.45 0.84 2
78 6 0.84 0.75 2
79 1 0.45 0.84 3
80 2 0.45 0.65 2
81 3 0.83 0.75 2
82 4 0.45 0.65 1
83 5 0.75 0.94 1
84 6 0.25 0.41 2
85 1 0.94 0.55 4
86 2 0.51 0.98 1
87 3 0.73 0.65 2
88 4 0.75 0.34 4
544
ภาคผนวก
89 5 0.34 0.25 1
90 6 0.68 0.44 3
91 1 0.34 0.55 1
92 2 0.34 -0.44 2
93 3 0.45 -0.23 1
94 4 0.54 -0.2 2
95 5 0.45 0.45 4
96 6 0.78 0.34 1
97 1 0.84 0.34 1
98 2 0.45 0.34 3
99 3 0.45 0.88 2
100 4 0.25 0.33 1
101 5 0.33 0.45 2
102 6 0.45 0.78 4
103 1 0.34 0.86 2
104 2 0.63 0.14 3
105 3 0.65 0.33 3
106 4 0.86 -0.45 2
107 5 0.75 0.65 2
108 6 0.77 0.89 1
109 1 0.14 0.45 2
110 2 0.55 0.55 1
111 3 0.9 0.9 4
112 4 0.1 0.1 2
113 5 0.5 0.5 2
114 6 0.65 0.45 3
115 1 0.86 0.97 2
116 2 0.86 0.66 4
117 3 0.55 0.45 2
118 4 0.55 0.55 4
545
ภาคผนวก
119 5 0.45 0.65 2
120 6 0.5 0.98 2
121 1 1 1 3
122 2 0.5 0.65 4
123 3 0.78 0.97 1
124 4 0.1 0.2 2
125 5 0.25 -1 3
126 6 0.65 -0.2 1
127 1 0.34 0.65 3
128 2 0.34 0.44 3
129 3 0.33 0.78 4
130 4 0.88 0.65 3
131 5 0.22 0 1
132 6 0.45 0.33 4
133 1 0.25 0.32 3
134 2 0.34 0.22 2
135 3 0.22 0.44 4
136 4 0.97 0.45 2
137 5 0.65 0.77 2
138 6 0.45 0.84 2
139 1 0.45 -0.2 4
140 2 0.65 0.73 3
141 3 0.65 0.22 2
142 4 0.98 0.98 3
143 5 0 0 3
144 6 0.45 0.66 2
145 1 0.45 0.66 3
146 2 0.94 0.75 3
147 3 0.65 0.45 2
148 4 0.75 0.54 4
546
ภาคผนวก
149 5 0.65 0.75 3
150 6 0.65 0.25 1
151 1 0.25 -0.25 4
152 2 0.65 0.45 2
153 3 0.45 0.22 1
154 4 0.34 0.22 2
155 5 0.25 0.45 2
156 6 0.45 0.84 1
157 1 0.33 0.73 4
158 2 0.97 0.73 3
159 3 0 0.1 3
160 4 0.59 0.33 3
161 5 0.14 0.25 1
162 6 0.44 0.78 1
163 1 0.78 0.65 2
164 2 0.22 -0.54 1
165 3 0.97 -0.46 1
166 4 0.78 0.46 2
547
ภาคผนวก
ตวอยางขอมลขอคาถามขอสอบจานวน 166 ขอ
548
ภาคผนวก
ขอท ขอคาถาม ก ข ค ง 1 การทางานของคอมพวเตอรมก
ขนตอน
3 ขนตอน 4 ขนตอน 5 ขนตอน 6 ขนตอน
2 ขอใดไมใชขนตอนการทางานของคอมพวเตอร
รบขอมล คานวณ พมพขอมล ยอ-ขยายขอมล
3 ถาขาดสวนใด คอมพวเตอรจะทางานไมได
หนวยรบขอมล หนวยประมวลผล
หนวยนาเสนอผลลพธ
ถกทกขอ
4 อปกรณใดอยในขนตอนของ output
จอภาพ สแกนเนอร แปนพมพ เมาส
5 ขนตอนใดทถอเปนหวใจของคอมพวเตอร
รบคาสง ประมวลผล เกบขอมล นาเสนอผลลพธ
6 สวนประกอบใดททาหนาทแปลงสญญาณคอมพวเตอรใหสงตามสายโทรศพทได
สแกนเนอร โมเดม เครองพมพ เมาส
7 จอภาพเรยกอกอยางหนงวาอยางไร
มอนเตอร ดสเพลย สกรน ถกทกขอ
8 สวนประกอบของคอมพวเตอรสวนใดจดเปนหวใจของเครอง
Monitor CPU Keyboard Mouse
9 หนาทของสแกนเนอรคออะไร แปลงขอมลจากคอมพวเตอรสงไปตามสายโทรศพท
นาขอมลประเภทรปภาพเขาไปในเครอง
แสดงผลขอมลออกมาทางกระดาษ
พมพคาสงหรอปอนขอมลเขาสคอมพวเตอร
10 สวนประกอบใดไมอยในตวเครองคอมพวเตอร
CPU Driver Sound Card Printer
11 ขอใดใหคาจากดความของฮารดแวรไดสมบรณทสด
หนวยรบขอมล ตวเครองและอปกรณรอบขาง
อปกรณทกชนดททาใหคอมพวเตอรทางานได
อปกรณทกชนดทอยในตวกลองของคอมพวเตอร
12
หนาทสาคญของหนวยประมวลผลกลางคออะไร
เปนหนวยควบคมการปฏบตงานหลกของเครอง
เปนหนวยแสดงผลขอมล
เปนหนวยนาเขาขอมล
เปนหนวยสงขอมลไปยงเครองคอมพวเตอรอน
549
ภาคผนวก
13 ซอฟตแวรคออะไร โปรแกรมสงงานเครอง
อปกรณรอบขาง
ตวเครอง อปกรณนาเขาขอมล
14 ขอใดไมใชซอฟตแวรระบบปฏบตการ (Operating
System Software)
DOS Lotus Unix Window 98
15 ขอใดเปนซอฟตแวรประยกต
(Application Software)
Linux Unix Lotus OS/2
16 ขอดของเครองคอมพวเตอรทมตวเครองแบบแนวนอนคออะไร
ประหยดเนอท สะดวกในการเคลอนยาย
ตอพวงไดสะดวก
ราคาประหยด
17 ตวเครองแบบไดทไมคอยนยมกนมากนก
แบบแนวนอน แบบแนวตง แบบพกพา แบบรวมในชนเดยว
18 ขอจากดสาคญของเครองคอมพวเตอรแบบพกพาคออะไร
มขนาดใหญ
ไมเหมาะกบการพกพา
ราคาแพง ไมคอยมการรบประกนคณภาพจากผผลต
หาอะปกรณซอมแซมและดแลบารงรกษาไดยาก
19 ถานกเรยนจะใชคอมพวเตอรทบานควรเลอกแบบใดจงจะเหมาะสมทสด
แบบพกพา แบบตวเครองรวมในชนเดยว
แบบตวเครองแนวตง
แบบตวเครองแนวนอน
20 การเลอกซอคอมพวเตอรแบบตางๆ ควรคานงถงสงใดเปนสาคญ
ราคา คณภาพ ความคมคาในการใชงาน
ความเหมาะสมกบงานทจะใช
21 CPU ทาหนาทอะไร ประมวลผลขอมล
อานขอมลจากซดรอม
จาขอมลไวชวคราว
อานขอมลจากดสกเกต
22 อปกรณภายในคอมพวเตอรทกชนดตองวางอยบนอปกรณชนดหนง คออะไร
หนวยประมวลผลกลาง
ชองเสยบอปกรณเพมเตม
เมนบอรด ฮารดไดรฟ
23 ถาตองการจะนาเอาการดเสยงมาใสในเครองคอมพวเตอร จะตองเพมเขาในสวนใด
การดขยาย ชองเสยบอปกรณเพมเตม
ชองไดรฟ ชองซดรอมไดรฟ
24 40 X Speed CDROM หมายถงอะไร
ความกวางของซดรอมไดรฟ
ความเรวของซดรอมไดรฟ
ปรมาณความจของซดรอมไดรฟ
ขนาดและคณภาพของซดรอมไดรฟ
25 คยบอรดทาหนาทอะไร แสดงผลขอมล ประมวลผลขอมล
นาเขาขอมล เกบและสารองขอมล
550
ภาคผนวก
26 เพราะเหตใดคยบอรดจงมป มตวอกษรและคาสงตางๆ มากกวาเครองพมพดดทวไป
เพอใหมประสทธภาพมากขน
เพอใหสามารถใชงานไดยาวนานมากขน
เพอใชงานโปรแกรมบางอยางไดสะดวกขน
เพอใหสามารถปอนขอมลพเศษตางๆ ไดมากขน
27 ถาเราตองการเลอนเคอรเซอรไปทางขวา 1 ตวอกษรควรใชป มใดบนคยบอรด
Spacebar Alt Shift Tab
28 หนาทของกลมแปนพมพ F1-
F12 คออะไร เลอกคาสงพเศษ
ลบคา ใชแทนเลข 1-
10
ใชแทนคาสงพเศษตามทโปรแกรมกาหนด
29 ขอใดบอกลกษณะของเมาสไมถกตอง
เปนอปกรณนาเขาขอมล
ใชเลอกคาสงบนเมน
ใชเมาสป มขวาเปนหลก
ปรบเปลยนขนาดของหนาตาง
30 ขอใดไมใชลกษณะของการใชเมาส
คลก ดบเบลคลก ลากแลวปลอย จบแลววาง
31 ประโยชนของเมาสป มขวาคออะไร
เปดเมนยอย ขยายหนาตาง ยายไฟล ลบไฟล
32 ขอใดเปนการใชเมาสอยางผดวธ
มแผนรองเมาสเสมอ
ทาความสะอาดลกกลงบอยๆ
เปลยนเมาสบอยๆ
ซอเมาสทเหมาะสมมาใชงาน
33 จอภาพแบงออกเปนกประเภท 2 ประเภท 3 ประเภท 4 ประเภท 5 ประเภท
34 ความละเอยดของจอภาพมหนวยวดเปนอะไร
เมกะไบต พกเซล ฟอนต บตตอนาท
35 ดแรมคออะไร การดเสดงผลทมความเรวสง
การดแสดงผลทมความเรวตา
การดแสดงผลทมความจาถาวร
การดแสดงผลทมความจาชวคราว
36 วแรม เหมาะกบการใชงานอะไร แสดงผลขอมลธรรมดา
แสดงผลขอมลรปภาพกราฟก
แสดงผลขอมลดานมลตมเดย
แสดงผลขอมลดานเสยง
37 เครองพมพมหนาทอะไร นาเขาขอมล ประมวลผลขอมล
แสดงผลขอมล นาเขาและแสดงผลขอมล
38 การดวาเครองพมพมความเรวมากหรอนอย ดไดอยางไร
จานวนหนาตอนาท
จานวนหนาตอชวโมง
จานวนหนาตอวนาท
ขนาดของหนากระดาษทพมพ
551
ภาคผนวก
39 เครองพมพชนดใดพมพขอมลไดสวยงามมากทสด
Laser Ink Jet Dot-Matrix Solid Ink
40 เครองพมพทนยมใชในวงการธรกจทวไป คออะไร
Ink Jet Solid Ink Dot-Matrix Laser
41 สแกนเนอร ทาหนาทอะไร นาเขาขอมล แสดงผลขอมล ประมวลผลขอมล
นาเขาและแสดงผลขอมล
42 สแกนเนอรแบบดงกระดาษมขอจากด คออะไร
สแกนไดนอย สแกนไดนอยและตองฉกกระดาษ
สแกนไดเฉพาะกระดาษ A4
สแกนไดคอนขางหยาบ
43 สแกนเนอรทเหมาะสมกบการทางานตามบาน ควรเปนแบบใด
100 dpi 200 dpi 300 dpi 400 dpi
44 สแกนเนอรชนดใดมคณภาพสงทสด
Sheet-Fed
Scanner
Flatbed
Scanner
Hand-Held
Scanner
ถกทกขอ
45 หนาทสาคญของโมเดม คออะไร เชอมตอคอมพวเตอรกบอนเทอรเนต
รบ-สงแฟกซ รบ-สงจดหมายอเลกทรอนกส
ถกทกขอ
46 โมเดมประเภทใดทสะดวกกบการใชงานตามบานทวไปมากทสด
โมเดมทตดตงภายใน
โมเดมทตดตงภายนอก
โมเดมแบบ 33
Kbps
โมเดมแบบ 56
Kbps
47 โมเดมมความเรวทเหมาะกบการใชงานอนเทอรเนตควรเปนเทาไร
24 Kbps 26 Kbps 33 Kbps 56 Kbps
48 ขอควรระมดระวงในการใชโมเดมคออะไร
การตอเชอมกบสายโทรศพท
การเลอกความเรวทเหมาะสม
อายการใชงาน ราคาของโมเดม
49 หนวยประมวลผลกลาง เรยกอกอยางหนงวาอะไร
หนวยความจาถาวร
หนวยความจาชวคราว
ไมโครโปรเซสเซอร
อเลกทรอนกสคอนดกเตอร
50 ความเรวของซพย เรยกวาอะไร บต ไบต เมกะเฮรตซ กโลเฮรตซ 51 หนวยประมวลผลกลางทา
หนาทอะไร จดจาขอมล ประมวลผล
ขอมล เกบขอมล สารองขอมล
52
ซพยเพนเทยม หมายถงอะไร ซพยยหอหนง ซพยทดทสด ซพยของบรษทอนเทล
ซพยชนดใหมลาสด
552
ภาคผนวก
53 หนวยบอกความเรวของซพย คออะไร
บต ไบต เมกะเฮรตซ กโลเฮรตซ
54 หนวยความจาแรม RAM
หมายถงอะไร หนวยความจาถาวร
หนวยความจาชวคราว
หนวยความจาขนาดใหญ
หนวยความจาขนาดเลก
55 หนวยความจาแรม RAM
ปจจบนนยมใชขนาดเทาใด
16 MB 32 MB 64 MB 128 MB ขนไป
56 หนวยความจา SDRAM เหมาะกบการใชงานมากในปจจบน
เพราะอะไร
ขนาดกะทดรด ขนาดหนวยความจาใหญมาก
ราคาถก ประสทธภาพด
ซอมแซมและบารงรกษางาย
57 หนวยความจา SIMM มประโยชนอยางไร
เกบขอมลสารอง
ใชตดตงหนวยความจาบนเมนบอรด
แผงอเลกทรอนกสสาหรบเพมหนวยความขา
อปกรณสาหรบใสในหนวยความจาเพอเพมประสทธภาพการทางานของ RAM
58 หนวยความจาแคช คออะไร หนวยความจาททาใหเครองจาขอมลไดมากขน
หนวยความจาททาใหเครองทางานเรวขน
เหนวยความจาแทนแรม
หนวยความจาถาวรของคอมพวเตอร
59 บสของคอมพวเตอรทาหนาทอะไร
เปนหนวยแสดงผลขอมล
เปนตวประมวลผลขอมล
เปนทางวงของขอมล
เปนหนวยความจาของขอมล
60 บต หมายถงอะไร ขนาดของบส จานวนของบส ความเรวของบส
ชอเรยกอยางหนงของบส
61 หนวยวดความเรวของบส เรยกวาอะไร
ไบต บต กโลเฮรตซ เมกะไบต
62 หนาทหลกของหนวยเกบขอมลรอง คออะไร
สารองไฟลไวใชในกรณฉกเฉน
เกบขอมลทไมไดใชงานขณะนนไว
เกบขอมลทมปรมาณมากๆ ไวใชยามจาเปน
เกบขอมลทประมวลผลเสรจแลว
63 หนวยเกบขอมลสารองแบงออกเปนกประเภทหลกๆ
2 ประเภท 3 ประเภท 4 ประเภท 5 ประเภท
553
ภาคผนวก
64 ถาตองการเกบขอมลทสะดวกในการเคลอนยาย ขอมลไมมากนก นยมเกบในหนวยขอมลประเภทใด
ฮารดดสก ฟลอปปดสก ซดรอม ดวดรอม
65 ฮารดดสกทนยมใชควรมหนวยความจาอยางนอยเทาใด
500 MB ขนไป 1 GB ขนไป 3 GB ขนไป 4 GB ขนไป
66 ดวด ตางจากซดรอมอยางไร เกบขอมลไดมากกวา
เกบขอมลไดนานกวา
เกบขอมลไดละเอยดกวา
เกบขอมลไดทงภาพ เสยงและตวหนงสอ
67 ขอใดใหความหมายของระบบปฏบตการไดถกตองทสด
ใชสาหรบเครองพซ
เปนโปรแกรมควบคมการทางานอปกรณตางๆ ของคอมพวเตอร
เปนโปรแกรมชวยงานดานการพมพและทากราฟฟก
เปนโปรแกรมทบรษทไมโครซอฟตผลตขน เพอใชกบเครองคอมพวเตอรพซ
68 ถาเปรยบเทยบกบรางกายของคน ระบบปฏบตการเปรยบไดกบอวยวะสวนใด
สมอง ปอด หวใจ ดวงตา
69 ระบบปฏบตการทไดรบความนยมสงสดของผ ใชคอมพวเตอรทวโลกในปจจบน คออะไร
MS-/DOS MS-Windows Mac OS Unix
70 ถาระบบปฏบตการผดปกตจะเกดอะไรขนกบเครองคอมพวเตอร
เครองเสย เครองหยดทางานชวคราว
เปดเครองไมได เครองแฮงคบอยๆ
71 การทางานแบบเครอขายขนาดใหญนยมใชระบบปฏบตการแบบใด
DOS Windows Mac OS Unix
72
เครอขายคอมพวเตอร หมายถงอะไร
ศนยรวมคอมพวเตอรจานวนมาก
การตอเชอมคอมพวเตอรเขากบเครองพมพ
การตอเชอมคอมพวเตอรตงแต 2 เครองเขาดวยกน
การสงขอมลจากคอมพวเตอรผานสายโทรศพท
554
ภาคผนวก
73 ระบบเครอขายคอมพวเตอรคลายกบกระบวนการของระบบใด
อวยวะของรางกาย
การบรหารงานในองคกร
การเกดหมนเวยนของวฎจกรนา
การเกดนาขน-
นาลง
74 อปกรณสาคญทใชในการตอเชอมคอมพวเตอรเปนระบบเครอขายคออะไร
สายเคเบล สายโทรศพท สญญาณไมโครเวฟ
สญญาณดาวเทยม
75 ขอใดไมใชองคประกอบของการสงขอมลในเครอขายคอมพวเตอร
ผสง ผ รบ ตวกลาง ผใชคอมพวเตอร
76 ขอใดบอกความหมายของเครอขายคอมพวเตอรไมถกตอง
คอมพวเตอร 2
เครองขนไป
ตอเชอมโดยใชตวกลาง
ตอเชอมดวยระบบโทรคมนาคม
ใชไดเฉพาะบรเวณใกลๆ เทานน
77 ระบบเครอขายมประโยชนในการทางานแบบกลมรวมงาน
หมายความวาอยางไร
ทกคนทางานอยางเดยวกนจนเสรจ
ทกคนทางานแตละงานจนเสรจแลวนามารวมกน
แตละคนแบงงานกนทาแลวนามารวมกน
แยกงานออกเปนสวนๆ แลวนามารวมกนทาในระบบเครอขายคอมพวเตอร
78 การเชอมตอระบบเครอขายคอมพวเตอร ทาใหเกดการประหยดได เพราะอะไร
คอมพวเตอรเครองเดยวทางานไดหลายอยาง
อปกรณตอเชอมตวเดยวใชงานรวมกนไดทงระบบ
ซออปกรณราคาไมแพงกสามารถใชงานไดอยางมประสทธภาพ
อปกรณชดเดยว ถาชารดสามารถเปลยนได โดยไมตองซอมทงระบบ
79 ขอใดไมใชประโยชนของเครอขายคอมพวเตอร
รบ-สงอเมล เกบขอมลสวนกลาง
ชวยในการรกษาขอมลจานวนมาก
ชวยการทางานแบบรวมกลม
80 การรบ-สงอเมลจดเปนประโยชนของระบบเครอขายหรอไม เพราะเหตใด
เปน เพราะมการเชอมคอมพวเตอรหลายๆ เครองเขาดวยกน
เปน เพราะมศนยบรการอนเทอรเนตในการประสานงานการสงอเมล
ไมเปน เพราะไมไดใชอปกรณคอมพวเตอรรวมกน
ไมเปน เพราะไมมการทางานแบบกลมรวมงาน
81 เครอขายคอมพวเตอรแบงออกเปนกประเภท
2 ประเภท 3 ประเภท 4 ประเภท 5 ประเภท
555
ภาคผนวก
82 เครอขายภายในเมองหรอจงหวดใกลเคยง เรยกวาอะไร
LAN WAN MAN SAN
83 หนาทของสวตชงโหนด คออะไร จดตอททาหนาทสงขอมล
จดตอททาหนาทประมวลขอมล
จดตอททาหนาทเกบขอมล
จดตอททาหนาทรบขอมล
84 ขอใดเปนสวนประกอบของเครอขายสวนยอยของผใช
เราเตอร โฮสตคอมพวเตอร
เครองพมพ ตวกระจายขอมล
85 หลกการสาคญของเครอขายยอยสวนของการสอสาร คออะไร
การสงขอมลแบจดตอจด
การสงขอมลแบบแพรกระจายขอมล
การสงขอมลผานเราเตอร
ถกทกขอ
86 ลกษณะการทางานของกาแพงไฟ (Firewall) เปนอยางไร
ใชปองกนขอมลอยางมนคง
ใชปองกนขอมลแบบงายๆ
ใชปองกนขอมลทไมสาคญ
ใชปองกนเฉพาะขอมลของการทหารเทานน
87 โดยปกตการปองกนขอมลพนฐานจะใชการปองกนแบบใด
กาแพงไฟ บญชสมาชกและรหสผาน
การใชรหสลบ การใชการดหมายเลข
88 การเลอกรหสผานโดยปกตมขอควรระวงอยางไร
ไมใชชอสามญทวไป
ไมใชชอทยากเกนไป
ใชสญลกษณพเศษ
ถกทกขอ
89 ประโยชนของการใสรหสผาน
คออะไร ปองกนคนอนเขามาใชขอมล
ปองกนคนอนมาใชเครองคอมพวเตอรของเรา
ปองกนระบบเครอขายไมใหถกกอกวน
เตอนภย เมอมบคคลทไมพงปรารถนาเขามาสเครอขายของเรา
90 ถาไมมการปองกนรกษาความปลอดภยในระบบเครอขายจะเกดผลเสยมากทสดในดานใด
ขอมลถกลบได ขอมลถกลกลอบขโมยไปได
ขอมลอาจถกไวรสหรอถกทาลายได
คนอนทราบความลบของหนวยงานของเราได
91
ขอใดใหความหมายของอนเทอรเนตไดถกตองทสด
เครอขายคอมพวเตอร
ไซเบอรเสปซ กลมของคอมพวเตอร
การสงขอมลจากคอมพวเตอรเครองหนงไปยงอกเครองหนง
556
ภาคผนวก
92 อนเทอรเนตเรยกอกอยางหนงวาอะไร
เนตเวรก ไซเบอรเสปซ คอมมวนเคชน เนตเวรกซสเตม
93 อนเทอรเนตเกดขนทประเทศใด สหรฐอเมรกา องกฤษ รสเซย ออสเตรเลย 94 จดเรมแรกของอนเทอรเนต
จากดอยในผใชกลมใด
นกธรกจ การทหาร การบนเทง การศกษา
95 อนเทอรเนตในประเทศไทยเรมไดรบความนยมเมอใด
พ.ศ. 2530 พ.ศ. 2531 พ.ศ. 2532 พ.ศ. 2535
96 การใชอนเทอรเนตในการสงจดหมายขอความ เรยกวาอะไร
อเมล การสบคนขอมล
การโอนถายขอมล
การแลกเปลยนขาวสาร
97 บรการดาน E-Commerce
หมายถง การทาธรกจบนอนเทอรเนต
การสงขาวสารบนอนเทอรเนต
การพดคยหรอสนทนา
การสงจดหมายอเลกทรอนกส
98 ถาตองการสนทนากบเพอนทางอนเทอรเนต ควรใชบรการสวนใดของระบบอนเทอรเนต
E-Mail Telnet Chat & Talk Gopher
99 บรการ FTP หมายถงอะไร การสงจดหมายอเลกทรอนกส
การคนหาและเรยกขอมลจากแหลงตางๆ มาใช
การทาธรกจบนอนเทอรเนต
การแลกเปลยนขาวสารและความคดเหนกน
100 บรการอนเทอรเนตทผใชนยมมากทสด คออะไร
อเมล เอนเทอรเทน นวสกรป อคอมเมรซ
101 "แพกเกต" หมายถงอะไร กลองใสขอมล ชดของขอมล หนวยรบขอมล สญญาณรบ-สงขอมล
102 คอมพวเตอรทสามารถใชตดตออนเทอรเนตได คอรนอะไร
IBM PC รน
486
IBM PC รน
Pentium
Macintosh ถกทกขอ
103 ศนยบรการอนเทอรเนตในประเทศไทยเปนความรวมมอระหวางเอกชนกบหนวยงานใดของรฐ
องคการโทรศพท
การสอสารแหงประเทศไทย
ศนยคอมพวเตอรและอเลกทรอนกสแหงประเทศไทย
กระทรวงคมนาคม
104 stou.ac.th คาวา "ac" หมายถง อะไร
ตวยอประเทศ ตวยอหนวยงานตนสงกด
ตวยอของประเภทขององคกร
ชอของผใหบรการอนเทอรเนต
557
ภาคผนวก
105 กระทรวงการตางประเทศของไทย ม DNS วาอยางไร
mfa.or.th mfa.ac.th mfa.go.th mfa.co.th
106 ขอใดอธบายความหมายของเวลดไวดเวบไดถกตองทสด
การบรการขอมลดวยขอความภาพ
เสยง ผานคอมพวเตอร
การบรการขอมลทเชอมตอดวยไฮเปอรลงกโดยมโฮสตททาหนาทบรการขอมล
การบรการขอมลผานเวบเซรฟเวอร
การบรการขอมลผานโฮสตโดยใชคานาหนาวา www
107 เวบเพจ (Web Page)
เปรยบเทยบไดกบอะไร ปกหนงสอ หนาแตละหนา
ของหนงสอ กระดานไวทบอรด
โตะเขยนหนงสอ
108 หนาแรกของเวบเพจ เรยกวาอะไร
Home Page Web Site Home Site Http
109 ในแตละโฮมเพจมกจะประกอบดวยอะไรเปนหลก
ขอความ รปภาพ สญลกษณพเศษ
ไฟลเสยง
110 เวบเซรฟเวอร เปรยบไดกบอะไร สถานโทรทศน สถานขนสงรถเมล
สถานอนามย สถานวทยกระจายเสยง
111 เวบเบราเซอรทไดรบความนยมมากในปจจบนคออะไร
Netscape IE (Internet
Explorer)
pantip.com ขอ ก และ ข ถก
112 การตอเชอมกบอนเทอรเนต
เอกซพลอเรอร ขนตอนแรกตองทาอยางไร
คลกทไอคอน
My Computer
ดบเบลคลกทไอคอน
Connect to
the Internet
คลกเมาสป มขวาบรเวณพนทวางๆ
คลดทโฟลเดอร Controlpanel
113 ป ม Back ในอนเทอรเนต เอกซพลอเรอร หมายถงอะไร
การเลอนเวบเพจ
การยอนกลบไปยงเวบเพจกอนหนา
การคนหาเวบเพจ
การไปยงเวบเพจหนาถดไปทเคยดมาแลว
114 คาสงAddress ในอนเทอรเนต
เอกซพลอเรอร ตรบงกบคาสงใดของเนตสเคป
Bookmark Forward Location Security
115 ป ม Home มความสาคญกบเวบเบราเซอรอยางไร
ทาใหทางานไดเรวขน
เปนหนาตางแรกทจะพบเมอเปดเวบเบราเซอร
ชวยในการคนกาขอมลหรอเวบไซตตางๆ
เปนคาสงทชวยประสานงานการตดตอกบเวบไซตอนๆ
558
ภาคผนวก
116 Search Site มความสาคญอยางไร
ชวยในการคนหาเวบไซต
ชวยในการหาทอยของคาสาคญตางๆ
ชวยประสานงานการลงกขอมล
ถกทกขอ
117 การคนหาเวบไซต ทาไดกวธ 2 วธ 3 วธ 4 วธ 5 วธ 118 ขอใดไมใช Search Site yahoo infoseek lycos disney
119 จดเดนของการคนหาดวย Yahoo คออะไร
สามารถดราคาหนได
ใชคยเวรดนารอง
มคณสมบตทเรยกวา Cool
เนนขอมลบรษทตางๆ ในสหรฐอเมรกา
120 การคนหาแบบอตโนมต ตางจากการคนหาธรรมดาอยางไร
ตองพมพคยเวรด
พมพคยเวรดตามหลงคาวา go
พมพคยเวรด
แลวคลก Search
พมพยอารแอลทตองการแลวคลก Search
121 ถาตองการเกบเวบไซตทนาสนใจไวใชงานครงตอไปอยางรวดเรว จะปฏบตอยางไร
เกบเวบไซตไวใน History
เกบเวบไซตไวใน Search
เกบเวบไซตไวใน Favorites
เกบเวบไซตไวใน Refresh
122 ถาตองการชมรายการโทรทศนผานอนเทอรเนตตองปฏบตอยางไร
เรยกผานเบราเซอร
เรยนผาน
Search Site
เรยกผาน
windowsmedi
a.com
ถกทกขอ
123 การปรบภาษาใหเปนภาษาไทยใชคาสงใด
Encoding Go to Favorites Refresh
124 ถาตองการเขาไปยงเวบไซตของกระทรวงศกษาธการจะใชรปแบบคาสงอยางไร
www.mai.go.t
h
www.moc.go.t
h
www.mua.go.
th
www.cat.co.th
125 ถาเราตองการทราบวาในประเทศไทยมเวบไซตอยมากนอยเทาใด เราจะคนหาขอมลไดจากทใดจงจะเหมาะสม
Yahoo Hansa.com Internet
Thailand
Infoseek
126 ขอใดใหความหมายของอเมลไดถกตอง
การสงจดหมายผานเครอขายคอมพวเตอร
การสงจดหมายผานสายโทรศพท
การสงจดหมายดวยสอทมความเรวสง
การสงจดหมายโดยไมตองใชกระดาษ
127
จดเดนททาใหอเมลไดรบความนยมมากคออะไร
ประหยด ปลอดภย รวดเรว สะดวก
559
ภาคผนวก
128 กระบวนการทางานของอเมลขอใดถกตอง
ผสงถงผ รบ ผสงผานตวกลางถงผ รบ
ผสงผานตวกลางและศนยบรการถงผ รบ
ผสงผานศนยบรการ ตวกลาง ศนยบรการ ถงผ รบ
129 ขอควรระวงในการของอเมล แอดเดรสคออะไร
ชอไมควรซากบคนอน
รหสผานตองจาใหด
ผใหบรการทดแลอยางด
ถกทกขอ
130 โปรแกรมอเมลคออะไร โปรแกรมสาหรบรบอเมล
โปรแกรมสารหบสงอเมล
โปรแกรมตวกลางรบ-สงอเมล
โปรแกรมสาหรบกรองขอความอเมล
131 โปรแกรม Outlook Express มหนาทสาคญอยางไร
รบ-สงอเมล เกบไฟลสาหรบสงพรอมกบอเมล
ตรวจสอบความถกตองของขอความอเมล
ใชสาหรบพมพอเมลออกทางเครองพมพ
132 ขอใดไมใชสวนประกอบในการเขยนอเมล
To: Cc: Subject Undo
133 คาสง Attach มประโยชนอยางไร
บบอดไฟล ขยายไฟล แนบไฟลไปกบอเมล
ตรวจรบอเมลเขา-ออก
134 Address Book มหนาทอะไร แนบไฟลไปกบอเมล
บนทกทอยอเมลทเราใชบอยๆ
เปลยนโฟลเดอรใหม
สารองอเมลทลบไปแลวไว
135 มารยาททดในการสงอเมลคออะไร
เขยนชอ-ทอยผ รบใหชดเจน
ใสหวขอเรองทกครง
ตอบกลบอยางรวดเรว
ถกทกขอ
136 ขอใดอธบายความหมายของคาวานวสกรปไดดทสด
การเสนอความคดเหนผานอนเทอรเนต
การนาเสนอขอคดเหนของตนเองเผยแพรใหคนอนไดทราบทางอนเทอรเนต
การสงขาวสารผานเครอขายอนเทอรเนตไปยงผ อน
การเขยนขอความบนคอมพวเตอรแลวสงขอความนนไปยงผ รบ
137
ประโยชนของนวสกรปทสาคญทสด คออะไร
สงขาวสารถงกนไดทวโลก
แสดงความคดเหนถงกนไดทวโลก
การซอขายสนคาบนอนเทอรเนต
การสนทนากนเปนกลมๆ มากกวา 15,000 กลม
560
ภาคผนวก
138 ถาตองการสนทนาเกยวกบการสงยานอวกาศไปดาวองคาร เราตองเลอกกลมขาวใด
biz sci soc misc
139 การสมครเปนสมาชกกลมขาวนนมขนตอนการปฏบตหลายขนตอน ยกเวน ขอใด
คลกเลอกคาสง Subscribe to
Newsgroups
คลกเลอกรายการกลมขาว แลวคลกป ม Subscribe
คลกเลอกกลมขาวหลายๆ กลมตามตองการ
คลกป ม Send
เมอตองการสงชอของเราไปยงกลมขาว
140 กลมขาว rec เปนการแสดงความคดเหนเกยวกบขอใด
กลมวทยาศาสตร
กลมสงคมศาสตร
กลมสนทนาการ
กลมสพเพเหระ
141 ขอใดไมใชมารยาททดในการใชนวสกรป
ใชภาษาสภาพ บนทกรายชอสมาชกทกคนไว
สงขอความใหตรงกลมขาว
ตรวจสอบความเหมาะสมกอนสง
142 ขอใดไมใชบรการของ pantip.com
Caf? Techxchange Icq E-card
143 ถามสมาชกใหมเขารวมวงสนทนาใน pantip.com จะสงเกตไดอยางไร
มขอความวา Log in อยหลงขอความ
มขอความวา Log out อยหลงขอความ
มขอความวา Logged on
อยหลงขอความ
มขอความวา Logged off อยหลงขอความ
144 จดเดนททาให pantip.com
ไดรบความนยมคออะไร ใชงานงาย มหวขอสนทนา
หลากหลาย สามารถปรบแตงหนาจอไดสวยงาม
ผสนทนารกษามารยาทในการสนทนาด
145 การสนทนาใน sanook.com
คลกในหวขออะไร Chat Room กระดานขาว หองสนทนา ทนมเพอน
146 ขอแตกตางระหวาง sanook.com กบ Chat Room
อนๆ คออะไร
ใชงานงายกวา ใช Java
Applet
ใชสนทนาไดครบทกหวขอ
ใชรหสผานทปองกนความเสยหายไดด
147 ขอเดนของการสนทนาแบบไอซควคออะไร
การสนทนาพรอมกนไดหลายๆ คน
เลอกสนทนาเฉพาะคนได
สนทนาแบบกระซบโดยไมใหคนอนทราบได
สนทนาไดรวดเรวและสอสารไดทวโลก
148 การคนหาหมายเลขไอซควมขอควรระวงอยางไร
ควรใชชอจรง-นามสกลจรง
ควรกาหนดอเมลแอดเดรสใหชดเจน
ควรกาหนดทงชอเลนและชอจรง
ถกทกขอ
561
ภาคผนวก
149 ขอใดเปนโปรแกรมประเภท IRC Go!Zilla CuteFTP PIRCH Teleport Pro
150 การสนทนาดวย PIRCH
ขอความทอยใน <……...>
หมายถงอะไร
ชอผสนทนา ชอบคคลทเราสนทนาดวย
ขอความทกาลงสนทนากน
บอกเวลาในการสนทนา
151 ขอใดเปน Web Chat ยอดนยมของชาวไทย
www.deja.co
m
www.wbs.co
m
www.chattppi
a.com
www.pantip.c
om
152 เอฟทพ คออะไร การดาวนโหลดไฟล
โปรแกรมสาหรบดาวนโหลดไฟล
โปรแกรมสาหรบแกไขปรบปรงไฟล
ศนยรวมโปรแกรมทอนญาตใหใชโดยไมมลขสทธ
153 เอฟทพแบงออกเปน 2 ชนด คอ ไพรเวทและสาธารณะ
สาธารณะและเฉพาะบคคล
ภายในองคกรและภายนอกองคกร
จากดจานวนผใชและไมจากดจานวนผใช
154 ไฟลบนโฮสตแบงออกเปนกประเภท
2 ประเภท 3 ประเภท 4 ประเภท 5 ประเภท
155 แชรแวรมลกษณะสาคญคออะไร
เปนไฟลทแจกฟร
เปนไฟลใหทดลองใช
เปนไฟลซอขาย เปนไฟลเผยแพรแกสาธารณะ
156 โปรแกรมทนยมดาวนโหลดมากทสดคอโปรแกรมประเภทใด
ฟรแวร แชรแวร คอมเมอรเชยลแวร
ถกทกขอ
157 ขอเดนของโปรแกรม GetRight
คออะไร ตงเวลาดาวนโหลดได
ดาวนโหลดไฟลขนาดใหญไดอยางรวดเรว
เชอมตอใหถาสายหลดขณะดาวนโหลด
ถกทกขอ
158 จดออนของโปรแกรม Teleport
Pro คออะไร ใชงานแบบออฟไลนไมได
ตองซอลขสทธกอนใช
ใหทดลองใชกอน แตตองซอไมแจกฟร
ดาวนโหลดไฟลขนาดใหญไดชามาก
159
โปรแกรม Go!Zilla มขอเดนทสดคออะไร
มลกเลนในการใชงานมาก
สามารถดาวนโหลดพรอมกนทละหลายๆ ไฟลได
เปนโปรแกรมแจกฟร
ใชงานงาย มลกเลนตางๆ ใหเลอกใชจานวนมาก
562
ภาคผนวก
160
ขอควรระวงในการใชโปรแกรม
WS-FTP คออะไร การดาวนโหลดไฟลหลายๆ ไฟลพรอมกน
การเปลยนนามสกลไฟลขณะถายโอน
การคลกแลวลาก
การลบไฟลแบบตอเนอง
161 คณสมบตททาใหโปรแกรม
Cute FTP ไดรบความนยมคออะไร
สามารถดาวนโหลดไฟลแบบตอเนองได
หยดการดาวนโหลดโดยไมเสยการตดตออนเทอรเนต
จดลาดบการถายโอนขอมลตามลาดบทเลอกไว
สามารถสรางเวบมเรอรของเวบไซตทงหมด
162 การถายโอนขอมลแบงออกเปนกสวน
2 สวน 3 สวน 4 สวน 5 สวน
163 การดาวนโหลดขอมลควรเลอกเวลาใดจงเหมาะสม
กลางวน กลางคน ตอนเชา ตามความสามารถ
164 การตรวจสอบโปรแกรมกอนดาวนโหลดมวตถประสงคเพออะไร
ปองกนการดาวนโหลดผดพลาด
ตรวจสอบประเภทของไฟลโดยละเอยด
ปองการการดาวนโหลดซาซอน
สามารถเพมความเรวในการดาวนโหลดได
165 การบบอดไฟลและขยายไฟลมผลตอการดาวนโหลดอยางไร
ทาใหดาวนโหลดไดชาหรอเรวขน
ทาใหการตอสายอนเทอรเนตหลดบอยๆ
ทาใหชมสายมจานวนผใชเพมมากขน
ทาใหไฟลทไดรบการดาวนโหลดบกพรองได
166 การคนหาไฟลในเอฟทพไซตทไดรบความนยมคอเวบไซตใด
yahoo.com download.co
m
pantip.com hansa.com
ดรรชน
564
ดรรชน
A
Application Software, 22
Arithmetic and Logic Unit, 12
Arithmetic Assignment Operator, 135
Arithmetic Operators, 130
Array of String, 258
Array Structure, 225
Assembler, 26
Assembly Language Program, 25
Assignment Operator, 156
Automatic Size of Array, 250
Automatic Variable, 102
B
Basic Input Output System, 12
Binary, 130
Binary File, 394, 416
Binary Search, 468
Bitwise Operators, 151
Bubble Sort, 477
565
C
Character, 82, 93
Character Constant, 106
Comment, 78
Compile, 70
Compiler, 21, 26
Computer Language, 24
Concurrent Validity, 494
Condition Operators, 159
Condition Statement, 173
Constant, 80, 105
Construct Validity, 493
Content Validity, 493
Crossover, 502, 517
D
Data Operation, 32
Declarations of Pointer, 357
Defined constant, 109
Design Phase, 37
Difficulty, 487
Discrimination, 490
Double Precision Floating Point, 82
566
E
Efficiency, 493
Electronic Data Processing Manager, 17
Elitist Strategy, 504
Escape Sequence, 83
Evolutionary Computation, 496
Execute Instruction, 28
Explicit Type Conversion, 144
Expression, 130
External Variable, 92
F
Fairness, 493
File, 393
Fitness Function, 496, 500, 510
Floating Point, 81, 96
Floating Point Arithmetic Operator, 134
Floating Point Constant, 106
Flowchart Analysis, 42
Flowchart Symbol, 38
Function, 75
Function Interface, 268
567
G
Gene, 495
General Purpose Computer, 3
Genetic Algorithm, 495, 497
Genetic Operation, 502
Global Variable, 100, 298
H
Handheld Computer, 8
Hardware, 15
High Level Language, 24
I
Implementation Phase, 37
Implicit Type Conversion, 142
Increment and Decrement Operator, 137
Initial Population, 497, 499
Initialization of Pointer, 365
Insertion Sort, 475
Instruction Address Calculation, 31
Instruction Fetch, 28, 31
Instruction Operation Decoding, 31
Integer Arithmetic Operator, 133
Integer Constant, 105
568
Integer, 80, 94
Integration Phase, 37
Item Analysis, 485
Iteration Control, 56
J
Jump Control, 62
Jump Statement, 213
L
Least Square, 448
Linear Regression, 448
Literal Constant, 109
Local Variable, 100, 300
Logical Operators, 145
Long Double Precision Floating Point, 82
Long Integer, 81, 94
Low Level Language, 24
M
Machine language, 24
Mainframe Computer, 4
Maintenance Phase, 37
Mating pool, 497
Mean Absolute Deviation, 454, 455
Mean Absolute Percentage Error, 454, 456
569
Mean Percentage Error, 454, 455
Mean Square Error, 454, 455
Measures of Central Tendency, 433
Median, 435
Memory Constant, 110
Microcomputer, 6
Microprocessor, 6
Minicomputer, 5
Mode, 438
Multi Tasking, 4
Multi User, 4
Mutation, 502, 519
N
Notebook, 7
O
Object Function, 496
Objectivity, 492
One-Dimensional Array, 227
Operand, 130
Operand Address Calculation, 32
Operand Store, 32
Operating System, 20
Operation Fetch, 32
Operator, 17, 129
Overflow, 87,93, 95
570
P
Package Software, 23
Planning Phase, 37
Pointer and Array, 374
Pointer of Pointer, 369
Precedence, 159
Predictive Validity, 494
Preprocessing Directives, 74
Program Statement, 76
Programmer, 17
Pseudo Code, 40
Q
Quartile Deviation, 442
Quartile Range, 442
R
Random Access Memory, 13
Random Access, 421
Range, 440
Read Only Memory, 12
Register Variable, 302
Register Variable, 92
Regression Equation, 447
Regression Line, 448
Relational Operators, 148
571
Reliability, 494
Repetition Statement, 196
Requirement Phase, 36
Retirement, 37
S
Searching, 464
Selection Control, 50
Selection Sort, 472
Sequential Control, 47
Sequential Search, 464
Sequential Statement, 172
Short Integer, 94
Single-Board Computers, 9
Software, 15, 18
Sorting, 464, 472
Special Purpose Computer, 3
Specification Phase, 36
Standard Deviation, 445
Standard Library Functions, 269
State Diagram, 31
Static Variable, 103
Static Variable, 301
String, 84, 107
Structure, 307
Supercomputer, 3
572
Symbol, 84
Symbol of Pointer, 354
System Analysis, 17
System Programmer, 17
System Software, 19
System Utilities, 22
T
Tablet Computer, 7
Ternary, 130
Testing and Debugging, 46
Text File, 394, 395
Three-Dimension Array, 245
Two-Dimensional Array, 236
U
Unary, 130
Underflow, 87, 93, 95
Unions, 330
Unsigned Integer, 81
Unsigned Long Integer, 81
User, 17
User-Defined Functions, 281
573
V
Variables, 85, 97
Variable Declaration, 75, 85
Variable Declaration of Functions, 298
Variance, 445
void, 93
W
Waterfall Model, 35