262
เอกสารประกอบการสอน รายวิชาการเขียนโปรแกรมเชิงโครงสรางและอัลกอริทึ่ม พันทิพย คูอมรพัฒนะ คณะวิทยาศาสตรและเทคโนโลยี มหาวิทยาลัยราชภัฏธนบุรี 2556

Structured Programming and Algorithm

Embed Size (px)

DESCRIPTION

เอกสารประกอบการสอน รายวิชาการเขียนโปรแกรมเชิงโครงสร้างและอัลกอริทึ่ม โดย อ.พันทิพย์ คูอมรพัฒนะ

Citation preview

เอกสารประกอบการสอน

รายวิชาการเขียนโปรแกรมเชิงโครงสร�างและอัลกอรทิึ่ม

พันทิพย� คูอมรพัฒนะ

คณะวิทยาศาสตร�และเทคโนโลยี

มหาวิทยาลัยราชภัฏธนบุรี

2556

เอกสารประกอบการสอน

รายวิชาการเขียนโปรแกรมเชิงโครงสร�างและอัลกอรทิึ่ม

พันทิพย� คูอมรพัฒนะ

วท.ม. (เทคโนโลยีสารสนเทศทางธุรกิจ)

คณะวิทยาศาสตร�และเทคโนโลยี

มหาวิทยาลัยราชภัฏธนบุรี

2556

คํานํา เอกสารประกอบการสอน รายวิชาการเขียนโปรแกรมเชิงโครงสร�างและอัลกอริท่ึม (Structured Programming and Algorithm) รหัสวิชา 4122301 พัฒนามาจากหนังสือและตําราหลักๆ หลายเล=มและข�อมูลทางอินเทอร?เน็ต จุดประสงค?เพ่ือจะใช�เปDนเอกสารประกอบการสอนให�กับนักศึกษาหลักสูตรวิทยาศาสตรบัณฑิต สาขาวิชาวิทยาการคอมพิวเตอร? ผู�เรียบเรียงได�จัดระบบเนื้อหาให�เข�ากับหลักสูตรท่ีได�มีการปรับปรุงหลักสูตรเม่ือปL พ.ศ. 2555 โดยได�จัดเนื้อหาไว�เปDนหมวดหมู=เพ่ือให�ง=ายต=อการเรียนรู� จึงหวังเปDนอย=างยิ่งว=า จะเปDนประโยชน?แก=นักศึกษาและอาจารย?ผู�สอน เนื้อหาเอกสารประกอบการสอนนี้ ประกอบด�วย แนวคิดในการเขียนโปรแกรม การเขียนโปรแกรมเชิงโครงสร�าง เริ่มต�นการเขียนโปรแกรมเชิงโครงสร�าง โครงสร�างแบบลําดับและแบบเลือก โครงสร�างแบบวนรอบ ตัวแปรอาเรย? ฟPงก?ชั่น ตัวแปรโครงสร�าง และแฟQมข�อมูล โดยเนื้อหาของเอกสารประกอบการสอนเล=มนี้ใช�โปรแกรมภาษาคอมพิวเตอร?คือ ภาษาซี เปDนเครื่องมือท่ีใช�ในการเขียนโปรแกรมเชิงโครงสร�าง สุดท�ายจึงหวังเปDนอย=างยิ่งว=า เอกสารประกอบการสอนนี้ น=าจะเปDนประโยชน?ต=อวงการศึกษาท้ังในปPจจุบันและอนาคตตามสมควร หากท=านท่ีนําไปใช�มีข�อเสนอแนะผู�เขียนยินดีรับฟPงและขอขอบพระคุณในความอนุเคราะห?นั้น ณ โอกาสนี้ด�วย พันทิพย? คูอมรพัฒนะ 31 พฤษภาคม 2556

สารบัญ หนา คํานํา ........................................................................................................................................................... (1) สารบัญ ....................................................................................................................................................... (2) สารบัญภาพ ................................................................................................................................................ (5) สารบัญตาราง ............................................................................................................................................. (15) แผนบริหารการสอนประจําวิชา ................................................................................................................. (17) แผนบริหารการสอนประจําบทท่ี 1 .................................................................................................. 1 บทท่ี 1 แนวคิดในการเขียนโปรแกรม ..................................................................................... 3 บทนํา .................................................................................................................................... 3 ทําไมต%องเขียนโปรแกรม ...................................................................................................... 3 โปรแกรมและภาษาคอมพิวเตอร- ......................................................................................... 5 โปรแกรมทํางานได%อย/างไร .................................................................................................... 8 ข้ันตอนวิธีการพัฒนาโปรแกรม .............................................................................................. 9 อัลกอริท่ึม ............................................................................................................................... 21 ผังงาน ..................................................................................................................................... 21 รหัสเทียม ................................................................................................................................ 24 สรุป ........................................................................................................................................ 24 คําถามทบทวน ....................................................................................................................... 25 เอกสารอ%างอิง ......................................................................................................................... 26 แผนบริหารการสอนประจําบทท่ี 2 .................................................................................................. 27 บทท่ี 2 การเขียนโปรแกรมเชิงโครงสราง ................................................................................ 29 บทนํา ..................................................................................................................................... 29 การเขียนโปรแกรมเชิงโครงสร%าง ........................................................................................... 29 โครงสร%างแบบลําดับ .............................................................................................................. 29 โครงสร%างแบบเลือก ............................................................................................................... 31 โครงสร%างแบบวนรอบ ............................................................................................................ 36 ทําความรู%จักภาษาซี ............................................................................................................... 44 สรุป ........................................................................................................................................ 45 คําถามทบทวน ....................................................................................................................... 46 เอกสารอ%างอิง ......................................................................................................................... 47 แผนบริหารการสอนประจําบทท่ี 3 .................................................................................................. 49 บทท่ี 3 การเขียนโปรแกรมเชิงโครงสราง ................................................................................ 51 บทนํา ..................................................................................................................................... 51 โปรแกรมแรกในภาษาซี ......................................................................................................... 51

(10)

โครงสร%างของโปรแกรมภาษาซี ............................................................................................. 52 การใส/คําอธิบายในภาษาซี ..................................................................................................... 54 ตัวแปร .................................................................................................................................... 55 ค/าคงท่ี .................................................................................................................................... 64 การแสดงผลข%อมูลจากตัวแปร ............................................................................................... 66 การนําตัวแปรไปใช%ในการประมวลผลหรือคํานวณ ............................................................... 73 การรับค/ามาเก็บไว%ในตัวแปร ................................................................................................. 74 การดําเนินการ ........................................................................................................................ 75 ลําดับการทํางานของโอเปอเรเตอร- ........................................................................................ 83 การจัดรูปแบบของการเขียนรหัสต%นฉบับของโปรแกรม ....................................................... 84 สรุป ........................................................................................................................................ 85 คําถามทบทวน ....................................................................................................................... 87 เอกสารอ%างอิง ......................................................................................................................... 89 แผนบริหารการสอนประจําบทท่ี 4 .................................................................................................. 91 บทท่ี 4 โครงสรางแบบลําดับและแบบเลือก ............................................................................ 93 บทนํา ..................................................................................................................................... 93 การเขียนโปรแกรมเชิงโครงสร%างแบบลําดับ ......................................................................... 93 การเขียนโปรแกรมเชิงโครงสร%างแบบเลือก ........................................................................... 95 สรุป ........................................................................................................................................106 คําถามทบทวน .......................................................................................................................107 เอกสารอ%างอิง .........................................................................................................................109 แผนบริหารการสอนประจําบทท่ี 5 ................................................................................................. 111 บทท่ี 5 โครงสรางแบบวนรอบ ................................................................................................ 113 บทนํา .....................................................................................................................................113 การเขียนโปรแกรมเชิงโครงสร%างแบบวนรอบแบบทดสอบเง่ือนไขก/อน ............................... 113 การเขียนโปรแกรมเชิงโครงสร%างแบบวนรอบแบบทดสอบเง่ือนไขหลัง ............................... 118 การเขียนโปรแกรมเชิงโครงสร%างแบบวนรอบแบบจํานวนรอบท่ีแน/นอน ............................. 120 การแสดงผลท่ีหน%าจอคอมพิวเตอร- ........................................................................................126 การเขียนโปรแกรมเชิงโครงสร%างแบบวนรอบซ%อนกัน ............................................................127 สรุป ........................................................................................................................................134 คําถามทบทวน .......................................................................................................................136 เอกสารอ%างอิง .........................................................................................................................138 แผนบริหารการสอนประจําบทท่ี 6 .................................................................................................. 139 บทท่ี 6 ตัวแปรอาเรย. ............................................................................................................. 141 บทนํา .....................................................................................................................................141 ทําความรู%จักกับตัวแปรอาเรย- .................................................................................................141 ตัวแปรอาเรย- 1 มิติ ................................................................................................................144

(11)

ตัวแปรอาเรย- 2 มิติ ................................................................................................................152 ตัวแปรอาเรย-หลายมิติ ............................................................................................................156 สรุป ........................................................................................................................................157 คําถามทบทวน .......................................................................................................................158 เอกสารอ%างอิง .........................................................................................................................159 แผนบริหารการสอนประจําบทท่ี 7 .................................................................................................. 161 บทท่ี 7 ฟ0งก.ช่ัน ...................................................................................................................... 163 บทนํา .....................................................................................................................................163 ฟDงก-ชั่นคืออะไร ......................................................................................................................163 ฟDงก-ชั่นมาตรฐานของภาษาซี .................................................................................................165 ฟDงก-ชั่นสร%างเอง ......................................................................................................................166 ฟDงก-ชั่นสร%างเองท่ีไม/มีการรับค/าเข%ามาในฟDงก-ชั่น และไม/มีการส/งค/ากลับออกไปจากฟDงก-ชั่น 167 ฟDงก-ชั่นสร%างเองท่ีมีการรับค/าเข%ามาในฟDงก-ชั่น แต/ไม/มีการส/งค/ากลับออกไปจากฟDงก-ชั่น .... 169 ฟDงก-ชั่นสร%างเองท่ีมีการรับค/าเข%ามาในฟDงก-ชั่น และมีการส/งค/ากลับออกไปจากฟDงก-ชั่น ...... 172 ฟDงก-ชั่นสร%างเองท่ีไม/มีการรับค/าเข%ามาในฟDงก-ชั่น แต/มีการส/งค/ากลับออกไปจากฟDงก-ชั่น ..... 175 รูปแบบของการจัดวางฟDงก-ชั่นสร%างเองไว%ในโปรแกรม ...........................................................176 ฟDงก-ชั่นการเรียกซํ้า .................................................................................................................177 สรุป ........................................................................................................................................182 คําถามทบทวน .......................................................................................................................183 เอกสารอ%างอิง .........................................................................................................................185 แผนบริหารการสอนประจําบทท่ี 8 .................................................................................................. 187 บทท่ี 8 ตัวแปรโครงสราง ....................................................................................................... 189 บทนํา .....................................................................................................................................189 ตัวแปรโครงสร%างคืออะไร .......................................................................................................189 การประกาศตัวแปรโครงสร%าง ................................................................................................189 การกําหนดค/าเริ่มต%นให%กับสมาชิกของตัวแปรโครงสร%าง ...................................................... 192 การเข%าถึงสมาชิกแต/ละตัวของตัวแปรโครงสร%าง ................................................................... 193 ตัวแปรอาเรย-ของตัวแปรโครงสร%าง ........................................................................................196 สรุป ........................................................................................................................................200 คําถามทบทวน .......................................................................................................................201 เอกสารอ%างอิง .........................................................................................................................202 แผนบริหารการสอนประจําบทท่ี 9 .................................................................................................. 203 บทท่ี 9 แฟ3มขอมูล ................................................................................................................. 205 บทนํา .....................................................................................................................................205 แฟGมข%อมูลคืออะไร .................................................................................................................205 การดําเนินการกับแฟGมข%อมูล .................................................................................................205 แฟGมข%อมูลประเภทเท็กซ-ไฟล- .................................................................................................206

(12)

แฟGมข%อมูลประเภทไบนารีไฟล- ...............................................................................................221 สรุป ........................................................................................................................................226 คําถามทบทวน .......................................................................................................................227 เอกสารอ%างอิง .........................................................................................................................228 บรรณานุกรม .................................................................................................................................. 229 ภาคผนวก ........................................................................................................................................ 230

สารบัญภาพ ภาพท่ี หน�า 1.1 การดําเนินชีวิตประจําวันผ�านโทรศัพท�เคลื่อนท่ีหรือมือถือ ................................................................... 3 1.2 โปรแกรมบัญชี ACCPAC ...................................................................................................................... 4 1.3 ตู-เอทีเอ็มกรุงไทย ................................................................................................................................... 4 1.4 เมนเฟรมของกรมอุตุนิยมวิทยา ประเทศสหรัฐอเมริกา ......................................................................... 4 1.5 ยาน Curiosity ไปสํารวจดาวอังคารขององค�การนาซา ......................................................................... 4 1.6 Facebook มรธ. สป. ............................................................................................................................ 5 1.7 โปรแกรม Line ...................................................................................................................................... 5 1.8 ตัวอย�างของคําสั่งในภาษาแอสเซมบลี ................................................................................................... 6 1.9 ตัวอย�างของรหัสต-นฉบับของโปรแกรมในภาษาระดับสูง ...................................................................... 7 1.10 กระบวนการแปลภาษาซี ..................................................................................................................... 8 1.11 กระบวนการการทํางานพ้ืนฐานของคอมพิวเตอร� ................................................................................ 10 1.12 การต-มไข� ............................................................................................................................................. 10 1.13 การอุ�นอาหารด-วยเตาไมโครเวฟ ......................................................................................................... 11 1.14 การข้ึนลิฟท� ......................................................................................................................................... 11 1.15 เครื่องคิดเลข ....................................................................................................................................... 11 1.16 รูปสามเหลี่ยม ..................................................................................................................................... 12 1.17 รหัสต-นฉบับของโปรแกรมหาผลคูณของเลขจํานวนเต็ม 2 จํานวน ..................................................... 18 1.18 ผลลัพธ�ของโปรแกรมหาผลคูณของเลขจํานวนเต็ม 2 จํานวน ............................................................. 19 1.19 รหัสต-นฉบับของโปรแกรมหาพ้ืนทีสามเหลี่ยม .................................................................................... 19 1.19 ผลลัพธ�ของโปรแกรมหาพ้ืนทีสามเหลี่ยม ............................................................................................ 20 1.20 ผลลัพธ�ของโปรแกรมหาพ้ืนทีสามเหลี่ยม ............................................................................................ 20 2.1 ผังงานของโครงสร-างแบบลําดับ ............................................................................................................ 30 2.2 ผังงานของโครงสร-างแบบเลือก(หนึ่งทางเลือก) ..................................................................................... 31 2.3 ผังงานของโครงสร-างแบบเลือก(สองทางเลือก) ..................................................................................... 32 2.4 ผังงานของโครงสร-างแบบเลือกแบบหลายทางเลือก .............................................................................. 34 2.5 ผังงานของโครงสร-างแบบวนรอบ(การวนรอบแบบทดสอบเง่ือนไขก�อน) .............................................. 36 2.6 ผังงานของโครงสร-างแบบวนรอบ(การวนรอบแบบทดสอบเง่ือนไขทีหลัง) ............................................ 40 2.7 ผังงานของโครงสร-างแบบวนรอบ(การวนรอบแบบจํานวนรอบท่ีแน�นอน) ............................................ 42 3.1 โปรแกรมแรกในภาษาซี ........................................................................................................................ 51 3.2 ผลลัพธ�ของโปรแกรมแรกในภาษาซี ...................................................................................................... 52 3.3 แสดงโปรแกรม Helloworld พร-อมกับเลขบรรทัดของโปรแกรม ........................................................ 52 3.4 แสดงโครงสร-างของโปรแกรมภาษาซี .................................................................................................... 52 3.5 แสดงส�วนประกอบของพรีโปรเซสเซอร�ไดเร็คทีฟ ................................................................................. 53 3.6 การเขียนฟ[งก�ชั่นหลักหลายรูปแบบ ...................................................................................................... 54 3.7 โปรแกรม Helloworld ท่ีเน-นส�วนรายละเอียดของโปรแกรมในวงรีเส-นประ ...................................... 54 3.8 โปรแกรม comment.c แสดงการใส�คําอธิบาย ................................................................................... 55

(6)

3.9 แสดงบรรทัดท่ีไม�ต-องการให-ทํางาน ....................................................................................................... 55 3.10 แสดงข้ันตอนของการใช-เครื่องคิดเลขในการหาผลลัพธ� ...................................................................... 56 3.11 แสดงข้ันตอนของการใช-หาผลลัพธ� ..................................................................................................... 57 3.12 โปรแกรมรับและแสดงตัวเลข .............................................................................................................. 57 3.13 โปรแกรมรับและแสดงตัวเลข .............................................................................................................. 57 3.14 รูปแบบการประกาศตัวแปร ................................................................................................................ 59 3.14 โปรแกรมแสดงการประกาศตัวแปรชนิดข-อมูลต�างๆ .......................................................................... 60 3.15 โปรแกรมแสดงการกําหนดค�าเริ่มต-นให-กับตัวแปรชนิดข-อมูลต�างๆ .................................................. 60 3.16 โปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอล .................................................... 61 3.17 ผลลัพธ�ของโปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอล ................................. 61 3.18 โปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอลท่ีมีข-อผิดพลาด ........................... 62 3.19 ผลลัพธ�ของการรันโปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอลท่ีมีข-อผิดพลาด 62 3.20 คําสงวนในภาษาซี ............................................................................................................................... 63 3.21 โปรแกรมแสดงค�าคงท่ีแบบ Literal ................................................................................................... 64 3.22 ผลลัพธ�ของโปรแกรมแสดงค�าคงท่ีแบบ Literal ................................................................................. 64 3.23 รูปแบบการใช-ค�าคงท่ีแบบ Defined ................................................................................................... 64 3.24 โปรแกรมแสดงค�าคงท่ีแบบ Literal .................................................................................................... 65 3.25 ผลลัพธ�ของโปรแกรมแสดงค�าคงท่ีแบบ Defined .............................................................................. 65 3.26 รูปแบบการใช-ค�าคงท่ีแบบ Memory .................................................................................................. 65 3.27 โปรแกรมแสดงค�าคงท่ีแบบ Memory ................................................................................................ 65 3.28 ผลลัพธ�ของโปรแกรมแสดงค�าคงท่ีแบบ Memory ............................................................................. 65 3.29 รูปแบบการใช-ฟ[งก�ชั่น printf() ............................................................................................................ 66 3.30 โปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() ................................................................................................ 67 3.31 ผลลัพธ�ของโปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() .............................................................................. 67 3.32 แสดงข้ันตอนการทํางานของฟ[งก�ชั่น printf() กับชนิดข-อมูลแบบเลขจํานวนเต็ม .............................. 67 3.33 แสดงข้ันตอนการทํางานของฟ[งก�ชั่น printf() กับชนิดข-อมูลแบบตัวอักขระ ....................................... 68 3.34 แสดงข้ันตอนการทํางานของฟ[งก�ชั่น printf() กับชนิดข-อมูลแบบเลขทศนิยม .................................... 68 3.35 โปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิด ข-อมูลแบบเลขจํานวนเต็ม ................................................................................................................... 68 3.36 ผลลัพธ�ของโปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�าหนึ่ง ตัวของชนิดข-อมูลแบบเลขจํานวนเต็ม ................................................................................................ 69 3.37 แสดงข้ันตอนการทํางานของฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัว .......... 69 3.38 โปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิด ข-อมูลแบบตัวอักขระ ........................................................................................................................... 69 3.39 ผลลัพธ�ของโปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�า หนึ่งตัวของชนิดข-อมูลแบบตัวอักขระ ................................................................................................. 70 3.40 โปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิด ข-อมูลแบบผสม ................................................................................................................................... 70 3.41 ผลลัพธ�ของโปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�าหนึ่ง ตัวของชนิดข-อมูลแบบผสม ................................................................................................................ 70

(7)

3.42 แสดงข้ันตอนการทํางานของฟ[งก�ชั่น printf() กับรายการข-อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัว ของชนิดข-อมูลแบบผสม ..................................................................................................................... 71 3.43 แสดงการใช-รหัสควบคุม \n ................................................................................................................ 71 3.44 รหัสควบคุม ......................................................................................................................................... 71 3.45 โปรแกรมแสดงการใช-รหัสควบคุม ...................................................................................................... 72 3.46 ผลลัพธ�ของโปรแกรมแสดงการใช-รหัสควบคุม ................................................................................... 72 3.47 โปรแกรมแสดงการใช-เครื่องหมายทางคณิตศาสตร�ในการคํานวณ .................................................... 73 3.48 ผลลัพธ�ของโปรแกรมแสดงการใช-เครื่องหมายทางคณิตศาสตร�ในการคํานวณ .................................. 73 3.49 รูปแบบการใช-ฟ[งก�ชั่น scanf() ............................................................................................................ 74 3.50 โปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() และ scanf() ของการรับตัวเลข 2 ตัวมาบวกกัน ................. 74 3.51 ผลลัพธ�ของโปรแกรมแสดงการใช-ฟ[งก�ชั่น printf() และ scanf() ของการรับตัวเลข 2 ตัวมาบวกกัน 75 3.52 แสดงความสัมพันธ�ระหว�างโอเปอเรเตอร� โอเปอแรนด� และนิพจน� .................................................... 76 3.53 โปรแกรมแสดงการใช-งานโอเปอเรเตอร�การกําหนดค�า (1) ................................................................. 77 3.54 ผลลัพธ�ของโปรแกรมแสดงการใช-งานโอเปอเรเตอร�การกําหนดค�า (1) ............................................... 77 3.55 โปรแกรมแสดงการใช-งานโอเปอเรเตอร�การกําหนดค�า (2) ................................................................. 78 3.56 ผลลัพธ�ของโปรแกรมแสดงการใช-งานโอเปอเรเตอร�การกําหนดค�า (2) ............................................... 78 3.57 โปรแกรมแสดงการใช-โอเปอเรเตอร�การกําหนดค�า (3) ....................................................................... 79 3.58 ผลลัพธ�ของโปรแกรมแสดงการใช-โอเปอเรเตอร�การกําหนดค�า (3) ..................................................... 79 3.59 โปรแกรมแสดงการใช-โอเปอเรเตอร�ทางด-านคณิตศาสตร� 2 ประเภทหลัง .......................................... 80 3.60 ผลลัพธ�ของโปรแกรมแสดงการใช-โอเปอเรเตอร�ทางด-านคณิตศาสตร� 2 ประเภทหลัง ........................ 81 3.61 โปรแกรมแสดงการใช-โอเปอเรเตอร�ทางด-านคณิตศาสตร� 2 ประเภทหลังเปcนโครงสร-างแบบวน รอบท่ีมีการวนรอบแบบจํานวนรอบท่ีแน�นอน .................................................................................... 81 3.62 ผลลัพธ�ของโปรแกรมแสดงการใช-โอเปอเรเตอร�ทางด-านคณิตศาสตร� 2 ประเภทหลังเปcนโครง สร-างแบบวนรอบท่ีมีการวนรอบแบบจํานวนรอบท่ีแน�นอน ............................................................... 81 3.63 โปรแกรมแสดงการใช-โอเปอเรเตอร�ทางตรรกะ ................................................................................... 83 3.64 ผลลัพธ�ของโปรแกรมแสดงการใช-โอเปอเรเตอร�ทางตรรกะ ................................................................ 83 3.63 โปรแกรมแสดงการใช-ลําดับความสําคัญของการทํางานของโอเปอเรเตอร� ......................................... 84 3.64 ผลลัพธ�ของโปรแกรมแสดงการใช-ลําดับความสําคัญของการทํางานของโอเปอเรเตอร� ....................... 84 3.65 รหัสต-นฉบับ 3 รูปแบบของโปรแกรมแสดงตัวเลขต้ังแต� 1 จนถึงเลขท่ีระบุไว- .................................... 84 3.66 แสดงการเยื้องของรหัสต-นฉบับของโปรแกรมแสดงตัวเลขต้ังแต� 1 จนถึงเลขท่ีระบุไว- ........................ 85 4.1 โปรแกรมแสดงข-อมูลส�วนตัวของนายดํา ............................................................................................... 93 4.2 ผลลัพธ�ของโปรแกรมแสดงข-อมูลส�วนตัวของนายดํา ............................................................................. 93 4.3 โปรแกรมแสดงการคํานวณผลคูณของเลข 2 จํานวน ............................................................................ 94 4.4 ผลลัพธ�ของโปรแกรมแสดงการคํานวณผลคูณของเลข 2 จํานวน ......................................................... 94 4.5 การเข-าใช-งานเว็บไซต� facebook.com ................................................................................................ 95 4.6 รูปแบบการใช-คําสั่ง if ............................................................................................................................ 96 4.7 รูปแบบการใช-คําสั่ง if ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเปcนจริงหรือเท็จ ............................................. 97 4.8 โปรแกรมแสดงการใช-คําสั่ง if (1) .......................................................................................................... 97 4.9 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง if (1) ....................................................................................... 97 4.10 โปรแกรมแสดงการใช-คําสั่ง if (2) ........................................................................................................ 98

(8)

4.11 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง if (2) ..................................................................................... 98 4.12 โปรแกรมแสดงการใช-คําสั่ง if (3) ........................................................................................................ 98 4.13 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง if (3) ..................................................................................... 99 4.14 รูปแบบการใช-คําสั่ง if-else ................................................................................................................ 99 4.15 รูปแบบการใช-คําสั่ง if-else ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเปcนจริงหรือเท็จ ................................ 100 4.16 โปรแกรมแสดงการใช-คําสั่ง if-else (1) ...............................................................................................100 4.17 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง if-else (2) ............................................................................100 4.18 โปรแกรมแสดงการใช-คําสั่ง if-else (2) ...............................................................................................101 4.19 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง if-else (2) ............................................................................101 4.20 รูปแบบการใช-คําสั่ง if ซ-อน if .............................................................................................................102 4.21 ผังงานของคําสั่ง switch case ............................................................................................................102 4.22 รูปแบบการใช-คําสั่ง switch case ......................................................................................................103 4.23 โปรแกรมแสดงการใช-คําสั่ง if ซ-อน if (1) ...........................................................................................103 4.24 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง if ซ-อน if (1) .........................................................................104 4.25 โปรแกรมแสดงการใช-คําสั่ง if ซ-อน if (2) ...........................................................................................104 4.26 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง if ซ-อน if (2) .........................................................................105 4.27 โปรแกรมแสดงการใช-คําสั่ง switch case ..........................................................................................105 4.28 โปรแกรมแสดงการเขียนโปรแกรมเชิงโครงสร-างแบบเลือกร�วมกับแบบลําดับ .................................. 106 5.1 รูปแบบการใช-คําสั่ง while ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเปcนจริงหรือเท็จ .................................... 113 5.2 โปรแกรมแสดงการใช-คําสั่ง while (1) ..................................................................................................114 5.3 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง while (1) ...............................................................................114 5.4 โปรแกรมแสดงการใช-คําสั่ง while (2) ..................................................................................................115 5.5 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง while (2) ...............................................................................115 5.6 โปรแกรมแสดงการใช-คําสั่ง while (3) ..................................................................................................115 5.7 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง while (3) ................................................................................116 5.8 โปรแกรมแสดงการใช-คําสั่ง while (4) ..................................................................................................116 5.9 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง while (4) ...............................................................................116 5.10 รูปแบบการใช-คําสั่ง do while ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเปcนจริงหรือเท็จ ........................... 118 5.11 โปรแกรมแสดงการใช-คําสั่ง do while (1) .........................................................................................118 5.12 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง do while (1) .......................................................................118 5.13 โปรแกรมแสดงการใช-คําสั่ง do while (2) .........................................................................................119 5.14 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง do while (2) ...................................................................... 120 5.15 รูปแบบการใช-คําสั่ง for ท่ีแสดงข้ันตอนการทํางาน ........................................................................... 120 5.16 โปรแกรมแสดงการใช-คําสั่ง for (1) ....................................................................................................121 5.17 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง for (1) ..................................................................................121 5.18 โปรแกรมแสดงการใช-คําสั่ง for (2) .....................................................................................................122 5.19 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง for (2) ..................................................................................122 5.20 โปรแกรมแสดงการใช-คําสั่ง for (3) .....................................................................................................123 5.21 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง for (3) ..................................................................................123 5.22 โปรแกรมแสดงการใช-คําสั่ง for (4) .....................................................................................................124

(9)

5.23 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง for (4) ..................................................................................124 5.24 โปรแกรมแสดงการใช-คําสั่ง for (5) .....................................................................................................125 5.25 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง for (5) ..................................................................................125 5.26 โปรแกรมแสดงการใช-คําสั่ง for (6) .....................................................................................................125 5.27 ผลลัพธ�ของโปรแกรมแสดงการใช-คําสั่ง for (5) ..................................................................................126 5.28 ทิศทางการแสดงผลท่ีหน-าจอคอมพิวเตอร� ..........................................................................................126 5.29 โปรแกรมการแสดงผลท่ีหน-าจอคอมพิวเตอร� ......................................................................................126 5.30 แสดงหน-าจอของแต�ละคําสั่ง printf() .................................................................................................127 5.31 แสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ............................................................................................128 5.32 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม .............................................................................128 5.33 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 1 ...............................................................129 5.34 ผลลัพธ�ของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 1 ............................................ 130 5.35 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 2 ...............................................................130 5.36 แสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 2 ..............................................................................130 5.37 ผลลัพธ�ของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยม ......................................................130 5.38 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยม ........................................................................131 5.39 ผลลัพธ�ของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยม ......................................................131 5.40 แสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยมกลับหัว ............................................................................132 5.41 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยมกลับหัว ............................................................133 5.42 ผลลัพธ�ของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยมกลับหัว ......................................... 133 5.43 แสดงตัวเลข 321 ในลักษณะรูปสามเหลี่ยม ........................................................................................133 5.44 โปรแกรมแสดงตัวเลข 321 ในลักษณะรูปสามเหลี่ยม ........................................................................134 5.45 ผลลัพธ�ของโปรแกรมแสดงตัวเลข 321 ในลักษณะรูปสามเหลี่ยม ..................................................... 134 6.1 โปรแกรมรับตัวเลขผ�าน 1 ตัวแปร ........................................................................................................141 6.2 ผลลัพธ�ของโปรแกรมรับตัวเลขผ�าน 1 ตัวแปร ......................................................................................141 6.3 โปรแกรมรับคะแนนของนักศึกษา 20 คน .............................................................................................142 6.4 โปรแกรมรับคะแนนของนักศึกษา 20 คนโดยใช-ตัวแปรอาเรย� ............................................................. 143 6.5 การเปรียบเทียบตัวแปรท่ัวไปกับตัวแปรอาเรย�ในการเก็บค�า ................................................................143 6.6 แสดงตัวแปรอาเรย� 1 มิติ ......................................................................................................................144 6.7 รูปแบบการประกาศตัวแปรอาเรย� 1 มิติ ...............................................................................................144 6.8 ตัวแปรอาเรย� x .....................................................................................................................................144 6.9 ตัวแปรอาเรย� C .....................................................................................................................................144 6.10 รูปแบบการกําหนดค�าเริ่มต-นให-กับตัวแปรอาเรย� 1 มิติ แบบท่ี 1 ..................................................... 145 6.11 ตัวแปรอาเรย� a เก็บข-อมูล 246 ..........................................................................................................145 6.12 ตัวแปรอาเรย� R เก็บข-อมูล a, b, c, d และ e ....................................................................................145 6.13 รูปแบบการกําหนดค�าเริ่มต-นให-กับตัวแปรอาเรย� 1 มิติ แบบท่ี 2 ...................................................... 146 6.14 ตัวแปรอาเรย� b เก็บข-อมูล 2, 4, 6 และ 8 .........................................................................................146 6.15 ตัวแปรอาเรย� R เก็บข-อมูล xyz ..........................................................................................................146 6.16 ตัวแปรอาเรย� C เก็บข-อมูล Hello World .........................................................................................147 6.17 รูปแบบการเข-าถึงข-อมูลในตัวแปรอาเรย� 1 มิติ ..................................................................................148

(10)

6.18 ตัวแปรอาเรย� point ...........................................................................................................................148 6.19 โปรแกรมรับคะแนนวิชาหนึ่งจากนักศึกษา 5 คน โดยใช-ตัวแปรอาเรย� 1 มิติ .................................. 149 6.20 ผลลัพธ�ของโปรแกรมรับคะแนนวิชาหนึ่งจากนักศึกษา 5 คน โดยใช-ตัวแปรอาเรย� 1 มิติ ................ 149 6.21 โปรแกรมการสลับข-อมูลของสมาชิกตัวท่ี 1 กับสมาชิกตัวท่ี 4 ในตัวแปรอาเรย� 1 มิติ ..................... 150 6.22 ผลลัพธ�ของโปรแกรมการสลับข-อมูลของสมาชิกตัวท่ี 1 กับสมาชิกตัวท่ี 4 ในตัวแปรอาเรย� 1 มิติ ... 150 6.23 แสดงวิธีการสลับข-อมูล ........................................................................................................................151 6.24 มิติของตัวแปรอาเรย� 2 มิติ .................................................................................................................152 6.25 แสดงตัวแปรอาเรย� 2 มิติ ....................................................................................................................152 6.26 รูปแบบการประกาศตัวแปรอาเรย� 2 มิติ ............................................................................................153 6.27 ตัวแปรอาเรย� z ...................................................................................................................................153 6.28 ตัวแปรอาเรย� area .............................................................................................................................153 6.29 รูปแบบการกําหนดค�าเริ่มต-นให-กับตัวแปรอาเรย� 2 มิติ ..................................................................... 153 6.30 ตัวแปรอาเรย� m เก็บข-อมูล 2, 4, 6, 8, 10 และ 12 ..........................................................................154 6.31 รูปแบบการเข-าถึงข-อมูลในตัวแปรอาเรย� 2 มิติ ...................................................................................154 6.32 ตัวแปรอาเรย� h เก็บข-อมูล 1, 3, 5, 7, 9 และ 11 .............................................................................154 6.33 โปรแกรมแสดงเลขยกกําลังสองและสามของเลขต้ังแต� 1 ถึง 5 โดยใช-ตัวแปรอาเรย� 2 มิติ .............. 155 6.34 ผลลัพธ�ของโปรแกรมแสดงเลขยกกําลังสองและสามของเลขต้ังแต� 1 ถึง 5 โดยใช-ตัวแปรอาเรย� 2 มิติ ...................................................................................................................................................155 6.35 ตัวแปรอาเรย� 3 มิติ .............................................................................................................................156 6.36 ตัวแปรอาเรย� z ...................................................................................................................................156 7.1 เปรียบเทียบการเขียนโปรแกรมแสดงรูปสามเหลี่ยม 9 แถว 10 รูป แบบไม�ใช-ฟ[งก�ชั่นกับใช-ฟ[งก�ชั่น .. 164 7.2 การเขียนโปรแกรมแสดงรูปสามเหลี่ยม 9 แถว 10 รูป แบบใช-ฟ[งก�ชั่นและคําสั่งวนรอบ for ช�วย ..... 165 7.3 ข้ันตอนการเรียกใช-ฟ[งก�ชั่นสร-างเองจากฟ[งก�ชั่นหลัก ............................................................................166 7.4 รูปแบบของฟ[งก�ชั่นสร-างเอง ..................................................................................................................167 7.5 รูปแบบของฟ[งก�ชั่นสร-างเองประเภทท่ี 1 ..............................................................................................167 7.6 การเรียกใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 1 ...............................................................................................167 7.7 โปรแกรมแสดงรูปสี่เหลี่ยม โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 1 ...........................................................168 7.8 ผลลัพธ�ของโปรแกรมแสดงรูปสี่เหลี่ยม โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 1 ........................................ 168 7.10 ผลลัพธ�ของโปรแกรมแสดงสูตรคูณแม� 2 โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 1 ................................... 169 7.11 รูปแบบของฟ[งก�ชั่นสร-างเองประเภทท่ี 2 ............................................................................................170 7.12 การเรียกใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 2 .............................................................................................170 7.13 โปรแกรมแสดงรูปสี่เหลี่ยมด-วยตัวอักขระท่ีส�งเข-าไป โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 2 ................. 170 7.14 ผลลัพธ�ของโปรแกรมแสดงรูปสี่เหลี่ยมด-วยตัวอักขระท่ีส�งเข-าไป โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 2 171 7.15 โปรแกรมแสดงสูตรคูณแม�ตามท่ีผู-ใช-งานระบุ โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 2 ............................. 171 7.16 ผลลัพธ�ของโปรแกรมแสดงสูตรคูณแม�ตามท่ีผู-ใช-งานระบุ โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 2 ........... 172 7.17 รูปแบบของฟ[งก�ชั่นสร-างเองประเภทท่ี 3 ............................................................................................173 7.18 การเรียกใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 3 .............................................................................................173 7.19 โปรแกรมหาผลบวกของเลข 2 จํานวน โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 3 ...................................... 173 7.20 ผลลัพธ�ของโปรแกรมหาผลบวกของเลข 2 จํานวน โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 3 .................... 174 7.21 โปรแกรมหาผลคูณของเลข 2 จํานวน โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 3 ........................................ 175

(11)

7.22 ผลลัพธ�ของโปรแกรมหาผลคูณของเลข 2 จํานวน โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 3 ...................... 175 7.23 รูปแบบของฟ[งก�ชั่นสร-างเองประเภทท่ี 4 ............................................................................................176 7.24 การเรียกใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 4 .............................................................................................176 7.25 โปรแกรมแสดงตัวอักขระ A โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 4 ....................................................... 176 7.26 ผลลัพธ�ของโปรแกรมแสดงตัวอักขระ A โดยใช-ฟ[งก�ชั่นสร-างเองประเภทท่ี 4 .................................... 176 7.27 โปรแกรมแสดงสูตรคูณแม�ตามท่ีผู-ใช-งานระบุ โดยวางฟ[งก�ชั่นสร-างเองใต-ฟ[งก�ชั่นหลัก ...................... 177 7.28 ข้ันตอนวิธีของการเขียนโปรแกรมแบบการเรียกซํ้า .............................................................................178 7.25 โปรแกรมแสดงแฟคทอเรียล โดยใช-ฟ[งก�ชั่นการเรียกซํ้า .....................................................................179 7.26 ผลลัพธ�ของโปรแกรมแสดงแฟคทอเรียล โดยใช-ฟ[งก�ชั่นการเรียกซํ้า ...................................................179 7.27 โปรแกรมการหาผลรวมของจํานวน n โดยใช-ฟ[งก�ชั่นการเรียกซํ้า .......................................................181 7.28 ผลลัพธ�ของโปรแกรมการหาผลรวมของจํานวน n โดยใช-ฟ[งก�ชั่นการเรียกซํ้า .................................... 181 8.1 รูปแบบการประกาศตัวแปรโครงสร-างแบบท่ี 1 .....................................................................................190 8.2 รูปแบบการประกาศตัวแปรโครงสร-างแบบท่ี 2 .....................................................................................190 8.3 รูปแบบการประกาศตัวแปรโครงสร-างแบบท่ี 3 .....................................................................................191 8.4 รูปแบบการกําหนดค�าเริ่มต-นให-กับสมาชิกของตัวแปรโครงสร-างแบบท่ี 1 และ 2 ............................... 192 8.5 รูปแบบการกําหนดค�าเริ่มต-นให-กับสมาชิกของตัวแปรโครงสร-างแบบท่ี 3 ........................................... 193 8.6 รูปแบบการเข-าถึงสมาชิกแต�ละตัวของตัวแปรโครงสร-าง .......................................................................193 8.7 โปรแกรมแสดงการเข-าถึงสมาชิกแต�ละตัวของตัวแปรโครงสร-าง MyFriend ........................................ 194 8.8 ผลลัพธ�ของโปรแกรมแสดงการเข-าถึงสมาชิกแต�ละตัวของตัวแปรโครงสร-าง MyFriend ..................... 194 8.9 โปรแกรมแสดงการเข-าถึงสมาชิกแต�ละตัวของตัวแปรโครงสร-าง employee ...................................... 195 8.10 ผลลัพธ�ของโปรแกรมแสดงการเข-าถึงสมาชิกแต�ละตัวของตัวแปรโครงสร-าง employee ................. 196 8.11 รูปแบบการประกาศตัวแปรอาเรย�ของตัวแปรโครงสร-างแบบท่ี 1 .......................................................196 8.12 รูปแบบการประกาศตัวแปรอาเรย�ของตัวแปรโครงสร-างแบบท่ี 2 .......................................................196 8.13 รูปแบบการประกาศตัวแปรอาเรย�ของตัวแปรโครงสร-างแบบท่ี 3 .......................................................197 8.14 โปรแกรมแสดงข-อมูลเพ่ือนในชั้นเรียนด-วยตัวแปรอาเรย�ของตัวแปรโครงสร-าง .................................. 198 8.15 ผลลัพธ�ของโปรแกรมแสดงข-อมูลเพ่ือนในชั้นเรียนด-วยตัวแปรอาเรย�ของตัวแปรโครงสร-าง ................ 198 8.16 โปรแกรมรับและแสดงข-อมูลนักศึกษาจํานวน 3 คน ด-วยตัวแปรอาเรย�ของตัวแปรโครงสร-าง ........... 199 8.17 ผลลัพธ�ของโปรแกรมรับและแสดงข-อมูลนักศึกษาจํานวน 3 คน ด-วยตัวแปรอาเรย�ของตัวแปร โครงสร-าง ............................................................................................................................................199 9.1 รูปแบบการประกาศตัวแปรไฟล�พอยเตอร� ............................................................................................206 9.2 รูปแบบการใช-ฟ[งก�ชั่น fopen()ของแฟkมข-อมูลประเภทเท็กซ�ไฟล� .........................................................207 9.3 รูปแบบการใช-ฟ[งก�ชั่น fgetc() ...............................................................................................................208 9.4 รูปแบบการใช-ฟ[งก�ชั่น fgets() ...............................................................................................................208 9.5 รูปแบบการใช-ฟ[งก�ชั่น fputc() ..............................................................................................................209 9.6 รูปแบบการใช-ฟ[งก�ชั่น fputs() ...............................................................................................................209 9.7 รูปแบบการใช-ฟ[งก�ชั่น fprintf() .............................................................................................................209 9.8 รูปแบบการใช-ฟ[งก�ชั่น fscanf() .............................................................................................................210 9.9 รูปแบบการใช-ฟ[งก�ชั่น feof() .................................................................................................................210 9.10 รูปแบบการใช-ฟ[งก�ชั่น fclose() ...........................................................................................................211 9.11 แฟkมข-อมูลประเภทเท็กซ�ไฟล�ชื่อว�า stdwintext.txt .......................................................................... 211

(12)

9.12 โปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt 3 ตัวแรกโดยใช- ฟ[งก�ชั่น fgetc() ...................................................................................................................................211 9.13 ผลลัพธ�ของโปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt 3 ตัวแรก โดยใช-ฟ[งก�ชั่น fgetc() ............................................................................................................212 9.14 แสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt ทีละตัว 3 ตัวแรก ............. 212 9.15 โปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt ท้ังหมด โดยใช- ฟ[งก�ชั่น fgetc() และฟ[งก�ชั่น feof() ....................................................................................................213 9.16 ผลลัพธ�ของโปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt ท้ังหมด โดยใช-ฟ[งก�ชั่น fgetc() และฟ[งก�ชั่น feof() ............................................................................213 9.17 โปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt 2 สตริงแรก สตริงละ 30 ตัว โดยใช-ฟ[งก�ชั่น fgets() ...............................................................................................214 9.18 ผลลัพธ�ของโปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt 2 สตริงแรก สตริงละ 30 ตัว โดยใช-ฟ[งก�ชั่น fgets() ..............................................................................214 9.19 แสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt ทีละสตริง ........................... 215 9.20 โปรแกรมแสดงการเพ่ิมข-อมูล x และ xxxxx เข-าไปในแฟkมข-อมูลประเภทเท็กซ�ไฟล�ท่ีไม�มีแฟkมข-อมูล โดยใช-ฟ[งก�ชั่น fputc() และ fputs() ...................................................................................................215 9.21 ผลลัพธ�ของโปรแกรมแสดงการเพ่ิมข-อมูล x และ xxxxx เข-าไปในแฟkมข-อมูลประเภทเท็กซ�ไฟล�ท่ีไม� มีแฟkมข-อมูล โดยใช-ฟ[งก�ชั่น fputc() และ fputs() ..............................................................................216 9.22 โปรแกรมแสดงการเขียนข-อมูล This is new text. เข-าไปในแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt โดยใช-ฟ[งก�ชั่น fputs() และโหมดการทํางานคือ w ..................................................216 9.23 ผลลัพธ�ของโปรแกรมแสดงการเขียนข-อมูล This is new text. เข-าไปในแฟkมข-อมูลประเภทเท็กซ� ไฟล� stdwintext.txt โดยใช-ฟ[งก�ชั่น fputs() และโหมดการทํางานคือ w .......................................... 217 9.24 โปรแกรมแสดงการเขียนข-อมูล This is new text. เข-าไปในแฟkมข-อมูลประเภทเท็กซ�ไฟล� stdwintext.txt โดยใช-ฟ[งก�ชั่น fputs() และโหมดการทํางานคือ a ...................................................217 9.25 ผลลัพธ�ของโปรแกรมแสดงการเขียนข-อมูล This is new text. เข-าไปในแฟkมข-อมูลประเภทเท็กซ� ไฟล� stdwintext.txt โดยใช-ฟ[งก�ชั่น fputs() และโหมดการทํางานคือ a ........................................... 218 9.26 โปรแกรมแสดงการเขียนข-อมูลชื่อและจํานวนเงินลงแฟkมข-อมูลชื่อว�า account.txt โดยใช-ฟ[งก�ชั่น fprintf() ..............................................................................................................................................219 9.27 ผลลัพธ�ของโปรแกรมแสดงการเขียนข-อมูลชื่อและจํานวนเงินลงแฟkมข-อมูลชื่อว�า account.txt โดย ใช-ฟ[งก�ชั่น fprintf() .............................................................................................................................219 9.28 โปรแกรมแสดงการนําข-อมูลชื่อและจํานวนเงินจากแฟkมข-อมูลชื่อว�า account.txt มาแสดงท่ีหน-า จอโดยใช-ฟ[งก�ชั่น fscanf() ..................................................................................................................220 9.29 ผลลัพธ�ของโปรแกรมแสดงการนําข-อมูลชื่อและจํานวนเงินจากแฟkมข-อมูลชื่อว�า account.txt มา แสดงท่ีหน-าจอโดยใช-ฟ[งก�ชั่น fscanf() ...............................................................................................220 9.30 รูปแบบการใช-ฟ[งก�ชั่น fopen() ของแฟkมข-อมูลประเภทไบนารีไฟล� .................................................. 221 9.31 รูปแบบการใช-ฟ[งก�ชั่น fread() ............................................................................................................221 9.32 รูปแบบการใช-ฟ[งก�ชั่น fwrite() ...........................................................................................................222 9.33 รูปแบบการใช-ฟ[งก�ชั่น feof() ของแฟkมข-อมูลประเภทไบนารีไฟล� ...................................................... 223 9.34 รูปแบบการใช-ฟ[งก�ชั่น ferror() ............................................................................................................223 9.35 รูปแบบการใช-ฟ[งก�ชั่น fclose() ของแฟkมข-อมูลประเภทไบนารีไฟล� .................................................. 223

(13)

9.36 โปรแกรมแสดงการเขียนข-อมูลจากตัวแปรโครงสร-าง MyFriend ลงแฟkมข-อมูลประเภทไบนารีไฟล� ชื่อว�า samplebin.txt โดยใช-ฟ[งก�ชั่น fwrite() ...................................................................................224 9.37 ผลลัพธ�ของโปรแกรมแสดงการเขียนข-อมูลจากตัวแปรโครงสร-าง MyFriend ลงแฟkมข-อมูลประเภท ไบนารีไฟล�ชื่อว�า samplebin.txt โดยใช-ฟ[งก�ชั่น fwrite() ..................................................................224 9.38 โปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทไบนารีไฟล�ชื่อว�า binary.txt ลงตัวแปรโครง สร-าง MyFriend โดยใช-ฟ[งก�ชั่น fread() .............................................................................................225 9.39 ผลลัพธ�ของโปรแกรมแสดงการอ�านข-อมูลจากแฟkมข-อมูลประเภทไบนารีไฟล�ชื่อว�า binary.txt ลง ตัวแปรโครงสร-าง MyFriend โดยใช-ฟ[งก�ชั่น fread() ...........................................................................226 9.34 รูปแบบการใช-ฟ[งก�ชั่น ferror() ............................................................................................................223 A.1 ไฟล�ชื่อว�า Borland Turbo C++ 4.5.rar .............................................................................................231 A.2 การขยายไฟล� Borland Turbo C++ 4.5.rar ......................................................................................231 A.3 ไฟล�ชื่อว�า INSTALL.EXE ......................................................................................................................231 A.4 หน-าจอแสดงรายละเอียดการติดต้ังโปรแกรม .......................................................................................231 A.5 แสดงไฟล�ชื่อว�า INSTALL.TXT .............................................................................................................232 A.6 หน-าจอก�อนการติดต้ังโปรแกรม ............................................................................................................232 A.7 หน-าจอก�อนการติดต้ังโปรแกรม(ถัดไป) ................................................................................................232 A.8 หน-าจอการติดต้ังโปรแกรม ...................................................................................................................232 A.9 หน-าจอแสดงกําลังติดต้ังโปรแกรมอยู� ...................................................................................................233 A.10 หน-าจอบันทึกย�อของเวอร�ชั่น ..............................................................................................................233 A.11 หน-าจอแสดงบันทึกย�อของเวอร�ชั่น .....................................................................................................233 A.12 หน-าจอการเตือนความจํา ....................................................................................................................233 A.13 หน-าจอการติดต้ังโปรแกรมแล-ว ..........................................................................................................233 A.14 หน-าจอแจ-งการลงทะเบียนโปรแกรม ..................................................................................................233 A.15 หน-าจอการลงทะเบียนทางอิเล็กทรอนิกส� ..........................................................................................234 A.16 หน-าต�างแสดงไฟล�ต�างๆ ของโปรแกรม Turbo C++ ........................................................................ 235 A.17 การเข-าใช-งานโปรแกรม Turbo C++ .................................................................................................235 A.18 หน-าต�างโปรแกรม Turbo C++ ..........................................................................................................236 A.19 ไฟล�ต�างๆ ของโปรแกรม Dev-C++ ....................................................................................................236 A.20 หน-าจอต-อนรับการติดต้ังโปรแกรม Dev-C++ ...................................................................................236 A.21 หน-าจอรอโหลดไฟล�ติดต้ังอยู� ..............................................................................................................236 A.22 หน-าจอให-เลือกภาษาท่ีใช-ในการติดต้ัง ................................................................................................237 A.23 หน-าจอสัญญาอนุญาตให-ใช-สิทธิ .........................................................................................................237 A.24 หน-าจอให-เลือกการติดต้ังโปรแกรม .....................................................................................................237 A.25 หน-าจอให-เลือกไดเร็คทอรี่ติดต้ังโปรแกรม ..........................................................................................237 A.26 หน-าจอแสดงกําลังติดต้ังโปรแกรมอยู� .................................................................................................237 A.26 หน-าจอแสดงกําลังติดต้ังโปรแกรมอยู� .................................................................................................238 A.27 การเข-าใช-งานโปรแกรม Dev-C++ .....................................................................................................238 A.28 หน-าต�างโปรแกรม Dev-C++ ..............................................................................................................238

(14)

สารบัญตาราง ตารางท่ี หน�า 1.1 ตัวอยางคําสั่งรหัสนีมอนิคเม่ือเทียบกับคําสั่งภาษาเครื่อง ..................................................................... 6 1.2 ตัวอยางไฟล"รหัสต#นฉบับของแตละภาษาคอมพิวเตอร" .......................................................................... 8 3.1 ตัวแทนชนิดข#อมูลแตละประเภท .......................................................................................................... 66 3.2 โอเปอเรเตอร"การกําหนดคา .................................................................................................................. 76 3.3 โอเปอเรเตอร"ทางด#านคณิตศาสตร" ........................................................................................................ 80 3.4 โอเปอเรเตอร"ทางตรรกะ ....................................................................................................................... 82 3.5 ตารางคาความจริงของโอเปอเรเตอร"ทางตรรกะ ................................................................................... 82 3.6 ลําดับความสําคัญของการทํางานของโอเปอเรเตอร" .............................................................................. 83 7.1 ตารางการเปรียบเทียบระหวางการเขียนโปรแกรมแบบวนรอบกับการเรียกซํ้า .................................... 182 9.1 โหมดการทํางานของแฟ;มข#อมูลประเภทเท็กซ"ไฟล" ...............................................................................207 9.2 โหมดการทํางานของแฟ;มข#อมูลประเภทไบนารีไฟล" .............................................................................221

(16)

แผนบริหารการสอนประจําวิชา 1. รายวิชา การเขียนโปรแกรมเชิงโครงสร�างและอัลกอริทึ่ม 3(2-2-5) จํานวนหน�วยกิต(ทฤษฎี-ปฏิบัติ-ศึกษาด�วยตนเอง) 2. คําอธิบายรายวิชา หลักการเขียนโปรแกรมและการทํางานของโปรแกรม ข้ันตอนการเขียนและการพัฒนาโปรแกรม และการเขียนผังงานการวิเคราะห/และการออกแบบอัลกอริท่ึมแบบ Sequential, Decision, Repetition, Modular, Recursion และการใช�แฟGมข�อมูลเบ้ืองต�น โดยการใช�ภาษาคอมพิวเตอร/ภาษาใดภาษาหนึ่ง เพ่ือฝLกเขียนและพัฒนาโปรแกรมเชิงโครงสร�าง 3. ผลลัพธ'การเรียนรู� 1. ผู�เรียนสามารถอธิบายเหตุผลของการเขียนโปรแกรม การทํางานของโปรแกรม ข้ันตอนวิธีการพัฒนาโปรแกรม อัลกอริท่ึม และผังงานเพ่ือใช�ในการวิเคราะห/ปSญหาได� 2. ผู�เรียนสามารถอธิบายความหมายของโครงสร�างแบบลําดับ แบบเลือก และแบบวนรอบของการเขียนโปรแกรมเชิงโครงสร�างได� 3. ผู�เรียนสามารถอธิบายโครงสร�างของโปรแกรมภาษาซี ตัวแปร ชนิดข�อมูล และการดําเนินการต�างๆ ได� 4. ผู�เรียนสามารถเขียนโปรแกรมเชิงโครงสร�างแบบลําดับและแบบเลือกได� 5. ผู�เรียนสามารถเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบได� 6. ผู�เรียนสามารถเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย/ได� 7. ผู�เรียนสามารถเขียนโปรแกรมเชิงโครงสร�างกับฟSงก/ชั่นสร�างเองประเภทต�างๆ และฟSงก/ชั่นเรียกซํ้าได� 8. ผู�เรียนสามารถเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรโครงสร�างได� 9. ผู�เรียนสามารถเขียนโปรแกรมเชิงโครงสร�างกับแฟGมข�อมูลประเภทเท็กซ/ไฟล/และไบนารีไฟล/ได� 4. การวางแผนการสอน 1. ศึกษารายละเอียดจากคําอธิบายรายวิชา 1.1 วิเคราะห/คําอธิบายรายวิชาว�าควรมีเนื้อหาอะไรบ�าง เนื้อหาท่ีต�องสอนมีอะไรท่ีสามารถรวมเป̂นเรื่องเดียวกันได� และได�สังเคราะห/ออกมาเป̂นเนื้อหาท่ีจะเป̂นพ้ืนฐานสําหรับการเขียนโปรแกรมเชิงโครงสร�างและอัลกอริท่ึมได�จํานวน 9 บท 1.2 วิเคราะห/ว�าแต�ละบทควรมีวัตถุประสงค/ท่ัวไปและวัตถุประสงค/เฉพาะอย�างไร 1.3 กําหนดรายละเอียดในเนื้อหาแต�ละบท โดยยึดวัตถุประสงค/ท่ัวไปและวัตถุประสงค/เฉพาะเป̂นเกณฑ/ 2. การแบ-งเนื้อหาวิชากับเวลาท่ีกําหนดในภาคเรียน 2.1 สัปดาห/ท่ี 1 บทท่ี 1 แนวคิดในการเขียนโปรแกรม 2.2 สัปดาห/ท่ี 2 บทท่ี 2 การเขียนโปรแกรมเชิงโครงสร�าง 2.3 สัปดาห/ท่ี 3 และ 4 บทท่ี 3 เริ่มต�นการเขียนโปรแกรมเชิงโครงสร�าง 2.4 สัปดาห/ท่ี 5 บทท่ี 4 โครงสร�างแบบลําดับและแบบเลือก

(18)

2.5 สัปดาห/ท่ี 6 บทท่ี 5 โครงสร�างแบบวนรอบ 2.6 สัปดาห/ท่ี 7 สอบปฏิบัติ ครั้งท่ี 1 2.7 สัปดาห/ท่ี 8 สอบกลางภาค 2.8 สัปดาห/ท่ี 9 บทท่ี 6 ตัวแปรอาเรย/ 2.9 สัปดาห/ท่ี 10 และ 11 บทท่ี 7 ฟSงก/ชั่น 2.10 สัปดาห/ท่ี 12 บทท่ี 8 ตัวแปรโครงสร�าง 2.11 สัปดาห/ท่ี 13 และ 14 บทท่ี 9 แฟGมข�อมูล 2.12 สัปดาห/ท่ี 15 สอบปฏิบัติ ครั้งท่ี 2 2.13 สัปดาห/ท่ี 16 สอบปลายภาค 3. เนื้อหาท่ีต�องเชิญวิทยากร ไม�มี 4. วิธีเรียน วิธีสอน ท่ีจะใช�ในแต-ละเนื้อหาวิชา 4.1 อธิบายและฝLกการคิดวิเคราะห/ปSญหา 4.2 อธิบายและฝLกปฏิบัติการออกแบบอัลกอริท่ึมด�วยผังงานและคําสั่งเทียม 4.3 อธิบายและฝLกปฏิบัติการเขียนโปรแกรมเชิงโครงสร�างด�วยโปรแกรมภาษาซี 4.4 ให�ผู�เรียนศึกษาค�นคว�าด�วยตนเองเพ่ิมเติมจากสื่อต�างๆ เช�น หนังสือ ตํารา เอกสารท่ีเก่ียวข�อง 4.5 บรรยายประกอบโปรแกรมนําเสนองาน 4.6 สรุปบทเรียนและให�ทําคําถามท�ายบท 5. ส่ือการสอน 5.1 เอกสารประกอบการสอน 5.2 โปรแกรมนําเสนองาน 5.3 ใบงาน 5.4 ตัวอย�างผังงานและคําสั่งเทียม 5.5 ตัวอย�างโปรแกรม 5.6 โปรแกรมภาษาซี 6. กิจกรรมส-งเสริมการเรียนการสอน 6.1 ฝLกปฏิบัติการออกแบบอัลกอริท่ึมด�วยผังงานและคําสั่งเทียม 6.2 ฝLกปฏิบัติการเขียนโปรแกรม 7. การวัดผลและการประเมินผล 7.1 การวัดผล 7.1.1 คะแนนระหว�างภาคเรียน 70 คะแนน 7.1.1.1 ความสนใจและมีส�วนร�วมในชั้นเรียน 10 คะแนน 7.1.1.2 แบบฝLกหัด 20 คะแนน 7.1.1.3 ฝLกปฏิบัติ 10 คะแนน 7.1.1.4 สอบปฏิบัติ ครั้งท่ี 1 10 คะแนน

(19)

7.1.1.5 สอบกลางภาค 20 คะแนน 7.1.2 คะแนนปลายภาคเรียน 30 คะแนน 7.1.2.1 สอบปฏิบัติ ครั้งท่ี 2 10 คะแนน 7.1.2.2 สอบปลายภาค 20 คะแนน 7.2 การประเมินผล โดยอิงเกณฑ/ คะแนนระหว�าง 90 - 100 ได�ระดับ A คะแนนระหว�าง 85 - 89 ได�ระดับ B+ คะแนนระหว�าง 75 - 84 ได�ระดับ B คะแนนระหว�าง 70 - 74 ได�ระดับ C+ คะแนนระหว�าง 60 - 69 ได�ระดับ C คะแนนระหว�าง 55 - 59 ได�ระดับ D+ คะแนนระหว�าง 50 - 54 ได�ระดับ D คะแนนระหว�าง 0 - 49 ได�ระดับ F

(20)

แผนบริหารการสอนประจําบทท่ี 1 หัวข�อเน้ือหาประจําบท 1. ทําไมตองเขียนโปรแกรม 2. โปรแกรมและภาษาคอมพิวเตอร 3. โปรแกรมทํางานไดอย#างไร 4. ข้ันตอนวิธีการพัฒนาโปรแกรม 5. อัลกอริท่ึม 6. ผังงาน 7. รหัสเทียม วัตถุประสงค! เม่ือผูเรียนศึกษาบทเรียนจบแลว จะมีความสามารถดังนี้ 1. อธิบายเหตุผลของการเขียนโปรแกรมได 2. อธิบายความหมายของโปรแกรมและเขาใจถึงระดับภาษาคอมพิวเตอร ได 3. อธิบายการทํางานของโปรแกรมได 4. อธิบายข้ันตอนวิธีการพัฒนาโปรแกรมได 5. อธิบายความหมายของอัลกอริท่ึม ผังงาน และรหัสเทียมได 6. สามารถเขียนผังงานและรหัสเทียมเพ่ือใชในการวิเคราะห ป:ญหาได กิจกรรมการเรียนการสอน 1. อธิบายเหตุผลของการเขียนโปรกรม โดยใชโปรแกรมนําเสนองาน 2. อธิบายความหมายของโปรแกรม ภาษาคอมพิวเตอร และยุคของภาษาคอมพิวเตอร โดยใชโปรแกรมนําเสนองาน 3. อธิบายการทํางานของโปรแกรม โดยใชโปรแกรมนําเสนองาน 4. อธิบายข้ันตอนวิธีการพัฒนาโปรแกรม โดยใชโปรแกรมนําเสนองาน 5. อธิบายความหมายของอัลกอริท่ึม ผังงาน และรหัสเทียม โดยใชโปรแกรมนําเสนองาน และฝ=กปฏิบัติ 6. แบ#งผูเรียนออกเป?นกลุ#ม โดยปฏิบัติตามใบงานท่ี 1 ดังนี้ 6.1 ใหผูเรียนฝ=กปฏิบัติในการวิเคราะห และแกป:ญหา โดยการออกแบบอัลกอริท่ึมดวยผังงานและรหัสเทียม 6.2 ใหตัวแทนแต#ละกลุ#มออกมานําเสนอผลการปฏิบัติตามใบงาน และร#วมกันอภิปรายว#าอัลกอริท่ึมท่ีออกแบบมานั้นเป?นอย#างไร 7. ร#วมกันสรุปความรูเก่ียวกับแนวคิดการเขียนโปรแกรม จากนั้นซักถามผูเรียน รวมถึงใหผูเรียนตอบคําถามทบทวน สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 1

2

การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน 3. สังเกตการณ ปฏิบัติงานกลุ#ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝ=กหัด

บทท่ี 1 แนวคิดการเขียนโปรแกรม

บทนํา ในการเขียนโปรแกรมสําหรับผู�เริ่มเขียนโปรแกรมนั้น จําเป�นต�องศึกษาข�อมูลเหล#านี้คือ ทําไมต�องเขียนโปรแกรม โปรแกรมคืออะไร ภาษาคอมพิวเตอร,ท่ีใช�เขียนโปรแกรมเป�นแบบไหนบ�าง ยุคของภาษาคอมพิวเตอร,มีก่ียุค โปรแกรมทํางานอย#างไร มีข้ันตอนวิธีการพัฒนาโปรแกรมอะไรบ�าง และอัลกอริท่ึมคืออะไร เป�นต�น ข�อมูลดังกล#าวจะเป�นประโยชน,ต#อผู�เริ่มเขียนโปรแกรมท่ีจะใช�เป�นแนวคิดการเขียนโปรแกรมต#อไปได� ทําไมต�องเขียนโปรแกรม ป2จจุบันนี้เทคโนโลยีหลายอย#างได�ถูกพัฒนาข้ึนมา เพ่ืออํานวยความสะดวกในการดําเนินชีวิตประจําวันและการดําเนินธุรกิจ ตัวอย#างของเทคโนโลยีท่ีใช�ในการดําเนินชีวิตประจําวัน ได�แก# การใช�โทรศัพท,เคลื่อนท่ี (Mobile Phone) หรือท่ีเรียกกันว#า มือถือ ผู�ใช�สามารถใช�โทรศัพท,เคลื่อนท่ีในการรับส#งอีเมล,หรือจดหมายอิเล็กทรอนิกส, (Electronic Mail - E-Mail) เพ่ือสมัครงาน ถ#ายรูปภาพเพ่ือนๆ สถานท่ีท#องเท่ียว อาหารท่ีรับประทาน ผ#านแอปพลิเคชัน (Application) ถ#ายภาพ หรือเล#นเกมส,ออนไลน, (On-line Games) เป�นต�น ซ่ึงถ�าเป�นสมัยก#อน หากต�องการส#งจดหมายเพ่ือสมัครงาน จะต�องใช�บริการผ#านทางไปรษณีย, ผู�ส#งจะต�องเขียนจดหมายสมัครงานแนบประวัติส#วนตัวและประวัติการทํางาน จ#าหน�าซอง ติดแสตมปO แล�วนําไปหย#อนท่ีตู�ไปรษณีย, กว#าจดหมายนี้จะถึงผู�รับปลายทาง ต�องใช�เวลานานหลายวัน การไปท#องเท่ียวตามสถานท่ีต#างๆ หากต�องการเก็บภาพเป�นท่ีระลึก จะต�องพกกล�องถ#ายรูปติดตัวไปด�วย ทําให�เกิดความไม#สะดวก หรือต�องการเล#นเกมส,ออนไลน, ผู�ใช�งานจะต�องเปPดเครื่องคอมพิวเตอร,แล�วใช�โมเด็ม (MODEM) ในการเชื่อมต#อเข�าสู#เครือข#ายอินเทอร,เน็ตก#อนถึงจะเล#นเกมส,ท่ีต�องการได�

ก. การใช�อีเมล,ผ#านโทรศัพท,เคลื่อนท่ี

ท่ีมา : จากเว็บไซต� Gmail มือถือ http://www.google.co.in

ข. การเล#นเกมส,ออนไลน,ผ#านโทรศัพท,เคลื่อนท่ี ท่ีมา : จากเว็บไซต� http://www.bbfarm.in.th

ภาพท่ี 1.1 การดําเนินชีวิตประจําวันผ#านโทรศัพท,เคลื่อนท่ีหรือมือถือ ตัวอย#างของเทคโนโลยีท่ีใช�ในการดําเนินธุรกิจ ได�แก# โปรแกรมระบบบัญชี ท่ีสามารถช#วยจัดการงานหรือข�อมูลทางด�านบัญชีท่ียุ#งยากให�สะดวก รวดเร็ว และถูกต�องตามหลักการทางบัญชีได� ถ�าเป�นสมัยก#อน นักบัญชีจะต�องจัดทําบัญชีด�วยมือ โดยการลงบัญชีในสมุดบันทึกรายการทางบัญชี สมุดบัญชีแยกประเภท การผ#านบัญชีจากสมุดรายวันไปบัญชีแยกประเภท เป�นต�น เป�นท่ีทราบกันดีว#า ข�อมูลส#วนใหญ#ทางด�านบัญชีจะเก่ียวข�องกับตัวเลขจํานวนมาก ทําให�นักบัญชีต�องทํางานด�วยความรอบครอบ ถูกต�อง รวดเร็ว และทันเวลา ส#งผลทําให�เกิดความกดดัน ความเครียด จนทําให�เกิดข�อผิดพลาดข้ึนมาได� ในธุรกิจธนาคารท่ีให�บริการถอน

4

และฝากเงินผ#านตู�เอทีเอ็ม (Auto Teller Machine - ATM) ท่ีติดต้ังตามสถานท่ีต#างๆ ทําให�ลูกค�าธนาคารเกิดความสะดวกในการถอนและฝากเงิน ไม#ต�องเดินทางไปยังสาขาของธนาคาร ถ�าเป�นสมัยก#อน ลูกค�าต�องไปยังสาขาของธนาคาร ไปยืนต#อแถว กว#าจะถึงคิวตัวเอง คงต�องใช�เวลานาน ในธุรกิจโรงพยาบาลท่ีลงทุนติดต้ังหุ#นยนต,จ#ายยา จะช#วยลดความผิดพลาดของเภสัชกรท่ีอาจเกิดข้ึนระหว#างการจัดยาแก#ผู�ปYวย เพ่ิมความสะดวกและรวดเร็วในการจ#ายยา ถ�าเป�นสมัยก#อน ผู�ปYวยต�องนั่งรอรับยาเป�นเวลานาน และบางครั้งอาจได�รับยาผิดประเภท

ภาพท่ี 1.2 โปรแกรมบัญชี ACCPAC ท่ีมา : จากเว็บไซต� http://na.sage.com

ภาพท่ี 1.3 ตู�เอทีเอ็มกรุงไทย ท่ีมา : จากเว็บไซต� บมจ.ธนาคารกรุงไทย จํากัด)

http://www.ktb.co.th

นอกจากนี้งานทางด�านวิทยาศาสตร,และวิศวกรรมศาสตร, ส#วนมากแล�วจะนําเครื่องคอมพิวเตอร,ขนาดใหญ# มาใช�ช#วยแก�ป2ญหาทางด�านวิทยาศาสตร,และวิศวกรรมศาสตร,ท่ีมีความซับซ�อนมาก เช#น กรมอุตุนิยมวิทยา ได�นําเครื่องคอมพิวเตอร,ท่ีเรียกว#า เมนเฟรม (Mainframe) มาช#วยในเรื่องของการพยากรณ,อากาศได�อย#างแม#นยํา ทําให�ลดความสูญเสียต#อชีวิตและทรัพย,สินเป�นอย#างมาก ถ�าเป�นสมัยก#อนกว#าท่ีจะรู�ว#าสภาพอากาศเป�นอย#างไร ก็อาจจะสายเกินไป องค'การนาซาหรือองค'การบริหารการบินและอวกาศแห.งชาติ (National Aeronautics and Space Administration - NASA) ได�ส#งยาน Curiosity ไปสํารวจดาวอังคารโดยไร�มนุษย,ควบคุม ซ่ึงจะส#งข�อมูลท่ีสํารวจได�กลับมายังโลก รวมถึงเอฟบีไอหรือสํานักงานสอบสวนกลางแห.งสหรัฐอเมริกา (Federal Bureau of Investigation - FBI) สามารถตรวจเอกลักษณ,ผู�ต�องสงสัยได� ไม#ว#าหลักฐานท่ีได�มาจะเป�นลายนิ้วมือหรือรูปถ#าย นํามาตรวจสอบด�วยโปรแกรมตรวจสอบลายนิ้วมือหรือตรวจสอบใบหน�า เพ่ือค�นหาผู�ต�องสงสัยดังกล#าว ก#อนท่ีจะเกิดเหตุการณ,วินาศกรรมครั้งร�ายแรงข้ึนมา

ภาพท่ี 1.4 เมนเฟรมของกรมอุตุนิยมวิทยา ประเทศสหรัฐอเมริกา

ท่ีมา : จากเว็บไซต� http://www.sciencephoto.com

ภาพท่ี 1.5 ยาน Curiosity ไปสํารวจดาวอังคารขององค,การนาซา

ท่ีมา : จากเว็บไซต� http://www.nasa.gov

อีกตัวอย#างหนึ่งท่ีสําคัญในป2จจุบันนี้คือ เครือข.ายสังคม (Social Network) ท่ีใช�กันแพร#หลายคือ Facebook, Line, Twitter หรือ Instagram เครือข#ายสังคมเหล#านี้ ช#วยทําให�ผู�คนได�ใกล�ชิดกันมากข้ึน สามารถรับรู�ได�ว#า เพ่ือนๆ ทําอะไรกันอยู#บ�าง ไปเท่ียวท่ีไหน เท่ียวกับใคร ทานอาหารอะไร หรือนอนรักษาตัวท่ีโรงพยาบาลไหน เป�นต�น ก#อนหน�าท่ีจะเกิดเครือข#ายสังคมข้ึนมา การท่ีจะรับรู�ข#าวหรือต�องการพูดคุยกับ

5

เพ่ือนๆ อาจจะทําได�โดยการส#งจดหมาย ส#งอีเมล, หรือโทรศัพท, ซ่ึงบางครั้งไม#สามารถติดต#อเพ่ือนท่ีต�องการพูดคุยได�ทันที เครือข#ายสังคมถือได�ว#าเป�นระบบคอมพิวเตอร,หนึ่ง

ภาพท่ี 1.6 Facebook มรธ. สป. ท่ีมา : จากเว็บไซต� http://www.facebook.com/Drusp

ภาพท่ี 1.7 โปรแกรม Line ท่ีมา : จากเว็บไซต� http://www.mdn.co.jp

จากตัวอย#างข�างต�นของการนําเทคโนโลยีมาใช�งานด�านต#างๆ ทําให�การดําเนินชีวิตประจําวันและการดําเนินธุรกิจเกิดความสะดวก รวดเร็ว ลดข�อผิดพลาดท่ีเกิดจากการทํางานซํ้าๆ ลงได� เทคโนโลยีดังกล#าวส#วนมากแล�วจะต�องอาศัยการทํางานของระบบคอมพิวเตอร,เป�นหลัก และระบบคอมพิวเตอร,นั้นสามารถทํางานได�จากโปรแกรมต#างๆ ท่ีได�ถูกพัฒนาข้ึนมาจากผู�ท่ีทําหน�าท่ีเขียนหรือพัฒนาโปรแกรมซ่ึงเรียกว#า โปรแกรมเมอร, โปรแกรมเมอร' (Programmer) คือ ผู�ทําหน�าท่ีเขียนโปรแกรมเพ่ือสั่งให�เครื่องคอมพิวเตอร,ทํางานตามท่ีผู�ใช�งานต�องการ ถ�าหากเครื่องคอมพิวเตอร,ไม#มีโปรแกรมท่ีใช�งานอยู#ในเครื่อง เครื่องคอมพิวเตอร,ดังกล#าวไม#สามารถทํางานได� โปรแกรมจึงมีความสําคัญเป�นอย#างมาก ดังนั้นเหตุผลของการเขียนโปรแกรมคือ เป�นการสร�างนวัตกรรมใหม#ทางด�านเทคโนโลยีข้ึนมา เพ่ือตอบสนองต#อความต�องการใช�งานของผู�ใช�งาน ไม#ว#าจะเป�นด�านการดําเนินชีวิตประจําวันหรือการดําเนินธุรกิจ ช#วยในการเสริมสร�างปฏิสัมพันธ,ระหว#างเพ่ือนมนุษย,ด�วยกัน รวมถึงช#วยขับเคลื่อนเศรษฐกิจให�เจริญรุดหน�าเป�นอย#างมาก โปรแกรมและภาษาคอมพิวเตอร' หลายคนคงสงสัยว#า การเรียนในสาขาทางด�านคอมพิวเตอร, โดยเฉพาะสาขาวิขาวิทยาการคอมพิวเตอร, (Computer Science Program) สาขาวิชาเทคโนโลยีสารสนเทศ (Information Technology Program) หรือสาขาวิชาคอมพิวเตอร,อ่ืนๆ ทําไมต�องเรียนวิชาทางด�านการเขียนโปรแกรมด�วย การท่ีจะทําให�เครื่องคอมพิวเตอร,สามารถทํางานตามท่ีผู�ใช�ต�องการได�นั้น จําเป�นอย#างยิ่งท่ีจะต�องมีชุดคําสั่ง (Instruction Set) ซ่ึงจะต�องเป�นคําสั่งท่ีเครื่องคอมพิวเตอร,เข�าใจ คําสั่งดังกล#าวเม่ือนํามาเรียงต#อกันให�เครื่องคอมพิวเตอร,ทํางานอย#างใดอย#างหนึ่งนั้น ชุดคําสั่งนั้นจะเรียกว#า โปรแกรม (Program) หรือเรียกอีกชื่อหนึ่งว#า ซอฟต,แวร, (Software) เม่ือโปรแกรมถูกนําเข�าสู#เครื่องคอมพิวเตอร,แล�ว โปรแกรมจะถูกทํางานทีละคําสั่ง เพ่ือสั่งให�เครื่องคอมพิวเตอร,ทํางาน สําหรับการใช�คําสั่งสั่งงานให�เครื่องคอมพิวเตอร,ทํางานนั้น จะต�องใช�คํ าสั่ ง ท่ี เ ครื่ อ งคอมพิว เตอร, เ ข� า ใจ คําสั่ ง ใน ท่ีนี้ จะ ถูก เ ขียนหรือ พัฒนาด� วยภาษาคอมพิว เตอร, (Computer/Programming Language) เหมือนกับการท่ีผู�เรียนจะสื่อสาร(พูดคุย) กับเพ่ือนๆ จะต�องใช�ภาษา(ไม#ว#าจะเป�นภาษาไทยหรือภาษาอังกฤษ) ในการสื่อสารนั่นเอง ภาษาคอมพิวเตอร,ท่ีเครื่องคอมพิวเตอร,เข�าใจหรือรู�จักคือ ภาษาเครื่องเท#านั้น ภาษาเครื่องถือว#าเป�นภาษายุคแรก (First-Generation Language)

6

ภาษาเครื่อง (Machine Language) เป�นภาษาระดับตํ่าสุดท่ีอยู#ใกล�ชิดกับเครื่องคอมพิวเตอร,มากท่ีสุด สามารถสั่งให�เครื่องคอมพิวเตอร,ทํางานได�รวดเร็วกว#าภาษาคอมพิวเตอร,ท่ีอยู#ในระดับสูงกว#า ภาษาเครื่องประกอบด�วยตัวเลขในระบบฐานสอง (Binary Digit System) คือ 0 และ 1 ซ่ึงถูกแปลงเป�นสัญญาณทางไฟฟrาท่ีเครื่องคอมพิวเตอร,สามารถเข�าใจได� ตัวเลข 0 และ 1 ถูกนํามาเขียนเรียงต#อกันเป�นคําสั่ง คําสั่งในภาษาเครื่องประกอบด�วย 2 ส#วน คือ รหัสโอเปอเรชัน (Operation Code) และโอเปอแรนด, (Operand) รหัสโอเปอเรชันเป�นคําสั่งท่ีสั่งให�เครื่องคอมพิวเตอร,ทํางาน เช#น การบวก (Addition) การลบ (Subtraction) เป�นต�น ส#วนโอเปอแรนด,เป�นส#วนท่ีระบุตําแหน#งท่ีเก็บข�อมูลท่ีจะนําเข�าสู#เครื่องคอมพิวเตอร, เพ่ือนําไปประมวลผลตามคําสั่งในส#วนแรก (รหัสโอเปอเรชัน) ตัวอย#างของคําสั่งในภาษาเครื่อง 01011010 000100001111001110110010 รหัสโอเปอเรชัน โอเปอแรนด, ภาษาเครื่องเป�นภาษาท่ีทําความเข�าใจได�ยาก เนื่องจากทุกคําสั่งจะประกอบไปด�วยชุดของตัวเลข 0 กับ 1 เท#านั้น และภาษาเครื่องจะแตกต#างกันไปของเครื่องคอมพิวเตอร,แต#ละชนิดหรือยี่ห�อด�วย เนื่องจากแต#ละเครื่องจะมีรูปแบบของคําสั่งเฉพาะของตนเอง ส#งผลให�งานทางด�านคอมพิวเตอร,ท่ัวไปจึงไม#นิยมเขียนโปรแกรมด�วยภาษาเครื่อง ภาษาคอมพิวเตอร,ในระดับท่ีสูงกว#าภาษาเครื่องถัดข้ึนมาเรียกว#า ภาษาระดับต่ํา (Low Level Language) ภาษาระดับตํ่าถือว#าเป�นภาษายุคท่ีสอง (Second-Generation Language) ตัวอย#างภาษาในระดับนี้คือ ภาษาแอสเซมบลี (Assembly Language) ซ่ึงเป�นภาษาคอมพิวเตอร,ท่ีมีความใกล�เคียงกับภาษาเครื่องมาก คือ หนึ่งคําสั่งของภาษาแอสเซมบลี จะเท#ากับหนึ่งคําสั่งของภาษาเครื่อง คําสั่งในภาษาแอสเซมบลีเขียนด�วยตัวอักษรในภาษาอังกฤษ เพ่ือใช�แทนคําสั่งในภาษาเครื่อง ทําให�ผู�เขียนโปรแกรมสามารถเขียนโปรแกรมได�สะดวกมากข้ึน เพียงแค#จดจําคําสั่งสั้นๆ ท่ีสามารถจดจําได�ง#าย ซ่ึงเรียกคําสั่งนี้ว#า รหัสนีมอนิค (Mnemonic Code) ดังตัวอย#างในตารางท่ี 1.1

คําส่ังรหัสนีมอนิค คําส่ังภาษาเครื่อง ความหมาย LOAD 0010 0000 การโหลดข�อมูลจากหน#วยความจํา ADD 0100 0000 การบวกข�อมูล SUB 1101 0000 การลบข�อมูล MOV 1001 0000 การเคลื่อนย�ายข�อมูลจากหน#วยความจํา

STORE 0011 0000 การเก็บข�อมูลลงในหน#วยความจํา ตารางท่ี 1.1 ตัวอย#างคําสั่งรหัสนีมอนิคเม่ือเทียบกับคําสั่งภาษาเครื่อง

ตัวอย#างการใช�คําสั่งในภาษาแอสเซมบลี

ภาพท่ี 1.8 ตัวอย#างของคําสั่งในภาษาแอสเซมบลี ท่ีมา : Paul A. Carter, PC Assembly Language, 2006, p.12-13

จากท่ีได�กล#าวไว�ข�างต�นว#า เครื่องคอมพิวเตอร,จะรู�จักแต#ภาษาเครื่องเท#านั้น ดังนั้นจึงต�องมีการแปลคําสั่ง (หรือเรียกว#า การคอมไพล' (Compilation)) ในภาษาแอสเซมบลีให�เป�นคําสั่งในภาษาเครื่องซ่ึงเรียกตัวแปลนี้

mov eax, 3 ; mov bx, ax ;

add eax, 4 ; add al, ah ;

sub bx, 10 ; sub ebx, edi ;

inc ecx ; dec dl ;

7

ว#า ตัวแปลภาษาคอมพิวเตอร' (Translator) ตัวแปลภาษาของภาษาแอสเซมบลีเรียกว#า แอสเซมเบลอ (Assembler) ถึงแม�ว#าคําสั่งรหัสนีโมนิคจะประกอบด�วยตัวอักษรท่ีเป�นคําในภาษาอังกฤษก็ตาม แต#การนํามาใช�เขียนโปรแกรมนั้น ก็ไม#สะดวกสําหรับผู�เขียนโปรแกรม จึงได�มีผู�คิดค�นภาษาคอมพิวเตอร,ในระดับท่ีสูงกว#าภาษาแอสเซมบลีข้ึนมาเรียกว#า ภาษาระดับสูง (High Level Language) ภาษาระดับสูงถือว#าเป�นภาษายุคท่ีสาม (Third-Generation Language) ภาษาในยุคนี้มีโครงสร�างภาษา (Procedural Language) และชุดคําสั่งเหมือนกับคําในภาษาอังกฤษ ทําให�สะดวกต#อการเขียนคําสั่ง และแสดงผลลัพธ,ได�ตามต�องการ ลดความยุ#งยากในการเขียนโปรแกรมลงมาก ตัวอย#างภาษาในระดับนี้คือ ภาษาเบสิค (BASIC) ภาษาโคบอล (COBOL) ภาษาฟอร,แทรน (FORTRAN) ภาษาปาสคาล (PASCAL) และภาษาซี (C) เช#นเดียวกันภาษาระดับสูงจะต�องถูกแปลเป�นภาษาเครื่องก#อน ตัวแปลภาษาท่ีใช�คือ อินเตอร,พรีตเตอร, (Interpreter) หรือคอมไพเลอร, (Compiler) ความแตกระหว#างอินเตอร,พรีตเตอร,และคอมไพเลอร, คือ อินเตอร,พรีตเตอร,จะแปลชุดคําสั่งทีละคําสั่งและให�ทํางานทีละคําสั่ง ทําให�โปรแกรมท่ีมีขนาดใหญ#และซับซ�อนมากจะทํางานได�ช�า แต#คอมไพเลอร,จะแปลชุดคําสั่งท้ังหมดทีเดียว และเม่ือสั่งงานโปรแกรมเดิมซํ้า ไม#ต�องเสียเวลาแปลชุดคําสั่งซํ้าอีก ทําให�โปรแกรมท่ีมีขนาดใหญ#และซับซ�อนมากจะทํางานได�เร็วกว#า ตัวอย#างของรหัสต�นฉบับโปรแกรมท่ีเขียนด�วยคําสั่งในภาษาเบสิค ภาษาฟอร,แทรน และภาษาซี ก. โปรแกรมในภาษาเบสิค ข. โปรแกรมในภาษาฟอร,แทรน ค. โปรแกรมในภาษาซี

ภาพท่ี 1.9 ตัวอย#างของรหัสต�นฉบับของโปรแกรมในภาษาระดับสูง ภาษาในยุคท่ี 4 (Forth-Generation Language) เป�นภาษาท่ีเรียกว#า ภาษาระดับสูงมาก (Very High Level Language) ภาษาในระดับนี้จะอาศัยหลักการแบบไม#มีโครงสร�าง (Non-Procedural Language) เป�นภาษาท่ีเป�นธรรมชาติคล�ายกับภาษามนุษย, ภาษาในระดับนี้จะช#วยในเรื่องของการสร�างแบบฟอร,มบนหน�าจอเพ่ือจัดการเก่ียวกับข�อมูล รวมถึงการจัดทําผลลัพธ,ในรูปแบบของรายงาน ซ่ึงสะดวกและง#ายต#อการจัดการมากกว#าภาษาในยุคท่ี 3 ตัวอย#างภาษาในระดับนี้คือ ภาษา Informix-4GL ภาษา Focus ภาษา Sybase ภาษา InGres เป�นต�น ภาษาแบบไม#มีโครงสร�าง เป�นภาษาท่ีผู�ใช�งานเพียงแค#บอกเครื่องคอมพิวเตอร,ว#าต�องการอะไร แต#ไม#ต�องบอกถึงรายละเอียดว#าต�องทําอย#างไร เครื่องคอมพิวเตอร,จะจัดการให�เองท้ังหมด เช#น ถ�าผู�เขียนโปรแกรมต�องการสร�างหน�าจอให�เป�นแบบฟอร,มรับข�อมูลจากผู�ใช�งาน ผู�เขียนโปรแกรมเพียงแต#ออกแบบหน�าตาของแบบฟอร,มนั้นด�วยโปรแกรมอิดิเตอร, (Editor Program) แล�วบันทึกเป�นไฟล,ไว� เม่ือผู�ใช�งานต�องการใช�แบบฟอร,มดังกล#าว ผู�ใช�งานเพียงแต#ใช�คําสั่งเปPดไฟล,นั้นข้ึนมา ซ่ึงจะแสดงบนหน�าจอเครื่องคอมพิวเตอร,ทันที ซ่ึงวิธีการดังกล#าวต#างจากภาษาในยุคท่ี 3 ซ่ึงผู�เขียนโปรแกรมจะต�องเขียนรายละเอียดของโปรแกรมท้ังหมดว#าต�องการให�เครื่องคอมพิวเตอร,ทําอะไร และต�องบอกด�วยว#าให�เครื่องคอมพิวเตอร,ทําอย#างไร ภาษาในยุคท่ี 5 (Fifth-Generation Language) เป�นภาษาท่ีเรียกว#า ภาษาธรรมชาติ (Natural Language) เป�นภาษาแบบไม#มีโครงสร�างเช#นเดียวกับภาษาในยุคท่ี 4 เป�นการสั่งให�เครื่องคอมพิวเตอร,ทํางานโดยการใช�ภาษามนุษย,ได�โดยตรง โดยท่ัวไปคําสั่งท่ีมนุษย,ปrอนเข�าไปในเครื่องคอมพิวเตอร, จะอยู#ในรูปของภาษาพูดของมนุษย, ซ่ึงอาจมีรูปแบบท่ีไม#แน#นอนหรือตายตัว แต#เครื่องคอมพิวเตอร,สามารถแปลคําสั่งเหล#านั้น

10 PRINT “Hello World” 20 GOTO 10

program HelloWorld

write (*,*) ‘Hello World‘ end program HelloWorld

#include <stdio.h>

int main(void) {

printf(“Hello World\n”);

return 0; }

8

ให�อยู#ในรูปแบบท่ีเครื่องคอมพิวเตอร,สามารถเข�าใจคําสั่งได� ถ�าคําสั่งใดไม#ชัดเจน เครื่องคอมพิวเตอร,จะมีการถามกลับเพ่ือให�เข�าใจคําสั่งได�อย#างถูกต�อง ภาษาธรรมชาตินี้อาศัยระบบผู�เชี่ยวชาญ (Expert System) ในการท่ีจะทําให�เครื่องคอมพิวเตอร,มีความสามารถเปรียบเสมือนเป�นผู�เชี่ยวชาญคนหนึ่งท่ีสามารถคิดและตัดสินใจได�เช#นเดียวกับมนุษย, เครื่องคอมพิวเตอร,นี้สามารถตอบคําถามของมนุษย,ได�อย#างถูกต�อง พร�อมท้ังมีข�อแนะนําต#างๆ เพ่ือช#วยในการตัดสินใจของมนุษย,ได�อีกด�วย ระบบผู�เชี่ยวชาญอาศัยข�อมูลหรือองค,ความรู�จากฐานความรู� (Knowledge Base) ของผู�เชี่ยวชาญในแต#ละด�าน เช#น ด�านการแพทย, ด�านวิทยาศาสตร, ด�านพยากรณ,อากาศ หรือด�านการลงทุน เป�นต�น ท่ีได�จัดเก็บไว�ในระบบฐานข�อมูล โปรแกรมทํางานได�อย.างไร เม่ือผู�เขียนโปรแกรมได�เขียนโปรแกรมข้ึนมาแล�ว ไม#ว#าเขียนด�วยภาษาคอมพิวเตอร,ใดๆ ก็ตาม โปรแกรมท่ีเขียนข้ึนมานั้นเรียกว#า รหัสต�นฉบับหรือซอร'สโค[ด (Source Code) โดยจะจัดเก็บอยู#ในรูปของไฟล, (File) โดยนามสกุลของไฟล,นั้นข้ึนอยู#กับภาษาคอมพิวเตอร,ท่ีใช�เขียน ตารางท่ี 1.2 แสดงตัวอย#างของไฟล,รหัสต�นฉบับ

ภาษาคอมพิวเตอร' นามสกุลไฟล' ตัวอย.าง C .c Easy.c C++ .cpp Easy.cpp Pascal .pas Easy.pas Perl .pl Easy.pl PHP .php หรือ .php3 Easy.php หรือ Easy.php3 Java .java Easy.java

ตารางท่ี 1.2 ตัวอย#างไฟล,รหัสต�นฉบับของแต#ละภาษาคอมพิวเตอร, ท่ีมา : นิรุธ อํานวยศิลปJ, 2546, หนNา 14

เม่ือได�รหัสต�นฉบับแล�ว หากผู�เขียนโปรแกรมต�องการนําโปรแกรมดังกล#าวไปใช�งาน จะต�องนํารหัสต�นฉบับไปผ#านกระบวนการท่ีเรียกว#า การแปลภาษาคอมพิวเตอร, โดยใช�ตัวแปลภาษาคอมพิวเตอร,ซ่ึงได�อธิบายไว�ข�างต�น ภาพท่ี 1.10 แสดงกระบวนการแปลภาษาซี

รหัสต�นฉบับ การแปลภาษาคอมพิวเตอร, โปรแกรมท่ีสามารถทํางานได�

ภาพท่ี 1.10 กระบวนการแปลภาษาซี

9

จากภาพท่ี 1.10 เป�นตัวอย#างโปรแกรมท่ีเขียนด�วยภาษาซี ไฟล,รหัสต�นฉบับชื่อว#า easy.c โปรแกรมนี้จะแสดงข�อความ "Easy" ผ#านทางหน�าจอ เม่ือผู�เขียนโปรแกรมได�เขียนโปรแกรมนี้จะได�ไฟล,รหัสต�นฉบับ (ไฟล,ชื่อว#า easy.c) เม่ือต�องการให�โปรแกรมนี้ทํางาน ผู�เขียนโปรแกรมต�องนําไฟล,รหัสต�นฉบับมาผ#านกระบวนการแปลภาษาซี ไฟล,รหัสต�นฉบับจะถูกแปลเป�นภาษาเครื่องหรือไฟล,รหัสอ็อบเจ็ก (Object Code File) (ไฟล,ชื่อว#า easy.obj) ซ่ึงไฟล,รหัสอ็อบเจ็กจะถูกเชื่อมโยง (Link) เข�ากับไฟล,ไลบรารี (Library File) จนได�ไฟล,ท่ีทํางานได� (Executable File) (ไฟล,ชื่อว#า easy.exe) ไฟล,ท่ีทํางานได�นี้ก็คือตัวโปรแกรมท่ีผู�ใช�งานสามารถนําไปใช�งานหรือรัน (Run) บนเครื่องคอมพิวเตอร,อ่ืนได� กระบวนการแปลภาษาคอมพิวเตอร,และไฟล,ท่ีเก่ียวข�องของภาษาคอมพิวเตอร,แต#ละภาษาจะแตกต#างกันไป ผู�เขียนโปรแกรมต�องไปศึกษาภาษาคอมพิวเตอร,นั้นอีกครั้ง ข้ันตอนวิธีการพัฒนาโปรแกรม โดยท่ัวไปแล�วในการเขียนโปรแกรมเพ่ือใช�แก�ป2ญหาต#างๆ หรือตอบสนองต#อความต�องการของผู�ใช�งานนั้น ซ่ึงผู�เขียนโปรแกรมคาดหวังว#าจะได�ผลลัพธ,ออกมาตามท่ีต�องการนั้น เป�นสิ่งท่ีไม#ใช#เรื่องยาก หากผู�เขียนโปรแกรมมีการจัดการแนวคิดในการเขียนโปรแกรมท่ีดีและเขียนโปรแกรมตามแนวคิดท่ีได�จัดทําไว� แต#หากเป�นผู�เริ่มเขียนโปรแกรมเป�นครั้งแรก (ประเภทท่ีเรียกว#า มือใหม#หัดเขียน) หลายคนอาจจะยังไม#ทราบว#าจะเริ่มต�นเขียนโปรแกรมกันอย#างไร เม่ือเขียนโปรแกรมแล�วติดป2ญหา จะสอบถามจากผู�ใดหรือค�นหาข�อมูลจากแหล#งใดได�บ�าง จึงทําให�ผู�เริ่มเขียนโปรแกรมรู�สึกว#าการเขียนโปรแกรมนั้นเป�นเรื่องยาก และบางครั้งอาจทําให�ตัวเองคิดว#า ไม#เหมาะท่ีจะเรียนสาขาวิชาคอมพิวเตอร,นี้ ก็จะถอดใจแล�วลาออก ซ่ึงเป�นเรื่องท่ีน#าเสียดายเวลา ค#าใช�จ#าย และโอกาสเป�นอย#างมาก ดังนั้นในหัวข�อนี้ได�กล#าวถึงข้ันตอนวิธีการพัฒนาโปรแกรม เพ่ือให�ผู�เริ่มเขียนโปรแกรมจะได�เข�าใจในหลักการในการเขียนโปรแกรมมากยิ่งข้ึน ข้ันตอนวิธีการพัฒนาโปรแกรม ประกอบด�วย 7 ข้ันตอน ดังนี้ 1. การวิเคราะห,ป2ญหา (Problem Analysis) 2. การวางแผนและการออกแบบโปรแกรม (Program Planning and Design) 3. การเขียนโปรแกรม (Program Coding) 4. การทดสอบโปรแกรม (Program Testing) 5. การจัดทําคู#มือการใช�งานโปรแกรม (Program Documentation) 6. การนําโปรแกรมไปใช�งานจริง (Program Implementation) 7. การบํารุงรักษาโปรแกรม (Program Maintenance) การวิเคราะห'ป̂ญหา (Problem Analysis) ข้ันตอนนี้เป�นข้ันตอนท่ีสําคัญท่ีสุดของการพัฒนาโปรแกรม ผู�เขียนโปรแกรมจําเป�นท่ีจะต�องเข�าใจป2ญหาให�ได�เสียก#อน แล�วต�องทําการวิเคราะห,ความต�องการของป2ญหาอย#างระมัดระวัง ซ่ึงถ�าเข�าใจป2ญหาอย#างไม#ถูกต�องแล�ว จะทําให�การวิเคราะห,ป2ญหาผิดพลาดได� ซ่ึงจะส#งผลต#อเนื่องไปยังข้ันตอนถัดๆ ไป และในท�ายท่ีสุด โปรแกรมดังกล#าวไม#สามารถใช�แก�ป2ญหาหรือตอบสนองต#อความต�องการของผู�ใช�งานได� ส#งผลทําให�โปรแกรมนั้นไม#สามารถใช�งานได�จริง เกิดความสูญเสียท้ังในด�านเวลา ค#าใช�จ#าย และโอกาส ตัวอย#างของการวิเคราะห,ป2ญหาต้ังแต#ตัวอย#างท่ี 1.1 ถึง 1.4 ท่ีจะได�กล#าวถึงต#อไปนี้ เป�นป2ญหาท่ีสามารถพบได�โดยท่ัวไป ตัวอย#างดังกล#าวได�อธิบายถึงการวิเคราะห,ข�อมูลของป2ญหาเหล#านั้นว#าประกอบด�วยสิ่งนําเข�าคืออะไร มีกระบวนการหรือการประมวลผลอย#างไร และผลลัพธ,ท่ีได�คืออะไร เพ่ือจะได�เข�าใจการวิเคราะห,ป2ญหา จะได�เป�นข�อมูลท่ีนําไปใช�ในการวิเคราะห,ป2ญหาทางด�านการเขียนโปรแกรม ซ่ึงจะได�อธิบายไว�

10

Input Processing Output

ในตัวอย#างท่ี 1.5 และ 1.6 ต#อไป โดยการวิเคราะห,ป2ญหาดังกล#าวนั้นว#าประกอบด�วย สิ่งนําเข�า กระบวนการ และผลลัพธ, เช#นกัน ซ่ึงเป�นส#วนหนึ่งของกระบวนการการทํางานข้ันพ้ืนฐานของคอมพิวเตอร, ดังภาพท่ี 1.11

ภาพท่ี 1.11 กระบวนการการทํางานพ้ืนฐานของคอมพิวเตอร, กระบวนการท่ี 1 คือ การรับข�อมูลเข�า (Input) กระบวนการการทํางานข้ันพ้ืนฐานของคอมพิวเตอร, เริ่มจากการนําข�อมูลเข�าเครื่องคอมพิวเตอร, โดยนําข�อมูลเข�าผ#านทางอุปกรณ,นําเข�า (Input Device) ประเภทต#างๆ เช#น การปrอนข�อมูลตัวอักขระ (Character) ผ#านทางคีย,บอร,ด หรือข�อมูลเสียง (Audio) ผ#านทางไมโครโฟน (Microphone) เป�นต�น กระบวนการท่ี 2 คือ การประมวลผล (Processing) เม่ือนําข�อมูลเข�ามาแล�ว เครื่องคอมพิวเตอร,จะทําการประมวลผลข�อมูลตามคําสั่งท่ีได�รับมา เพ่ือให�ได�ผลลัพธ,ตามท่ีต�องการ ตัวอย#างการประมวลผลคือ การหาผลรวม การหาค#าท่ีมากท่ีสุด หรือการหาค#าเฉลี่ย เป�นต�น กระบวนการท่ี 3 คือ การแสดงผลลัพธ, (Output) เม่ือข�อมูลผ#านการประมวลผลแล�วจะได�ผลลัพธ, ผลลัพธ,ท่ีได�ถูกนํามาแสดงผลผ#านทางอุปกรณ,แสดงผล (Output Device) ประเภทต#างๆ เช#น ข�อมูลอักขระหรือรูปภาพผ#านหน�าจอ (Monitor) ข�อมูลเสียงผ#านทางลําโพง (Speaker) หรือข�อมูลถูกพิมพ,บนกระดาษผ#านเครื่องพิมพ, (Printer) เป�นต�น ตัวอย.างท่ี 1.1 ถ�าต�องการต�มไข# ในการวิเคราะห,ป2ญหาของตัวอย#างนี้ ต�องวิเคราะห,ข�อมูลว#า สิ่งท่ีโจทย,ต�องการคืออะไร สิ่งท่ีใช�ต�มคืออะไร และมีข้ันตอนในการต�มไข#อย#างไรบ�าง สิ่งท่ีโจทย,ต�องการ คือ ไข#ต�ม (สิ่งท่ีโจทย,ต�องการ ในท่ีนี้จะหมายถึง ผลลัพธ,) สิ่งท่ีใช�ต�ม คือ ไข#ไก#หรือไข#เป�ด (สิ่งท่ีใช�ต�ม ในท่ีนี้จะหมายถึง สิ่งนําเข�า หรือวัตถุดิบ) ข้ันตอนในการต�มไข# จะประกอบด�วย (ข้ันตอนในการต�มไข# ในท่ีนี้จะหมายถึง กระบวนการหรือการประมวลผล) 1. ต�มน้ําให�เดือด 2. ใส#ไข# 3. รอประมาณ 10 นาที 4. ดับไฟและปPดเตา 5. ปลอกเปลือกไข# สามารถเขียนการวิเคราะห,ข�อมูลใหม#ได� ดังนี้ ส่ิงนําเข�า คือ ไข#ไก#หรือไข#เป�ด การประมวลผล คือ 1. ต�มน้ําให�เดือด 2. ใส#ไข# 3. รอประมาณ 10 นาที 4. ดับไฟและปPดเตา 5. ปลอกเปลือกไข#

ภาพท่ี 1.12 การต�มไข# ท่ีมา : จากเว็บไซต� Trattun http://trattun.exteen.com

11

ผลลัพธ' คือ ไข#ต�มสุก ตัวอย.างท่ี 1.2 ถ�าต�องการอุ#นอาหารด�วยเตาไมโครเวฟ สามารถวิเคราะห,ข�อมูลได� ดังนี้ ส่ิงนําเข�า คือ อาหารท่ีต�องการอุ#น การประมวลผล คือ 1. เปPดฝาเตาไมโครเวฟ 2. ใส#อาหาร 3. ต้ังอุณหภูมิและเวลา 4. กดปุYมทํางาน 5. เตาไมโครเวฟทํางาน 6. เม่ือกริ่งดัง และเตาไมโครเวฟหยุดทํางาน 7. เปPดฝาเตาไมโครเวฟ และนําอาหารท่ีอุ#นแล�วออกมา ผลลัพธ' คือ อาหารอุ#นแล�ว ตัวอย.างท่ี 1.3 ถ�าต�องการข้ึนลิฟท,จากชั้น 3 ไปชั้น 101 สามารถวิเคราะห,ข�อมูลได� ดังนี้ ส่ิงนําเข�า คือ คนอยู#ท่ีชั้น 3 การประมวลผล คือ 1. ยืนหน�าลิฟท,และกดปุYมข้ึน 2. ยืนรอลิฟท, 3. เม่ือลิฟท,มาถึง

3.1 ไฟปุYมข้ึนดับ รอประตูลิฟท,เปPดและเดินเข�าไปในลิฟท, จากนั้นให�ข�ามไปทําข้ันตอนท่ี 4 3.2 ไฟปุYมข้ึนไม#ดับ ให�กลับไปทําข้ันตอนท่ี 2 4. กดปุYมหมายเลขชั้น 101 5. ประตูลิฟท,ปPด 6. เม่ือถึงชั้น 101 และประตูลิฟท,เปPดออก 7. เดินออกจากลิฟท, ผลลัพธ' คือ คนอยู#ท่ีชั้น 101 ตัวอย.างท่ี 1.4 ถ�าต�องการบวกเลข 2 จํานวนด�วยเครื่องคิดเลข เช#น 35 บวก 69 เป�นต�น สามารถวิเคราะห,ข�อมูลได� ดังนี้ ส่ิงนําเข�า คือ ตัวเลข 35 และ 69 การประมวลผล คือ 1. เปPดเครื่องคิดเลข 2. กดปุYมตัวเลข 3 และ 5 3. กดปุYมเครื่องหมาย + 4. กดปุYมตัวเลข 6 และ 9 5. กดปุYม = 6. เครื่องคิดเลขคํานวณผลบวก

ภาพท่ี 1.13 การอุ#นอาหารด�วยเตาไมโครเวฟ ท่ีมา : จากเว็บไซต�กระทรวงวิทยาศาสตร�และเทคโนโลยี http://www.most.go.th

ภาพท่ี 1.14 การข้ึนลิฟท, ท่ีมา : จากเว็บไซต� Axis Lifts http://www.axislifts.co.in

ภาพท่ี 1.15 เครื่องคิดเลข ท่ีมา : จากเว็บไซต�MissThrifty http://www.miss-thrifty.co.uk

12

7. ดูผลลัพธ, ผลลัพธ' คือ ตัวเลข 104 ตัวอย.างท่ี 1.5 จงเขียนโปรแกรมหาผลคูณของเลขจํานวนเต็ม 2 จํานวน โดยรับข�อมูลผ#านทางคีย,บอร,ด แล�วแสดงผลลัพธ,ผ#านทางหน�าจอ สามารถวิเคราะห,ข�อมูลได� ดังนี้ ส่ิงนําเข�า คือ ตัวเลขจํานวนเต็ม 2 จํานวน การประมวลผล คือ 1. รับตัวเลขจํานวนเต็มตัวแรก เก็บไว�ในตัวแปร a 2. รับตัวเลขจํานวนเต็มตัวท่ีสอง เก็บไว�ในตัวแปร b 3. นําตัวแปร a มาคูณด�วยตัวแปร b (a x b) เก็บค#าไว�ในตัวแปร mul (mul = a x b) 4. แสดงค#าของตัวแปร mul ท่ีหน�าจอ ผลลัพธ' คือ ค#าของตัวแปร mul ตัวอย.างท่ี 1.6 จงเขียนโปรแกรมหาพ้ืนท่ีสามเหลี่ยม โดยรับข�อมูลความยาวฐานและความสูงผ#านทางคีย,บอร,ด แล�วแสดงผลลัพธ,ผ#านทางหน�าจอ สามารถวิเคราะห,ข�อมูลได� ดังนี้ ส่ิงนําเข�า คือ ข�อมูลความยาวฐานและความสูง การประมวลผล คือ 1. รับตัวเลขความยาวฐาน เก็บไว�ในตัวแปร L 2. รับตัวเลขความสูง เก็บไว�ในตัวแปร H 3. หาค#าพ้ืนท่ีของสามเหลี่ยมจากสูตร ½ x ฐาน x สูง เก็บค#าไว� ในตัวแปร AREA (AREA = 1/2 x L x H) 4. แสดงค#าของตัวแปร AREA ท่ีหน�าจอ ผลลัพธ' คือ ค#าของตัวแปร AREA การวางแผนและการออกแบบโปรแกรม (Program Planning and Design) เม่ือได�ทําการวิเคราะห,ป2ญหาจากข้ันตอนท่ีผ#านมาแล�ว ผู�เขียนโปรแกรมต�องวางแผนและออกแบบโปรแกรม โดยการวางแผนและออกแบบโปรแกรมคือ การนําข�อมูลท่ีได�จากการวิเคราะห,ป2ญหามาวางแผนและออกแบบโปรแกรม เพ่ือให�ทราบว#า มีข้ันตอนวิธีหรืออัลกอริท่ึมอย#างไรในการเขียนโปรแกรมเพ่ือแก�ป2ญหาหรือตอบสนองต#อความต�องการของผู�ใช�งาน อัลกอริท่ึมหรือข้ันตอนวิธี (Algorithm) หมายถึง กระบวนการแก�ป2ญหาท่ีสามารถเข�าใจได� มีลําดับหรือวิธีการในการแก�ไขป2ญหาใดป2ญหาหนึ่งอย#างเป�นข้ันเป�นตอนและชัดเจน เม่ือนําเข�าอะไร แล�วจะต�องได�ผลลัพธ,เช#นไร ซ่ึงแตกต#างจากการแก�ป2ญหาแบบสามัญสํานึกหรือฮิวริสติก (Heuristic) (ท่ีมา : จากเว็บไซต�วิกิพีเดีย สารานุกรมเสรี http://th.wikipedia.org) ซ่ึงอัลกอริท่ึมแบ#งได� 2 รูปแบบ คือ 1. ผังงาน (Flowchart) คือ การเขียนอัลกอริท่ึมโดยใช�สัญลักษณ,รูปภาพเป�นตัวสื่อความหมาย (ท่ีมา อรพินธ� ประวัติบริสุทธิ์, คูYมือเรียนภาษาซี, พ.ศ.2547, หนNา 20) 2. รหัสเทียม (Pseudocode) คือ การเขียนอัลกอริท่ึมโดยใช�คําหรือประโยคในภาษาไทยหรือภาษาอังกฤษท่ีอธิบายข้ันตอนการทํางานท่ีสื่อความหมายให�เข�าใจได�ง#ายๆ เพ่ือสะดวกต#อการนําไปเขียนเป�นโปรแกรมจริงต#อไป (สําหรับป2ญหาทางด�านการเขียนโปรแกรม) รหัสเทียมจะข้ึนต�นด�วยคําว#า "เริ่มต�น" และปPด

ภาพท่ี 1.16 รูปสามเหลี่ยม

13

ใส#ไข#

รอประมาณ 10 นาที

ต�มนํ้าให�เดือด เริ่มต�น

ปลอกเปลือก ดับไฟและปPดเตา

สิ้นสุด

ท�ายด�วยคําว#า "ส้ินสุด" และในระหว#างเริ่มต�นและสิ้นสุด จะเป�นคําสั่งท่ีระบุข้ันตอนการทํางานต้ังแต#ต�นจนจบ โดยเรียงลําดับคําสั่งจากบนลงล#างและจากซ�ายไปขวา ตัวอย.างท่ี 1.7 ถ�าต�องการต�มไข# สามารถนํามาเขียนเป�นผังงานและรหัสเทียมได� ดังนี้

ผังงาน รหัสเทียม

เริ่มต�น ต�มน้ําให�เดือด ใส#ไข# รอประมาณ 10 นาที ดับไฟและปPดเตา ปลอกเปลือกไข# ส้ินสุด

14

ตัวอย.างท่ี 1.8 ถ�าต�องการอุ#นอาหารด�วยตู�ไมโครเวฟ สามารถนํามาเขียนเป�นผังงานและรหัสเทียมได� ดังนี้

ผังงาน รหัสเทียม

เริ่มต�น เปPดฝาเตาไมโครเวฟ ใส#อาหาร ต้ังอุณหภูมิและเวลา กดปุYมทํางาน เตาไมโครเวฟทํางาน เม่ือกริ่งดังและเตาไมโครเวฟหยุดทํางาน เปPดฝาเตาไมโครเวฟและนําอาหารท่ีอุ#นแล�วออกมา ส้ินสุด

ใส#อาหาร

ตั้งอุณหภูมแิละเวลา

เปPดฝาเตาไมโครเวฟ

เริ่มต�น

เตาไมโครเวฟทํางาน

กดปุYมทํางาน

สิ้นสุด

โครเวฟหยดุทํางาน

เปPดฝาเตาไมโครเวฟ และนําอาหารท่ีอุ#นแล�วออกมา

เมื่อกริ่งดังและเตาไมโครเวฟ

หยุดทํางาน

15

ตัวอย.างท่ี 1.9 ถ�าต�องการข้ึนลิฟท,จากชั้น 3 ไปชั้น 101 สามารถนํามาเขียนเป�นผังงานและรหัสเทียมได� ดังนี้

ผังงาน รหัสเทียม

เริ่มต�น ยืนหน�าลิฟท,และกดปุYมข้ึน ยืนรอลิฟท, เม่ือลิฟท,มาถึง - ไฟปุYมข้ึนดับ รอประตูลิฟท,เปPดและเดินเข�าไปในลิฟท, จากนั้นให�ข�ามไปทําข้ันตอนกดปุYมหมายเลขชั้น 101 - ไฟปุYมข้ึนไม#ดับ ให�กลับไปทําข้ันตอนยืนรอลิฟท, กดปุYมหมายเลขชั้น 101 ประตูลิฟท,ปPด เม่ือถึงชั้น 101 และประตูลิฟท,เปPดออก เดินออกจากลิฟท, ส้ินสุด

ยืนรอลิฟท, ยืนหน�าลิฟท,และกดปุYมข้ึน

เริ่มต�น

สิ้นสุด

ไฟปุYมข้ึน ไม#ดับ

ดับ

เมื่อลิฟท,มาถึง

รอประตูลิฟท,เปPด

เดินเข�าไปในลิฟท,

กดปุYมหมายเลขช้ัน 101

ประตลูิฟท,ปPด

เดินออกจากลิฟท,

เมื่อถึงช้ัน 101 และประตลูิฟท,เปPด

16

ตัวอย.างท่ี 1.10 ถ�าต�องการบวกเลข 2 จํานวนด�วยเครื่องคิดเลข เช#น 35 บวก 69 เป�นต�น สามารถนํามาเขียนเป�นผังงานและรหัสเทียมได� ดังนี้

ผังงาน รหัสเทียม

เริ่มต�น เปPดเครื่องคิดเลข กดปุYมตัวเลข 3 และ 5 กดปุYมเครื่องหมาย + กดปุYมตัวเลข 6 และ 9 กดปุYม = เครื่องคิดเลขคํานวณผลบวก ดูผลลัพธ, ส้ินสุด

กดปุYมตัวเลข 3 และ 5

เปPดเครื่องคิดเลข

เริ่มต�น

สิ้นสุด

เครื่องคิดเลขคํานวณผลบวก

กดปุYม +

กดปุYมตัวเลข 6 และ 9

ดูผลลัพธ,

กดปุYม =

17

ตัวอย.างท่ี 1.11 จงเขียนโปรแกรมหาผลคูณของเลขจํานวนเต็ม 2 จํานวน โดยรับข�อมูลผ#านทางคีย,บอร,ด แล�วแสดงผลลัพธ,ผ#านทางหน�าจอ สามารถนํามาเขียนเป�นผังงานและรหัสเทียมได� ดังนี้

ผังงาน รหัสเทียม

เริ่มต�น รับตัวเลขจํานวนเต็มตัวแรก เก็บไว�ในตัวแปร a รับตัวเลขจํานวนเต็มตัวท่ีสอง เก็บไว�ในตัวแปร b นําตัวแปร a มาคูณด�วยตัวแปร b (a x b) เก็บค#าไว�ในตัวแปร mul (mul = a x b) แสดงค#าของตัวแปร mul ท่ีหน�าจอ ส้ินสุด

ตัวอย.างท่ี 1.12 จงเขียนโปรแกรมหาพ้ืนท่ีสามเหลี่ยม โดยรับข�อมูลความยาวฐานและความสูงผ#านทางคีย,บอร,ด แล�วแสดงผลลัพธ,ผ#านทางหน�าจอ สามารถนํามาเขียนเป�นผังงานและรหัสเทียมได� ดังนี้

ผังงาน รหัสเทียม

เริ่มต�น รับตัวเลขความยาวฐาน เก็บไว�ในตัวแปร L รับตัวเลขความสูง เก็บไว�ในตัวแปร H หาค#าพ้ืนท่ีของสามเหลี่ยมจากสูตร ½ x L x H เก็บค#าไว�ในตัวแปร AREA (AREA = ½ x L x H) แสดงค#าของตัวแปร AREA ท่ีหน�าจอ ส้ินสุด

รับตัวเลขความยาวฐาน

เริ่มต�น

สิ้นสุด แสดงค#าตัวแปร AREA

เก็บไว�ในตัวแปร L

รับตัวเลขความสูง เก็บไว�ในตัวแปร H

เอา ½ x L x H เก็บค#าไว�ท่ีตัวแปร AREA

รับตัวเลขตัวแรก

เริ่มต�น

สิ้นสุด

แสดงค#าของตัวแปร mul

เก็บไว�ในตัวแปร a

รับตัวเลขตัวท่ี 2 เก็บไว�ในตัวแปร b

เอา a x b เก็บค#าไว�ท่ีตัวแปร mul

18

การเขียนโปรแกรม (Program Coding) ในข้ันตอนการเขียนโปรแกรมนี้ จะนําเอาอัลกอริท่ึมท่ีได�จากข้ันตอนการวางแผนและออกแบบโปรแกรมมาทําการเขียนโปรแกรม โดยโปรแกรมท่ีจะเขียนนั้นต�องถูกต�องตามหลักวากยสัมพันธ'หรือไวยากรณ' (Syntax) ของภาษาคอมพิวเตอร,นั้นๆ เพ่ือให�โปรแกรมสามารถทํางานได�โดยไม#เกิดข�อผิดพลาด (Error) ใดๆ ข้ึนมา การเขียนโปรแกรมเปรียบเสมือนกับการสร�างสรรค,นวัตกรรมข้ึนมา ผู�เขียนโปรแกรมแต#ละคน จะมีวิธีการคิดในการเขียนโปรแกรมท่ีแก�ป2ญหาเดียวกันแตกต#างกันไป โดยผลลัพธ,ท่ีได�จะเหมือนกัน วิธีการเขียนโปรแกรมท่ีแตกต#างกันในแต#ละคนนั้น ข้ึนกับอัลกอริท่ึมท่ีแต#ละคนได�คิดและวิเคราะห,ในข้ันตอนการวิเคราะห,ป2ญหาและการวางแผนและออกแบบโปรแกรมไว�นั่นเอง จากตัวอย#างท่ี 1.11 และ 1.12 เม่ือนําอัลกอริท่ึมท่ีได�วางแผนและออกแบบไว�แล�ว สามารถเขียนโปรแกรมได�ดังตัวอย#างท่ี 1.13 และ 1.14 ตามลําดับ ดังนี้ ตัวอย.างท่ี 1.13 จงเขียนโปรแกรมหาผลคูณของเลขจํานวนเต็ม 2 จํานวน โดยรับข�อมูลผ#านทางคีย,บอร,ด แล�วแสดงผลลัพธ,ผ#านทางหน�าจอ สามารถนํามาเขียนโปรแกรมได� ดังนี้

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> void main(void) { int a, b, mul; printf("Enter number 1 : "); scanf("%d", &a); printf("Enter number 2 : "); scanf("%d", &b); mul = a * b; printf("The multiply is %d", mul); }

ภาพท่ี 1.17 รหัสต�นฉบับของโปรแกรมหาผลคูณของเลขจํานวนเต็ม 2 จํานวน เม่ือนํารหัสต�นฉบับของโปรแกรมนี้ผ#านการคอมไพล,และรัน จะได�ผลลัพธ, ดังภาพท่ี 1.18

ก. รอรับตัวเลขจํานวนเต็มตัวแรก ข. ปrอนตัวเลข 35 แล�วกดปุYม Enter

ค. รอรับตัวเลขจํานวนเต็มตัวท่ี 2

19

ง. ปrอนตัวเลข 69 แล�วกดปุYม Enter

จ. แสดงผลลัพธ,ของการคูณ

ภาพท่ี 1.18 ผลลัพธ,ของการรันโปรแกรมหาผลคูณของเลขจํานวนเต็ม 2 จํานวน ตัวอย.างท่ี 1.14 จงเขียนโปรแกรมหาพ้ืนท่ีสามเหลี่ยม โดยรับข�อมูลความยาวฐานและความสูงผ#านทางคีย,บอร,ด แล�วแสดงผลลัพธ,ผ#านทางหน�าจอ สามารถนํามาเขียนโปรแกรมได� ดังนี้

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> void main(void) { int L, H; double AREA; printf("Enter length of triangle : "); scanf("%d", &L); printf("Enter height of triangle : "); scanf("%d", &H); AREA = (L * H) / 2; printf("The area of this triangle is %d", AREA); }

ภาพท่ี 1.19 รหัสต�นฉบับของโปรแกรมหาพ้ืนท่ีสามเหลี่ยม เม่ือนํารหัสต�นฉบับของโปรแกรมนี้ผ#านการคอมไพล,และรัน จะได�ผลลัพธ, ดังภาพท่ี 1.20

ก. รอรับความยาวฐาน ข. ปrอนตัวเลข 15 แล�วกดปุYม Enter

ค. รอรับความสูง

20

ง. ปrอนตัวเลข 8แล�วกดปุYม Enter จ. แสดงผลลัพธ,ของพ้ืนท่ีสามเหลี่ยม

ภาพท่ี 1.20 ผลลัพธ,ของการรันโปรแกรมหาพ้ืนท่ีสามเหลี่ยม การทดสอบโปรแกรม (Program Testing) หลังจากท่ีผู�เขียนโปรแกรมได�เขียนโปรแกรมเสร็จแล�ว เพ่ือให�เกิดความม่ันใจว#า โปรแกรมดังกล#าวเม่ือผู�ใช�งานนําไปใช�งานจะไม#เกิดข�อผิดพลาดอะไรเกิดข้ึน ผู�เขียนโปรแกรมจะต�องมีการทดสอบโปรแกรมเพ่ือตรวจสอบผลลัพธ,ท่ีได�ว#ามีความถูกต�องหรือไม# โดยจะต�องทําการทดสอบหลายๆ ครั้ง หากผลลัพธ,ท่ีได�ยังถูกต�องแสดงว#า โปรแกรมนี้ถูกต�องแล�ว แต#ถ�าถูกบ�างผิดบ�างหรือผิดทุกครั้ง แสดงว#าโปรแกรมนี้ยังมีข�อผิดพลาดอยู# ซ่ึงผู�เขียนโปรแกรมต�องกลับไปดูรหัสต�นฉบับและทําการแก�ไขโปรแกรมให�ถูกต�อง จากนั้นทําการทดสอบโปรแกรมซํ้าอีกครั้ง การจัดทําคู.มือการใช�งานโปรแกรม (Program Documentation) เม่ือโปรแกรมผ#านการทดสอบว#าไม#มีข�อผิดพลาดใดๆ แล�ว ผู�เขียนโปรแกรมต�องจัดทําคู#มือการใช�งานโปรแกรมด�วย เนื่องจากผู�ใช�งานอาจจะไม#ทราบว#าโปรแกรมดังกล#าวมีการใช�งานอย#างไร โดยเฉพาะโปรแกรมท่ีมีขนาดใหญ#ท่ีมีข้ันตอนการใช�งานท่ียุ#งยาก หรืออาจมีหลายหน�าจอ คู#มือการใช�งานโปรแกรมท่ีได�จัดทําข้ึน ช#วยให�ผู�ใช�งานเข�าใจการทํางานของโปรแกรมเป�นอย#างดี และช#วยลดข�อผิดพลาดจากการใช�งานอีกด�วย รวมท้ังยังช#วยลดภาระของผู�เขียนโปรแกรมท่ีต�องคอยตอบข�อสงสัยให�แก#ผู�ใช�งานกรณีท่ีไม#เข�าใจ จะได�นําเวลาท่ีเสียไปไปเขียนโปรแกรมอ่ืนๆ ได� การนําโปรแกรมไปใช�งานจริง (Program Implementation) เม่ือโปรแกรมกับคู#มือการใช�งานโปรแกรมพร�อมใช�งาน ผู�เขียนโปรแกรมจะนําโปรแกรมไปติดต้ังท่ีเครื่องคอมพิวเตอร,ของผู�ใช�งาน พร�อมกับแนะนําวิธีการใช�งานโปรแกรมอย#างคร#าวๆ และแจ�งแก#ผู�ใช�งานว#าควรศึกษาข้ันตอนการใช�งานจากคู#มือการใช�งานโปรแกรมอย#างละเอียด การบํารุงรักษาโปรแกรม (Program Maintenance) ในระหว#างท่ีผู�ใช�งานได�ใช�โปรแกรมไปสักระยะเวลาหนึ่ง อาจพบข�อผิดพลาดของโปรแกรมเกิดข้ึน หรือโปรแกรมไม#ตอบสนองต#อความต�องการในบางอย#างหรือท้ังหมด จําเป�นท่ีผู�ใช�งานต�องแจ�งแก#ผู�เขียนโปรแกรมให�รับทราบ เพ่ือทําการบํารุงรักษาโปรแกรมท่ียังมีข�อผิดพลาดอยู# หรืออาจต�องเขียนโปรแกรมข้ึนมาใหม# กรณีท่ีพบว#าโปรแกรมไม#ตอบสนองต#อความต�องการของผู�ใช�งาน ซ่ึงการเขียนโปรแกรมใหม#นั้น จะวนเข�าสู#ข้ันตอนวิธีการพัฒนาโปรแกรมใหม#อีกครั้ง

21

อัลกอริทึ่ม ในการออกแบบอัลกอริท่ึมท่ีนํามาใช�ในการวิเคราะห,และออกแบบโปรแกรมนั้น จําเป�นท่ีผู�เริ่มเขียนโปรแกรมต�องทราบถึงหลักการเขียนอัลกอริท่ึมท่ีดีและมีประสิทธิภาพของอัลกอริท่ึม โดยมีรายละเอียดดังต#อไปนี้ หลักการเขียนอัลกอริท่ึมท่ีดี การเขียนอัลกอริท่ึมท่ีดี ประกอบด�วยคุณสมบัติต#างๆ ดังนี้ 1. มีความถูกต�อง (Correctness) อัลกอริท่ึมท่ีดีควรออกแบบด�วยกฎเกณฑ,ท่ีเป�นมาตรฐาน 2. ง.ายต.อการอ.าน (Readability) อัลกอริท่ึมท่ีดีควรออกแบบให�ง#าย เพ่ือให�ผู�นําไปใช�สามารถเข�าใจได�ง#ายโดยไม#เกิดความสับสน 3. ปรับปรุงได�ง.ายต.ออนาคต (Ease of Modification) อัลกอริท่ึมท่ีดีควรออกแบบให�สามารถปรับเปลี่ยนได�ง#าย หากป2ญหาท่ีต�องการแก�นั้นเกิดการเปลี่ยนแปลงข้ึนในอนาคต 4. นํากลับมาใช�ใหม.ได� (Reusability) ถ�าสามารถออกแบบอัลกอริท่ึมได�ดีแล�ว ยังสามารถนําเอาอัลกอริท่ึมนั้นกลับมาใช�แก�ป2ญหาในลักษณะใกล�เคียงกันใหม#ได� 5. มีประสิทธิภาพ (Efficiency) อัลกอริท่ึมท่ีดีควรจะต�องมีประสิทธิภาพ ซ่ึงได�อธิบายถึงในหัวข�อถัดไป ประสิทธิภาพของอัลกอริท่ึม ในการออกแบบอัลกอริท่ึมข้ึนมาเพ่ือใช�แก�ป2ญหา ผู�เขียนโปรแกรมแต#ละคนอาจออกแบบในการแก�ป2ญหาให�มีความแตกต#างกันได� โดยข้ึนอยู#กับวิธีการคิด เง่ือนไข และข�อจํากัดต#างๆ เพ่ือให�ได�มาซ่ึงอัลกอริท่ึมท่ีเหมาะสมท่ีสุด อย#างไรก็ตามในการพิจารณาถึงประสิทธิภาพของอัลกอริท่ึม จะต�องพิจารณาถึงเกณฑ,พ้ืนฐานของอัลกอริท่ึมท่ีดี โดยมีรายละเอียดดังต#อไปนี้ 1. ใช�เวลาในการดําเนินการน�อยท่ีสุด อัลกอริท่ึมท่ีดีควรมีข้ันตอนต#างๆ เท#าท่ีจําเป�น เพ่ือให�การดําเนินการเกิดความรวดเร็ว 2. ใช�หน.วยความจําน�อยท่ีสุด หากพ้ืนท่ีในหน#วยความจําของเครื่องคอมพิวเตอร,ถูกใช�ไปจํานวนมาก จะทําให�เครื่องคอมพิวเตอร,เกิดการทํางานล#าช�าได� ดังนั้นจึงควรหลีกเลี่ยงคําสั่งหรือข�อมูลท่ีไม#เก่ียวข�อง 3. มีความยืดหยุ.น อัลกอริท่ึมท่ีดีควรออกแบบให�ยืดหยุ#น สามารถปรับเปลี่ยนได�ง#าย 4. ใช�เวลาในการพัฒนาน�อยท่ีสุด ควรออกแบบอัลกอริท่ึมไม#ให�มีความซับซ�อนมากเกินไป เนื่องจากหากมีความซับซ�อนมาก จะส#งผลต#อเวลาท่ีใช�ในการพัฒนาโปรแกรมมากยิ่งข้ึน 5. ง.ายต.อการทําความเข�าใจ อัลกอริท่ึมท่ีดีควรออกแบบท่ีใช�คําสั่งด�วยคําหรือประโยคท่ีเป�นมาตรฐาน เม่ือผู�อ่ืนมาศึกษาหรือผู�เขียนโปรแกรมอ#านแล�วเข�าใจโดยไม#เกิดความสับสน ผังงาน ในการออกแบบอัลกอริท่ึมด�วยผังงาน จําเป�นท่ีผู�เขียนโปรแกรมจะต�องเข�าใจสัญลักษณ,รูปภาพของผังงาน วิธีการเขียนผังงานท่ีดี และประโยชน,ของการเขียนผังงาน โดยมีรายละเอียดดังต#อไปนี้ สัญลักษณ'รูปภาพของผังงาน ในการเขียนอัลกอริท่ึมแบบผังงานนั้น ผู�เริ่มเขียนโปรแกรมจําเป�นท่ีจะต�องทราบเก่ียวกับสัญลักษณ,รูปภาพต#างๆ ท่ีใช�งานว#ามีอะไรบ�างและแต#ละสัญลักษณ,รูปภาพใช�เพ่ืออะไร เพ่ือจะได�เขียนผังงานได�อย#างถูกต�องและรวดเร็ว

22

สัญลักษณ,รูปภาพเป�นสัญลักษณ,ตามมาตรฐานสถาบันมาตรฐานอเมริกันหรือ ANSI (American National Standards Institute) โดยสัญลักษณ,รูปภาพของผังงานท่ีนิยมใช�กัน ประกอบด�วย 1. สัญลักษณ,รูปภาพนี้ แสดงจุดเริ่มต�นและสิ้นสุดของผังงาน ตัวอย.าง แสดงจุดเริ่มต�นของผังงาน แสดงจุดสิ้นสุดของผังงาน 2. สัญลักษณ,รูปภาพนี้ รับหรือแสดงข�อมูลโดยไม#ระบุชนิดของอุปกรณ, ตัวอย.าง หรือ รับค#า A โดยไม#ระบุชนิดของอุปกรณ, หรือ แสดงค#า Z โดยไม#ระบุชนิดของอุปกรณ, 3. สัญลักษณ,รูปภาพนี้ ปrอนข�อมูลด�วยคีย,บอร,ด ตัวอย.าง หรือ ปrอนค#า b ทางคีย,บอร,ด 4. สัญลักษณ,รูปภาพนี้ แสดงผลลัพธ,ทางหน�าจอหรือจอภาพ ตัวอย.าง หรือ แสดงค#า x ทางหน�าจอหรือจอภาพ 5. สัญลักษณ,รูปภาพนี้ แสดงการกําหนดค#า การคํานวณหรือการประมวลผลคําสั่งใดๆ ตัวอย.าง การกําหนดค#า โดยกําหนด x ให�มีค#าเท#ากับ 0 การคํานวณ โดยนํา a มาบวกด�วย b แล�วเก็บผลลัพธ,ไว�ท่ี x 6. สัญลักษณ,รูปภาพนี้ แสดงข�อมูลหรือผลลัพธ,ลงบนกระดาษผ#านทางเครื่องพิมพ, ตัวอย.าง หรือ พิมพ,ค#า x ลงบนกระดาษผ#านทางเครื่องพิมพ, 7. สัญลักษณ,รูปภาพนี้ แสดงการเปรียบเทียบ การตัดสินใจ หรือการตรวจสอบเง่ือนไขเพ่ือตัดสินใจในการทํางาน ตัวอย.าง การเปรียบเทียบ โดยเปรียบเทียบ y มีค#ามากกว#า 5 หรือไม#? การเปรียบเทียบ โดยเปรียบเทียบ i มีค#าน�อยกว#าหรือเท#ากับ 0 หรือไม#?

เริ่มต�น

สิ้นสุด

อ#านค#า A Read A

แสดงผล Z Display Z

อ#านค#า b Read b

แสดงผล x Show x

x = 0

x = a + b

เขียน x Write x

y > 5

i <= 0

23

8. สัญลักษณ,รูปภาพนี้ แสดงทิศทางการทํางาน โดยทิศทางดูจากหัวลูกศรท่ีชี้ไป ตัวอย.าง

9. สัญลักษณ,รูปภาพนี้ แสดงจุดเชื่อมต#อในหน�าเดียวกัน ตัวอย.าง

วิธีการเขียนผังงานท่ีดี 1. ใช�สัญลักษณ,รูปภาพตามท่ีกําหนดไว�เท#านั้น 2. ขนาดของสัญลักษณ,รูปภาพ ไม#ควรเล็กหรือใหญ#มากเกินไป 3. ข�อความหรือคําอธิบายในสัญลักษณ,รูปภาพ ควรให�สั้น กะทัดรัด และเข�าใจง#าย 4. ใช�ลูกศรแสดงทิศทางการไหลของข�อมูล จากบนลงล#าง หรือจากซ�ายไปขวา 5. ทุกผังงานต�องมีลูกศรแสดงทิศทางเข�าหรือออก 6. สําหรับสัญลักษณ,รูปภาพท่ีอยู#ห#างกันมากๆ ไม#แนะนําให�โยงเส�นเชื่อมถึงกัน ควรใช�สัญลักษณ,รูปภาพจุดเชื่อมต#อแทน 7. ผังงานควรมีการทดสอบความถูกต�องของการทํางานก#อนนําไปใช�งานจริง ประโยชน'ของการเขียนผังงาน 1. ช#วยทําให�ลําดับการทํางานของการวิเคราะห,และออกแบบโปรแกรมจากป2ญหานั้นง#ายข้ึน ส#งผลทําให�การนําไปเขียนเป�นโปรแกรมเป�นไปอย#างสะดวกและรวดเร็ว 2. สามารถทําการตรวจสอบ แก�ไข และดัดแปลงผังงาน ทําได�ง#ายข้ึน 3. ช#วยให�ผู�อ่ืนสามารถศึกษาการทํางานของผังงานได�เข�าใจง#ายและรวดเร็วมากยิ่งข้ึน

...

ไม#ใช#

อ#านค#า a

แสดงผล a

a > 5

ใช#

...

...

a > 5

...

x = a + 1 x = a + 5

ใช# ไม#ใช#

แสดงผล a

เปรียบเทียบ a มีค#ามากกว#า 5 หรือไม#? ถ�า a มีมากกว#า 5 ให�นํา a ไปบวกด�วย 5 แล�วเก็บผลลัพธ,ไว�ท่ี x จากนั้นไปรอท่ีจุดเชื่อมต#อ แต#ถ�า a มีค#าน�อยกว#าหรือเท#ากับ ให�นํา a ไปบวกด�วย 1 แล�วเก็บผลลัพธ,ไว�ท่ี x จากนั้นไปท่ีจุดเชื่อมต#อแล�วไปแสดงผล a ท่ีหน�าจอ

อ#านค#า a จากนั้นให�ไปเปรียบเทียบ a ว#ามีค#ามากกว#า 5 หรือไม#? ถ�าไม#ใช#ให�กลับไปอ#านค#า a อีกครั้ง แต#ถ�าใช#ให�ไปแสดงผล a ท่ีหน�าจอ

24

รหัสเทียม ในการออกแบบอัลกอริท่ึมด�วยรหัสเทียม จําเป�นท่ีผู�เขียนโปรแกรมต�องเข�าใจวิธีการเขียนรหัสเทียม และประโยชน,ของรหัสเทียม โดยมีรายละเอียดดังต#อไปนี้ วิธีการเขียนรหัสเทียม รหัสเทียม เป�นคําสั่งท่ีไม#ข้ึนกับภาษาคอมพิวเตอร,ใดภาษาหนึ่ง แต#เป�นคําสั่งท่ีนํามาใช�ในการเขียนเลียนแบบชุดคําสั่งแบบย#อๆ เพ่ือสะดวกต#อการนํามาใช�ในการออกแบบโปรแกรม หรือเป�นการร#างเค�าโครงโปรแกรมข้ึนมาก#อนท่ีนําไปแปลงเป�นชุดคําสั่งด�วยภาษาคอมพิวเตอร,จริงต#อไป ในการเขียนรหัสเทียม ยังไม#มีหน#วยงานใดกําหนดกฎเกณฑ,หรือมาตรฐานข้ึนมา ทําให�การเขียนรหัสเทียมของผู�เขียนโปรแกรมแต#ละคนในป2ญหาเดียวกันนั้นแตกต#างกันออกไป ดังนั้นหลักการต#อไปนี้ จึงเป�นเพียงแค#แนวทางท่ีช#วยให�ผู�เขียนโปรแกรมสามารถเขียนรหัสเทียมได� ดังนี้ 1. กําหนดจุดเริ่มต�นด�วยคําว#า "เริ่มต�น" หรือ "Begin" และจุดสิ้นสุดด�วยคําว#า "สิ้นสุด" หรือ "End" 2. ควรเขียนคําสั่งของรหัสเทียมด�วยคําหรือประโยคในภาษาไทยหรือภาษาอังกฤษ 3. การเขียนรหัสเทียมแต#ละคําสั่ง ควรเขียนเป�นบรรทัดๆ 4. ควรเขียนคําสั่งของรหัสเทียมแบบบนลงล#าง และมีทางเข�าออกเพียงทางเดียวเท#านั้น 5. ไม#ควรเขียนหมายเลขกํากับในแต#ละบรรทัด 6. ควรเขียนด�วยคําสั่งท่ีง#าย ชัดเจน และสามารถสื่อให�ผู�เขียนโปรแกรมเข�าใจ เพ่ือสะดวกต#อการนําไปเขียนโปรแกรมจริงต#อไป 7. กรณีท่ีมีคําสั่งย#อย ควรมีการย#อหน�า เพ่ือสะดวกต#อการอ#านและตรวจสอบ ประโยชน'ของรหัสเทียม 1. เพ่ือใช�ในการตรวจสอบความถูกต�องของอัลกอริท่ึมท่ีได�ออกแบบไว� 2. เพ่ือส#งต#อให�ผู�เขียนโปรแกรม ใช�เป�นแนวทางในการนําไปเขียนโปรแกรมจริงได� 3. เพ่ือใช�เป�นเอกสารประกอบโปรแกรม ในการบํารุงรักษาโปรแกรมท่ีอาจมีข้ึนในอนาคต สรุป ในบทเรียนนี้ได�อธิบายถึง เหตุผลของการเขียนโปรแกรมคือเป�นการสร�างนวัตกรรมใหม#ทางด�านเทคโนโลยีข้ึนมา เพ่ือตอบสนองต#อความต�องการใช�งานของผู�ใช�งาน โปรแกรมคือชุดคําสั่งท่ีเครื่องคอมพิวเตอร,เข�าใจ ผู�เขียนโปรแกรมเรียกว#า โปรแกรมเมอร, ยุคของภาษาคอมพิวเตอร,แบ#งเป�น 5 ยุค แต#ละยุคจะมีภาษาคอมพิวเตอร,เรียกแตกต#างกันไป การทํางานของโปรแกรมเริ่มจากไฟล,รหัสต�นฉบับผ#านกระบวนการแปลภาษาคอมพิวเตอร,จนได�ไฟล,ท่ีทํางานได�ซ่ึงนําไปใช�งานบนเครื่องคอมพิวเตอร,อ่ืนได� ข้ันตอนวิธีการพัฒนาโปรแกรม จะประกอบด�วย 7 ข้ันตอนคือ การวิเคราะห,ป2ญหา การวางแผนและการออกแบบโปรแกรม การเขียนโปรแกรม การทดสอบโปรแกรม การจัดทําคู#มือการใช�งานโปรแกรม การนําโปรแกรมไปใช�งานจริง และการบํารุงรักษาโปรแกรม ในข้ันตอนการวิเคราะห,ป2ญหา จะต�องทราบถึงกระบวนการการทํางานพ้ืนฐานของคอมพิวเตอร,ท่ีประกอบด�วย การรับข�อมูลเข�า การประมวลผล และการแสดงผลลัพธ, เพ่ือจะได�นํามาใช�วิเคราะห,ป2ญหาได� จากนั้นนําข�อมูลท่ีได�จากการวิเคราะห,ป2ญหามาวางแผนและออกแบบโปรแกรม เพ่ือให�ทราบว#า มีข้ันตอนวิธีหรืออัลกอริท่ึมอย#างไรในการเขียนโปรแกรม การออกแบบอัลกอริท่ึมสามารถใช�ได�ท้ังผังงานและรหัสเทียม โดยเฉพาะรหัสเทียมท่ีออกแบบไว� สามารถนําไปเขียนโปรแกรมจริงต#อได�

25

คําถามทบทวน 1. จงบอกเหตุผลว#าทําไมต�องเขียนโปรแกรม 2. จงให�ความหมายของคําว#า "โปรแกรม" 3. โปรแกรมเมอร,คือบุคคลท่ีทําหน�าท่ีอะไร 4. จงอธิบายยุคของภาษาคอมพิวเตอร, และในแต#ละยุคมีภาษาคอมพิวเตอร,อะไรบ�าง 5. จงอธิบายข้ันตอนวิธีการพัฒนาโปรแกรม 6. อัลกอริท่ึมคืออะไร 7. ผังงานคืออะไร 8. รหัสเทียมคืออะไร 9. จงเขียนผังงานและรหัสเทียมของการใช�บริการรถไฟฟrา BTS จากสถานีแบริ่งไปสถานีหมอชิต 10. จงเขียนผังงานและรหัสเทียมของการถอนเงินจํานวน 1,500 บาท จากตู� ATM 11. จงเขียนผังงานและรหัสเทียมของการซ้ือนมถ่ัวเหลือง UHT 1 แพ็ค ราคา 55 บาท จากร�านแฟมิลี่มาร,ท 12. จงเขียนผังงานและรหัสเทียมของการสั่งซ้ือ SAMSUNG Galaxy Grand คลื่น 850 MHz. ผ#านเว็บไซต, www.ShopAt7.com 13. จงเขียนผังงานและรหัสเทียมของการยื่นแบบแสดงรายการภาษีเงินได�บุคคลธรรมดา ผ#านทางเว็บไซต, www.rd.go.th 14. จงเขียนผังงานและรหัสเทียมของโปรแกรมการคํานวณพ้ืนท่ีวงกลม โดยรับข�อมูลรัศมีวงกลมทางคีย,บอร,ด และแสดงผลผ#านทางหน�าจอ 15. จงเขียนผังงานและรหัสเทียมของโปรแกรมการคํานวณผลคูณของเลข 2 จํานวน โดยรับข�อมูลทางคีย,บอร,ด และแสดงผลผ#านทางหน�าจอ

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก0น : มหาวิทยาลัยขอนแก0น. นิรุธ อํานวยศิลป4 (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. Gmail มือถือ (2556). สืบค�นจาก : http://www.google.co.in [13 มีนาคม 2556]. ผู�หญิง women (2556). สืบค�นจาก : http://women.kapook.com [8 กุมภาพันธ% 2556]. Ohlala Online (2556). สืบค�นจาก : http://www.bbfarm.in.th [10 กุมภาพันธ% 2556]. Sage (2556). สืบค�นจาก : http://na.sage.com [11 กุมภาพันธ% 2556]. บมจ. ธนาคารกรุงไทย (2556). สืบค�นจาก : http://www.ktb.co.th [11 กุมภาพันธ% 2556]. โรงพยาบาลเชียงใหม0 ราม (2556). สืบค�นจาก : http://www.ktb.co.th [12 กุมภาพันธ% 2556]. Science Photo Library (2556). สืบค�นจาก : http://www.sciencephoto.com [12 กุมภาพันธ% 2556]. NASA (2556). สืบค�นจาก : http://www.nasa.gov [12 กุมภาพันธ% 2556]. DSRD (Data Systems Research and Development) (2556). สืบค�นจาก : http://www.csm.ornl.gov [13 กุมภาพันธ% 2556]. DRU Samutprakan (มหาวิทยาลัยราชภัฏธนบุรี สมุทรปราการ) (2556). สืบค�นจาก : https://www.facebook.com/Drusp [13 กุมภาพันธ% 2556]. MdN Design Interactive (2556). สืบค�นจาก : http://www.mdn.co.jp [15 กุมภาพันธ% 2556]. Moda, bellezza, celebrities e tutto ciò che fa tendenza - Style.it (2556). สืบค�นจาก : http://www.style.it [15 กุมภาพันธ% 2556]. Paul A. Carter, PC Assembly Language (2006). สืบค�นจาก : http://www.freebookcentre.net/ programming-books-download/PC-Assembly-Language.html [21 กุมภาพันธ% 2556]. TRATTUN (2556). สืบค�นจาก : http://trattun.exteen.com [10 กุมภาพันธ% 2556]. กระทรวงวิทยาศาสตร%และเทคโนโลยี (2556). สืบค�นจาก : http://www.most.go.th [16 กุมภาพันธ% 2556]. Axis Lifts Pvt. Ltd. (2556). สืบค�นจาก : http://www.axislifts.co.in [15 กุมภาพันธ% 2556]. Miss Thrifty (2556). สืบค�นจาก : http://www.miss-thrifty.co.uk/ [18 กุมภาพันธ% 2556].

แผนบริหารการสอนประจําบทท่ี 2 หัวข�อเน้ือหาประจําบท 1. การเขียนโปรแกรมเชิงโครงสร�าง 2. โครงสร�างแบบลําดับ 3. โครงสร�างแบบเลือก 4. โครงสร�างแบบวนรอบ 5. ทําความรู�จักภาษาซี วัตถุประสงค! เม่ือผู�เรียนศึกษาบทเรียนจบแล�ว จะมีความสามารถดังนี้ 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างได� 2. อธิบายความหมายของโครงสร�างแบบลําดับ แบบเลือก และแบบวนรอบของการเขียนโปรแกรมเชิงโครงสร�างได� 3. สามารถออกแบบอัลกอริท่ึมด�วยผังงานและรหัสเทียมของโครงสร�างแบบลําดับ แบบเลือก และแบบวนรอบของการเขียนโปรแกรมเชิงโครงสร�างได� 4. ทราบประวัติอย3างย3อของภาษาซี กิจกรรมการเรียนการสอน 1. อธิบายการเขียนโปรกรมเชิงโครงสร�าง โดยใช�โปรแกรมนําเสนองาน 2. อธิบายความหมายของโครงสร�างแบบลําดับ แบบเลือก และแบบวนรอบของการเขียนโปรแกรมเชิงโครงสร�าง โดยใช�โปรแกรมนําเสนองาน และฝ6กปฏิบัติ 3. แบ3งผู�เรียนออกเป8นกลุ3ม โดยปฏิบัติตามใบงานท่ี 2 ดังนี้ 3.1 ให�ผู�เรียนฝ6กปฏิบัติในการออกแบบอัลกอริท่ึมด�วยผังงานและรหัสเทียมของโครงสร�างแบบลําดับลําดับ แบบเลือก และแบบวนรอบของการเขียนโปรแกรมเชิงโครงสร�าง 3.2 ให�ตัวแทนแต3ละกลุ3มออกมานําเสนอผลการปฏิบัติตามใบงาน และร3วมกันอภิปรายว3าอัลกอริท่ึมท่ีออกแบบมานั้นเป8นอย3างไร 4. ร3วมกันสรุปความรู�เก่ียวกับการเขียนโปรแกรมเชิงโครงสร�าง จากนั้นซักถามผู�เรียน รวมถึงให�ผู�เรียนตอบคําถามทบทวน สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 2 4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน

28

3. สังเกตการณ<ปฏิบัติงานกลุ3ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝ6กหัด

บทท่ี 2 การเขียนโปรแกรมเชิงโครงสร�าง

บทนํา อัลกอริท่ึมท่ีได�ออกแบบไว�จากข้ันตอนการวิเคราะห�และออกแบบโปรแกรม ถูกส#งต#อให�ผู�เขียนโปรแกรมนําไปเขียนโปรแกรมจริง ซ่ึงการเขียนโปรแกรมมีหลายรูปแบบด�วยกันคือ การเขียนโปรแกรมเชิงโครงสร�าง (Structured Programming) การเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming) การเขียนโปรแกรมเชิงหน�าท่ี (Functional Programming) การเขียนโปรแกรมเชิงตรรกะ (Logical Programming) เปDนต�น ในเอกสารประกอบการสอนเล#มนี้ อธิบายเฉพาะการเขียนโปรแกรมเชิงโครงสร�างเท#านั้น และนําโปรแกรมภาษาซีมาเปDนภาษาคอมพิวเตอร�ท่ีใช�ในการเรียนการสอนของการเขียนโปรแกรมเชิงโครงสร�างนี้ด�วย การเขียนโปรแกรมเชิงโครงสร�าง (Structured Programming) ในการเรียนวิชาทางด�านการเขียนโปรแกรมของผู�เรียนสาขาทางด�านคอมพิวเตอร� ส#วนใหญ#แล�วมักจะต�องเริ่มต�นเรียนการเขียนโปรแกรมเชิงโครงสร�างก#อน เนื่องจากผู�เรียนจะต�องเรียนรู�เก่ียวกับลักษณะโครงสร�างของตัวโปรแกรมไว� เพ่ือทําให�โปรแกรมท่ีเขียนข้ึนมามีโครงสร�างท่ีดี ง#าย และมีประสิทธิภาพ รวมถึงสะดวกต#อการแก�ไขโปรแกรมในอนาคต และยังเปDนพ้ืนฐานท่ีสําคัญของการเขียนโปรแกรมในรูปแบบอ่ืนๆ ด�วย หลักการออกแบบโปรแกรมเชิงโครงสร�าง คือ การแบ#งโปรแกรมขนาดใหญ#ออกเปDนโปรแกรมย#อยๆ จํานวนหนึ่ง จากหลักการนี้โปรแกรมขนาดใหญ#ประกอบด�วยโปรแกรมย#อยหลายโปรแกรม การออกแบบในลักษณะนี้ ทําให�การพัฒนาโปรแกรมเปลี่ยนรูปแบบไปเปDนการเขียนโปรแกรมย#อย ซ่ึงหมายถึงว#า ผู�เขียนสามารถแยกการเขียนโปรแกรมและแยกการทดสอบโปรแกรมได� ส#งผลให�การพัฒนาโปรแกรมในภาพรวมเปDนไปได�อย#างรวดเร็วและมีประสิทธิภาพ โปรแกรมย#อยนี้ในบางภาษาคอมพิวเตอร�จะเรียกว#า ฟ*งก+ช่ัน (Function) บางภาษาคอมพิวเตอร�จะเรียกว#า โพรซีเยอร+ (Procedure) บางภาษาคอมพิวเตอร�จะเรียกว#า โมดูล (Module) และบางภาษาคอมพิวเตอร�จะเรียกว#า คลาส (Class) เปDนต�น ซ่ึงจะได�อธิบายในบทท่ีเก่ียวข�องต#อไป ไม#ว#าจะเปDนโปรแกรมขนาดใหญ#หรือโปรแกรมย#อย ผู�เขียนโปรแกรมต�องเข�าใจลักษณะโครงสร�างของการเขียนโปรแกรมเชิงโครงสร�างไว�ด�วยว#า มีก่ีแบบ แต#ละแบบเปDนอย#างไร โครงสร�างของการเขียนโปรแกรมเชิงโครงสร�าง แบ#งได� 3 แบบ คือ 1. โครงสร�างแบบลําดับ 2. โครงสร�างแบบเลือก 3. โครงสร�างแบบวนรอบ โดยมีรายละเอียดดังต#อไปนี้ โครงสร�างแบบลําดับ (Sequential Structure) โครงสร�างแบบนี้จะมีลักษณะการทํางานตามลําดับ โดยทํางานจากบนลงล#างคือ เริ่มจากจุดเริ่มต�นจนถึงจุดสิ้นสุด และมีจุดเริ่มต�นและจุดสิ้นสุดเพียงจุดเดียว ตัวอย#างผังงานของโครงสร�างแบบลําดับ แสดงในภาพท่ี 2.1

30

คําสั่งท่ี 1

เริ่มต�น

สิ้นสุด

คําสั่งท่ี 2

คําสั่งท่ี ...

คําสั่งท่ี n

คําสั่งท่ี 1

เริ่มต�น

สิ้นสุด

คําสั่งท่ี 2

คําสั่งท่ี n

ก. ข.

ภาพท่ี 2.1 ผังงานของโครงสร�างแบบลําดับ ตัวอย;างท่ี 2.1 จงเขียนผังงานและรหัสเทียมของโปรแกรมรับข�อมูลจํานวนและราคาของสินค�า จากนั้นให�พิมพ�จํานวนเงินท่ีต�องชําระบนกระดาษผ#านทางเครื่องพิมพ�

ผังงาน รหัสเทียม

เริ่มต�น กําหนดค#าเริ่มต�นของ จํานวนเงิน มีค#าเท#ากับ 0 รับจํานวนและราคา จํานวนเงิน = จํานวน x ราคา พิมพ�จํานวนเงินบนกระดาษ ส้ินสุด

จํานวนเงิน = จํานวน x ราคา

รับจํานวนและราคา

จํานวนเงิน = 0

เริ่มต�น

สิ้นสุด

พิมพ�จํานวนเงิน

31

...

...

งานท่ีต�องทํา จริง เท็จ

เง่ือนไข

...

...

IF (เง่ือนไข)

THEN เท็จ จริง

คําสั่งหลัง THEN

โครงสร�างแบบเลือก (Decision Structure) โครงสร�างแบบนี้จะมีลักษณะการทํางานแบบมีการทดสอบเง่ือนไข (Condition) ท่ีต�องตัดสินใจเลือกการทํางาน และผลลัพธ�ของเง่ือนไขคือ จริง (True) หรือเท็จ (False) ถูกหรือผิด หรือ ใช#หรือไม#ใช# เท#านั้น โครงสร�างแบบนี้แบ#งได�เปDน 3 ชนิด คือ 1. โครงสร�างแบบเลือกแบบหนึ่งทางเลือก 2. โครงสร�างแบบเลือกแบบสองทางเลือก 3. โครงสร�างแบบเลือกแบบหลายทางเลือก โดยมีรายละเอียดดังต#อไปนี้ โครงสร�างแบบเลือกแบบหนึ่งทางเลือก (One Decision Structure) โครงสร�างชนิดนี้มีลักษณะการทํางานแบบมีการทดสอบเง่ือนไข แล�วเลือกว#าทํา (Do) หรือไม;ทํา (Don't) ก#อนท่ีจะไปทํางานอ่ืนต#อไป ตัวอย#างผังงานของโครงสร�างแบบเลือกแบบหนึ่งทางเลือก แสดงในภาพท่ี 1.23

ก. ข.

ภาพท่ี 2.2 ผังงานของโครงสร�างแบบเลือก(หนึ่งทางเลือก) ตัวอย;างท่ี 2.2 จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงผลการตรวจสอบคะแนนสอบกลางภาคผ#านทางหน�าจอ

ผังงาน รหัสเทียม

เริ่มต�น รับ คะแนน ถ�า คะแนน มีค#ามากกว#า 50 แสดง "สอบผ#าน" ส้ินสุด

รับ คะแนน

เริ่มต�น

สิ้นสุด

คะแนน > 50 จริง

แสดง "สอบผ#าน" เท็จ

32

งานท่ีต�องทํา 2 งานท่ีต�องทํา 1

...

...

เง่ือนไข จริง เท็จ THEN ELSE

งานท่ีต�องทํา 2 งานท่ีต�องทํา 1

...

...

IF (เง่ือนไข) จริง เท็จ

READ score

เร่ิมต�น

สิ้นสุด

score >= 50 True

False

WRITE "Fail" WRITE "Pass"

โครงสร�างแบบเลือกแบบสองทางเลือก (Two Decision Structure) โครงสร�างชนิดนี้มีลักษณะการทํางานแบบมีการทดสอบเง่ือนไข ถ�าเปDนจริงให�ทํางานท่ี 1 แต#ถ�าเปDนเท็จ ให�ทํางานท่ี 2 ก#อนไปทํางานอ่ืนต#อไป ตัวอย#างผังงานของโครงสร�างแบบเลือกแบบสองทางเลือก แสดงในภาพท่ี 1.24

ก. ข.

ภาพท่ี 2.3 ผังงานของโครงสร�างแบบเลือก(สองทางเลือก) ตัวอย;างท่ี 2.3 จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงผลการตรวจสอบคะแนนสอบกลางภาค ถ�าได�คะแนนมากกว#าหรือเท#ากับ 50 ให�พิมพ�คําว#า "Pass" แต#ถ�าได�คะแนนน�อยกว#า 50 ให�พิมพ�คําว#า "Fail" ผ#านทางหน�าจอ

ผังงาน รหัสเทียม

เริ่มต�น รับ คะแนน ถ�า คะแนน มีค#ามากกว#าหรือเท#ากับ 50 พิมพ� "Pass" แต#ถ�า คะแนน มีค#าน�อยกว#า 50 พิมพ� "Fail" ส้ินสุด -------------------------- หรือ --------------------------

Begin Read Score IF Score >= 50 THEN WRITE "Pass" ELSE WRITE "Fail" END IF End

33

โครงสร�างแบบเลือกแบบหลายทางเลือก (Multi Decision Structure) โครงสร�างชนิดนี้จะมีลักษณะการทํางานแบบมีการทดสอบเง่ือนไขหลายเง่ือนไข ซ่ึงมีลักษณะการทํางาน ดังนี้ การทดสอบเง่ือนไขท่ี 1 ถ�าเปDนจริงให�ทํางานท่ี 1 แต#ถ�าเปDนเท็จ ให�ทดสอบเง่ือนไขท่ี 2 การทดสอบเง่ือนไขท่ี 2 ถ�าเปDนจริง ให�ทํางานท่ี 2 แต#ถ�าเปDนเท็จ ให�ทดสอบเง่ือนไขท่ี 3 การทดสอบเง่ือนไขท่ี 3 ถ�าเปDนจริง ให�ทํางานท่ี 3 แต#ถ�าเปDนเท็จ ให�ทดสอบเง่ือนไขท่ี ... ... ก#อนท่ีจะไปทํางานอ่ืนต#อไป ตัวอย#างผังงานของโครงสร�างแบบเลือกแบบหลายทางเลือก แสดงในภาพท่ี 1.25

ก.

งานท่ีต�องทํา 1 เง่ือนไขท่ี 1

เท็จ จริง เริ่มต�น

เง่ือนไขท่ี 2 เท็จ

งานท่ีต�องทํา 2

จริง

เง่ือนไขท่ี 3 เท็จ

งานท่ีต�องทํา 3

จริง

เง่ือนไขท่ี ... เท็จ

...

จริง

...

สิ้นสุด

34

งานท่ีต�องทํา 1 IF (เง่ือนไขท่ี 1)

เท็จ จริง เริ่มต�น

IF (เง่ือนไขท่ี 2) เท็จ

งานท่ีต�องทํา 2

จริง

IF (เง่ือนไขท่ี 3) เท็จ

งานท่ีต�องทํา 3

จริง

IF (เง่ือนไขท่ี ...) เท็จ

...

จริง

...

สิ้นสุด

THEN ELSE

THEN ELSE

THEN ELSE

THEN ELSE

ข. ภาพท่ี 2.4 ผังงานของโครงสร�างแบบเลือกแบบหลายทางเลือก

ตัวอย;างท่ี 2.4 จงเขียนผังงานและรหัสเทียมของโปรแกรมประมวลผลการเรียน โดยรับคะแนนและตรวจสอบเง่ือนไข ดังนี้ - คะแนนสอบต้ังแต# 90 คะแนนข้ึนไป ได�เกรด A - คะแนนสอบ 80 - 89 คะแนน ได�เกรด B - คะแนนสอบ 60 - 79 คะแนน ได�เกรด C - คะแนนสอบ 50 - 59 คะแนน ได�เกรด D - คะแนนสอบตํ่ากว#า 50 คะแนน ได�เกรด F จากนั้นให�พิมพ�เกรดท่ีหน�าจอ

35

Grade = "A"

เท็จ จริง

START

เท็จ

Grade = "B"

จริง เท็จ

Grade = "C"

จริง เท็จ

Grade = "D"

จริง

STOP

READ score

Grade = "F"

WRITE Grade

IF (score >= 90)

IF (score >= 80)

IF (score >= 60)

IF (score >= 50)

ผังงาน

รหัสเทียม

Begin Read score IF score >= 90 THEN Grade = "A" ELSE IF score >= 80 THEN Grade = "B" ELSE IF score >= 60 THEN Grade = "C" ELSE IF score >= 50 THEN Grade = "D" ELSE Grade = "F" END IF WRITE Grade End

36

เท็จ ...

...

WHILE (เง่ือนไข) งานท่ีต�องทําซํ้า จริง

โครงสร�างแบบวนรอบ (Repetition/Iterative/Looping Structure) โครงสร�างแบบนี้จะมีลักษณะการทํางานแบบวนรอบหรือวนซํ้าหรือทําซํ้า โดยจะทําคําสั่งท่ีต�องการทําหรือประมวลผลซํ้าหลายครั้งตามเง่ือนไขท่ีได�ระบุไว� โครงสร�างแบบนี้จะแบ#งได�เปDน 3 ชนิดคือ 1. การวนรอบแบบทดสอบเง่ือนไขก#อน 2. การวนรอบแบบทดสอบเง่ือนไขทีหลัง 3. การวนรอบแบบจํานวนรอบท่ีแน#นอน โดยมีรายละเอียดดังต#อไปนี้ การวนรอบแบบทดสอบเง่ือนไขก;อน โครงสร�างชนิดนี้มีลักษณะการทํางานแบบวนรอบ โดยมีการทดสอบเง่ือนไขก#อนทุกครั้ง หากเง่ือนไขเปDนจริง ให�ทําคําสั่งท่ีต�องการทําหรืองานท่ีต�องทําซํ้าจนกว#าการทดสอบเง่ือนไขดังกล#าวจะเปDนเท็จ เม่ือเง่ือนไขเปDนเท็จจะออกจากการวนรอบ โครงสร�างชนิดนี้เรียกอีกชื่อหนึ่งว#า โครงสร�างแบบวนรอบ WHILE (While Structure) โดยคําว#า WHILE ในภาษาคอมพิวเตอร�ถือว#าเปDนคําสั่งหนึ่งท่ีใช�ในการทํางานแบบวนรอบ ตัวอย#างผังงานของโครงสร�างแบบวนรอบ(การวนรอบแบบทดสอบเง่ือนไขก#อน) แสดงในภาพท่ี 1.26

ภาพท่ี 2.5 ผังงานของโครงสร�างแบบวนรอบ(การวนรอบแบบทดสอบเง่ือนไขก#อน)

37

เท็จ num = 1

START

STOP

WHILE (num <= 5)

จริง PRINT num

num = num + 1

ตัวอย;างท่ี 2.5 จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงค#าตัวเลขจํานวนเต็มบวกของตัวเลขต้ังแต# 1 ถึง 7 จากโจทย� จะให�แสดงผลลัพธ�ดังนี้ 12345

ผังงาน รหัสเทียม

Begin num = 1 WHILE num <= 5 PRINT num num = num + 1 End

จากรหัสเทียม สามารถอธิบายได� ดังนี้ 1. เริ่มต�นการทํางาน 2. กําหนดให� num มีค#าเริ่มต�นเท#ากับ 1 3. ตรวจสอบเง่ือนไข WHILE num น�อยกว#าหรือเท#ากับ 5 หรือไม# (WHILE (1 <= 5)) 3.1 เง่ือนไขเปDนจริง จะไปแสดงตัวเลข 1 (PRINT 1) 3.2 จากนั้นเพ่ิมค#าของ num อีก 1 (num = num + 1 � num = 1 + 1 = 2) num จะมีค#าเท#ากับ 2 4. ตรวจสอบเง่ือนไข WHILE num น�อยกว#าหรือเท#ากับ 5 หรือไม# (WHILE (2 <= 5)) 4.1 เง่ือนไขเปDนจริง จะไปแสดงตัวเลข 2 (PRINT 2) 4.2 จากนั้นเพ่ิมค#าของ num อีก 1 (num = 2 + 1 = 3) num จะมีค#าเท#ากับ 3 5. ตรวจสอบเง่ือนไข WHILE num น�อยกว#าหรือเท#ากับ 5 หรือไม# (WHILE (3 <= 5)) 5.1 เง่ือนไขเปDนจริง จะไปแสดงตัวเลข 3 (PRINT 3) 5.2 จากนั้นเพ่ิมค#าของ num อีก 1 (num = 3 + 1 = 4) num จะมีค#าเท#ากับ 4 6. ตรวจสอบเง่ือนไข WHILE num น�อยกว#าหรือเท#ากับ 5 หรือไม# (WHILE (4 <= 5)) 6.1 เง่ือนไขเปDนจริง จะไปแสดงตัวเลข 4 (PRINT 4)

38

6.2 จากนั้นเพ่ิมค#าของ num อีก 1 (num = 4 + 1 = 5) num จะมีค#าเท#ากับ 5 7. ตรวจสอบเง่ือนไข WHILE num น�อยกว#าหรือเท#ากับ 5 หรือไม# (WHILE (5 <= 5)) 7.1 เง่ือนไขเปDนจริง จะไปแสดงตัวเลข 5 (PRINT 5) 7.2 จากนั้นเพ่ิมค#าของ num อีก 1 (num = 5 + 1 = 6) num จะมีค#าเท#ากับ 6 8. ตรวจสอบเง่ือนไข WHILE num น�อยกว#าหรือเท#ากับ 5 หรือไม# (WHILE (6 <= 5)) 8.1 เง่ือนไขเปDนเท็จ ออกจากการการวนรอบ 9. สิ้นสุดการทํางาน หรืออธิบายในลักษณะตารางท่ีแสดงการทํางานในแต#ละรอบของการวนรอบ ดังนี้ รอบท่ี ค;า num ผลการทดสอบเง่ือนไข

WHILE (num <= 5) แสดงผล num (WRITE num)

การแสดงผล (ตําแหน;งท่ี ชี้)

num = num + 1

1 1 1 <= 5 มีค#าความจริงเปDน จริง 1 1

num = 1 + 1 = 2

2 2 2 <= 5 มีค#าความจริงเปDน จริง 2 12

num = 2 + 1 = 3

3 3 3 <= 5 มีค#าความจริงเปDน จริง 3 123

num = 3 + 1 = 4

4 4 4 <= 5 มีค#าความจริงเปDน จริง 4 1234

num = 4 + 1 = 5

5 5 5 <= 5 มีค#าความจริงเปDน จริง 5 12345

num = 5 + 1 = 6

6 6 6 <= 5 มีค#าความจริงเปDน เท็จ *** ไม#มีการทํางาน ***

12345 *** ไม#มีการทํางาน ***

ผลลัพธ�สุดท�าย คือ 12345 หมายเหตุ เครื่องหมาย <= (เปDนการใช�เครื่องหมาย < (น�อยกว#า) กับเครื่องหมาย = (เท#ากับ) ติดกัน) ในระบบคอมพิวเตอร� มีความหมายคือ เครื่องหมาย ≤ (น�อยกว#าหรือเท#ากับ) ซ่ึงในระบบคอมพิวเตอร�ไม#มีเครื่องหมาย ≤ ใช�งาน เช#นเดียวกัน เครื่องหมาย ≥ (เครื่องหมายมากกว#าหรือเท#ากับ) ในระบบคอมพิวเตอร�จะใช�เครื่องหมาย >= แทน และเครื่องหมาย ≠ (เครื่องหมายไม#เท#ากับ) ในระบบคอมพิวเตอร�จะใช�เครื่องหมาย <> (เครื่องหมายน�อยกว#าและเครื่องหมายมากกว#า) หรือ != (เครื่องหมายอัศเจรีย�และเครื่องหมายเท#ากับ) แทน

39

เท็จ number = 1, sum = 0

START

STOP

WHILE (number <= 5)

จริง sum = sum + number

number = number + 1

WRITE sum

ตัวอย;างท่ี 2.6 จงเขียนผังงานและรหัสเทียมของโปรแกรมการบวกเลขต้ังแต# 1 ถึง 5

ผังงาน รหัสเทียม

Begin num = 1 sum = 0 WHILE (num <= 5) sum = sum + num num = num + 1 WRITE sum End

จากรหัสเทียมสามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต#ละรอบของการวนรอบ ดังนี้ รอบท่ี ค;า num ค;า sum ผลการทดสอบเง่ือนไข

WHILE (num <= 5) sum = sum +

num num = num + 1

1 1 0 1 <= 5 มีค#าความจริงเปDน จริง sum = 0 + 1 = 1 num = 1 + 1 = 2 2 2 1 2 <= 5 มีค#าความจริงเปDน จริง sum = 1 + 2 = 3 num = 2 + 1 = 3 3 3 3 3 <= 5 มีค#าความจริงเปDน จริง sum = 3 + 3 = 6 num = 3 + 1 = 4 4 4 6 4 <= 5 มีค#าความจริงเปDน จริง sum = 6 + 4 = 10 num = 4 + 1 = 5 5 5 10 5 <= 5 มีค#าความจริงเปDน จริง sum = 10 + 5 = 15 num = 5 + 1 = 6 6 6 15 6 <= 5 มีค#าความจริงเปDน เท็จ *** ไม#มีการทํางาน *** *** ไม#มีการทํางาน ***

ผลลัพธ�สุดท�าย sum มีค#าเท#ากับ 15 การวนรอบแบบทดสอบเง่ือนไขทีหลัง โครงสร�างชนิดนี้มีลักษณะการทํางานแบบวนรอบ โดยการเข�าไปทําคําสั่งท่ีต�องการทําหรืองานท่ีต�องทําซํ้าอย#างน�อย 1 ครั้งก#อน จากนั้นจึงไปทดสอบเง่ือนไข หากเง่ือนไขเปDนจริง ให�ทําคําสั่งท่ีต�องการทําหรืองานท่ีต�องทําซํ้าจนกว#าการทดสอบเง่ือนไขดังกล#าวจะเปDนเท็จ เม่ือเง่ือนไขเปDนเท็จให�ออกจากการวนรอบ โครงสร�างชนิดนี้เรียกอีกชื่อหนึ่งว#า โครงสร�างแบบวนรอบ DO WHILE (Do While Structure) หรือ

40

เท็จ ...

DO WHILE (เง่ือนไข) จริง

งานท่ีต�องทําซํ้า

...

เท็จ

num = 1

START

STOP

DO WHILE (num <= 3) จริง

num = num + 1

PRINT num

PRINT "I love you."

โครงสร�างแบบวนรอบ DO UNTIL (Do Until Structure) โดยคําว#า DO WHILE และ DO UNTIL ในภาษาคอมพิวเตอร�ถือว#าเปDนคําสั่งหนึ่งท่ีใช�ในการทํางานแบบวนรอบ ตัวอย#างผังงานของโครงสร�างแบบวนรอบ(การวนรอบแบบทดสอบเง่ือนไขทีหลัง) แสดงในภาพท่ี 1.27

ภาพท่ี 2.6 ผังงานของโครงสร�างแบบวนรอบ(การวนรอบแบบทดสอบเง่ือนไขทีหลัง) ตัวอย;างท่ี 2.7 จงเขียนผังงานและรหัสเทียมของโปรแกรมแสดงตัวเลขต้ังแต# 1 ถึง 3 เม่ือหยุดแสดงผลตัวเลขให�แสดงข�อความว#า "I love you."

ผังงาน รหัสเทียม

Begin num = 1 DO PRINT num num = num + 1 WHILE (num <= 3) PRINT "I love you." End

41

เท็จ

i = 3, sum = 0

START

STOP

DO WHILE (i <= 6) จริง

sum = sum + i

PRINT sum

i = i + 1

จากรหัสเทียมสามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต#ละรอบของการวนรอบ ดังนี้ รอบท่ี ค;า num การแสดงผล (PRINT num)

(ตําแหน;งท่ี ชี้) num = num + 1 ผลการทดสอบเง่ือนไข

DO WHILE (num <= 3) 1 1 1

num = 1 + 1 = 2 2 <= 3 มีค#าความจริงเปDน จริง

2 2 12

num = 2 + 1 = 3 3 <= 3 มีค#าความจริงเปDน จริง

3 3 123

num = 3 + 1 = 4 4 <= 3 มีค#าความจริงเปDน เท็จ

4 4 123I love you. *** ไม#มีการทํางาน *** *** ไม#มีการทํางาน ***

ผลลัพธ�สุดท�าย num มีค#าเท#ากับ 123 ตัวอย;างท่ี 2.8 จงเขียนผังงานและรหัสเทียมของโปรแกรมแสดงการบวกตัวเลขต้ังแต# 3 ถึง 6

ผังงาน รหัสเทียม

Begin i = 3 sum = 0 DO sum = sum + i i = i + 1 WHILE (i <= 6) PRINT sum End

จากรหัสเทียมสามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต#ละรอบของการวนรอบ ดังนี้

42

เท็จ ...

FOR (เง่ือนไข) จริง

งานท่ีต�องทําซํ้า

...

รอบท่ี ค;า i ค;า sum sum = sum + i i = i + 1 ผลการทดสอบเง่ือนไข DO WHILE (i <= 6)

1 3 0 sum = 0 + 3 = 3 i = 3 + 1 = 4 4 <= 6 มีค#าความจริงเปDน จริง 2 4 3 sum = 3 + 4 = 7 i = 4 + 1 = 5 5 <= 6 มีค#าความจริงเปDน จริง 3 5 7 sum = 7 + 5 = 12 i = 5 + 1 = 6 6 <= 6 มีค#าความจริงเปDน จริง 4 6 12 sum = 12 + 6 = 18 i = 6 + 1 = 7 7 <= 6 มีค#าความจริงเปDน เท็จ

ผลลัพธ� คือ 18 การวนรอบแบบจํานวนรอบท่ีแน;นอน โครงสร�างชนิดนี้มีลักษณะการทํางานแบบวนรอบ โดยจะไม#มีการทดสอบเง่ือนไขในการทํางาน แต#จะหยุดก็ต#อเม่ือวนรอบครบตามจํานวนรอบท่ีต�องการ โดยมีตัวนับ (Counter) คอยควบคุมจํานวนรอบ โครงสร�างชนิดนี้เรียกอีกชื่อหนึ่งว#า โครงสร�างแบบวนรอบ FOR (For Structure) โดยคําว#า FOR ในภาษาคอมพิวเตอร�จะถือว#าเปDนคําสั่งหนึ่งท่ีใช�ในการทํางานแบบวนรอบ ตัวอย#างผังงานของโครงสร�างแบบวนรอบ(การวนรอบแบบจํานวนรอบท่ีแน#นอน) แสดงในภาพท่ี 1.28

ภาพท่ี 2.7 ผังงานของโครงสร�างแบบวนรอบ(การวนรอบแบบจํานวนรอบท่ีแน#นอน)

43

เท็จ

i = 3

START

STOP

FOR (i <= 6)

จริง

i = i + 1

PRINT i

ตัวอย;างท่ี 2.9 จงเขียนผังงานและรหัสเทียมของโปรแกรมแสดงตัวเลขต้ังแต# 3 ถึง 6

ผังงาน รหัสเทียม

Begin i=1 FOR (i <= 6) PRINT i i = i + 1 End

จากรหัสเทียมสามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต#ละรอบของการวนรอบ ดังนี้ รอบท่ี ค;า i การแสดงผล (PRINT i)

(ตําแหน;งท่ี ชี้) i = i + 1 FOR (i <= 6)

1 3 3

i = 3 + 1 = 4 4 <= 6 มีค#าความจริงเปDน จริง

2 4 34

i = 4 + 1 = 5 5 <= 6 มีค#าความจริงเปDน จริง

3 5 345

i = 5 + 1 = 6 6 <= 6 มีค#าความจริงเปDน จริง

4 6 3456

i = 6 + 1 = 7 7 <= 6 มีค#าความจริงเปDน เท็จ

5 7 3456 *** ไม#มีการทํางาน *** *** ไม#มีการทํางาน *** ผลลัพธ� คือ 3456 จากโครงสร�างของการเขียนโปรแกรมเชิงโครงสร�างท่ีแบ#งออกเปDน 3 แบบตามท่ีได�กล#าวไว�ข�างต�น อาจทําให�ผู�เริ่มเขียนโปรแกรมเกิดความเข�าใจผิดว#า การเขียนโปรแกรมเชิงโครงสร�าง จะต�องเลือกโครงสร�างแบบใดแบบหนึ่งมาเขียนโปรแกรมเท#านั้น แต#ในความเปDนจริงแล�วการเขียนโปรแกรมโดยท่ัวๆ ไป แต#อาจต�องเลือกใช�

44

ร#วมท้ังสองหรือสามแบบเลยก็เปDนไปได� ท้ังนี้ข้ึนอยู#กับแนวคิดของผู�เขียนโปรแกรมเองว#า ควรนําโครงสร�างแบบใดมาใช�แก�ปuญหาตรงส#วนไหนบ�าง เพ่ือให�เกิดความเข�าใจมากยิ่งข้ึนให�ศึกษาจากตัวอย#างท่ี 2.10 ตัวอย;างท่ี 2.10 จงเขียนผังงานและรหัสเทียมของโปรแกรมการตรวจสอบตัวเลข 2 จํานวนท่ีรับเข�าผ#านทางคีย�บอร�ด จากนั้นให�เปรียบเทียบว#า ตัวเลขแรกมีค#ามากกว#า น�อยกว#า หรือเท#ากับตัวเลขท่ี 2 โดยแสดงผ#านทางหน�าจอ เช#น 3 กับ 5 ให�แสดงว#า "3 is lesser than 5" 8 กับ 6 ให�แสดงว#า "8 is greater than 6" 10 กับ 10 ให�แสดงว#า "10 is equal to 10"

ผังงาน รหัสเทียม

Begin READ a READ b IF (a < b) PRINT a is lesser than b ELSE IF (a > b) PRINT a is greater than b ELSE PRINT a is equal to b End

จากตัวอย#าง จะเห็นว#าผังงานนี้จะมีการใช�โครงสร�างแบบลําดับร#วมกับโครงสร�างแบบเลือก(หลายทางเลือก) ทําความรู�จักภาษาซี เอกสารประกอบคําสอนเล#มนี้ ภาษาคอมพิวเตอร�ท่ีนํามาใช�ประกอบในการเรียนการสอนของการเขียนโปรแกรมเชิงโครงสร�าง คือ ภาษาซี เหตุผลท่ีเลือกภาษาซีมาใช�คือ ภาษาซีสามารถนําไปใช�ได�หลายระบบปฏิบัติการ (Operating System) เช#น ระบบปฏิบัติการ DOS, Microsoft Windows, UNIX, LINUX หรือแม�กระท่ังบนสมาร�ทโฟน (Smart Phone) นอกจากนี้ภาษาซีได�ถูกนําไปพัฒนาเปDนภาษาคอมพิวเตอร�อ่ืนด�วย เช#น Visual C, Visual C++, Turbo C, Turbo C++, C#, Perl หรือ Java เปDนต�น ทําให�เม่ือเข�าใจพ้ืนฐานของภาษาซีแล�ว สามารถนําความรู�ท่ีได�ไปใช�ในภาษาคอมพิวเตอร�เหล#านั้นได� ภาษาซีถูกคิดค�นโดย Dennis Ritchie จาก Bell Laboratories โดยนําภาษาบี (B) มาพัฒนาต#อ ในยุคนั้นภาษาซีทํางานบนระบบปฏิบัติการ UNIX เปDนส#วนใหญ# ต#อมาภาษาซีได�ถูกพัฒนาให�สามารถใช�งานได�บน

เท็จ

START

STOP

IF (a < b) จริง

READ a

READ b

PRINT

เท็จ IF (a > b)

จริง a is lesser than b

PRINT a is equal to b

PRINT a is greater than b

โครงสร�างแบบลําดับ

โครงสร�างแบบเลือก (หลายทางเลือก)

45

เครื่องคอมพิวเตอร�ส#วนบุคคล (Personnel Computer - PC) ส#งผลให�ภาษาซีได�รับความนิยมอย#างกว�างขวาง เนื่องจากเปDนภาษาคอมพิวเตอร�ท่ีเหมาะกับการเขียนโปรแกรมเชิงโครงสร�างและมีความยืดหยุ#นในการเขียนโปรแกรมสูง จนทําให�บริษัทต#างๆ สร�างและผลิตภาษาซีของตนเองออกมาเปDนจํานวนมาก ทําให�เกิดเปDนภาษาซีหลายรูปแบบมาก เนื่องจากในขณะนั้นยังไม#มีหน#วยงานใดกําหนดมาตรฐานสําหรับการสร�างภาษาซีข้ึนมา ในป� ค.ศ. 1988 Dennis Ritchie และ Kernighan ร#วมกับสถาบันมาตรฐานอเมริกัน (ANSI) ได�ร#วมกันกําหนดมาตรฐานของภาษาซีข้ึนมาเรียกว#า ANSI C เพ่ือใช�ในการกําหนดมาตรฐานของการสร�างภาษาซีรุ#นต#อไป ภาษาซีท่ีใช�ในเอกสารประกอบคําสอนเล#มนี้คือ โปรแกรม Turbo C++ และ โปรแกรม Dev-C++ โดยข้ันตอนการติดต้ังโปรแกรมนี้ได�อธิบายไว�ในภาคผนวก สรุป ในบทเรียนนี้ได�อธิบายถึง การเขียนโปรแกรมเชิงโครงสร�างท่ีผู�เรียนสาขาทางด�านคอมพิวเตอร�ส#วนใหญ#จําเปDนต�องเริ่มต�นเรียนก#อน โดยได�เรียนรู�เก่ียวกับลักษณะโครงสร�างของตัวโปรแกรม เพ่ือทําให�โปรแกรมท่ีเขียนข้ึนมามีโครงสร�างท่ีดี ง#าย และมีประสิทธิภาพ รวมถึงสะดวกต#อการแก�ไขโปรแกรมในอนาคต และยังเปDนพ้ืนฐานท่ีสําคัญของการเขียนโปรแกรมในรูปแบบอ่ืนๆ ด�วย การออกแบบโปรแกรมเชิงโครงสร�างมีการแบ#งโปรแกรมขนาดใหญ#ออกเปDนโปรแกรมย#อยๆ จํานวนหนึ่ง ซ่ึงอาจจะเรียกว#า ฟuงก�ชั่น โพรซีเยอร� โมดูล หรือคลาส ซ่ึงแล�วแต#ภาษาคอมพิวเตอร�ท่ีเลือกใช�งาน โครงสร�างของการเขียนโปรแกรมเชิงโครงสร�างแบ#งได� 3 แบบ คือ โครงสร�างแบบลําดับ โครงสร�างแบบเลือก และโครงสร�างแบบวนรอบ ในการเขียนโปรแกรมโดยท่ัวๆ ไป ผู�เขียนโปรแกรมไม#จําเปDนต�องเลือกโครงสร�างแบบใดแบบหนึ่ง แต#อาจต�องเลือกใช�ร#วมท้ังสองหรือสามแบบเลยก็เปDนไปได� ท้ังนี้ข้ึนอยู#กับแนวคิดของผู�เขียนโปรแกรมเองว#า ควรนําโครงสร�างแบบใดมาใช�แก�ปuญหาตรงส#วนไหนบ�าง เอกสารประกอบคําสอนฉบับนี้ได�นําภาษาซีมาใช�ในการเรียนการสอนของการเขียนโปรแกรมเชิงโครงสร�าง เนื่องจากเปDนภาษาคอมพิวเตอร�ท่ีเหมาะกับการเขียนโปรแกรมเชิงโครงสร�างและมีความยืดหยุ#นในการเขียนโปรแกรมสูง

46

คําถามทบทวน 1. จงบอกเหตุผลว#าทําไมผู�เรียนสาขาทางด�านคอมพิวเตอร�ส#วนใหญ#จําเปDนต�องเริ่มเรียนการเขียนโปรแกรมเชิงโครงสร�างก#อน 2. จงอธิบายโครงสร�างแบบลําดับ 3. จงอธิบายโครงสร�างแบบเลือก 4. จงอธิบายโครงสร�างแบบวนรอบ 5. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงตัวเลขท่ีมากกว#า โดยรับตัวเลข 2 จํานวนทางคีย�บอร�ด และแสดงผลผ#านทางหน�าจอ 6. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงผลบวกและผลลบ โดยรับตัวเลข 2 จํานวนทางคีย�บอร�ด และแสดงผลผ#านทางหน�าจอ 7. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงผลคูณและผลหาร โดยรับตัวเลข 2 จํานวนทางคีย�บอร�ด และแสดงผลผ#านทางหน�าจอ 8. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงคําว#า "High" หากตัวเลขท่ีรับทางคีย�บอร�ดมีค#ามากกว#า 10 และแสดงผลผ#านทางหน�าจอ 9. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงคําว#า "Low" หากตัวเลขท่ีรับทางคีย�บอร�ดมีค#าน�อยกว#า 10 และแสดงผลผ#านทางหน�าจอ 10. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงตัวเลขต้ังแต# 25 ถึง 45 แสดงผลผ#านทางหน�าจอ โดยใช�โครงสร�างแบบวนรอบ WHILE 11. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงตัวเลขต้ังแต# -1 ถึง -20 แสดงผลผ#านทางหน�าจอ โดยใช�โครงสร�างแบบวนรอบ WHILE 12. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงตัวเลขต้ังแต# 25 ถึง 45 แสดงผลผ#านทางหน�าจอ โดยใช�โครงสร�างแบบวนรอบ DO WHILE 13. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงตัวเลขต้ังแต# -1 ถึง -20 แสดงผลผ#านทางหน�าจอ โดยใช�โครงสร�างแบบวนรอบ DO WHILE 14. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงตัวเลขต้ังแต# 10 ถึง 30 แสดงผลผ#านทางหน�าจอ โดยใช�โครงสร�างแบบวนรอบ FOR 15. จงเขียนผังงานและรหัสเทียมของโปรแกรมการแสดงตัวเลขต้ังแต# 30 ถึง 10 แสดงผลผ#านทางหน�าจอ โดยใช�โครงสร�างแบบวนรอบ FOR

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). การเขียนโปรแกรมเบ้ืองต�น (2556). สืบค�นจาก : http://www.thaiall.com/article/teachpro.htm [13 มีนาคม 2556].

48

แผนบริหารการสอนประจําบทท่ี 3 หัวข�อเน้ือหาประจําบท 1. โปรแกรมแรกในภาษาซี 2. โครงสร�างของโปรแกรมภาษาซี 3. การใส�คําอธิบายในภาษาซี 4. ตัวแปร 5. ค�าคงท่ี 6. การแสดงผลข�อมูลจากตัวแปร 7. การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณ 8. การรับค�ามาเก็บไว�ในตัวแปร 9. การดําเนินการ 10. ลําดับการทํางานของโอเปอเรเตอร8 11. การจัดรูปแบบของการเขียนรหัสต�นฉบับของโปรแกรม วัตถุประสงค! เม่ือผู�เรียนศึกษาบทเรียนจบแล�ว จะมีความสามารถดังนี้ 1. อธิบายการเขียนโปรแกรมแรกในภาษาซีได� 2. อธิบายรายละเอียดของโครงสร�างและคําอธิบายของโปรแกรมภาษาซีได� 3. การเขียนโปรแกรมท่ีมีการใส�คําอธิบายโปรแกรมได� 4. อธิบายตัวแปร ชนิดข�อมูล การประกาศตัวแปร การกําหนดค�าเริ่มต�นให�กับตัวแปร และใช�งานค�าคงท่ีได� 5. เขียนโปรแกรมท่ีมีการใช�ตัวแปรและค�าคงท่ีได� 6. อธิบายวิธีการแสดงผลข�อมูลจากตัวแปร การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณ และการรับค�ามาเก็บไว�ในตัวแปรได� 7. เขียนโปรแกรมการแสดงผลข�อมูลจากตัวแปร การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณ และการรับค�ามาเก็บไว�ในตัวแปรได� 8. อธิบายการดําเนินการแต�ละประเภท และลําดับการทํางานของโอเปอเรเตอร8ได� 9. เขียนโปรแกรมเก่ียวกับการดําเนินการต�างๆ ได� กิจกรรมการเรียนการสอน 1. อธิบายการเริ่มต�นการเขียนโปรกรมเชิงโครงสร�าง โดยใช�โปรแกรมนําเสนองานและโปรแกรมภาษาซี 2. อธิบายโครงสร�างของโปรแกรมภาษาซี ตัวแปร ชนิดข�อมูล การประกาศตัวแปร การกําหนดค�าเริ่มต�นให�กับตัวแปร ค�าคงท่ี การแสดงผลข�อมูลจากตัวแปร การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณ การรับค�ามาเก็บไว�ในตัวแปร การดําเนินการ และลําดับการทํางานของโอเปอเรเตอร8 โดยใช�โปรแกรมนําเสนองาน และโปรแกรมภาษาซี และฝ@กปฏิบัติ 3. แบ�งผู�เรียนออกเปBนกลุ�ม โดยปฏิบัติตามใบงานท่ี 3 ดังนี้ 3.1 ให�ผู�เรียนฝ@กปฏิบัติในการเขียนโปรแกรมแรกในภาษาซี 3.2 ให�ผู�เรียนฝ@กปฏิบัติในการการเขียนโปรแกรมท่ีมีการใส�คําอธิบายโปรแกรม

50

3.3 ให�ผู�เรียนฝ@กปฏิบัติในการเขียนโปรแกรมเก่ียวกับการประกาศตัวแปร ชนิดข�อมูล และค�าคงท่ี 3.4 ให�ผู�เรียนฝ@กปฏิบัติในการเขียนโปรแกรมเก่ียวกับการแสดงผลข�อมูลจากตัวแปร การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณ และการรับค�ามาเก็บไว�ในตัวแปร 3.5 ให�ผู�เรียนฝ@กปฏิบัติในการเขียนโปรแกรมเก่ียวกับการดําเนินการต�างๆ 3.6 ให�ตัวแทนแต�ละกลุ�มออกมานําเสนอผลการปฏิบัติตามใบงาน และร�วมกันอภิปรายว�าโปรแกรมท่ีเขียนข้ึนมานั้นเปBนอย�างไร 4. ร�วมกันสรุปความรู�เก่ียวกับการเขียนโปรแกรมเชิงโครงสร�าง จากนั้นซักถามผู�เรียน รวมถึงให�ผู�เรียนตอบคําถามทบทวน สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 3 4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน 3. สังเกตการณ8ปฏิบัติงานกลุ�ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝ@กหัด

บทท่ี 3 เร่ิมต�นการเขียนโปรแกรมเชิงโครงสร�าง

บทนํา สําหรับผู�เริ่มเขียนโปรแกรม บทนี้มีความสําคัญเป�นอย�างมากท่ีจะได�เรียนรู�เก่ียวกับพ้ืนฐานการเขียนโปรแกรมเชิงโครงสร�างว�ามีอะไรบ�าง โดยเริ่มจากโปรแกรมแรกในภาษาซี โครงสร�างของโปรแกรมภาษาซีแบ�งเป�นก่ีส�วน คําอธิบายในภาษาซีมีความสําคัญอย�างไร ตัวแปรคืออะไร ชนิดข�อมูลมีก่ีแบบ ค�าคงท่ีคืออะไร การแสดงผลข�อมูลจากตัวแปรทําได�อย�างไร การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณทําได�อย�างไร การรับค�ามาเก็บไว�ในตัวแปรต�องทําอย�างไร การดําเนินการคืออะไรและมีอะไรบ�าง และลําดับการทํางานของโอเปอเรเตอร2มีความสําคัญอย�างไร รวมถึงการจัดรูปแบบของการเขียนรหัสต�นฉบับของโปรแกรมก็มีความสําคัญเช�นเดียวกัน สิ่งต�างๆ เหล�านี้เป�นพ้ืนฐานท่ีสําคัญเป�นอย�างมากท่ีจะทําให�ผู�เริ่มเขียนโปรแกรมสามารถเรียนรู�ในบทต�อๆ ไปได�เป�นอย�างดี โปรแกรมแรกในภาษาซี หลังจากท่ีได�ติดต้ังโปรแกรมภาษาซีเป�นท่ีเรียบร�อยแล�ว (ข้ันตอนของการติดต้ังโปรแกรมภาษาซี ได�อธิบายไว�ในภาคผนวก) จะมีการทดสอบโปรแกรมดังกล�าวว�าติดต้ังเรียบร�อยดีหรือไม� โดยการเขียนโปรแกรมแรกในภาษาซีคือ โปรแกรม HelloWorld ดังภาพท่ี 3.1 และผลลัพธ2ของการรัน(สั่งให�ทํางาน) โปรแกรม ดังภาพท่ี 3.2

ภาพท่ี 3.1 โปรแกรมแรกในภาษาซี

52

ภาพท่ี 3.2 ผลลัพธ2ของโปรแกรมแรกในภาษาซี

จากโปรแกรม Helloworld ในภาพท่ี 3.1 เป�นการเขียนรหัสต�นฉบับโดยใช�โปรแกรมอีดิเตอร2 (Editor) ของโปรแกรม Turbo C++ โดยนํารหัสต�นฉบับดังกล�าวมาเขียนในอีกรูปแบบหนึ่งแทน ดังภาพท่ี 3.3

01 02 03 04 05 06 07 08 09

// Hello.c #include <stdio.h> int main() { printf("Hello World"); return 0; }

ภาพท่ี 3.3 แสดงโปรแกรม Helloworld พร�อมกับเลขบรรทัดของโปรแกรม จากภาพท่ี 3.3 แบ�งออกเป�น 2 คอลัมน2 คือ คอลัมน2ซ�ายมือแสดงเลขบรรทัดของรหัสต�นฉบับหรือโปรแกรม ส�วนคอลัมน2ขวามือแสดงรหัสต�นฉบับ เหตุผลท่ีต�องมีเลขบรรทัดของโปรแกรมกํากับไว�คือ เพ่ือใช�อธิบายการทํางานของโปรแกรมในบรรทัดนั้นๆ เช�น บรรทัดท่ี 1 แสดงชื่อของโปรแกรม หรือบรรทัดท่ี 4 ถึง 9 คือฟRงก2ชั่นหลัก เป�นต�น โครงสร�างของโปรแกรมภาษาซี โครงสร�างของโปรแกรมภาษาซี แบ�งออกเป�น 3 ส�วน คือ 1. ส�วนหัวของโปรแกรม 2. ส�วนของฟRงก2ชั่นหลัก 3. ส�วนรายละเอียดของโปรแกรม ภาพท่ี 3.4 แสดงโครงสร�างของโปรแกรมภาษาซี

01 02 03 04

...

n

#include <stdio.h> main() { ...

}

ภาพท่ี 3.4 แสดงโครงสร�างของโปรแกรมภาษาซี

ส�วนหัวของโปรแกรม ส�วนของฟRงก2ชั่นหลัก

ส�วนรายละเอียดของโปรแกรม

53

โดยมีรายละเอียดดังต�อไปนี้ ส�วนหัวของโปรแกรม (Header of Program Section) ส�วนนี้เรียกว�า พรีโปรเซสเซอร5ไดเร็คทีฟ (Preprocessing Directive) คําท่ีอยู�ต�อจากเครื่องหมาย # เรียกว�า ไดเร็คทีฟ (Directive) ในท่ีนี้คือ include พรีโปรเซสเซอร2ไดเร็คทีฟ เป�นคําสั่งท่ีสั่งให�คอมไพเลอร2ทํางานอย�างหนึ่งก�อนท่ีจะทําการคอมไพล2โปรแกรม ไดเร็คทีฟ #include หมายถึง การสั่งให�คอมไพเลอร2นําสิ่งท่ีอยู�ในไฟล2 ซ่ึงกําหนดชื่อไว�มารวมเข�ากับรหัสต�นฉบับ จากภาพท่ี 3.4 เป�นการนําสิ่งท่ีอยู�ในไฟล2 stdio.h มารวมกับรหัสต�นฉบับ ชื่อไฟล2ท่ีกําหนดไว�ในไดเร็คทีฟ เรียกว�า ไฟล5เฮดเดอร5 (Head File) หรือไฟล5อินคลูด (Include File) ในท่ีนี้ไฟล2เฮดเดอร2คือ ไฟล2 stdio.h

ภาพท่ี 3.5 แสดงส�วนประกอบของพรีโปรเซสเซอร2ไดเร็คทีฟ ไฟล2เฮดเดอร2เป�นไฟล2ท่ีมีนามสกุลคือ .h โดยมีรายละเอียดต�างๆ ท่ีโปรแกรมเรียกใช�งาน เช�น ในโปรแกรม Helloworld มีการเรียกใช�ฟRงก2ชั่น printf() ซ่ึงมีการเรียกใช�บางอย�างจากไฟล2 stdio.h ถ�าไม�มีไฟล2 stdio.h เม่ือนําโปรแกรมนี้ไปคอมไพล2 จะไม�ผ�าน เนื่องจากตัวคอมไพเลอร2ไม�รู�จักฟRงก2ชั่น printf() ภาษาซีได�จัดเตรียมไฟล2เฮดเดอร2ไว�ให�ผู�เขียนโปรแกรมได�ใช�งาน ดังนี้ stdio.h ไฟล2เฮดเดอร2ท่ีมีกลุ�มฟRงก2ชั่นใช�งานทางด�านการรับข�อมูลเข�าและการแสดงผลลัพธ2 (Input/Output) เช�น printf(), scanf(), getchar(), putchar() เป�นต�น conio.h ไฟล2เฮดเดอร2ท่ีมีกลุ�มฟRงก2ชั่นใช�งานทางด�านการควบคุมการแสดงผลและรับข�อมูลผ�านทางคีย2บอร2ด เช�น clrscr(), getch(), putch() เป�นต�น string.h ไฟล2เฮดเดอร2ท่ีมีกลุ�มฟRงก2ชั่นใช�งานทางด�านการจัดการกับข�อความ (String) เช�น strcmp(), strcpy() เป�นต�น math.h ไฟล2เฮดเดอร2ท่ีมีกลุ�มฟRงก2ชั่นใช�งานทางด�านการคํานวณทางคณิตศาสตร2 เช�น sin(), cos(), tan(), abs(), log(), pow(), sqrt() เป�นต�น การใช�ไฟล2เฮดเดอร2มี 2 รูปแบบ คือ 1. #include <ไฟล5เฮดเดอร5> คอมไพเลอร2ทําการค�นหาไฟล2เฮดเดอร2ท่ีระบุจากไดเร็คทอรี่หรือโฟลเดอร2ท่ีใช�สําหรับเก็บไฟล2เฮดเดอร2โดยเฉพาะคือ ไดเร็คทอรี่ชื่อว�า include 2. #include ไฟล5เฮดเดอร5 คอมไพเลอร2ทําการค�นหาไฟล2เฮดเดอร2ท่ีระบุจากไดเร็คทอรี่เดียวกันกับไฟล2รหัสต�นฉบับนั้น แต�ถ�าไม�พบให�ไปค�นหาจากไดเร็คทอรี่ท่ีใช�เก็บไฟล2เฮดเดอร2โดยเฉพาะ ส�วนหัวของฟJงก5ช่ันหลัก (Main Function Section) ฟRงก2ชั่นหลักของภาษาซี คือ ฟJงก5ช่ันหลัก (Main Function) หรือ ฟJงก5ช่ัน main() ซ่ึงโปรแกรมภาษาซีทุกโปรแกรมต�องมีฟRงก2ชั่นนี้อยู�ในโปรแกรมเสมอ โดยขอบเขตของฟRงก2ชั่นหลักนี้ถูกกําหนดด�วย

54

เครื่องหมาย Curly Brackets ( {, } ) หมายความว�า การทํางานของฟRงก2ชั่นหลักเริ่มต�นท่ีเครื่องหมาย { (อยู�หลัง main()) และสิ้นสุดท่ีเครื่องหมาย } ฟRงก2ชั่นหลักหรือฟRงก2ชั่น main() สามารถเขียนได�หลายรูปแบบดังภาพท่ี 3.6

01 02 03 04

...

n

#include <stdio.h> main() { ...

}

01 02 03 04

...

n

#include <stdio.h> void main(void) { ...

}

01 02 03 04

...

n

#include <stdio.h> int main() { ...

return 0; }

ก. รูปแบบท่ี 1 ข. รูปแบบท่ี 2 ค. รูปแบบท่ี 3 ภาพท่ี 3.6 การเขียนฟRงก2ชั่นหลักหลายรูปแบบ

ในรูปแบบท่ี 1 และ 2 มีความหมายเดียวกันคือ ไม�มีการรับค�าและส�งค�าคืนออกจากฟRงก2ชั่นหลัก ส�วนรูปแบบท่ี 3 ฟRงก2ชั่นหลักไม�มีการรับค�าแต�มีการส�งค�าคืน ซ่ึงจะได�อธิบายในบทท่ีเก่ียวข�องต�อไป ส�วนรายละเอียดของโปรแกรม (Detail of Program Section) ส�วนนี้เป�นส�วนของการเขียนคําสั่งหรือชุดคําสั่ง เพ่ือสั่งให�เครื่องคอมพิวเตอร2ทํางานตามท่ีได�ออกแบบโปรแกรมไว� ภาพท่ี 3.7 บรรทัดท่ี 6 และ 7 เป�นส�วนรายละเอียดการทํางานของโปรแกรมอยู�ในวงรีเส�นประ โดยโปรแกรมนี้สั่งให�พิมพ2ข�อความ Hello World บนหน�าจอ จากนั้นส�งค�า 0 คืนออกจากฟRงก2ชั่นหลัก

01 02 03 04 05 06 07 08 09

// Hello.c #include <stdio.h> int main() { printf("Hello World"); return 0; }

ภาพท่ี 3.7 โปรแกรม Helloworld ท่ีเน�นส�วนรายละเอียดของโปรแกรมในวงรีเส�นประ ข�อสังเกต คําสั่งในภาษาซีต�องลงท�ายด�วยเครื่องหมาย Semicolon (;) เสมอ เช�น บรรทัดท่ี 6 และ 7 ของโปรแกรม Helloworld

printf("Hello World"); return 0;

การใส�คําอธิบายในภาษาซี จากภาพท่ี 3.7 ในบรรทัดท่ี 1 ท่ีแสดงชื่อโปรแกรม Hello.c โดยข�างหน�าชื่อโปรแกรมมีเครื่องหมาย // (Double Slash) ตรงส�วนนี้เป�นการใส�ข�อมูลท่ีเรียกว�า คําอธิบาย (Comment) เพ่ือใช�ในการอธิบายข�อมูลบางอย�างเพ่ิมเติม เช�น อธิบายชื่อของโปรแกรม อธิบายว�าบรรทัดนี้ใช�ทําอะไร เป�นต�น คําอธิบายท่ีเขียนในโปรแกรมช�วยสื่อสารให�ผู� อ่ืนเข�าใจเม่ือมาอ�านรหัสต�นฉบับ รวมถึงตัวผู�เขียนโปรแกรมเองว�าสิ่งท่ีได�เขียนไว�นั้น ทําไปเพ่ืออะไร เพราะเม่ือเขียนโปรแกรมนี้ไว�นานแล�ว เม่ือนําโปรแกรมกลับมาแก�ไขใหม� อาจจําไม�ได�ว�า บรรทัดนี้ ส�วนนี้ หรือตรงนี้ มีความหมายหรือทําไปเพ่ืออะไร การใส�คําอธิบายในโปรแกรม คอมไพเลอร2ไม�สนใจส�วนท่ีเป�นคําอธิบาย หมายความว�า ไม�มีการคอมไพล2ตรงส�วนท่ีเป�นคําอธิบายนี้

เครื่องหมาย ; ปoดท�ายคําสั่ง

55

การใส�คําอธิบายในภาษาซี มี 2 แบบ คือ 1. การใส�คําอธิบายแบบบรรทัดเดียว (Single-line Comment) การใส�คําอธิบายแบบนี้ มีผลทําให�ข�อความใดๆ หลังจากเครื่องหมาย // ไปจนสุดบรรทัดนั้นกลายเป�นคําอธิบาย 2. การใส�คําอธิบายแบบหลายบรรทัด (Multi-line Comment) นําไปใช�กับคําอธิบายท่ีมีหลายบรรทัด การใส�คําอธิบายแบบนี้ มีผลให�ข�อความใดๆ ท่ีอยู�ระหว�างเครื่องหมาย /* กับเครื่องหมาย */ กลายเป�นคําอธิบาย ตัวอย�างของการใส�คําอธิบายท้ัง 2 แบบ ดังภาพท่ี 3.8

01 02 03 04 05 06 07 08 09 10 11 12

/* Program Name : comment.c Written by : Mr. A Date : 17/03/2556 */ #include <stdio.h> main() { // Begin of main function. printf("This is a comment program"); // Use printf() function. } // End of main function.

ภาพท่ี 3.8 โปรแกรม comment.c แสดงการใส�คําอธิบาย จากภาพท่ี 3.8 บรรทัดท่ี 1 ถึง 4 เป�นการใส�คําอธิบายแบบหลายบรรทัด ส�วนบรรทัดท่ี 7, 9 และ 12 เป�นการใส�คําอธิบายแบบบรรทัดเดียว ประโยชน2ท่ีสําคัญอีกอย�างหนึ่งของการใส�คําอธิบายคือ ใช�ในการทดสอบโปรแกรม โดยการใส�คําอธิบายเอาไว�ตรงบรรทัดท่ีไม�ต�องการให�ทํางาน ดังภาพท่ี 3.9

01 02 03 04 05 06 07 08 09

#include <stdio.h> main() { printf("Hello World\n"); // printf("Hello Universe\n"); printf("Hello Galaxy"); }

ภาพท่ี 3.9 แสดงบรรทัดท่ีไม�ต�องการให�ทํางาน จากภาพท่ี 3.9 เป�นการใส�คําอธิบายแบบบรรทัดเดียวในบรรทัดท่ี 6 เพ่ือสั่งให�โปรแกรมไม�ต�องทําคําสั่ง printf("Hello Universe\n"); ตัวแปร ในการเขียนโปรแกรมไม�ว�าเขียนด�วยภาษาคอมพิวเตอร2ภาษาใดก็ตาม ผู�เขียนโปรแกรมจําเป�นต�องนําตัวแปรมาใช�งานด�วย ในหัวข�อนี้จะได�อธิบายเก่ียวกับว�า ตัวแปรคืออะไร มีความสําคัญและใช�งานอย�างไร ตัวแปรคืออะไร ก�อนท่ีจะอธิบายว�าตัวแปรคืออะไร ลองมาดูตัวอย�างของการใช�เครื่องคิดเลขในการคํานวณ เช�น ต�องการหาผลลัพธ2ของ

395

96

+

มีค�าเท�าไร?

การใส�คําอธิบายแบบหลายบรรทัด การใส�คําอธิบายแบบบรรทัดเดียว

บรรทัดนี้จะไม�ทํางาน

56

เม่ือนําเครื่องคิดเลขมาใช�คํานวณ ในท่ีนี้เป�นการใช�โปรแกรม Calculator ของระบบปฏิบัติการ Microsoft Windows XP ของบริษัท Microsoft Corporation ดังภาพท่ี 3.10 แสดงข้ันตอนของการใช�เครื่องคิดเลขในการหาผลลัพธ2จากโจทย2ดังกล�าว

ก. กดปุ{มเลข 5 ข. กดปุ{ม + ค. กดปุ{มเลข 9 ง. กดปุ{ม =

จ. กดปุ{ม M+ ฉ. กดปุ{มเลข 6 ช. กดปุ{ม / (หาร) ซ. กดปุ{ม MR

ฌ. กดปุ{ม = ภาพท่ี 3.10 แสดงข้ันตอนของการใช�เครื่องคิดเลขในการหาผลลัพธ2

จากภาพท่ี 3.10 เป�นข้ันตอนของการใช�เครื่องคิดเลขในการหาผลลัพธ2ของ

395

96

+

ซ่ึงคําตอบคือ

2.1818181818181818181818181818181818181818181818181818181818182 ให�ดูภาพท่ี 3.10 (จ) ท่ีมีการกดปุ{ม M+ ในท่ีนี้หมายถึง ผลลัพธ2ของ 5 + 39 ซ่ึงได�ค�า 44 ผลลัพธ2นี้นําไปเก็บไว�ในหน�วยความจําของเครื่องคิดเลขก�อน จากนั้นจึงนําไปหาร 96 ต�อ โดยการต้ัง 96 จากนั้นกดปุ{ม / (หาร) แล�วกดปุ{ม MR ตาม การกดปุ{ม MR เป�นการนําตัวเลขท่ีเก็บไว�ในหน�วยความจําของเครื่องคิดเลขมาใช�เป�นตัวหารแล�วได�ผลลัพธ2ท่ีต�องการ หากเครื่องคิดเลขไม�มีปุ{ม M+ ให�ใช�งาน จําเป�นต�องหาอะไรบางอย�างมาจดบันทึกตัวเลขดังกล�าวไว�ชั่วคราว เช�น จดไว�บนกระดาษ เป�นต�น หากลองพิจารณาวิธีการคํานวณของโจทย2นี้ ข้ันตอนท่ี 1 หาผลบวกของ 5 + 39 ก�อนเนื่องจากเป�นตัวหาร จากนั้นข้ันตอนท่ี 2 นําผลบวกท่ีได�ไปหาร 96 ได�ผลลัพธ2คือ 2.181818 ... ท่ีต�องการ ดังภาพท่ี 3.11

57

395

96

+

ภาพท่ี 3.11 แสดงข้ันตอนของการใช�หาผลลัพธ2 สําหรับตัวอย�างของการเขียนโปรแกรมท่ีต�องใช�ตัวแปร ดังภาพท่ี 3.12

01 02 03 04 05 06 07 08 09 10 11 12

#include <stdio.h> int main() { int num; printf("Your number is "); scanf("%d", &num); printf("Display number is %d", num); return 0; }

ภาพท่ี 3.12 โปรแกรมรับและแสดงตัวเลข โปรแกรมรับและแสดงตัวเลขนี้ เม่ือรันโปรแกรมแล�ว โปรแกรมจะให�ผู�ใช�งานป�อนตัวเลขผ�านทางคีย2บอร2ด จากนั้นแสดงผลลัพธ2ท่ีหน�าจอ ดังภาพท่ี 3.13

ก. เม่ือรันโปรแกรม ข. ป�อนตัวเลข 25 ค. กดปุ{ม Enter ภาพท่ี 3.13 โปรแกรมรับและแสดงตัวเลข

โปรแกรมรับและแสดงตัวเลขนี้ เม่ือผู�ใช�งานป�อนตัวเลข โปรแกรมจะนําตัวเลขดังกล�าวมาเก็บไว�ท่ีตัวแปร num บรรทัดท่ี 7 (scanf("%d", &num);) จากนั้นนําค�าในตัวแปร num บรรทัดท่ี 9 (printf("Display number is %d", num);) มาแสดงผ�านทางหน�าจอ ตัวอย�างของการใช�เครื่องคิดเลขในการหาผลลัพธ2และโปรแกรมรับและแสดงตัวเลข จะเห็นได�ว�ามีข�อมูลหรือตัวเลขบางตัว จําเป�นต�องหาท่ีจัดเก็บหรือท่ีพักไว�ก�อนท่ีจะนําไปทําอย�างอ่ืนต�อไป ท่ีจัดเก็บหรือท่ีพักสําหรับเก็บตัวเลขหรือข�อมูลนั้นเรียกว�า ตัวแปร ในโปรแกรมรับและแสดงตัวเลข num ก็คือตัวแปรนั่นเอง ตัวแปร (Variable) คือ ชื่อท่ีกําหนดข้ึนเพ่ือใช�ในการเก็บข�อมูล (ท่ีมา : อรพิน ประวัติบริสุทธิ์, 2547, หน�า 40) การประกาศตัวแปร หมายถึง การจองพ้ืนท่ีในหน�วยความจําของเครื่องคอมพิวเตอร2เพ่ือใช�เก็บข�อมูลท่ีต�องการ การประกาศตัวแปรข้ึนมาต�องระบุชนิดข�อมูลกํากับไว�ด�วย

44 1

96 2

2.181818 ...

58

ชนิดข�อมูล (Data Type) ชนิดข�อมูล คือ สิ่งท่ีใช�กําหนดลักษณะและขอบเขตของข�อมูลนั้นๆ โดยข�อมูลท่ีมีชนิดของข�อมูลแตกต�างกัน ก็จะเก็บข�อมูลได�ในลักษณะท่ีต�างกัน และขอบเขตของข�อมูลท่ีเก็บได�ก็จะไม�เท�ากัน (ท่ีมา : อรพิน ประวัติบริสุทธิ์, 2547, หน�า 40) ชนิดข�อมูลถูกนํามากําหนดให�กับตัวแปรท่ีต�องการใช�งาน จากตัวอย�างโปรแกรมรับและแสดงตัวเลข บรรทัดท่ี 5 (int num;) เป�นการกําหนดชนิดข�อมูลแบบเลขจํานวนเต็มให�กับตัวแปร num ชนิดข�อมูล แบ�งได� 4 แบบ คือ ชนิดข�อมูลแบบ void ชนิดข�อมูลแบบเลขจํานวนเต็ม ชนิดข�อมูลแบบเลขทศนิยม และชนิดข�อมูลแบบตัวอักขระ โดยมีรายละเอียดดังต�อไปนี้ ชนิดข�อมูลแบบ void ชนิดข�อมูลแบบนี้เป�นแบบไม�มีค�าหรือมีค�า 0 ไบต2 ในการเขียนโปรแกรมจะไม�นําชนิดข�อมูลนี้มากําหนดให�กับตัวแปร แต�ชนิดข�อมูลแบบนี้นํามาใช�กับฟRงก2ชั่นท่ีไม�ต�องการรับค�าเข�ามาหรือส�งค�าออกไป ซ่ึงจะได�อธิบายในบทท่ีเก่ียวข�องต�อไป ชนิดข�อมูลแบบเลขจํานวนเต็ม (Integer) เลขจํานวนเต็ม หมายถึง เลขท่ีประกอบไปด�วย เลขจํานวนเต็มบวก (1, 2, 3, ..., 101, 102, 103, ..., 1001, 1002, 1003, ...) เลขจํานวนเต็มศูนย2 (0) และเลขจํานวนเต็มลบ (-1, -2, -3, ..., -101, -102, -103, ..., -1001, -1002, -1003, ...) ชนิดข�อมูลแบบนี้เก็บข�อมูลตัวเลขท่ีเป�นเลขจํานวนเต็มเท�านั้น ในภาษาซีแบ�งชนิดข�อมูลนี้ออกเป�น 3 ประเภท คือ 1. short int หรือ short ชนิดข�อมูลประเภทนี้มีขนาด 2 ไบต2 สําหรับ signed มีค�าอยู�ในช�วง -32,768 ถึง 32,767 และสําหรับ unsigned มีค�าอยู�ในช�วง 0 ถึง 65,535 2. int ชนิดข�อมูลประเภทนี้มีขนาด 2 ไบต2 สําหรับ signed มีค�าอยู�ในช�วง -32,768 ถึง 32,767 และสําหรับ unsigned มีค�าอยู�ในช�วง 0 ถึง 65,535 นอกจากนี้ชนิดข�อมูลประเภทนี้ยังมีขนาด 4 ไบต2ด�วย และสําหรับ signed มีค�าอยู�ในช�วง -2,147,483,648 ถึง 2,147,483,647 และสําหรับ unsigned มีค�าอยู�ในช�วง 0 ถึง 4,294,967,295 3. long int หรือ long ชนิดข�อมูลประเภทนี้มีขนาด 4 ไบต2 สําหรับ signed มีค�าอยู�ในช�วง -2,147,483,648 ถึง 2,147,483,647 และสําหรับ unsigned มีค�าอยู�ในช�วง 0 ถึง 4,294,967,295 สําหรับคําว�า signed และ unsigned นั้น signed หมายถึง ข�อมูลเลขจํานวนเต็มท่ีมีเครื่องหมายเข�ามาเก่ียวข�อง เครื่องหมายในท่ีนี้คือ เครื่องหมายบวก (+) คือเลขจํานวนเต็มบวก และเครื่องหมายลบ (-) คือเลขจํานวนเต็มลบ ส�วน unsigned หมายถึง ข�อมูลเลขจํานวนเต็มท่ีไม�มีเครื่องหมายเข�ามาเก่ียวข�องซ่ึงหมายถึงเลขจํานวนเต็มบวกเท�านั้น ตัวอย�างของเลขจํานวนเต็มคือ อายุเฉลี่ยของนักศึกษาชาย 18 ป� วิชาภาษาไทยได� 89 คะแนน อุณหภูมิท่ีรัสเซีย -35 องศาเซลเซียส หรือความเร็วแสง 299,792,458 เมตร/วินาที เป�นต�น ชนิดข�อมูลแบบเลขทศนิยม (Floating-Point) เลขทศนิยมหรือเลขจํานวนจริง (Real) หมายถึง เลขท่ีมีจุดทศนิยม ซ่ึงอาจเป�นเลขจํานวนเต็ม เช�น 25 หรือเป�นเลขท่ีมีจุดทศนิยม เช�น 25.1256 ในภาษาซีแบ�งชนิดข�อมูลแบบนี้ออกเป�น 3 ประเภท คือ 1. float ชนิดข�อมูลประเภทนี้มีขนาด 4 ไบต2 มีค�าอยู�ในช�วง 3.4 x 10-38 ถึง 3.4 x 1038 2. double ชนิดข�อมูลประเภทนี้มีขนาด 8 ไบต2 มีค�าอยู�ในช�วง 1.7 x 10-308 ถึง 1.7 x 10308 3. long double ชนิดข�อมูลประเภทนี้มีขนาด 10 ไบต2 มีค�าอยู�ในช�วง 3.4 x 10-4932 ถึง 1.7 x 104932 ชนิดข�อมูลแบบเลขทศนิยมนี้ เป�นแบบ signed เพียงอย�างเดียว

59

ตัวอย�างของเลขทศนิยมคือ อุณหภูมิสูงสุดของกรุงเทพฯ ช�วงเดือนเมษายนป�นี้ ประมาณ 39.45 องศาเซลเซียส หรือจงหาค�าของ 34 x 25 x 42 เป�นต�น ชนิดข�อมูลแบบตัวอักขระ (Character) ตัวอักขระ (Character) หมายถึง สัญลักษณ2ต�างๆ ท่ีไม�สามารถนํามาใช�ในการคํานวณได� ตัวอักขระประกอบด�วย 1. ตัวอักษร (Alphabet) คือ A, B, C, a, b, c, ก, ข, ค เป�นต�น 2. ตัวเลข (Numeric) คือ 1, 2, 3, 4, 5, 6 7, 8 9 เป�นต�น 3. สัญลักษณ5พิเศษ (Special Symbol) คือ !, @, #, $, %, ^, &, * เป�นต�น ชนิดข�อมูลนี้มีขนาด 1 ไบต2 หมายความว�า เก็บตัวอักขระได�เพียงตัวเดียวเท�านั้น ถ�าต�องการเก็บตัวอักษรมากกว�า 1 ตัวหรือเรียกว�า สตริง (String) จะต�องใช�ชนิดข�อมูลแบบตัวอักขระมากําหนดให�อยู�ในลักษณะของอาเรย2 ซ่ึงจะได�อธิบายในบทท่ีเก่ียวข�องต�อไป การประกาศตัวแปร หลังจากท่ีได�ทราบถึงตัวแปรและชนิดข�อมูลแล�ว ผู�เขียนโปรแกรมจําเป�นต�องทราบถึงการนําตัวแปรมาใช�งาน การนําตัวแปรมาใช�งานในการเขียนโปรแกรมเรียกว�า การประกาศตัวแปร (Variable Declaration) เพ่ือเป�นการกําหนดชนิดข�อมูลให�กับตัวแปรท่ีต�องการใช�งาน ซ่ึงต�องพิจารณาให�ดีว�าในการเขียนโปรแกรมนั้นต�องการเก็บข�อมูลในลักษณะใด จากนั้นจึงเลือกชนิดข�อมูลให�เหมาะสม เช�น เขียนโปรแกรมเก่ียวกับอุณหภูมิ ข�อมูลอุณหภูมิอยู�ในลักษณะของเลขทศนิยม ชนิดข�อมูลท่ีเลือกใช�คือ ชนิดข�อมูลแบบเลขทศนิยม แต�ถ�าต�องการเขียนโปรแกรมเก่ียวกับการคํานวณเกรด โดยคะแนนสอบกําหนดให�เป�นเลขจํานวนเต็ม ชนิดข�อมูลท่ีเลือกใช�คือ ชนิดข�อมูลแบบเลขจํานวนเต็มประเภท int เป�นต�น รูปแบบการประกาศตัวแปร ดังภาพท่ี 3.14

ชนิดข�อมูล ช่ือตัวแปร;

ภาพท่ี 3.14 รูปแบบการประกาศตัวแปร ตัวอย�างการประกาศตัวแปร เช�น int num; เป�นการประกาศตัวแปร num มีชนิดข�อมูลแบบเลขจํานวนเต็มประเภท int int point; เป�นการประกาศตัวแปร point มีชนิดข�อมูลแบบเลขจํานวนเต็มประเภท int long int length; เป�นการประกาศตัวแปร length มีชนิดข�อมูลแบบเลขจํานวนเต็มประเภท long float area; เป�นการประกาศตัวแปร area มีชนิดข�อมูลแบบเลขทศนิยม float average; เป�นการประกาศตัวแปร average มีชนิดข�อมูลแบบเลขทศนิยม double pi; เป�นการประกาศตัวแปร pi มีชนิดข�อมูลแบบเลขทศนิยม char grade; เป�นการประกาศตัวแปร grade มีชนิดข�อมูลแบบตัวอักขระ char gender; เป�นการประกาศตัวแปร gender มีชนิดข�อมูลแบบตัวอักขระ char data; เป�นการประกาศตัวแปร data มีชนิดข�อมูลแบบตัวอักขระ

60

ตัวอย�างท่ี 3.1 โปรแกรมแสดงการประกาศตัวแปรชนิดข�อมูลต�างๆ

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17

#include <stdio.h> void main(void) { int num; float x; char Z; num = 67; x = 2.3694; Z = 'A'; printf("Display integer is %d\n", num); printf("Display floating-point is %f\n", x); printf("Display character is %c", z); }

ภาพท่ี 3.14 โปรแกรมแสดงการประกาศตัวแปรชนิดข�อมูลต�างๆ จากตัวอย�างนี้ - บรรทัดท่ี 5 (int num;) เป�นการประกาศตัวแปร num มีชนิดข�อมูลแบบเลขจํานวนเต็ม - บรรทัดท่ี 6 (float x;) เป�นการประกาศตัวแปร x มีชนิดข�อมูลแบบเลขทศนิยม - บรรทัดท่ี 7 (char Z;) เป�นการประกาศตัวแปร z มีชนิดข�อมูลแบบตัวอักขระ - บรรทัดท่ี 9 (num = 67;) บรรทัดท่ี 10 (x = 2.3694;) และบรรทัดท่ี 11 (Z = 'A';) เป�นการกําหนดค�าให�แก�ตัวแปรดังกล�าว - บรรทัดท่ี 13 (printf("Display integer is %d\n", num);) บรรทัดท่ี 14 (printf("Display floating-point is %f\n", x);) และบรรทัดท่ี 15 (printf("Display character is %c", z);) เป�นการนําค�าท่ีอยู�ในตัวแปรดังกล�าวออกมาแสดงท่ีหน�าจอ การกําหนดค�าเริ่มต�นให�กับตัวแปร จากตัวอย�างท่ี 3.1 บรรทัดท่ี 5 ถึง 7 เป�นการประกาศตัวแปร และบรรทัดท่ี 9 ถึง 11 เป�นการกําหนดค�าเริ่มต�นให�กับตัวแปร ซ่ึงเป�นการแยกการกําหนดค�าเริ่มต�นให�กับตัวแปร การทําแบบนี้ทําให�จํานวนบรรทัดของโปรแกรมมีมากข้ึน ส�งผลให�ไฟล2รหัสต�นฉบับมีขนาดไฟล2 (File Size) มีขนาดใหญ�โดยไม�จําเป�น อย�างไรก็ตามสามารถกําหนดค�าเริ่มต�นให�กับตัวแปรได� ดังตัวอย�างท่ี 3.2 ตัวอย�างท่ี 3.2 โปรแกรมแสดงการกําหนดค�าเริ่มต�นให�กับตัวแปรชนิดข�อมูลต�างๆ

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> void main(void) { int num = 67; float x = 2.3694; char Z = 'A'; printf("Display integer is %d\n", num); printf("Display floating-point is %f\n", x); printf("Display character is %c", z); }

ภาพท่ี 3.15 โปรแกรมแสดงการกําหนดค�าเริ่มต�นให�กับตัวแปรชนิดข�อมูลต�างๆ จากตัวอย�างนี้

61

- บรรทัดท่ี 5 (int num = 67;) เป�นการประกาศตัวแปร num มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นคือ 67 - บรรทัดท่ี 6 (float x = 2.3694;) เป�นการประกาศตัวแปร x มีชนิดข�อมูลแบบเลขทศนิยม และกําหนดค�าเริ่มต�นคือ 2.6394 - บรรทัดท่ี 7 (char Z = 'A';) เป�นการประกาศตัวแปร z มีชนิดข�อมูลแบบตัวอักขระ และกําหนดค�าเริ่มต�นคือ A เม่ือเปรียบเทียบจํานวนบรรทัดของตัวอย�างนี้ ซ่ึงใช�เพียง 13 บรรทัด แต�ตัวอย�างท่ี 3.1 ใช�ถึง 17 บรรทัด ประเภทของตัวแปร นอกจากกําหนดชนิดข�อมูลให�กับตัวแปรแล�ว ผู�เขียนโปรแกรมยังต�องพิจารณาถึงประเภทของตัวแปรด�วย ประเภทของตัวแปรมีความสําคัญต�อการเขียนโปรแกรม เนื่องจากหากผู�เขียนโปรแกรมเรียกใช�หรือประกาศประเภทของตัวแปรผิด ส�งผลทําให�โปรแกรมเกิดข�อผิดพลาดข้ึนมาได� ประเภทของตัวแปรแบ�งได� 2 ประเภท คือ 1. ตัวแปรโกลบอล (Global Variable) คือ ตัวแปรท่ีประกาศไว�ภายนอกฟRงก2ชั่น เปรียบเสมือนว�าตัวแปรนั้นเป�นของสาธารณะ ไม�มีฟRงก2ชั่นใดเป�นเจ�าของตัวแปรนั้น ทําให�ทุกฟRงก2ชั่นสามารถใช�งานตัวแปรนั้นได� 2. ตัวแปรโลคอล (Local Variable) คือ ตัวแปรท่ีประกาศไว�ภายในฟRงก2ชั่น เปรียบเสมือนว�าตัวแปรนั้นเป�นเฉพาะของฟRงก2ชั่นนั้น ฟRงก2ชั่นอ่ืนไม�สามารถใช�งานตัวแปรนั้นได� ตัวอย�างท่ี 3.3 โปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอล

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

#include <stdio.h> int num = 67; testLocal() { int x = 20; printf("This local variable x is %d\n", x); printf("This global variable num is %d (from testLocal)", num); } void main(void) { printf("This global variable num is %d\n", num); testLocal(); }

ภาพท่ี 3.16 โปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอล เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.17

This global variable num is 67

This local variable x is 20

This global variable num is 67 (from testLocal)

ภาพท่ี 3.17 ผลลัพธ2ของโปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอล จากตัวอย�างนี้ บรรทัดท่ี 3 (int num = 67;) เป�นการประกาศตัวแปร num มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นให�คือ 67 บรรทัดท่ีประกาศตัวแปร num เป�นพ้ืนท่ีท่ีอยู�นอกฟRงก2ชั่นท้ังฟRงก2ชั่นหลักและฟRงก2ชั่น testLocal() ดังนั้นตัวแปร num มีประเภทของตัวแปรเป�นตัวแปรโกลบอล ทุกฟRงก2ชั่นจึงนําตัว

62

แปร num ไปใช�งานภายในฟRงก2ชั่นตัวเองได� คือ ฟRงก2ชั่นหลักมีการนําตัวแปร num มาใช�ท่ีบรรทัดท่ี 15 (printf("This global variable num is %d\n", num);) และฟRงก2ชั่น testLocal() มีการนําตัวแปร num มาใช�ท่ีบรรทัดท่ี 9 (printf("This global variable num is %d (from testLocal)", num);) ส�วนตัวแปรโล คอลของโปรแกรมนี้คือ ตัวแปร x มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นให�คือ 20 ตัวแปร x นี้ใช�ได�เฉพาะในฟRงก2ชั่น testLocal() เท�านั้น ฟRงก2ชั่นหลักไม�สามารถนําไปใช�งานได� กรณีท่ีมีการนําตัวแปรโลคอลไปใช�งานฟRงก2ชั่นอ่ืน ส�งผลทําให�เกิดข�อผิดพลาดข้ึนมา ดังตัวอย�างท่ี 3.4 ตัวอย�างท่ี 3.4 โปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอลท่ีมีข�อผิดพลาด

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

#include <stdio.h> int num = 67; testLocal() { int x = 20; printf("This local variable x is %d\n", x); printf("This global variable num is %d (from testLocal)", num); } void main(void) { printf("This global variable num is %d\n", num); printf("This local variable x is %d\n", x); }

ภาพท่ี 3.18 โปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอลท่ีมีข�อผิดพลาด ตัวอย�างนี้จะเหมือนกับตัวอย�างท่ี 3.3 เพียงต�องการจะทดสอบการนําตัวแปรโลคอล x ของฟRงก2ชั่น testLocal() มาใช�ในฟRงก2ชั่นหลักท่ีบรรทัดท่ี 16 (printf("This local variable x is %d\n", x);) เพ่ือดูว�าจะเกิดอะไรข้ึน และเม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.19 ผลลัพธ2ท่ีได�คือ จะเกิดข�อผิดพลาด (Error) ข้ึนมา

ภาพท่ี 3.19 ผลลัพธ2ของการรันโปรแกรมแสดงการทํางานของตัวแปรโกลบอลและตัวแปรโลคอลท่ีมีข�อผิดพลาด

ดังนั้นสําหรับผู�เริ่มเขียนโปรแกรม จําเป�นท่ีจําเป�นต�องกําหนดประเภทของตัวแปรให�ถูกต�องกับการใช�งานด�วย เพ่ือช�วยลดข�อผิดพลาดของโปรแกรมท่ีอาจจะเกิดข้ึนได�

63

กฎการตั้งช่ือตัวแปร ตัวแปรท่ีผู�เขียนโปรแกรมได�สร�างข้ึนมาต�องมีการต้ังชื่อตัวแปรเพ่ือใช�ในการอ�างถึง ซ่ึงกฎการต้ังชื่อตัวแปรจะถูกนําไปใช�กับการต้ังชื่อฟRงก2ชั่นด�วย กฎการต้ังชื่อตัวแปร มีดังนี้ 1. ชื่อตัวแปรต�องไม�มีสัญลักษณ2พิเศษประกอบอยู�ด�วย สัญลักษณ2พิเศษ ได�แก� ~, !, @, #, $, %, ^, &, *, ( หรือ ) เป�นต�น 2. ชื่อตัวแปรสามารถใช�เครื่องหมาย _ (Underscore) ได� 3. ชื่อตัวแปรประกอบด�วยตัวเลขได� แต�ห�ามใช�ตัวเลขข้ึนต�น และห�ามมีช�องว�าง 4. ชื่อตัวแปรสามารถใช�ตัวอักษรได�ท้ังตัวเล็กและตัวใหญ� ชื่อตัวแปรท่ีสะกดเหมือนกัน แต�ใช�ตัวอักษรตัวเล็กและตัวใหญ�ต�างกัน ถือว�าเป�นตัวแปรคนละตัวกัน เรียกว�า Case Sensitive เช�น value, Value, ValuE และ VALUE ถือว�าเป�นตัวแปรคนละตัวกัน 5. ชื่อตัวแปรต�องไม�ซํ้ากับคําสงวนในภาษาซี คําสงวนในภาษาซี (Reserved Word) คําสงวนต�างๆ ในภาษาซี ดังภาพท่ี 3.20

asm default for pascal switch _ds auto do goto register typedef _es break double huge return union _ss case else if short unsigned cdecl enum int signed void char extern interrupt sizeof volatile const far long static while continue float near struct _cs

ภาพท่ี 3.20 คําสงวนในภาษาซี ตัวอย�างของการต้ังชื่อตัวแปร a ถูกต�อง b9 ถูกต�อง 108Shop ผิด เนื่องจากชื่อตัวแปรนี้ข้ึนต�นด�วยตัวเลข seven11 ถูกต�อง E-Mail ผิด เนื่องจากชื่อตัวแปรนี้มีสัญลักษณ2พิเศษ - $dollar ผิด เนื่องจากชื่อตัวแปรนี้มีสัญลักษณ2พิเศษ $ _Home ถูกต�อง c_language ถูกต�อง First Name ผิด เนื่องจากชื่อตัวแปรนี้มีช�องว�าง return ผิด เนื่องจาก return เป�นคําสงวน switch ผิด เนื่องจาก switch เป�นคําสงวน

64

a+b ผิด เนื่องจากชื่อตัวแปรนี้มีสัญลักษณ2พิเศษ + a_plus_b ถูก ค�าคงที่ ผู�เขียนโปรแกรมนอกจากจะนําตัวแปรมาใช�งานแล�ว ยังสามารถนําค�าคงท่ีมาใช�ช�วยเขียนโปรแกรมได�เช�นกัน สําหรับผู�เริ่มเขียนโปรแกรมคงมีข�อสงสัยว�าค�าคงท่ีคืออะไรและนํามาใช�อย�างไร ให�ดูสูตรการหาพ้ืนท่ีวงกลม สูตรการหาพ้ืนท่ีวงกลม คือ π x r2 ซ่ึง π มีค�าเท�ากับ 3.14159265359 ค�า π ถือว�ามีค�าเท�ากับ 3.14159265359 ตลอดหรือทุกครั้งหรือเป�นค�าคงท่ีนั่นเอง ดังนั้นเม่ือนํามาเขียนโปรแกรมเพ่ือคํานวณหาพ้ืนท่ีวงกลม จึงต�องกําหนดค�าคงท่ีของ π ข้ึนมาใช�ในโปรแกรม ค�าคงท่ี (Constant) คือ ค�าท่ีถูกกําหนดหรือสร�างข้ึนมาแล�ว ไม�สามารถเปลี่ยนแปลงค�าได� ค�าคงท่ีแบ�งเป�น 3 ประเภท (ท่ีมา : อรพิน ประวัติบริสุทธิ์, 2547, หน�า 42) คือ 1. ค�าคงท่ีแบบ Literal (Literal Constant) คือ ค�าคงท่ีซ่ึงเป�นข�อมูลท่ีแน�นอน ค�าคงท่ีนี้ไม�จําเป�นต�องมีตัวแปรมารองรับ สามารถกําหนดเข�าไปในโปรแกรมได�โดยตรง ดังตัวอย�างท่ี 3.5 ตัวอย�างท่ี 3.5 โปรแกรมแสดงค�าคงท่ีแบบ Literal

01 02 03 04 05 06 07 08 09

#include <stdio.h> void main(void) { printf("Grade of Science is %c.\n", 'A'); printf("5 + 48 = %d\n", 5 + 48); printf("4 * 0 = %d\n", 0); }

ภาพท่ี 3.21 โปรแกรมแสดงค�าคงท่ีแบบ Literal จากตัวอย�างนี้ บรรทัดท่ี 5 ตรง 'A' บรรทัดท่ี 6 ตรง 5 + 48 (เส�นประ) และบรรทัดท่ี 7 ตรง 0 คือ ค�าคงท่ีแบบ Literal มีการกําหนดให�เป�นข�อมูลท่ีแน�นอน เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.22

Grade of Science is A.

5 + 48 = 53

4 * 0 = 0

ภาพท่ี 3.22 ผลลัพธ2ของโปรแกรมแสดงค�าคงท่ีแบบ Literal 2. ค�าคงท่ีแบบ Defined (Defined Constant) คือ ค�าคงท่ีท่ีได�กําหนดไว�ท่ีส�วนหัวของโปรแกรม โดยอยู�ใต�พรีโปรเซสซ่ิงไดเร็คทีฟ ค�าคงท่ีนี้ต�องมีเครื่องหมายและคํานําหน�าดังนี้ #define รูปแบบการใช�งานดังภาพท่ี 3.22

#define ช่ือตัวแปร ค�าคงท่ี

ภาพท่ี 3.23 รูปแบบการใช�ค�าคงท่ีแบบ Defined

ค�าคงท่ีแบบ Literal

65

ตัวอย�างท่ี 3.6 โปรแกรมแสดงค�าคงท่ีแบบ Defined

01 02 03 04 05 06 07 08

#include <stdio.h> #define pi 3.14159265359 void main(void) { printf("Value of pi is %f", pi); }

ภาพท่ี 3.24 โปรแกรมแสดงค�าคงท่ีแบบ Literal จากตัวอย�างนี้ บรรทัดท่ี 2 (#define pi 3.14159265359) เป�นการกําหนดค�าคงท่ีแบบ Defined เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.25

Value of pi is 3.14159265359

ภาพท่ี 3.25 ผลลัพธ2ของโปรแกรมแสดงค�าคงท่ีแบบ Defined ข�อสังเกต การใช�ค�าคงท่ีแบบนี้คือ หลังค�าคงท่ีไม�ต�องตามด�วยเครื่องหมาย Semicolon ( ; ) 3. ค�าคงท่ีแบบ Memory (Memory Constant) คือ ค�าคงท่ีท่ีกําหนดให�กับตัวแปร เม่ือกําหนดค�าให�กับตัวแปรนั้นแล�ว ตัวแปรดังกล�าวมีค�าคงท่ีนั้นไปตลอดการทํางานของโปรแกรม ไม�สามารถเปลี่ยนแปลงค�าคงท่ีของตัวแปรนั้นได� ค�าคงท่ีนี้ต�องมีคํานําหน�าคือ const ซ่ึงมาจากคําเต็มคือ constant รูปแบบการใช�ค�าคงท่ีแบบ Memory ดังภาพท่ี 3.26

const ชนิดข�อมูล ช่ือตัวแปร = ค�าคงท่ี;

ภาพท่ี 3.26 รูปแบบการใช�ค�าคงท่ีแบบ Memory ตัวอย�างท่ี 3.7 โปรแกรมแสดงค�าคงท่ีแบบ Memory

01 02 03 04 05 06 07 08

#include <stdio.h> void main(void) { const float pi = 3.14159265359; printf("Value of pi is %f", pi); }

ภาพท่ี 3.27 โปรแกรมแสดงค�าคงท่ีแบบ Memory จากตัวอย�างนี้ บรรทัดท่ี 5 (const float pi = 3.14159265359;) เป�นการกําหนดค�าคงท่ีแบบ Memory เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.28

Value of pi is 3.14159265359

ภาพท่ี 3.28 ผลลัพธ2ของโปรแกรมแสดงค�าคงท่ีแบบ Memory

ค�าคงท่ีแบบ Defined

ค�าคงท่ีแบบ Memory

66

การแสดงผลข�อมูลจากตัวแปร ค�าท่ีเก็บอยู�ในตัวแปรสามารถนําออกมาแสดงผล (Output) ได�ผ�านทางหน�าจอ จากตัวอย�างโปรแกรมในข�างต�น มีการใช� ฟJงก5ช่ัน printf() ชื่อเต็มคือ print formatted หากต�องการเรียกใช�ฟRงก2ชั่น printf() จะต�องประกาศไฟล2เฮดเดอร2 stdio.h (#include <stdio.h>) ไว�ท่ีส�วนหัวของโปรแกรมด�วย รูปแบบการใช�ฟRงก2ชั่น printf() ดังภาพท่ี 3.29

printf("ข�อมูลท่ีต�องการแสดงผล", รายการข�อมูลท่ีจะแสดงผล);

ภาพท่ี 3.29 รูปแบบการใช�ฟRงก2ชั่น printf() ข�อมูลท่ีต�องการแสดงผล (String Format) คือ ข�อมูลท่ีต�องการให�ปรากฏบนหน�าจอ อาจเป�นข�อความท่ัวๆ ไป เช�น "สวัสดี ประเทศไทย" หรือเป�นสัญลักษณ2ท่ีใช�แทนชนิดข�อมูลต�างๆ ซ่ึงถูกแทนด�วยค�าคงท่ี ตัวแปร หรือนิพจน2ใดๆ ท่ีกําหนดเป�นพารามิเตอร2ต้ังแต�ตัวท่ี 2 เป�นต�นไปในส�วนของรายการข�อมูลท่ีจะแสดงผล เช�น %d ใช�แทนข�อมูลของชนิดข�อมูลแบบเลขจํานวนเต็ม %f ใช�แทนข�อมูลของชนิดข�อมูลแบบเลขทศนิยม เป�นต�น ตัวอย�าง "The area is %f" รายการข�อมูลท่ีจะแสดงผล (Data List) คือ ข�อมูลท่ีจะแสดงผล อาจเป�นค�าคงท่ี ตัวแปร หรือนิพจน2ใดๆ ก็ได� ตัวแทนชนิดข�อมูลได�แสดงไว�ในตารางท่ี 3.1

ชนิดข�อมูล ตัวแทนชนิดข�อมูล char %c string %s short int %hd unsigned short int %hu int %d unsigned int %u long int %Ld unsigned long int %Lu float %f double %Lf long double %Lf

ตารางท่ี 3.1 ตัวแทนชนิดข�อมูลแต�ละประเภท ท่ีมา : อรพิน ประวัติบริสุทธิ์, 2547, หน�า 66

67

ตัวอย�างท่ี 3.8 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf()

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> void main(void) { int num = 123456; char c = 'A'; float f = 123.456; printf("The number is %d", num); printf("The character is %c", c); printf("The floating-point is %f", f); }

ภาพท่ี 3.30 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.31

The number is 123456 The character is A The floating-point is 123.456

ภาพท่ี 3.31 ผลลัพธ2ของโปรแกรมแสดงการใช�ฟRงก2ชั่น printf() จากตัวอย�างนี้ บรรทัดท่ี 9 (printf("The number is %d", num);) เม่ือใช�ฟRงก2ชั่น printf() กับชนิดข�อมูลแบบเลขจํานวนเต็ม จะมีการทํางานดังนี้ ตัวแปร num มีค�าเท�ากับ 123456 จะถูกนําไปแสดงตรง %d ได�เป�น The number is 123456 ดังภาพท่ี 3.32

printf("The number is %d", num); printf("The number is 123456");

The number is 123456

ภาพท่ี 3.32 แสดงข้ันตอนการทํางานของฟRงก2ชั่น printf() กับชนิดข�อมูลแบบเลขจํานวนเต็ม ส�วนบรรทัดท่ี 10 (printf("The character is %c", c);) เม่ือใช�ฟRงก2ชั่น printf() กับชนิดข�อมูลแบบตัวอักขระ จะมีการทํางานดังนี้ ตัวแปร c มีค�าเท�ากับ A จะถูกนําไปแสดงตรง %c ได�เป�น The character is A ดังภาพท่ี 3.33

num = 123456 1

3

2

68

printf("The character is %c", c); printf("The character is A");

The character is A

ภาพท่ี 3.33 แสดงข้ันตอนการทํางานของฟRงก2ชั่น printf() กับชนิดข�อมูลแบบตัวอักขระ เช�นเดียวกันในบรรทัดท่ี 11 (printf("The floating-point is %f", f);) เม่ือใช�ฟRงก2ชั่น printf() กับชนิดข�อมูลแบบเลขทศนิยม จะมีการทํางานดังนี้ ตัวแปร f มีค�าเท�ากับ 123.456 จะถูกนําไปแสดงตรง %f ได�เป�น The floating-point is 123.456 ดังภาพท่ี 3.34 printf("The floating-point is %f", f); printf("The floating-point is 123.456"); The floating-point is 123.456

ภาพท่ี 3.34 แสดงข้ันตอนการทํางานของฟRงก2ชั่น printf() กับชนิดข�อมูลแบบเลขทศนิยม ตัวอย�างท่ี 3.9 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบเลขจํานวนเต็ม

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> void main(void) { int num1 = 10; int num2 = 20; int num3 = 30; int sum; sum = num1 + num2 + num3; printf("The summation of %d + %d + %d is %d", num1, num2, num3, sum); }

ภาพท่ี 3.35 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบเลขจํานวนเต็ม

c = 'A'

f = 123.456

1

3

2

1

3

2

69

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.31

The summation of 10 + 20 + 30 is 60

ภาพท่ี 3.36 ผลลัพธ2ของโปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบเลขจํานวนเต็ม

จากตัวอย�างนี้ บรรทัดท่ี 11 (printf("The summation of %d + %d + %d is %d", num1, num2, num3, sum);) เม่ือใช�ฟRงก2ชั่น printf() กับชนิดข�อมูลแบบเลขจํานวนเต็ม จะมีการทํางานดังนี้ ตัวแปร num1 มีค�าเท�ากับ 10 ถูกนําไปแสดงตรง %d ตัวท่ี 1 (นับจากซ�ายมือ) ตัวแปร num2 มีค�าเท�ากับ 20 ถูกนําไปแสดงตรง %d ตัวท่ี 2 ตัวแปร num3 มีค�าเท�ากับ 30 ถูกนําไปแสดงตรง %d ตัวท่ี 3 และตัวแปร sum มีค�าเท�ากับ 60 ถูกนําไปแสดงตรง %d ตัวสุดท�าย ได�เป�น The summation of 10 + 20 + 30 is 60 ดังภาพท่ี 3.37 printf("The summation of %d + %d + %d is %d", num1, num2, num3, sum); printf("The summation of 10 + 20 + 30 is 60"); The summation of 10 + 20 + 30 is 60

ภาพท่ี 3.37 แสดงข้ันตอนการทํางานของฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัว ตัวอย�างท่ี 3.10 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบตัวอักขระ

01 02 03 04 05 06 07 08 09 10

#include <stdio.h> void main(void) { char x1 = 'B'; char x2 = 'D'; printf("A %c C %c E", x1, x2); }

ภาพท่ี 3.38 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบตัวอักขระ

1

3

2 num1 = 10

num2 =20

num3 = 30 sum = 60 4 5

6

70

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.39

A B C D E

ภาพท่ี 3.39 ผลลัพธ2ของโปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบตัวอักขระ

จากตัวอย�างนี้ บรรทัดท่ี 8 (printf("A %c C %c E", x1, x2);) เม่ือใช�ฟRงก2ชั่น printf() กับชนิดข�อมูลแบบตัวอักขระ การทํางานของฟRงก2ชั่น printf() จะเหมือนกับตัวอย�างท่ี 3.9 จะได�ผลลัพธ2ดังภาพท่ี 3.39 คือ A B C D E ตัวอย�างท่ี 3.11 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบผสม

01 02 03 04 05 06 07 08 09 10

#include <stdio.h> void main(void) { int age = 19; char grade = 'F'; printf("I am %d years old. My grade of biology is %c.", age, grade); }

ภาพท่ี 3.40 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบผสม

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.41

I am 19 years old. My grade of biology is F.

ภาพท่ี 3.41 ผลลัพธ2ของโปรแกรมแสดงการใช�ฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของชนิดข�อมูลแบบผสม

จากตัวอย�างนี้ บรรทัดท่ี 8 (printf("I am %d years old. My grade of biology is %c.", age, grade);) เม่ือใช�ฟRงก2ชั่น printf() กับชนิดข�อมูลแบบผสม(มีท้ังชนิดข�อมูลแบบเลขจํานวนเต็มและแบบตัวอักขระ) มีการทํางานดังนี้ ตัวแปร age มีค�าเท�ากับ 19 ถูกนําไปแสดงตรง %d และตัวแปร grade มีค�าเท�ากับ 'F' ถูกนําไปแสดงตรง %c ได�เป�น I am 19 years old. My grade of biology is F. ดังภาพท่ี 3.42

71

printf("I am %d years old. My grade of biology is %c.", age, grade); printf("I am 19 years old. My grade of biology is F."); I am 19 years old. My grade of biology is F. ภาพท่ี 3.42 แสดงข้ันตอนการทํางานของฟRงก2ชั่น printf() กับรายการข�อมูลท่ีจะแสดงผลมากกว�าหนึ่งตัวของ

ชนิดข�อมูลแบบผสม รหัสควบคุม จากตัวอย�างท่ี 3.5 บรรทัดท่ี 5 (printf("Grade of Science is %c.\n", 'A');) จะมีเครื่องหมาย \ (Backslash) กับตัวอักษร n คือ \n คําสั่งนี้เรียกว�า รหัสควบคุม (Escape Sequence) โดย \n สั่งให�ข้ึนบรรทัดใหม� หมายความว�า เม่ือพิมพ2ข�อความ Grade of Science is A ท่ีหน�าจอแล�ว ตําแหน�งของเคอร2เซอร2 (Cursor) รออยู�ท่ีท�ายข�อความ เม่ือเจอรหัสควบคุม \n ซ่ึงเป�นการสั่งให�ข้ึนบรรทัดใหม� ตําแหน�งเคอร2เซอร2จะไปอยู�บรรทัดถัดไปในคอลัมน2แรก เพ่ือรอพิมพ2ข�อมูลของคําสั่งถัดไป

ภาพท่ี 3.43 แสดงการใช�รหัสควบคุม \n นอกจากรหัสควบคุมสําหรับข้ึนบรรทัดใหม�แล�ว ยังมีรหัสควบคุมอ่ืนๆ ในภาษาซี ดังภาพท่ี 3.44

ภาพท่ี 3.44 รหัสควบคุม ท่ีมา : Brain W. Kerighan and Dennis M. Ritchie, 1988, p.37.

1

2

age = 10

gender = 'F' 3

4

Grade of Science is A_

ตําแหน�งเคอร2เซอร2

1 Grade of Science is A _

ตําแหน�งเคอร2เซอร2

2

\n

หลังจากใช� รหัสควบคุม

72

คําอธิบายรหัสควบคุม \a ส�งเสียงบ๊ีบ 1 ครั้ง \\ พิมพ2เครื่องหมาย \ \b ย�อนกลับไป 1 ตัวอักษร \? พิมพ2เครื่องหมาย ? \f ข้ึนหน�าใหม� \' พิมพ2เครื่องหมาย ' \n ข้ึนบรรทัดใหม� \" พิมพ2เครื่องหมาย " \r เลื่อนเคอร2เซอร2ไปทางซ�ายสุด \000 พิมพ2ตัวอักขระในระบบเลขฐานแปด \t แท็บแนวนอน \xhh พิมพ2ตัวอักขระในระบบเลขฐานสิบหก ตัวอย�างท่ี 3.12 โปรแกรมแสดงการใช�รหัสควบคุม

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> void main(void) { printf("This program show Escape Sequence."); printf("\n"); printf("Beep\a\n"); printf("Show backspace : A B C\bD E\n"); printf("Print backslash : \\ \n"); printf("Print single quote : \' \n"); printf("Print ASCII : \155"); }

ภาพท่ี 3.45 โปรแกรมแสดงการใช�รหัสควบคุม เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.46

This program show Escape Sequence. Beep Show backspace : A B D E Print backslash : \ Print single quote : ' Print ASCII : n

ภาพท่ี 3.46 ผลลัพธ2ของโปรแกรมแสดงการใช�รหัสควบคุม จากตัวอย�างนี้ สามารถอธิบายการทํางานได� ดังนี้ - บรรทัดท่ี 5 (printf("This program show Escape Sequence.");) จะแสดงข�อความ This program show Escape Sequence. จากนั้นตําแหน�งของเคอร2เซอร2จะรออยู�ท�ายข�อความดังกล�าว - บรรทัดท่ี 6 (printf("\n");) มีเพียงรหัสควบคุม \n จะสั่งให�ข้ึนบรรทัดใหม� เพ่ือรอพิมพ2ข�อมูลของคําสั่งถัดไปซ่ึงก็คือ บรรทัดท่ี 7 (printf("Beep\a\n");) - บรรทัดท่ี 7 (printf("Beep\a\n");) พิมพ2 Beep แล�วเม่ือเจอรหัสควบคุม \a เครื่องคอมพิวเตอร2จะส�งเสียงบ๊ีบ 1 ครั้ง จากนั้นข้ึนบรรทัดใหม� - บรรทัดท่ี 8 (printf("Show backspace : A B C\bD E\n");) พิมพ2ข�อความ Show backspace : A B C แล�วเม่ือเจอรหัสควบคุม \b ก็จะย�อนกลับไป 1 ตัวอักษรคือตําแหน�งของ C จะถูกพิมพ2ด�วยข�อความต�อคือ D E คือบรรทัดท่ี 8 จะพิมพ2ข�อความท้ังหมดคือ Show backspace : A B D E จากนั้นข้ึนบรรทัดใหม� - บรรทัดท่ี 9 (printf("Print backslash : \\ \n");) พิมพ2ข�อความ Print backslash : แล�วเม่ือเจอรหัสควบคุม \\ จะพิมพ2 \ ออกมา คือบรรทัดท่ี 9 จะพิมพ2ข�อความท้ังหมดคือ Print backslash : \ จากนั้นข้ึนบรรทัดใหม�

73

- บรรทัดท่ี 10 (printf("Print single quote : \' \n");) พิมพ2ข�อความ Print single quote : แล�วเม่ือเจอรหัสควบคุม \' จะพิมพ2 ' ออกมา คือบรรทัดท่ี 10 จะพิมพ2ข�อความท้ังหมดคือ Print single quote : ' จากนั้นข้ึนบรรทัดใหม� - บรรทัดท่ี 11 (printf("Print ASCII : \155 \n");) พิมพ2ข�อความ Print ASCII : แล�วเม่ือเจอรหัสควบคุม \155 จะพิมพ2 n ออกมา คือบรรทัดท่ี 11 จะพิมพ2ข�อความท้ังหมดคือ Print ASCII : n รหัสควบคุม \155 นี้ จะหมายถึง ตัวอักขระ n ในตาราง ASCII (American Standard Code for Information Interchange) โดยตาราง ASCII ได�แสดงไว�ในภาคผนวก การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณ ในการเขียนโปรแกรม ผู�เขียนโปรแกรมสามารถนําตัวแปรมาใช�ในการคํานวณได� เช�น ตัวอย�าง 3.9 บรรทัดท่ี 10 คือ sum = num1 + num2 + num3; จากตัวอย�างนี้จะมีการใช�เครื่องหมายบวก (+) ซ่ึงหมายความว�า ผู�เขียนโปรแกรมสามารถนําตัวแปรมาคํานวณโดยใช�เครื่องหมายทางด�านคณิตศาสตร2ได� คือ + เครื่องหมายบวก (Addition) - เครื่องหมายลบ (Subtraction) * เครื่องหมายคูณ (Multiplication) / เครื่องหมายหาร (Division) % เครื่องหมายหารเอาเศษ (Modulo) ตัวอย�างท่ี 3.13 โปรแกรมแสดงการใช�เครื่องหมายทางคณิตศาสตร2ในการคํานวณ

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20

#include <stdio.h> void main(void) { int num1 = 5, num2 = 10, num3 = 15; int sum = 0, sub = 0, mul = 0, div = 0, mod = 0; sum = num1 + num2; sub = num2 - num1; mul = num3 * num2; div = num2 / num1; mod = num3 % num2; printf("num1 + num2 = %d\n", sum); printf("num2 - num1 = %d\n", sub); printf("num3 * num2 = %d\n", mul); printf("num2 / num1 = %d\n", div); printf("num3 modulo num2 = %d\n", mod); }

ภาพท่ี 3.47 โปรแกรมแสดงการใช�เครื่องหมายทางคณิตศาสตร2ในการคํานวณ เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.48

num1 + num2 = 15 num2 – num1 = 5 num3 * num2 = 150 num2 / num1 = 2 num3 modulo num2 = 5

ภาพท่ี 3.48 ผลลัพธ2ของโปรแกรมแสดงการใช�เครื่องหมายทางคณิตศาสตร2ในการคํานวณ

74

การรับค�ามาเก็บไว�ในตัวแปร เป�นท่ีทราบกันแล�วว�า การนําข�อมูลเข�าสู�ระบบคอมพิวเตอร2นั้น วิธีการหนึ่งท่ีนิยมกันคือ ผู�ใช�งานเป�นผู�ป�อนข�อมูล โดยรับผ�านทางคีย2บอร2ด ดังนั้นผู�เขียนโปรแกรมจึงจําเป�นต�องสร�างตัวแปรข้ึนมาเพ่ือใช�ในการจัดเก็บข�อมูลไว�ก�อน จากนั้นนําตัวแปรดังกล�าวไปใช�ในการประมวลผลหรือคํานวณต�อไปตามวัตถุประสงค2ของโปรแกรมนั้นๆ ในการรับค�ามาเก็บไว�ในตัวแปรผ�านทางคีย2บอร2ด ภาษาซีมีฟJงก5ช่ัน scanf() หรือชื่อเต็มคือ scan formatted ไว� หากต�องการเรียกใช�ฟRงก2ชั่น scanf() ต�องประกาศไฟล2เฮดเดอร2 stdio.h (#include <stdio.h>) ไว�ท่ีส�วนหัวของโปรแกรมด�วย รูปแบบการใช�ฟRงก2ชั่น scanf() ดังภาพท่ี 3.49

scanf("ข�อมูลท่ีต�องการแสดงผล", รายการระบุท่ีอยู�);

ภาพท่ี 3.49 รูปแบบการใช�ฟRงก2ชั่น scanf() ข�อมูลท่ีต�องการแสดงผล (String Format) คือ ชนิดข�อมูลต�างๆ ท่ีจะรับผ�านทางคีย2บอร2ด เช�น %d, %f, %c เป�นต�น รายการระบุท่ีอยู� (Address List) คือ ตัวท่ีระบุท่ีอยู� (Address) ในหน�วยความจําของเครื่องคอมพิวเตอร2 โดยท่ีอยู�ดังกล�าวจะใช�ในการเก็บข�อมูลท่ีรับเข�ามา ข�อแตกต�างระหว�างรายการระบุท่ีอยู�ของฟRงก2ชั่น scanf() กับรายการข�อมูลท่ีจะแสดงผลของฟRงก2ชั่น printf() คือ - รายการข�อมูลท่ีจะแสดงผล เป�นการระบุถึงข�อมูลโดยตรง ทําให�อ�างถึงตัวแปรท่ีเก็บข�อมูลนั้นๆ ได�โดยตรง - รายการระบุท่ีอยู� เป�นการอ�างถึงตําแหน�งท่ีอยู�ในหน�วยความจํา ทําให�ไม�สามารถอ�างถึงตัวแปรได�โดยตรง การอ�างถึงตําแหน�งท่ีอยู�ให�ใช�เครื่องหมาย Ampersand (&) นําหน�าชื่อตัวแปรท่ีต�องการรับข�อมูลมาเก็บไว� เช�น &num เป�นการระบุตําแหน�งท่ีอยู�ของตัวแปร num ในหน�วยความจํา ตัวอย�างท่ี 3.14 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() และ scanf() ของการรับตัวเลข 2 ตัวมาบวกกัน

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> void main(void) { int num1, num2, sum; printf("Enter number 1 = "); scanf("%d", &num1); printf("Enter number 2 = "); scanf("%d", &num2); sum = num1 + num2; printf("%d + %d = %d\n", num1, num2, sum); }

ภาพท่ี 3.50 โปรแกรมแสดงการใช�ฟRงก2ชั่น printf() และ scanf() ของการรับตัวเลข 2 ตัวมาบวกกัน

75

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.51

Enter number 1 = 10 Enter number 2 = 15 10 + 15 = 25

ภาพท่ี 3.51 ผลลัพธ2ของโปรแกรมแสดงการใช�ฟRงก2ชั่น printf() และ scanf() ของการรับตัวเลข 2 ตัวมาบวกกัน

จากตัวอย�างนี้ เม่ือรันโปรแกรม จะข้ึนข�อความ Enter number 1 = _ โปรแกรมจะหยุดรอให�ผู�ใช�งานป�อนตัวเลขตัวท่ีหนึ่ง การหยุดรอรับนี้เป�นผลมาจากการใช�ฟRงก2ชั่น scanf() ในบรรทัดท่ี 8 ซ่ึงมีการใช�เครื่องหมาย & นําหน�าตัวแปร num1 (&num1) ซ่ึงเป�นการระบุท่ีอยู�ของตัวแปร num1 ในหน�วยความจํา เม่ือผู�ใช�งานป�อนตัวเลข เช�น 10 จากนั้นกดปุ{ม Enter ตัวเลข 10 จะถูกรับเข�ามาไว�ในหน�วยความจําตรงตําแหน�งท่ีตัวแปร num1 อยู� จากนั้นจะข้ึนข�อความ Enter number 2 = _ โปรแกรมจะหยุดรอให�ผู�ใช�งานป�อนตัวเลขตัวท่ีสอง การหยุดรอรับนี้เป�นผลมาจากการใช�ฟRงก2ชั่น scanf() ในบรรทัดท่ี 10 ซ่ึงมีการใช�เครื่องหมาย & นําหน�าตัวแปร num2 (&num2) ซ่ึงเป�นการระบุท่ีอยู�ของตัวแปร num2 ในหน�วยความจํา เม่ือผู�ใช�งานป�อนตัวเลข เช�น 15 จากนั้นกดปุ{ม Enter ตัวเลข 15 จะถูกรับเข�ามาไว�ในหน�วยความจําตรงตําแหน�งท่ีตัวแปร num2 อยู� เม่ือรับตัวเลขครบแล�ว โปรแกรมจะนําตัวเลขท้ังสองมาบวกกัน ผลลัพธ2ท่ีได�จะเก็บไว�ในตัวแปร sum บรรทัดท่ี 13 เป�นการแสดงผลลัพธ2โดยการใช�ฟRงก2ชั่น printf() ซ่ึงจะเห็นได�ว�าบรรทัดท่ี 13 (printf("%d + %d = %d\n",

num1, num2, sum);) รายการข�อมูลท่ีจะแสดงผลในฟRงก2ชั่น printf() คือ num1 num2 และ sum นั้น จะอ�างถึงตัวแปรนั้นโดยตรง การดําเนินการ ในการเขียนโปรแกรมส�วนใหญ�ต�องเก่ียวข�องกับ การดําเนินการ (Operation) ระหว�างตัวแปรหรือค�าหรือข�อมูลต�างๆ โดยการดําเนินการนั้นไม�ว�าจะเป�น การกําหนดค�า การดําเนินการทางคณิตศาสตร2 การดําเนินการทางตรรกะ และการดําเนินการระดับบิต ต�องเก่ียวข�องกับคําว�า โอเปอเรเตอร2 โอเปอแรนด2 และนิพจน2 โอเปอเรเตอร5 (Operator) คือ ตัวดําเนินการของการดําเนินการต�างๆ โอเปอเรเตอร2ส�วนมากจะเป�นเครื่องหมายหรือสัญลักษณ2พิเศษ เช�น +, -, *, /, &&, ||, < และ > โอเปอแรนด5 (Operand) คือ ตัวถูกกระทํา โอเปอแรนด2อาจจะเป�นค�าคงท่ี ตัวแปร หรือฟRงก2ชั่น นิพจน5 (Expression) คือ การนําเอาค�าคงท่ี ตัวแปร หรือฟRงก2ชัน มากระทําอย�างใดอย�างหนึ่งโดยมีโอเปอเรเตอร2ของการดําเนินการเป�นตัวบ�งชี้การกระทํานั้น

76

ตัวอย�างของการแสดงความสัมพันธ2ระหว�างโอเปอเรเตอร2 โอเปอแรนด2 และนิพจน2 ดังภาพท่ี 3.52

ภาพท่ี 3.52 แสดงความสัมพันธ2ระหว�างโอเปอเรเตอร2 โอเปอแรนด2 และนิพจน2 การดําเนินการในภาษาซี แบ�งได� ดังนี้ 1. การดําเนินการกําหนดค�า 2. การดําเนินการทางคณิตศาสตร2 3. การดําเนินการทางตรรกะ 4. การดําเนินการระดับบิต โดยจะอธิบายเฉพาะการดําเนินการ 3 ตัวแรกเท�านั้น การดําเนินการกําหนดค�า (Assignment Operation) การดําเนินการประเภทนี้เป�นการดําเนินการโดยใช�โอเปอเรเตอร2การกําหนดค�า โดยมีรายละเอียดดังตารางท่ี 3.2

โอเปอเรเตอร5การกําหนดค�า ตัวอย�าง ผลลัพธ5 = a = b; กําหนดค�าตัวแปร a เท�ากับค�าตัวแปร b += a += b; a = a + b; -= a -= b; a = a - b; *= a *= b; a = a * b; /= a /= b; a = a / b; %= a %= b; a = a % b;

ตารางท่ี 3.2 โอเปอเรเตอร2การกําหนดค�า ในการดําเนินการกําหนดค�า เป�นการนําตัวเลข ค�าคงท่ี หรือค�าในตัวแปร ฝR�งขวามือ มากําหนดค�าให�กับตัวแปรฝR�งซ�ายมือ ตัวแปร = ค�าหรือตัวเลข; เช�น a = 10; นําค�า 10 มากําหนดค�าให�กับตัวแปร a

(x + 3)

โอเปอแรนด2 โอเปอเรเตอร2 โอเปอแรนด2

โดยท่ี

num + 1

โอเปอแรนด2 ตัวท่ี 2 โอเปอเรเตอร2 บวก โอเปอแรนด2 ตัวท่ี 1

นิพจน2 3 / (x + 3)

โอเปอแรนด2 ตัวท่ี 2 โอเปอเรเตอร2 หาร โอเปอแรนด2 ตัวท่ี 1

นิพจน2

การนําค�าหรือตัวเลข มากําหนดค�าให�กับตัวแปร

77

ตัวแปร = ค�าคงท่ี; เช�น b = MaxValue; นําค�าจาก MaxValue มากําหนดค�าให�กับตัวแปร b สมมติ MaxValue เป�นค�าคงท่ีมีค�าเท�ากับ 50 นําค�าจาก MaxValue มีค�าเท�ากับ 50 มากําหนดค�าให�กับตัวแปร b ตัวแปรตัวท่ี 1 = ตัวแปรตัวท่ี 2; เช�น x = y; นําค�าของตัวแปร y มากําหนดค�าให�กับตัวแปร x สมมติ y มีค�าเท�ากับ 23 นําค�าของตัวแปร y ซ่ึงมีค�าเท�ากับ 23 มา กําหนดค�าให�กับตัวแปร x ตัวอย�างท่ี 3.16 โปรแกรมแสดงการใช�งานโอเปอเรเตอร2การกําหนดค�า (1)

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> void main(void) { int a = 5; printf("Before : a = %d\n", a); a = a + 1; printf("After : a = %d", a); }

ภาพท่ี 3.53 โปรแกรมแสดงการใช�งานโอเปอเรเตอร2การกําหนดค�า (1) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.54

Before : a = 5 After : a = 6

ภาพท่ี 3.54 ผลลัพธ2ของโปรแกรมแสดงการใช�งานโอเปอเรเตอร2การกําหนดค�า (1) จากตัวอย�างนี้ สามารถอธิบายในรายละเอียด ดังนี้ - บรรทัดท่ี 5 (int a = 5;) เป�นการประกาศตัวแปร a มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นให�กับตัวแปร a มีค�าเท�ากับ 5 - บรรทัดท่ี 7 (printf("Before : a = %d\n", a);) แสดงค�าของตัวแปร a มีค�าเท�ากับ 5 - บรรทัดท่ี 8 (a = a + 1;) เป�นการเพ่ิมค�าให�กับตัวแปร a อีก 1 ทําให� a มีค�าเท�ากับ 6 โอเปอเรเตอร2การกําหนดค�าท่ีใช�คือ = a = a + 1; a = 5 + 1; a = 6; - บรรทัดท่ี 9 (printf("After : a = %d", a);) แสดงค�าของตัวแปร a มีค�าเท�ากับ 6

a = 5

การนําค�าคงท่ี มากําหนดค�าให�กับตัวแปร

การนําค�าของตัวแปรตัวท่ี 2 มากําหนดค�าให�กับตัวแปรตัวท่ี 1

78

ตัวอย�างท่ี 3.17 โปรแกรมแสดงการใช�งานโอเปอเรเตอร2การกําหนดค�า (2)

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> void main(void) { int a = 15, b = 10, c = 0; printf("Before : a = %d, b = %d, c = %d\n", a, b, c); c = a - b; printf("After : a = %d, b = %d, c = %d\n", a, b, c); }

ภาพท่ี 3.55 โปรแกรมแสดงการใช�งานโอเปอเรเตอร2การกําหนดค�า (2) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.56

Before : a = 15, b = 10, c = 0 After : a = 15, b = 10, c = 5

ภาพท่ี 3.56 ผลลัพธ2ของโปรแกรมแสดงการใช�งานโอเปอเรเตอร2การกําหนดค�า (2) จากตัวอย�างนี้ สามารถอธิบายในรายละเอียด ดังนี้ - บรรทัดท่ี 5 (int a = 15, b = 10, c = 0;) - เป�นการประกาศตัวแปร a มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นให�กับตัวแปร a มีค�าเท�ากับ 15 - เป�นการประกาศตัวแปร b มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นให�กับตัวแปร b มีค�าเท�ากับ 10 - เป�นการประกาศตัวแปร c มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นให�กับตัวแปร c มีค�าเท�ากับ 0 - บรรทัดท่ี 7 (printf("Before : a = %d, b = %d, c = %d\n", a, b, c);) แสดงค�าของตัวแปร a มีค�าเท�ากับ 15 ตัวแปร b มีค�าเท�ากับ 10 และตัวแปร b มีค�าเท�ากับ 0 - บรรทัดท่ี 8 (c = a - b;) เป�นการนําค�าในตัวแปร a ลบออกจากค�าในตัวแปร b คือ 15 – 10 ได�ค�าเท�ากับ 5 จากนั้น 5 ถูกนําไปกําหนดค�าให�กับตัวแปร c ทําให�ตัวแปร c มีค�าเท�ากับ 5 โอเปอเรเตอร2การกําหนดค�าท่ีใช�คือ = c = a - b; c = 15 - 10; c = 5; บรรทัดท่ี 9 (printf("After : a = %d, b = %d, c = %d\n", a, b, c);) แสดงค�าของตัวแปร a มีค�าเท�ากับ 15 ค�าของตัวแปร b มีค�าเท�ากับ 10 และค�าของตัวแปร c มีค�าเท�ากับ 5

a = 15 และ b = 10

79

ตัวอย�างท่ี 3.17 โปรแกรมแสดงการใช�โอเปอเรเตอร2การกําหนดค�า (3)

01 02 03 04 05 06 07 08 09 10 11 12

#include <stdio.h> void main(void) { int a = 15; int b = 3; printf("Old value : a = %d, b = %d\n", a, b); printf("a += b; => %d\n", a += b); printf("New value : a = %d, b = %d", a, b); }

ภาพท่ี 3.57 โปรแกรมแสดงการใช�โอเปอเรเตอร2การกําหนดค�า (3) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.58

Old value : a = 15, b = 3 a += b; => 18 New value : a = 18, b = 3

ภาพท่ี 3.58 ผลลัพธ2ของโปรแกรมแสดงการใช�โอเปอเรเตอร2การกําหนดค�า (3) การดําเนินการทางคณิตศาสตร5 (Arithmetic Operation) การดําเนินการประเภทนี้เป�นการดําเนินการโดยนําโอเปอแรนด2 2 ตัวมากระทําโดยใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 เช�น บวก ลบ คูณ หาร และหารเอาเศษ (Modulo) โอเปอเรเตอร2ทางด�านคณิตศาสตร2ในภาษาซีแบ�งเป�น 7 ประเภท ดังตารางท่ี 3.3

โอเปอเรเตอร5ทาง คณิตศาสตร5

ความหมาย ตัวอย�าง ผลลัพธ5

+ บวก 9 + 4 13 - ลบ 9 - 4 5 * คูณ 9 * 4 36 / หาร 9 / 4 2 (กรณีนี้ ท้ั ง ตั ว ต้ั งและ

ตัวหารเป�นเลขจํานวนเต็ม จึงได�ผลลัพธ2เป�นเลขจํานวนเต็ม โดยเศษจะถูกปRดท้ิง)

% หารเอาเศษ (Modulo)

9 % 4 1

เพ่ิมค�าข้ึน 1 โดย a++ จะนําค�าของ a ไปใช�ก�อน แล�วจึงเพ่ิมค�าของ a ข้ึน 1

b = a++; จะมีความหมายเทียบเท�ากับ 2 บรรทัดดังต�อไปนี้ b = a; a = a + 1;

สมมติ a มีค�าเป�น 9 หลังจากทําคําสั่ง b = a++; แล�วจะได�ว�า a = 10, b = 9

++

++a จะเพ่ิมค�าของ a ข้ึน 1 ก�อน แล�วจึงนํา

b = ++a; จะมีความหมายเทียบเท�า

สมมติ a มีค�าเป�น 10 หลังจากทําคําสั่ง b = ++a;

80

โอเปอเรเตอร5ทาง คณิตศาสตร5

ความหมาย ตัวอย�าง ผลลัพธ5

ค�าของ a ไปใช� กับ 2 บรรทัดดังต�อไปนี้ a = a + 1; b = a;

แล�วจะได�ว�า a = 11, b = 11

ลดค�าลง 1 โดย a-- จะนําค�าของ a ไปใช�ก�อน แล�วจึงลดค�าของ a ลง 1

b = a--; จะมีความหมายเทียบเท�ากับ 2 บรรทัดดังต�อไปนี้ b = a; a = a - 1;

สมมติ a มีค�าเป�น 11 หลังจากทําคําสั่ง b = a--; แล�วจะได�ว�า a = 10, b = 11

--

--a จะลดค�าของ a ลง 1 ก�อน แล�วจึงนําค�าของ a ไปใช�

b = --a; จะมีความหมายเทียบเท�ากับ 2 บรรทัดดังต�อไปนี้ a = a - 1; b = a;

สมมติ a มีค�าเป�น 10 หลังจากทําคําสั่ง b = --a; แล�วจะได�ว�า a = 9, b = 9

ตารางท่ี 3.3 โอเปอเรเตอร2ทางด�านคณิตศาสตร2 ท่ีมา : อรพิน ประวัติบริสุทธิ์, 2547, หน�า 48

ผู�เขียนโปรแกรมสามารถนําโอเปอเรเตอร2ทางด�านคณิตศาสตร2มาใช�ในการประมวลผล เพ่ือให�ได�ผลลัพธ2ตรงกับความต�องการของผู�ใช�งาน ซ่ึงได�อธิบายโอเปอเรเตอร2ทางด�านคณิตศาสตร2 5 ประเภทแรก (+, -, *, / และ %) ในหัวข�อการนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณในข�างต�นแล�ว ส�วนโอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลัง (++ และ --) เป�นโอเปอเรเตอร2ทางด�านคณิตศาสตร2ท่ีมีการลดรูปหรือลดจํานวนคําสั่งลง เพ่ือทําให�การประมวลผลเร็วข้ึน แต�ผู�เขียนโปรแกรมจะต�องทําความเข�าใจลักษณะการทํางานให�เป�นอย�างดี มิฉะนั้นอาจทําให�การทํางานของโปรแกรมไม�เป�นท่ีต�องการได� ตัวอย�างท่ี 3.18 แสดงการใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลัง ตัวอย�างท่ี 3.18 โปรแกรมแสดงการใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลัง

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

#include <stdio.h> void main(void) { int x = 3; int y = 8; int z = 0; printf("Before : x = %d, y = %d, z = %d\n", x, y, z); z = x++; printf("After :\n"); printf("z = x++; => x = %d, z = %d\n", x, z); z = ++x; printf("z = ++x; => x = %d, z = %d\n", x, z); z = y--; printf("z = y--; => y = %d, z = %d\n", y, z); z = --y; printf("z = --y; => y = %d, z = %d\n", y, z); }

ภาพท่ี 3.59 โปรแกรมแสดงการใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลัง

81

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.58

Before : x = 3, y = 8, z = 0 After : z = x++; => x = 4, z = 3 z = ++x; => x = 5, z = 5 z = y--; => y = 7, z = 8 z = --y; => y = 6, z = 6

ภาพท่ี 3.60 ผลลัพธ2ของโปรแกรมแสดงการใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลัง การใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลังนี้ นิยมนําไปใช�ในการเขียนโปรแกรมแบบเป�นโครงสร�างแบบวนรอบท่ีมีการวนรอบแบบจํานวนรอบท่ีแน�นอน ดังตัวอย�างท่ี 3.19 ตัวอย�างท่ี 3.19 โปรแกรมแสดงการใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลังเป�นโครงสร�างแบบวนรอบท่ีมีการวนรอบแบบจํานวนรอบท่ีแน�นอน

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> void main(void) { int i; for(i=1; i<=5; i++) { printf("i = %d\n", i); } }

ภาพท่ี 3.61 โปรแกรมแสดงการใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลังเป�นโครงสร�างแบบวนรอบท่ีมีการวนรอบแบบจํานวนรอบท่ีแน�นอน

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.62

i = 1 i = 2 i = 3 i = 4 i = 5

ภาพท่ี 3.62 ผลลัพธ2ของโปรแกรมแสดงการใช�โอเปอเรเตอร2ทางด�านคณิตศาสตร2 2 ประเภทหลังเป�นโครงสร�างแบบวนรอบท่ีมีการวนรอบแบบจํานวนรอบท่ีแน�นอน

ตัวอย�างนี้ บรรทัดท่ี 7 (for(i=1; i<=5; i++)) จะมีการใช� i++ ซ่ึงเป�นการเพ่ิมค�า i เพ่ิมอีก 1 รายละเอียดการทํางานของตัวอย�างนี้จะได�อธิบายในบทท่ีเก่ียวข�องต�อไป การดําเนินการทางตรรกะ (Logical Operation) จากหัวข�อการเขียนโปรแกรมเชิงโครงสร�างแบบโครงสร�างแบบเลือกในบทท่ี 2 การเขียนโปรแกรมของโครงสร�างแบบนี้มีลักษณะการทํางานแบบมีการทดสอบเง่ือนไขท่ีต�องตัดสินใจเลือกการทํางาน และผลลัพธ2ของเง่ือนไขคือ จริงหรือเท็จ ถูกหรือผิด หรือ ใช�หรือไม�ใช� การทดสอบเง่ือนไขดังกล�าวจะถือว�าเป�นการดําเนินการทางตรรกะนั่นเอง โดยใช�โอเปอเรเตอร2ทางตรรกะ ดังนี้

82

โอเปอเรเตอร5ทางตรรกะ ความหมาย > มากกว�า >= มากกว�าหรือเท�ากับ < น�อยกว�า <= น�อยกว�าหรือเท�ากับ == เท�ากับ != ไม�เท�ากับ && และ (AND) || หรือ (OR) ! นิเสธ (NOT) ตารางท่ี 3.4 โอเปอเรเตอร2ทางตรรกะ

ท่ีมา : อรพิน ประวัติบริสุทธิ์, 2547, หน�า 57 ผลลัพธ2ของโอเปอเรเตอร2ทางตรรกะ &&, || และ ! แสดงในตารางค�าความจริง (Truth Table) ดังนี้

X Y X && Y X || Y ! X ! Y จริง จริง จริง จริง เท็จ เท็จ จริง เท็จ เท็จ จริง เท็จ จริง เท็จ จริง เท็จ จริง จริง เท็จ เท็จ เท็จ เท็จ เท็จ จริง จริง

ตารางท่ี 3.5 ตารางค�าความจริงของโอเปอเรเตอร2ทางตรรกะ ค�าความจริงท่ีได�จากผลลัพธ2ของโอเปอเรเตอร2ทางตรรกะคือ จริง หรือ เท็จ ในภาษาซีจะใช�ค�า 1 แทนค�าความจริงเป�นจริง และค�า 0 แทนค�าความจริงเป�นเท็จ สําหรับผู�เริ่มเขียนโปรแกรมอาจจะยังไม�ทราบว�าจะนําโอเปอเรเตอร2ทางตรรกะไปใช�งานอย�างไร ให�พิจารณาจากตัวอย�างการทํางานของโอเปอเรเตอร2ทางตรรกะ ดังนี้ 0 ค�าความจริงคือ เท็จ !1 ค�าความจริงคือ เท็จ !!0 ค�าความจริงคือ เท็จ 25 > 30 ค�าความจริงคือ เท็จ 0 <= 1 ค�าความจริงคือ จริง 5 != 5 ค�าความจริงคือ เท็จ (1 == 10) ค�าความจริงคือ เท็จ (25>30) && (0<=1) ค�าความจริงคือ เท็จ (25>30) || (0<=1) ค�าความจริงคือ จริง (0<=1) && 1) ค�าความจริงคือ จริง (25>30) || (0<=1) ค�าความจริงคือ จริง

83

ตัวอย�างท่ี 3.20 โปรแกรมแสดงการใช�โอเปอเรเตอร2ทางตรรกะ

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> void main(void) { int a = 5, b = 8; printf("%d == %d \t=> %d\n", a, b, a==b); printf("%d > %d \t=> %d\n", a, b, a>b); printf("%d >= %d \t=> %d\n", a, b, a>=b); printf("%d < %d \t=> %d\n", a, b, a<b); printf("%d <= %d \t=> %d\n", a, b, a<=b); printf("%d != %d \t=> %d", a, b, a!=b); }

ภาพท่ี 3.63 โปรแกรมแสดงการใช�โอเปอเรเตอร2ทางตรรกะ เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.64

5 == 8 => 0 5 > 8 => 0 5 >= 8 => 0 5 < 8 => 1 5 <= 8 => 1 5 != 8 => 1

ภาพท่ี 3.64 ผลลัพธ2ของโปรแกรมแสดงการใช�โอเปอเรเตอร2ทางตรรกะ ลําดับการทํางานของโอเปอเรเตอร5 ลองพิจารณานิพจน2นี้ 22 - 3 * 5 + 7 ว�ามีวิธีการคํานวณอย�างไร จากนิพจน2นี้ สามารถคํานวณได�ดังนี้ = 22 - 3 * 5 + 7 จากโจทย2 = 22 - (3 * 5) + 7 ใส�วงเล็บ คือ (3 * 5) มีค�าเท�ากับ 15 = 22 - 15 + 7 ผลลัพธ2 = 14 จากวิธีการคํานวณนี้ จะเห็นว�า ต�องทําเรื่องการคูณก�อนการลบและการบวก เนื่องจากในวิธีการคํานวณการคูณมีลําดับความสําคัญมาก�อนการลบและการบวก ซ่ึงการลบและการบวกมีลําดับความสําคัญเท�ากัน ในภาษาซีได�มีการจัดลําดับความสําคัญของการทํางานของโอเปอเรเตอร2ไว�ด�วย ซ่ึงแสดงไว�ในตารางท่ี 3.6

ลําดับความสําคัญ โอเปอเรเตอร5 ( )

++, -- - (เครื่องหมายลบหน�าตัวเลข)

*, /, %

สูง

ต่ํา +, - ตารางท่ี 3.6 ลําดับความสําคัญของการทํางานของโอเปอเรเตอร2

84

ตัวอย�างท่ี 3.21 โปรแกรมแสดงการใช�ลําดับความสําคัญของการทํางานของโอเปอเรเตอร2

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> void main(void) { int a = 22, b = 3, c = 5, d = 7; printf("%d - %d * %d + %d = %d\n", a, b, c, d, a-b*c+d); printf("%d * %d - %d / %d = %d\n", a, b, c, d, a*b-c/d); printf("%d + %d - %d * %d = %d\n", a, b, c, d, a+b-c*d); }

ภาพท่ี 3.63 โปรแกรมแสดงการใช�ลําดับความสําคัญของการทํางานของโอเปอเรเตอร2 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ2ดังภาพท่ี 3.64

22 – 3 * 5 + 7 = 14 22 * 3 – 5 / 7 = 66 22 + 3 – 5 * 7 = -10

ภาพท่ี 3.64 ผลลัพธ2ของโปรแกรมแสดงการใช�ลําดับความสําคัญของการทํางานของโอเปอเรเตอร2 การจัดรูปแบบของการเขียนรหัสต�นฉบับของโปรแกรม ในการเขียนโปรแกรมท่ัวๆ ไปไม�เฉพาะกับการเขียนโปรแกรมเชิงโครงสร�าง จําเป�นท่ีผู�เขียนโปรแกรมโดยเฉพาะผู�เริ่มเขียนโปรแกรมจะต�องจัดรูปแบบของการเขียนรหัสต�นฉบับของโปรแกรมให�ดูเป�นระเบียบ ดูตัวอย�างของรหัสต�นฉบับของโปรแกรมเดียวกัน 3 รูปแบบ ดังภาพท่ี 3.65

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

#include <stdio.h> #include <conio.h> int main(void) { int a, i=1; printf("Enter no. : "); scanf("%d", &a); while(i<=a) { printf("%d\n", i); i = i +1; } getch(); return 0;

}

#include <stdio.h> #include <conio.h> int main(void) { int a, i=1; printf("Enter no. : "); scanf("%d", &a); while(i<=a) { printf("%d\n", i); i = i +1; } getch(); return 0;

}

#include <stdio.h> #include <conio.h> int main(void) { int a, i=1; printf("Enter no. : "); scanf("%d", &a); while(i<=a) { printf("%d\n", i); i = i +1; } getch(); return 0;

}

ก. รูปแบบท่ี 1 ข. รูปแบบท่ี 2 ค. รูปแบบท่ี 3 ภาพท่ี 3.65 รหัสต�นฉบับ 3 รูปแบบของโปรแกรมแสดงตัวเลขต้ังแต� 1 จนถึงเลขท่ีระบุไว�

จากตัวอย�างรหัสต�นฉบับของโปรแกรมดังกล�าว - รูปแบบท่ี 1 เขียนแต�ละบรรทัดต�อกัน และทุกบรรทัดจะชิดซ�าย - รูปแบบท่ี 2 เขียนแบบมีการเว�นบรรทัดบ�าง และบางบรรทัดมีการเยื้องเข�าไปเหมือนย�อหน�า (Indent) - รูปแบบท่ี 3 มีการเว�นบรรทัดบ�าง และบางบรรทัดมีการเยื้องเข�าไปเหมือนย�อหน�า แต�เครื่องหมาย Curly Brackets ({) อยู�บรรทัดเดียวกับคําสั่งท่ีอยู�ก�อนหน�า จากท้ังสามรูปแบบ จะเห็นว�า รูปแบบท่ี 1 เม่ือนํารหัสต�นฉบับของโปรแกรมดังกล�าวมาศึกษาหรืออ�าน จะพบว�า อ�านยาก คือ คําสั่งท่ีอยู�ภายในฟRงก2ชั่นหลักหรือฟRงก2ชั่น main() คือ บรรทัดท่ี 5 ถึง 14 เม่ืออ�านดูแล�ว

85

อาจจะไม�ทราบว�าเป�นคําสั่งท่ีอยู�ภายในฟRงก2ชั่นหลัก และบรรทัดท่ี 8 ถึง 12 เป�นคําสั่งท่ีใช�ในการวนรอบ รูปแบบนี้เม่ืออ�านแล�วจะไม�ทราบเลยว�า บรรทัดท่ี 10 ถึง 11 เป�นคําสั่งท่ีต�องทําซํ้าจากการวนรอบ เม่ือนํามาเปรียบเทียบกับรูปแบบท่ี 2 (บรรทัดท่ี 11 และ 12) และรูปแบบท่ี 3 (บรรทัดท่ี 10 และ 11) มีการเยื้องเข�าไป รูปแบบการเยื้องหรือย�อหน�า ทําให�การอ�านกลุ�มของคําสั่งดังกล�าวได�ง�ายกว�าไม�มีการเยื้อง การเยื้องนี้ส�วนมากแล�วจะใช�วิธีการกดปุ{ม Tab ส�วนรูปแบบท่ี 3 เครื่องหมาย Curly Brackets ({) อยู�บรรทัดเดียวกับคําสั่งท่ีอยู�ก�อนหน�า คือ บรรทัดท่ี 4 (int main(void) {) และบรรทัดท่ี 9 (while(i<=a) {) โดยพิจารณารหัสต�นฉบับของโปรแกรมรูปแบบท่ี 3 ในภาพท่ี 3.66

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17

#include <stdio.h> #include <conio.h> int main(void) { int a, i=1; printf("Enter no. : "); scanf("%d", &a); while(i<=a) { printf("%d\n", i); i = i +1; } getch(); return 0;

}

ภาพท่ี 3.66 แสดงการเยื้องของรหัสต�นฉบับของโปรแกรมแสดงตัวเลขต้ังแต� 1 จนถึงเลขท่ีระบุไว� จากรูปนี้ จะเห็นว�า รหัสต�นฉบับของโปรแกรมดังกล�าวมีการเยื้องเข�าไป สังเกตจาก และเม่ือนําเครื่องหมาย Curly Brackets ({) มาอยู�บรรทัดเดียวกับคําสั่งท่ีอยู�ก�อนหน�า ทําให�ตัวอักษรของคําสั่งท่ีอยู�ซ�ายสุดจะตรงกับเครื่องหมาย Curly Brackets (}) สังเกตจาก เช�น บรรทัดท่ี 4 (int main(void) {) ตัวอักษร i ของ int จะตรงกับเครื่องหมาย Curly Brackets (}) ท่ีบรรทัดท่ี 17 และบรรทัดท่ี 9 (while(i<=a) {) ตัวอักษร w ของ while จะตรงกับเครื่องหมาย Curly Brackets (}) ท่ีบรรทัดท่ี 12 การจัดรูปแบบนี้ ทําให�สามารถตรวจสอบกลุ�มของคําสั่งท่ีอยู�ภายใต�เครื่องหมาย Curly Brackets ได�เป�นอย�างดี และยังทําให�รูปแบบของรหัสต�นฉบับของโปรแกรมเป�นระเบียบเรียบร�อย ง�ายต�อการอ�าน และสามารถตรวจสอบข�อผิดพลาดของโปรแกรมได� สรุป ในบทเรียนนี้ได�อธิบายถึง การเริ่มต�นการเขียนโปรแกรมเชิงโครงสร�าง โดยเริ่มจากโปรแกรมแรกในภาษาซีเพ่ือให�ผู�เริ่มเขียนโปรแกรมได�ลองทดสอบโปรแกรมภาษาซีท่ีได�ติดต้ังท่ีเครื่องคอมพิวเตอร2ว�าสามารถใช�งานได�จริงหรือไม� ส�วนโครงสร�างของโปรแกรมภาษาซีแบ�งเป�น 3 ส�วนคือ ส�วนหัวของโปรแกรม ส�วนของฟRงก2ชั่น และส�วนรายละเอียดของโปรแกรม ประโยชน2ของคําอธิบายในภาษาซีคือช�วยสื่อสารให�ผู�อ่ืนเข�าใจเม่ือมาอ�านรหัสต�นฉบับรวมถึงตัวผู�เขียนโปรแกรมเองว�าสิ่งท่ีตัวเองได�เขียนไว�นั้น ทําไปเพ่ืออะไร สําหรับตัวแปรคือชื่อท่ีกําหนดข้ึนเพ่ือใช�ในการเก็บข�อมูล กฎการต้ังชื่อตัวแปรเพ่ือจะได�สร�างตัวแปรท่ีถูกต�อง ค�าคงท่ีคือค�าท่ีถูกกําหนดหรือสร�างข้ึนมาแล�ว ไม�สามารถเปลี่ยนแปลงค�าได� ค�าคงท่ีแบ�งเป�น 3 ประเภทคือ ค�าคงท่ีแบบ Literal ค�าคงท่ีแบบ Defined และค�าคงท่ีแบบ Memory การแสดงผลข�อมูลจากตัวแปรทําได�โดยการใช�ฟRงก2ชั่น printf() การนําตัวแปรไปใช�ในการประมวลผลหรือคํานวณทําได�โดยใช�เครื่องหมายทางด�านคณิตศาสตร2 การรับค�ามาเก็บไว�ในตัวแปรต�องทําได�โดยใช�ฟRงก2ชั่น scanf() การดําเนินการคือการดําเนินการระหว�างตัวแปรหรือค�าหรือข�อมูลต�างๆ การดําเนินการในภาษาซี แบ�งได�เป�น การดําเนินการกําหนดค�า การดําเนินการทาง

เครื่องหมาย Curly Brackets ({) อยู�บรรทัดเดียว กับคําสั่งท่ีอยู�ก�อนหน�า

เครื่องหมาย Curly Brackets ({) อยู�บรรทัดเดียว กับคําสั่งท่ีอยู�ก�อนหน�า

86

คณิตศาสตร2 และการดําเนินการทางตรรกะ และสุดท�ายคือ ลําดับการทํางานของโอเปอเรเตอร2เพ่ือจะได�ทราบถึงลําดับความสําคัญของโอเปอเรเตอร2 เพ่ือช�วยในเรื่องของการประมวลผลหรือคํานวณให�ได�ตามการทํางานท่ีผู�เขียนโปรแกรมได�กําหนดไว� อย�างไรก็ตามการจัดรูปแบบของการเขียนรหัสต�นฉบับของโปรแกรมก็มีความสําคัญเช�นเดียวกัน เพ่ือให�ง�ายต�อการอ�าน และสามารถตรวจสอบข�อผิดพลาดของโปรแกรมได�

87

คําถามทบทวน 1. จงเขียนโปรแกรมแรกของผู�เรียน โดยให�แสดงชื่อและนามสกุล 2. จงอธิบายการทํางานในแต�ละบรรทัดของโปรแกรมท่ีกําหนดให�

01 02 03 04 05 06 07 08 09 10 11 12 13 14

/* Program Name : welcome.c Written by : Mr. ABC Date : 31 March 2556 */ #include <stdio.h> int main() { // Main Function. printf("Welcome to Thailand."); printf("Welcome to University."); printf("Welcome to Samutprakarn."); return 0; } // End of Function.

3. จงอธิบายการทํางานในแต�ละบรรทัดของโปรแกรมท่ีกําหนดให�

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

/* Program Name : variable.c Written by : Ms. XYZ Date : 30 April 2556 */ #include <stdio.h> void main(void) { // Main Function. int a, b, c; a = 1; b = 2; c = 3; printf("Value a is %d", a); printf("Value b is %d", b); printf("Value c is %d", c); } // End of Function.

4. จงอธิบายการทํางานในแต�ละบรรทัดของโปรแกรมท่ีกําหนดให�

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

/* Program Name : circle.c Written by : Mrs. 123 Date : 31 May 2556 */ #include <stdio.h> main() { // Main Function. const float pi = 3.14; int radius = 5; float cir = 0; cir = 2 * pi * r; printf("The circumference of circle is %f", cir); } // End of Function.

5. จงเขียนโปรแกรมรับตัวเลข 2 จํานวนผ�านทางคีย2บอร2ด ให�หาผลคูณ แสดงผลลัพธ2ท่ีหน�าจอ ดังรูป

Enter number 1 = _

Enter number 1 = 16

Enter number 2 = _

Enter number 1 = 16

Enter number 2 = 9

Enter number 1 = 16

Enter number 2 = 9

Result : 16 x 9 = 144

หมายเหตุ ตัวเลข 16 และ 9 เป�นตัวเลขท่ีผู�ใช�งานป�อนผ�านทางคีย2บอร2ด

88

6. จงเขียนโปรแกรมรับเลขจํานวนเต็ม 2 จํานวนผ�านทางคีย2บอร2ด โดยตัวแรกคือ ด�านกว�าง ตัวท่ีสองคือ ด�านยาว ให�หาพ้ืนท่ีของรูปสี่เหลี่ยมผืนผ�า แสดงผลลัพธ2ท่ีหน�าจอ

Enter number 1 = _

Enter number 1 = 4

Enter number 2 = _

Enter number 1 = 4

Enter number 2 = 6

Enter number 1 = 4

Enter number 2 = 6

The area is 24

7. จงเขียนโปรแกรมรับเลขจํานวนเต็ม 3 จํานวนผ�านทางคีย2บอร2ด โดยให�นําตัวแรกคูณด�วยตัวสองจากนั้นนําผลคูณท่ีได�เป�นตัวต้ังแล�วหารด�วยตัวท่ีสาม แสดงผลลัพธ2ท่ีหน�าจอ

Enter no.1 = _

Enter no.1 = 3

Enter no.2 = _

Enter no.1 = 3

Enter no.2 = 2

Enter no.3 = _

Enter no.1 = 3

Enter no.2 = 2

Enter no.3 = 3

Enter no.1 = 3

Enter no.2 = 2

Enter no.3 = 3

(3x2)/3 = 2

8. จงเขียนโปรแกรมรับป� ค.ศ. (คริสตศักราช) ผ�านทางคีย2บอร2ด แปลงให�เป�นป� พ.ศ. (พุทธศักราช) แสดงผลลัพธ2ท่ีหน�าจอ

Enter AD. = _

Enter AD. = 1998

Enter AD. = 1998

Convert to BE. is 2541

9. จงเขียนโปรแกรมรับองศาเซลเซียส (Celsius) ผ�านทางคีย2บอร2ด แปลงให�เป�นองศาฟาเรนไฮต2 (Fahrenheit) แสดงผลลัพธ2ท่ีหน�าจอ

Enter celsius = _

Enter celsius = 42

Enter celsius = 42

Convert to Fahrenheit is 107.6

10. จงเขียนโปรแกรมรับเลขจํานวนเต็ม 3 จํานวนผ�านทางคีย2บอร2ด ให�หาค�าเฉลี่ยของตัวเลขท้ังสาม แสดงผลลัพธ2ท่ีหน�าจอ

Enter no.1 = _

Enter no.1 = 1

Enter no.2 = _

Enter no.1 = 1

Enter no.2 = 2

Enter no.3 = _

Enter no.1 = 1

Enter no.2 = 2

Enter no.3 = 3

Enter no.1 = 1

Enter no.2 = 2

Enter no.3 = 3

The average is 2

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall.

90

แผนบริหารการสอนประจําบทท่ี 4 หัวข�อเน้ือหาประจําบท 1. การเขียนโปรแกรมเชิงโครงสร�างแบบลําดับ 2. การเขียนโปรแกรมเชิงโครงสร�างแบบเลือก วัตถุประสงค! เม่ือผู�เรียนศึกษาบทเรียนจบแล�ว จะมีความสามารถดังนี้ 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบลําดับได� 2. เขียนโปรแกรมเชิงโครงสร�างแบบลําดับได� 3. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบเลือกได� 4. เขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if หรือหนึ่งทางเลือกได� 5. เขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if-else หรือสองทางเลือกได� 6. เขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if ซ�อน if หรือ switch case หรือหลายทางเลือกได� กิจกรรมการเรียนการสอน 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบลําดับ โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย@างโปรแกรมเชิงโครงสร�างแบบลําดับ 2. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย@างโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if หรือหนึ่งทางเลือก 3. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย@างโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if-else หรือสองทางเลือก 4. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย@างโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if ซ�อน if หรือ switch case หรือหลายทางเลือก 5. แบ@งผู�เรียนออกเปAนกลุ@ม โดยปฏิบัติตามใบงานท่ี 4 ดังนี้ 5.1 ให�ผู�เรียนฝEกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างแบบลําดับ 5.2 ให�ผู�เรียนฝEกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if หรือหนึ่งทางเลือก 5.3 ให�ผู�เรียนฝEกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if-else หรือสองทางเลือก 5.4 ให�ผู�เรียนฝEกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างแบบเลือก โดยใช�คําสั่ง if ซ�อน if หรือ switch case หรือหลายทางเลือก 5.5 ให�ตัวแทนแต@ละกลุ@มออกมานําเสนอผลการปฏิบัติตามใบงาน และร@วมกันอภิปรายว@าโปรแกรมท่ีเขียนข้ึนมานั้นเปAนอย@างไร 6. ร@วมกันสรุปความรู�เก่ียวกับการเขียนโปรแกรมเชิงโครงสร�างแบบลําดับและแบบเลือก จากนั้นซักถามผู�เรียน รวมถึงให�ผู�เรียนตอบคําถามทบทวน

92

สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 4 4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน 3. สังเกตการณHปฏิบัติงานกลุ@ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝEกหัด

บทท่ี 4 โครงสร�างแบบลําดับและแบบเลอืก

บทนํา การเขียนโปรแกรมเชิงโครงสร�างช�วยให�ผู�เขียนโปรแกรมสามารถควบคุมทิศทางการทํางานของโปรแกรมให�เป!นไปตามท่ีต�องการได� การเขียนโปรแกรมเชิงโครงสร�างมี 3 แบบคือ แบบลําดับ แบบเลือก และแบบวนรอบ ในบทนี้จะอธิบาย 2 แบบแรกเท�านั้น ส�วนแบบท่ีสามจะไปอธิบายในบทถัดไป การเขียนโปรแกรมเชิงโครงสร�างแบบลําดับ จากโครงสร�างแบบลําดับท่ีได�อธิบายไว�ในบทท่ี 2 โครงสร�างแบบลําดับมีลักษณะการทํางานแบบลําดับโดยมีการทํางานจากบนลงล�าง การเขียนโปรแกรมเชิงโครงสร�างแบบลําดับก็มีลักษณะเช�นเดียวกันคือ เขียนโปรแกรมท่ีมีคําสั่งเรียงลําดับจากบนลงล�าง คําสั่งท่ีอยู�ลําดับบนๆ เป!นคําสั่งท่ีต�องทํางานก�อน ส�วนคําสั่งล�างๆ เป!นคําสั่งท่ีทํางานหลัง ดังตัวอย�างท่ี 4.1 ตัวอย!างท่ี 4.1 โปรแกรมแสดงข�อมูลส�วนตัวของนายดํา

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> int main() { printf("Name \t\t: Mr. Dam\n"); printf("Major \t\t: Computer Science\n"); printf("Faculty \t: Science and Technology\n"); printf("University \t: DRU"); return 0; }

ภาพท่ี 4.1 โปรแกรมแสดงข�อมูลส�วนตัวของนายดํา เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.2

Name : Mr. Dam Major : Computer Science Faculty : Science and Technology University : Dhonburi Rajabhat University

ภาพท่ี 4.2 ผลลัพธ8ของโปรแกรมแสดงข�อมูลส�วนตัวของนายดํา จากตัวอย�างนี้ เป!นการแสดงคําสั่งการทํางาน(เน�นเฉพาะคําสั่งในฟ<งก8ชั่นหลักเท�านั้น) โดยเรียงลําดับจากบรรทัดท่ี 5 ถึงบรรทัดท่ี 9 ดังนี้ บรรทัดท่ี 5 printf("Name \t\t: Mr. Dam\n"); คําสั่งนี้ทํางานลําดับท่ี 1

บรรทัดท่ี 6 printf("Major \t\t: Computer Science\n"); คําสั่งนี้ทํางานลําดับท่ี 2 บรรทัดท่ี 7 printf("Faculty \t: Science and Technology\n"); คําสั่งนี้ทํางานลําดับท่ี 3

94

บรรทัดท่ี 8 printf("University \t: DRU"); คําสั่งนี้ทํางานลําดับท่ี 4 บรรทัดท่ี 9 return 0; คําสั่งนี้ทํางานลําดับท่ี 5 ตัวอย!างท่ี 4.2 โปรแกรมแสดงการคํานวณผลคูณของเลข 2 จํานวน

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> int main() { int a, b, c, mul; printf("Enter no.1 : "); scanf("%d", &a); printf("Enter no.2 : "); scanf("%d", &b); mul = a * b; printf("The result is : %d", mul); return 0; }

ภาพท่ี 4.3 โปรแกรมแสดงการคํานวณผลคูณของเลข 2 จํานวน เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.4

Enter no.1 : 2 Enter no.2 : 3 The result is : 6

ภาพท่ี 4.4 ผลลัพธ8ของโปรแกรมแสดงการคํานวณผลคูณของเลข 2 จํานวน จากตัวอย�างนี้ เป!นการแสดงคําสั่งการทํางาน(เน�นเฉพาะคําสั่งในฟ<งก8ชั่นหลักเท�านั้น) โดยเรียงลําดับจากบรรทัดท่ี 4 ถึงบรรทัดท่ี 12 ดังนี้ บรรทัดท่ี 4 int a, b, c, mul; คําสั่งนี้ทํางานลําดับท่ี 1

บรรทัดท่ี 6 printf("Enter no.1 : "); คําสั่งนี้ทํางานลําดับท่ี 2 บรรทัดท่ี 7 scanf("%d", &a); คําสั่งนี้ทํางานลําดับท่ี 3 บรรทัดท่ี 8 printf("Enter no.2 : "); คําสั่งนี้ทํางานลําดับท่ี 4 บรรทัดท่ี 9 scanf("%d", &b); คําสั่งนี้ทํางานลําดับท่ี 5 บรรทัดท่ี 10 mul = a * b; คําสั่งนี้ทํางานลําดับท่ี 6 บรรทัดท่ี 11 printf("The result is : %d", mul); คําสั่งนี้ทํางานลําดับท่ี 7 บรรทัดท่ี 12 return 0; คําสั่งนี้ทํางานลําดับท่ี 8

95

จากท้ังสองตัวอย�างนี้ จะเห็นได�ว�า คําสั่งในบรรทัดแรกจะทํางานก�อนคําสั่งในบรรทัดถัดไป โดยโปรแกรมจะทํางานเรียงเป!นลําดับต�อเนื่องกันไปจนถึงคําสั่งในบรรทัดสุดท�าย การเขียนโปรแกรมเชิงโครงสร�างแบบเลือก การเขียนโปรแกรมเชิงโครงสร�างแบบเลือกนี้มีลักษณะการทํางานแบบมีการทดสอบเง่ือนไขหรือการเปรียบเทียบท่ีต�องตัดสินใจเลือกการทํางาน และผลลัพธ8ของเง่ือนไขคือ จริงหรือเท็จ ถูกหรือผิด หรือ ใช�หรือไม�ใช� เท�านั้น ลักษณะการทํางานแบบมีการทดสอบเง่ือนไขนี้ อาจเป!นลักษณะของการเปรียบเทียบก็ได� เช�น ตัวเลขท่ี 1 มากกว�าหรือเท�ากับ ตัวเลขท่ี 2 หรือไม� (number1 >= number2) ข�อมูลปMท่ีแล�ว เหมือนกับ ข�อมูลปMนี้ หรือไม� (LastYear == ThisYear) เป!นต�น ในการเขียนโปรแกรมเชิงโครงสร�างท่ัวๆ ไป ผู�เขียนโปรแกรมต�องมีการทดสอบเง่ือนไขหรือการเปรียบเทียบข�อมูลอยู�ตลอดเวลา ถ�าต�องการให�โปรแกรมทํางานตามท่ีผู�เขียนโปรแกรมต�องการ จําเป!นต�องใช�โครงสร�างแบบนี้ในการทดสอบเง่ือนไขหรือการเปรียบเทียบ และนําผลลัพธ8ท่ีได�มาควบคุมการทํางานของโปรแกรมต�อไป เช�น เว็บไซต8 facebook.com ผู�ใช�งานเข�าไปใช�งาน จะต�องป[อนข�อมูลอีเมล8หรือโทรศัพท8และรหัสผ�านก�อน หากข�อมูลดังกล�าวถูกต�อง สามารถเข�าไปใช�งานได� แต�ถ�าไม�ถูกต�องโปรแกรมจะแจ�งเตือน ดังภาพท่ี 4.5

ก. เว็บไซต8 facebook.com หน�าจอเข�าใช�งาน ข. ถ�าป[อนข�อมูลถูกต�อง สามารถเข�าไปใช�งานได�

ค. หากป[อนข�อมูลไม�ถูกต�อง โปรแกรมจะแจ�งเตือนว�าข�อมูลไม�ถูกต�อง ภาพท่ี 4.5 การเข�าใช�งานเว็บไซต8 facebook.com

การตรวจสอบข�อมูลอีเมล8หรือโทรศัพท8และรหัสผ�าน เป!นการเปรียบเทียบข�อมูลของผู�ใช�งานท่ีมีอยู�ในระบบของเว็บไซต8 facebook.com กับข�อมูลท่ีผู�ใช�งานป[อนเข�ามาว�าตรงกันหรือไม� เพ่ือเป!นการยืนยันตัวตน (Authentication) ของผู�ใช�งานว�ามีตัวตนจริงหรือเป!นเจ�าของจริงหรือไม� ถ�าไม�สามารถยืนยันได� ก็ไม�มีสิทธิ์เข�าไปใช�งาน การทดสอบเง่ือนไขหรือการเปรียบเทียบข�อมูล ใช�โอเปอเรเตอร8ทางตรรกะ 6 ตัวท่ีได�อธิบายไว�ในบทท่ี 3 คือ เครื่องหมาย > (มากกว�า), เครื่องหมาย >= (มากกว�าหรือเท�ากับ), เครื่องหมาย < (น�อยกว�า), เครื่องหมาย

96

<= (น�อยกว�าหรือเท�ากับ), เครื่องหมาย == (เท�ากับ) และเครื่องหมาย != (ไม�เท�ากับ) การทดสอบเง่ือนไขหรือการเปรียบเทียบข�อมูลในภาษาซีใช�คําสั่ง if, if-else, if ซ�อน if และ switch case การเขียนโปรแกรมเชิงโครงสร�างแบบเลือกนี้ แบ�งได� 3 ชนิด คือ 1. การใช�คําสั่ง if หรือหนึ่งทางเลือก 2. การใช�คําสั่ง if-else หรือสองทางเลือก 3. การใช�คําสั่ง if ซ�อน if หรือ switch case หรือหลายทางเลือก โดยมีรายละเอียดดังต�อไปนี้ การใช�คําส่ัง if หรือหนึ่งทางเลือก การทดสอบเง่ือนไขหรือการเปรียบเทียบข�อมูลแบบหนึ่งทางเลือก ในภาษาซีใช�คําสั่ง if ซ่ึงเป!นคําสั่งท่ีใช�ทดสอบเง่ือนไขหรือเปรียบเทียบข�อมูล ถ�าเป!นจริงให�ทําคําสั่งท่ี 1 (เป!นคําสั่งท่ีผู�เขียนโปรแกรมกําหนดให�ต�องทํา) จากนั้นไปทําคําสั่งท่ี 2 แต�ถ�าเป!นเท็จ ไม�ต�องทําคําสั่งท่ี 1 ให�ข�ามไปทําคําสั่งท่ี 2 เลย หรือถ�าเป!นจริงให�ทําคําสั่งท่ี 1 ถึงคําสั่งท่ี n-1 (เป!นกลุ�มคําสั่งท่ีผู�เขียนโปรแกรมกําหนดให�ต�องทํา) จากนั้นไปทําคําสั่งท่ี n แต�ถ�าเป!นเท็จ ไม�ต�องทําคําสั่งท่ี 1 ถึงคําสั่งท่ี n-1 ให�ข�ามไปทําคําสั่งท่ี n เลย รูปแบบการใช�คําสั่ง if ดังภาพท่ี 4.6

if (เง่ือนไข) คําส่ังท่ี 1; คําส่ังท่ี 2;

if (เง่ือนไข) { คําส่ังท่ี 1; คําส่ังท่ี 2; ... คําส่ังท่ี n-1; } คําส่ังท่ี n;

ก. ข. ภาพท่ี 4.6 รูปแบบการใช�คําสั่ง if

ข�อสังเกต ภาพท่ี 4.6 (ข) กรณีท่ีเง่ือนไขเป!นจริง คําสั่งท่ีต�องทํามีหลายคําสั่ง คือ คําสั่งท่ี 1, คําสั่งท่ี 2, ..., คําสั่งท่ี n-1 คําสั่งเหล�านี้เรียกว�า กลุ�มคําสั่ง กลุ�มคําสั่งดังกล�าวมีเครื่องหมาย Curly Brackets ( {, } ) คลุม ส�วนภาพท่ี 4.6 (ก) กรณีท่ีเง่ือนไขเป!นจริง คําสั่งท่ีต�องทํามีเพียง 1 คําสั่ง ดังนั้นจึงไม�ต�องมีเครื่องหมาย Curly Brackets คลุม ส�วนคําสั่งท่ี 2 ของภาพท่ี 4.6 (ก) และคําสั่งท่ี n ของภาพท่ี 4.6 (ข) ซ่ึงเป!นคําสั่งท่ีอยู�ถัดไปของคําสั่ง if อาจจะมีหรือไม�มีก็ได� โดยคําสั่งดังกล�าวเป!นคําสั่งท่ีถูกสั่งให�ทํางานหลังจากท่ีทําคําสั่ง if เสร็จแล�ว หมายความว�า ถ�าเง่ือนไขเป!นจริงให�ทําคําสั่งท่ีอยู�ภายใต�คําสั่ง if แต�ถ�าเป!นเท็จ ให�ไปทําคําสั่งถัดจากคําสั่ง if นั่นเอง ดังภาพท่ี 4.7

กลุ�มคําสั่งท่ีต�องทํา

คําสั่งท่ีต�องทํา คําสั่งถัดไปจากคําสั่ง if

คําสั่งถัดไปจากคําสั่ง if

เครื่องหมาย Curly Brackets

เครื่องหมาย Curly Brackets

97

if (เง่ือนไข) คําส่ังท่ี 1; คําส่ังท่ี 2;

if (เง่ือนไข) { คําส่ังท่ี 1; คําส่ังท่ี 2; ... คําส่ังท่ี n-1; } คําส่ังท่ี n;

ก. ข. ภาพท่ี 4.7 รูปแบบการใช�คําสั่ง if ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเป!นจริงหรือเท็จ

ตัวอย!างท่ี 4.3 โปรแกรมแสดงการใช�คําสั่ง if (1)

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> int main() { int a = 8; if (a >= 10) printf("This result is true.\n"); printf("Next command."); return 0; }

ภาพท่ี 4.8 โปรแกรมแสดงการใช�คําสั่ง if (1) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.9

This command is after if.

ภาพท่ี 4.9 ผลลัพธ8ของโปรแกรมแสดงการใช�คําสั่ง if (1) จากตัวอย�างนี้ - บรรทัดท่ี 4 (int a = 8;) เป!นการประกาศตัวแปร a มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นมีค�าเท�ากับ 8 - บรรทัดท่ี 6 (if (a >= 10)) เป!นการใช�คําสั่ง if เพ่ือตรวจสอบเง่ือนไข a ว�ามีค�ามากกว�าหรือเท�ากับ 10 หรือไม� จากบรรทัดท่ี 4 จะได� a มีค�าเท�ากับ 8 ดังนั้น เง่ือนไขนี้เป!นเท็จ จึงข�ามไปทําคําสั่งในบรรทัดท่ี 8 ไม�ต�องทําคําสั่งในบรรทัดท่ี 7 - บรรทัดท่ี 8 (printf("Next command.");) แสดงข�อความ Next command.

จริง

เท็จ

จริง

เท็จ

98

ตัวอย!างท่ี 4.4 โปรแกรมแสดงการใช�คําสั่ง if (2)

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> int main() { int a = 12; if (a >= 10) { printf("This number is %d.\n", a); printf("It's greater than or equal to 10.\n"); } printf("Next command."); return 0; }

ภาพท่ี 4.10 โปรแกรมแสดงการใช�คําสั่ง if (2) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.11

This number is 12. It's greater than or equal to 10. Next command.

ภาพท่ี 4.11 ผลลัพธ8ของโปรแกรมแสดงการใช�คําสั่ง if (2) จากตัวอย�างนี้ - บรรทัดท่ี 4 (int a = 12;) เป!นการประกาศตัวแปร a มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค�าเริ่มต�นมีค�าเท�ากับ 12 - บรรทัดท่ี 6 (if (a >= 10)) เป!นการใช�คําสั่ง if เพ่ือตรวจสอบเง่ือนไข a ว�ามีค�ามากกว�าหรือเท�ากับ 10 หรือไม� จากบรรทัดท่ี 4 จะได� a มีค�าเท�ากับ 12 ดังนั้น เง่ือนไขนี้เป!นจริง ไปทํากลุ�มคําสั่งในบรรทัดท่ี 7 และ 8 และไปทําคําสั่งในบรรทัดท่ี 10 ต�อ - บรรทัดท่ี 7 (printf("This number is %d.\n", a);) แสดงข�อความ This number is 12. - บรรทัดท่ี 8 (printf("It's greater than or equal to 10.");) แสดงข�อความ It's greater than or equal to 10. - บรรทัดท่ี 10 (printf("Next command.");) แสดงข�อความ Next command. ตัวอย!างท่ี 4.5 โปรแกรมแสดงการใช�คําสั่ง if (3)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> int main() { int a; printf("Enter number : "); scanf("%d", &a); if (a >= 10) { printf("This number is %d.\n", a); printf("It's greater than or equal to 10.\n"); } printf("Next command."); return 0; }

ภาพท่ี 4.12 โปรแกรมแสดงการใช�คําสั่ง if (3)

99

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.13 - รันโปรแกรมครั้งท่ี 1 ป[อนเลข 15

Enter number : _

Enter number : 15 This number is 15. It's greater than or equal to 10. Next command.

- รันโปรแกรมครั้งท่ี 2 ป[อนเลข 5

Enter number : _

Enter number : 5 Next command.

- รันโปรแกรมครั้งท่ี 3 ป[อนเลข 10

Enter number : _

Enter number : 10 This number is 10. It's greater than or equal to 10. Next command.

ภาพท่ี 4.13 ผลลัพธ8ของโปรแกรมแสดงการใช�คําสั่ง if (3) การใช�คําส่ัง if-else หรือสองทางเลือก การทดสอบเง่ือนไขหรือการเปรียบเทียบข�อมูลแบบสองทางเลือก ในภาษาซีใช�คําสั่ง if-else ซ่ึงเป!นคําสั่งท่ีใช�ทดสอบเง่ือนไขหรือเปรียบเทียบข�อมูล ถ�าเป!นจริงให�ทําคําสั่งท่ี 1 (เป!นคําสั่งท่ีผู�เขียนโปรแกรมกําหนดให�ต�องทํา) แต�ถ�าเป!นเท็จให�ทําคําสั่งท่ี 2 เม่ือทําคําสั่ง if เสร็จให�ไปทําคําสั่งท่ี 3 ต�อ หรือถ�าเป!นจริงให�ทําคําสั่งท่ี 1.1 ถึงคําสั่งท่ี 1.n (เป!นกลุ�มคําสั่งท่ีผู�เขียนโปรแกรมกําหนดให�ต�องทํา) แต�ถ�าเป!นเท็จให�ทําคําสั่งท่ี 2.1 ถึงคําสั่งท่ี 2.n เม่ือทําคําสั่ง if เสร็จให�ไปทําคําสั่งท่ี 3 ต�อ รูปแบบการใช�คําสั่ง if ดังภาพท่ี 4.14

if (เง่ือนไข) คําส่ังท่ี 1; else คําส่ังท่ี 2; คําส่ังท่ี 3;

if (เง่ือนไข) { คําส่ังท่ี 1.1; ... คําส่ังท่ี 1.n; } else { คําส่ังท่ี 2.1; ... คําส่ังท่ี 2.n; } คําส่ังท่ี 3;

ก. ข. ภาพท่ี 4.14 รูปแบบการใช�คําสั่ง if-else

คําสั่งท่ีต�องทํา เม่ือเป!นจริง

คําสั่งถัดไปจากคําสั่ง if

คําสั่งถัดไปจากคําสั่ง if

คําสั่งท่ีต�องทํา เม่ือเป!นเท็จ กลุ�มคําสั่งท่ีต�องทํา เม่ือเป!นจริง

กลุ�มคําสั่งท่ีต�องทํา เม่ือเป!นเท็จ

100

รูปแบบการใช�คําสั่ง if-else ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเป!นจริงหรือเท็จ ดังภาพท่ี 4.15

if (เง่ือนไข) คําส่ังท่ี 1; else คําส่ังท่ี 2;

คําส่ังท่ี 3;

if (เง่ือนไข) { คําส่ังท่ี 1.1; ... คําส่ังท่ี 1.n; } else { คําส่ังท่ี 2.1; ... คําส่ังท่ี 2.n; } คําส่ังท่ี n;

ก. ข. ภาพท่ี 4.15 รูปแบบการใช�คําสั่ง if-else ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเป!นจริงหรือเท็จ

ตัวอย!างท่ี 4.6 โปรแกรมแสดงการใช�คําสั่ง if-else (1)

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> int main() { int number; printf("Enter number : "); scanf("%d", &number); if ((number % 2) == 0) printf("Even number.\n"); else printf("Odd number.\n"); return 0; }

ภาพท่ี 4.16 โปรแกรมแสดงการใช�คําสั่ง if-else (1) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.17 - รันโปรแกรมครั้งท่ี 1 ป[อนเลข 3

Enter number : _

Enter number : 3 Odd number.

- รันโปรแกรมครั้งท่ี 2 ป[อนเลข 8

Enter number : _

Enter number : 8 Even number.

ภาพท่ี 4.17 ผลลัพธ8ของโปรแกรมแสดงการใช�คําสั่ง if-else (2) จากตัวอย�างนี้ เป!นโปรแกรมการตรวจสอบตัวเลขท่ีรับผ�านทางคีย8บอร8ดว�าเป!นเลขคู� (Even number) หรือเลขค่ี (Odd number) โดยการตรวจสอบนั้นใช�โอเปอเรเตอร8ทางคณิตศาสตร8คือ % (Modulo) หรือหารเอาเศษ คือ ในบรรทัดท่ี 8 (if ((number % 2) == 0)) มีการใช�คําสั่ง if เพ่ือทดสอบเง่ือนไขหรือการ

จริง

เท็จ เท็จ

จริง

101

เปรียบเทียบว�า ผลลัพธ8จากการหารเอาเศษ (number % 2) มีค�าเท�ากับ 0 หรือไม� ถ�ามีค�าเท�ากับ 0 แสดงว�าเป!นเลขคู� แต�ถ�ามีค�าไม�เท�ากับ 0 แสดงว�าเป!นเลขค่ี ตัวอย!างท่ี 4.7 โปรแกรมแสดงการใช�คําสั่ง if-else (2)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

#include <stdio.h> int main() { int age; printf("Enter age : "); scanf("%d", &age); if (age >= 25) { printf("Hi, older.\n"); printf("You're welcome in the world."); } else { printf("Hi, younger.\n"); printf("You're welcome in the universe."); } return 0; }

ภาพท่ี 4.18 โปรแกรมแสดงการใช�คําสั่ง if-else (2) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.19 - รันโปรแกรมครั้งท่ี 1 ป[อนอายุ 15

Enter age : _

Enter age : 15 Hi, younger. You're welcome in the universe.

- รันโปรแกรมครั้งท่ี 2 ป[อนอายุ 25

Enter age : _

Enter age : 25 Hi, older. You're welcome in the world.

- รันโปรแกรมครั้งท่ี 3 ป[อนอายุ 28

Enter age : _

Enter age : 28 Hi, older. You're welcome in the world.

ภาพท่ี 4.19 ผลลัพธ8ของโปรแกรมแสดงการใช�คําสั่ง if-else (2) จากตัวอย�างนี้เป!นโปรแกรมการตรวจสอบอายุท่ีรับผ�านทางคีย8บอร8ดว�าอายุน�อย (Younger) หรืออายุมาก (Older) มีการใช�คําสั่ง if บรรทัดท่ี 8 (if (age >= 25)) เพ่ือทดสอบเง่ือนไขหรือการเปรียบเทียบว�า อายุ มีค�ามากกกว�าหรือเท�ากับ 25 หรือไม� ถ�าเง่ือนไขเป!นจริง เช�น ป[อนอายุ 25 หรือ 28 โปรแกรมไปทํากลุ�มคําสั่ง คือ - บรรทัดท่ี 9 (printf("Hi, older.\n");) แสดงข�อความ Hi, older. จากนั้นข้ึนบรรทัดใหม� - บรรทัดท่ี 10 (printf("You're welcome in the world.");) แสดงข�อความ You're welcome in the world. ถ�าเง่ือนไขเป!นเท็จ เช�น ป[อนอายุ 15 โปรแกรมไปทํากลุ�มคําสั่ง คือ - บรรทัดท่ี 13 (printf("Hi, younger.\n");) แสดงข�อความ Hi, younger. จากนั้นข้ึนบรรทัดใหม� - บรรทัดท่ี 14 (printf("You're welcome in the universe.");) แสดงข�อความ You're welcome in the universe.

102

SWITCH (ตัวแปรหรือนิพจน8)

...

...

CASE ค�าท่ี 1 CASE ค�าท่ี 2 CASE ค�าท่ี 3 ... DEFAULT

การใช�คําส่ัง if ซ�อน if หรือ switch case หรือหลายทางเลือก การทดสอบเง่ือนไขหรือการเปรียบเทียบข�อมูลแบบหลายทางเลือก ในภาษาซีจะใช�คําสั่ง if ซ�อน if หรือ switch case ซ่ึงเป!นคําสั่งท่ีใช�ทดสอบหลายเง่ือนไข รูปแบบการใช�คําสั่ง if ซ�อน if ดังภาพท่ี 4.20

if (เง่ือนไขท่ี 1) คําส่ังท่ี 1; else if (เง่ือนไขท่ี 2) คําส่ังท่ี 2; else if (เง่ือนไขท่ี 3) คําส่ังท่ี 3; else คําส่ังท่ี 4; คําส่ังท่ี 5;

ภาพท่ี 4.20 รูปแบบการใช�คําสั่ง if ซ�อน if รูปแบบการใช�คําสั่ง if ซ�อน if นี้ อาจมีการทดสอบเง่ือนไขมากกว�า 3 เง่ือนไขได� แต�จะทําให�ผู�เขียนโปรแกรมเกิดความสับสนและเขียนโปรแกรมยากข้ึน ดังนั้นภาษาซีจึงมีคําสั่ง switch case เข�ามาช�วยทําให�การเขียนโปรแกรมได�ง�ายข้ึน พิจารณาจากผังงาน ดังภาพท่ี 4.21

ภาพท่ี 4.21 ผังงานของคําสั่ง switch case รูปแบบการใช�คําสั่ง switch case ดังภาพท่ี 4.22

คําสั่งท่ีต�องทํา เม่ือเง่ือนไขท่ี 1 เป!นจริง

คําสั่งถัดไปจากคําสั่ง if

คําสั่งท่ีต�องทํา เม่ือเง่ือนไขท่ี 1 เป!นเท็จ แต�เง่ือนไขท่ี 2 เป!นจริง

คําสั่งท่ีต�องทํา เม่ือเง่ือนไขท่ี 1 เป!นเท็จ เง่ือนไขท่ี 2 เป!นเท็จ แต�เง่ือนไขท่ี 3 เป!นจริง

คําสั่งท่ีต�องทํา เม่ือเง่ือนไขท่ี 1 เป!นเท็จ เง่ือนไขท่ี 2 เป!นเท็จ แต�เง่ือนไขท่ี 3 เป!นเท็จ

103

switch (ตัวแปร หรือนิพจนMท่ีจะตรวจสอบ) case ค!าท่ี 1 : คําส่ังท่ี 1; break; case ค!าท่ี 2 : คําส่ังท่ี 2; break; case ค!าท่ี ... : คําส่ังท่ี ...; break; default : คําส่ังท่ี n-1; คําส่ังท่ี n;

ภาพท่ี 4.22 รูปแบบการใช�คําสั่ง switch case จากรูปแบบการใช�คําสั่ง switch case นี้ จะมีลักษณะการทํางานตามคําสั่งต�างๆ โดยพิจารณาจากค�าของตัวแปรหรือนิพจน8ท่ีกําหนดว�าตรงกับกรณีใด คือ ถ�าคําสั่ง switch ตรวจสอบแล�วมีค�าเท�ากับกรณีใด ก็จะเข�าไปทํางานตามคําสั่งท่ีอยู�ภายใต�กรณีนั้น เช�น คําสั่ง switch ตรวจสอบแล�วมีค�าเท�ากับค�าท่ี 3 ก็จะเข�าไปทําคําสั่งท่ี 3 จากนั้นไปทําคําสั่งท่ี n ซ่ึงเป!นคําสั่งท่ีอยู�ถัดไปของคําสั่ง switch case แต�ถ�าตรวจสอบแล�วไปตรงกับกรณีใดๆ เลย ก็จะเข�าไปทําท่ี default เพ่ือทําคําสั่ง n-1 จากนั้นไปทําคําสั่งท่ี n ซ่ึงเป!นคําสั่งท่ีอยู�ถัดไปของคําสั่ง switch case จะเห็นว�า การใช�คําสั่ง switch case นี้ ทุกกรณีจะปvดท�ายด�วยคําสั่ง break เสมอ ยกเว�นกรณี default ซ่ึงถือว�าเป!นกรณีสุดท�าย จึงไม�ต�องมีคําสั่ง break การใส�คําสั่ง break จะทําให�การทํางานในกรณีนั้นๆ สิ้นสุด แล�วออกจากการทํางานของคําสั่ง switch case หากไม�ใส�คําสั่ง break จะทําให�เข�าไปทํางานในกรณีถัดไปด�วย ส�งผลทําให�เกิดข�อผิดพลาดของโปรแกรมข้ึนได� ตัวอย!างท่ี 4.8 โปรแกรมแสดงการใช�คําสั่ง if ซ�อน if (1)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

#include <stdio.h> int main() { int a; printf("Enter age : "); scanf("%d", &a); if (age > 25) { printf("Hi, older.\n"); printf("You're welcome in the world."); } else if (a == 25) { printf("Hi, friend.\n"); printf("You're welcome in the galaxy."); } else { printf("Hi, younger.\n"); printf("You're welcome in the universe."); } return 0; }

ภาพท่ี 4.23 โปรแกรมแสดงการใช�คําสั่ง if ซ�อน if (1)

104

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.24 - รันโปรแกรมครั้งท่ี 1 ป[อนอายุ 15

Enter age : _

Enter age : 15 Hi, younger. You're welcome in the universe.

- รันโปรแกรมครั้งท่ี 2 ป[อนอายุ 25

Enter age : _

Enter age : 25 Hi, friend. You're welcome in the galaxy.

- รันโปรแกรมครั้งท่ี 3 ป[อนอายุ 28

Enter age : _

Enter age : 28 Hi, older. You're welcome in the world.

ภาพท่ี 4.24 ผลลัพธ8ของโปรแกรมแสดงการใช�คําสั่ง if ซ�อน if (1) จากตัวอย�างนี้ คล�ายกับตัวอย�างท่ี 4.7 แต�ตัวอย�างท่ี 4.7 ไม�สามารถตรวจสอบเง่ือนไขกรณีท่ีอายุมีค�าเท�ากับ 25 ได� ตัวอย!างท่ี 4.9 โปรแกรมแสดงการใช�คําสั่ง if ซ�อน if (2)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

#include <stdio.h> int main() { char a; printf("Enter abbr. of nation (c, l, m, v) : "); scanf("%c", &a); if (a == 'c') { printf("Cambodia\n"); printf("Say => Shuo Sa Dai"); } else if (a == 'l') { printf("Laos\n"); printf("Say => Sabaidee"); } else if (a == 'm') { printf("Myanmar\n"); printf("Say => Mingalar Par"); } else if (a == 'v') { printf("Vietnam\n"); printf("Say => Xin Chao"); } else { printf("Please press c, l, m or v only!!!"); } return 0; }

ภาพท่ี 4.25 โปรแกรมแสดงการใช�คําสั่ง if ซ�อน if (2) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8ดังภาพท่ี 4.26 - รันโปรแกรมครั้งท่ี 1 ป[อนตัวอักษร c

Enter abbr. of nation (c, l, m, v) : _

Enter abbr. of nation (c, l, m, v) : c Cambodia Say => Shuo Sa Dai

105

- รันโปรแกรมครั้งท่ี 2 ป[อนตัวอักษร l

Enter abbr. of nation (c, l, m, v) : _

Enter abbr. of nation (c, l, m, v) : l Laos Say => Sabaidee

- รันโปรแกรมครั้งท่ี 3 ป[อนตัวอักษร m

Enter abbr. of nation (c, l, m, v) : _

Enter abbr. of nation (c, l, m, v) : m Myanmar Say => Mingalar Par

- รันโปรแกรมครั้งท่ี 4 ป[อนตัวอักษร v

Enter abbr. of nation (c, l, m, v) : _

Enter abbr. of nation (c, l, m, v) : v Vietnam Say => Xin Chao

ภาพท่ี 4.26 ผลลัพธ8ของโปรแกรมแสดงการใช�คําสั่ง if ซ�อน if (2) จากตัวอย�างนี้ จะเห็นว�า มีการตรวจสอบ 4 เง่ือนไข โดยใช�คําสั่ง if ซ�อน if และซ�อน if อีก ทําให�โปรแกรมมีความซับซ�อนและอาจทําให�เกิดข�อผิดพลาดข้ึนได� หากเขียนไม�ถูกต�องหรือตกหล�นบางเครื่องหมายไป ดังนั้นตัวอย�างนี้นํามาเขียนโปรแกรมใหม�โดยใช�คําสั่ง switch case แทน ดังแสดงในตัวอย�างท่ี 4.10 ตัวอย!างท่ี 4.10 โปรแกรมแสดงการใช�คําสั่ง switch case

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

#include <stdio.h> int main() { char a; printf("Enter abbr. of nation (c, l, m, v) : "); scanf("%c", &a); switch (a) { case 'c' : printf("Cambodia\n"); printf("Say => Shuo Sa Dai"); break; case 'l' : printf("Laos\n"); printf("Say => Sabaidee"); break; case 'm' : printf("Myanmar\n"); printf("Say => Mingalar Par"); break; case 'v' : printf("Vietnam\n"); printf("Say => Xin Chao"); break; default : printf("Please press c, l, m or v only !!!"); } return 0; }

ภาพท่ี 4.27 โปรแกรมแสดงการใช�คําสั่ง switch case เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ8เหมือนกับภาพท่ี 4.26 ของตัวอย�างท่ี 4.9 นั่นเอง จากตัวอย�างนี้เม่ือเปรียบเทียบกับตัวอย�างท่ี 4.9 จะเห็นได�ว�า รหัสต�นฉบับของตัวอย�างนี้จะอ�านเข�าใจได�ง�ายกว�า ทําให�การเขียนโปรแกรมด�วยคําสั่ง switch case เขียนได�ง�ายและสะดวกกว�าการใช�คําสั่ง if ซ�อน if โดยเฉพาะโปรแกรมท่ีมีการตรวจสอบเง่ือนไขจํานวนมาก

106

การเขียนโปรแกรมเชิงโครงสร�างแบบเลือกท่ีได�อธิบายไปข�างต�น ถ�าพิจารณาให�ดีจะเห็นว�ามีการเขียนโปรแกรมเชิงโครงสร�างแบบลําดับซ�อนไปด�วย ตามท่ีได�อธิบายไปในหัวข�อสรุปของบทท่ี 2 ดังตัวอย�างท่ี 4.11 ตัวอย!างท่ี 4.11 โปรแกรมแสดงการเขียนโปรแกรมเชิงโครงสร�างแบบเลือกร�วมกับแบบลําดับ ตัวอย�างนี้คือ ตัวอย�างท่ี 4.8 โดยนําตัวอย�างนี้มาแสดงให�เห็นว�า โปรแกรมเชิงโครงสร�างแบบลําดับมีแบบเลือกร�วมด�วย

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

#include <stdio.h> int main() { int a; printf("Enter age : "); scanf("%d", &a); if (age > 25) { printf("Hi, older.\n"); printf("You're welcome in the world."); } else if (a == 25) { printf("Hi, friend.\n"); printf("You're welcome in the galaxy."); } else { printf("Hi, younger.\n"); printf("You're welcome in the universe."); } return 0; }

ภาพท่ี 4.28 โปรแกรมแสดงการเขียนโปรแกรมเชิงโครงสร�างแบบเลือกร�วมกับแบบลําดับ จากตัวอย�างนี้ เครื่องหมาย แสดงการเขียนโปรแกรมเชิงโครงสร�างแบบลําดับ ส�วนเครื่องหมายxxxxxxxxxแสดงการเขียนโปรแกรมเชิงโครงสร�างแบบเลือกกรณีท่ีเป!นเท็จ และเครื่องหมาย แสดงการเขียนโปรแกรมเชิงโครงสร�างแบบเลือกกรณีท่ีเป!นจริง สรุป ในบทเรียนนี้ได�อธิบายถึง การเขียนโปรแกรมเชิงโครงสร�างแบบลําดับมีลักษณะการทํางานแบบลําดับโดยทํางานจากบนลงล�าง คําสั่งท่ีอยู�ลําดับบนๆ เป!นคําสั่งท่ีต�องทํางานก�อน ส�วนคําสั่งล�างๆ เป!นคําสั่งท่ีทํางานหลัง ส�วนการเขียนโปรแกรมเชิงโครงสร�างแบบเลือก มีลักษณะการทํางานแบบมีการทดสอบเง่ือนไขหรือการเปรียบเทียบท่ีต�องตัดสินใจเลือกการทํางาน และผลลัพธ8ของเง่ือนไขคือ จริงหรือเท็จ ถูกหรือผิด หรือ ใช�หรือไม�ใช� เท�านั้น การเขียนโปรแกรมเชิงโครงสร�างแบบเลือกแบ�งได� 3 ชนิด คือ การใช�คําสั่ง if หรือหนึ่งทางเลือก การใช�คําสั่ง if-else หรือสองทางเลือก และการใช�คําสั่ง if ซ�อน if หรือ switch case หรือหลายทางเลือก

107

คําถามทบทวน 1. จงเขียนโปรแกรมรับตัวเลข 2 จํานวนผ�านทางคีย8บอร8ด ให�ตรวจสอบว�า ตัวเลขท่ี 2 มากกว�า เท�ากับ หรือน�อยกว�า ตัวเลขท่ี 1 แสดงผลลัพธ8ท่ีหน�าจอ ดังรูป

Enter no.1 = _

Enter no.1 = 1

Enter no.2 = _

Enter no.1 = 1

Enter no.2 = 2

Enter no.1 = 1

Enter no.2 = 2

2 > 1

หรือ

Enter no.1 = _

Enter no.1 = 3

Enter no.2 = _

Enter no.1 = 3

Enter no.2 = 0

Enter no.1 = 3

Enter no.2 = 0

0 < 3

หรือ

Enter no.1 = _

Enter no.1 = 5

Enter no.2 = _

Enter no.1 = 5

Enter no.2 = 5

Enter no.1 = 5

Enter no.2 = 5

5 = 5

2. จงเขียนโปรแกรมรับตัวอักษร 1 ตัวผ�านทางคีย8บอร8ด ให�ตรวจสอบว�า ตัวอักษรดังกล�าวเป!น พยัญชนะ หรือสระ แสดงผลลัพธ8ท่ีหน�าจอ ดังรูป

Enter character = _

Enter character = a

Enter character = a

a is vowel.

หรือ

Enter character = _

Enter character = x

Enter character = x

x is consonant.

หมายเหตุ vowel แปลว�า สระ และ consonant แปลว�า พยัญชนะ 3. จงเขียนโปรแกรมรับตัวเลข 1 ตัวผ�านทางคีย8บอร8ด แสดงผลลัพธ8ท่ีหน�าจอว�าตัวเลขดังกล�าวคือเลขอะไรในคําภาษาอังกฤษ ดังรูป

Enter number = _

Enter number = 5

Enter number = 5

5 is five.

4. จงเขียนโปรแกรมรับตัวเลข 2 ตัวผ�านทางคีย8บอร8ด ให�แสดงตัวเลขท่ีมากกว�าก�อนตัวเลขท่ีน�อยกว�า แสดงผลลัพธ8ท่ีหน�าจอ ดังรูป

Enter no.1 = _

Enter no.1 = 1

Enter no.1 = 1

Enter no.2 = 2

Enter no.1 = 1

Enter no.2 = 2

2 and 1

108

หรือ

Enter no.1 = _

Enter no.1 = 3

Enter no.1 = 3

Enter no.2 = 0

Enter no.1 = 3

Enter no.2 = 0

3 and 0

5. จงเขียนโปรแกรมรับตัวเลข 1 ตัวผ�านทางคีย8บอร8ด หากตัวเลขมีค�ามากกว�า 5 ให�แสดงคําว�า "Yahoo" ถ�ามีค�าเท�ากับ 5 ให�แสดงคําว�า "Google" และถ�าน�อยกว�า 5 ให�แสดงคําว�า "Hotmail" แสดงผลลัพธ8ท่ีหน�าจอ ดังรูป

Enter number = _

Enter number = 8

Enter number = 8

Yahoo.

หรือ

Enter number = _

Enter number = 5

Enter number = 5

Google.

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall.

110

แผนบริหารการสอนประจําบทท่ี 5 หัวข�อเน้ือหาประจําบท 1. การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขก�อน 2. การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขทีหลัง 3. การแสดงผลท่ีหน�าจอคอมพิวเตอร( 4. การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบท่ีแน�นอน วัตถุประสงค! เม่ือผู�เรียนศึกษาบทเรียนจบแล�ว จะมีความสามารถดังนี้ 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบได� 2. เขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขก�อน โดยใช�คําสั่ง while ได� 3. เขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขทีหลัง โดยใช�คําสั่ง do while ได� 4. เขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบท่ีแน�นอน โดยใช�คําสั่ง for ได� 5. อธิบายการแสดงผลท่ีหน�าจอคอมพิวเตอร(ได� กิจกรรมการเรียนการสอน 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบ โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย�างโปรแกรมเชิงโครงสร�างแบบวนรอบ 2. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขก�อน โดยใช�คําสั่ง while โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย�างโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขก�อน โดยใช�คําสั่ง while 3. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขทีหลัง โดยใช�คําสั่ง while โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย�างโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขทีหลัง โดยใช�คําสั่ง do while 4. อธิบายการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบท่ีแน�นอน โดยใช�คําสั่ง while โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย�างโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบท่ีแน�นอน โดยใช�คําสั่ง for 5. แบ�งผู�เรียนออกเป@นกลุ�ม โดยปฏิบัติตามใบงานท่ี 5 ดังนี้ 5.1 ให�ผู�เรียนฝDกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขก�อน โดยใช�คําสั่ง while 5.2 ให�ผู�เรียนฝDกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขทีหลัง โดยใช�คําสั่ง do while 5.3 ให�ผู�เรียนฝDกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบท่ีแน�นอน โดยใช�คําสั่ง for 5.4 ให�ตัวแทนแต�ละกลุ�มออกมานําเสนอผลการปฏิบัติตามใบงาน และร�วมกันอภิปรายว�าโปรแกรมท่ีเขียนข้ึนมานั้นเป@นอย�างไร 6. ร�วมกันสรุปความรู�เก่ียวกับการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบ จากนั้นซักถามผู�เรียน รวมถึงให�ผู�เรียนตอบคําถามทบทวน

112

สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 5 4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน 3. สังเกตการณ(ปฏิบัติงานกลุ�ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝDกหัด

บทท่ี 5 โครงสร�างแบบวนรอบ

บทนํา การเขียนโปรแกรมเชิงโครงสร�างมี 3 แบบคือ แบบลําดับ แบบเลือก และแบบวนรอบ บทท่ีผ!านมาได�อธิบาย 2 แบบแรก ในบทนี้จะอธิบายในแบบท่ี 3 เป(นการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบ (Repetition/Iterative/Looping) มีลักษณะการทํางานแบบวนรอบหรือวนซํ้าหรือทําซํ้า โดยทําคําสั่งท่ีต�องการทําหรือประมวลผลซํ้าหลายครั้งตามเง่ือนไขท่ีได�ระบุไว� รวมถึงยังได�อธิบายการแสดงผลท่ีหน�าจอคอมพิวเตอรBเพ่ือให�รู�ว!าทิศทางการแสดงผลบนหน�าจอว!าเป(นอย!างไร การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบนี้ แบ!งได�เป(น 3 ชนิดคือ 1. การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขก!อน 2. การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขทีหลัง 3. การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบท่ีแน!นอน โดยมีรายละเอียดดังต!อไปนี้ การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเงื่อนไขก�อน การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบนี้มีลักษณะการทํางานแบบวนรอบ โดยต�องมีการทดสอบเง่ือนไขก!อนทุกครั้ง หากเง่ือนไขเป(นจริง ให�ทําคําสั่งท่ีต�องการทําหรืองานท่ีต�องทําซํ้าจนกว!าการทดสอบเง่ือนไขดังกล!าวจะเป(นเท็จ เม่ือเง่ือนไขเป(นเท็จ ให�ออกจากการวนรอบ คําสั่งท่ีใช�ในภาษาซีคือ while รูปแบบการใช�คําสั่ง while ดังภาพท่ี 5.1

while (เง่ือนไข) { คําส่ังท่ี 1; คําส่ังท่ี 2; ... คําส่ังท่ี n-1; } คําส่ังท่ี n;

ภาพท่ี 5.1 รูปแบบการใช�คําสั่ง while ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเป(นจริงหรือเท็จ จากภาพนี้มีการทดสอบเง่ือนไขในคําสั่ง while ก!อน หากเง่ือนไขเป(นจริง ให�เข�ามาทําคําสั่งท่ีต�องทําซํ้าซ่ึงอาจมีเพียงคําสั่งเดียวหรือเป(นกลุ!มคําสั่ง(คําสั่งท่ี 1, คําสั่งท่ี 2, ..., คําสั่งท่ี n-1) จนเสร็จ ให�ย�อนกลับไปตรวจสอบเง่ือนไขอีกครั้ง ถ�าเง่ือนไขยังเป(นจริง ให�ทําคําสั่งทําซํ้า ทําข้ันตอนในลักษณะนี้ไปเรื่อยๆ จนกว!าเง่ือนไขเป(นเท็จ จึงออกจากคําสั่ง while หรือออกจากการวนรอบของคําสั่ง while ไปทําคําสั่งท่ี n ท่ีอยู!ถัดจากคําสั่ง while ต!อไป

จริง

เท็จ เม่ือทําคําสั่งท่ีต�องทําซํ้าเสร็จ

ให�ย�อนกลับไปตรวจสอบเง่ือนไข คําสั่งท่ีต�องทําซํ้า

114

ตัวอย�างท่ี 5.1 โปรแกรมแสดงการใช�คําสั่ง while (1)

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> int main() { int i = 1; while (i < 5) { printf("i = %d\n", i); i++; } printf("Next command."); return 0; }

ภาพท่ี 5.2 โปรแกรมแสดงการใช�คําสั่ง while (1) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.3

i = 1 i = 2 i = 3 i = 4 Next command.

ภาพท่ี 5.3 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง while (1) จากตัวอย!างนี้ หลังจากประกาศตัวแปร i แล�วเข�าไปทําคําสั่งแบบวนรอบในท่ีนี้คือ คําสั่ง while ต�องมีการตรวจสอบเง่ือนไขก!อน โดยมีรายละเอียด ดังนี้ - บรรทัดท่ี 4 (int i = 1;) เป(นการประกาศตัวแปร i มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค!าเริ่มต�นมีค!าเท!ากับ 1 - บรรทัดท่ี 6 (while (i < 5)) เป(นการใช�คําสั่ง while เพ่ือตรวจสอบเง่ือนไข i ว!ามีค!าน�อยกว!า 5 หรือไม! จากบรรทัดท่ี 4 จะได� i มีค!าเท!ากับ 1 ดังนั้น เง่ือนไขนี้เป(นจริง ไปทําคําสั่งท่ีต�องทําซํ้าในท่ีนี้คือ กลุ!มคําสั่งในบรรทัดท่ี 7 และ 8 จากนั้นย�อนกลับไปทําคําสั่งในบรรทัดท่ี 6 เพ่ือตรวจสอบเง่ือนไขอีกครั้ง ทําแบบนี้ไปเรื่อยๆ จนกว!าเง่ือนไขเป(นเท็จ จึงข�ามไปทําคําสั่งในบรรทัดท่ี 10 และ 11 ไม!ต�องทําคําสั่งท่ีต�องทําซํ้า(คําสั่งในบรรทัดท่ี 7 และ 8) - บรรทัดท่ี 7 (printf("i = %d\n", i);) แสดงข�อความ i = ค!าของ i ในแต!ละรอบ

- บรรทัดท่ี 8 (i++;) เป(นการเพ่ิมค!า i ข้ึนอีก 1 หรือ i++ มีความหมายเท!ากับ i = i + 1 นั่นเอง - บรรทัดท่ี 10 (printf("Next command.");) แสดงข�อความ Next command. จากตัวอย!างนี้ สามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต!ละรอบของการวนรอบของคําสั่ง while ดังนี้ รอบท่ี ค�า i ผลการทดสอบเง่ือนไข

while (i < 5) printf("i = %d\n", i);

(ตําแหน�ง � ชี้) i++;

(i = i + 1;) 1 1 1 < 5 มีค!าความจริงเป(น จริง i = 1 � i = 1 + 1 = 2 2 2 2 < 5 มีค!าความจริงเป(น จริง i = 1

i = 2 � i = 2 + 1 = 3 3 3 3 < 5 มีค!าความจริงเป(น จริง i = 1

i = 2 i = 3 �

i = 3 + 1 = 4

4 4 4 < 5 มีค!าความจริงเป(น จริง i = 1 i = 2 i = 3 i = 4 �

i = 4 + 1 = 5

115

รอบท่ี ค�า i ผลการทดสอบเง่ือนไข while (i < 5)

printf("i = %d\n", i); (ตําแหน�ง � ชี้)

i++; (i = i + 1;)

5 5 5 < 5 มีค!าความจริงเป(น เท็จ *** ไม!มีการทํางาน *** *** ไม!มีการทํางาน *** ตัวอย�างท่ี 5.2 โปรแกรมแสดงการใช�คําสั่ง while (2)

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> int main() { int i = 8; while (i < 5) { printf("i = %d\n", i); i++; } printf("Next command."); return 0; }

ภาพท่ี 5.4 โปรแกรมแสดงการใช�คําสั่ง while (2) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.5

Next command.

ภาพท่ี 5.5 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง while (2) ตัวอย!างนี้เหมือนกับตัวอย!างท่ี 5.1 เพียงแต!เปลี่ยนค!าเริ่มต�นของตัวแปร i ให�มีค!าเท!ากับ 8 ทําให�ผลลัพธBของโปรแกรมต!างกัน คือ แสดงข�อความ Next command. เพียงอย!างเดียว เนื่องจากเม่ือตัวแปร i มีค!าเท!ากับ 8 แล�วนําไปใช�ในบรรทัดท่ี 6 (while (i < 5)) คือ while (8 < 5) เง่ือนไขนี้เป(นเท็จ ทําให�ไม!ต�องไปทําคําสั่งท่ีต�องทําซํ้า จึงข�ามไปทําคําสั่งในบรรทัดท่ี 10 และ 11 แทน ตัวอย�างท่ี 5.3 โปรแกรมแสดงการใช�คําสั่ง while (3)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> int main() { int i; printf("Enter number : "); scanf("%d", &i); while (i <= 5) { printf("i = %d\n", i); i++; } printf("Next command."); return 0; }

ภาพท่ี 5.6 โปรแกรมแสดงการใช�คําสั่ง while (3)

116

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.7 - รันโปรแกรมครั้งท่ี 1 ป̂อนตัวเลข 1

Enter number : _

Enter number : 1 i = 1 i = 2 i = 3 i = 4 i = 5 Next command.

- รันโปรแกรมครั้งท่ี 2 ป̂อนตัวเลข 3

Enter number : _

Enter number : 3 i = 3 i = 4 i = 5 Next command.

ภาพท่ี 5.7 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง while (3) จากตัวอย!างนี้ มีการรับค!าตัวเลขผ!านทางคียBบอรBด ตัวเลขท่ีรับเข�ามานํามาใช�ในการกําหนดค!าเริ่มต�นให�กับตัวนับ i ตัวอย�างท่ี 5.4 โปรแกรมแสดงการใช�คําสั่ง while (4)

01 02 03 04 05 06 07 08 09 10 11 12

#include <stdio.h> int main() { int i = 1; while (i <= 12) { printf("2 x %d \t= %d\n", i, 2*i); i++; } return 0; }

ภาพท่ี 5.8 โปรแกรมแสดงการใช�คําสั่ง while (4) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.9

2 x 1 = 2 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

ภาพท่ี 5.9 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง while (4) จากผลลัพธBของตัวอย!างนี้ คือ สูตรคูณแม! 2 นั่นเอง สามารถนําคําสั่ง while มาใช�ในการวนรอบการทํางานเพ่ือสร�างเป(นสูตรคูณได� สามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต!ละรอบของการวนรอบของคําสั่ง while ดังนี้

117

รอบท่ี ค�า i ผลการทดสอบเง่ือนไข while (i <= 12)

printf("2 x %d = %d\n", i, 2*i); (ตําแหน�ง � ชี้)

i++; (i = i + 1;)

1 1 1 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 � i = 1 + 1 = 2 2 2 2 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2

2 x 2 = 4 � i = 2 + 1 = 3 3 3 3 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2

2 x 2 = 4 2 x 3 = 6 �

i = 3 + 1 = 4

4 4 4 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 �

i = 4 + 1 = 5

5 5 5 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 �

i = 5 + 1 = 6

6 6 6 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 �

i = 6 + 1 = 7

7 7 7 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 2 x 7 = 14 �

i = 7 + 1 = 8

8 8 8 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 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 �

i = 8 + 1 = 9

9 9 9 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 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 �

i = 9 + 1 = 10

10 10 10 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 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 �

i = 10 + 1 = 11

11 11 11 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 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 �

i = 11 + 1 = 12

12 12 12 <= 12 มีค!าความจริงเป(น จริง 2 x 1 = 2 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 �

i = 12 + 1 = 13

13 13 13 <= 12 มีค!าความจริงเป(น เท็จ *** ไม!มีการทํางาน *** *** ไม!มีการทํางาน ***

118

การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเงื่อนไขหลัง การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบนี้มีลักษณะการทํางานแบบวนรอบ โดยการเข�าไปทําคําสั่งท่ีต�องการทําหรืองานท่ีต�องทําซํ้าอย!างน�อย 1 ครั้งก!อนจากนั้นจึงไปทดสอบเง่ือนไข หากเง่ือนไขเป(นจริง ให�ทําคําสั่งท่ีต�องการทําหรืองานท่ีต�องทําซํ้าจนกว!าการทดสอบเง่ือนไขดังกล!าวจะเป(นเท็จ เม่ือเง่ือนไขเป(นเท็จ ให�ออกจากการวนรอบ คําสั่งท่ีใช�ในภาษาซีคือ do while รูปแบบการใช�คําสั่ง do while ดังภาพท่ี 5.10

do { คําส่ังท่ี 1; คําส่ังท่ี 2; ... คําส่ังท่ี n-1; } while (เง่ือนไข); คําส่ังท่ี n;

ภาพท่ี 5.10 รูปแบบการใช�คําสั่ง do while ท่ีแสดงข้ันตอนการทํางานกรณีท่ีเป(นจริงหรือเท็จ จากภาพนี้เข�ามาทําคําสั่งท่ีต�องทําซํ้าก!อน(หลังคําสั่ง do) คําสั่งท่ีต�องทําซํ้าอาจมีเพียงคําสั่งเดียวหรือเป(นกลุ!มคําสั่ง(คําสั่งท่ี 1, คําสั่งท่ี 2, ..., คําสั่งท่ี n-1) จนเสร็จ จึงจะมีการตรวจสอบเง่ือนไข ถ�าเง่ือนไขเป(นจริง ให�ทําคําสั่งทําซํ้า ทําข้ันตอนในลักษณะนี้ไปเรื่อยๆ จนกว!าเง่ือนไขเป(นเท็จ จึงออกจากคําสั่ง while หรือออกจากการวนรอบของคําสั่ง while ไปทําคําสั่งท่ี n ท่ีอยู!ถัดจากคําสั่ง do while ต!อไป ตัวอย�างท่ี 5.5 โปรแกรมแสดงการใช�คําสั่ง do while (1)

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> int main() { int i = 1; do { printf("i = %d\n", i); i++; } while (i < 5); printf("Next command."); return 0; }

ภาพท่ี 5.11 โปรแกรมแสดงการใช�คําสั่ง do while (1) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.12

i = 1 i = 2 i = 3 i = 4 Next command.

ภาพท่ี 5.12 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง do while (1)

เง่ือนไขเป(นจริง ย�อนกลับไปทําคําสั่งท่ีต�องทําซํ้า

เท็จ

คําสั่งท่ีต�องทําซํ้า

119

จากตัวอย!างนี้ หลังจากประกาศตัวแปร i แล�วเข�าไปทําคําสั่งท่ีต�องทําซํ้าในรอบแรก เม่ือทําคําสั่งท่ีต�องทําซํ้าเสร็จ จึงจะมีการตรวจสอบเง่ือนไข หากเง่ือนไขเป(นจริง ให�กลับไปทําคําสั่งท่ีต�องทําซํ้าอีก จนกว!าเง่ือนไขเป(นเท็จ โดยมีรายละเอียด ดังนี้ - บรรทัดท่ี 4 (int i = 1;) เป(นการประกาศตัวแปร i มีชนิดข�อมูลแบบเลขจํานวนเต็ม และกําหนดค!าเริ่มต�นมีค!าเท!ากับ 1 - บรรทัดท่ี 6 (do {) เป(นการใช�คําสั่ง do ซ่ึงเป(นจุดเริ่มต�นของการทําคําสั่งท่ีต�องทําซํ้า - บรรทัดท่ี 7 (printf("i = %d\n", i);) แสดงข�อความ i = ค!าของ i ในแต!ละรอบ

- บรรทัดท่ี 8 (i++;) เป(นการเพ่ิมค!า i ข้ึนอีก 1 หรือ i++ มีความหมายเท!ากับ i = i + 1 นั่นเอง - บรรทัดท่ี 9 (} while (i < 5);) เป(นการใช�คําสั่ง while เพ่ือตรวจสอบเง่ือนไขหลังจากท่ีทําคําสั่งท่ีต�องทําซํ้าครบแล�ว โดยตรวจสอบตัวแปร i ว!ามีค!าน�อยกว!า 5 หรือไม! จากบรรทัดท่ี 4 จะได� i มีค!าเท!ากับ 1 และบรรทัดท่ี 8 จะได� i มีค!าเท!ากับ 2 ดังนั้นเง่ือนไขนี้เป(นจริง ไปทําคําสั่งท่ีต�องทําซํ้าต!อ ทําแบบนี้ไปเรื่อยๆ จนกว!าเง่ือนไขเป(นเท็จ จึงข�ามไปทําคําสั่งในบรรทัดท่ี 10 และ 11 - บรรทัดท่ี 10 (printf("Next command.");) แสดงข�อความ Next command. จากตัวอย!างนี้ สามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต!ละรอบของการวนรอบของคําสั่ง do while ดังนี้ รอบท่ี ค�า i printf("i = %d\n", i);

(ตําแหน�ง � ชี้) i++;

(i = i + 1;) ผลการทดสอบเง่ือนไข

while (i < 5) 1 1 i = 1 � i = 1 + 1 = 2 2 < 5 มีค!าความจริงเป(น จริง 2 2 i = 1

i = 2 � i = 2 + 1 = 3 3 < 5 มีค!าความจริงเป(น จริง 3 3 i = 1

i = 2 i = 3 �

i = 3 + 1 = 4 4 < 5 มีค!าความจริงเป(น จริง

4 4 i = 1 i = 2 i = 3 i = 4 �

i = 4 + 1 = 5 5 < 5 มีค!าความจริงเป(น เท็จ

ข�อสังเกต จากตัวอย!างนี้(ใช�คําสั่ง do while) เม่ือเปรียบเทียบกับตัวอย!างท่ี 5.1 (ใช�คําสั่ง while) จะเห็นว!าผลลัพธBท่ีได�เหมือนกัน แต!จํานวนรอบของการวนรอบคําสั่ง while กับ do while ไม!เท!ากัน ตัวอย�างท่ี 5.6 โปรแกรมแสดงการใช�คําสั่ง do while (2)

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> int main() { int i = 8; do { printf("i = %d\n", i); i++; } while (i < 5); printf("Next command."); return 0; }

ภาพท่ี 5.13 โปรแกรมแสดงการใช�คําสั่ง do while (2)

120

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.14

i = 8 Next command.

ภาพท่ี 5.14 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง do while (2) ข�อสังเกต จากตัวอย!างนี้(ใช�คําสั่ง do while) เม่ือเปรียบเทียบกับตัวอย!างท่ี 5.2 (ใช�คําสั่ง while) จะเห็นว!าผลลัพธBท่ีได�ไม!เหมือนกัน ให�ลองพิจารณาดูว!าทําไมถึงให�ผลลัพธBไม!เหมือนกัน การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบที่แน�นอน การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบนี้มีลักษณะการทํางานแบบวนรอบ โดยไม!มีการทดสอบเง่ือนไขในการทํางาน แต!จะหยุดการทํางานก็ต!อเม่ือวนรอบครบตามจํานวนรอบท่ีต�องการ โดยมีตัวนับ (Counter) คอยควบคุมจํานวนรอบของคําสั่งท่ีต�องทําซํ้า คําสั่งท่ีใช�ในภาษาซีคือ for รูปแบบการใช�คําสั่ง for ดังภาพท่ี 5.12

for (กําหนดค�าเร่ิมต�นให�กับตัวนับ; เปรียบเทียบตัวนับว�าครบจํานวนรอบที่ต�องการหรือไม�; เพ่ิม/ลดค�าตัวนับ) { คําส่ังท่ี 1; คําส่ังท่ี 2; ... คําส่ังท่ี n-1; } คําส่ังท่ี n;

ภาพท่ี 5.15 รูปแบบการใช�คําสั่ง for ท่ีแสดงข้ันตอนการทํางาน รูปแบบการใช�คําสั่ง for มี 3 ส!วน โดยมีรายละเอียดดังนี้ กําหนดค�าเริ่มต�นให�กับตัวนับ เป(นส!วนท่ีใช�ในการกําหนดค!าเริ่มต�นให�กับตัวแปรท่ีใช�เป(นตัวนับ เปรียบเทียบตัวนับว�าครบจํานวนรอบท่ีต�องการหรือไม� เป(นส!วนท่ีใช�ตรวจสอบตัวนับว!าครบจํานวนรอบของคําสั่งท่ีต�องทําซํ้าหรือไม! เพ่ิม/ลดค�าตัวนับ เป(นส!วนท่ีใช�ปรับค!าของตัวนับ โดยอาจเป(นการเพ่ิมหรือลดค!าของตัวนับ ส!วนนี้มีความสําคัญท่ีส!งผลให�การเปรียบเทียบตัวนับว!าครบจํานวนท่ีต�องการหรือไม! ซ่ึงมีโอกาสเป(นเท็จได� ไม!เช!นนั้นแล�วอาจจออกจากการทํางานงานวนรอบนี้ไม!ได� ทําให�เกิดการทําคําสั่งท่ีต�องทําซํ้าแบบวนรอบท่ีไม!รู�จบ (Infinite Loop) ข้ึนได� การทํางานของการใช�คําสั่ง for เริ่มจากการทํางานในส!วนแรก โดยการกําหนดค!าเริ่มต�นให�กับตัวนับ ตัวนับในท่ีนี้ เป(นการกําหนดตัวแปรข้ึนมาเพ่ือใช�งานทําหน�าท่ีเป(นตัวนับ จากนั้นนําตัวนับดังกล!าวไปเปรียบเทียบว!าครบจํานวนรอบท่ีต�องการหรือไม! ถ�ายังไม!ครบ ให�ทําคําสั่งท่ีต�องทําซํ้าต!อไป แต!ถ�าครบแล�ว ให�ออกจากคําสั่ง for หรือออกจากการวนรอบของคําสั่ง for ไปทําคําสั่งท่ี n ท่ีอยู!ถัดจากคําสั่ง for ต!อไป

เปรียบเทียบตัวนับ

ครบแล�ว

คําสั่งที่ต�องทาํซํ้า

121

ตัวอย�างท่ี 5.7 โปรแกรมแสดงการใช�คําสั่ง for (1)

01 02 03 04 05 06 07 08 09 10 11 12

#include <stdio.h> int main() { int i; for(i=1; i<5; i++) { printf("i = %d\n", i); } printf("Next command."); return 0; }

ภาพท่ี 5.16 โปรแกรมแสดงการใช�คําสั่ง for (1) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.17

i = 1 i = 2 i = 3 i = 4 Next command.

ภาพท่ี 5.17 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง for (1) จากตัวอย!างนี้ หลังจากประกาศตัวแปร i แล�วเข�าไปทําคําสั่งแบบวนรอบในท่ีนี้คือ คําสั่ง for โดยมีรายละเอียด ดังนี้ - บรรทัดท่ี 4 (int i;) เป(นการประกาศตัวแปร i มีชนิดข�อมูลแบบเลขจํานวนเต็ม ท่ีนํามาใช�เป(นตัวนับของการวนรอบของคําสั่ง for - บรรทัดท่ี 6 (for(i=1; i<5; i++)) เป(นการใช�คําสั่ง for ส!วนแรกเป(นการกําหนดค!าเริ่มต�นให�กับตัวนับ i มีค!าเท!ากับ 1 ส!วนท่ี 2 เป(นการเปรียบเทียบตัวนับ i ว!าครบจํานวน 5 รอบหรือไม! และส!วนท่ี 3 เป(นการเพ่ิมค!าตัวนับ i ข้ึนอีก 1 หากเปรียบเทียบตัวนับแล�วยังไม!ครบจํานวน 5 รอบ ถ�ายังไม!ถึง 5 รอบ (ตัวนับ i ยังมีค!าน�อยกว!า 5) ไปทําคําสั่งท่ีต�องทําซํ้าในท่ีนี้คือ คําสั่งในบรรทัดท่ี 7 จากนั้นย�อนกลับไปทําคําสั่ง for ในบรรทัดท่ี 6 ซ่ึงเพ่ิมค!าตัวนับ i ข้ึนอีก 1 (i++) แล�วเปรียบเทียบตัวนับอีก หากยังไม!ครบจํานวน 5 รอบ ให�ทําไปเรื่อยๆ จนครบจํานวน 5 รอบ จึงข�ามไปทําคําสั่งในบรรทัดท่ี 9 และ 10 ไม!ต�องทําคําสั่งท่ีต�องทําซํ้า(คําสั่งในบรรทัดท่ี 7) - บรรทัดท่ี 7 (printf("i = %d\n", i);) แสดงข�อความ i = ค!าของ i ในแต!ละรอบ

- บรรทัดท่ี 9 (printf("Next command.");) แสดงข�อความ Next command. จากตัวอย!างนี้ สามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต!ละรอบของการวนรอบของคําสั่ง for ดังนี้ รอบท่ี ค�าตัวนับ i

(ส�วนท่ี 1)

ผลการเปรียบเทียบ (i < 5)

(ส�วนท่ี 2)

printf("i = %d\n", i); (ตําแหน�ง � ชี้)

i++; (i = i + 1;) (ส�วนท่ี 3)

1 1 1 < 5 มีค!าความจริงเป(น จริง i = 1 � i = 1 + 1 = 2 2 2 2 < 5 มีค!าความจริงเป(น จริง i = 1

i = 2 � i = 2 + 1 = 3 3 3 3 < 5 มีค!าความจริงเป(น จริง i = 1

i = 2 i = 3 �

i = 3 + 1 = 4

122

รอบท่ี ค�าตัวนับ i

(ส�วนท่ี 1)

ผลการเปรียบเทียบ (i < 5)

(ส�วนท่ี 2)

printf("i = %d\n", i); (ตําแหน�ง � ชี้)

i++; (i = i + 1;) (ส�วนท่ี 3)

4 4 4 < 5 มีค!าความจริงเป(น จริง i = 1 i = 2 i = 3 i = 4 �

i = 4 + 1 = 5

5 5 5 < 5 มีค!าความจริงเป(น เท็จ *** ไม!มีการทํางาน *** *** ไม!มีการทํางาน *** จากตัวอย!างท่ี 5.1 ท่ีใช�คําสั่ง while เปลี่ยนมาใช�คําสั่ง for ผลลัพธBท่ีได�จะเหมือนกัน ตัวอย�างท่ี 5.8 โปรแกรมแสดงการใช�คําสั่ง for (2)

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> int main() { int i; for(i=1; i<=12; i++) { printf("2 x %d \t= %d\n", i, 2*i); } return 0; }

ภาพท่ี 5.18 โปรแกรมแสดงการใช�คําสั่ง for (2) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.19

2 x 1 = 2 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

ภาพท่ี 5.19 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง for (2) จากตัวอย!างนี้ ให�ลองอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต!ละรอบของการวนรอบของคําสั่ง for เอง รอบท่ี ค�าตัวนับ i

(ส�วนท่ี 1)

ผลการเปรียบเทียบ (i <= 12)

(ส�วนท่ี 2)

printf("2 x %d \t= %d\n", i, 2*i); (ตําแหน�ง � ชี้)

i++; (i = i + 1;) (ส�วนท่ี 3)

123

รอบท่ี ค�าตัวนับ i

(ส�วนท่ี 1)

ผลการเปรียบเทียบ (i <= 12)

(ส�วนท่ี 2)

printf("2 x %d \t= %d\n", i, 2*i); (ตําแหน�ง � ชี้)

i++; (i = i + 1;) (ส�วนท่ี 3)

ตัวอย�างท่ี 5.9 โปรแกรมแสดงการใช�คําสั่ง for (3)

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> int main() { int i; for(i=1; i<=5; i++) { printf("%d ", i); } return 0; }

ภาพท่ี 5.20 โปรแกรมแสดงการใช�คําสั่ง for (3) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.21

1 2 3 4 5

ภาพท่ี 5.21 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง for (3) จากตัวอย!างนี้ สามารถอธิบายในลักษณะตารางท่ีแสดงการทํางานในแต!ละรอบของการวนรอบของคําสั่ง for ดังนี้

รอบท่ี ค�าตัวนับ i

(ส�วนท่ี 1)

ผลการเปรียบเทียบ (i<=1)

(ส�วนท่ี 2)

printf("%d ", i); (ตําแหน�งท่ี ชี้)

i++; (i = i + 1;) (ส�วนท่ี 3)

1 1 1 <= 5 มีค!าความจริงเป(น จริง

1

i = 1 + 1 = 2

2 2 2 <= 5 มีค!าความจริงเป(น จริง

1 2

i = 2 + 1 = 3

3 3 3 <= 5 มีค!าความจริงเป(น จริง

1 2 3

i = 3 + 1 = 4

4 4 4 <= 5 มีค!าความจริงเป(น จริง

1 2 3 4

i = 4 + 1 = 5

5 5 5 <= 5 มีค!าความจริงเป(น จริง

1 2 3 4 5

i = 5 + 1 = 6

6 6 6 <= 5 มีค!าความจริงเป(น เท็จ *** ไม!มีการทํางาน *** *** ไม!มีการทํางาน ***

ผลลัพธBสุดท�าย คือ 5 4 3 2 1

124

จากตัวอย!างนี้ เป(นการแสดงตัวเลข 1 2 3 4 5 ท่ีหน�าจอ ใช�คําสั่ง for ในบรรทัดท่ี 6 (for(i=1; i<=5; i++)) มีการนําตัวนับ i มาใช�แสดงตัวเลข 1 2 3 4 5 ด�วย โดยมีรายละเอียดดังนี้ - ส!วนท่ี 1 ของคําสั่ง for (i=1;) เป(นการกําหนดค!าเริ่มต�นให�กับตัวนับ i มีค!าเท!ากับ 1 เนื่องจากใช�ตัวนับ i เพ่ือแสดงผล ซ่ึงในรอบแรกของการวนรอบท่ีแสดงผลคือ 1 จากนั้นในรอบท่ี 2 ซ่ึงได�เพ่ิมค!าของตัวนับ i เพ่ิมข้ึนอีก 1 ทําให�ตัวนับ i มีค!าเป(น 2 ซ่ึงจะนําค!านี้ไปใช�ในการแสดงผลด�วย ทําไปเรื่อยๆ จนครบ 5 รอบ - ส!วนท่ี 2 ของคําสั่ง for (i<=5;) เป(นการตรวจสอบตัวนับว!าครบ 5 รอบของคําสั่งท่ีต�องทําซํ้าหรือไม! หรือเป(นการเปรียบเทียบว!าตัวนับ i ยังมีค!าไม!เกิน 5 ใช!หรือไม! หากยังมีค!าไม!เกิน 5 ก็ยังคงให�ทําคําสั่งท่ีต�องทําซํ้า คําสั่งท่ีต�องทําซํ้าคือ บรรทัดท่ี 7 (printf("%d ", i);) - ส!วนท่ี 3 ของคําสั่ง for (i++) เป(นการเพ่ิมค!าตัวนับ i ข้ึนอีก 1 เนื่องจากใช�ตัวนับ i มาใช�แสดงตัวเลข 1 2 3 4 5 ดังนั้นจึงต�องให�ตัวนับ i เพ่ิมค!าทีละ 1 คือ รอบท่ี 1 ตัวนับ i มีค!าเท!ากับ 1 นําค!า 1 ไปแสดง จากนั้นเพ่ิมค!าตัวนับ i ข้ึนอีก 1 ทําให�มีค!าเป(น 2 นําค!า 2 ไปแสดง ทําไปเรื่อยๆ จนครบ 5 รอบ คําสั่งท่ีต�องทําซํ้าในบรรทัด 7 (printf("%d ", i);) เป(นการนําตัวนับ i ท่ีในแต!ละรอบมีการเพ่ิมตัวนับ i ข้ึนอีก 1 มาใช�แสดงผล ตัวอย�างท่ี 5.10 โปรแกรมแสดงการใช�คําสั่ง for (4)

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> int main() { int i; for(i=5; i>=1; i--) { printf("%d ", i); } return 0; }

ภาพท่ี 5.22 โปรแกรมแสดงการใช�คําสั่ง for (4) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.23

5 4 3 2 1

ภาพท่ี 5.23 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง for (4) จากตัวอย!างนี้ จะเหมือนกับตัวอย!างท่ี 5.9 แต!ตรงกันข�ามกัน คือ เป(นการแสดงตัวเลข 5 4 3 2 1 ท่ีหน�าจอ การใช�คําสั่ง for (for(i=5; i>=1; i--)) ของตัวอย!างนี้ ส!วนท่ี 1 กําหนดค!าเริ่มต�นให�กับตัวนับ i มีค!าเท!ากับ 5 เนื่องจากใช�ตัวนับ i เพ่ือแสดงผล โดยรอบแรกแสดง 5 ส!วนท่ี 2 เป(นการตรวจสอบตัวนับว!าครบ 5 รอบของคําสั่งท่ีต�องทําซํ้าหรือไม! หรือเป(นการเปรียบเทียบว!าตัวนับ i ยังมีค!ามากกว!า 1 ใช!หรือไม! และส!วนท่ี 3 เป(นการลดค!าตัวนับ i ลงอีก 1 เนื่องจากใช�ตัวนับ i มาใช�แสดงตัวเลข 5 4 3 2 1 ดังนั้นจึงต�องให�ตัวนับ i ลดค!าทีละ 1

125

ตัวอย�างท่ี 5.11 โปรแกรมแสดงการใช�คําสั่ง for (5)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> int main() { int a, b, i; printf("Enter 1st number : "); scanf("%d", &a); printf("Enter 2nd number : "); scanf("%d", &b); for(i=a; i<=b; i++) { printf("%d ", i); } return 0; }

ภาพท่ี 5.24 โปรแกรมแสดงการใช�คําสั่ง for (5) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.25 - รันโปรแกรมครั้งท่ี 1 ป̂อนตัวเลขท่ี1 คือ 1 และตัวเลขท่ี 2 คือ 5

Enter 1st number : _

Enter 1st number : 1

Enter 2nd number : _

Enter 1st number : 1

Enter 2nd number : 5

1 2 3 4 5

- รันโปรแกรมครั้งท่ี 2 ป̂อนตัวเลขท่ี1 คือ 3 และตัวเลขท่ี 2 คือ 7

Enter 1st number : _

Enter 1st number : 3

Enter 2nd number : _

Enter 1st number : 3

Enter 2nd number : 7

3 4 5 6 7

ภาพท่ี 5.25 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง for (5) จากตัวอย!างนี้ เป(นการแสดงตัวเลขเรียงตามลําดับโดยแบ!งช!องว!าง 1 ช!อง การแสดงตัวเลขนั้นจะให�แสดงตามท่ีผู�ใช�งานป̂อนผ!านทางคียBบอรBด ตัวเลขท่ี 1 คือ ตัวเลขแรกท่ีให�แสดง ส!วนตัวเลขท่ี 2 คือ ตัวเลขสุดท�ายท่ีให�แสดง ตัวอย�างท่ี 5.12 โปรแกรมแสดงการใช�คําสั่ง for (6)

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> int main() { int a, b, i; printf("Enter 1st number : "); scanf("%d", &a); printf("Enter 2nd number : "); scanf("%d", &b); for(i=a; i<=b; i++) { printf("%d\n", i); } return 0; }

ภาพท่ี 5.26 โปรแกรมแสดงการใช�คําสั่ง for (6) เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.27

126

- รันโปรแกรมครั้งท่ี 1 ป̂อนตัวเลขท่ี1 คือ 1 และตัวเลขท่ี 2 คือ 5

Enter 1st number : _

Enter 1st number : 1

Enter 2nd number : _

Enter 1st number : 1

Enter 2nd number : 5

1

2

3

4

5

- รันโปรแกรมครั้งท่ี 2 ป̂อนตัวเลขท่ี1 คือ 3 และตัวเลขท่ี 2 คือ 7

Enter 1st number : _

Enter 1st number : 3

Enter 2nd number : _

Enter 1st number : 3

Enter 2nd number : 7

3

4

5

6

7

ภาพท่ี 5.27 ผลลัพธBของโปรแกรมแสดงการใช�คําสั่ง for (5) จากตัวอย!างนี้ เหมือนกับตัวอย!างท่ี 5.11 แต!การแสดงตัวเลขจะต!างกัน คือ แสดงในแนวต้ังแทน การแสดงผลที่หน�าจอคอมพิวเตอรO

ภาพท่ี 5.28 ทิศทางการแสดงผลท่ีหน�าจอคอมพิวเตอรB การแสดงผลท่ีหน�าจอคอมพิวเตอรB จะเริ่มแสดงผลในบรรทัดท่ี 1 ในตําแหน!งคอลัมนBแรก(คอลัมนBท่ี 1) ก!อน จากนั้นแสดงผลจากซ�ายไปขวาไปเรื่อยๆ จนกว!าจะเจอคําสั่งท่ีต�องทําให�ข้ึนบรรทัดใหม! (\n) บรรทัดใหม!ในท่ีนี้คือ บรรทัดท่ีอยู!ถัดจากบรรทัดบนลงมา โดยการแสดงผลท่ีหน�าจอคอมพิวเตอรBจะมีทิศทาง คือ จากซ�ายไปขวา และจากบนลงล!าง ดังภาพท่ี 5.28 พิจารณาโปรแกรมการแสดงผลท่ีหน�าจอคอมพิวเตอรB ดังภาพท่ี 5.29

01 02 03 04 05 06 07 08 09 10 11

#include <stdio.h> int main() { printf("a"); printf("bcdefg\n"); printf("1234567890"); printf("XYZ"); return 0; }

ภาพท่ี 5.29 โปรแกรมการแสดงผลท่ีหน�าจอคอมพิวเตอรB

ซ�ายไปขวา

บน ลง ล!าง

127

โปรแกรมนี้ จะมีคําสั่ง printf() ท่ีใช�แสดงผลข�อมูลท่ีหน�าจอ 4 คําสั่ง คือ printf("a"); printf("bcdefg\n"); printf("1234567890"); printf("XYZ\n"); ภาพท่ี 5.30 แสดงผลทีละคําสั่งของคําสั่ง printf() ท่ีมีผลต!อหน�าจอ ก. printf("a"); ข. printf("bcdefg\n"); ค. printf("1234567890"); ง. printf("XYZ\n");

ภาพท่ี 5.30 แสดงหน�าจอของแต!ละคําสั่ง printf() ภาพท่ี 5.30 (ก) คําสั่ง printf("a"); เป(นคําสั่งแรกท่ีใช�แสดงผล โดยแสดงข�อความ a ท่ีบรรทัดแรกในคอลัมนBแรกของหน�าจอ โดยตําแหน!งของเคอรBเซอรBจะรออยู!ท่ีท�ายข�อความในคอลัมนBท่ี 2 จากนั้นคําสั่งถัดไปคือ คําสั่ง printf("bcdefg\n"); ทํางาน แสดงข�อความ bcdefg ท่ีตําแหน!งของเคอรBเซอรBรออยู! คําสั่งนี้เม่ือแสดงข�อความเสร็จแล�วให�ข้ึนบรรทัดใหม! ในท่ีนี้คือ บรรทัดท่ี 2 ตําแหน!งของเคอรBเซอรBรออยู!ท่ีบรรทัดท่ี 2 ในคอลัมนBแรก ดังภาพท่ี 5.34 (ข) จากนั้นคําสั่งถัดไปคือ คําสั่ง printf("1234567890"); ทํางาน แสดงข�อความ 1234567890 ท่ีตําแหน!งของเคอรBเซอรBรออยู! ดังภาพท่ี 5.34 (ค) คําสั่งนี้เม่ือแสดงข�อความเสร็จแล�ว ไม!ต�องข้ึนบรรทัดใหม! คือ ตําแหน!งของเคอรBเซอรBรออยู!ท�ายข�อความ 1234567890 คือ เคอรBเซอรBรออยู!ท่ีบรรทัดท่ี 3 ในคอลัมนBท่ี 11 และคําสั่งสุดท�ายคือ คําสั่ง printf("XYZ\n"); ทํางาน แสดงข�อความ XYZ ต!อจากข�อความ 1234567890 คําสั่งนี้เม่ือแสดงข�อความเสร็จแล�ว จะต�องข้ึนบรรทัดใหม! ในท่ีนี้คือ บรรทัดท่ี 3 ตําแหน!งของเคอรBเซอรBรออยู!ท่ีบรรทัดท่ี 3 ในคอลัมนBแรก ดังภาพท่ี 5.34 (ง) การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบซ�อนกัน จากท่ีได�อธิบายไปเก่ียวกับการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบข�างต�น ไม!ว!าจะเป(นแบบวนรอบแบบทดสอบเง่ือนไขก!อน แบบวนรอบแบบทดสอบเง่ือนไขทีหลัง หรือแบบวนรอบแบบจํานวนรอบท่ีแน!นอน จะเป(นการวนรอบแบบอย!างง!ายท่ีไม!มีการวนรอบซ�อนกัน คือ มีการใช�คําสั่ง while, do while หรือ for เพียงคําสั่งเดียว แต!ในการเขียนโปรแกรมท่ัวๆ ไป อาจจะมีการเขียนโปรแกรมแบบวนรอบซ�อนกัน คือ มีการใช�คําสั่งแบบวนรอบมากกว!า 1 คําสั่งได� เพ่ือให�เข�าใจการเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบซ�อนกันมากข้ึน ให�ศึกษาตัวอย!างท่ี 5.13 ถึง 5.16 ดังต!อไปนี้

a_ abcdefg _

abcdefg 1234567890_

abcdefg

1234567890XYZ _

128

ตัวอย�างท่ี 5.13 จงเขียนโปรแกรมเพ่ือแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ดังภาพท่ี 5.31

123 123 123

ภาพท่ี 5.31 แสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม จากโจทยBนี้ ถ�าผู�เริ่มเขียนโปรแกรมคิดแบบง!ายๆ ก็จะเขียนโปรแกรม ดังภาพท่ี 5.32

01 02 03 04 05 06 07 08 09 10

#include <stdio.h> int main() { printf("123\n"); printf("123\n"); printf("123"); return 0; }

ภาพท่ี 5.32 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม จะได�ผลลัพธBตามท่ีโจทยBต�องการ แต!ถ�าโจทยBกําหนดเพ่ิมเติมว!า ต�องนําโครงสร�างแบบวนรอบมาใช�ด�วยคือ ใช�คําสั่ง while, do while หรือ for มาใช�ในการเขียนโปรแกรมด�วย ผู�เริ่มเขียนโปรแกรมจะต�องเขียนอย!างไร จากโจทยBนี้ สามารถแยกข�อมูลท่ีแสดงท่ีหน�าจอได� ดังนี้ - บรรทัดท่ี 1 แสดง 123 - บรรทัดท่ี 2 แสดง 123 - บรรทัดท่ี 3 แสดง 123 หมายเหตุ แสดง 123 หมายความว!า แสดง 1 ตามด�วยแสดง 2 และสุดท�ายแสดง 3 ไม!ใช!แสดง 123 ทีเดียว จากหัวข�อการแสดงผลท่ีหน�าจอคอมพิวเตอรB ทําให�ทราบว!า ทิศทางการแสดงผลท่ีหน�าจอคอมพิวเตอรB เริ่มจากซ�ายไปขวาและจากบนลงล!าง หมายความว!า โปรแกรมต�องแสดงผลบรรทัดท่ี 1 โดยแสดงข�อมูลในบรรทัดท่ี 1 ให�ครบ คือ แสดง 1 แสดง 2 และแสดง 3 จากนั้นข้ึนบรรทัดใหม!คือ บรรทัดท่ี 2 โปรแกรมต�องแสดงผลบรรทัดท่ี 2 โดยแสดงข�อมูลในบรรทัดท่ี 2 ให�ครบ คือ แสดง 1 แสดง 2 และแสดง 3 สุดท�ายโปรแกรมต�องแสดงผลบรรทัดท่ี 3 โดยแสดงข�อมูลในบรรทัดท่ี 3 ให�ครบ คือ แสดง 1 แสดง 2 และแสดง 3 ถือว!าจบการทํางานของโปรแกรม ในการแสดงผลแต!ละบรรทัด คือ บรรทัดท่ี 1 ไปบรรทัดท่ี 2 และไปบรรทัดท่ี 3 ถ�าสังเกตให�ดีจะพบว!า เลขท่ีบรรทัดเรียงต!อกัน คือ 1, 2 และ 3 เหมือนกับการวนรอบ จากรอบท่ี 1 ไปรอบท่ี 2 และไปรอบท่ี 3 นั่นเอง หมายความว!า สามารถนําคําสั่งแบบวนรอบมาใช�ได� ในท่ีนี้ใช�คําสั่ง for แทน เพราะทราบจํานวนรอบท่ีแน!นอน คือ เริ่มต�นท่ี 1 และสิ้นสุดท่ี 3 โดยในส!วนแรกของคําสั่ง for (ใช�ตัวนับ i) จะได� i=1; ส!วนท่ี 2 ของคําสั่ง for จะได� i<=3; และส!วนท่ี 3 ของคําสั่ง for จะได� i++ ซ่ึงนํามาเขียนเป(นโปรแกรมอย!างคร!าวๆ ได�ดังนี้ int i; for(i=1; i<=3; i++) { }

129

จากโปรแกรมอย!างคร!าวๆ นี้ เม่ือตัวนับ i มีค!าเท!ากับ 1 หมายถึง บรรทัดท่ี 1 ตัวนับ i มีค!าเท!ากับ 2 หมายถึง บรรทัดท่ี 2 และตัวนับ i มีค!าเท!ากับ 3 หมายถึง บรรทัดท่ี 3 นั่นเอง จากนั้นให�มาพิจารณาต!อว!า ในแต!ละบรรทัดนั้นท่ีต�องแสดง 1 แสดง 2 และแสดง 3 จะแสดงได�อย!างไร สังเกตข�อมูลท่ีแสดงดังกล!าว เป(นการเรียงต!อกัน คือ 1, 2 และ 3 เหมือนกับการวนรอบในส!วนของแต!ละบรรทัดท่ีได�อธิบายไปในข�างต�น หมายความว!า ให�นําคําสั่ง for มาใช� เพราะทราบจํานวนรอบท่ีแน!นอน คือ เริ่มต�นท่ี 1 และสิ้นสุดท่ี 3 โดยในส!วนแรกของคําสั่ง for (ใช�ตัวนับ j) จะได� j=1; ส!วนท่ี 2 ของคําสั่ง for จะได� j<=3; และส!วนท่ี 3 ของคําสั่ง for จะได� j++ และใช�คําสั่ง printf() ในการแสดงข�อมูล ซ่ึงข�อมูลท่ีแสดงต�องตรงกับการวนรอบคือ รอบท่ี 1 (เม่ือตัวนับ j มีค!าเท!ากับ 1) แสดง 1 รอบท่ี 2 (เม่ือตัวนับ j มีค!าเท!ากับ 2) แสดง 2 และรอบท่ี 3 (เม่ือตัวนับ j มีค!าเท!ากับ 3) แสดง 3 หมายความว!า สามารถนําตัวนับ j มาใช�ในการแสดงผลคือ คําสั่ง printf("%d", j); ซ่ึงนํามาเขียนเป(นโปรแกรมอย!างคร!าวๆ ได� ดังนี้ int j; for(j=1; j<=3; j++) { printf("%d", j); } จากโปรแกรมอย!างคร!าวๆ ท้ัง 2 ส!วน เม่ือต�องนํามารวมกัน จะรวมกันอย!างไร ให�สังเกต - ส!วนท่ี 1 เป(นการวนรอบของบรรทัด จะนําไปไว�ในการวนรอบรอบนอก - ส!วนท่ี 2 เป(นการวนรอบของการแสดงผลในแต!ละบรรทัด จะนําไปไว�ในการวนรอบรอบใน เม่ือนําท้ัง 2 ส!วนมารวมกัน จะได�ดังนี้ int i; int j; for(i=1; i<=3; i++) { for(j=1; j<=3; j++) { printf("%d", j); } } ลองนําไปเขียนโปรแกรมท้ังหมดและรันโปรแกรมว!า จะได�ผลลัพธBตามท่ีต�องการหรือไม! ดังภาพท่ี 5.33

01 02 03 04 05 06 07 08 09 10 11 12 13

#include <stdio.h> int main() { int i,j; for(i=1; i<=3; i++) { for(j=1; j<=3; j++) { printf("%d", j); } } return 0; }

ภาพท่ี 5.33 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 1 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.34

130

123123123

ภาพท่ี 5.34 ผลลัพธBของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 1 การแสดงผลลัพธBท่ีได�นั้น ข�อมูลท่ีแสดงครบถ�วน แต!ยังไม!ถูกต�อง คือ แสดง 123123123 ถ�าดูจากผลลัพธBท่ีแสดง จะเห็นว!า เม่ือแสดง 123 แรกแล�ว แต!ไม!ได�สั่งให�ข้ึนบรรทัดใหม! เช!นเดียวกันแสดง 123 ท่ีสอง ก็ยังไม!ได�สั่งให�ข้ึนบรรทัดใหม! ดังนั้นคําสั่งท่ีสั่งให�ข้ึนบรรทัดใหม!คือ รหัสควบคุม \n จะต�องนําไปใส!ไว�ตรงไหนของโปรแกรม ให�พิจารณาว!า เม่ือแสดง 123 แรกแล�ว จะต�องสั่งให�ข้ึนบรรทัดใหม! คือ ตรงส!วนนี้ หมายความว!า การวนรอบรอบนอก(ใช�ตัวนับ i จะเรียกว!า for i) เม่ือตัวนับ i มีค!าเท!ากับ 1 และการวนรอบรอบใน(ใช�ตัวนับ j จะเรียกว!า for j) หากรอบในวนรอบครบรอบท่ี 3 (ครอบรอบท่ี 3 คือ แสดง 123 ครบ) สั่งให�ข้ึนบรรทัดใหม! ในท่ีนี้ใช�คําสั่ง printf("\n"); โดยนําไปไว�หลังจากการใช�คําสั่ง for j ซ่ึงก็คือ แทรกระหว!างบรรทัดท่ี 8 และ 9 ดังภาพท่ี 5.35

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> int main() { int i,j; for(i=1; i<=3; i++) { for(j=1; j<=3; j++) { printf("%d", j); } printf("\n"); } return 0; }

ภาพท่ี 5.35 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 2 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.36

123 123 123

ภาพท่ี 5.36 แสดงตัวเลข 123 ในลักษณะรูปสี่เหลี่ยม ครั้งท่ี 2 ตัวอย�างท่ี 5.14 จงเขียนโปรแกรมเพ่ือแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยม ดังภาพท่ี 5.37

1 12 123

ภาพท่ี 5.37 ผลลัพธBของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยม จากโจทยBนี้ จะเหมือนกับโจทยBท่ี 1 แต!ข�อมูลท่ีแสดงจะต!างกัน ซ่ึงสามารถแยกข�อมูลท่ีแสดงท่ีหน�าจอได� ดังนี้ - บรรทัดท่ี 1 แสดง 1 - บรรทัดท่ี 2 แสดง 12 - บรรทัดท่ี 3 แสดง 123

คําสั่งท่ีสั่งให�ข้ึนบรรทัดใหม!

การวนรอบรอบนอก หรือ for i การวนรอบรอบใน หรือ for j

131

สังเกตความสัมพันธBระหว!างเลขท่ีบรรทัดกับข�อมูลท่ีแสดง คือ - บรรทัดท่ี 1 แสดง 1 หมายความว!า ตัวนับ i ของ for i มีค!าเท!ากับ 1 จะเท!ากับตัวนับ j ของ for j มีค!าเท!ากับ 1 เช!นกัน และจํานวนรอบของ for i มี 1 รอบ แสดงค!าของตัวนับ j คือ 1 - บรรทัดท่ี 2 แสดง 12 หมายความว!า ตัวนับ i ของ for i มีค!าเท!ากับ 2 จะเท!ากับตัวนับ j ของ for j มีค!าเท!ากับ 2 เช!นกัน และจํานวนรอบของ for i มี 2 รอบ แสดงค!าของตัวนับ j รอบท่ี 1 คือ 1 และรอบท่ี 2 คือ 2 - บรรทัดท่ี 3 แสดง 123 หมายความว!า ตัวนับ i ของ for i มีค!าเท!ากับ 3 จะเท!ากับตัวนับ j ของ for j มีค!าเท!ากับ 3 เช!นกัน และจํานวนรอบของ for i มี 3 รอบ แสดงค!าของตัวนับ j รอบท่ี 1 คือ 1 รอบท่ี 2 คือ 2 และรอบท่ี 3 คือ 3 จากความสัมพันธBระหว!างเลขท่ีบรรทัดกับข�อมูลท่ีแสดงดังกล!าว หมายความว!า สามารถนําตัวนับ i ของ for i มาใช�ในการกําหนดจํานวนรอบของ for j ได�คือ ใน for j จะเขียนคําสั่งได� ดังนี้ int j; for(j=1; j<=i; j++) { } และสามารถนําตัวนับ j มาใช�ในการแสดงผลคือ คําสั่ง printf("%d", j); ซ่ึงนํามาเขียนเป(นโปรแกรมอย!างคร!าวๆ ได� ดังนี้ int j; for(j=1; j<=i; j++) { printf("%d", j); } ดังนั้น โจทยBนี้สามารถเขียนโปรแกรมได� ดังภาพท่ี 5.38

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> int main() { int i,j; for(i=1; i<=3; i++) { for(j=1; j<=i; j++) { printf("%d", j); } printf("\n"); } return 0; }

ภาพท่ี 5.38 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยม เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.39

1 12 123

ภาพท่ี 5.39 ผลลัพธBของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยม

ส!วนท่ี 2 ของคําสั่ง for การกําหนดจํานวนรอบจะใช�ตัวนับ i ของ for i

132

จากตัวอย!างท่ี 5.13 และ 5.14 เป(นการเขียนโปรแกรมแบบวนรอบซ�อนกันแบบเพ่ิมค!า แต!ตัวอย!างท่ี 5.15 และ 5.16 เป(นการเขียนโปรแกรมแบบวนรอบซ�อนกันแต!เป(นแบบลดค!า ตัวอย�างท่ี 5.15 จงเขียนโปรแกรมเพ่ือแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยมกลับหัว ดังภาพท่ี 5.40

123 12 1

ภาพท่ี 5.40 แสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยมกลับหัว จากโจทยBนี้ สามารถแยกข�อมูลท่ีแสดงท่ีหน�าจอได� ดังนี้ - บรรทัดท่ี 1 แสดง 123 - บรรทัดท่ี 2 แสดง 12 - บรรทัดท่ี 3 แสดง 1 สังเกตความสัมพันธBระหว!างเลขท่ีบรรทัดกับข�อมูลท่ีแสดง จะพิจารณายากสําหรับโจทยBข�อนี้ แต!ลองเปลี่ยนการวนรอบของเลขท่ีบรรทัด คือ ตัวนับ i ของ for i ในส!วนท่ี 1 ให�ตัวนับ i เริ่มต�นท่ี 3 คือ i=3; ในส!วนท่ี 2 การกําหนดจํานวนรอบ คือ 3 รอบเท!าเดิม แต!คําสั่งท่ีใช�ต�องใช�คําสั่งแบบนี้ คือ i>=1; เนื่องจากเม่ือตัวนับ i เริ่มต�นท่ี 3 ในรอบแรก รอบท่ี 2 ตัวนับ i ต�องมีค!าเท!ากับ 2 และรอบท่ี 3 ตัวนับ i ต�องมีค!าเท!ากับ 1 ซ่ึงหมายความว!า เป(นการวนรอบแบบลดค!านั่นเอง คือ ในส!วนท่ี 3 ใช�คําสั่ง i-- ดังนั้นสามารถเขียนคําสั่ง for ของ for i ท้ังหมดได�ดังนี้ int i; for(i=3; i>=1; i--) { } ดังนั้นสังเกตความสัมพันธBระหว!างเลขท่ีบรรทัดกับข�อมูลท่ีแสดงใหม! จะได�ดังนี้ - บรรทัดท่ี 1 แสดง 123 หมายความว!า ตัวนับ i ของ for i มีค!าเท!ากับ 3 เท!ากับตัวนับ j ของ for j มีค!าเท!ากับ 3 เช!นกัน และจํานวนรอบของ for i มี 3 รอบ แสดงค!าของตัวนับ j รอบท่ี 1 คือ 1 รอบท่ี 2 คือ 2 และรอบท่ี 3 คือ 3 - บรรทัดท่ี 2 แสดง 12 หมายความว!า ตัวนับ i ของ for i มีค!าเท!ากับ 2 เท!ากับตัวนับ j ของ for j มีค!าเท!ากับ 2 เช!นกัน และจํานวนรอบของ for i มี 2 รอบ แสดงค!าของตัวนับ j รอบท่ี 1 คือ 1 และรอบท่ี 2 คือ 2 - บรรทัดท่ี 3 แสดง 1 หมายความว!า ตัวนับ i ของ for i มีค!าเท!ากับ 1 เท!ากับตัวนับ j ของ for j มีค!าเท!ากับ 1 เช!นกัน และจํานวนรอบของ for i มี 1 รอบ แสดงค!าของตัวนับ j คือ 1 จากความสัมพันธBระหว!างเลขท่ีบรรทัดกับข�อมูลท่ีแสดงดังกล!าว หมายความว!า สามารถนําตัวนับ i ของ for i มาใช�ในการกําหนดจํานวนรอบของ for j ได�คือ ใน for j เขียนคําสั่งได� ดังนี้ int j; for(j=1; j<=i; j++) { printf("%d", j); } เม่ือนําท้ัง 2 ส!วนมารวมกัน จะได�ดังนี้ int i; int j; for(i=3; i>=1; i--) {

133

for(j=1; j<=i; j++) { printf("%d", j); } printf("\n"); } ลองนําไปเขียนโปรแกรมท้ังหมดและรันโปรแกรมว!า จะได�ผลลัพธBตามท่ีต�องการหรือไม! ดังภาพท่ี 5.41

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> int main() { int i,j; for(i=3; i>=1; i--) { for(j=1; j<=i; j++) { printf("%d", j); } printf("\n"); } return 0; }

ภาพท่ี 5.41 โปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยมกลับหัว เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.42

123 12 1

ภาพท่ี 5.42 ผลลัพธBของโปรแกรมแสดงตัวเลข 123 ในลักษณะรูปสามเหลี่ยมกลับหัว ตัวอย�างท่ี 5.16 จงเขียนโปรแกรมเพ่ือแสดงตัวเลข 321 ในลักษณะรูปสามเหลี่ยม ดังภาพท่ี 5.43

3 32 321

ภาพท่ี 5.43 แสดงตัวเลข 321 ในลักษณะรูปสามเหลี่ยม จากโจทยBนี้ สามารถแยกข�อมูลท่ีแสดงท่ีหน�าจอได� ดังนี้ - บรรทัดท่ี 1 แสดง 3 - บรรทัดท่ี 2 แสดง 32 - บรรทัดท่ี 3 แสดง 321 สังเกตความสัมพันธBระหว!างเลขท่ีบรรทัดกับข�อมูลท่ีแสดง เหมือนกับโจทยBข�อท่ี 3 คือ ท้ังการวนรอบนอกและการวนรอบใน จะเป(นการวนรอบแบบลดค!า ดังนั้นสามารถเขียนคําสั่ง for ของ for i ท้ังหมดได�ดังนี้ int i; for(i=3; i>=1; i--) { } และสามารถเขียนคําสั่ง for ของ for j ท้ังหมดได�ดังนี้ int j;

134

for(j=3; j>=i; j--) { printf("%d", j); } เม่ือนําท้ัง 2 ส!วนมารวมกัน จะได�ดังนี้ int i; int j; for(i=3; i>=1; i--) { for(j=3; j>=i; j++) { printf("%d", j); } printf("\n"); } ลองนําไปเขียนโปรแกรมท้ังหมดและรันโปรแกรมว!า จะได�ผลลัพธBตามท่ีต�องการหรือไม! ดังภาพท่ี 5.44

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> int main() { int i,j; for(i=3; i>=1; i--) { for(j=3; j>=i; j--) { printf("%d", j); } printf("\n"); } return 0; }

ภาพท่ี 5.44 โปรแกรมแสดงตัวเลข 321 ในลักษณะรูปสามเหลี่ยม เม่ือรันโปรแกรมนี้ จะได�ผลลัพธBดังภาพท่ี 5.45

3 32 321

ภาพท่ี 5.45 ผลลัพธBของโปรแกรมแสดงตัวเลข 321 ในลักษณะรูปสามเหลี่ยม จากโจทยBท้ังสี่ข�อจะเห็นได�ว!า การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบซ�อนกันสามารถช!วยในการแก�ปnญหาท่ีซับซ�อน(การวนรอบแบบซ�อนกัน) ได� แต!สําหรับผู�เริ่มเขียนโปรแกรมจําเป(นต�องฝpกการวิเคราะหBปnญหาดังกล!าวให�ได�ว!า โจทยBท่ีกําหนดมานั้นมีวิธีการเขียนโปรแกรมได�อย!างไร พยายามหาโจทยBต!างๆ มาฝpกเขียนให�ได�มากท่ีสุด เพ่ือเพ่ิมทักษะการเขียนโปรแกรมให�มีประสิทธิภาพมากยิ่งข้ึน สรุป ในบทเรียนนี้ได�อธิบายถึง การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบจะมีมีลักษณะการทํางานแบบวนรอบหรือวนซํ้าหรือทําซํ้า โดยต�องทําคําสั่งท่ีต�องการทําหรือประมวลผลซํ้าหลายครั้งตามเง่ือนไขท่ีได�ระบุไว� การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบนี้ แบ!งได�เป(น 3 ชนิดคือ การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขก!อน การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบทดสอบเง่ือนไขทีหลัง และ การเขียนโปรแกรมเชิงโครงสร�างแบบวนรอบแบบจํานวนรอบท่ีแน!นอน รวมถึงยังมีการเขียนโปรแกรมเชิง

135

โครงสร�างแบบวนรอบซ�อนกันด�วย นอกจากนี้ยังได�อธิบายการแสดงผลท่ีหน�าจอคอมพิวเตอรBเพ่ือให�รู�ว!าทิศทางการแสดงผลบนหน�าจอเริ่มจากซ�ายไปขวาและจากบนลงล!าง เพ่ือให�ผู�เขียนโปรแกรมสามารถควบคุมการแสดงผลได�ตามท่ีต�องการ

136

คําถามทบทวน 1. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

i = 1 i = 3 i = 5 i = 7 i = 9 Next command.

2. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

2 4 6 8

3. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

22222 44444 66666 88888

4. จงเขียนโปรแกรมเพ่ือแสดงสูตรคูณตามแม!สูตรคูณท่ีรับผ!านทางคียBบอรBด แสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

Enter multiplier = _

Enter multiplier = 2

2 x 1 = 2 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

หรือ

Enter multiplier = _

Enter multiplier = 5

5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 5 x 10 = 50 5 x 11 = 55 5 x 12 = 60

5. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

137

1

13 135 1357

6. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

2468

246 24 2

7. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

1 2 3 4 5

8. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

1* 2** 3*** 4**** 5*****

9. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

* *** ***** *******

10. จงเขียนโปรแกรมเพ่ือแสดงผลลัพธBท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

* ** *** ****

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall.

แผนบริหารการสอนประจําบทท่ี 6 หัวข�อเน้ือหาประจําบท 1. ทําความรู�จักกับตัวแปรอาเรย� 2. ตัวแปรอาเรย� 1 มิติ 3. ตัวแปรอาเรย� 2 มิติ 4. ตัวแปรอาเรย�หลายมิติ วัตถุประสงค! เม่ือผู�เรียนศึกษาบทเรียนจบแล�ว จะมีความสามารถดังนี้ 1. อธิบายความแตกต-างระหว-างตัวแปรอาเรย�กับตัวแปรท่ัวไปได� 2. อธิบายรายละเอียดของตัวแปรอาเรย� 1 มิติได� 3. เขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย� 1 มิติได� 4. อธิบายรายละเอียดของตัวแปรอาเรย� 2 มิติได� 5. เขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย� 2 มิติได� 6. อธิบายรายละเอียดของตัวแปรอาเรย�หลายมิติได� กิจกรรมการเรียนการสอน 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย� 1 มิติ โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย-างโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย� 1 มิติ 2. อธิบายการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย� 2 มิติ โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย-างโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย� 2 มิติ 3. แบ-งผู�เรียนออกเป7นกลุ-ม โดยปฏิบัติตามใบงานท่ี 6 ดังนี้ 3.1 ให�ผู�เรียนฝ;กปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปร 1 มิติ 3.2 ให�ผู�เรียนฝ;กปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปร 2 มิติ 3.3 ให�ตัวแทนแต-ละกลุ-มออกมานําเสนอผลการปฏิบัติตามใบงาน และร-วมกันอภิปรายว-าโปรแกรมท่ีเขียนข้ึนมานั้นเป7นอย-างไร 4. ร-วมกันสรุปความรู�เก่ียวกับการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย� จากนั้นซักถามผู�เรียน รวมถึงให�ผู�เรียนตอบคําถามทบทวน สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 6 4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน

140

3. สังเกตการณ�ปฏิบัติงานกลุ-ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝ;กหัด

บทท่ี 6 ตัวแปรอาเรย�

บทนํา ตัวแปรอาเรย�เป นตัวแปรประเภทหนึ่งท่ีมีความสําคัญต�อการเขียนโปรแกรมเป นอย�างมาก บทนี้จะได%ทําความรู%จักกับตัวแปรอาเรย�ว�าเป นอย�างไร และตัวแปรอาเรย�มีก่ีประเภท นอกจากนี้หากต%องการเก็บข%อความท่ีประกอบด%วยตัวอักขระมากกว�า 1 ตัว จะทําได%อย�างไร ทําความรู�จักกับตัวแปรอาเรย� ผู%เริ่มเขียนโปรแกรมคงคุ%นเคยกับตัวแปรมากันบ%างแล%วจากบทก�อนหน%านี้ โดยท่ัวไปการกําหนดค�าให%กับตัวแปรทําได%เพียงค�าเดียวเท�านั้น เช�น int num; num = 5; เป นการประกาศตัวแปร num มีชนิดข%อมูลแบบเลขจํานวนเต็มประเภท int และกําหนดค�าให%กับตัวแปร num คือ 5 หากต%องการเปลี่ยนค�าของตัวแปร num ใหม� คือ เปลี่ยนจาก 5 เป น 8 สามารถทําได% ดังนี้ num = 8; ตัวแปร num จึงมีค�าเท�ากับ 8 ทันที ซ่ึงหมายความว�า ตัวแปร num เก็บค�าได%เพียงค�าเดียวเท�านั้น เม่ือนํามาเขียนเป นโปรแกรมรับตัวเลขผ�าน 1 ตัวแปร ดังตัวอย�างท่ี 6.1 ตัวอย#างท่ี 6.1 โปรแกรมรับตัวเลขผ�าน 1 ตัวแปร

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> int main() { int num; printf("1st number : "); scanf("%d", &num); printf("num is %d\n\n", num); printf("2nd number : "); scanf("%d", &num); printf("num is %d", num); return 0; }

ภาพท่ี 6.1 โปรแกรมรับตัวเลขผ�าน 1 ตัวแปร เม่ือรันโปรแกรมนี้ จะได%ผลลัพธ�ดังภาพท่ี 6.2

1st number : _

1st number : 5

1st number : 5 num is 5

1st number : 5 num is 5 2nd number : _

1st number : 5 num is 5 2nd number : 8

1st number : 5 num is 5 2nd number : 8 num is 8

ภาพท่ี 6.2 ผลลัพธ�ของโปรแกรมรับตัวเลขผ�าน 1 ตัวแปร

142

แต�ถ%าต%องการเขียนโปรแกรมในการรับค�าผ�านทางคีย�บอร�ดจํานวนมาก เช�น ต%องการรับค�าคะแนนสอบของวิชาภาษาอังกฤษเพ่ือการสื่อสารของนักศึกษาห%องหนึ่งจํานวน 20 คน เพ่ือทําการตัดเกรด คงต%องประกาศตัวแปรเพ่ือใช%งาน ดังนี้ int point1, point2, point3, point4, point5, point6, point7, point8, point9, point10, point11, point12, point13, point14, point15, point16, point17, point18, point19, point20; เม่ือนํามาเขียนเป นโปรแกรมรับคะแนนของนักศึกษา 20 คน ดังตัวอย�างท่ี 6.2 ตัวอย#างท่ี 6.2 โปรแกรมรับคะแนนของนักศึกษา 20 คน

01 02 03 04 05 06 07 08 09 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

#include <stdio.h> int main() { int point1, point2, point3, point4, point5, point6, point7, point8, point9, point10, point11, point12, point13, point14, point15, point16, point17, point18, point19, point20; printf("Student 1 : "); scanf("%d", &point1); printf("Student 2 : "); scanf("%d", &point2); printf("Student 3 : "); scanf("%d", &point3); printf("Student 4 : "); scanf("%d", &point4); printf("Student 5 : "); scanf("%d", &point5); printf("Student 6 : "); scanf("%d", &point6); printf("Student 7 : "); scanf("%d", &point7); printf("Student 8 : "); scanf("%d", &point8); printf("Student 9 : "); scanf("%d", &point9); printf("Student 10 : "); scanf("%d", &point10); printf("Student 11 : "); scanf("%d", &point11); printf("Student 12 : "); scanf("%d", &point12); printf("Student 13 : "); scanf("%d", &point13); printf("Student 14 : "); scanf("%d", &point14); printf("Student 15 : "); scanf("%d", &point15); printf("Student 16 : "); scanf("%d", &point16); printf("Student 17 : "); scanf("%d", &point17); printf("Student 18 : "); scanf("%d", &point18); printf("Student 19 : "); scanf("%d", &point19); printf("Student 20 : "); scanf("%d", &point20); return 0; }

ภาพท่ี 6.3 โปรแกรมรับคะแนนของนักศึกษา 20 คน เม่ือต%องการรับค�าคะแนนของนักศึกษา 20 คน โดยรับค�าผ�านตัวแปร 20 ตัวดังตัวอย�างนี้ จะเห็นได%ว�า ผู%เขียนโปรแกรมต%องใช%ฟEงก�ชั่น scanf() ในการรับคะแนน 20 คําสั่งโดยรับผ�านตัวแปร 20 ตัวท่ีได%กําหนดข้ึนมา สังเกตจํานวนบรรทัดของโปรแกรมมีมากถึง 51 บรรทัด โดยตัวอย�างนี้ยังไม�ได%นําตัวแปรดังกล�าวไปประมวลผลต�อ อย�างไรก็ตามหากนักศึกษาห%องนี้มีมากกว�า 20 คน เช�น 50 หรือ 100 คน ทําให%โปรแกรมต%องมีการ

143

ประกาศตัวแปรเพ่ือใช%งานมากข้ึน และทําให%จํานวนบรรทัดของโปรแกรมมากยิ่งข้ึนเช�นกัน ส�งผลทําให%การนําตัวแปรดังกล�าวไปใช%ประมวลผลต�อ คงทําให%เกิดความยุ�งยากและลําบากพอสมควร เพ่ือแก%ปEญหาของการเขียนโปรแกรมดังกล�าว ภาษาซีได%จัดให%มีตัวแปรอาเรย�ข้ึนมาใช%งาน โดยผู%เขียนโปรแกรมเพียงแค�ประกาศตัวแปรอาเรย�เพียงตัวเดียวต�อจํานวนข%อมูลท่ีต%องการ จากตัวอย�างของการรับค�าคะแนนสอบของนักศึกษาจํานวน 20 คน สามารถประกาศตัวแปรอาเรย�เพ่ือใช%งานได%ดังนี้ int point[20]; เป นการประกาศตัวแปร point เป นตัวแปรอาเรย� 1 ตัว แต�สามารถเก็บค�าคะแนนได%ถึง 20 คะแนน ทําให%ประหยัดจํานวนตัวแปรท่ีใช%งาน ส�วนการรับค�าคะแนนด%วยฟEงก�ชั่น scanf() นั้นใช%ร�วมกับคําสั่งท่ีใช%ในการวนรอบ เช�น while, do while หรือ for ดังนี้ int point[20]; int i=1; while(i<=20) { printf("Student %d", i); scanf("%d", &point[i]); i++; } คําสั่งนี้จะรับค�าคะแนนผ�านทางคีย�บอร�ดโดยการวนรอบ 20 รอบ เม่ือนํามาเขียนเป นโปรแกรมรับคะแนนของนักศึกษา 20 คน ดังตัวอย�างท่ี 6.3 ตัวอย#างท่ี 6.2 โปรแกรมรับคะแนนของนักศึกษา 20 คนโดยใช%ตัวแปรอาเรย�

01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <stdio.h> int main() { int point[20]; int i=0; while(i<20) { printf("Student %d : ", i+1); scanf("%d", &point[i]); i++; } return 0; }

ภาพท่ี 6.4 โปรแกรมรับคะแนนของนักศึกษา 20 คนโดยใช%ตัวแปรอาเรย� การทํางานของตัวอย�างท่ี 6.3 เหมือนกับตัวอย�างท่ี 6.2 แต�จํานวนตัวแปรท่ีใช%รับค�ามีเพียงตัวเดียวและจํานวนบรรทัดใช%เพียง 14 บรรทัดเท�านั้น เพ่ือให%เห็นภาพชัดของการจัดเก็บข%อมูลของตัวแปรและตัวแปรอาเรย� พิจารณาภาพท่ี 6.5 แสดงการเปรียบเทียบตัวแปรท่ัวไปกับตัวแปรอาเรย�ในการเก็บค�า ก. ตัวแปรท่ัวไป ข. ตัวแปรอาเรย�

ภาพท่ี 6.5 การเปรียบเทียบตัวแปรท่ัวไปกับตัวแปรอาเรย�ในการเก็บค�า

คําสั่งท่ีใช%รับค�าคะแนน 20 คะแนน

A 4 B 5 6 2 9 4

144

จากภาพท่ี 6.4 ตัวแปรท่ัวไป เก็บข%อมูลได%เพียงค�าเดียว ส�วนตัวแปรอาเรย� เก็บข%อมูลได%มากกว�าหนึ่งค�า ตัวแปรอาเรย�เปรียบเสมือนเป นอาคารพาณิชย�หรือตึกแถวท่ีมีการแบ�งเป นห%องๆ เช�น ภาพท่ี 6.4 (ข) แบ�งเป น 5 ห%องหรือมีขนาด 5 ช�องนั่นเอง ตัวแปรอาเรย� (Array Variable) คือ ชุดของตัวแปรท่ีมีชนิดข%อมูลเดียวกัน ตัวแปรอาเรย�ประกอบด%วยสมาชิก (Element) ซ่ึงเป นตัวแปรท่ัวไป ตัวแปรอาเรย�มีจํานวนสมาชิกท่ีแน�นอน และสมาชิกแต�ละตัวจะมีดัชนี (Index) ประจําตัวกํากับไว% ตัวแปรอาเรย� แบ�งได% 3 ประเภท คือ 1. ตัวแปรอาเรย� 1 มิติ 2. ตัวแปรอาเรย� 2 มิติ 3. ตัวแปรอาเรย�หลายมิติ ตัวแปรอาเรย� 1 มิติ (One-Dimensional Array Variable) ตัวแปรอาเรย�ประเภทนี้ เป นชุดของตัวแปรท่ีเรียงต�อกันไปเป นแถว สมาชิกแต�ละตัวจะมีดัชนีเพียงตัวเดียว

ภาพท่ี 6.6 แสดงตัวแปรอาเรย� 1 มิติ การประกาศตัวแปรอาเรย� 1 มิติ รูปแบบของตัวแปรอาเรย� 1 มิติ ดังภาพท่ี 6.7

ชนิดข�อมูล ช่ือตัวแปร[ขนาด];

ภาพท่ี 6.7 รูปแบบการประกาศตัวแปรอาเรย� 1 มิติ ตัวอย�างของการประกาศตัวแปรอาเรย� 1 มิติ int x[9]; เป นการประกาศตัวแปร x เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบเลขจํานวนเต็มประเภท int มีขนาด 9 ช�อง ดังภาพท่ี 6.8

ภาพท่ี 6.8 ตัวแปรอาเรย� x char C[5]; เป นการประกาศตัวแปร C เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบตัวอักขระ มีขนาด 5 ช�อง ดังภาพท่ี 6.9

ภาพท่ี 6.9 ตัวแปรอาเรย� C

x

C

[0] [1] [2] [3] [4] [5] [6] [7] [8]

[0] [1] [2] [3] [4]

ดัชนี

ดัชนี

มิติท่ี 1

145

การกําหนดค#าเริ่มต�นให�กับตัวแปรอาเรย� 1 มิติ รูปแบบการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� 1 มิติ มี 2 รูปแบบ คือ 1. แบบท่ี 1 เป นการกําหนดค�าเริ่มต%น โดยระบุขนาดของตัวแปรอาเรย� 2. แบบท่ี 2 เป นการกําหนดค�าเริ่มต%น โดยไม�ได%ระบุขนาดของตัวแปรอาเรย� แบบท่ี 1 เปZนการกําหนดค#าเริ่มต�น โดยระบุขนาดของตัวแปรอาเรย� รูปแบบการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� 1 มิติ โดยระบุขนาดของตัวแปรอาเรย� ดังภาพท่ี 6.10

ชนิดข�อมูล ช่ือตัวแปรอาเรย�[n] = {ค#าท่ี1, ค#าท่ี2, ค#าท่ี3, ..., ค#าท่ีn};

ภาพท่ี 6.10 รูปแบบการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� 1 มิติ แบบท่ี 1 ตัวอย�างของการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย�ประเภทนี้ int a[3] = {2, 4, 6}; เป นการประกาศตัวแปร a เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบเลขจํานวนเต็มประเภท int มีขนาด 3 ช�อง และมีการกําหนดค�าเริ่มต%น คือ 2, 4 และ 6 ดังภาพท่ี 6.11

ภาพท่ี 6.11 ตัวแปรอาเรย� a เก็บข%อมูล 246 ตัวแปรอาเรย� a สมาชิกตัวท่ี 1 หรือดัชนี 0 เก็บค�า 2 ตัวแปรอาเรย� a สมาชิกตัวท่ี 2 หรือดัชนี 1 เก็บค�า 4 ตัวแปรอาเรย� a สมาชิกตัวท่ี 3 หรือดัชนี 2 เก็บค�า 6 char R[5] = {'a', 'b', 'c', 'd', 'e'}; เป นการประกาศตัวแปร R เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบตัวอักขระ มีขนาด 5 ช�อง และมีการกําหนดค�าเริ่มต%น คือ a, b, c, d และ e ดังภาพท่ี 6.12

ภาพท่ี 6.12 ตัวแปรอาเรย� R เก็บข%อมูล a, b, c, d และ e ตัวแปรอาเรย� R สมาชิกตัวท่ี 1 หรือดัชนี 0 เก็บค�า a ตัวแปรอาเรย� R สมาชิกตัวท่ี 2 หรือดัชนี 1 เก็บค�า b ตัวแปรอาเรย� R สมาชิกตัวท่ี 3 หรือดัชนี 2 เก็บค�า c ตัวแปรอาเรย� R สมาชิกตัวท่ี 4 หรือดัชนี 3 เก็บค�า d ตัวแปรอาเรย� R สมาชิกตัวท่ี 5 หรือดัชนี 4 เก็บค�า e

a 2 4 6

[0] [1] [2]

R a b c d e

[0] [1] [2] [3] [4]

146

แบบท่ี 2 เปZนการกําหนดค#าเริ่มต�น โดยไม#ได�ระบุขนาดของตัวแปรอาเรย� รูปแบบการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� 1 มิติ โดยไม�ได%ระบุขนาดของตัวแปรอาเรย� ดังภาพท่ี 6.13

ชนิดข�อมูล ช่ือตัวแปรอาเรย�[ ] = {ค#าท่ี1, ค#าท่ี2, ค#าท่ี3, ...};

ภาพท่ี 6.13 รูปแบบการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� 1 มิติ แบบท่ี 2 ตัวอย�างของการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย�ประเภทนี้ int b[ ] = {2, 4, 6, 8}; เป นการประกาศตัวแปร b เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบเลขจํานวนเต็มประเภท int ไม�ได%กําหนดขนาดของอาเรย� แต�มีการกําหนดค�าเริ่มต%น คือ 2, 4, 6 และ 8 จึงทําให%ตัวแปรอาเรย�นี้มีขนาด 4 ช�องโดยอัตโนมัติ ซ่ึงมีความหมายเหมือนกับ int b[4] = {2, 4, 6, 8}; นั่นเอง ดังภาพท่ี 6.14

ภาพท่ี 6.14 ตัวแปรอาเรย� b เก็บข%อมูล 2, 4, 6 และ 8 ตัวแปรอาเรย� b สมาชิกตัวท่ี 1 หรือดัชนี 0 เก็บค�า 2 ตัวแปรอาเรย� b สมาชิกตัวท่ี 2 หรือดัชนี 1 เก็บค�า 4 ตัวแปรอาเรย� b สมาชิกตัวท่ี 3 หรือดัชนี 2 เก็บค�า 6 ตัวแปรอาเรย� b สมาชิกตัวท่ี 4 หรือดัชนี 3 เก็บค�า 8 char k[ ] = {'x', 'y', 'z'}; เป นการประกาศตัวแปร k เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบตัวอักขระ ไม�ได%กําหนดขนาดของอาเรย� แต�มีการกําหนดค�าเริ่มต%น คือ x, y และ z จึงทําให%ตัวแปรอาเรย�นี้มีขนาด 3 ช�องโดยอัตโนมัติ ซ่ึงมีความหมายเหมือนกับ char k[3] = {'x', 'y', 'z'}; นั่นเอง ดังภาพท่ี 6.15

ภาพท่ี 6.15 ตัวแปรอาเรย� R เก็บข%อมูล xyz ตัวแปรอาเรย� k สมาชิกตัวท่ี 1 หรือดัชนี 0 เก็บค�า x ตัวแปรอาเรย� k สมาชิกตัวท่ี 2 หรือดัชนี 1 เก็บค�า y ตัวแปรอาเรย� k สมาชิกตัวท่ี 3 หรือดัชนี 2 เก็บค�า z จากตัวอย�างของการประกาศตัวแปรโดยเฉพาะตัวแปรท่ีมีชนิดข%อมูลแบบตัวอักขระ จะเห็นว�า ตัวอย�างดังกล�าวเก็บข%อมูลตัวอักขระเพียง 1 ตัวเท�านั้น แต�ถ%าผู%เขียนโปรแกรมต%องการเก็บข%อมูลท่ีเป นข%อความ ซ่ึงข%อความประกอบด%วยตัวอักขระมากกว�า 1 ตัว จะต%องทําอย�างไร

b 2 4 6 8

[0] [1] [2] [3]

kR

x y z

[0] [1] [2]

147

ข%อความท่ีประกอบด%วยตัวอักขระมากกว�า 1 ตัว เรียกว�า สตริง (String) โดยสตริงไม�สามารถเก็บลงในตัวแปรท่ีมีชนิดข%อมูลแบบตัวอักขระโดยตรงได% แต�สามารถนําชนิดข%อมูลแบบตัวอักขระมากําหนดให%อยู�ลักษณะของตัวแปรอาเรย�ได%ดังตัวอย�างนี้ char C[10]; C = "Hello World"; จากตัวอย�างนี้ จะเห็นว�ามีการกําหนดขนาดของตัวแปรอาเรย�เป น 15 ช�อง แต�ในความเป นจริงเก็บตัวอักขระได%เพียง 9 ตัวเท�านั้น เพราะสตริงใช%ช�องสุดท%ายในการเก็บรหัสควบคุม \0 (Null Character) เสมอ เพ่ือแสดงจุดสิ้นสุดของสตริง ดังนั้นตัวแปรอาเรย� C จึงเก็บข%อความ Hello World ได%เพียง Hello Wor เท�านั้น ดังภาพท่ี 6.16

ภาพท่ี 6.16 ตัวแปรอาเรย� C เก็บข%อมูล Hello World ถ%าต%องการเก็บสตริงท่ีมีขนาด 10 ตัว ต%องกําหนดขนาดของตัวแปรอาเรย�เป น 11 ช�อง ข�อสังเกต C = "Hello World"; สตริงท่ีกําหนดให%กับตัวแปรอาเรย� C จะต%องใช%เครื่องหมาย Double Quote (") คลุมด%วย ซ่ึงต�างจากการกําหนดค�าให%กับตัวแปรท่ีมีชนิดข%อมูลแบบตัวอักขระ ใช%เครื่องหมาย Single Quote (') คลุม ดังตัวอย�างต�อไปนี้ char c = 'y'; char S[20] = "Welcome "; การรับข%อมูลท่ีมีชนิดข%อมูลแบบตัวอักขระผ�านทางคีย�บอร�ดโดยใช%ฟEงก�ชั่น scanf() ท่ีได%เคยอธิบายไว%ก�อนหน%านี้ว�า ต%องใช%เครื่องหมาย Ampersand (&) นําหน%าตัวแปร ดังตัวอย�าง char x; scanf("%c", &x); แต�ถ%าเป นการรับสตริงผ�านทางคีย�บอร�ดโดยใช%ฟEงก�ชั่น scanf() ไม�ต%องใช%เครื่องหมาย Ampersand นําหน%าตัวแปรอาเรย� ดังตัวอย�าง char s[20]; scanf("%s", s);

C H e l l o W o r \0

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

ตัวแปร c ใช%เครื่องหมาย Single Quote (') คลุม ตัวแปรอาเรย� S ใช%เครื่องหมาย Double Quote (") คลุม

ต%องใส�เครื่องหมาย Ampersand นําหน%าตัวแปร x

ไม�ต%องใส�เครื่องหมาย Ampersand (&) หน%าตัวแปรอาเรย� s

ตัวแทนชนิดข%อมูล ต%องใช% %c สําหรับชนิดข%อมูลแบบตัวอักขระ

ตัวแทนชนิดข%อมูล ต%องใช% %s สําหรับชนิดข%อมูลสตริง

148

การเข�าถึงข�อมูลในตัวแปรอาเรย� 1 มิติ การเข%าถึงข%อมูลในตัวแปรอาเรย� 1 มิติ ให%ใช%ดัชนีของตัวแปรอาเรย�เป นตัวระบุ โดยรูปแบบการเข%าถึงข%อมูลในตัวแปรอาเรย� 1 มิติ ดังภาพท่ี 6.17

ช่ือตัวแปรอาเรย�[ดัชนี]

ภาพท่ี 6.17 รูปแบบการเข%าถึงข%อมูลในตัวแปรอาเรย� 1 มิติ ตัวอย�างการเข%าถึงข%อมูลในตัวแปรอาเรย� 1 มิติ int point[5] = {62, 49, 53, 86, 77};

ภาพท่ี 6.18 ตัวแปรอาเรย� point สามารถเข%าถึงข%อมูลในตัวแปรอาเรย� point ได% ดังนี้ - การเข%าถึงข%อมูลในตัวแปรอาเรย� point สมาชิกตัวท่ี 1 คือ point[0] ซ่ึงจะได%ค�าเท�ากับ 62 หมายความว�า point[0] = 62 - การเข%าถึงข%อมูลในตัวแปรอาเรย� point สมาชิกตัวท่ี 2 คือ point[1] ซ่ึงจะได%ค�าเท�ากับ 49 หมายความว�า point[1] = 49 - การเข%าถึงข%อมูลในตัวแปรอาเรย� point สมาชิกตัวท่ี 3 คือ point[2] ซ่ึงจะได%ค�าเท�ากับ 53 หมายความว�า point[2] = 53 - การเข%าถึงข%อมูลในตัวแปรอาเรย� point สมาชิกตัวท่ี 4 คือ point[3] ซ่ึงจะได%ค�าเท�ากับ 86 หมายความว�า point[3] = 86 - การเข%าถึงข%อมูลในตัวแปรอาเรย� point สมาชิกตัวท่ี 5 คือ point[4] ซ่ึงจะได%ค�าเท�ากับ 77 หมายความว�า point[4] = 77 ข�อสังเกต สมาชิกตัวท่ี 1 หรือช�องท่ี 1 ของตัวแปรอาเรย� จะมีดัชนี 0 เสมอ

point 62 49 53 86 77

point[0] point[1] point[2] point[3] point[4]

สมาชิกตัวท่ี 1

สมาชิกตัวท่ี 2

สมาชิกตัวท่ี 3 สมาชิกตัวท่ี 4

สมาชิกตัวท่ี 5

149

ตัวอย#างท่ี 6.3 โปรแกรมรับคะแนนวิชาหนึ่งจากนักศึกษา 5 คน โดยใช%ตัวแปรอาเรย� 1 มิติ

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

#include <stdio.h> #include <conio.h> int main() { int point[5]; int i = 0; while(i<5) { printf("Student No. %d : ", i+1); scanf("%d", &point[i]); i++; } printf("Completed !!!\n\n"); printf("*** Display ***\n"); i = 0; while(i<5) { printf("Point of Student No. %d is %d\n", i+1, point[i]); i++; } getch(); return 0; }

ภาพท่ี 6.19 โปรแกรมรับคะแนนวิชาหนึ่งจากนักศึกษา 5 คน โดยใช%ตัวแปรอาเรย� 1 มิติ เม่ือรันโปรแกรมนี้ จะได%ผลลัพธ�ดังภาพท่ี 6.20

Student No. 1 : _

Student No. 1 : 62

Student No. 2 : _

Student No. 1 : 62

Student No. 2 : 49

Student No. 3 : _

Student No. 1 : 62

Student No. 2 : 49

Student No. 3 : 53

Student No. 4 : _

Student No. 1 : 62

Student No. 2 : 49

Student No. 3 : 53

Student No. 4 : 86

Student No. 5 : _

Student No. 1 : 62

Student No. 2 : 49

Student No. 3 : 53

Student No. 4 : 86

Student No. 5 : 77

Student No. 1 : 62

Student No. 2 : 49

Student No. 3 : 53

Student No. 4 : 86

Student No. 5 : 77

Completed !!!

*** Display ***

Point of Student No. 1 is 62

Point of Student No. 2 is 49

Point of Student No. 3 is 53

Point of Student No. 4 is 86

Point of Student No. 5 is 77

ภาพท่ี 6.20 ผลลัพธ�ของโปรแกรมรับคะแนนวิชาหนึ่งจากนักศึกษา 5 คน โดยใช%ตัวแปรอาเรย� 1 มิติ จากตัวอย�างนี้ - การรับคะแนนจากนักศึกษา 5 คน ใช%โครงสร%างแบบวนรอบคือ ใช%คําสั่ง while ในบรรทัดท่ี 8 (while(i<5)) และใช%ตัวแปร i เป นดัชนีของการเข%าถึงข%อมูลในตัวแปรอาเรย� point นั่นเอง โดยใช%ตัวแปร i กําหนดค�าเริ่มต%นมีค�าเท�ากับ 0 ในบรรทัดท่ี 6 (int i = 0;) เพ่ือใช%อ%างถึงสมาชิกตัวท่ี 1 ของตัวแปรอาเรย� point และกําหนดเง่ือนไขของคําสั่ง while คือ i<5 หมายความว�า มีการวนรอบจํานวน 5 รอบ รอบแรก (นักศึกษาคนท่ี 1) ตัวแปร i มีค�าเท�ากับ 0 ส�วนรอบท่ี 5 (นักศึกษาคนท่ี 5) ตัวแปร i มีค�าเท�ากับ 4 - หลังจากนําคะแนนของนักศึกษาแต�ละคนมาเก็บไว%ในตัวแปรอาเรย� point แล%ว เม่ือต%องการแสดงผลคะแนนก็จะต%องนําค�าท่ีอยู�ในสมาชิกแต�ละตัวของตัวแปรอาเรย� point โดยใช%โครงสร%างแบบวนรอบเช�นกันคือ ใช%คําสั่ง while ในบรรทัดท่ี 17 (while(i<5)) และใช%ตัวแปร i ตัวเดิม แต�ก�อนท่ีจะนํามาใช% จําเป นต%อง

150

กําหนดค�าเริ่มต%นมีค�าเท�ากับ 0 ในบรรทัดท่ี 16 (i = 0;) การเข%าถึงข%อมูลในตัวแปรอาเรย� point ใช%คําสั่ง point[i] ในบรรทัดท่ี 18 (printf("Point of Student No. %d is %d\n", i+1, point[i]);) เพ่ือนําคะแนนของนักศึกษาจากตัวแปรอาเรย� point ของแต�ละคนออกมาแสดง ตัวอย#างท่ี 6.4 โปรแกรมการสลับข%อมูลของสมาชิกตัวท่ี 1 กับสมาชิกตัวท่ี 4 ในตัวแปรอาเรย� 1 มิติ

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

#include <stdio.h> #include <conio.h> int main() { int point[5]={ 62, 49, 53, 86, 77}; int i=0; int temp; printf("Before Swap.\n"); while(i<5) { printf("Point of Student No. %d is %d\n", i+1, point[i]); i++; } temp = point[0]; point[0] = point[3]; point[3] = temp; printf("\nAfter Swap.\n"); i = 0; while(i<5) { printf("Point of Student No. %d is %d\n", i+1, point[i]); i++; } getch(); return 0; }

ภาพท่ี 6.21 โปรแกรมการสลับข%อมูลของสมาชิกตัวท่ี 1 กับสมาชิกตัวท่ี 4 ในตัวแปรอาเรย� 1 มิติ เม่ือรันโปรแกรมนี้ จะได%ผลลัพธ�ดังภาพท่ี 6.22

Before Swap.

62

49

53

86

77

After Swap.

86

49

53

62

77

ภาพท่ี 6.22 ผลลัพธ�ของโปรแกรมการสลับข%อมูลของสมาชิกตัวท่ี 1 กับสมาชิกตัวท่ี 4 ในตัวแปรอาเรย� 1 มิติ จากตัวอย�างนี้ บรรทัดท่ี 15 ถึง 17 temp = point[0]; point[0] = point[3]; point[3] = temp;

เป นวิธีการสลับข%อมูลท่ีอยู�ในตัวแปรอาเรย� point คือ สลับข%อมูลระหว�างข%อมูลท่ี 1 กับข%อมูลท่ี 4 วิธีการสลับคือ จะต%องกําหนดตัวแปรหนึ่งตัวในท่ีนี้คือ ตัวแปร temp เพ่ือเป นตัวแปรชั่วคราว (Temporary Variable) ใช%ในการเก็บข%อมูลระหว�างการสลับ โดยมีรายละเอียด ดังนี้

151

- บรรทัดท่ี 15 (temp = point[0];) หมายถึง นําข%อมูลท่ีอยู�ในสมาชิกตัวท่ี 1 (point[0]) ซ่ึงมีค�าเท�ากับ 62 นํามาเก็บไว%ท่ีตัวแปร temp ดังนั้นตัวแปร temp มีค�าเท�ากับ 62 - บรรทัดท่ี 16 (point[0] = point[3];) หมายถึง นําข%อมูลท่ีอยู�ในสมาชิกตัวท่ี 4 (point[3]) ซ่ึงมีค�าเท�ากับ 86 นํามาเก็บไว%ท่ีสมาชิกตัวท่ี 1 (point[0]) ดังนั้น point[0] มีค�าเท�ากับ 86 นั่นเอง - บรรทัดท่ี 17 (point[3] = temp;) หมายถึง นําข%อมูลท่ีอยู�ในตัวแปร temp ซ่ึงมีค�าเท�ากับ 62 นํามาเก็บไว%ท่ีสมาชิกตัวท่ี 4 (point[3]) ดังนั้น point[3] มีค�าเท�ากับ 62 นั่นเอง วิธีการสลับข%อมูลได%แสดงไว%ในภาพท่ี 6.23 temp = point[0]; point[0] = point[3]; point[3] = temp;

ภาพท่ี 6.23 แสดงวิธีการสลับข%อมูล

point 62 49 53 86 77 point[0] point[1] point[2] point[3] point[4]

temp

temp 62

point 62 49 53 86 77 point[0] point[1] point[2] point[3] point[4]

point 86 49 53 86 77

point[0] point[1] point[2] point[3] point[4]

temp 62

point 86 49 53 86 77

point[0] point[1] point[2] point[3] point[4]

temp 62

point 62 49 53 86 77 point[0] point[1] point[2] point[3] point[4]

temp 62

point 86 49 53 62 77 point[0] point[1] point[2] point[3] point[4]

temp 62

152

ตัวแปรอาเรย� 2 มิติ (Two-Dimensional Array Variable) ตัวแปรอาเรย�ประเภทนี้ เป นชุดของตัวแปรท่ีเรียงต�อกันในลักษณะของตาราง ดังภาพท่ี 6.24

ภาพท่ี 6.24 มิติของตัวแปรอาเรย� 2 มิติ ตัวแปรอาเรย� 2 มิติ อาจเรียกว�า อาเรย�ของอาเรย� (Array of array) คือ อาเรย� 2 มิติเป นอาเรย� ของอาเรย� 1 มิติ โดยเรียกมิติท่ี 1 ว�า แถว (Row) เป นมิติหลักของอาเรย� และเรียกมิติท่ี 2 ว�า คอลัมน� (Column) เป นอาเรย�ของมิติท่ี 1 นั่นเอง

ภาพท่ี 6.25 แสดงตัวแปรอาเรย� 2 มิติ ภาพท่ี 6.24 แสดงโครงสร%างของตัวแปรอาเรย� 2 มิติ โดยแสดงดัชนีของสมาชิกแต�ละตัว ดังนี้ - สมาชิกตัวท่ี 1 จากแถวท่ี 1 กับคอลัมน�ท่ี 1 มีดัชนี [0][0] - สมาชิกตัวท่ี 2 จากแถวท่ี 1 กับคอลัมน�ท่ี 2 มีดัชนี [0][1] - สมาชิกตัวท่ี 3 จากแถวท่ี 1 กับคอลัมน�ท่ี 3 มีดัชนี [0][2] - สมาชิกตัวท่ี 4 จากแถวท่ี 1 กับคอลัมน�ท่ี 4 มีดัชนี [0][3] - สมาชิกตัวท่ี 5 จากแถวท่ี 2 กับคอลัมน�ท่ี 1 มีดัชนี [1][0] - สมาชิกตัวท่ี 6 จากแถวท่ี 2 กับคอลัมน�ท่ี 2 มีดัชนี [1][1] - สมาชิกตัวท่ี 7 จากแถวท่ี 2 กับคอลัมน�ท่ี 3 มีดัชนี [1][2] - สมาชิกตัวท่ี 8 จากแถวท่ี 2 กับคอลัมน�ท่ี 4 มีดัชนี [1][3] - สมาชิกตัวท่ี 9 จากแถวท่ี 3 กับคอลัมน�ท่ี 1 มีดัชนี [2][0] - สมาชิกตัวท่ี 10 จากแถวท่ี 3 กับคอลัมน�ท่ี 2 มีดัชนี [2][1] - สมาชิกตัวท่ี 12 จากแถวท่ี 3 กับคอลัมน�ท่ี 3 มีดัชนี [2][2] - สมาชิกตัวท่ี 12 จากแถวท่ี 3 กับคอลัมน�ท่ี 4 มีดัชนี [2][3]

มิติท่ี 1

มิติท่ี 2

[0][0] [0][1] [0][2] [0][3]

[2][0] [2][1] [2][2] [2][3] [1][0] [1][1] [1][2] [1][3]

แถวท่ี 1 แถวท่ี 2

แถวท่ี 3

คอลัมน�ท่ี 1 คอลัมน�ท่ี 2 คอลัมน�ท่ี 3 คอลัมน�ท่ี 4

153

การประกาศตัวแปรอาเรย� 2 มิติ รูปแบบของตัวแปรอาเรย� 2 มิติ ดังภาพท่ี 6.26

ชนิดข�อมูล ช่ือตัวแปร[ขนาดแถว][ขนาดคอลัมน�];

ภาพท่ี 6.26 รูปแบบการประกาศตัวแปรอาเรย� 2 มิติ ตัวอย�างของการประกาศตัวแปรอาเรย� 2 มิติ int z[2][3]; เป นการประกาศตัวแปร z เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบเลขจํานวนเต็มประเภท int มีขนาดแถว 2 ช�อง และขนาดคอลัมน� 3 ช�อง ดังภาพท่ี 6.27

ภาพท่ี 6.27 ตัวแปรอาเรย� z float num[4][2]; เป นการประกาศตัวแปร area เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบเลขทศนิยมประเภท float มีขนาดแถว 4 ช�อง และขนาดคอลัมน� 2 ช�อง ดังภาพท่ี 6.28

ภาพท่ี 6.28 ตัวแปรอาเรย� area การกําหนดค#าเริ่มต�นให�กับตัวแปรอาเรย� 2 มิติ รูปแบบการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� 2 มิติ โดยระบุขนาดแถวและขนาดคอลัมน�ของตัวแปรอาเรย� ดังภาพท่ี 6.29

ชนิดข�อมูล ช่ือตัวแปรอาเรย�[ขนาดแถว][ขนาดคอลัมน�] = {ค#าท่ี1, ค#าท่ี2, ค#าท่ี3, ..., ค#าท่ีn};

ภาพท่ี 6.29 รูปแบบการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� 2 มิติ ตัวอย�างของการกําหนดค�าเริ่มต%นให%กับตัวแปรอาเรย� int m[2][3] = {2, 4, 6, 8, 10, 12}; int m[2][3] = {{2, 4, 6}, {8, 10, 12}}; int m[2][3] = {{2, 4, 6}, {8, 10, 12}}; int m[2][ ] = {{2, 4, 6},

[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

z

[0][0] [0][1] [1][0] [1][1] [2][0] [2][1] [3][0] [3][1]

area

154

{8, 10, 12}}; int m[ ][3] = {{2, 4, 6}, {8, 10, 12}}; int m[ ][ ] = {{2, 4, 6}, {8, 10, 12}}; การกําหนดค�าเริ่มต%นให%กับตัวแปรท้ังหกตัวอย�างข%างต%น เป นการประกาศตัวแปร m เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบเลขจํานวนเต็มประเภท int ขนาดแถว 2 ช�องและขนาดคอลัมน� 3 ช�อง มีการกําหนดค�าเริ่มต%น คือ 2, 4, 6, 8, 10 และ 12 ดังภาพท่ี 6.29 กรณีท่ีบางตัวอย�างไม�ได%กําหนดขนาดแถวและขนาดคอลัมน� แต�มีการกําหนดค�าเริ่มต%นไว% จึงทําให%ตัวแปรอาเรย�ดังกล�าวมีขนาดแถว 2 ช�องและขนาดคอลัมน� 3 ช�องโดยอัตโนมัติ

ภาพท่ี 6.30 ตัวแปรอาเรย� m เก็บข%อมูล 2, 4, 6, 8, 10 และ 12 การเข�าถึงข�อมูลในตัวแปรอาเรย� 2 มิติ การเข%าถึงข%อมูลในตัวแปรอาเรย� 2 มิติ ให%ใช%ดัชนีของตัวแปรอาเรย�เป นตัวระบุ โดยรูปแบบการเข%าถึงข%อมูลในตัวแปรอาเรย� 2 มิติ ดังภาพท่ี 6.31

ช่ือตัวแปรอาเรย�[ขนาดแถว][ขนาดคอลัมน�]

ภาพท่ี 6.31 รูปแบบการเข%าถึงข%อมูลในตัวแปรอาเรย� 2 มิติ ตัวอย�างการเข%าถึงข%อมูลในตัวแปรอาเรย� 2 มิติ int h[2][3] = {{1, 3, 5}, {7, 9, 11}};

ภาพท่ี 6.32 ตัวแปรอาเรย� h เก็บข%อมูล 1, 3, 5, 7, 9 และ 11

m 2 4 6 8 10 12

h 1 3 5 7 9 11

สมาชิกตัวท่ี 3

สมาชิกตัวท่ี 2

สมาชิกตัวท่ี 1

สมาชิกตัวท่ี 6

สมาชิกตัวท่ี 5 สมาชิกตัวท่ี 4

155

สามารถเข%าถึงข%อมูลในตัวแปรอาเรย� h ได% ดังนี้ - การเข%าถึงข%อมูลในตัวแปรอาเรย� h สมาชิกตัวท่ี 1 คือ h[0][0] ซ่ึงได%ค�าเท�ากับ 1 หมายความว�า h[0][0] = 1 - การเข%าถึงข%อมูลในตัวแปรอาเรย� h สมาชิกตัวท่ี 2 คือ h[0][1] ซ่ึงได%ค�าเท�ากับ 3 หมายความว�า h[0][1] = 3 - การเข%าถึงข%อมูลในตัวแปรอาเรย� h สมาชิกตัวท่ี 3 คือ h[0][2] ซ่ึงได%ค�าเท�ากับ 5 หมายความว�า h[0][2] = 5 - การเข%าถึงข%อมูลในตัวแปรอาเรย� h สมาชิกตัวท่ี 4 คือ h[1][0] ซ่ึงได%ค�าเท�ากับ 7 หมายความว�า h[1][0] = 7 - การเข%าถึงข%อมูลในตัวแปรอาเรย� h สมาชิกตัวท่ี 5 คือ h[1][1] ซ่ึงได%ค�าเท�ากับ 9 หมายความว�า h[1][1] = 9 - การเข%าถึงข%อมูลในตัวแปรอาเรย� h สมาชิกตัวท่ี 6 คือ h[1][2] ซ่ึงได%ค�าเท�ากับ 11 หมายความว�า h[1][2] = 11 ตัวอย#างท่ี 6.5 โปรแกรมแสดงเลขยกกําลังสองและสามของเลขต้ังแต� 1 ถึง 5 โดยใช%ตัวแปรอาเรย� 2 มิติ

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

#include <stdio.h> #include <conio.h> #include <math.h> int main() { float power[5][2]; int r, c; for(r=0; r<5; r++) { for(c=0; c<2; c++) { power[r][c] = pow((r+1), (c+2)); } } printf("x \tx^2 \tx^3\n"); printf("===================\n"); for(r=0; r<5; r++) { printf("%d ", r+1); for(c=0; c<2; c++) { printf("\t%3.0f", power[r][c]); } printf("\n"); } getch(); return 0; }

ภาพท่ี 6.33 โปรแกรมแสดงเลขยกกําลังสองและสามของเลขต้ังแต� 1 ถึง 5 โดยใช%ตัวแปรอาเรย� 2 มิติ เม่ือรันโปรแกรมนี้ จะได%ผลลัพธ�ดังภาพท่ี 6.34

x x^2 x^3 ===================== 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125

ภาพท่ี 6.34 ผลลัพธ�ของโปรแกรมแสดงเลขยกกําลังสองและสามของเลขต้ังแต� 1 ถึง 5 โดยใช%ตัวแปรอาเรย� 2 มิติ

156

จากตัวอย�างนี้ เป นการใช%ตัวแปรอาเรย� 2 มิติ ในการเก็บเลขยกกําลังสองและสามของเลขต้ังแต� 1 ถึง 5 จากนั้นจึงนําค�าของเลขยกกําลังสองและสามมาแสดง โดยการคํานวณเลขยกกําลังดังกล�าว ได%ใช%ฟEงก�ชั่น pow() ในการหาเลขยกกําลัง โดยต%องประกาศไฟล�เฮดเดอร� math.h (#include <math.h>) ไว%ท่ีส�วนหัวของโปรแกรมด%วย ตัวแปรอาเรย�หลายมิติ (Multi-Dimensional Array Variable) ตัวแปรอาเรย�หลายมิติ หมายถึง ตัวแปรอาเรย�ท่ีมีมิติตั้งแต� 3 มิติข้ึนไป ถ%าตัวแปรอาเรย�มี 3 มิติ เรียกว�า ตัวแปรอาเรย� 3 มิติ แต�ถ%าตัวแปรอาเรย�มี 6 มิติ เรียกว�า ตัวแปรอาเรย� 6 มิติ ในเอกสารประกอบการสอนเล�มนี้ จะอธิบายข%อมูลของตัวแปรอาเรย� 3 มิติบางส�วนเท�านั้น ดังภาพท่ี 6.35

ภาพท่ี 6.35 ตัวแปรอาเรย� 3 มิติ ตัวอย�างการประกาศตัวแปรอาเรย� 3 มิติ int cube[2][3][4]; เป นการประกาศตัวแปร cube เป นตัวแปรอาเรย� มีชนิดข%อมูลแบบเลขจํานวนเต็มประเภท int มีขนาดแผ�น 2 ช�อง ขนาดแถว 3 ช�อง และขนาดคอลัมน� 4 ช�อง ดังภาพท่ี 6.36

ภาพท่ี 6.36 ตัวแปรอาเรย� z สามารถแสดงสมาชิกของตัวแปรอาเรย� cube ได% ดังนี้ cube[0][0][0] cube[0][0][1] cube[0][0][2] cube[0][0][3] cube[0][1][0] cube[0][1][1] cube[0][1][2] cube[0][1][3] cube[0][2][0] cube[0][2][1] cube[0][2][2] cube[0][2][3] cube[1][0][0] cube[1][0][1] cube[1][0][2] cube[1][0][3] cube[1][1][0] cube[1][1][1] cube[1][1][2] cube[1][1][3] cube[1][2][0] cube[1][2][1] cube[1][2][2] cube[1][2][3]

มิติท่ี 2

มิติท่ี 1

มิติท่ี 3

cube

157

สรุป ในบทเรียนนี้ได%อธิบายถึง ตัวแปรอาเรย�คือ ชุดของตัวแปรท่ีมีชนิดข%อมูลเดียวกัน ตัวแปรอาเรย�ประกอบด%วยสมาชิก ซ่ึงเป นตัวแปรท่ัวไป ตัวแปรอาเรย�มีจํานวนสมาชิกท่ีแน�นอน และสมาชิกแต�ละตัวจะมีดัชนีประจําตัวกํากับไว% ตัวแปรอาเรย�แบ�งเป น 3 ประเภท คือ ตัวแปรอาเรย� 1 มิติ ตัวแปรอาเรย� 2 มิติ และตัวแปรอาเรย�หลายมิติ ส�วนข%อความท่ีประกอบด%วยตัวอักขระมากกว�า 1 ตัว เรียกว�า สตริง โดยใช%ตัวแปรอาเรย�ท่ีมีชนิดข%อมูลแบบตัวอักขระเก็บข%อมูลได% และช�องสุดท%ายของตัวแปรอาเรย�จะเก็บ \0 เพ่ือแสดงจุดสิ้นสุดของสตริง

158

คําถามทบทวน 1. จงเขียนโปรแกรมเพ่ือหาผลรวมของเลขจํานวนเต็มในตัวแปรอาเรย�ชุดหนึ่ง ดังนี้ 7, 35, 20, 44, 16, 38, 6 และ 12 2. จงเขียนโปรแกรมเพ่ือหาผลรวมของเลขจํานวนเต็มในตัวแปรอาเรย�ชุดหนึ่งจํานวน 10 ตัวท่ีรับผ�านทางคีย�บอร�ด 3. จงเขียนโปรแกรมเพ่ือรับเกรด(A, B, C, D และ F) ของวิชาหนึ่งจากนักศึกษา 20 คนผ�านทางคีย�บอร�ด จากนั้นให%แสดงข%อมูลเกรดของนักศึกษาแต�ละคนผ�านทางหน%าจอ 4. จงเขียนโปรแกรมเพ่ือทําการสลับข%อมูล 7, 35, 20, 44, 16, 38, 6 และ 12 โดยทําการสลับข%อมูลตัวท่ี 2 กับตัวท่ี 7 5. จงเขียนโปรแกรมเพ่ือเก็บข%อมูลและแสดงผลลัพธ�ดังรูป โดยใช%ตัวแปรอาเรย� 2 มิติ

x 2x 3x ===================== 1 2 3 2 4 6 3 6 9 4 8 12 5 10 15

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall.

160

แผนบริหารการสอนประจําบทท่ี 7 หัวข�อเน้ือหาประจําบท 1. ฟ�งก�ชั่นคืออะไร 2. ฟ�งก�ชั่นมาตรฐานของภาษาซี 3. ฟ�งก�ชั่นสร�างเอง 4. ฟ�งก�ชั่นสร�างเองท่ีไม#มีการรับค#าเข�ามาในฟ�งก�ชั่น และไม#มีการส#งค#ากลับออกไปจากฟ�งก�ชั่น 5. ฟ�งก�ชั่นสร�างเองท่ีมีการรับค#าเข�ามาในฟ�งก�ชั่น แต#ไม#มีการส#งค#ากลับออกไปจากฟ�งก�ชั่น 6. ฟ�งก�ชั่นสร�างเองท่ีมีการรับค#าเข�ามาในฟ�งก�ชั่น และมีการส#งค#ากลับออกไปจากฟ�งก�ชั่น 7. ฟ�งก�ชั่นสร�างเองท่ีไม#มีการรับค#าเข�ามาในฟ�งก�ชั่น แต#มีการส#งค#ากลับออกไปจากฟ�งก�ชั่น 8. รูปแบบของการจัดวางฟ�งก�ชั่นสร�างเองไว�ในโปรแกรม 9. ฟ�งก�ชั่นการเรียกซํ้า วัตถุประสงค! เม่ือผู�เรียนศึกษาบทเรียนจบแล�ว จะมีความสามารถดังนี้ 1. อธิบายความหมายของฟ�งก�ชั่นได� 2. อธิบายฟ�งก�ชั่นมาตรฐานของภาษาซีได� 3. อธิบายฟ�งก�ชั่นสร�างเองประเภทต#างๆ ได� 4. เขียนโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นสร�างเองประเภทต#างๆ ได� 5. อธิบายฟ�งก�ชั่นการเรียกซํ้าได� 6. เขียนโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นเรียกซํ้าได� กิจกรรมการเรียนการสอน 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นสร�างเองประเภทต#างๆ โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย#างโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นสร�างเองประเภทต#างๆ 2. อธิบายการเขียนโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นการเรียกซํ้า โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย#างโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นการเรียกซํ้า 3. แบ#งผู�เรียนออกเป>นกลุ#ม โดยปฏิบัติตามใบงานท่ี 7 ดังนี้ 3.1 ให�ผู�เรียนฝBกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นสร�างเองประเภทต#างๆ 3.2 ให�ผู�เรียนฝBกปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่นการเรียกซํ้า 3.3 ให�ตัวแทนแต#ละกลุ#มออกมานําเสนอผลการปฏิบัติตามใบงาน และร#วมกันอภิปรายว#าโปรแกรมท่ีเขียนข้ึนมานั้นเป>นอย#างไร 4. ร#วมกันสรุปความรู�เก่ียวกับการเขียนโปรแกรมเชิงโครงสร�างกับฟ�งก�ชั่น จากนั้นซักถามผู�เรียน รวมถึงให�ผู�เรียนตอบคําถามทบทวน สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 7

162

4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน 3. สังเกตการณ�ปฏิบัติงานกลุ#ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝBกหัด

บทท่ี 7 ฟ�งก�ช่ัน

บทนํา นอกจากฟ�งกชั่นหลักท่ีต�องมีในโปรแกรมภาษาซีทุกโปรแกรมแล�ว บทนี้จะได�อธิบายถึงฟ�งกชั่นว)าคืออะไร และในภาษาซีแบ)งฟ�งกชั่นออกเป-นก่ีประเภท ข้ันตอนการเรียกใช�ฟ�งกชั่นดังกล)าวจากฟ�งกชั่นหลักเป-นอย)างไร ส)วนพารามิเตอรและอารกิวเมนตมีความสําคัญต)อฟ�งกชั่นอย)างไร รวมถึงฟ�งกชั่นการเรียกซํ้าคืออะไร ฟ�งก�ช่ันคืออะไร ฟ�งกชั่นหลักของภาษาซี คือ ฟ�งกชั่นหลักหรือฟ�งกชั่น main() ซ่ึงโปรแกรมภาษาซีทุกโปรแกรมต�องมีฟ�งกชั่นนี้อยู)ในโปรแกรมเสมอ ซ่ึงได�อธิบายไว�ในบทท่ี 3 แล�ว นอกจากนี้บทอ่ืนๆ ยังได�นําบางฟ�งกชั่นมาใช�งาน อาทิ ฟ�งกชั่น printf() ฟ�งกชั่น scanf() และฟ�งกชั่น pow() เม่ือนํามาใช�งานจะต�องประกาศไฟลเฮดเดอรท่ีเก่ียวข�องไว�ท่ีส)วนหัวของโปรแกรมด�วย จะเห็นว)า การเขียนโปรแกรมโดยเฉพาะโปรแกรมภาษาซี คงไม)สามารถหลีกเลี่ยงท่ีจะต�องเก่ียวข�องกับฟ�งกชั่น แต)สําหรับผู�เริ่มเขียนโปรแกรมคงมีข�อสงสัยเก่ียวกับฟ�งกชั่น ดังนั้นให�ศึกษาโปแกรมแสดงรูปสามเหลี่ยม 9 แถว 10 รูป โดยห�ามใช�คําสั่งวนรอบ ดังภาพท่ี 7.1

01 02 03 04 05 06 07 08 09 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

#include <stdio.h> #include <conio.h> int main() { printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n");

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

#include <stdio.h> #include <conio.h> void printTriangle() { printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); } int main() { printTriangle(); printTriangle(); printTriangle(); printTriangle(); printTriangle(); printTriangle(); printTriangle(); printTriangle(); printTriangle(); printTriangle(); getch(); return 0; }

164 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); getch(); return 0; }

ก. แบบท่ีไม)ใช�ฟ�งกชั่น ข. แบบท่ีใช�ฟ�งกชั่น ภาพท่ี 7.1 เปรียบเทียบการเขียนโปรแกรมแสดงรูปสามเหลี่ยม 9 แถว 10 รูป แบบไม)ใช�ฟ�งกชั่นกับใช�ฟ�งกชั่น

ตัวอย)างโปรแกรมนี้เป-นการทําคําสั่งซํ้าๆ กัน หากเขียนโปรแกรมแบบท่ีไม)ใช�ฟ�งกชั่นต�องเขียนโปรแกรมมากถึง 100 บรรทัด แต)แบบท่ีใช�ฟ�งกชั่นเขียนโปรแกรมเพียง 32 บรรทัดเท)านั้นในท่ีนี้มีการสร�างฟ�งกชั่นชื่อว)า printTriangle() (บรรทัดท่ี 5 ถึง 15) ข้ึนมา ดังนั้นหากต�องการเขียนโปรแกรมท่ีต�องทําคําสั่งซํ้าๆ กันจํานวนมาก ผู�เขียนโปรแกรมควรจะต�องสร�างฟ�งกชั่นข้ึนมาใช�งานเอง เพ่ือลดจํานวนบรรทัดของโปรแกรมลง โปรแกรมนี้สามารถนํามาเขียนให�มีจํานวนบรรทัดลดลงเหลือเพียง 27 บรรทัดได�โดยใช�คําสั่งการวนรอบ for ช)วย ดังภาพท่ี 7.2

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

#include <stdio.h> #include <conio.h> void printTriangle() { printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ********* \n"); printf(" *********** \n"); printf(" ************* \n"); printf(" *************** \n"); printf("*****************\n"); } int main() { int i; for(i=0; i<10; i++) { printTriangle();

165 22 23 24 25 26 27

} getch(); return 0; }

ภาพท่ี 7.2 การเขียนโปรแกรมแสดงรูปสามเหลี่ยม 9 แถว 10 รูป แบบใช�ฟ�งกชั่นและคําสั่งวนรอบ for ช)วย ฟ�งก�ช่ัน (Function) คือ ส)วนของโปรแกรมท่ีทํางานเสร็จสิ้นภายในตัวเอง ส)วนของโปรแกรมดังกล)าวประกอบด�วยคําสั่งหรือกลุ)มของคําสั่งท่ีมีหน�าท่ีเพ่ือจุดประสงคเดียวกัน ในภาษาซีแบ)งฟ�งกชั่นออกเป-น 2 ประเภท คือ 1. ฟ�งกชั่นมาตรฐานของภาษาซี 2. ฟ�งกชั่นสร�างเอง โดยมีรายละเอียด ดังต)อไปนี้ ฟ�งก�ช่ันมาตรฐานของภาษาซี ฟ�งก�ช่ันมาตรฐานของภาษาซี (Standard Library Function) ภาษาซีได�จัดเตรียมไว�ให�ผู�เขียนโปรแกรมแล�ว เม่ือนํามาใช�งานต�องประกาศไฟลเฮดเดอรท่ีเก่ียวข�องไว�ท่ีส)วนหัวของโปรแกรมด�วย ตัวอย)างของฟ�งกชั่นประเภทนี้ ได�แก) ไฟล�เฮดเดอร� math.h ไฟลเฮดเดอรนี้ประกอบด�วยฟ�งกชันท่ีใช�ทางการคํานวณทางคณิตศาสตร เช)น - sin(x) ฟ�งกชั่นการหาค)า sine ของ x โดยท่ี x เป-นค)ามุมในหน)วยเรเดียน (Radian) - cos(x) ฟ�งกชั่นการหาค)า cosine ของ x โดยท่ี x เป-นค)ามุมในหน)วยเรเดียน (Radian) - tan(x) ฟ�งกชั่นการหาค)า tan ของ x โดยท่ี x เป-นค)ามุมในหน)วยเรเดียน (Radian) - sqrt(x) ฟ�งกชั่นการหาค)ารากท่ี 2 (Square Root) ของค)าคงท่ีหรือตัวแปร x โดยท่ี x ต�องเป-นค)าคงท่ีชนิดตัวเลขหรือตัวแปรท่ีมีค)าไม)ติดลบ - pow(x, y) ฟ�งกชั่นการหาค)า xy โดยท่ี x เป-นค)าคงท่ีหรือตัวแปรท่ีใช�เป-นตัวฐานต�องมีค)ามากกว)าศูนย และ y เป-นค)าคงท่ีหรือตัวแปรท่ีใช�เป-นค)ายกกําลัง - floor(x) ฟ�งกชั่นการตัดเศษทศนิยมท้ิงของตัวแปร x ถ�า x เป-นตัวเลขจํานวนทศนิยม - exp(x) ฟ�งกชั่นการหาค)า ex โดยท่ี x เป-นค)าคงท่ีหรือตัวแปรท่ีจะใช�เป-นค)ายกกําลังของ e โดยท่ี e มีค)าประมาณ 2.718282 - log(x) ฟ�งกชั่นการหาค)า log ฐาน n (Natural Logarithm) ของค)าคงท่ีหรือตัวแปร x โดยท่ี x เป-นค)าคงท่ีหรือตัวแปรท่ีมีค)าเป-นลบไม)ได� ไฟล�เฮดเดอร� ctype.h ไฟลเฮดเดอรนี้ประกอบด�วยฟ�งกชันท่ีใช�จัดการกับตัวอักขระ เช)น - isalnum(c) ฟ�งกชั่นการตรวจสอบว)าข�อมูลท่ีเก็บไว�ในตัวแปร c เป-นตัวอักษรหรือตัวเลข (Letter or Digit) ถ�าข�อมูลท่ีเก็บไว�เป-นตัวอักษรหรือตัวเลขจะส)งค)ากลับท่ีเป-นจํานวนเต็มท่ีมีค)าไม)เท)ากับศูนยมายังฟ�งกชันและถ�าข�อมูลท่ีเก็บไว�ในตัวแปร c ไม)ได�เก็บตัวอักษรหรือตัวเลขจะส)งค)ากลับท่ีมีค)าเป-นศูนยมายังฟ�งกชัน - isalpha(c) ฟ�งกชั่นการตรวจสอบว)าข�อมูลท่ีเก็บไว�ในตัวแปร c เป-นตัวอักษร (Letter) หรือไม) ถ�าใช)ฟ�งกชั่นนี้จะส)งค)ากลับเป-นเลขจํานวนเต็มท่ีไม)เท)ากับศูนย ถ�าไม)ใช)ตัวอักษรจะส)งค)ากลับมาเป-นเลขศูนย - isdigit(c) ฟ�งกชั่นการตรวจสอบว)าข�อมูลท่ีเก็บไว�ในตัวแปร c เป-นตัวเลข 0 ถึง 9 หรือไม) ถ�าใช)จะส)งค)ากลับเป-นเลขจํานวนเต็มท่ีไม)เท)ากับศูนย แต)ถ�าไม)ใช)ตัวเลข 0 ถึง 9 ก็จะไม)มีการส)งค)ากลับ

166

- islower(c) ฟ�งกชั่นการตรวจสอบว)าข�อมูลท่ีเก็บไว�ในตัวแปร c เป-นตัวอักษรตัวเล็กหรือไม) ถ�าใช)จะส)งค)ากลับเป-นเลขจํานวนเต็มท่ีไม)เท)ากับศูนย แต)ถ�าไม)ใช)จะส)งค)ากลับมาเป-นเลขศูนย - isupper(c) ฟ�งกชั่นการตรวจสอบว)าข�อมูลท่ีเก็บไว�ในตัวแปร c เป-นตัวอักษรตัวใหญ)หรือไม) ถ�าใช)จะส)งค)ากลับเป-นเลขจํานวนเต็มท่ีไม)เท)ากับศูนย แต)ถ�าไม)ใช)จะส)งค)ากลับมาเป-นเลขศูนย - tolower(c) ฟ�งกชั่นการเปลี่ยนตัวอักษรตัวใหญ)ท่ีเก็บไว�ในตัวแปร c ให�เป-นอักษรตัวเล็ก - toupper(c) ฟ�งกชั่นการเปลี่ยนตัวอักษรตัวเล็กท่ีเก็บไว�ในตัวแปร c ให�เป-นอักษรตัวใหญ) ฟ�งก�ช่ันสร@างเอง ฟ�งก�ช่ันสร@างเอง (User-Defined Function) เป-นฟ�งกชั่นท่ีผู�เขียนโปรแกรมเป-นผู�สร�างข้ึนมาเองเพ่ือทํางานอย)างใดอย)างหนึ่งตามท่ีต�องการ ฟ�งกชั่นประเภทนี้ อาจเรียกว)า ฟ�งก�ช่ันยEอย (Sub Function) เนื่องจากฟ�งกชั่นนี้ไม)ใช)ฟ�งกชั่นหลัก ฟ�งกชั่นย)อยถูกเรียกใช�งานโดยฟ�งกชั่นหลัก ดังภาพท่ี 7.3

#include <stdio.h> #include <conio.h> void func() { ... } int main() { ... func(); ... return 0; }

ภาพท่ี 7.3 ข้ันตอนการเรียกใช�ฟ�งกชั่นสร�างเองจากฟ�งกชั่นหลัก รูปนี้แสดงข้ันตอนการทํางานของโปรแกรมหนึ่งท่ีมีฟ�งกชั่นชื่อว)า func() มีรายละเอียด ดังนี้ 1. โปรแกรมนี้เริ่มทํางานจากบรรทัดบนสุด เม่ือมาเจอฟ�งกชั่น func() โปรแกรมข�ามไปทํางานท่ีฟ�งกชั่นหลักก)อน 2. ท่ีฟ�งกชั่นหลัก โปรแกรมทํางานเรียงตามลําดับจากบรรทัดแรกไปเรื่อยๆ จนถึงบรรทัดท่ีมีฟ�งกชั่นย)อย คือ func() ท่ีบรรทัดนี้ฟ�งกชั่นหลักเรียกใช�งานฟ�งกชั่น func() 3. เม่ือฟ�งกชั่น func() ถูกเรียกใช�งาน โปรแกรมย�อนกลับไปท่ีฟ�งกชั่น func() 4. ท่ีฟ�งกชั่น func() โปรแกรมทํางานเรียงตามลําดับจากบรรทัดแรกจนสิ้นสุดฟ�งกชั่นนี้ 5. เม่ือฟ�งกชั่น func() ทํางานเสร็จสิ้น โปรแกรมกลับไปทํางานต)อท่ีฟ�งกชั่นหลักตรงบรรทัดหลังจากฟ�งกชั่น func() 6. จากนั้นโปรแกรมทํางานคําสั่งส)วนท่ีเหลืออยู)ของฟ�งกชั่นหลักจนครบ 7. สิ้นสุดการทํางานของโปรแกรมนี้

1

2 3

4

5

6 7

167

รูปแบบของฟ�งก�ช่ันสร@างเอง ฟ�งกชั่นสร�างเอง มีรูปแบบท่ัวๆ ไป ดังภาพท่ี 7.4

ชนิดข@อมูลท่ีต@องการสEงออก ช่ือฟ�งก�ช่ัน(ชนิดข@อมูลท่ีรับเข@ามา ช่ือตัวแปรท่ีรับเข@ามา [, ...]) { ... }

ภาพท่ี 7.4 รูปแบบของฟ�งกชั่นสร�างเอง ฟ�งกชั่นสร�างเอง แบ)งเป-น 4 ประเภท คือ 1. ฟ�งกชั่นสร�างเองท่ีไม)มีการรับค)าเข�ามาในฟ�งกชั่น และไม)มีการส)งค)ากลับออกไปจากฟ�งกชั่น 2. ฟ�งกชั่นสร�างเองท่ีมีการรับค)าเข�ามาในฟ�งกชั่น แต)ไม)มีการส)งค)ากลับออกไปจากฟ�งกชั่น 3. ฟ�งกชั่นสร�างเองท่ีมีการรับค)าเข�ามาในฟ�งกชั่น และมีการส)งค)ากลับออกไปจากฟ�งกชั่น 4. ฟ�งกชั่นสร�างเองท่ีไม)มีการรับค)าเข�ามาในฟ�งกชั่น แต)มีการส)งค)ากลับออกไปจากฟ�งกชั่น โดยมีรายละเอียด ดังต)อไปนี้ ฟ�งก�ช่ันสร@างเองที่ไมEมีการรับคEาเข@ามาในฟ�งก�ช่ัน และไมEมีการสEงคEากลับออกไปจากฟ�งก�ช่ัน ฟ�งกชั่นประเภทนี้เป-นฟ�งกชั่นท่ีมีรูปแบบท่ีง)ายท่ีสุด เนื่องจากฟ�งกชั่นประเภทนี้ไม)มีการรับค)าเข�ามาและไม)มีการส)งค)าออกไป ฟ�งกชั่นสร�างเองประเภทนี้ มีรูปแบบ ดังภาพท่ี 7.5

void ช่ือฟ�งก�ช่ัน(void) { ... }

ภาพท่ี 7.5 รูปแบบของฟ�งกชั่นสร�างเองประเภทท่ี 1 การเรียกใช�ฟ�งกชั่นสร�างเองประเภทนี้ ให�เรียกชื่อฟ�งกชั่นโดยตรง ไม)ต�องส)งค)าเข�าไปและไม)ต�องมีตัวแปรมารองรับค)าท่ีคืนมาจากฟ�งกชั่น เนื่องจากฟ�งกชั่นประเภทนี้ไม)มีการรับค)าและส)งค)าคืนกลับมา ดังภาพท่ี 7.6

ช่ือฟ�งก�ช่ัน();

ภาพท่ี 7.6 การเรียกใช�ฟ�งกชั่นสร�างเองประเภทท่ี 1

168

ตัวอยEางท่ี 7.1 โปรแกรมแสดงรูปสี่เหลี่ยม โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 1

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

#include <stdio.h> #include <conio.h> void Rectangle(void) { printf("*********\n"); printf("*********\n"); printf("*********\n"); printf("*********\n"); } int main() { Rectangle(); getch(); return 0; }

ภาพท่ี 7.7 โปรแกรมแสดงรูปสี่เหลี่ยม โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 1 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.8

********* ********* ********* *********

ภาพท่ี 7.8 ผลลัพธของโปรแกรมแสดงรูปสี่เหลี่ยม โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 1 จากตัวอย)างนี้ เป-นการสร�างฟ�งกชั่น Rectangle() ซ่ึงเป-นฟ�งกชั่นสร�างเองประเภทท่ี 1 อยู)บรรทัดท่ี 4 ถึง 9 ส)วนการเรียกฟ�งกชั่น Rectangle() ใช�งานนั้น เพียงแค)ระบุชื่อฟ�งกชั่นตรงบรรทัดท่ี 13 (Rectangle();) เท)านั้น การทํางานของโปรแกรมนี้ เริ่มจากส)วนหัวของโปรแกรมไล)มาต้ังแต)บรรทัดท่ี 1 ถึง 2 จากนั้นไปบรรทัดท่ี 4 เม่ือโปรแกรมตรวจสอบแล�วว)าเป-นฟ�งกชั่นย)อย โปรแกรมข�ามไปทํางานท่ีบรรทัดท่ี 11 ซ่ึงเป-นฟ�งกชั่นหลัก ในฟ�งกชั่นหลัก โปรแกรมเริ่มทํางานต้ังแต)บรรทัดท่ี 12 เป-นต�นไป เ ม่ือทํางานมาถึงบรรทัดท่ี 13 (Rectangle();) พบว)ามีฟ�งกชั่นย)อยชื่อว)า Rectangle() โปรแกรมเข�าไปทํางานท่ีฟ�งกชั่นนี้ โดยกระโดดไปยังบรรทัดท่ี 4 ทําคําสั่งในฟ�งกชั่น Rectangle() จนสิ้นสุดฟ�งกชั่น จากนั้นโปรแกรมกลับมาทํางานต)อท่ีฟ�งกชั่นหลักโดยไปทําคําสั่งท่ีอยู)ถัดจากบรรทัดท่ี 13 (Rectangle();) ก็คือ บรรทัดท่ี 14 (getch();) ทําจนสิ้นสุดฟ�งกชั่นหลัก การทํางานของฟ�งกชั่น Rectangle() เป-นการแสดงข�อความ ********* จํานวน 4 แถว เพ่ือทําเป-นรูปสี่เหลี่ยม

169

ตัวอยEางท่ี 7.2 โปรแกรมแสดงสูตรคูณแม) 2 โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 1

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19

#include <stdio.h> #include <conio.h> void Multiply2(void) { int i; for(i=0; i<12; i++) { printf("2 x %d \t= %d\n", i+1, 2*(i+1)); } } int main() { Multiply2(); getch(); return 0; }

ภาพท่ี 7.9 โปรแกรมแสดงสูตรคูณแม) 2 โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 1 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.10

2 x 1 = 2 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

ภาพท่ี 7.10 ผลลัพธของโปรแกรมแสดงสูตรคูณแม) 2 โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 1 จากตัวอย)างนี้ เป-นการสร�างฟ�งกชั่น Multiply2() ซ่ึงเป-นฟ�งกชั่นสร�างเองประเภทท่ี 1 อยู)บรรทัดท่ี 4 ถึง 10 ส)วนการเรียกฟ�งกชั่น Multiply2() ใช�งานนั้น เพียงแค)ระบุชื่อฟ�งกชั่นเท)านั้นตรงบรรทัดท่ี 15 (Multiply2();) การทํางานของโปรแกรมนี้ เริ่มจากส)วนหัวของโปรแกรมไล)มาต้ังแต)บรรทัดท่ี 1 ถึง 2 จากนั้นไปบรรทัดท่ี 4 เม่ือโปรแกรมตรวจสอบแล�วว)าเป-นฟ�งกชั่นย)อย โปรแกรมข�ามไปท่ีบรรทัดท่ี 12 ซ่ึงเป-นฟ�งกชั่นหลัก ในฟ�งกชั่นหลัก โปรแกรมเริ่มทํางานต้ังแต)บรรทัดท่ี 13 เป-นต�นไป เม่ือทํางานมาถึงบรรทัดท่ี 14 (Multiply2();) พบว)ามีฟ�งกชั่นย)อยชื่อว)า Multiply2() โปรแกรมเข�าไปทํางานท่ีฟ�งกชั่นนี้ โดยกระโดดไปยังบรรทัดท่ี 4 ทําคําสั่งในฟ�งกชั่น Multiply2() จนสิ้นสุดฟ�งกชั่น จากนั้นโปรแกรมจะกลับมาทํางานต)อท่ีฟ�งกชั่นหลักโดยไปทําคําสั่งท่ีอยู)ถัดจากบรรทัดท่ี 14 (Multiply2();) ก็คือ บรรทัดท่ี 15 (getch();) ทําจนสิ้นสุดฟ�งกชั่นหลัก การทํางานของฟ�งกชั่น Multiply2() เป-นการแสดงสูตรคูณแม) 2 ฟ�งก�ช่ันสร@างเองที่มีการรับคEาเข@ามาในฟ�งก�ช่ัน แตEไมEมีการสEงคEากลับออกไปจากฟ�งก�ช่ัน ฟ�งกชั่นประเภทนี้ มีการรับค)าเข�ามาในฟ�งกชั่น แต)ไม)มีการส)งค)าออกไป โดยในฟ�งกชั่นหลักท่ีเรียกใช�ฟ�งกชั่นสร�างเองประเภทนี้ จะทําการส)งค)าเข�าไปยังฟ�งกชั่นสร�างเอง ในภาษาซีเรียกค)านี้ว)า พารามิเตอร� (Parameter) เม่ือค)านี้ท่ีถูกส)งไปแล�ว ในฟ�งกชั่นสร�างเองดังกล)าวจะกําหนดตัวแปรข้ึนมารองรับค)าท่ีถูกส)งมา ตัวแปรนี้ในภาษาซีเรียกว)า อาร�กิวเมนต� (Argument)

170

ฟ�งกชั่นสร�างเองประเภทนี้ มีรูปแบบ ดังภาพท่ี 7.11

void ช่ือฟ�งก�ช่ัน(ชนิดข@อมูลท่ีรับเข@ามา ช่ือตัวแปรท่ีรับเข@ามา [, ...]) { ... }

ภาพท่ี 7.11 รูปแบบของฟ�งกชั่นสร�างเองประเภทท่ี 2 จากรูปแบบของฟ�งกชั่นประเภทนี้ ชื่อตัวแปรท่ีรับเข�ามาก็คืออารกิวเมนตนั่นเอง ตรงส)วนนี้สามารถกําหนดอารกิวเมนตหนึ่งตัวหรือมากกว)าหนึ่งตัวได�(ตรง [, ..] เป-นการแจ�งว)าสามารถมีอารกิวเมนตเพ่ิมได�) ซ่ึงจํานวนอารกิวเมนตต�องเท)ากับจํานวนพารามิเตอรด�วย การเรียกใช�ฟ�งกชั่นสร�างเองประเภทนี้ ให�เรียกชื่อฟ�งกชั่นโดยตรง แต)ต�องส)งค)า(พารามิเตอร) เข�าไปโดยไม)ต�องมีตัวแปรมารองรับค)าท่ีคืนมาจากฟ�งกชั่น เนื่องจากฟ�งกชั่นประเภทนี้ไม)มีการส)งค)าคืนกลับมา ดังภาพท่ี 7.12

ช่ือฟ�งก�ช่ัน(พารามิเตอร�);

ภาพท่ี 7.12 การเรียกใช�ฟ�งกชั่นสร�างเองประเภทท่ี 2 ตัวอยEางท่ี 7.3 โปรแกรมแสดงรูปสี่เหลี่ยมด�วยตัวอักขระท่ีส)งเข�าไป โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 2

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

#include <stdio.h> #include <conio.h> void Rectangle(char c) { int i, j; for(i=0; i<4; i++) { for(j=0; j<9; j++) { printf("%c", c); } printf("\n"); } } int main() { char x; printf("Enter charactrer : "); scanf("%c", &x); Rectangle(x); getch(); return 0; }

ภาพท่ี 7.13 โปรแกรมแสดงรูปสี่เหลี่ยมด�วยตัวอักขระท่ีส)งเข�าไป โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 2 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.14

171

- รันโปรแกรมครั้งท่ี 1 ปiอนตัวอักขระ *

Enter Character : _

Enter Character : * ********* ********* ********* *********

- รันโปรแกรมครั้งท่ี 2 ปiอนตัวอักขระ x

Enter Character : _

Enter Character : x xxxxxxxxx xxxxxxxxx xxxxxxxxx xxxxxxxxx

ภาพท่ี 7.14 ผลลัพธของโปรแกรมแสดงรูปสี่เหลี่ยมด�วยตัวอักขระท่ีส)งเข�าไป โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 2

จากตัวอย)างนี้ เป-นการสร�างฟ�งกชั่น Rectangle() ซ่ึงเป-นฟ�งกชั่นสร�างเองประเภทท่ี 2 อยู)บรรทัดท่ี 4 ถึง 13 ส)วนการเรียกฟ�งกชั่น Rectangle() ใช�งานนั้น เพียงแค)ระบุชื่อฟ�งกชั่นเท)านั้นตรงบรรทัดท่ี 19 (Rectangle(c);) แต)จะต�องปiอนพารามิเตอรเข�าไปด�วย ในท่ีนี้พารามิเตอรคือ ตัวแปร c ท่ีต�องรับข�อมูลผ)านทางคียบอรด ส)วนฟ�งกชั่น Rectangle() บรรทัดท่ี 4 (void Rectangle(char c) {) ตรง char c ก็คืออารกิวเมนตท่ีกําหนดให�เป-นตัวแปรท่ีใช�รับค)า(พารามิเตอร) ท่ีถูกส)งมาจากฟ�งกชั่นหลัก

การทํางานของโปรแกรมนี้ เริ่มจากส)วนหัวของโปรแกรมไล)มาต้ังแต)บรรทัดท่ี 1 ถึง 2 จากนั้นไปบรรทัดท่ี 4 เม่ือโปรแกรมตรวจสอบแล�วว)าเป-นฟ�งกชั่นย)อย โปรแกรมข�ามไปท่ีบรรทัดท่ี 14 ซ่ึงเป-นฟ�งกชั่นหลัก ในฟ�งกชั่นหลัก โปรแกรมเริ่มทํางานต้ังแต)บรรทัดท่ี 15 เป-นต�นไป เม่ือทํางานมาถึงบรรทัดท่ี 19 (Rectangle(x);) พบว)ามีฟ�งกชั่นย)อยชื่อว)า Rectangle() โปรแกรมเข�าไปทํางานท่ีฟ�งกชั่นนี้ โดยกระโดดไปยังบรรทัดท่ี 4 ทําคําสั่งในฟ�งกชั่น Rectangle() จนสิ้นสุดฟ�งกชั่น จากนั้นโปรแกรมกลับมาทํางานต)อท่ีฟ�งกชั่นหลักโดยไปทําคําสั่งท่ีอยู)ถัดจากบรรทัดท่ี 19 (Rectangle(x);) ก็คือ บรรทัดท่ี 20 (getch();) ทําจนสิ้นสุดฟ�งกชั่นหลัก การทํางานของฟ�งกชั่น Rectangle() เป-นการแสดงรูปสี่เหลี่ยมด�วยตัวอักขระท่ีผู�ใช�งานปiอนผ)านทางคียบอรด ตัวอยEางท่ี 7.4 โปรแกรมแสดงสูตรคูณแม)ตามท่ีผู�ใช�งานระบุ โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 2

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

#include <stdio.h> #include <conio.h> void Multiply(int x) { int i; for(i=0; i<12; i++) { printf("%d x %d \t= %d\n", x, i+1, x*(i+1)); } } int main() { int i; printf("Enter Multiply no.: "); scanf("%d", &i); Multiply(i); getch(); return 0; }

ภาพท่ี 7.15 โปรแกรมแสดงสูตรคูณแม)ตามท่ีผู�ใช�งานระบุ โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 2

172

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.16 - รันโปรแกรมครั้งท่ี 1 ปiอนตัวเลข 2

Enter Multiply no. : _

Enter Multiply no. : 2 2 x 1 = 2 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

- รันโปรแกรมครั้งท่ี 2 ปiอนตัวเลข 5

Enter Multiply no. : _

Enter Multiply no. : 5 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 5 x 10 = 50 5 x 11 = 55 5 x 12 = 60

ภาพท่ี 7.16 ผลลัพธของโปรแกรมแสดงสูตรคูณแม)ตามท่ีผู�ใช�งานระบุ โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 2 จากตัวอย)างนี้ เป-นการสร�างฟ�งกชั่น Multiply() ซ่ึงเป-นฟ�งกชั่นสร�างเองประเภทท่ี 2 อยู)บรรทัดท่ี 4 ถึง 10 ส)วนการเรียกฟ�งกชั่น Multiply() ใช�งานนั้น เพียงแค)ระบุชื่อฟ�งกชั่นเท)านั้นตรงบรรทัดท่ี 18 (Multiply(i);) แต)ต�องปiอนพารามิเตอรเข�าไปด�วย ในท่ีนี้พารามิเตอรคือ ตัวแปร i ท่ีต�องรับข�อมูลผ)านทางคียบอรด ส)วนฟ�งกชั่น Multiply() บรรทัดท่ี 4 (void Multiply(int x) {) ตรง int x ก็คือ อารกิวเมนตท่ีกําหนดให�เป-นตัวแปรท่ีใช�รับค)า(พารามิเตอร) ท่ีถูกส)งมาจากฟ�งกชั่นหลัก

การทํางานของโปรแกรมนี้ เริ่มจากส)วนหัวของโปรแกรมไล)มาต้ังแต)บรรทัดท่ี 1 ถึง 2 จากนั้นไปบรรทัดท่ี 4 เม่ือโปรแกรมตรวจสอบแล�วว)าเป-นฟ�งกชั่นย)อย โปรแกรมข�ามไปท่ีบรรทัดท่ี 12 ซ่ึงเป-นฟ�งกชั่นหลัก ในฟ�งกชั่นหลัก โปรแกรมเริ่มทํางานต้ังแต)บรรทัดท่ี 13 เป-นต�นไป เม่ือทํางานมาถึงบรรทัดท่ี 18 (Multiply2();) พบว)ามีฟ�งกชั่นย)อยชื่อว)า Multiply2() โปรแกรมเข�าไปทํางานท่ีฟ�งกชั่นนี้ โดยกระโดดไปยังบรรทัดท่ี 4 ทําคําสั่งในฟ�งกชั่น Multiply2() จนสิ้นสุดฟ�งกชั่น จากนั้นโปรแกรมกลับมาทํางานต)อท่ีฟ�งกชั่นหลักโดยไปทําคําสั่งท่ีอยู)ถัดจากบรรทัดท่ี 18 (Multiply2();) ก็คือ บรรทัดท่ี 19 (getch();) ทําจนสิ้นสุดฟ�งกชั่นหลัก การทํางานของฟ�งกชั่น Multiply2() เป-นการแสดงสูตรคูณแม) 2 ฟ�งก�ช่ันสร@างเองที่มีการรับคEาเข@ามาในฟ�งก�ช่ัน และมีการสEงคEากลับออกไปจากฟ�งก�ช่ัน ฟ�งกชั่นประเภทนี้ มีการรับค)าเข�ามาในฟ�งกชั่น และมีการส)งค)าออกไป โดยในฟ�งกชั่นหลักท่ีเรียกใช�ฟ�งกชั่นสร�างเองประเภทนี้ จะทําการส)งค)า(พารามิเตอร) เข�าไปยังฟ�งกชั่นสร�างเอง ในฟ�งกชั่นสร�างเองนี้จะนําค)าดังกล)าวมาประมวลผลจนได�ผลลัพธ ผลลัพธท่ีได�จะถูกส)งค)ากลับออกไปจากฟ�งกชั่นสร�างเองกลับไปยังฟ�งกชั่นหลักหรือฟ�งกชั่นอ่ืนท่ีเรียกใช�งานฟ�งกชั่นนี้ ในภาษาซีมีคําสั่ง return เพ่ือใช�ในการส)งค)าคืนกลับออกไปจากฟ�งกชั่น ฟ�งกชั่นสร�างเองประเภทนี้ มีรูปแบบ ดังภาพท่ี 7.17

173

ชนิดข@อมูลท่ีต@องการสEงออก ช่ือฟ�งก�ช่ัน(ชนิดข@อมูลท่ีรับเข@ามา ช่ือตัวแปรท่ีรับเข@ามา [, ...]) { ... return คEาท่ีต@องการสEงออก; }

ภาพท่ี 7.17 รูปแบบของฟ�งกชั่นสร�างเองประเภทท่ี 3 จากรูปแบบของฟ�งกชั่นประเภทนี้ ค)าท่ีต�องการส)งออกต�องมีชนิดข�อมูลเดียวกับชนิดข�อมูลท่ีต�องการส)งออก การเรียกใช�ฟ�งกชั่นสร�างเองประเภทนี้ ให�หาตัวแปรท่ีมีชนิดข�อมูลเดียวกับค)าท่ีส)งคืนจากฟ�งกชั่นมารองรับค)าดังกล)าวด�วย ดังภาพท่ี 7.18

ตัวแปร = ช่ือฟ�งก�ช่ัน(พารามิเตอร�);

ภาพท่ี 7.18 การเรียกใช�ฟ�งกชั่นสร�างเองประเภทท่ี 3 ตัวอยEางท่ี 7.5 โปรแกรมหาผลบวกของเลข 2 จํานวน โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 3

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

#include <stdio.h> #include <conio.h> int Summation(int x, int y) { int z; z = x + y; return z; } int main() { int a, b, sum; printf("Enter number 1 : "); scanf("%d", &a); printf("Enter number 2 : "); scanf("%d", &b); sum = Summation(a, b); printf("\n%d + %d = %d", a, b, sum); getch(); return 0; }

ภาพท่ี 7.19 โปรแกรมหาผลบวกของเลข 2 จํานวน โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 3 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.20

174

- รันโปรแกรมครั้งท่ี 1 ปiอนตัวเลข 2 และ 4 Enter Number 1 : _

Enter Number 1 : 2 Enter Number 2 : _

Enter Number 1 : 2 Enter Number 2 : 4 2 + 4 = 6

- รันโปรแกรมครั้งท่ี 2 ปiอนตัวเลข 3 และ 8 Enter Number 1 : _

Enter Number 1 : 3 Enter Number 2 : _

Enter Number 1 : 3 Enter Number 2 : 8 3 + 8 = 11

ภาพท่ี 7.20 ผลลัพธของโปรแกรมหาผลบวกของเลข 2 จํานวน โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 3 จากตัวอย)างนี้ เป-นการสร�างฟ�งกชั่น Summation() ซ่ึงเป-นฟ�งกชั่นสร�างเองประเภทท่ี 3 อยู)บรรทัดท่ี 4 ถึง 8 ส)วนการเรียกฟ�งกชั่น Summation() ใช�งานนั้นในบรรทัดท่ี 17 (sum = Summation(a, b);) ได�กําหนดตัวแปร sum ท่ีมีชนิดข�อมูลแบบเลขจํานวนเต็ม (int) มารองรับข�อมูลค)าท่ีส)งคืนจากฟ�งกชั่น Summation() ซ่ึงมีชนิดข�อมูลเดียวกัน ในฟ�งกชั่น Summation() ได�ปiอนพารามิเตอร 2 ตัวคือ a และ b ซ่ึงเป-นตัวแปรท่ีใช�รับค)าผ)านทางคียบอรด ส)วนฟ�งกชั่น Summation() บรรทัดท่ี 4 (int Summation(int x, int y) {) ตรง int x และ int y ก็คือ อารกิวเมนต 2 ตัวท่ีกําหนดให�เป-นตัวแปรท่ีใช�รับค)าท่ีถูกส)งมาจากฟ�งกชั่นหลักคือ ตัวแปร a และ b ตามลําดับ

การทํางานของโปรแกรมนี้ เริ่มจากส)วนหัวของโปรแกรมไล)มาต้ังแต)บรรทัดท่ี 1 ถึง 2 จากนั้นไปบรรทัดท่ี 4 เม่ือโปรแกรมตรวจสอบแล�วว)าเป-นฟ�งกชั่นย)อย โปรแกรมข�ามไปท่ีบรรทัดท่ี 10 ซ่ึงเป-นฟ�งกชั่นหลัก ในฟ�งกชั่นหลัก โปรแกรมเริ่มทํางานต้ังแต)บรรทัดท่ี 11 เป-นต�นไป เม่ือทํางานมาถึงบรรทัดท่ี 17 (sum =

Summation(a, b);) พบว)ามีฟ�งกชั่นย)อยชื่อว)า Summation() โดยระบุพารามิเตอร a และ b โปรแกรมเข�าไปทํางานท่ีฟ�งกชั่นนี้ โดยกระโดดไปยังบรรทัดท่ี 4 ทํางานในฟ�งกชั่น Summation() โดยอารกิวเมนต x รับค)าจากตัวแปร a และอารกิวเมนต y รับค)าจากตัวแปร b ฟ�งกชั่น Summation() นําตัวแปร x และ y มาบวกกันในบรรทัดท่ี 6 (z = x + y;) ผลลัพธท่ีได�เก็บไว�ท่ีตัวแปร z จากนั้นบรรทัดท่ี 7 (return z;) เป-นการใช�คําสั่ง return เพ่ือส)งผลลัพธ (z) เพ่ือใช�ในการส)งค)าคืนกลับออกไปจากฟ�งกชั่น Summation() เม่ือทํางานจนสิ้นสุดฟ�งกชั่น จากนั้นโปรแกรมกลับมาทํางานต)อท่ีฟ�งกชั่นหลักโดยไปทําคําสั่งท่ีบรรทัดท่ี 17 (sum = Summation(a, b);) คือ ค)าท่ีถูกส)งคืนกลับมาจากฟ�งกชั่น Summation() นํามากําหนดให�กับตัวแปร sum นั่นเอง จากนั้นทํางานจนสิ้นสุดฟ�งกชั่นหลัก การทํางานของฟ�งกชั่น Summation() เป-นการนําตัวเลข 2 จํานวนมาบวกกัน

175

ตัวอยEางท่ี 7.6 โปรแกรมหาผลคูณของเลข 2 จํานวน โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 3

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

#include <stdio.h> #include <conio.h> int Multiplication(int x, int y) { int z; z = x * y; return z; } int main() { int a, b; printf("Enter number 1 : "); scanf("%d", &a); printf("Enter number 2 : "); scanf("%d", &b); printf("\n%d x %d = %d", a, b, Multiplication(a, b)); getch(); return 0; }

ภาพท่ี 7.21 โปรแกรมหาผลคูณของเลข 2 จํานวน โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 3 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.22 - รันโปรแกรมครั้งท่ี 1 ปiอนตัวเลข 2 และ 4

Enter Number 1 : _

Enter Number 1 : 2 Enter Number 2 : _

Enter Number 1 : 2 Enter Number 2 : 4 2 x 4 = 8

- รันโปรแกรมครั้งท่ี 2 ปiอนตัวเลข 3 และ 8 Enter Number 1 : _

Enter Number 1 : 3 Enter Number 2 : _

Enter Number 1 : 3 Enter Number 2 : 8 3 x 8 = 24

ภาพท่ี 7.22 ผลลัพธของโปรแกรมหาผลคูณของเลข 2 จํานวน โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 3 ตัวอย)างนี้เหมือนกับตัวอย)างท่ี 7.5 แต)เปลี่ยนจากการบวกเป-นการคูณของเลข 2 จํานวนแทน แต)ให�พิจารณาบรรทัดท่ี 17 (printf("\n%d x %d = %d", a, b, Multiplication(a, b));) เป-นการนําฟ�งกชั่น Multiplication() ไปใส)ในฟ�งกชั่น printf() การทําแบบนี้หมายความว)า ค)าท่ีถูกส)งคืนกลับมาจากฟ�งกชั่น Multiplication() นํามาใช�ในฟ�งกชั่น printf() ได�เลย ไม)ต�องหาตัวแปรมารองรับเหมือนกับตัวอย)างท่ี 7.5 ฟ�งก�ช่ันสร@างเองที่ไมEมีการรับคEาเข@ามาในฟ�งก�ช่ัน แตEมีการสEงคEากลับออกไปจากฟ�งก�ช่ัน ฟ�งกชั่นประเภทนี้ ไม)มีการรับค)าเข�ามาในฟ�งกชั่น แต)มีการส)งค)าออกไป โดยในฟ�งกชั่นหลักท่ีเรียกใช�ฟ�งกชั่นสร�างเองประเภทนี้ ไม)มีการส)งค)า(พารามิเตอร) เข�าไปยังฟ�งกชั่นสร�างเอง ในฟ�งกชั่นสร�างเองนี้จะมีการประมวลผลจนได�ผลลัพธ ผลลัพธท่ีได�จะถูกส)งค)ากลับออกไปจากฟ�งกชั่นสร�างเองกลับไปยังฟ�งกชั่นหลักหรือฟ�งกชั่นอ่ืนท่ีเรียกใช�งานฟ�งกชั่นนี้ ฟ�งกชั่นสร�างเองประเภทนี้ มีรูปแบบ ดังภาพท่ี 7.23

176

ชนิดข@อมูลท่ีต@องการสEงออก ช่ือฟ�งก�ช่ัน(void) { ... return คEาท่ีต@องการสEงออก; }

ภาพท่ี 7.23 รูปแบบของฟ�งกชั่นสร�างเองประเภทท่ี 4 การเรียกใช�ฟ�งกชั่นสร�างเองประเภทนี้ ให�หาตัวแปรท่ีมีชนิดข�อมูลเดียวกับค)าท่ีส)งคืนจากฟ�งกชั่นมารองรับค)าดังกล)าวด�วย ดังภาพท่ี 7.24

ตัวแปร = ช่ือฟ�งก�ช่ัน();

ภาพท่ี 7.24 การเรียกใช�ฟ�งกชั่นสร�างเองประเภทท่ี 4 ตัวอยEางท่ี 7.7 โปรแกรมแสดงตัวอักขระ A โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 4

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> #include <conio.h> char ShowA(void) { return 'A'; } int main() { printf("%c", ShowA()); getch(); return 0; }

ภาพท่ี 7.25 โปรแกรมแสดงตัวอักขระ A โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 4 เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.26

A

ภาพท่ี 7.26 ผลลัพธของโปรแกรมแสดงตัวอักขระ A โดยใช�ฟ�งกชั่นสร�างเองประเภทท่ี 4 โปรแกรมนี้เป-นการแสดงตัวอักขระ A โดยฟ�งกชั่น ShowA() เป-นฟ�งกชั่นท่ีไม)มีการรับค)าเข�า แต)มีการส)งค)ากลับออกไป รูปแบบของการจัดวางฟ�งก�ช่ันสร@างเองไว@ในโปรแกรม ฟ�งกชั่นสร�างเอง มีรูปแบบของการจัดวางไว�ในโปรแกรม 2 รูปแบบ คือ 1. วางอยูEเหนือฟ�งก�ช่ันหลัก รูปแบบนี้ไม)ต�องทําการประกาศชื่อฟ�งกชั่นสร�างเอง (Function Prototype) เนื่องจากฟ�งกชั่นสร�างเองอยู)เหนือฟ�งกชั่นหลัก ทําให�คอมไพเลอรรู�จักฟ�งกชั่นสร�างเองหรือมองเห็นได� ตัวอย)างฟ�งกชั่นสร�างเองรูปแบบนี้คือ ตัวอย)างท่ี 7.1 ถึง 7.7

177

2. วางอยูEใต@ฟ�งก�ช่ันหลัก รูปแบบนี้ต�องทําการประกาศชื่อฟ�งกชั่นไว�เหนือฟ�งกชั่นหลัก เนื่องจากฟ�งกชั่นอยู)ใต�ฟ�งกชั่นหลัก ทําให�คอมไพเลอรไม)รู�จักฟ�งกชั่นหรือมองไม)เห็น ตัวอย)างฟ�งกชั่นรูปแบบนี้คือ ตัวอย)างท่ี 7.8 และ 7.9 ตัวอยEางท่ี 7.8 โปรแกรมแสดงสูตรคูณแม)ตามท่ีผู�ใช�งานระบุ โดยวางฟ�งกชั่นสร�างเองใต�ฟ�งกชั่นหลัก

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

#include <stdio.h> #include <conio.h> void Multiply(int x); int main() { int i; printf("Enter Multiply no.: "); scanf("%d", &i); Multiply(i); getch(); return 0; } void Multiply(int x) { int i; for(i=0; i<12; i++) { printf("%d x %d \t= %d\n", x, i+1, x*(i+1)); } }

ภาพท่ี 7.27 โปรแกรมแสดงสูตรคูณแม)ตามท่ีผู�ใช�งานระบุ โดยวางฟ�งกชั่นสร�างเองใต�ฟ�งกชั่นหลัก ตัวอย)างนี้ ฟ�งกชั่น Multiply() อยู)ใต�ฟ�งกชั่นหลักตรงบรรทัดท่ี 19 ถึง 25 ดังนั้นจึงต�องทําการประกาศชื่อฟ�งกชั่น Multiply() ไว�ท่ีบรรทัดท่ี 4 (void Multiply(int x);) เพ่ือให�คอมไพเลอรรู�จักฟ�งกชั่น Multiply() ฟ�งก�ช่ันการเรียกซ้ํา การเรียกซํ้า (Recursion) หรือ การเวียนเกิด (Recurrence) เป-นปรากฏการณท่ีมีการกลับไปอ�างอิงถึงตนเอง (Self-Reference) หรือมีนิยามเช)นเดียวกันในลําดับตํ่าลงไป ปรากฏการณนี้มีปรากฏในหลายด�านเช)น คณิตศาสตร วิทยาการคอมพิวเตอร ศิลปะ ดนตรี การสร�างปฏิทรรศน เป-นต�น (ท่ีมา : วิกิพีเดีย สารานุกรมเสรี. การเรียกซํ้า, จากเว็บไซต : http://th.wikipedia.org/wiki/การเรียกซํ้า) ทางวิทยาการคอมพิวเตอร การเรียกซํ้า หมายถึง วิธีการเขียนโปรแกรมในลักษณะเรียกการทํางานซํ้าๆ เพ่ือแก�ป�ญหาบางประการ ในการเขียนโปรแกรมท่ีต�องมีการเรียกซํ้า นิยมเขียนส)วนท่ีเรียกซํ้าเป-น ฟ�งก�ช่ันเรียกซํ้า (Recursive Function) เนื่องจากการเขียนโปรแกรมท่ีมีฟ�งกชั่นแบบเรียกซํ้านั้น ค)อนข�างยากมากสําหรับผู�เริ่มเขียนโปรแกรม โดยเฉพาะประเด็นท่ีต�องมองป�ญหาให�เป-นประเด็นย)อยๆ ท่ีซํ้าๆ กัน แต)ลดรูปเล็กลงๆ ดังนั้นจึงสรุปข้ันตอนการเขียนฟ�งกชั่นแบบการเรียกซํ้าได� ดังนี้ 1. ทําความเข�าใจโจทยหรือป�ญหาให�ชัดเจน (Understand the problem) 2. หาจุดวกกลับหรือจุดทางออก (Determine the terminating condition) หมายความว)า ให�พิจารณาดูว)า เม่ือใดการเรียกซํ้าถึงจะจบลง พร�อมกับการส)งค)าคืนกลับไปยังจุดท่ีเรียก 3. หาข้ันตอนท่ีต�องเรียกซํ้า (Determine the recursive steps)

การประกาศชื่อฟ�งกชั่น Multiply() ไว�เหนือฟ�งกชั่นหลัก

ฟ� ง ก ชั่ น Multiply() อยู)ใต�ฟ�งกชั่นหลัก

178

โดยท่ัวไปข้ันตอนวิธีของการเขียนแบบเรียกซํ้า ใช�คําสั่ง if ดังภาพท่ี 7.28

if (เง่ือนไขท่ีมีผลให@ยุติการเรียกซํ้า (จุดวกกลับหรือจุดยุติ)) สEงคําตอบคืน else แยกป�ญหาออกเปeนประเด็นยEอย ด@วยการเรียกซํ้า

ภาพท่ี 7.28 ข้ันตอนวิธีของการเขียนโปรแกรมแบบการเรียกซํ้า จุดวกกลับหรือจุดทางออกของฟ�งกชั่นการเรียกซํ้า มีความสําคัญเป-นอย)างมากสําหรับการเขียนโปรแกรมแบบการเรียกซํ้า หากไม)มีหรือลืม ส)งผลให�มีการเรียกฟ�งกชั่นการเรียกซํ้าครั้งแล�วครั้งเล)าไปเรื่อยๆ จนเครื่องคอมพิวเตอรฟiองข�อผิดพลาดอันเนื่องมาจาก Stack Overflow เพราะเกิดเหตุการณท่ีเรียกว)า การเรียกซํ้าไม)รู�จบ (Infinite Recursion) ตัวอย)างของการเขียนโปรแกรมแบบการเรียกซํ้าท่ีนิยมนํามาอ�างถึงคือ แฟคทอเรียล (Factorial) ซ่ึงแสดงในตัวอย)างท่ี 7.9 ตัวอยEางท่ี 7.9 การเขียนฟ�งกชั่นแบบเรียกซํ้าชื่อ factorial เพ่ือรับค)า n เป-นพารามิเตอรชนิดจํานวนเต็ม แล�วหาค)าของ n! นิยามของแฟคทอเรียล n! = n x (n-1) x (n-2) x … x 3 x 2 x 1 โดยท่ี 0! = 1 และ n >= 0 ถ�านิยามแบบการเรียกซํ้า จะได� n! = n * (n-1)! โดยท่ี 0! = 1 และ n >= 0 วิธีเขียนการเรียกซํ้าของแฟคทอเรียล 1. ทําความเข�าใจโจทย จากนิยามการหาค)าของ n! คือ การหาค)าของ 1 * 2 * 3 * … * (n-1) * n 2. หาจุดวกกลับหรือจุดทางออก ให�สังเกตว)า ค)าของ n ท่ีส)งมาให�เป-นชนิดเลขจํานวนเต็ม หากลดค)าของ n ลงครั้งละ 1 ไปเรื่อยๆ จนกว)าจะถึง 0 (ศูนย) จะได�คําตอบว)า 0! คือ 1 3. หาข้ันตอนท่ีต�องเรียกเป-นแบบเรียกซํ้า จากนิยามสามารถนํามาเขียนสรุปเป-นแบบการเรียกซํ้าได� ดังนี้ n! = n * (n - 1)! หากต�องการหาค)าของ 4! 4! = 4 * 3! 4! = 4 * 3! = 4 * 6 = 24 3! = 3 * 2! 3! = 3 * 2! = 3 * 2 = 6 2! = 2 * 1! 2! = 2 * 1! = 2 * 1 = 2 1! = 1 * 0! 1! = 1 * 0! = 1 * 1 = 1 0! = 1

179

จะเห็นว)า เม่ือแทนค)าย�อนกลับข้ึนไปเรื่อยๆ จนในท่ีสุดได�คําตอบของ 4! คือ 24 ดังนั้น จากแนวทางการวิเคราะหข�างต�นฟ�งกชั่น factorial สามารถเขียนได� ดังนี้ int factorial(int n) { int fact; if(n == 0) fact = 1; else fact = n * factorial(n-1); return fact; } เม่ือนํามาเขียนเป-นโปรแกรม จะได�ดังภาพท่ี 7.29

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

#include <stdio.h> #include <conio.h> int factorial(int n) { int fact; if(n == 0) fact = 1; else fact = n * factorial(n-1); return fact; } int main() { int x, result; printf("Enter Number : "); scanf("%d", &x); result = factorial(x); printf("%d! = %d", x, result); getch(); return 0; }

ภาพท่ี 7.25 โปรแกรมแสดงแฟคทอเรียล โดยใช�ฟ�งกชั่นการเรียกซํ้า เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.26 - รันโปรแกรมครั้งท่ี 1 ปiอนตัวเลข 4

Enter Number : _

Enter Number : 4

4! = 24

- รันโปรแกรมครั้งท่ี 2 ปiอนตัวเลข 7

Enter Number : _

Enter Number : 7

7! = 5040

ภาพท่ี 7.26 ผลลัพธของโปรแกรมแสดงแฟคทอเรียล โดยใช�ฟ�งกชั่นการเรียกซํ้า

180

จากตัวอย)างนี้ กรณีปiอนตัวเลข 4 สามารถอธิบายข้ันตอนของการเรียกซํ้าได� ดังนี้ จากฟ�งกชั่นหลัก result = factorial(4); เรียกครั้งแรก n = 4 fact = 4 * factorial(4 - 1); เรียกครั้งท่ี 2 n = 3 fact = 3 * factorial(3 - 1); เรียกครั้งท่ี 3 n = 2 fact = 2 * factorial(2 - 1); เรียกครั้งท่ี 4 n = 1 fact = 1 * factorial(1 - 1); เรียกครั้งท่ี 5 n = 0 if(0 == 0) � เง่ือนไขเป-นจริง ดังนั้น fact = 1; ผลลัพธสุดท�าย ตัวแปร result บรรทัดท่ี 19 (result = factorial(x);) มีค)าเท)ากับ 24 จากตัวอย)างนี้ เป-นการแสดงวิธีการเขียนฟ�งกชั่นการเรียกซํ้า อันท่ีจริงป�ญหาดังกล)าว ไม)จําเป-นต�องเขียนแบบเรียกซํ้าก็ได� โดยสามารถเลือกแก�ป�ญหาด�วยการเขียนแบบวนรอบ โดยเป-นการวนรอบหลายๆ รอบแทน จะได�คําตอบเช)นกัน ซ่ึงอาจจะเขียนได�ง)ายกว)ากันด�วย ดังเช)นตัวอย)างฟ�งกชั่น factorial ซ่ึงสามารถเขียนแบบวนรอบด�วยการใช�คําสั่งทํา for ได� ดังนี้ int factorial(int n) { int fact, i; fact = 1; for(i=2; i<=n; i++) fact = fact * i; return fact; }

ส)งค)ากลับคืน fact เท)ากับ 1

ส)งค)ากลับคืน fact เท)ากับ 1

ส)งค)ากลับคืน fact เท)ากับ 2

ส)งค)ากลับคืน fact เท)ากับ 6

ส)งค)ากลับคืน fact เท)ากับ 24

181

ตัวอยEางท่ี 7.10 โปรแกรมการหาผลรวมของจํานวน n โดยใช�ฟ�งกชั่นการเรียกซํ้า

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

#include <stdio.h> #include <conio.h> int sum(int n){ int s; if(n == 1) s = 1; else s = sum(n-1) + n; return s; } int main() { int num; printf("Enter Number (n) : "); scanf("%d", &num); printf("Summation of this number is %d\n", sum(num)); getch(); return 0; }

ภาพท่ี 7.27 โปรแกรมการหาผลรวมของจํานวน n โดยใช�ฟ�งกชั่นการเรียกซํ้า เม่ือรันโปรแกรมนี้ จะได�ผลลัพธดังภาพท่ี 7.28 - รันโปรแกรมครั้งท่ี 1 ปiอนตัวเลข 3

Enter Number : _

Enter Number : 3

Summation of this number is 6

- รันโปรแกรมครั้งท่ี 1 ปiอนตัวเลข 6

Enter Number : _

Enter Number : 6

Summation of this number is 21

ภาพท่ี 7.28 ผลลัพธของโปรแกรมการหาผลรวมของจํานวน n โดยใช�ฟ�งกชั่นการเรียกซํ้า จากตัวอย)างนี้ เป-นการหาผลรวมของจํานวน n ซ่ึงหากให� n มีค)าเท)ากับ 4 เป-นการนําเลขต้ังแต) 1 จนถึง 4 มาบวกกัน คือ 4+3+2+1 ผลลัพธเท)ากับ 10 หรือ n มีค)าเท)ากับ 6 ได�ผลลัพธเท)ากับ 6+5+4+3+2+1 หรือเท)ากับ 21 โดยใช�ฟ�งกชั่นการเรียกซํ้า sum() ในบรรทัดท่ี 4 ถึง 10 จากตัวอย)างนี้ กรณีปiอนตัวเลข 3 สามารถอธิบายข้ันตอนของการเรียกซํ้าได� ดังนี้ - จากฟ�งกชั่นหลัก sum(3); - เรียกครั้งแรก n = 3 s = sum(3 - 1) + 3; - เรียกครั้งท่ี 2 n = 2 s = sum(2 - 1) + 2; - เรียกครั้งท่ี 3 n = 1 if(1 == 1) � เง่ือนไขเป-นจริง ดังนั้น s = 1; ผลลัพธสุดท�าย ฟ�งกชั่น sum(num) บรรทัดท่ี 20 (printf("Summation of this number is %d\n", sum(num));) มีค)าเท)ากับ 6

ส)งค)ากลับคืน s เท)ากับ 3

ส)งค)ากลับคืน s เท)ากับ 6

ส)งค)ากลับคืน s เท)ากับ 1

182

การวนรอบกับการเรียกซํ้า (Repetition VS Recursion) การเขียนโปรแกรมแบบวนรอบกับการเรียกซํ้ามีการเปรียบเทียบระหว)างกัน ดังตารางท่ี 7.1

การวนรอบ การเรียกซํ้า 1. เขียนง)ายกว)าการเรียกซํ้า 1. เขียนยากกว)าการวนรอบ 2. เพ่ือควบคุมการวนรอบ ชุดคําสั่งท่ีเขียนจะต�องมีการใช�คําสั่งวนรอบ เช)น while, do while หรือ for

2. เพ่ือควบคุมการเรียกซํ้า ชุดคําสั่งท่ีเขียน จะต�องมีคําสั่งแบบเลือก เช)น คําสั่ง if-else แต)จะไม)ใช�การวนรอบในการเรียกซํ้า

3. ประสิทธิภาพในการประมวลผลจะดีกว)าการเรียกซํ้า

3. ประสิทธิภาพในการประมวลจะด�อยกว)าการวนรอบ

ตารางท่ี 7.1 ตารางการเปรียบเทียบระหว)างการเขียนโปรแกรมแบบวนรอบกับการเรียกซํ้า จากตารางจะเห็น การวนรอบทํางานได�เร็วกว)าการเรียกไปท่ีฟ�งกชั่น โดยการประมวลผล การวนรอบใช�เนื้อท่ีในหน)วยความจําน�อยกว)าเม่ือเทียบกับการเรียกซํ้า เนื่องจากทุกครั้งท่ีโปรแกรมเรียกตัวเอง(เรียกซํ้า) เครื่องคอมพิวเตอรจําเป-นต�องเก็บค)าป�จจุบันของตัวแปรท้ังหมดไว� พร�อมท้ังบันทึกสภาวะแวดล�อมต)างๆ ในการทํางานของโปรแกรม ณ ขณะนั้นไว� จากนั้นถึงจะเริ่มสร�างสภาวะแวดล�อมใหม) เพ่ือการทํางานในรอบต)อไป กล)าวโดยสรุป โดยท่ัวๆ ไป การแก�ป�ญหาแบบการเรียกซํ้ามีประสิทธิภาพด�อยกว)าแบบการวนรอบ อย)างไรก็ตาม ในบางป�ญหาหากเขียนเป-นแบบวนรอบ อาจต�องเขียนยาวมาก ท้ังยาก และซับซ�อนกว)า แต)หากเลือกแก�ป�ญหาด�วยการเขียนแบบการเรียกซํ้า อาจเขียนได�สั้นและกระชับมากกว)า อ)านก็ง)ายกว)า ดังนั้นการเลือกเขียนโปรแกรมแบบใดก็ข้ึนอยู)กับลักษณะของป�ญหา เกณฑโดยท่ัวไปหากเขียนแบบวนรอบได�ง)ายก็ให�เลือกเขียนแบบวนรอบก)อนเสมอ เว�นเสียแต)พบว)า การเขียนแบบวนรอบเขียนได�ยากกว)า จึงให�เลือกเขียนแบบการเรียกซํ้าแทน สรุป ในบทเรียนนี้ได�อธิบายถึง ฟ�งกชั่นคือ ส)วนของโปรแกรมท่ีทํางานเสร็จสิ้นภายในตัวเอง ส)วนของโปรแกรมดังกล)าวประกอบด�วยคําสั่งหรือกลุ)มของคําสั่งท่ีมีหน�าท่ีเพ่ือจุดประสงคเดียวกัน ภาษาซีแบ)งฟ�งกชั่นออกเป-น 2 ประเภทคือ ฟ�งกชั่นมาตรฐานของภาษาซี และฟ�งกชั่นสร�างเอง ซ่ึงฟ�งกชั่นสร�างเองยังแบ)งออกเป-น 4 ประเภทคือ ฟ�งกชั่นสร�างเองท่ีไม)มีการรับค)าเข�ามาในฟ�งกชั่น และไม)มีการส)งค)ากลับออกไปจากฟ�งกชั่น ฟ�งกชั่นสร�างเองท่ีมีการรับค)าเข�ามาในฟ�งกชั่น แต)ไม)มีการส)งค)ากลับออกไปจากฟ�งกชั่น ฟ�งกชั่นสร�างเองท่ีมีการรับค)าเข�ามาในฟ�งกชั่น และมีการส)งค)ากลับออกไปจากฟ�งกชั่น และฟ�งกชั่นสร�างเองท่ีไม)มีการรับค)าเข�ามาในฟ�งกชั่น แต)มีการส)งค)ากลับออกไปจากฟ�งกชั่น ข้ันตอนการเรียกใช�ฟ�งกชั่นสร�างเองจากฟ�งกชั่นหลัก เม่ือโปรแกรมทําคําสั่งในฟ�งกชั่นหลักจนมาถึงบรรทัดท่ีมีการเรียกใช�ฟ�งกชั่นสร�างเอง โปรแกรมจะกระโดดไปทํางานท่ีฟ�งกชั่นสร�างเองจนสิ้นสุด จากนั้นจึงกลับมาทํางานท่ีฟ�งกชั่นหลักต)อจนจบโปรแกรม สําหรับพารามิเตอรคือ ค)าท่ีถูกส)งเข�าไปยังฟ�งกชั่น ส)วนอารกิวเมนตคือ ตัวแปรท่ีกําหนดข้ึนมารองรับค)าท่ีถูกส)งเข�ามาในฟ�งกชั่น รวมถึงการเรียกซํ้าหมายถึง วิธีการเขียนโปรแกรมในลักษณะเรียกการทํางานซํ้าๆ เพ่ือแก�ป�ญหาบางประการ

183

คําถามทบทวน 1. จงเขียนโปรแกรมโดยสร�างฟ�งกชั่นสร�างเองเพ่ือหาเกรด โดยให�ผู�ใช�งานปiอนคะแนนผ)านทางคียบอรด แสดงผลลัพธผ)านทางหน�าจอ 2. จงเขียนโปรแกรมโดยสร�างฟ�งกชั่นสร�างเองเพ่ือหาพ้ืนท่ีวงกลม ให�ผู�ใช�งานปiอนรัศมีผ)านทางคียบอรด แสดงผลลัพธผ)านทางหน�าจอ 3. จงเขียนโปรแกรมโดยสร�างฟ�งกชั่นสร�างเองเพ่ือหาผลรวมและผลคูณของเลขจํานวนเต็มท่ีปiอนผ)านทางคียบอรด 3 จํานวน โดยให�เลือกว)าเป-นการหาผลรวมหรือผลคูณ แสดงผลลัพธผ)านทางหน�าจอ ดังนี้

Enter summation(s) or multiply(m) : s Enter Number 1 : 2 Enter Number 2 : 3 Enter Number 3 : 4

Enter summation(s) or multiply(m) : s Enter Number 1 : 2 Enter Number 2 : 3 Enter Number 3 : 4 Result of summation is 9

หรือ Enter summation(s) or multiply(m) : m Enter Number 1 : 2 Enter Number 2 : 3 Enter Number 3 : 4

Enter summation(s) or multiply(m) : m Enter Number 1 : 2 Enter Number 2 : 3 Enter Number 3 : 4 Result of multiply is 24

4. จงเขียนโปรแกรมโดยสร�างฟ�งกชั่นสร�างเองเพ่ือแสดงผลลัพธท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

Enter Number : _

Enter Number : 3 1 * 2 ** 3***

หรือ Enter Number : _

Enter Number : 5 1 * 2 ** 3 *** 4 **** 5*****

5. จงเขียนโปรแกรมโดยสร�างฟ�งกชั่นสร�างเองเพ่ือแสดงผลลัพธท่ีหน�าจอ ดังรูป โดยใช�โครงสร�างแบบวนรอบ คือ ใช�คําสั่ง while, do while หรือ for

Enter Number : _

Enter Number : 3 1 2 3

หรือ Enter Number : _

Enter Number : 6 1 2 3 4 5 6

6. จงเขียนโปรแกรมโดยสร�างฟ�งกชั่นการเรียกซํ้าเพ่ือแสดงผลลัพธของ mn ท่ีหน�าจอดังรูป โดยรับข�อมูล m และ n ผ)านทางคียบอรด กําหนดให� mn = m * mn-1

184 Enter Number m : _

Enter Number m : 2 Enter Number n : _

Enter Number m : 2 Enter Number n : 3 2 ^ 3 is 8

หรือ Enter Number m : _

Enter Number m : 3 Enter Number n : _

Enter Number m : 3 Enter Number n : 4 3 ^ 4 is 81

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall.

186

แผนบริหารการสอนประจําบทท่ี 8 หัวข�อเน้ือหาประจําบท 1. ตัวแปรโครงสร�างคืออะไร 2. การประกาศตัวแปรโครงสร�าง 3. การกําหนดค�าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�าง 4. การเข�าถึงสมาชิกแต�ละตัวของตัวแปรโครงสร�าง 5. ตัวแปรอาเรย+ของตัวแปรโครงสร�าง วัตถุประสงค! เม่ือผู�เรียนศึกษาบทเรียนจบแล�ว จะมีความสามารถดังนี้ 1. อธิบายความหมายของตัวแปรโครงสร�างได� 2. เขียนโปรแกรมเชิงโครงสร�างกับตัวแปรโครงสร�างได� 3. อธิบายความหมายของตัวแปรอาเรย+ของตัวแปรโครงสร�างได� 4. เขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย+ของตัวแปรโครงสร�างได� กิจกรรมการเรียนการสอน 1. อธิบายการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรโครงสร�าง โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย�างโปรแกรมเชิงโครงสร�างกับตัวแปรโครงสร�าง 2. อธิบายการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย+ของตัวแปรโครงสร�าง โดยใช�โปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย�างโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย+ของตัวแปรโครงสร�าง 3. แบ�งผู�เรียนออกเป6นกลุ�ม โดยปฏิบัติตามใบงานท่ี 8 ดังนี้ 3.1 ให�ผู�เรียนฝ;กปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรโครงสร�าง 3.2 ให�ผู�เรียนฝ;กปฏิบัติในการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรอาเรย+ของตัวแปรโครงสร�าง 3.3 ให�ตัวแทนแต�ละกลุ�มออกมานําเสนอผลการปฏิบัติตามใบงาน และร�วมกันอภิปรายว�าโปรแกรมท่ีเขียนข้ึนมานั้นเป6นอย�างไร 4. ร�วมกันสรุปความรู�เก่ียวกับการเขียนโปรแกรมเชิงโครงสร�างกับตัวแปรโครงสร�างและตัวแปรอาเรย+ ของตัวแปรโครงสร�าง จากนั้นซักถามผู�เรียน รวมถึงให�ผู�เรียนตอบคําถามทบทวน สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 8 4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน 3. สังเกตการณ+ปฏิบัติงานกลุ�ม

188

4. ตรวจงานจากใบงาน 5. ตรวจแบบฝ;กหัด

บทท่ี 8 ตัวแปรโครงสร�าง

บทนํา ตัวแปรโครงสร�างเป�นตัวแปรอีกประเภทหนึ่งท่ีมีใช�ในภาษาซี เป�นตัวแปรท่ีใช�ในการจัดเก็บข�อมูล บทนี้จะได�อธิบายว+าตัวแปรโครงสร�างคืออะไร การประกาศตัวแปรโครงสร�างมีก่ีรูปแบบ การกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�างทําอย+างไร การเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�างต�องทําอย+างไร และตัวแปรอาเรย0ของตัวแปรโครงสร�างมีประโยชน0อย+างไร ตัวแปรโครงสร�างคืออะไร จากความหมายของตัวแปรอาเรย0ในบทก+อนหน�านี้ ตัวแปรอาเรย0ถูกสร�างข้ึนมาเพ่ือแก�ป2ญหาในการจัดเก็บข�อมูลชนิดเดียวกันจํานวนหลายๆ ค+าไว�ในตัวแปรเดียวกัน เพ่ือสะดวกต+อการเขียนโปรแกรมจัดการข�อมูลดังกล+าว แต+ถ�าเป�นการเก็บข�อมูลท่ีมีจํานวนมาก โดยข�อมูลดังกล+าวมีชนิดข�อมูลหลายชนิดด�วยกัน เช+น ต�องการเก็บข�อมูลของเพ่ือนในชั้นเรียน คือ ชื่อเล+น โทรศัพท0เคลื่อนท่ี อีเมล0 น้ําหนัก และส+วนสูง จากข�อมูลของเพ่ือนในชั้นเรียนพบว+า ชื่อเล+น ต�องใช�ชนิดข�อมูลแบบสตริง โทรศัพท0เคลื่อนท่ี ต�องใช�ชนิดข�อมูลแบบสตริง อีเมล0 ต�องใช�ชนิดข�อมูลแบบสตริง น้ําหนัก ต�องใช�ชนิดข�อมูลแบบเลขจํานวนทศนิยม และส+วนสูง ต�องใช�ชนิดข�อมูลแบบเลขจํานวนทศนิยม โดยข�อมูลดังกล+าวจะใช�ชนิดข�อมูลท่ีแตกต+างกัน ดังนั้นหากต�องการเก็บข�อมูลดังกล+าว จะต�องประกาศตัวแปรข้ึนมาเพ่ือรองรับ ดังนี้ char nickname[50]; char mobile[100]; float weight; float height; จะเห็นว+าข�อมูลเหล+านี้มีชนิดข�อมูลท่ีแตกต+างกันสําหรับข�อมูลเพ่ือน 1 คน เช+น เพ่ือนชื่อต6อง มีมือถือเบอร0 0812345678 น้ําหนัก 56 กิโลกรัม และส+วนสูง 165 เซนติเมตร หากต�องการเก็บข�อมูลเพ่ือนจํานวน 30 คนจะทําอย+างไร ภาษาซีได�กําหนดตัวแปรโครงสร�างข้ึนมา เพ่ือรองรับการจัดเก็บข�อมูลดังกล+าวได� ตัวแปรโครงสร�าง (Structure Variable) คือ ชุดของตัวแปรท่ีมีชนิดข�อมูลเดียวกันหรือแตกต+างกันก็ได� ตัวแปรดังกล+าวจะมีความสัมพันธ0หรือเก่ียวข�องกัน ถูกนํามาเก็บไว�ภายในโครงสร�างเดียวกัน และตัวแปรแต+ละตัวเรียกว+า สมาชิก (Member) การประกาศตัวแปรโครงสร�าง รูปแบบการประกาศตัวแปรโครงสร�างมี 3 รูปแบบ คือ 1. แบบท่ี 1 ดังภาพท่ี 8.1

190

struct ช่ือตัวแปรโครงสร�าง { ชนิดข�อมูลตัวท่ี 1 ตัวแปรตัวท่ี 1; ชนิดข�อมูลตัวท่ี 2 ตัวแปรตัวท่ี 2; ชนิดข�อมูลตัวท่ี 3 ตัวแปรตัวท่ี 3; ... ชนิดข�อมูลตัวท่ี n ตัวแปรตัวท่ี n; } ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง;

ภาพท่ี 8.1 รูปแบบการประกาศตัวแปรโครงสร�างแบบท่ี 1 ตัวอย+างของการประกาศตัวแปรโครงสร�างแบบท่ี 1 struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } myfriend; โดยท่ี friend คือ ชื่อตัวแปรโครงสร�าง nickname, mobile, weight และ height คือ สมาชิกของตัวแปรโครงสร�าง MyFriend myfriend คือ ชื่อตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง 2. แบบท่ี 2 ดังภาพท่ี 8.2

struct ช่ือตัวแปรโครงสร�าง { ชนิดข�อมูลตัวท่ี 1 ตัวแปรตัวท่ี 1; ชนิดข�อมูลตัวท่ี 2 ตัวแปรตัวท่ี 2; ชนิดข�อมูลตัวท่ี 3 ตัวแปรตัวท่ี 3; ... ชนิดข�อมูลตัวท่ี n ตัวแปรตัวท่ี n; }; struct ช่ือตัวแปรโครงสร�าง ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง;

ภาพท่ี 8.2 รูปแบบการประกาศตัวแปรโครงสร�างแบบท่ี 2 ตัวอย+างของการประกาศตัวแปรโครงสร�างแบบท่ี 2 struct MyFriend { char nickname[50]; char mobile[100]; float weight;

191

float height; }; struct MyFriend myfriend; โดยท่ี friend คือ ชื่อตัวแปรโครงสร�าง nickname, mobile, weight และ height คือ สมาชิกของตัวแปรโครงสร�าง MyFriend myfriend คือ ชื่อตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง 3. แบบท่ี 3 ดังภาพท่ี 8.3

typedef struct { ชนิดข�อมูลตัวท่ี1 ตัวแปรตัวท่ี1; ชนิดข�อมูลตัวท่ี2 ตัวแปรตัวท่ี2; ชนิดข�อมูลตัวท่ี3 ตัวแปรตัวท่ี3; ... ชนิดข�อมูลตัวท่ีn ตัวแปรตัวท่ีn; } ช่ือตัวแปรโครงสร�างท่ีเปLนชนิดข�อมูลใหมN; ช่ือตัวแปรโครงสร�างท่ีเปLนชนิดข�อมูลใหมN ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง;

ภาพท่ี 8.3 รูปแบบการประกาศตัวแปรโครงสร�างแบบท่ี 3 รูปแบบท่ี 3 คําสงวน typedef เป�นการกําหนดชนิดข�อมูลข้ึนมาใหม+ และชื่อตัวแปรโครงสร�างท่ีจะกําหนดให�เป�นชนิดข�อมูลใหม+ นิยมใช�ตัวอักษรใหญ+ท้ังหมดและใช�เครื่องหมาย Underscore (_) เป�นตัวค่ันกรณีท่ีชื่อตัวแปรโครงสร�างนั้นมีมากกว+า 1 คํา เช+น STUDENT_FRIEND เป�นต�น ตัวอย+างของการประกาศตัวแปรโครงสร�างแบบท่ี 3 typedef struct { char nickname[50]; char mobile[100]; float weight; float height; } MYFRIEND; MYFRIEND myfriend; โดยท่ี friend คือ ชื่อตัวแปรโครงสร�าง nickname, mobile, weight และ height คือ สมาชิกของตัวแปรโครงสร�าง MYFRIEND MYFRIEND คือ ชื่อตัวแปรโครงสร�างท่ีเป�นชนิดข�อมูลใหม+ myfriend คือ ชื่อตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง

192

การกําหนดคNาเร่ิมต�นให�กับสมาชิกของตัวแปรโครงสร�าง การกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�างแบบท่ี 1 และ 2 คล�ายกับการกําหนดค+าเริ่มต�นให�กับตัวแปรอาเรย0 รูปแบบการกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�าง ดังภาพท่ี 8.4

struct ช่ือตัวแปรโครงสร�าง ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง = {คNาท่ี1, คNาท่ี2, คNาท่ี3, ..., คNาท่ีn};

ภาพท่ี 8.4 รูปแบบการกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�างแบบท่ี 1 และ 2 โดยท่ี ค+าท่ี1 กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี 1 ของตัวแปรโครงสร�าง ค+าท่ี2 กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี 2 ของตัวแปรโครงสร�าง ค+าท่ี3 กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี 3 ของตัวแปรโครงสร�าง ... ค+าท่ืn กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี n ของตัวแปรโครงสร�าง ตัวอย+างการกําหนดค+าให�กับสมาชิกของตัวแปรโครงสร�าง - แบบท่ี 1 struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } myfriend1 = {"Tong", "0812345678", 56.00, 165.00}; struct MyFriend myfriend2 = {"Nong", "0812345671", 65.00, 179.00}; - แบบท่ี 2 struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } ; struct MyFriend myfriend1 = {"Tong", "0812345678", 56.00, 165.00}; struct MyFriend myfriend2 = {"Nong", "0812345671", 65.00, 179.00};

193

- แบบท่ี 3 รูปแบบการกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�าง ดังภาพท่ี 8.5

ช่ือตัวแปรโครงสร�างท่ีเปLนชนิดข�อมูลใหมN ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง = {คNาท่ี1, คNาท่ี2, คNาท่ี3, ..., คNาท่ีn};

ภาพท่ี 8.5 รูปแบบการกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�างแบบท่ี 3 โดยท่ี ค+าท่ี1 กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี 1 ของตัวแปรโครงสร�าง ค+าท่ี2 กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี 2 ของตัวแปรโครงสร�าง ค+าท่ี3 กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี 3 ของตัวแปรโครงสร�าง ... ค+าท่ืn กําหนดค+าเริ่มต�นให�กับสมาชิกตัวท่ี n ของตัวแปรโครงสร�าง ตัวอย+างการกําหนดค+าให�กับสมาชิกของตัวแปรโครงสร�างแบบท่ี 3 typedef struct { char nickname[50]; char mobile[100]; float weight; float height; } MYFRIEND; MYFRIEND myfriend1 = {"Tong", "0812345678", 56.00, 165.00}; MYFRIEND myfriend2 = {"Nong", "0812345671", 65.00, 179.00}; หากกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�างให�ไม+ครบทุกตัว สมาชิกท่ีไม+ถูกกําหนดค+า จะถูกแทนท่ีด�วยค+า null ถ�าสมาชิกตัวนั้น - มีชนิดข�อมูลแบบเลขจํานวนเต็ม จะถูกแทนท่ีด�วยค+า 0 - มีชนิดข�อมูลแบบเลขทศนิยม จะถูกแทนท่ีด�วยค+า 0.0 - มีชนิดข�อมูลแบบตัวอักขระหรือสตริง จะถูกแทนท่ีด�วยค+า \0 การเข�าถึงสมาชิกแตNละตัวของตัวแปรโครงสร�าง รูปแบบการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง ดังภาพท่ี 8.6

ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง.สมาชิก

ภาพท่ี 8.6 รูปแบบการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง

194

เช+น myfriend.nickname ตัวอย+างของการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } myfriend1 = {"Tong", "0812345678", 56.00, 165.00}; - การเข�าถึงสมาชิก nickname ทําได�โดยระบุ myfriend1.nickname จะได�ค+า Tong - การเข�าถึงสมาชิก mobile ทําได�โดยระบุ myfriend1.mobile จะได�ค+า 0812345678 - การเข�าถึงสมาชิก weight ทําได�โดยระบุ myfriend1.weight จะได�ค+า 56.00 - การเข�าถึงสมาชิก height ทําได�โดยระบุ myfriend1.height จะได�ค+า 165.00 ตัวอยNางท่ี 8.1 โปรแกรมแสดงการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง myfriend

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

#include <stdio.h> #include <conio.h> int main(void) { struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; }; struct MyFriend myfriend1 = {"Tong", "0812345678", 56.00, 165.00}; printf("My Friend\n"); printf("- Nick name : %s\n", myfriend1.nickname); printf("- Mobile : %s\n", myfriend1.mobile); printf("- Weight : %f\n", myfriend1.weight); printf("- Height : %f\n", myfriend1.height); getch(); return 0; }

ภาพท่ี 8.7 โปรแกรมแสดงการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง MyFriend เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ0ดังภาพท่ี 8.8

My Friend - Nick name : Tong - Mobile : 0812345678 - Weight : 56.00 - Height : 165.00

ภาพท่ี 8.8 ผลลัพธ0ของโปรแกรมแสดงการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง MyFriend

nickname คือ ชื่อสมาชิกท่ีต�องการเข�าถึง

myfriend คือ ชื่อตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง เครื่องหมาย full stop (.)

195

จากตัวอย+างนี้ เป�นการประกาศตัวแปรโครงสร�าง MyFriend บรรทัดท่ี 6 ถึง 11 ประกอบด�วยสมาชิก 4 ตัวคือ nickname, mobile, weight และ height จากนั้นเป�นการประกาศตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง myfriend1 บรรทัดท่ี 12 (struct MyFriend myfriend1 = {"Tong", "0812345678", 56.00, 165.00};) พร�อมท้ังกําหนดค+าเริ่มต�นให�ด�วย ส+วนบรรทัดท่ี 14 ถึง 18 เป�นการนําข�อมูลจากตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง myfriend1 มาแสดงผลท่ีหน�าจอ ตัวอยNางท่ี 8.2 โปรแกรมแสดงการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง employee

01 02 03 04 05 06 07 08 09 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

#include <stdio.h> #include <conio.h> int main(void) { struct employee { char name[50]; char surname[50]; char gender; char mobile[100]; char position[50]; char department[50]; float salary; }; struct employee emp1 = {"Sombat", "Nadee", 'M', "0897654321", "Manager", "Information Technology", 50000.00}; struct employee emp2 = {"Somchai", "Jaidee", 'M', "0897699321", "System Anlyst", "Information Technology", 35000.00}; struct employee emp3 = {"Somri", "Yaksao", 'F', "0899954321", "Sr.Programmer", "Information Technology", 20000.00}; printf("Employee No.1\n"); printf("- Name : %s\n", emp1.name); printf("- Surname : %s\n", emp1.surname); if(emp1.gender='M') printf("- Gender : Male\n"); else printf("- Gender : Female\n"); printf("- Mobile : %s\n", emp1.mobile); printf("- Position : %s\n", emp1.position); printf("- Department: %s\n", emp1.department); printf("- Salary : %f\n", emp1.salary); printf("Employee No.2\n"); printf("- Name : %s\n", emp2.name); printf("- Surname : %s\n", emp2.surname); if(emp1.gender='M') printf("- Gender : Male\n"); else printf("- Gender : Female\n"); printf("- Mobile : %s\n", emp2.mobile); printf("- Position : %s\n", emp2.position); printf("- Department: %s\n", emp2.department); printf("- Salary : %f\n", emp2.salary); getch(); printf("Employee No.3\n"); printf("- Name : %s\n", emp3.name); printf("- Surname : %s\n", emp3.surname); if(emp1.gender='M') printf("- Gender : Male\n"); else printf("- Gender : Female\n"); printf("- Mobile : %s\n", emp3.mobile); printf("- Position : %s\n", emp3.position); printf("- Department: %s\n", emp3.department); printf("- Salary : %f\n", emp3.salary); return 0; }

ภาพท่ี 8.9 โปรแกรมแสดงการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง employee

196

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ0ดังภาพท่ี 8.10

My Friend - Nick name : Tong - Mobile : 0812345678 - Weight : 56.00 - Height : 165.00

ภาพท่ี 8.10 ผลลัพธ0ของโปรแกรมแสดงการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�าง employee จากตัวอย+างนี้ จะคล�ายๆ กับตัวอย+างท่ี 8.1 โดยเปลี่ยนเป�นข�อมูลของพนักงานบริษัทหนึ่ง มีการประกาศตัวแปรโครงสร�าง employee ซ่ึงมีสมาชิก 7 ตัวใช�เก็บข�อมูลพนักงานจํานวน 3 คน โดยกําหนดตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง emp1, emp2 และ emp3 พร�อมกับกําหนดค+าเริ่มต�นด�วย จากนั้นนําข�อมูลจากตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�างท้ังสามมาแสดงผลท่ีหน�าจอ ตัวแปรอาเรย̂ของตัวแปรโครงสร�าง จากตัวอย+างท่ี 8.1 และ 8.2 จะเห็นว+า หากต�องการเก็บข�อมูลของตัวแปรโครงสร�างมากกว+า 1 คน(ในท่ีนี้คนหมายถึง เพ่ือนในชั้นเรียน หรือพนักงานในบริษัท) จะต�องประกาศตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�างตามจํานวนคน หากมีจํานวนมากก็จะต�องประกาศตัวแปรดังกล+าวมากตามด�วย อย+างไรก็ตามวิธีการแก�ป2ญหาซ่ึงได�กล+าวไปในบทท่ีเก่ียวกับตัวแปรอาเรย0แล�ว คือ นําตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�างมากําหนดเพ่ิมให�เป�นตัวแปรอาเรย0ด�วย รูปแบบการประกาศตัวแปรอาเรย̂ของตัวแปรโครงสร�าง รูปแบบการประกาศตัวแปรอาเรย0ของตัวแปรโครงสร�าง 1. แบบท่ี 1 ดังภาพท่ี 8.11

struct ช่ือตัวแปรโครงสร�าง { ... } ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง[ขนาด];

ภาพท่ี 8.11 รูปแบบการประกาศตัวแปรอาเรย0ของตัวแปรโครงสร�างแบบท่ี 1 2. แบบท่ี 2 ดังภาพท่ี 8.12

struct ช่ือตัวแปรโครงสร�าง { ... }; struct ช่ือตัวแปรโครงสร�าง ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง[ขนาด];

ภาพท่ี 8.12 รูปแบบการประกาศตัวแปรอาเรย0ของตัวแปรโครงสร�างแบบท่ี 2

197

3. แบบท่ี 3 ดังภาพท่ี 8.13

typedef struct { ... } ช่ือตัวแปรโครงสร�างท่ีเปLนชนิดข�อมูลใหมN; ช่ือตัวแปรโครงสร�างท่ีเปLนชนิดข�อมูลใหมN ช่ือตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง[ขนาด];

ภาพท่ี 8.13 รูปแบบการประกาศตัวแปรอาเรย0ของตัวแปรโครงสร�างแบบท่ี 3 ขนาดในท่ีนี้คือ ขนาดของตัวแปรอาเรย0 ตัวอย+างของตัวแปรโครงสร�าง MyFriend ท่ีมีการประกาศตัวแปรอาเรย0 myfriend[10] struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } myfriend[10] = {{"Tong", "0812345678", 56.00, 165.00}, {"Nong", "0812345671", 65.00, 179.00}}; ตัวอย+างนี้ ได�ประกาศตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�างเป�นตัวแปรอาเรย0 myfriend[10] มีขนาด 10 ช+อง เพ่ือเก็บข�อมูลเพ่ือนๆ ในชั้นเรียนจํานวน 10 คน ตัวอย+างของตัวแปรโครงสร�าง employee ท่ีมีการประกาศตัวแปรอาเรย0 emp[20] struct employee { char name[50]; char surname[50]; char gender; char mobile[100]; char position[50]; char department[50]; float salary; }; struct employee emp[20] = {{"Sombat", "Nadee", 'M', "0897654321", "Manager", "Information Technology", 50000.00}, {"Somchai", "Jaidee", 'M', "0897699321", "SystemAnlyst", "Information Technology", 35000.00}, {"Somri", "Yaksao", 'F', "0899954321", "Sr.Programmer", "Information Technology", 20000.00}};

198

ตัวอย+างนี้ ได�ประกาศตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�างเป�นตัวแปรอาเรย0 emp[20] มีขนาด 20 ช+อง เพ่ือเก็บข�อมูลพนักงานในบริษัทจํานวน 20 คน ตัวอยNางท่ี 8.3 โปรแกรมแสดงข�อมูลเพ่ือนในชั้นเรียนด�วยตัวแปรอาเรย0ของตัวแปรโครงสร�าง

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

#include <stdio.h> #include <conio.h> int main(void) { struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; }; struct MyFriend myfriend[10] = {{"Tong", "0812345678", 56.00, 165.00}, {"Nong", "0812345671", 65.00, 179.00}}; printf("My Friend\n"); printf("- Nick name : %s\n", myfriend[0].nickname); printf("- Mobile : %s\n", myfriend[0].mobile); printf("- Weight : %f\n", myfriend[0].weight); printf("- Height : %f\n", myfriend[0].height); printf("My Friend\n"); printf("- Nick name : %s\n", myfriend[1].nickname); printf("- Mobile : %s\n", myfriend[1].mobile); printf("- Weight : %f\n", myfriend[1].weight); printf("- Height : %f\n", myfriend[1].height); getch(); return 0; }

ภาพท่ี 8.14 โปรแกรมแสดงข�อมูลเพ่ือนในชั้นเรียนด�วยตัวแปรอาเรย0ของตัวแปรโครงสร�าง เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ0ดังภาพท่ี 8.15

My Friend No.1 - Nick name : Tong - Mobile : 0812345678 - Weight : 56.00 - Height : 165.00

My Friend No.2 - Nick name : Nong - Mobile : 0812345671 - Weight : 65.00 - Height : 179.00

ภาพท่ี 8.15 ผลลัพธ0ของโปรแกรมแสดงข�อมูลเพ่ือนในชั้นเรียนด�วยตัวแปรอาเรย0ของตัวแปรโครงสร�าง จากตัวอย+างนี้ เป�นการประกาศตัวแปรโครงสร�าง MyFriend ท่ีมีสมาชิก 4 ตัว โดยมีการประกาศตัวแปรอาเรย0ของตัวแปรโครงสร�าง myfriend มีขนาด 10 ช+องพร�อมกับกําหนดค+าเริ่มต�นของเพ่ือนในชั้นเรียน 2 คนท่ีบรรทัดท่ี 12 และ 13 จากนั้นนําข�อมูลเพ่ือนในชั้นเรียนมาแสดงทีละคนท่ีหน�าจอ

199

ตัวอยNางท่ี 8.4 โปรแกรมรับและแสดงข�อมูลนักศึกษาจํานวน 3 คน ด�วยตัวแปรอาเรย0ของตัวแปรโครงสร�าง

01 02 03 04 05 06 07 08 09 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 <conio.h> #include <stdlib.h> int main(void) { struct student { char std_id[10]; float point; } MyStudent[5]; int i; char temp[20]; printf("=== Input information of student ===\n"); for(i=0; i<3; i++) { printf("*** Student No. %d ***\n", i+1); printf("- Student ID. : "); gets(MyStudent[i].std_id); printf("- Point : "); gets(temp); MyStudent[i].point = atoi(temp); } printf("\nDisplay information of student ===\n"); for(i=0; i<3; i++) { printf("*** Student No. %d ***\n", i+1); printf("- Student ID. : %s\n", MyStudent[i].std_id); printf("- Point : %3.2f\n", MyStudent[i].point); } getch(); return 0; }

ภาพท่ี 8.16 โปรแกรมรับและแสดงข�อมูลนักศึกษาจํานวน 3 คน ด�วยตัวแปรอาเรย0ของตัวแปรโครงสร�าง เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ0ดังภาพท่ี 8.17

=== Input information of student === *** Student No. 1 *** - Student ID. : 5600000001 - Point : 55.5 *** Student No. 2 *** - Student ID. : 5600000002 - Point : 73 *** Student No. 3 *** - Student ID. : 5600000003 - Point : 49.9 === Display information of student === *** Student No. 1 *** - Student ID. : 5600000001 - Point : 55.50 *** Student No. 2 *** - Student ID. : 5600000002 - Point : 73.00 *** Student No. 3 *** - Student ID. : 5600000003 - Point : 49.90

ภาพท่ี 8.17 ผลลัพธ0ของโปรแกรมรับและแสดงข�อมูลนักศึกษาจํานวน 3 คน ด�วยตัวแปรอาเรย0ของตัวแปรโครงสร�าง

จากตัวอย+างนี้ เป�นการประกาศตัวแปรโครงสร�าง student ท่ีมีสมาชิก 2 ตัว คือ std_id (รหัสนักศึกษา) และ point (คะแนน) โดยมีการประกาศตัวแปรอาเรย0ของตัวแปรโครงสร�าง MyStudent มีขนาด 5 ช+อง ไม+มีการกําหนดค+าเริ่มต�น โปรแกรมนี้จะรับข�อมูลนักศึกษาจํานวน 3 คนผ+านทางคีย0บอร0ด เก็บข�อมูลไว�ในตัวแปรโครงสร�าง จากนั้นนําข�อมูลจากตัวแปรโครงสร�างมาแสดงทีละคนท่ีหน�าจอ

200

ข�อสังเกต ตัวอย+างนี้มีการใช�ฟ2งก0ชั่น gets() และฟ2งก0ชั่น atoi() โดยฟ2งก0ชั่น gets() เป�นฟ2งก0ชั่นสําหรับอ+านข�อมูลจากคีย0บอร0ดมาเก็บไว�ในหน+วยความจํา สามารถรับข�อมูลท่ีเป�นช+องว+าง (Space) และจะหยุดอ+านข�อมูลเม่ือมีการกดปุmม Enter หรือเป�นสิ้นสุดการปnอนข�อมูล ส+วนฟ2งก0ชั่น atoi() เป�นฟ2งก0ชั่นท่ีแปลงค+าสตริงให�เป�นตัวเลข ซ่ึงในตัวอย+างนี้สมาชิก point ของตัวแปรโครงสร�างมีชนิดข�อมูลแบบเลขทศนิยม การจะรับข�อมูลชนิดนี้ผ+านทางคีย0บอร0ดจะนิยมใช�ฟ2งก0ชั่น gets() รับข�อมูลเข�ามาเก็บไว�ในตัวแปร temp ท่ีมีชนิดข�อมูลแบบสตริงท่ีบรรทัดท่ี 21 (gets(temp);) จากนั้นแปลงค+าสตริงให�เป�นตัวเลขแล�วเก็บไว�ท่ีสมาชิก point ท่ีบรรทัดท่ี 22 (MyStudent[i].point = atoi(temp);) หมายความว+า ในการรับข�อมูลผ+านทางคีย0บอร0ดแล�วเก็บไว�ในสมาชิกของตัวแปรโครงสร�างท่ีมีชนิดข�อมูลแบบเลขจํานวนเต็มและเลขทศนิยม จะต�องใช�วิธีการดังกล+าว แต+ถ�าเป�นข�อมูลชนิดอ่ืน ให�รับข�อมูลด�วยวิธีการแบบเดิมได� สรุป ในบทเรียนนี้ได�อธิบายถึง ตัวแปรโครงสร�าง คือ ชุดของตัวแปรท่ีมีชนิดข�อมูลเดียวกันหรือแตกต+างกันก็ได� ตัวแปรดังกล+าวมีความสัมพันธ0หรือเก่ียวข�องกัน ถูกนํามาเก็บไว�ภายในโครงสร�างเดียวกัน และตัวแปรแต+ละตัวเรียกว+า สมาชิก การประกาศตัวแปรโครงสร�างมี 3 รูปแบบ การกําหนดค+าเริ่มต�นให�กับสมาชิกของตัวแปรโครงสร�างคล�ายกับการกําหนดค+าเริ่มต�นให�กับตัวแปรอาเรย0 วิธีการเข�าถึงสมาชิกแต+ละตัวของตัวแปรโครงสร�างคือ ชื่อตัวแปรท่ีใช�อ�างถึงตัวแปรโครงสร�าง.สมาชิก และหากต�องการเก็บข�อมูลของตัวแปรโครงสร�างมากกว+า 1 ข�อมูล ให�ใช�ตัวแปรอาเรย0ของตัวแปรโครงสร�างแทน

201

คําถามทบทวน 1. จงเขียนโปรแกรมรับข�อมูลตัวเลข 10 ตัวผ+านทางคีย0บอร0ด นําข�อมูลดังกล+าวเก็บไว�ในตัวแปรโครงสร�าง จากนั้นนําข�อมูลดังกล+าวมาหาค+าเฉลี่ย (Average) และแสดงผลลัพธ0ผ+านทางหน�าจอ 2. จงเขียนโปรแกรมเพ่ือเก็บข�อมูลสมาชิกในครอบครัว โดยใช�ตัวแปรโครงสร�างท่ีมีจํานวนสมาชิกอย+างน�อย 3 ตัว และจํานวนสมาชิกในครอบครัวอย+างน�อย 5 คน จากนั้นนําข�อมูลดังกล+าวมาแสดงผลผ+านทางหน�าจอ 3. จงเขียนโปรแกรมสูตรคูณรับข�อมูลแม+สูตรคูณผ+านทางคีย0บอร0ด โดยเก็บข�อมูลไว�ในตัวแปรโครงสร�าง จากนั้นนําข�อมูลดังกล+าวมาแสดงผลลัพธ0ผ+านทางหน�าจอ 4. จากข�อมูลท่ีกําหนดให�

รหัสนักศึกษา ช่ือ-สกุล สาขาวิชา 5600000101 Krajong Thongdee Computer Science 5600000102 Jaidee Nathong Computer Science 5600000201 Sanook Sanan Management 5600000301 Roongring Najah Early Childhood 5600000401 Sawang Arrom Accounting 5600000103 Dam Saebae Computer Science 5600000302 Daeng Nonsai Early Childhood 5600000202 Sawat Changjai Management 5600000104 Nongkran Saijaew Computer Science 5600000402 Wandee Sritoong Accounting

จงเขียนโปรแกรมเพ่ือเก็บข�อมูลดังกล+าวผ+านทางคีย0บอร0ด โดยใช�ตัวแปรโครงสร�าง จากนั้นนําข�อมูลดังกล+าวมาแสดงผลผ+านทางหน�าจอ 5. จงเขียนโปรแกรมเพ่ือรับข�อมูลเพ่ือนจํานวน 30 คน ผ+านทางคีย0บอร0ด โดยมีโครงสร�างข�อมูลเพ่ือนดังนี้ ชื่อ นามสกุล ชื่อเล+น วันเดือนปwเกิด เพศ จบจากโรงเรียน โทรศัพท0 และอีเมล0 โดยเก็บข�อมูลไว�ในตัวแปรโครงสร�าง จากนั้นนําข�อมูลดังกล+าวมาแสดงผลผ+านทางหน�าจอ

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall.

แผนบริหารการสอนประจําบทท่ี 9 หัวข�อเน้ือหาประจําบท 1. แฟ�มขอมูลคืออะไร 2. การดําเนินการกับแฟ�มขอมูล 3. แฟ�มขอมูลประเภทเท็กซ"ไฟล" 4. แฟ�มขอมูลประเภทไบนารีไฟล" วัตถุประสงค! เม่ือผูเรียนศึกษาบทเรียนจบแลว จะมีความสามารถดังนี้ 1. อธิบายความหมายของแฟ�มขอมูลได 2. อธิบายความหมายของการดําเนินการกับแฟ�มขอมูลได 3. อธิบายความหมายของแฟ�มขอมูลประเภทเท็กซ"ไฟล"ได 4. เขียนโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทเท็กซ"ไฟล"ได 5. อธิบายความหมายของแฟ�มขอมูลประเภทไบนารีไฟล"ได 6. เขียนโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทไบนารีไฟล"ได กิจกรรมการเรียนการสอน 1. อธิบายการเขียนโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทเท็กซ"ไฟล" โดยใชโปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย9างโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทเท็กซ"ไฟล" 2. อธิบายการเขียนโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทไบนารีไฟล" โดยใชโปรแกรมนําเสนองาน โปรแกรมภาษาซี และตัวอย9างโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทไบนารีไฟล" 3. แบ9งผูเรียนออกเป:นกลุ9ม โดยปฏิบัติตามใบงานท่ี 9 ดังนี้ 3.1 ใหผูเรียนฝ?กปฏิบัติในการเขียนโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทเท็กซ"ไฟล" 3.2 ใหผูเรียนฝ?กปฏิบัติในการเขียนโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทไบนารีไฟล" 3.3 ใหตัวแทนแต9ละกลุ9มออกมานําเสนอผลการปฏิบัติตามใบงาน และร9วมกันอภิปรายว9าโปรแกรมท่ีเขียนข้ึนมานั้นเป:นอย9างไร 4. ร9วมกันสรุปความรูเก่ียวกับการเขียนโปรแกรมเชิงโครงสรางกับแฟ�มขอมูลประเภทเท็กซ"ไฟล"และแฟ�มขอมูลประเภทไบนารีไฟล" จากนั้นซักถามผูเรียน รวมถึงใหผูเรียนตอบคําถามทบทวน สื่อการสอน 1. เอกสารประกอบการสอน 2. โปรแกรมนําเสนองาน 3. ใบงานท่ี 9 4. โปรแกรมภาษาซี การวัดและการประเมินผล 1. การซักถาม 2. สังเกตการอภิปรายและการนําเสนอในชั้นเรียน

204

204

3. สังเกตการณ"ปฏิบัติงานกลุ9ม 4. ตรวจงานจากใบงาน 5. ตรวจแบบฝ?กหัด

บทท่ี 9 แฟมข�อมูล

บทนํา เม่ือข�อมูลมีจํานวนมากข้ึน การเขียนโปรแกรมด�วยวิธีการในบทท่ีผ านมา อาจไม สามารถรองรับได� แฟ'มข�อมูลจึงเป(นทางเลือกหนึ่งในการจัดการกับข�อมูลดังกล าว บทนี้จะได�ทราบว าแฟ'มข�อมูลคืออะไร การดําเนินการกับแฟ'มข�อมูล แฟ'มข�อมูลประเภทเท็กซ/ไฟล/ และแฟ'มข�อมูลประเภทไบนารีไฟล/ แฟมข�อมูลคืออะไร จากตัวอย างของบทท่ีผ านมาเรื่องตัวแปรโครงสร�าง ข�อมูลเพ่ือนในชั้นเรียน หรือข�อมูลพนักงานในบริษัท หากมีจํานวนไม มาก ก็ไม เกิดป4ญหาแต อย างใดในการป'อนหรือแสดงข�อมูล แต หากข�อมูลมีจํานวนมากอาจทําให�เกิดป4ญหาข้ึนมาได� เช น เม่ือป'อนข�อมูลเพ่ือนในชั้นเรียนหรือพนักงานในบริษัทจํานวนมาก และต�องการเก็บข�อมูลดังกล าวเพ่ือนํามาใช�แสดงผลหรือแก�ไขในภายหลังได� ต�องทําอย างไร หรือหากมีไฟล/ข�อมูลแล�วต�องเขียนโปรแกรมเพ่ือนําข�อมูลมาแสดงท่ีหน�าจอ แล�วต�องทําอย างไร ภาษาซีได�จัดเตรียมเก่ียวกับข�อมูลจํานวนมากในรูปแบบของแฟ'มข�อมูลไว� เพ่ือให�ผู�เขียนโปรแกรมสามารถเขียนโปรแกรมจัดการกับข�อมูลจํานวนมากได� แฟมข�อมูล (File) คือ หน วยหนึ่งของข�อมูลท่ีใช�ในการจัดเก็บข�อมูลจํานวนมาก ส วนใหญ แล�วข�อมูลดังกล าวมักมีความสัมพันธ/กัน เช น แฟ'มข�อมูลนักศึกษา แฟ'มข�อมูลพนักงาน แฟ'มข�อมูลสมาชิกร�านเช าวิดีโอ เป(นต�น แฟ'มข�อมูล แบ งออกเป(น 2 ประเภท คือ แฟ'มข�อมูลประเภทเท็กซ/ไฟล/ และแฟ'มข�อมูลประเภทไบนารีไฟล/ การดําเนินการกับแฟมข�อมูล ในการดําเนินการกับแฟ'มข�อมูล มีข้ันตอนดังต อไปนี้ 1. การเป:ดแฟ'มข�อมูล 2. การประมวลผลข�อมูลในแฟ'มข�อมูล 3. การป:ดแฟ'มข�อมูล การเป$ดแฟมข�อมูล เม่ือต�องการเขียนโปรแกรมเพ่ือจัดการกับแฟ'มข�อมูลท่ีต�องการ ต�องมีการเป:ดแฟ'มข�อมูลข้ึนมาก อนท่ีนํามาประมวลผล การเป:ดแฟ'มข�อมูลทําได� 3 วิธีคือ 1. เป:ดแฟ'มข�อมูลเพ่ืออ าน (Read) เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ืออ านเพียงอย างเดียว ไม สามารถเขียนข�อมูลลงแฟ'มข�อมูลได� 2. เป:ดแฟ'มข�อมูลเพ่ือเขียนข�อมูลลงแฟ'มข�อมูล (Write) เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ือทําการเขียนข�อมูลใหม ลง ณ ตําแหน งของแฟ'มข�อมูลท่ีต�องการ 3. เป:ดแฟ'มข�อมูลเพ่ือเขียนข�อมูลต อท�ายแฟ'มข�อมูล (Append) เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ือทําการเขียนข�อมูลใหม ต อท�ายแฟ'มข�อมูลท่ีต�องการ เม่ือเป:ดแฟ'มข�อมูลท่ีต�องการข้ึนมาแล�ว จะมีตัวชี้ตัวหนึ่งท่ีใช�บอกตําแหน งว า ณ ขณะนี้ตัวชี้ชี้ไปยังตําแหน งใดของแฟ'มข�อมูล ตัวชี้นี้เรียกว า ไฟล%พอยเตอร% (File Pointer) ส วนตําแหน งท่ีไฟล/พอยเตอร/ชี้ไปยังตําแหน งของแฟ'มข�อมูลคือ ตําแหน งต�น กลาง หรือท�ายของแฟ'มข�อมูล

206

การเป$ดแฟมข�อมูลข้ึนมาเพ่ืออ0าน - หากไฟล/พอยเตอร/ชี้ไปยังตําแหน งต�นของแฟ'มข�อมูล สามารถอ านข�อมูลต้ังแต ต�นจนจบแฟ'มข�อมูลได� - หากไฟล/พอยเตอร/ชี้ไปยังตําแหน งกลางของแฟ'มข�อมูล สามารถอ านข�อมูลต้ังแต กลางของแฟ'มข�อมูลไปจนจบแฟ'มข�อมูลได� - แต ถ�าหากไฟล/พอยเตอร/ชี้ไปยังตําแหน งท�ายของแฟ'มข�อมูล ไม สามารถอ านข�อมูลของแฟ'มข�อมูลได� การเป$ดแฟมข�อมูลข้ึนมาเพ่ือเขียนข�อมูลลงแฟมข�อมูล - หากไฟล/พอยเตอร/ชี้ไปยังตําแหน งต�นของแฟ'มข�อมูล สามารถเขียนข�อมูลลงตําแหน งต�นของแฟ'มข�อมูลได� โดยเขียนทับข�อมูลเดิม - หากไฟล/พอยเตอร/ชี้ไปยังตําแหน งกลางของแฟ'มข�อมูล สามารถเขียนข�อมูลลงตําแหน งกลางของแฟ'มข�อมูลได� โดยเขียนทับข�อมูลเดิม - แต ถ�าหากไฟล/พอยเตอร/ชี้ไปยังตําแหน งท�ายของแฟ'มข�อมูล สามารถเขียนข�อมูลลงตําแหน งท�ายของแฟ'มข�อมูลได�โดยต อท�ายของข�อมูลเดิม การเป$ดแฟมข�อมูลเพ่ือเขียนข�อมูลต0อท�ายแฟมข�อมูล กรณีนี้ไฟล/พอยเตอร/จะชี้ไปยังตําแหน งท�ายของแฟ'มข�อมูลอยู แล�ว เม่ือต�องการเขียนข�อมูลใหม ข�อมูลใหม จะไปต อท�ายของข�อมูลเดิม การประมวลผลข�อมูลในแฟมข�อมูล ในการประมวลผลข�อมูลในแฟ'มข�อมูล เม่ือเป:ดแฟ'มข�อมูลท่ีต�องการข้ึนมาแล�ว สามารถนําข�อมูลดังกล าวมาทําการประมวลผล เช น บวก ลบ คูณ หาร การหาค าเฉลี่ย การหาค าเบ่ียงเบนมาตรฐาน การหาพ้ืนท่ีวงกลม การหาเกรดเฉลี่ยของนักศึกษา เป(นต�น และเม่ือได�ผลลัพธ/จากการประมวลผลแล�ว ผลลัพธ/ท่ีได�บางครั้งอาจจะต�องบันทึกกลับไปท่ีแฟ'มข�อมูลเดิมด�วย การป$ดแฟมข�อมูล ในระหว างการเป:ดแฟ'มข�อมูลข้ึนมาใช�งานนั้น แฟ'มข�อมูลดังกล าวไม สามารถนําไปใช�งานอ่ืนๆ ได� ดังนั้นเม่ือใช�งานแฟ'มข�อมูลเสร็จสิ้นแล�ว ต�องทําการป:ดแฟ'มข�อมูลดังกล าวให�เป(นท่ีเรียบร�อย แฟมข�อมูลประเภทเท็กซ%ไฟล% เท็กซ%ไฟล% (Text File) คือ แฟ'มข�อมูลท่ีจัดเก็บข�อมูลในรูปแบบของข�อความท่ีเรียกว า เท็กซ% (Text) โดยแฟ'มข�อมูลประเภทนี้เป:ดข้ึนมาเพ่ืออ านหรือแก�ไขได�ด�วยโปรแกรมอีดิเตอร/ (Editor Program) ท่ัวไป เช น Notepad หรือ EditPlus เป(นต�น แต ในบทนี้เป(นการเขียนโปรแกรมเพ่ือนําแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ท่ีมีอยู แล�วมาทําการประมวลผลจนได�ผลลัพธ/จากนั้นบันทึกกลับไปท่ีแฟ'มข�อมูลเดิม หรือเป(นการเขียนโปรแกรมเพ่ือสร�างแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ข้ึนมาใหม เม่ือต�องการเป:ดเท็กซ/ไฟล/ท่ีต�องการ จําเป(นต�องประกาศตัวแปรไฟล/พอยเตอร/ท่ีใช�เป(นตัวชี้หรือใช�อ�างอิงแฟ'มข�อมูลข้ึนมาก อนโดยมีชนิดข�อมูลแบบ FILE ซ่ึงมีรูปแบบการประกาศตัวแปรไฟล/พอยเตอร/ ดังภาพท่ี 9.1 การใช�ชนิดข�อมูลแบบ FILE จะต�องประกาศไฟล/เฮดเดอร/ stdio.h (#include <stdio.h>) ไว�ท่ีส วนหัวของโปรแกรมด�วย

FILE *ช่ือตัวแปรไฟล%พอยเตอร%;

ภาพท่ี 9.1 รูปแบบการประกาศตัวแปรไฟล/พอยเตอร/

207

ตัวอย างของการประกาศตัวแปรไฟล/พอยเตอร/ เช น FILE *fp; เป(นการประกาศตัวแปร fp เป(นตัวแปรไฟล/พอยเตอร/ มีชนิดข�อมูลแบบ FILE หลังจากท่ีประกาศตัวแปรไฟล/พอยเตอร/แล�ว ก็จะทําการเป:ดแฟ'มข�อมูลข้ึนมา ฟ4งก/ชั่นท่ีใช�ในการเป:ดแฟ'มข�อมูลคือ ฟBงก%ช่ัน fopen() รูปแบบการใช�ฟ4งก/ชั่น fopen() ดังภาพท่ี 9.2

FILE *fopen("ช่ือแฟมข�อมูลหรือไฟล%", "โหมดการทํางาน");

ภาพท่ี 9.2 รูปแบบการใช�ฟ4งก/ชั่น fopen()ของแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ ชื่อแฟ'มข�อมูลหรือไฟล/ (File) คือ แฟ'มข�อมูลหรือไฟล/ประเภทเท็กซ/ไฟล/ท่ีต�องการเป:ดข้ึนมาใช�งาน โหมดการทํางาน (Mode) คือ โหมดของการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ ดังตารางท่ี 9.1

โหมดการทํางาน รายละเอียด r เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ข้ึนมาเพ่ืออ านข�อมูลอย างเดียว หากไม

พบแฟ'มข�อมูล จะเกิดข�อผิดพลาดข้ึน w เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ข้ึนมาเพ่ือเขียนข�อมูลทับข�อมูลเดิม

หากไม พบแฟ'มข�อมูล จะทําการสร�างแฟ'มข�อมูลใหม a เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ข้ึนมาเพ่ือเขียนข�อมูลต อท�ายของข�อมูล

เดิมในแฟ'มข�อมูล หากไม พบแฟ'มข�อมูล จะทําการสร�างแฟ'มข�อมูลใหม r+t เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ข้ึนมาเพ่ืออ านและเขียนข�อมูล หากไม

พบแฟ'มข�อมูล จะเกิดข�อผิดพลาดข้ึน w+t เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ข้ึนมาเพ่ืออ านและเขียนข�อมูลทับ

ข�อมูลเดิม หากไม พบแฟ'มข�อมูล จะทําการสร�างแฟ'มข�อมูลใหม a+t เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ข้ึนมาเพ่ืออ านและเขียนข�อมูลต อท�าย

ของข�อมูลเดิมในแฟ'มข�อมูล หากไม พบแฟ'มข�อมูล จะทําการสร�างแฟ'มข�อมูลใหม ตารางท่ี 9.1 โหมดการทํางานของแฟ'มข�อมูลประเภทเท็กซ/ไฟล/

การเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ด�วยโหมดการทํางาน w และ w+t หากไม พบแฟ'มข�อมูล จะทําการสร�างแฟ'มข�อมูลใหม แต ถ�าพบแฟ'มข�อมูลดังกล าว ข�อมูลเดิมท่ีอยู ในแฟ'มข�อมูลนั้นจะถูกเขียนทับหรือข�อมูลเดิมจะถูกลบไปนั่นเอง การใช�ฟ4งก/ชั่น fopen() ในการเป:ดแฟ'มข�อมูลนั้น หากเป:ดได�ฟ4งก/ชั่นนี้จะส งคืนค าท่ีเป(นตําแหน งท่ีอยู กลับมาให�ตัวแปรไฟล/พอยเตอร/ หากเป:ดไม ได�ฟ4งก/ชั่นนี้จะส งคืนค า NULL หรือค าว างแทน การเป:ดแฟ'มข�อมูลด�วยโหมดการทํางาน r, w, r+t และ w+t ตําแหน งท่ีอยู จะอยู ต�นแฟ'มข�อมูล หากเป:ดแฟ'มข�อมูลด�วยโหมดการทํางาน a และ a+t ตําแหน งท่ีอยู จะอยู ท�ายข�อมูลเดิมในแฟ'มข�อมูล ตัวอย างของการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ เช น fopen("sample.txt", "r"); เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า sample.txt จากตําแหน งป4จจุบันท่ีแฟ'มข�อมูลนี้อยู โดยมีโหมดการทํางานคือ r เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ืออ านข�อมูลอย างเดียว

208

fopen("c:\\Docs\\sample.txt", "w"); เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า sample.txt โดยแฟ'มข�อมูลนี้อยู ท่ีไดรฟi c ตรงโฟลเดอร/ชื่อว า Docs โดยมีโหมดการทํางานคือ w เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ือเขียนข�อมูลทับข�อมูลเดิม fopen("d:\\sample.txt", "a"); เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า sample.txt โดยแฟ'มข�อมูลนี้อยู ท่ีไดรฟi d โดยมีโหมดการทํางานคือ a เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ือเขียนข�อมูลต อท�ายของข�อมูลเดิมในแฟ'มข�อมูล ในภาษาซีได�จัดเตรียมฟ4งก/ชั่นท่ีใช�การดําเนินการกับข�อมูลของแฟ'มข�อมูลประเภทเท็กซ/ไฟล/คือ fgetc(), fgets(), fputc(), fputs(), fprintf(), fscanf(), feof() และ fclose() โดยมีรายละเอียด ดังนี้ ฟBงก%ช่ัน fgetc() ฟ4งก/ชั่นนี้ใช�ในการอ านข�อมูลจากแฟ'มข�อมูลทีละ 1 ตัวอักขระ โดยมีรูปแบบการใช�งานดังภาพท่ี 9.3

fgetc(ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.3 รูปแบบการใช�ฟ4งก/ชั่น fgetc() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น char c; c = fgetc(fp); เป(นการอ านข�อมูลจากแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู 1 ตัวอักษร จากนั้นนําไปเก็บไว�ท่ีตัวแปร c โดยตัวแปร c จะต�องมีชนิดข�อมูลแบบตัวอักขระด�วย ฟBงก%ช่ัน fgets() ฟ4งก/ชั่นนี้ใช�ในการอ านข�อมูลจากแฟ'มข�อมูลแบบสตริงซ่ึงต�องระบุจํานวนตัวอักขระท่ีอ านเข�ามาด�วย โดยมีรูปแบบการใช�งานดังภาพท่ี 9.4

fgets(ช่ือตัวแปรรองรับข�อมูล, จํานวนตัวอักขระ, ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.4 รูปแบบการใช�ฟ4งก/ชั่น fgets() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น char buff[100]; fgets(buff, 50, fp); เป(นการอ านข�อมูลจากแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู จํานวน 50 ตัวอักษร นําไปเก็บไว�ท่ีตัวแปร buff โดยตัวแปร buff เป(นตัวแปรอาเรย/มีชนิดข�อมูลแบบตัวอักขระมีขนาด 100 ช อง ฟBงก%ช่ัน fputc() ฟ4งก/ชั่นี้ใช�ในการเขียนข�อมูลท่ีเป(นตัวอักขระ 1 ตัวลงแฟ'มข�อมูล โดยมีรูปแบบการใช�งานดังภาพท่ี 9.5

209

fputc('ตัวอักขระ', ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.5 รูปแบบการใช�ฟ4งก/ชั่น fputc() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น fputc('x', fp); เป(นการเขียนข�อมูลตัวอักษร x ลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู fputc('9', fpoint); เป(นการเขียนข�อมูลตัวอักษร 9 ลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fpoint เป:ดอยู fputc('\n', filepointer); เป(นการเขียนข�อมูลรหัสควบคุม \n (New Line) ซ่ึงเป(นการข้ึนบรรทัดใหม ลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ filepointer เป:ดอยู ฟBงก%ช่ัน fputs() ฟ4งก/ชั่นนี้ใช�ในการเขียนข�อมูลท่ีเป(นสตริงลงแฟ'มข�อมูล โดยมีรูปแบบการใช�งานดังภาพท่ี 9.6

fputs("สตริง", ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.6 รูปแบบการใช�ฟ4งก/ชั่น fputs() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น fputs("1234567890", fp); เป(นการเขียนข�อมูล 1234567890 ลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู fputs("Hello Universe\n", fp); เป(นการเขียนข�อมูล Hello Universe พร�อมกับรหัสควบคุม \n (New Line) ซ่ึงเป(นการข้ึนบรรทัดใหม ลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู ฟBงก%ช่ัน fprintf() ฟ4งก/ชั่นนี้ใช�ในการเขียนข�อมูลลงแฟ'มข�อมูล สามารถจัดรูปแบบข�อมูลท่ีต�องการแสดงผลได� โดยมีรูปแบบการใช�งาน ดังภาพท่ี 9.7

fprintf(ช่ือตัวแปรไฟล%พอยเตอร%, "ข�อมูลท่ีต�องการแสดงผล", รายการข�อมูลท่ีจะแสดงผล);

ภาพท่ี 9.7 รูปแบบการใช�ฟ4งก/ชั่น fprintf() พารามิเตอร/ 2 ตัวหลัง จะเหมือนกับฟ4งก/ชั่น printf() นั่นเอง ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น fprintf(fp, "%d x %d = %d", 2, 2, 4); เป(นการเขียนข�อมูล 2 x 2 = 4 ลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู fprintf(fp, "%s", "Good Morning");

210

เป(นการเขียนข�อมูล Good Morning ลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู ฟBงก%ช่ัน fscanf() ฟ4งก/ชั่นนี้ใช�ในการอ านข�อมูลจากแฟ'มข�อมูล สามารถระบุชนิดข�อมูลท่ีต�องการแสดงผลจากการอ านข�อมูลจากแฟ'มข�อมูล โดยมีรูปแบบการใช�งานดังภาพท่ี 9.8

fscanf(ช่ือตัวแปรไฟล%พอยเตอร%, "ข�อมูลท่ีต�องการแสดงผล", รายการระบุท่ีอยู0);

ภาพท่ี 9.8 รูปแบบการใช�ฟ4งก/ชั่น fscanf() พารามิเตอร/ 2 ตัวหลัง จะเหมือนกับฟ4งก/ชั่น scanf() นั่นเอง ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น int a; fscanf(fp, "%d", &a); เป(นการรับข�อมูลโดยอ านมาจากแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู เก็บไว�ในตัวแปร a โดยตัวแปร a จะต�องมีชนิดข�อมูลแบบเลขจํานวนเต็มด�วย char s[60]; fscanf(fp, "%s", s); เป(นการรับข�อมูลโดยอ านมาจากแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู เก็บไว�ในตัวแปร s โดยตัวแปร s เป(นตัวแปรอาเรย/มีชนิดข�อมูลแบบตัวอักขระ มีจํานวน 60 ช องด�วย ฟBงก%ช่ัน feof () ฟ4งก/ชั่นนี้ใช�ในการตรวจสอบตัวแปรไฟล/พอยเตอร/ว าชี้ท่ีตําแหน งท�ายหรือตําแหน งสิ้นสุดของแฟมข�อมูลหรือไฟล% (End of file) หรือไม โดยมีรูปแบบการใช�งานดังภาพท่ี 9.9

feof(ช่ือตัวแปรไฟล%พอยเตอร%)

ภาพท่ี 9.9 รูปแบบการใช�ฟ4งก/ชั่น feof() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น while(feof(fp)) { c = fgetc(fp); printf("%c", c); } เป(นการตรวจสอบตัวแปรไฟล/พอยเตอร/ fp ว าชี้ท่ีตําแหน งท�ายของแฟ'มข�อมูลหรือไม หากตัวแปรไฟล/พอยเตอร/ fp ยังไม ชี้ท่ีตําแหน งท�ายของแฟ'มข�อมูล ให�ไปทําคําสั่งภายใต�คําสั่งวนรอบ while ฟBงก%ช่ัน fclose () ฟ4งก/ชั่นนี้ใช�ในการป:ดแฟ'มข�อมูลหรือไฟล/ท่ีเลิกใช�งานแล�ว โดยมีรูปแบบการใช�งานดังภาพท่ี 9.10

211

fclose(ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.10 รูปแบบการใช�ฟ4งก/ชั่น fclose() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น fclose(fp); เป(นการป:ดแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp ชี้อยู หลังจากใช�งานแฟ'มข�อมูลดังกล าวเสร็จแล�ว แฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า stdwintext.txt ดังภาพท่ี 9.11 นี้นํามาใช�ในตัวอย างในบทนี้

MS-DOS and Windows use a common text file format, with each line of text separated

by a two-character combination: CR and LF, which have ASCII codes 13 and 10. It is

common for the last line of text not to be terminated with a CR-LF marker, and

many text editors (including Notepad) do not automatically insert one on the last

line. Most Windows text files use a form of ANSI, OEM or Unicode encoding. What Windows

terminology calls "ANSI encodings" are usually single-byte ISO-8859 encodings,

except for in locales such as Chinese, Japanese and Korean that require double-

byte character sets. ANSI encodings were traditionally used as default system

locales within Windows, before the transition to Unicode. By contrast, OEM

encodings, also known as MS-DOS code pages, were defined by IBM for use in the

original IBM PC text mode display system. They typically include graphical and

line-drawing characters common in (possibly full-screen) MS-DOS applications.

Newer Windows text files may use a Unicode encoding such as UTF-16LE or UTF-8,

with Byte Order Mark.

ภาพท่ี 9.11 แฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า stdwintext.txt ตัวอย0างท่ี 9.1 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt 3 ตัวแรก โดยใช�ฟ4งก/ชั่น fgetc()

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { FILE *fp; fp = fopen("stdwintext.txt", "r"); if(fp == NULL) { printf("Error open file."); exit(1); } else { char c; c = fgetc(fp); printf("1st character = %c\n", c); c = fgetc(fp); printf("2nd character = %c\n", c); c = fgetc(fp); printf("3rd character = %c\n", c); } fclose(fp); getch(); return 0; }

ภาพท่ี 9.12 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt 3 ตัวแรกโดยใช�ฟ4งก/ชั่น fgetc()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.13

212 1st character : M 2nd character : S 3rd character : -

ภาพท่ี 9.13 ผลลัพธ/ของโปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt 3 ตัวแรก โดยใช�ฟ4งก/ชั่น fgetc()

จากตัวอย างนี้ เป(นการประกาศตัวแปรไฟล/พอยเตอร/ fp ท่ีบรรทัดท่ี 6 (FILE *fp;) จากนั้นบรรทัดท่ี 7 (fp = fopen("stdwintext.txt", "r");) เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า stdwintext.txt โดยมีโหมดการทํางานคือ r เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ืออ านข�อมูลอย างเดียว ซ่ึงค าท่ีเป(นตําแหน งท่ีอยู จากการใช�ฟ4งก/ชั่น fopen() ส งให�ตัวแปรไฟล/พอยเตอร/ fp บรรทัดท่ี 8 เป(นการนําตัวแปรไฟล/พอยเตอร/ fp มาตรวจสอบว า พบแฟ'มข�อมูลดังกล าวหรือไม ถ�าหากไม พบให�แสดงข�อความ Error open file. บรรทัดท่ี 9 (printf("Error open file.");) และบรรทัดท่ี 10 (exit(1);) เป(นคําสั่งให�ออกจากโปรแกรมเนื่องจากการทํางานของโปรแกรมไม สมบูรณ/เนื่องจากหาแฟ'มข�อมูลท่ีต�องการไม พบ แต ถ�าเป(นการทํางานของโปรแกรมสมบูรณ/ให�ใช�คําสั่ง exit(0) แต ถ�าพบแฟ'มข�อมูลท่ีต�องการ โปรแกรมจะทํางานต้ังแต บรรทัดท่ี 12 ถึง 18 โดยบรรทัดท่ี 12 (char c;) เป(นการประกาศตัวแปร c มีชนิดข�อมูลแบบอักขระ ตัวแปร c นี้นํามาใช�รับข�อมูลท่ีได�จากฟ4งก/ชั่น fgetc() 1 ตัวอักขระท่ีบรรทัดท่ี 13 (c = fgetc(fp);) จากนั้นบรรทัดท่ี 14 (printf("1st character = %c\n", c);) เป(นการนําค าจากตัวแปร c มาแสดงผล ส วนบรรทัดท่ี 15 ถึง 18 ดําเนินการในลักษณะเดียวกันคือ เป(นการอ านข�อมูลและแสดงตัวอักขระตัวท่ี 2 และตัวท่ี 3 ดังภาพท่ี 9.13 13 14 15 16 17 18

c = fgetc(fp); printf("1st character = %c\n", c); c = fgetc(fp); printf("2nd character = %c\n", c); c = fgetc(fp); printf("3rd character = %c\n", c);

ภาพท่ี 9.14 แสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt ทีละตัว 3 ตัวแรก

c = 'M'

c = 'S'

c = '-'

แฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt

ผลลัพธ/ท่ีได�

213

ตัวอย0างท่ี 9.2 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt ท้ังหมด โดยใช�ฟ4งก/ชั่น fgetc() และฟ4งก/ชั่น feof()

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { FILE *fp; fp = fopen("stdwintext.txt", "r"); if(fp == NULL) { printf("Error open file."); exit(1); } else { char c; while(!feof(fp)) { c = fgetc(fp); printf("%c", c); } } fclose(fp); getch(); return 0; }

ภาพท่ี 9.15 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt ท้ังหมด โดยใช�ฟ4งก/ชั่น fgetc() และฟ4งก/ชั่น feof()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.16

MS-DOS and Windows use a common text file format, with each line of text separated

by a two-character combination: CR and LF, which have ASCII codes 13 and 10. It is

common for the last line of text not to be terminated with a CR-LF marker, and many

text editors (including Notepad) do not automatically insert one on the last line.

Most Windows text files use a form of ANSI, OEM or Unicode encoding. What Windows

terminology calls "ANSI encodings" are usually single-byte ISO-8859 encodings,

except for in locales such as Chinese, Japanese and Korean that require double-byte

character sets. ANSI encodings were traditionally used as default system locales

within Windows, before the transition to Unicode. By contrast, OEM encodings, also

known as MS-DOS code pages, were defined by IBM for use in the original IBM PC text

mode display system. They typically include graphical and line-drawing characters

common in (possibly full-screen) MS-DOS applications. Newer Windows text files may

use a Unicode encoding such as UTF-16LE or UTF-8, with Byte Order Mark.

ภาพท่ี 9.16 ผลลัพธ/ของโปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt ท้ังหมด โดยใช�ฟ4งก/ชั่น fgetc() และฟ4งก/ชั่น feof()

จากตัวอย างนี้ เป(นการอ านข�อมูลท้ังหมดจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt โดยใช�ฟ4งก/ชั่น fgetc() อ านข�อมูลเข�ามาทีละตัวจนข�อมูลสิ้นสุดแฟ'มข�อมูลโดยใช�ฟ4งก/ชั่น feof() ในการตรวจสอบท่ีบรรทัดท่ี 13 (while(!feof(fp)) {)

214

ตัวอย0างท่ี 9.3 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt 2 สตริงแรก สตริงละ 30 ตัว โดยใช�ฟ4งก/ชั่น fgets()

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { FILE *fp; fp = fopen("stdwintext.txt", "r"); if(fp == NULL) { printf("Error open file."); exit(1); } else { char buff[50]; fgets(buff, 30, fp); printf("1st string = %s\n", buff); fgets(buff, 30, fp); printf("2nd string = %s\n", buff); } fclose(fp); getch(); return 0; }

ภาพท่ี 9.17 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt 2 สตริงแรก สตริงละ 30 ตัว โดยใช�ฟ4งก/ชั่น fgets()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.18

1st string : MS-DOS and Windows use a comm 2nd string : on text file format, with eac

ภาพท่ี 9.18 ผลลัพธ/ของโปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt 2 สตริงแรก สตริงละ 30 ตัว โดยใช�ฟ4งก/ชั่น fgets()

จากตัวอย างนี้ ถ�าพบแฟ'มข�อมูลท่ีต�องการ โปรแกรมจะทํางานต้ังแต บรรทัดท่ี 12 ถึง 16 โดยบรรทัดท่ี 12 (char buff[50];) เป(นการประกาศตัวแปร buff เป(นตัวแปรอาเรย/มีชนิดข�อมูลแบบอักขระมีขนาด 50 ช อง ตัวแปร buff นี้จะนํามาใช�รับข�อมูลท่ีได�จากฟ4งก/ชั่น fgets() สตริงแรก(30 ตัวแรก) ท่ีบรรทัดท่ี 13 (fgets(buff, 30, fp);) จากนั้นบรรทัดท่ี 14 (printf("1st string = %s\n", buff);) เป(นการนําค าจากตัวแปร buff มาแสดงผล ส วนบรรทัดท่ี 15 ดําเนินการในลักษณะเดียวกันคือ เป(นการอ านข�อมูลสตริงถัดไป (30 ตัวถัดไป) ดังภาพท่ี 9.19

215

13 14 15 16

fgets(buff, 30, fp); printf("1st string = %s\n", buff); fgets(buff, 30, fp); printf("2nd string = %s\n", buff);

ภาพท่ี 9.19 แสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt ทีละสตริง ตัวอย0างท่ี 9.4 โปรแกรมแสดงการเพ่ิมข�อมูล x และ xxxxx เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ท่ีไม มีแฟ'มข�อมูล โดยใช�ฟ4งก/ชั่น fputc() และ fputs()

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { FILE *fp; fp = fopen("newtext.txt", "w"); char c='x'; char buff[50]="xxxxx"; fputc(c, fp); fputc('\n', fp); fputs(buff, fp); fclose(fp); getch(); return 0; }

ภาพท่ี 9.20 โปรแกรมแสดงการเพ่ิมข�อมูล x และ xxxxx เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ท่ีไม มีแฟ'มข�อมูล โดยใช�ฟ4งก/ชั่น fputc() และ fputs()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.21

buff = "on text file format, with eac"

buff = "MS-DOS and Windows use a comm"

แฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt

สตริงตัวแรก สตริงตัวท่ี 2

ผลลัพธ/ท่ีได�

216

ภาพท่ี 9.21 ผลลัพธ/ของโปรแกรมแสดงการเพ่ิมข�อมูล x และ xxxxx เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ท่ี

ไม มีแฟ'มข�อมูล โดยใช�ฟ4งก/ชั่น fputc() และ fputs() จากตัวอย างนี้ เป(นการประกาศตัวแปรไฟล/พอยเตอร/ fp ท่ีบรรทัดท่ี 6 (FILE *fp;) จากนั้นบรรทัดท่ี 7 (fp = fopen("newtext.txt", "w");) เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า newtext.txt โดยมีโหมดการทํางานคือ w เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ือเขียนข�อมูลทับข�อมูลเดิม ซ่ึงค าท่ีเป(นตําแหน งท่ีอยู จากการใช�ฟ4งก/ชั่น fopen() จะส งให�ตัวแปรไฟล/พอยเตอร/ fp บรรทัดท่ี 8 เป(นการประกาศตัวแปร c มีชนิดข�อมูลแบบตัวอักขระกําหนดค าเริ่มต�นคือ x (char c='x';) และบรรทัดท่ี 9 เป(นการประกาศตัวแปร buff เป(นตัวแปรอาเรย/มีชนิดข�อมูลแบบตัวอักขระมีขนาด 50 ช อง กําหนดค าเริ่มต�นคือ xxxxx (char buff[50]="xxxxx";) จากนั้นนําข�อมูลจากตัวแปร c ไปเขียนลงแฟ'มข�อมูลท่ีบรรทัดท่ี 10 (fputc(c, fp);) ตามด�วยนําข�อมูลรหัสควบคุม \n ซ่ึงเป(นการข้ึนบรรทัดใหม ลงแฟ'มข�อมูลท่ีบรรทัดท่ี 11 (fputc('\n', fp);) และนําข�อมูลจากตัวแปร buff ไปเขียนลงแฟ'มข�อมูลท่ีบรรทัดท่ี 12 (fputs(buff, fp);) ตัวอย0างท่ี 9.5 โปรแกรมแสดงการเขียนข�อมูล This is new text. เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt โดยใช�ฟ4งก/ชั่น fputs() และโหมดการทํางานคือ w

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { FILE *fp; fp = fopen("stdwintext.txt ", "w"); char buff[50]="This is new text."; fputs(buff, fp); fclose(fp); getch(); return 0; }

ภาพท่ี 9.22 โปรแกรมแสดงการเขียนข�อมูล This is new text. เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt โดยใช�ฟ4งก/ชั่น fputs() และโหมดการทํางานคือ w

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.23

217

ก. แฟ'มข�อมูลเดิม ข. แฟ'มข�อมูลท่ีถูกเขียนทับ ภาพท่ี 9.23 ผลลัพธ/ของโปรแกรมแสดงการเขียนข�อมูล This is new text. เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/

ไฟล/ stdwintext.txt โดยใช�ฟ4งก/ชั่น fputs() และโหมดการทํางานคือ w จากตัวอย างนี้ เป(นการประกาศตัวแปรไฟล/พอยเตอร/ fp ท่ีบรรทัดท่ี 6 (FILE *fp;) จากนั้นบรรทัดท่ี 7 (fp = fopen("stdwintext.txt", "w");) เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า stdwintext.txt โดยมีโหมดการทํางานคือ w เป(นการเป:ดแฟ'มข�อมูลเดิมข้ึนมาเพ่ือเขียนข�อมูลทับข�อมูลเดิม ซ่ึงค าท่ีเป(นตําแหน งท่ีอยู จากการใช�ฟ4งก/ชั่น fopen() จะส งให�ตัวแปรไฟล/พอยเตอร/ fp บรรทัดท่ี 8 เป(นการประกาศตัวแปร buff เป(นตัวแปรอาเรย/มีชนิดข�อมูลแบบตัวอักขระมีขนาด 50 ช อง กําหนดค าเริ่มต�นคือ This is new text. (char buff[50]="This is new text.";) จากนั้นนําข�อมูลจากตัวแปร buff ไปเขียนลงแฟ'มข�อมูลท่ีบรรทัดท่ี 9 (fputs(buff, fp);) การนําข�อมูลดังกล าวไปเขียนลงแฟ'มข�อมูลนี้ เป(นการเขียนทับข�อมูลเดิม หมายความว า ข�อมูลเดิมจะหายไปและถูกแทนท่ีด�วยข�อมูลใหม ตัวอย0างท่ี 9.6 โปรแกรมแสดงการเขียนข�อมูล This is new text. เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt โดยใช�ฟ4งก/ชั่น fputs() และโหมดการทํางานคือ a

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { FILE *fp; fp = fopen("stdwintext.txt ", "a"); char buff[50]="This is new text."; fputs(buff, fp); fclose(fp); getch(); return 0; }

ภาพท่ี 9.24 โปรแกรมแสดงการเขียนข�อมูล This is new text. เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ stdwintext.txt โดยใช�ฟ4งก/ชั่น fputs() และโหมดการทํางานคือ a

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.25

218

ก. แฟ'มข�อมูลเดิม ข. แฟ'มข�อมูลท่ีถูกเขียนต อท�าย ภาพท่ี 9.25 ผลลัพธ/ของโปรแกรมแสดงการเขียนข�อมูล This is new text. เข�าไปในแฟ'มข�อมูลประเภทเท็กซ/

ไฟล/ stdwintext.txt โดยใช�ฟ4งก/ชั่น fputs() และโหมดการทํางานคือ a จากตัวอย างนี้ เป(นการประกาศตัวแปรไฟล/พอยเตอร/ fp ท่ีบรรทัดท่ี 6 (FILE *fp;) จากนั้นบรรทัดท่ี 7 (fp = fopen("stdwintext.txt", "a+t");) เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า stdwintext.txt โดยมีโหมดการทํางานคือ a เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ือเขียนข�อมูลต อท�ายข�อมูลเดิมในแฟ'มข�อมูล ซ่ึงค าท่ีเป(นตําแหน งท่ีอยู จากการใช�ฟ4งก/ชั่น fopen() จะส งให�ตัวแปรไฟล/พอยเตอร/ fp บรรทัดท่ี 8 เป(นการประกาศตัวแปร buff เป(นตัวแปรอาเรย/มีชนิดข�อมูลแบบตัวอักขระมีขนาด 50 ช อง กําหนดค าเริ่มต�นคือ This is new text. (char buff[50]="This is new text.";) จากนั้นนําข�อมูลจากตัวแปร buff ไปเขียนลงแฟ'มข�อมูลท่ีบรรทัดท่ี 9 (fputs(buff, fp);) การนําข�อมูลดังกล าวไปเขียนลงแฟ'มข�อมูลนี้ เป(นการเขียนข�อมูลต อท�ายข�อมูลเดิม

ข�อมูล This is new text. ท่ีเขียนต อท�ายข�อมูลเดิม

219

ตัวอย0างท่ี 9.7 โปรแกรมแสดงการเขียนข�อมูลชื่อและจํานวนเงินลงแฟ'มข�อมูลชื่อว า account.txt โดยใช�ฟ4งก/ชั่น fprintf()

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

#include<stdio.h> #include<stdlib.h> #include<conio.h> int main() { FILE *fp; fp = fopen("account.txt", "a+t"); if(fp == NULL) { printf("Error open file."); getch(); exit(1); } else { char name[30]; float amount; printf("Enter name : "); scanf("%s", name); printf("Enter amount : "); scanf("%f", &amount); fprintf(fp, "%s %f\n", name, amount); printf("\nCompleted!!!"); getch(); fclose(fp); exit(0); } return 0; }

ภาพท่ี 9.26 โปรแกรมแสดงการเขียนข�อมูลชื่อและจํานวนเงินลงแฟ'มข�อมูลชื่อว า account.txt โดยใช�ฟ4งก/ชั่น fprintf()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.26 - ป'อนชื่อ Dam และจํานวนเงิน 47.25

Enter name : _

Enter name : Dam Enter amount : 47.25

Enter name : Dam Enter amount : 47.25 Completed!!!

ก. ข. แฟ'มข�อมูลชื่อว า account.txt ภาพท่ี 9.27 ผลลัพธ/ของโปรแกรมแสดงการเขียนข�อมูลชื่อและจํานวนเงินลงแฟ'มข�อมูลชื่อว า account.txt

โดยใช�ฟ4งก/ชั่น fprintf() จากตัวอย างนี้ เป(นการประกาศตัวแปรไฟล/พอยเตอร/ fp ท่ีบรรทัดท่ี 6 (FILE *fp;) บรรทัดท่ี 8 (fp = fopen("account.txt", "a+t");) เป(นการเป:ดแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า account.txt โดยมีโหมดการทํางานคือ a+t เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ืออ านและเขียนต อท�ายข�อมูลเดิมในแฟ'มข�อมูล ซ่ึงค าท่ีเป(นตําแหน งท่ีอยู จากการใช�ฟ4งก/ชั่น fopen() จะส งให�ตัวแปรไฟล/พอยเตอร/ fp จากนั้นบรรทัดท่ี 9 (if(fp ==

NULL) {) เป(นการตรวจสอบว าแฟ'มข�อมูลดังกล าวมีอยู หรือไม หากไม มีให�แสดงคําว า Error open file. แต ตัวอย างนี้ใช�โหมดการทํางาน a+t หากไม พบแฟ'มข�อมูลท่ีต�องการ โปรแกรมสร�างแฟ'มข�อมูลใหม แต ถ�าพบแฟ'มข�อมูลท่ีต�องการ โปรแกรมทํางานต้ังแต บรรทัดท่ี 14 ถึง 28 โดยประกาศตัวแปร name และ amount เพ่ือใช�รับข�อมูลจากผู�ใช�งานผ านทางคีย/บอร/ด จากนั้นบรรทัดท่ี 22 (fprintf(fp, "%s %f\n", name,

amount);) เป(นการนําข�อมูลจากท้ังสองตัวแปรไปเขียนต อท�ายของข�อมูลเดิมในแฟ'มข�อมูล สามารถจัดรูปแบบ

220

ข�อมูลท่ีต�องการแสดงผลได�คือ %s %f จากนั้นแสดงข�อความ Completed!!! ท่ีบรรทัดท่ี 24 (printf("\nCompleted!!!");) ซ่ึงเป(นการแจ�งว าการเขียนข�อมูลดังกล าวสมบูรณ/ ตัวอย0างท่ี 9.8 โปรแกรมแสดงการนําข�อมูลชื่อและจํานวนเงินจากแฟ'มข�อมูลชื่อว า account.txt มาแสดงท่ีหน�าจอโดยใช�ฟ4งก/ชั่น fscanf()

01 02 03 04 05 06 07 08 09 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> #include<conio.h> int main() { FILE *fp; fp = fopen("account.txt", "r+t"); if(fp == NULL) { printf("Error open file."); getch(); exit(1); } else { char name[30]; float amount; while(!feof(fp)) { fscanf(fp, "%s %f\n", name, &amount); printf("%s\t", name); printf("%f\n", amount); } getch(); exit(0); } fclose(fp); return 0; }

ภาพท่ี 9.28 โปรแกรมแสดงการนําข�อมูลชื่อและจํานวนเงินจากแฟ'มข�อมูลชื่อว า account.txt มาแสดงท่ีหน�าจอโดยใช�ฟ4งก/ชั่น fscanf()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.29 ภาพท่ี 9.29 ผลลัพธ/ของโปรแกรมแสดงการนําข�อมูลชื่อและจํานวนเงินจากแฟ'มข�อมูลชื่อว า account.txt มา

แสดงท่ีหน�าจอโดยใช�ฟ4งก/ชั่น fscanf() จากตัวอย างนี้ เป(นการนําข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า account.txt มาแสดงท่ีหน�าจอ โดยใช�คําสั่งวนรอบ while ท่ีบรรทัดท่ี 17 (while(!feof(fp)) {) โดยมีเง่ือนไขว า หากยังไม สิ้นสุดแฟ'มข�อมูล ให�ทําคําสั่งท่ีอยู ในบรรทัดท่ี 18 ถึง 20 โดยบรรทัดท่ี 18 (fscanf(fp, "%s %f\n", name, &amount);) เป(นการอ านข�อมูลจากแฟ'มข�อมูลชื่อว า account.txt โดยระบุชนิดข�อมูลท่ีต�องการแสดงผลจากการอ านข�อมูลจากแฟ'มข�อมูลคือ %s %f แล�วเก็บค าท่ีอ านได�ไว�ในตัวแปร name และ amount เพ่ือนําไปแสดงผลท่ีหน�าจอท่ีบรรทัดท่ี 19 และ 20 โดยนําข�อมูลท่ีอยู ในแฟ'มข�อมูลท้ังหมดมาแสดงจนกว าสิ้นสุดแฟ'มข�อมูล

221

แฟมข�อมูลประเภทไบนารีไฟล% ไบนารีไฟล% (Binary File) คือ แฟ'มข�อมูลท่ีจัดเก็บข�อมูลในรูปแบบของเลขฐานสอง (Binary Digit) ส วนใหญ แล�วแฟ'มข�อมูลประเภทนี้จะใช�ตัวแปรโครงสร�างในการดําเนินการกับข�อมูลไม ว าอ านหรือเขียน เม่ือต�องการเป:ดไบนารีไฟล/ท่ีต�องการ จําเป(นต�องประกาศตัวแปรไฟล/พอยเตอร/เหมือนกับเท็กซ/ไฟล/ ดังภาพท่ี 9.1 ส วนการเป:ดไบนารีไฟล/ คล�ายกับเท็กซ/ไฟล/ ต างกันตรงท่ีโหมดการทํางาน ดังภาพท่ี 9.30

FILE *fopen("ช่ือแฟมข�อมูลหรือไฟล%", "โหมดการทํางาน");

ภาพท่ี 9.30 รูปแบบการใช�ฟ4งก/ชั่น fopen() ของแฟ'มข�อมูลประเภทไบนารีไฟล/ ชื่อแฟ'มข�อมูลหรือไฟล/ (File) คือ แฟ'มข�อมูลหรือไฟล/ประเภทไบนารีไฟล/ท่ีต�องการเป:ดข้ึนมาใช�งาน โหมดการทํางาน (Mode) คือ โหมดของการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ ดังตารางท่ี 9.1

โหมดการทํางาน รายละเอียด rb เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ข้ึนมาเพ่ืออ านข�อมูลอย างเดียว หาก

ไม พบแฟ'มข�อมูล จะเกิดข�อผิดพลาดข้ึน wb เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ข้ึนมาเพ่ือเขียนข�อมูลทับข�อมูลเดิม

หากไม พบแฟ'มข�อมูล จะสร�างแฟ'มข�อมูลใหม ab เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ข้ึนมาเพ่ือเขียนข�อมูลต อท�ายของ

ข�อมูลเดิมในแฟ'มข�อมูล หากไม พบแฟ'มข�อมูล จะสร�างแฟ'มข�อมูลใหม r+b เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ข้ึนมาเพ่ืออ านและเขียนข�อมูล หากไม

พบแฟ'มข�อมูล จะเกิดข�อผิดพลาดข้ึน w+b เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ข้ึนมาเพ่ืออ านและเขียนข�อมูลทับ

ข�อมูลเดิม หากไม พบแฟ'มข�อมูล จะสร�างแฟ'มข�อมูลใหม a+b เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ข้ึนมาเพ่ืออ านและเขียนข�อมูลต อท�าย

ของข�อมูลเดิมในแฟ'มข�อมูล หากไม พบแฟ'มข�อมูล จะสร�างแฟ'มข�อมูลใหม ตารางท่ี 9.2 โหมดการทํางานของแฟ'มข�อมูลประเภทไบนารีไฟล/

ในภาษาซีได�จัดเตรียมฟ4งก/ชั่นท่ีใช�การดําเนินการกับข�อมูลของแฟ'มข�อมูลประเภทไบนารีไฟล/คือ fread(), fwrite(), feof(), ferror() และ fclose() โดยมีรายละเอียด ดังนี้ ฟBงก%ช่ัน fread() ฟ4งก/ชั่นนี้ใช�ในการอ านข�อมูลจากแฟ'มข�อมูลประเภทไบนารีตามจํานวนไบต/ท่ีต�องการอ าน โดยมีรูปแบบการใช�งานดังภาพท่ี 9.31

fread(ช่ือตัวแปรรองรับข�อมูล, ขนาดข�อมูล, จํานวนข�อมูลท่ีอ0าน, ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.31 รูปแบบการใช�ฟ4งก/ชั่น fread()

222

ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น char c; fread(c, 1, 4, fp); เป(นการอ านข�อมูลจากแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู โดยระบุขนาดข�อมูล 1 ไบต/ และจํานวนข�อมูลท่ีอ าน 4 ดังนั้นจะอ านข�อมูลท้ังหมด 1 x 4 เท ากับ 4 ไบต/จากแฟ'มข�อมูล char s[30]; fread(s, sizeof(s), 2, fp); เป(นการอ านข�อมูลจากแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู โดยระบุขนาดข�อมูลจากฟ4งก/ชั่น sizeof() เท ากับ 30 ไบต/ และจํานวนข�อมูลท่ีอ าน 2 ดังนั้นจะอ านข�อมูลท้ังหมด 30 x 2 เท ากับ 60 ไบต/จากแฟ'มข�อมูล ฟBงก%ช่ัน fwrite() ฟ4งก/ชั่นนี้ใช�ในการเขียนข�อมูลลงแฟ'มข�อมูลประเภทไบนารีตามจํานวนไบต/ท่ีต�องการเขียน โดยมีรูปแบบการใช�งานดังภาพท่ี 9.32

fwrite(ท่ีอยู0ของตัวแปรโครงสร�าง, ขนาดข�อมูล, จํานวนข�อมูลท่ีเขียน, ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.32 รูปแบบการใช�ฟ4งก/ชั่น fwrite() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } myfriend; fread(&myfriend, sizeof(myfriend), 1, fp); เป(นการเขียนข�อมูลลงแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู ณ ตําแหน งท่ีอยู ตัวแปรโครงสร�าง myfriend โดยระบุขนาดข�อมูลโดยใช�ฟ4งก/ชั่น sizeof() ในการหาขนาดของตัวแปรโครงสร�าง myfriend โดยท่ีขนาดของสมาชิก nickname เท ากับ 50 ไบต/ ขนาดของสมาชิก mobile เท ากับ 100 ไบต/ ขนาดของสมาชิก weight เท ากับ 4 ไบต/ และขนาดของ height เท ากับ 4 ไบต/ ดังนั้นขนาดของตัวแปรโครงสร�าง myfriend เท ากับ 158 ไบต/ และจํานวนไบต/ท่ีต�องการ 1 ไบต/ ดังนั้นอ านข�อมูลท้ังหมด 1 x 4 เท ากับ 4 ไบต/จากแฟ'มข�อมูล ฟBงก%ช่ัน feof() ฟ4งก/ชั่นนี้ใช�ในการตรวจสอบตัวแปรไฟล/พอยเตอร/ว าชี้ท่ีตําแหน งท�ายหรือตําแหน งสิ้นสุดของแฟ'มข�อมูลประเภทไบนารีไฟล/หรือไม โดยมีรูปแบบการใช�งานดังภาพท่ี 9.33

223

feof(ช่ือตัวแปรไฟล%พอยเตอร%)

ภาพท่ี 9.33 รูปแบบการใช�ฟ4งก/ชั่น feof() ของแฟ'มข�อมูลประเภทไบนารีไฟล/ ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น if(feof(fp)) { printf("End of file.\n"); } เป(นการตรวจสอบตัวแปรไฟล/พอยเตอร/ fp ว าชี้ท่ีตําแหน งท�ายของแฟ'มข�อมูลหรือไม หากตัวแปรไฟล/พอยเตอร/ fp ชี้ท่ีตําแหน งท�ายของแฟ'มข�อมูล ให�แสดงข�อความ End of file. ฟBงก%ช่ัน ferror() ฟ4งก/ชั่นนี้ใช�ในการตรวจสอบว าเกิดข�อผิดพลาดท่ีเกิดข้ึนกับแฟ'มข�อมูลประเภทไบนารีไฟล/หรือไม โดยมีรูปแบบการใช�งานดังภาพท่ี 9.34

ferror(ช่ือตัวแปรไฟล%พอยเตอร%)

ภาพท่ี 9.34 รูปแบบการใช�ฟ4งก/ชั่น ferror() ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น char c; fread(c, 1, 4, fp); if(ferror(fp)) { printf("Error for read.\n"); } เป(นการตรวจสอบว าเกิดข�อผิดพลาดของการอ านข�อมูลจากแฟ'มข�อมูลท่ีตัวแปรไฟล/พอยเตอร/ fp เป:ดอยู หรือไม หากเกิดข�อผิดพลาด ให�แสดงข�อความ Error for read. ฟBงก%ช่ัน fclose () ฟ4งก/ชั่นนี้ใช�ในการป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ท่ีเลิกใช�งานแล�ว โดยมีรูปแบบการใช�งานดังภาพท่ี 9.35

fclose(ช่ือตัวแปรไฟล%พอยเตอร%);

ภาพท่ี 9.35 รูปแบบการใช�ฟ4งก/ชั่น fclose() ของแฟ'มข�อมูลประเภทไบนารีไฟล/ ตัวอย างของการใช�ฟ4งก/ชั่นนี้ เช น fclose(fp); เป(นการป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ท่ีตัวแปรไฟล/พอยเตอร/ fp ชี้อยู หลังจากใช�งานแฟ'มข�อมูลดังกล าวเสร็จแล�ว

224

ตัวอย0างท่ี 9.9 โปรแกรมแสดงการเขียนข�อมูลจากตัวแปรโครงสร�าง MyFriend ลงแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า samplebin.txt โดยใช�ฟ4งก/ชั่น fwrite()

01 02 03 04 05 06 07 08 09 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 35 36 37 38 39

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> int main() { FILE *fp; struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } myfriend; fp = fopen("binary.txt", "w+b"); if(fp == NULL) { printf("Error open file."); exit(1); } else { strcpy(myfriend.nickname, "Dam"); strcpy(myfriend.mobile, "0891234567"); myfriend.weight = 83; myfriend.height = 185.35; fwrite(&myfriend, sizeof(myfriend), 1, fp); if(ferror(fp)) { printf("Error for write.\n"); getch(); exit(2); } else { printf("Write completed!!!\n"); getch(); exit(0); } } fclose(fp); getch(); return 0; }

ภาพท่ี 9.36 โปรแกรมแสดงการเขียนข�อมูลจากตัวแปรโครงสร�าง MyFriend ลงแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า samplebin.txt โดยใช�ฟ4งก/ชั่น fwrite()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.37

ก. ผลลัพธ/เม่ือเขียนข�อมูลสําเร็จ ข. แฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt ภาพท่ี 9.37 ผลลัพธ/ของโปรแกรมแสดงการเขียนข�อมูลจากตัวแปรโครงสร�าง MyFriend ลงแฟ'มข�อมูล

ประเภทไบนารีไฟล/ชื่อว า samplebin.txt โดยใช�ฟ4งก/ชั่น fwrite() จากตัวอย างนี้ เป(นการประกาศตัวแปรไฟล/พอยเตอร/ fp ท่ีบรรทัดท่ี 7 (FILE *fp;) จากนั้นบรรทัดท่ี 8 ถึง 13 เป(นการประกาศตัวแปรโครงสร�าง MyFriend บรรทัดท่ี 14 (fp = fopen("binary.txt", "w+b");) เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt โดยมีโหมดการทํางานคือ w+t เป(นการเป:ดแฟ'มข�อมูลข้ึนมาเพ่ืออ านและเขียนทับข�อมูลเดิมในแฟ'มข�อมูล ซ่ึงค าท่ีเป(นตําแหน งท่ีอยู จากการใช�ฟ4งก/ชั่น fopen() จะส งให�ตัวแปรไฟล/พอยเตอร/ fp จากนั้นบรรทัดท่ี 15 (if(fp == NULL) {) เป(นการตรวจสอบว า

225

แฟ'มข�อมูลดังกล าวมีอยู หรือไม หากไม มีให�แสดงคําว า Error open file. แต ตัวอย างนี้ใช�โหมดการทํางาน w+t หากไม พบแฟ'มข�อมูลท่ีต�องการ จะทําการสร�างแฟ'มข�อมูลใหม แต ถ�าพบแฟ'มข�อมูลท่ีต�องการ โปรแกรมจะทํางานต้ังแต บรรทัดท่ี 19 ถึง 32 โดยบรรทัดท่ี 19 ถึง 22 เป(นการกําหนดค าให�กับสมาชิกของตัวแปรโครงสร�าง myfriend จากนั้นบรรทัดท่ี 23 (fwrite(&myfriend, sizeof(myfriend), 1, fp);) เป(นการเขียนข�อมูลลงแฟ'มข�อมูลดังกล าว บรรทัดท่ี 24 (if(ferror(fp)) {) ตรวจสอบว าเกิดข�อผิดพลาดของการเขียนข�อมูลหรือไม หากเกิดข�อผิดพลาด แสดงข�อความ Error for write. ท่ีบรรทัดท่ี 25 (printf("Error for

write.\n");) หากไม เกิดข�อผิดพลาด แสดงข�อความ Write completed!!! ท่ีบรรทัดท่ี 29 (printf("Write completed!!!\n");) ผลลัพธ/ของตัวอย างนี้จะได�แฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt ดังภาพท่ี 9.37 (ข.) ตัวอย0างท่ี 9.10 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt ลงตัวแปรโครงสร�าง MyFriend โดยใช�ฟ4งก/ชั่น fread()

01 02 03 04 05 06 07 08 09 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 35 36 37 38

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> int main() { FILE *fp; struct MyFriend { char nickname[50]; char mobile[100]; float weight; float height; } myfriend; fp = fopen("binary.txt", "r+b"); if(fp == NULL) { printf("Error open file."); exit(1); } else { fread(&myfriend, sizeof(myfriend), 1, fp); if(ferror(fp)) { printf("Error for write.\n"); getch(); exit(2); } else { printf("Nick name \t: %s\n", myfriend.nickname); printf("Mobile phone \t: %s\n", myfriend.mobile); printf("Weight \t\t: %.2f\n", myfriend.weight); printf("Height \t\t: %.2f", myfriend.height); getch(); exit(0); } } fclose(fp); getch(); return 0; }

ภาพท่ี 9.38 โปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt ลงตัวแปรโครงสร�าง MyFriend โดยใช�ฟ4งก/ชั่น fread()

เม่ือรันโปรแกรมนี้ จะได�ผลลัพธ/ดังภาพท่ี 9.39

226

ภาพท่ี 9.39 ผลลัพธ/ของโปรแกรมแสดงการอ านข�อมูลจากแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt ลง

ตัวแปรโครงสร�าง MyFriend โดยใช�ฟ4งก/ชั่น fread() จากตัวอย างนี้ เป(นการนําข�อมูลจากตัวแปรโครงสร�าง myfriend ท่ีเขียนลงแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt จากตัวอย างท่ี 9.9 มาแสดงท่ีหน�าจอ บรรทัดท่ี 19 (fp = fopen("binary.txt",

"r+b");) เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า binary.txt โดยมีโหมดการทํางานคือ r+b เป(นการเป:ดแฟ'มข�อมูลประเภทไบนารีไฟล/ข้ึนมาเพ่ืออ านข�อมูลจากแฟ'มข�อมูล โดยใช�ฟ4งก/ชั่น fread() ท่ีบรรทัดท่ี 19 (fread(&myfriend, sizeof(myfriend), 1, fp);) ข�อมูลท่ีอ านได�จะถูกเก็บไว�ท่ีสมาชิกแต ละตัวของตัวแปรโครงสร�าง myfriend และนํามาแสดงท่ีหน�าจอ สรุป ในบทเรียนนี้ได�อธิบายถึง แฟ'มข�อมูลคือ หน วยหนึ่งของข�อมูลท่ีใช�ในการจัดเก็บข�อมูลจํานวนมาก ส วนใหญ แล�วข�อมูลดังกล าวมักมีความสัมพันธ/กัน การดําเนินการกับแฟ'มข�อมูลมีข้ันตอนคือ การเป:ดแฟ'มข�อมูล การประมวลผลข�อมูลในแฟ'มข�อมูล และการป:ดแฟ'มข�อมูล แฟ'มข�อมูลประเภทเท็กซ/ไฟล/คือ แฟ'มข�อมูลท่ีจัดเก็บข�อมูลในรูปแบบของข�อความท่ีเรียกว าเท็กซ/ ส วนแฟ'มข�อมูลประเภทไบนารีไฟล/คือ แฟ'มข�อมูลท่ีจัดเก็บข�อมูลในรูปแบบของเลขฐานสอง ส วนใหญ แล�วแฟ'มข�อมูลประเภทนี้จะใช�ตัวแปรโครงสร�างในการดําเนินการกับข�อมูลไม ว าอ านหรือเขียน ภาษาซีได�จัดเตรียมฟ4งก/ชั่นท่ีใช�การดําเนินการกับข�อมูลของแฟ'มข�อมูลท้ังสองประเภทไว�ด�วย

227

ใบงานที่ 9 1. จงเขียนโปรแกรมเพ่ือรับข�อมูลผ านทางคีย/บอร/ด ดังนี้ ชื่อ นามสกุล และอายุของเพ่ือนในห�องเรียน 5 คน จากนั้นนําข�อมูลดังกล าวมาเขียนลงแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า friend.txt 2. จงเขียนโปรแกรมเพ่ืออ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/จากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ท่ีกําหนดให� (ไฟล/ชื่อว า animal.txt) ให�นําข�อมูลดังกล าวมาแสดงผลท่ีหน�าจอ

Ant

Bee

Cat

Dog

Elephant

Frog

3. จงเขียนโปรแกรมเพ่ือรับข�อมูลผ านทางคีย/บอร/ด ดังนี้ ชื่อยี่ห�อรถยนต/ รุ น และจํานวนซีซี จํานวน 5 ยี่ห�อ จากนั้นนําข�อมูลดังกล าวมาเขียนลงแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า car.bin 4. จงเขียนโปรแกรมเพ่ืออ านและเขียนข�อมูลลงแฟ'มข�อมูล(ให�เลือกประเภทแฟ'มข�อมูลเอง) โดยเขียนให�อยู ในรูปแบบของฟ4งก/ชั่นสร�างเอง ของผู�บริหารของมหาวิทยาลัย ประกอบด�วย ชื่อ นามสกุล ตําแหน ง(อธิการบดี, รองอธิการบดี หรือผู�ช วยอธิการบดี) และอายุ

228

คําถามทบทวน 1. จงเขียนโปรแกรมเพ่ือรับข�อมูลผ านทางคีย/บอร/ด ดังนี้ ชื่อ นามสกุล และรหัสประจําตัวนักศึกษา ของเพ่ือนในห�องเรียน 10 คน จากนั้นนําข�อมูลดังกล าวมาเขียนลงแฟ'มข�อมูลประเภทเท็กซ/ไฟล/ชื่อว า student.txt 2. จงเขียนโปรแกรมเพ่ืออ านข�อมูลจากแฟ'มข�อมูลประเภทเท็กซ/ไฟล/จากข�อ 1 มาแสดงผลท่ีหน�าจอ 3. จงเขียนโปรแกรมเพ่ือรับข�อมูลผ านทางคีย/บอร/ด ดังนี้ ชื่อวิชา และคะแนน จํานวน 15 วิชา จากนั้นนําข�อมูลดังกล าวมาเขียนลงแฟ'มข�อมูลประเภทไบนารีไฟล/ชื่อว า subject.bin 4. จงเขียนโปรแกรมเพ่ืออ านข�อมูลจากแฟ'มข�อมูลประเภทไบนารีไฟล/จากข�อ 3 มาแสดงผลท่ีหน�าจอ 5. จงเขียนโปรแกรมเพ่ืออ านและเขียนข�อมูลลงแฟ'มข�อมูล(ให�เลือกประเภทแฟ'มข�อมูลเอง) โดยเขียนให�อยู ในรูปแบบของฟ4งก/ชั่นสร�างเอง ของสมาชิกในครอบครัว ประกอบด�วย ชื่อ นามสกุล ประเภท(บิดา, มารดา, พ่ีชาย, พ่ีสาว, น�องชาย หรือน�องสาว) อายุ ความสูง และน้ําหนัก

เอกสารอ�างอิง เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร�ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร�. ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร�. กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall.

บรรณานุกรม เฉลิมพล ทัพซ�าย (2541). การเขียนโปรแกรมภาษา C. กรุงเทพฯ : บริษัท 3495 บุ�คเซ็นเตอร% จํากัด. นิรุธ อํานวยศิลป- (2546). คู�มือเขียนโปรแกรมด�วยภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. บุญเลิศ เอ่ียมทัศนา และคณะ (2532). โปรแกรมคอมพิวเตอร ภาษาซี. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). วิโรจน% ทวีปวรเดช (2553). การเขียนโปรแกรมคอมพิวเตอร . ขอนแก:น : มหาวิทยาลัยขอนแก:น. วิทยา วัชระวิทยากุล (2535). ภาษาและการโปรแกรม C. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). สมโภชน% ชื่นเอ่ียม (2555). หลักการออกแบบและเขียนโปรแกรมเบ้ืองต�น. กรุงเทพฯ : บริษัท ซีเอ็ดยูเคชั่น จํากัด (มหาชน). อรพิน ประวัติบริสุทธิ์ (2547). คู�มือเรียนภาษาซี. กรุงเทพฯ : บริษัท โปรวิชั่น จํากัด. อุมาพร ศิรธรานนท% (2544). คอมพิวเตอร . กรุงเทพฯ : มูลนิธิส:งเสริมโอลิมป@กวิชาการและพัฒนามาตรฐาน วิทยาศาสตร%ศึกษา ในพระอุปถัมป-สมเด็จพระเจ�าพ่ีนางเธอ เจ�าฟGากัลยาณิวัฒนา กรมหลวงนราธิวาส- ราชนครินทร% (สอวน.). Brain W. Kerighan and Dennis M. Ritchie (1988). The C Programming Language. USA : Prentice-Hall. Gmail มือถือ (2556). สืบค�นจาก : http://www.google.co.in [13 มีนาคม 2556]. ผู�หญิง women (2556). สืบค�นจาก : http://women.kapook.com [8 กุมภาพันธ% 2556]. Ohlala Online (2556). สืบค�นจาก : http://www.bbfarm.in.th [10 กุมภาพันธ% 2556]. Sage (2556). สืบค�นจาก : http://na.sage.com [11 กุมภาพันธ% 2556]. บมจ. ธนาคารกรุงไทย (2556). สืบค�นจาก : http://www.ktb.co.th [11 กุมภาพันธ% 2556]. โรงพยาบาลเชียงใหม: ราม (2556). สืบค�นจาก : http://www.ktb.co.th [12 กุมภาพันธ% 2556]. Science Photo Library (2556). สืบค�นจาก : http://www.sciencephoto.com [12 กุมภาพันธ% 2556]. NASA (2556). สืบค�นจาก : http://www.nasa.gov [12 กุมภาพันธ% 2556]. DSRD (Data Systems Research and Development) (2556). สืบค�นจาก : http://www.csm.ornl.gov [13 กุมภาพันธ% 2556]. DRU Samutprakan (มหาวิทยาลัยราชภัฏธนบุรี สมุทรปราการ) (2556). สืบค�นจาก : https://www.facebook.com/Drusp [13 กุมภาพันธ% 2556]. MdN Design Interactive (2556). สืบค�นจาก : http://www.mdn.co.jp [15 กุมภาพันธ% 2556]. Moda, bellezza, celebrities e tutto ciò che fa tendenza - Style.it (2556). สืบค�นจาก : http://www.style.it [15 กุมภาพันธ% 2556]. Paul A. Carter, PC Assembly Language (2006). สืบค�นจาก : http://www.freebookcentre.net/ programming-books-download/PC-Assembly-Language.html [21 กุมภาพันธ% 2556]. TRATTUN (2556). สืบค�นจาก : http://trattun.exteen.com [10 กุมภาพันธ% 2556]. กระทรวงวิทยาศาสตร%และเทคโนโลยี (2556). สืบค�นจาก : http://www.most.go.th [16 กุมภาพันธ% 2556]. Axis Lifts Pvt. Ltd. (2556). สืบค�นจาก : http://www.axislifts.co.in [15 กุมภาพันธ% 2556]. Miss Thrifty (2556). สืบค�นจาก : http://www.miss-thrifty.co.uk/ [18 กุมภาพันธ% 2556]. ทีมงานชาวลําปาง, การเขียนโปรแกรมเบ้ืองต�น (Introduction to Programming) (2556). สืบค�นจาก : http://www.thaiall.com/article/teachpro.htm [4 เมษายน 2556].

230

ภาคผนวก เอกสารประกอบการสอนเล มนี้ ได�ใช�โปรแกรมภาษาซีเป�นเครื่องมือในการเขียนโปรแกรมเชิงโครงสร�าง โดยได�ใช�โปรแกรมภาษาซีคือ โปรแกรม Turbo C++ และโปรแกรม Dev-C++ ในภาคผนวกนี้ได�อธิบายการติดต้ังโปรแกรมภาษาซีดังกล าว โดยมีรายละเอียดดังต อไปนี้ การติดตั้งโปรแกรม Turbo C++ โปรแกรม Turbo C++ เป�นโปรแกรมของ Borland International, Inc. ซ่ึงเวอร?ชั่นท่ีจะนํามาใช�ในเอกสารประกอบการสอนเล มนี้คือ เวอร?ชั่น 4.5 สามารถดาวน?โหลดได�จากอินเทอร?เน็ต เม่ือได�โปรแกรม Turbo C++ มาแล�ว ส วนมากจะอยู ในรูปของไฟล?ท่ีถูกบีบอัด (Compressed File) ชื่อว า Borland Turbo C++ 4.5.rar หรือ Borland Turbo C++ 4.5.zip ดังภาพท่ี A.1

ภาพท่ี A.1 ไฟล?ชื่อว า Borland Turbo C++ 4.5.rar ภาพท่ี A.2 การขยายไฟล? Borland Turbo C++ 4.5.rar ข้ันตอนการติดต้ังโปรแกรม Turbo C++ มีรายละเอียด ดังนี้ 1. ให�ขยายไฟล?ชื่อว า Borland Turbo C++ 4.5.rar หรือท่ีเรียกว า UnZip ออกมา จะได�ไฟล?ต างๆ ท่ีอยู ในไฟล? Borland Turbo C++ 4.5.rar ดังภาพท่ี A.2 2. จากนั้นให�ใข�เม�าส?ดับเบ้ิลคลิ๊กไฟล?ชื่อว า INSTALL.EXE เพ่ือติดต้ังโปรแกรม (Program Installation) ดังภาพท่ี A.3 เป�นการเข�าสู หน�าจอการติดต้ังโปรแกรมภาษาซี Turbo C++ 4.5 (Turbo C++ Installation/Configuration Notes) ดังภาพท่ี A.4

ภาพท่ี A.3 ไฟล?ชื่อว า INSTALL.EXE ภาพท่ี A.4 หน�าจอแสดงรายละเอียดการติดต้ังโปรแกรม

232

3. หน�าจอการติดต้ังโปรแกรม แสดงรายละเอียดของการติดต้ังโปรแกรม ดังนี้ 3.1 ดูรายละเอียดของการติดต้ังโปรแกรมได�จากไฟล? INSTALL.TXT พร�อมกับติดต้ังโปรแกรมโดยใช�เม�าส?คลิ๊กปุdม Continue 3.2 แต ถ�าต�องการข�ามการดูรายละเอียดของการติดต้ังโปรแกรมได�จากไฟล? INSTALL.TXT ให�ใช�เม�าส?คลิ๊กปุdม Skip 3.3 หากต�องการยกเลิกการติดต้ังโปรแกรม ให�ใช�เม�าส?คลิ๊กปุdม Cancel 3.4 หากต�องการขอความช วยเหลือการติดต้ังโปรแกรม ให�ใช�เม�าส?คลิ๊กปุdม Help ในท่ีนี้ให�ใช�เม�าส?คลิ๊กปุdม Continue จะปรากฏหน�าจอแสดงรายละเอียดของการติดต้ังโปรแกรมได�จากไฟล? INSTALL.TXT ดังภาพท่ี A.5 สามารถศึกษารายละเอียดของการติดต้ังโปรแกรมได�จากไฟล?นี้

ภาพท่ี A.5 แสดงไฟล?ชื่อว า INSTALL.TXT ภาพท่ี A.6 หน�าจอก อนการติดต้ังโปรแกรม 4. เม่ือศึกษาไฟล?ดังกล าวเสร็จแล�ว ให�ใช�เม�าส?กดปุdม Close เพ่ือปjดไฟล?ดังกล าว ปรากฏหน�าจอก อนการติดต้ังโปรแกรม (Turbo C++ Installation) ดังภาพท่ี A.6 ด�านบนให�เลือกว าจะติดต้ังโปรแกรมแบบเต็ม (Full) หรือแบบท่ีผู�ติดต้ังโปรแกรมเป�นผู�เลือกว าจะติดต้ังอะไร (Custom) หรือติดต้ังจากแผ นซีดี (CD) ส วนด�านล างให�เลือกตําแหน งของการติดต้ังโปรแกรมว าจะอยู ท่ีไดรว? (Drive) ไหน ในท่ีนี้เลือกไดรว? C และไดเร็คทอรี่สําหรับเอกสารออนไลน? ในท่ีนี้ใช�ตามท่ีโปรแกรมติดต้ังได�ระบุไว�คือ C:\ACROREAD เม่ือเลือกได�แล�ว ให�ใช�เม�าส?คลิ๊กปุdม Continue จะปรากฏหน�าจอก อนการติดต้ังโปรแกรม(ถัดไป) (Turbo C++ Installation) ดังภาพท่ี A.7

ภาพท่ี A.7 หน�าจอก อนการติดต้ังโปรแกรม(ถัดไป) ภาพท่ี A.8 หน�าจอการติดต้ังโปรแกรม 5. หน�าจอการติดต้ังโปรแกรม(ถัดไป) นี้ ให�ปqอนชื่อไดเร็คทอรี่ (Directory) ท่ีต�องการติดต้ังโปรแกรม ในท่ีนี้ใช�ชื่อไดเร็คทอรี่ตามท่ีโปรแกรมติดต้ังได�ระบุไว�คือ C:\TCWIN45 จากนั้นให�ใช�เม�าส?คลิ๊กปุdม Continue จะปรากฏหน�าจอการติดต้ังโปรแกรม ดังภาพท่ี A.8 จากนั้นให�ใช�เม�าส?คลิ๊กปุdม Install เพ่ือทําการติดต้ังโปรแกรม จะปรากฏหน�าจอแสดงกําลังติดต้ังโปรแกรมอยู ดังภาพท่ี A.9

233

ภาพท่ี A.9 หน�าจอแสดงกําลังติดต้ังโปรแกรมอยู ภาพท่ี A.10 หน�าจอบันทึกย อของเวอร?ชั่น 6. เม่ือโปรแกรมติดต้ังเสร็จ จะปรากฏหน�าจอบันทึกย อของเวอร?ชั่น (Turbo C++ Release Notes) ดังภาพท่ี A.10 ให�ใช�เม�าส?คลิ๊กปุdม Continue เพ่ือดูบันทึกย อของเวอร?ชั่นพร�อมกับดําเนินการต อไป จะปรากฏหน�าจอแสดงบันทึกย อของเวอร?ชั่น ดังภาพท่ี A.11 เม่ือศึกษาไฟล?ดังกล าวเสร็จแล�ว ให�ใช�เม�าส?กดปุdม Close เพ่ือปjดไฟล?ดังกล าว จะปรากฏหน�าจอการเตือนความจํา (Reminder!) ดังภาพท่ี A.12

ภาพท่ี A.11 หน�าจอแสดงบันทึกย อของเวอร?ชั่น ภาพท่ี A.12 หน�าจอการเตือนความจํา 7. หน�าจอการเตือนความจํา จะระบุข�อมูลเอกสารออนไลน?ท่ีได�ติดต้ังไว�ในไดเร็คทอรี่ท่ีระบุไว� จากนั้นให�ใช�เม�าส?กดปุdม OK จะปรากฏหน�าจอการติดต้ังโปรแกรมแล�ว (Turbo C++ Installation) ดังภาพท่ี A.13 จากนั้นให�ใช�เม�าส?กดปุdม OK จะปรากฏหน�าจอแจ�งการลงทะเบียนโปรแกรม ดังภาพท่ี A.14

ภาพท่ี A.13 หน�าจอการติดต้ังโปรแกรมแล�ว ภาพท่ี A.14 หน�าจอแจ�งการลงทะเบียนโปรแกรม 8. หน�าจอแจ�งการลงทะเบียนโปรแกรม ให�ใช�เม�าส?กดปุdม OK จะปรากฏหน�าจอการลงทะเบียนทางอิเล็กทรอนิกส? (Electronic Registration) ดังภาพท่ี A.15

234

ก. ข.

ค. ง.

จ. ฉ.

ภาพท่ี A.15 หน�าจอการลงทะเบียนทางอิเล็กทรอนิกส? 9. เม่ือติดต้ังโปรแกรมพร�อมกับลงทะเบียนโปรแกรมเสร็จสิ้น จะปรากฏหน�าต างแสดงไฟล?ต างๆ ของโปรแกรม Turbo C++ ดังภาพท่ี A.16

235

ภาพท่ี A.16 หน�าต างแสดงไฟล?ต างๆ ของโปรแกรม Turbo C++ 10. การเข�าใช�งานโปรแกรม Turbo C++ ให�ใช�เม�าส?คลิ๊กปุdม Start � Programs � Turbo C++ 4.5 � Turbo C++ ดังภาพท่ี A.17 การเข�าใช�งานดังกล าวจะแตกต างกันไปในแต ละรุ นของโปรแกรม Microsoft Windows ในท่ีนี้ใช�โปรแกรม Microsoft Windows รุ น XP

ภาพท่ี A.17 การเข�าใช�งานโปรแกรม Turbo C++ 11. จะปรากฏหน�าต างโปรแกรม Turbo C++ ดังภาพท่ี A.18 ถือว าการติดต้ังโปรแกรม Turbo C++ สมบูรณ?พร�อมใช�งาน

236

ภาพท่ี A.18 หน�าต างโปรแกรม Turbo C++ การติดตั้งโปรแกรม Dev-C++ โปรแกรม Dev-C++ เป�นโปรแกรมของ Free Software Foundation, Inc. ซ่ึงเวอร?ชั่นท่ีจะนํามาใช�ในเอกสารประกอบการสอนเล มนี้คือ เวอร?ชั่น 2 สามารถดาวน?โหลดได�จากอินเทอร?เน็ต เม่ือได�โปรแกรมภาษาซี Dev-C++ มาแล�ว ส วนมากจะอยู ในรูปของไฟล?ท่ีถูกบีบอัดและเม่ือขยายไฟล?หรือ UnZip จะได�ไฟล?ต างๆ ดังภาพท่ี A.19

ภาพท่ี A.19 ไฟล?ต างๆ ของโปรแกรม Dev-C++ ข้ันตอนการติดต้ังโปรแกรม Dev-C++ มีรายละเอียด ดังนี้ 1. ให�ใช�เม�าส?ดับเบ้ิลคลิ๊กไฟล?ชื่อว า dev-cpp-4.9.9.2_setup.exe เพ่ือติดต้ังโปรแกรม ดังภาพท่ี A.20 จะปรากฏหน�าจอต�อนรับการติดต้ังโปรแกรม ดังภาพท่ี A.21

ภาพท่ี A.20 ไฟล?ต างๆ ของโปรแกรม Dev-C++ ภาพท่ี A.21 หน�าจอรอโหลดไฟล?ติดต้ังอยู 2. จากนั้นให�ใช�เม�าส?กดปุdม OK จะปรากฏหน�าจอรอโหลดไฟล?ติดต้ังอยู ดังภาพท่ี A.21 จากนั้นจะปรากฏหน�าจอให�เลือกภาษาท่ีใช�ในการติดต้ัง (Installer Language) ดังภาพท่ี A.22 ให�เลือกภาษาอังกฤษ (English)

237

จากนั้นให�ใช�เม�าส?กดปุdม OK จะปรากฏหน�าจอสัญญาอนุญาตให�ใช�สิทธิ (License Agreement) ดังภาพท่ี A.23 ภาพท่ี A.22 หน�าจอให�เลือกภาษาท่ีใช�ในการติดต้ัง ภาพท่ี A.23 หน�าจอสัญญาอนุญาตให�ใช�สิทธิ 3. หน�าจอสัญญาอนุญาตให�ใช�สิทธิ จะแสดงรายละเอียดของข�อตกลงการใช�งานโปรแกรม หากเห็นด�วยให�ใช�เม�าส?กดปุdม I Agree จะปรากฏหน�าจอให�เลือกการติดต้ังโปรแกรม (Choose Components) ดังภาพท่ี A.24 ภาพท่ี A.24 หน�าจอให�เลือกการติดต้ังโปรแกรม ภาพท่ี A.25 หน�าจอให�เลือกไดเร็คทอรี่ติดต้ังโปรแกรม ก. ข.

ภาพท่ี A.26 หน�าจอแสดงกําลังติดต้ังโปรแกรมอยู 4. หน�าจอให�เลือกการติดต้ังโปรแกรม จะให�เลือกประเภทของการติดต้ัง ในท่ีนี้ให�เลือกประเภท Full จากนั้นให�ใช�เม�าส?กดปุdม Next จะปรากฏหน�าจอให�เลือกไดเร็คทอรี่ติดต้ังโปรแกรม ดังภาพท่ี A.25 ในท่ีนี้ใช�ตามท่ีโปรแกรมติดต้ังได�ระบุไว�คือ C:\Dev-Cpp จากนั้นให�ใช�เม�าส?กดปุdม Install เพ่ือดําเนินการติดต้ังโปรแกรม จะปรากฏหน�าจอแสดงกําลังติดต้ังโปรแกรมอยู ดังภาพท่ี A.26

238

5. เม่ือติดต้ังโปรแกรมเสร็จสิ้น จะปรากฏหน�าจอ ดังภาพท่ี A.27 จากนั้นให�ใช�เม�าส?กดปุdม Finish เพ่ือเสร็จสิ้นการติดต้ังโปรแกรม

ภาพท่ี A.26 หน�าจอแสดงกําลังติดต้ังโปรแกรมอยู ภาพท่ี A.27 การเข�าใช�งานโปรแกรม Dev-C++ 6. การเข�าใช�งานโปรแกรม Dev-C++ ให�ใช�เม�าส?คลิ๊กปุdม Start � Programs � Bloodshed Dev-C++ � Dev-C++ ดังภาพท่ี A.27 การเข�าใช�งานดังกล าวจะแตกต างกันไปในแต ละรุ นของโปรแกรม Microsoft Windows ในท่ีนี้ใช�โปรแกรม Microsoft Windows รุ น XP 7. จะปรากฏหน�าต างโปรแกรม Dev-C++ ดังภาพท่ี A.28 ถือว าการติดต้ังโปรแกรม Dev-C++ สมบูรณ?พร�อมใช�งาน

ภาพท่ี A.28 หน�าต างโปรแกรม Dev-C++