Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

3

Published by นฤมล สง่าเพ็ชร์, 2021-03-27 14:12:10

Description: 3

Search

Read the Text Version

โครงสรา้ งการทางานแบบมีทางเลือก ประโยคคาสัง่ if ประโยค if แบบงา่ ย 1 ทางเลือก คือ การเขยี นประโยค if ทม่ี ีการตรวจสอบเงอ่ื นไขเพยี ง หนง่ึ ทางเลือก คือ ถา้ เงื่อนไขเป็นจรงิ จะทางานในส่วนของคาสงั่ ท่กี าหนด แตถ่ ้าเงอื่ นไขเปน็ เท็จ จะขา้ มการ ทางานของคาสง่ั ดังกล่าวไป ดังรปู แบบขา้ งล่างนี้ รูปแบบคาส่งั if 1 ทางเลอื ก if (เง่อื นไข) { คาสง่ั 1 ; คาสั่ง 2 ; .......... คาสั่ง n ; } ผังงานแสดงการเลอื กกระทาของประโยค if แบบ 1 ทางเลอื ก จากภาพ แสดงใหเ้ ห็นวา่ ถ้า เงือ่ นไขหรือค่าของนิพจน์ท่ีตรวจสอบ เปน็ จริง ก็จะเลือกกระทา ชุดคาส่ังหนึ่งแลว้ ไปกระทาตามคาส่งั ต่อไป แต่ถ้าค่าของนิพจน์ เป็นเท็จ กไ็ ม่ทา ชุดคาสงั่ ใด ๆ ในทางเลือกเลย แต่ให้ไปทาชดุ ประโยคคาส่งั ต่อไป

ตวั อย่างท่ี 1 โปรแกรมการใชง้ าน if 1 ทางเลือก ต้องการตรวจสอบเง่อื นไขการผา่ นเกณฑ์ กาหนดให้คะแนนเตม็ 100 คะแนน ใหร้ ับค่าข้อมูลคะแนนของ นักเรียนผ่านทางแป้นพมิ พ์ ถ้านักเรียนทาคะแนนได้มากกว่าหรอื เทา่ กบั 50 คะแนน ให้แสดง ขอ้ ความ \"Pass\" แล้วแสดงขอ้ ความ \"Good Luck\" แต่ถ้าคะแนนสอบไมผ่ า่ น ใหแ้ สดงขอ้ ความ \"Good Luck\" อยา่ งเดียว จากโจทย์ เขยี นผงั งาน (Flowchart) ได้ดังน้ี ผังงาน (Flowchart) แสดงทิศทางการแก้ปัญหาโจทย์ตวั อย่างที่ 1

จากผังงานนามาเขียนโปรแกรมได้ดงั น้ี // ประกาศตัวแปร score เปน็ ชนิดจานวนเตม็ 1 #include <stdio.h> // แสดงขอ้ ความ Input Your score : 2 #include <conio.h> // รอรบั คะแนนจากแปน้ พิมพ์มาเกบ็ 3 main() 4{ ท่ีตัวแปร score 5 clrscr(); // ตรวจสอบว่า score >= 50 ใชห่ รอื ไม่? ถา้ ใช่ 6 int score; 7 printf(\"Input Your score : \"); เริ่มการทางานใน block // เรม่ิ block ของ if scanf(\"%d\",&score); // แสดงข้อความ Pass 8 if (score>=50) // แสดงขอ้ ความ Good luck // จบblock ของ if 9{ 10 printf(\"Pass \\n\",score); 11 } 12 printf(\"Good luck\"); 13 getch(); 14 } ผลทไี่ ด้จากการ Run ถา้ ป้อน score มีค่ามากกว่า 50 เชน่ ปอ้ น 75 จะไดผ้ ลลัพธ์ ถา้ ป้อน score มีค่านอ้ ยกว่า 50 เช่น ปอ้ น 40 จะได้ผลลัพธ์

ประโยคคาส่งั If - else เปน็ คาสั่งท่ตี า่ งจากคาส่ัง if แบบง่ายทีผ่ ่านมาตรงท่ีคาสง่ั if แบบง่ายน้นั มที างเลือกท่ีจะให้ทาอยเู่ พยี ง ทางเลอื กเดียว คือ ถา้ เป็นจรงิ ก็ทาทางเลือกนั้น แต่ถา้ เปน็ เท็จกไ็ มท่ า แต่คาสั่ง if - else นม้ี ีทางเลอื กท่ีใหท้ า อยู่สองทางเลอื กหรือสองกรณี คอื กรณที ี่ 1 ถา้ เง่ือนไขเปน็ จริง ให้ทากบั สายงานหน่ึง คือ ทาตามชุดคาสัง่ ท่ีตามหลงั เง่ือนไข (Condition) ทีใ่ ช้ตรวจสอบ กรณที ี่ 2 ถ้าเงือ่ นไขเปน็ เท็จ กใ็ ห้ทากบั อกี สายงานหนึ่ง คอื ทาตามชุดคาสงั่ ทตี่ ามหลังคาสงวน else รูปแบบคาสัง่ if - else 2 ทางเลือก if (เงอ่ื นไข) { คาสัง่ ชุด A ; } else { คาสง่ั ชุด B ; } ภาพผังงานแสดงการเลือกกระทาของประโยค if - else จากภาพ แสดงให้เหน็ ว่า เป็นการเลอื กทาชุดคาส่ัง A หรอื ชดุ คาสั่ง B ดังนี้ 1. ถ้าเงื่อนไขการตรวจสอบเป็น \"จริง\" จะไปทาสายงานในชุดประโยคคาสัง่ A แลว้ ไปทาชดุ ประโยคคาสั่ง C ต่อไป 2. ถา้ เง่ือนไขการตรวจสอบเปน็ \"เทจ็ \" จะไปทาสายงานในชุดประโยคคาสั่ง B แล้วไปทาชดุ ประโยคคาส่ัง C ต่อไป

ตวั อย่างที่ 2 โปรแกรมการใช้งาน if - else 2 ทางเลือก โจทย์ : รา้ นขายผลไม้แห่งหนึ่ง ขายมะมว่ ง โดยมีอัตราการขายดงั น้ี ถ้าซอ้ื มะม่วงมากกว่า หรือเท่ากับ 10 ลกู ขน้ึ ไป มีอัตราการแถมอยู่ท่ี 10 ตอ่ 2 ลกู ซง่ึ ถา้ ซื้อมะม่วง 10 ลูก จะไดแ้ ถม 2 ลกู , ถา้ ซ้ือ 20 ลูก จะได้แถม 4 ลูก เปน็ ตน้ แตถ่ า้ ซอื้ ไม่ถึง 10 ลกู จะไม่แถม จากโจทย์ จงเขยี นโปรแกรมเพื่อรบั ค่าจานวนมะมว่ งท่ีซ้ือ และคานวณหา จานวนมะมว่ งทล่ี ูกค้าจะได้ จากโจทย์ เขียนผงั งาน (Flowchart) ได้ดงั นี้ ผังงาน (Flowchart) แสดงทิศทางการแก้ปัญหาโจทย์ตัวอยา่ งที่ 2

จากผงั งานนามาเขียนโปรแกรมได้ดงั นี้ // ประกาศตวั แปร net, number 1 #include <stdio.h> เปน็ ชนิดจานวนเต็ม 2 #include <conio.h> 3 int main() // แสดงข้อความ Input Number of 4{ Mango : 5 clrscr(); 6 int net,number; // รอรบั คะแนนจากแป้นพมิ พ์มาเกบ็ ที่ตัวแปร number 7 printf(\"Input Number of Mango : \"); // ตรวจสอบว่า number >= 10 scanf(\"%d\",&number); ใชห่ รอื ไม่? ถา้ ใชเ่ ริ่มการทางาน ใน block 8 if (number>=10) // คานวณหาจานวนมะมว่ งที่ลกู ค้าจะได้ 9{ 10 net=number+(number*2)/10; // แสดงขอ้ ความ Output Number of 11 } Mango : จานวนมะม่วงท่ีลูกค้าจะได้ 12 else 13 { 14 net=number; 15 } 16 printf(\"Output Number of Mango : %d\",net); 17 getch(); 18 }

ผลที่ได้จากการ Run ถ้าป้อนจานวนมะม่วงมากกว่าหรอื เท่ากบั 10 ลูก เชน่ ถ้าปอ้ นเทา่ กับ 30 ลูก จะได้ผลลัพธ์ ถา้ ปอ้ นจานวนมะมว่ งน้อยกวา่ 10 ลกู เช่น ถ้าป้อนเท่ากบั 4 ลูก จะได้ผลลัพธ์ หมายเหตุ จากสตู ร net=number+(number*2)/10 ยกตวั อย่างเช่น ถา้ number มคี ่า เทา่ กบั 30 จะสามารถแทนสูตรไดด้ งั น้ี net=30+(30*2)/10 คือ net=30+6 จึงมคี ่าเป็น 36 ซงึ่ ก็คือ 10 ตอ่ 2 ลูก นั่นเอง

คาสั่ง nested if หรือคาสั่ง if else if ในการเขียนโปรแกรมคอมพวิ เตอร์บางกรณีอาจจะต้องมีการตรวจสอบเง่ือนไขมากกว่า 1 ช้นั ดงั นัน้ ในการตรวจสอบเงอื่ นไขในชน้ั ท่ี 2 หรอื ชัน้ ตอ่ ๆ ไป จงึ มีการนาประโยคคาส่งั if มาซอ้ นลงในประโยคคาสง่ั if เดิมอีกครัง้ หนึ่ง ซงึ่ การซอ้ นประโยคคาส่งั if น้ี สามารถซ้อนลงไปหลังเง่ือนไข (Condition) หรือ ซ้อนลงไป หลัง else กไ็ ด้ ขนึ้ อยู่กบั วัตถุประสงคแ์ ละลักษณะของการตดั สนิ ใจเพื่อเลอื กที่จะทางาน ดงั ภาพดา้ นล่างนี้ ข้อสังเกต ในการใชค้ าส่งั if ซ้อนกันนั้น ถา้ ต้องการทราบว่าจะต้องใช้คาสัง่ if ซอ้ นกันกตี่ ัวหรือกีช่ ั้น ใหพ้ ิจารณาว่า ทางเลือกทีเ่ กิดข้นึ ทง้ั หมดมกี ี่ทางเลอื ก แลว้ ให้เอาจานวนทางเลือก - 1 ก็จะเป็นจานวนช้ันของ การซ้อนคาส่งั if ดงั ตาราง ตารางแสดงจานวนชน้ั ของการใช้คาสงั่ if เมอ่ื มีทางเลือกมากกวา่ 1 ทางเลอื ก จานวนทางเลอื กท้ังหมด จานวนทางเลอื กท้ังหมด - 1 จานวนคาสัง่ if ท่ใี ช้ (n) (n-1) 2 2-1 1 3 3-1 2 4 4-1 3 5 5-1 4

ตวั อยา่ งท่ี 3 โปรแกรมการใช้งาน nested - if หรอื if - else - if โจทย์ : จงเขยี นโปรแกรมตัดเกรด กาหนดให้รบั ค่าคะแนนผา่ นทางแปน้ พิมพ์ และแสดงผล เกรดผ่านทางจอภาพ กาหนดเงอื่ นไขการตดั เกรด ดังนี้ คะแนนระหว่าง 80 ถึง 100 ไดเ้ กรด 4 คะแนนระหว่าง 60 ถึง 79 ได้เกรด 3 คะแนนระหวา่ ง 50 ถงึ 59 ได้เกรด 2 คะแนนระหว่าง 40 ถึง 49 ได้เกรด 1 คะแนนระหว่าง 0 ถงึ 39 ไดเ้ กรด 0 จากโจทยส์ ามารถเขียนผังงาน (Flow chart) ไดด้ งั นี้

จากผงั งานนามาเขียนโปรแกรมได้ดังน้ี // ประกาศตัวแปร scoreเป็นชนดิ จานวนเต็ม 1 #include <stdio.h> // ประกาศตัวแปร grade เป็นชนดิ ตวั อักษร 2 #include <conio.h> // แสดงข้อความ Input Your Score : 3 int main() // รอรับคะแนนจากแปน้ พมิ พม์ าเก็บท่ีตวั แปร 4{ score 5 clrscr(); // ตรวจสอบว่า score >= 80 6 int score; ใชห่ รือไม่? ถา้ ใชแ่ สดงผลเกรด 4 7 char grade; 8 printf(\"Input Your Score : \"); // ตรวจสอบวา่ score >= 60 ใช่หรือไม่? ถ้าใช่แสดงผลเกรด 3 scanf(\"%d\",&score); // ตรวจสอบวา่ score >= 50 9 if (score>=80) { ใชห่ รอื ไม่? ถา้ ใชแ่ สดงผลเกรด 2 grade='4'; // ตรวจสอบว่า score >= 40 10 } ใช่หรือไม่? ถ้าใช่แสดงผลเกรด 1 11 else if (score>=60) { // ถ้าไมใ่ ช่แสดงผลเกรด 0 grade='3'; 12 } // แสดงขอ้ ความ Output Your Grade 13 else if (score>=50) { grade='2'; 14 } 15 else if (score>=40) { 16 grade='1'; } 17 else { 18 grade='0'; 19 } 20 printf(\"Output Your Grade : %c\", grade); 21 getch(); 22 }

ผลที่ไดจ้ ากการ Run ถ้าปอ้ นคะแนนอยู่ระหว่าง 80 - 100 จะได้เกรด 4 เช่น ถา้ ปอ้ น 89 ถ้าปอ้ นคะแนนอยู่ระหวา่ ง 0 - 39 จะได้เกรด 0 เช่น ถ้าป้อน 35

คาสัง่ switch และ case การเลอื กทาสายงานใดสายงานหนึ่งน้นั นอกจากการใช้คาส่งั if เพ่ือกาหนดเงอื่ นไขเพอ่ื ให้โปรแกรมเลือกที่จะ ทางานสายงานใดแล้ว ในภาษาซี ยงั มคี าสง่ั switch อีกคาสงั่ หน่ึง เพ่ืออานวยความสะดวกแกผ่ ูเ้ ขยี นโปรแกรม ใน การที่นามาใช้แทนคาสั่ง if ทซี่ อ้ นกนั หลาย ๆ ชัน้ โดยที่คาสงั่ switch จะนาคา่ ของตัวแปรทอ่ี ยูห่ ลังคาส่งั switch มาเปรียบเทยี บกบั ค่าทีอ่ ยูห่ ลัง case แต่ละคาส่ัง ถา้ ตรงกนั ก็จะทาสายงานท่ีอยู่ใน case นั้น ๆ แต่ถา้ ไม่ตรงกบั case ใด ๆ เลย จะทาหลงั คาสั่ง default โดยมีรูปแบบประโยคคาสั่งดังนี้ ประโยค switch หนงึ่ ประโยคจะมีกี่ case กไ็ ด้ หรอื ไม่มีเลยก็ได้ และอาจมี default เป็นตวั เลือก เสริม คอมไพล์เลอร์จะทาการตรวจสอบ 1. (ตัวแปร) จะต้องเปน็ ตวั แปรชนิด int หรือประเภทข้อมลู อ่นื ๆ ที่มลี ักษณะเป็นจานวนเตม็ เชน่ char , short , long จะเปน็ string , float , double หรอื long double ไม่ได้ 2. ค่าคงท่ี ในแต่ละ case จะตอ้ งเป็นข้อมลู ชนดิ char , short , int , long เท่านนั้ 3. คา่ คงท่ใี นแตล่ ะ case จะไปซ้ากบั คา่ คงท่ีใน case อื่น ไมไ่ ด้ 4. หา้ มมี default มากกว่าหนง่ึ

ประโยคคาส่ัง break เปน็ คาส่ังท่ีใชใ้ นการหลดุ ออกจากเงื่อนไข โดยไมต่ ้องทางานจนจบบลอ๊ กของคาสั่งการนาคาส่งั break มาซ้อนไว้ ใน case ตา่ ง ๆ ของคาสั่ง switch จะชว่ ยให้โปรแกรมไม่ลว่ งล้าเขา้ ไปทาใน case ท่อี ยู่ถดั ไป แต่ถ้าไมม่ ปี ระโยค คาสง่ั break เม่ือทา case ใด ๆ เสรจ็ เรียบร้อยแลว้ คอมไพลเ์ ลอร์ก็จะให้ไปทาใน case ท่ีอยถู่ ัดไปเรือ่ ยจนกวา่ จะจบบล๊อกของประโยคคาสัง่ switch จากน้ันจะทางานต่อไป ในประโยคคาสั่งท่ีอยูถ่ ัดไป นอกจากน้ีคาสั่ง break ยงั ใช้เพ่ือให้หลดุ ออกจากวงรอบของการทาซ้า for , do , while และไปทางานในคาส่ัง ต่อไปท่ีถดั ไปจากวงรอบการทาซ้า ดงั กล่าวไดด้ ้วย เชน่ 1 #include <stdio.h> // กาหนดค่า 1 ใหก้ ับตัวแปร i ใหเ้ ป็น 2 #include <conio.h> ชนดิ int 3 int main() 4{ // ใหท้ าซ้าโดยไม่มจี ุดสิ้นสุด 5 clrscr(); // เริ่มต้นบลอ๊ กของ for 6 int i=1; // ถา้ i มากกว่า 5 ให้หลุดออกจาก 7 8 for (;;) คาส่ัง for { // แสดงข้อความ This is line แล้ว if (i>5) break; ตามดว้ ยค่าของ i 9 printf(\"This is line %3d\\n\",i); // เพมิ่ ค่า i ข้ึนอกี 1 // จบบล๊อกของ for 10 i++; // รอดูผลลพั ธจ์ นกว่ากดแป้นใด ๆ 11 } 12 getch(); 13 } ผลท่ไี ด้จากการ Runดงั น้ี

ประโยคคาส่งั continue เปน็ คาส่งั ทใ่ี ช้ควบค่กู ับคาส่งั วนรอบทาซา้ โดยเม่ือโปรแกรมทางานตามคาสั่งนี้ จะกระโดดไป เรม่ิ ตน้ ใหมท่ ันที คาสัง่ นม้ี ักใช้คู่กบั คาส่งั for , while หรอื do ตัวอย่างเช่น Source code คาอธบิ ายโปรแกรม 1 #include <stdio.h> 2 #include <conio.h> 3 int main() 4{ 5 int i; // ประกาศตัวแปร i ใหเ้ ปน็ ชนดิ int 6 for (i=1;i<=100;i++) // ให้ทาซ้าเม่ือคา่ i = 1 จนถึง i=100 7{ // เร่ิมต้นบลอ๊ กของ for 8 if (i%2) continue; // ถา้ i หารด้วย 2 แลว้ เหลอื เศษ 1(1 คือ true) ใหก้ ลบั ไปทาที่คาส่งั forใหม่ 9 printf(\"%5d\",i); // แสดงคา่ ของ i ดว้ ยขนาด 5 ตัวอักษร 10 } // จบบลอ๊ กของ for 11 getch(); // รอดผู ลลัพธจ์ นกว่ากดแป้นใด ๆ 12 13 } ผลท่ีไดจ้ ากการ Run ตวั อยา่ งท่ี 4 การใชง้ านคาสง่ั switch..case โจทย์ : จงเขยี นโปรแกรมรบั ระดบั ผลการเรยี นหรือเกรดมาจากแปน้ พมิ พ์ แลว้ นามาพจิ ารณา ตรวจสอบวา่ เกรดท่ีรับเข้ามานัน้ ตรงกับตวั อักษรใดแล้วแสดงผลดงั นี้ ถ้าเปน็ A แสดงขอ้ ความ \"Excellent\" ถา้ เปน็ B แสดงขอ้ ความ \"Good\" ถา้ เปน็ C แสดงขอ้ ความ \"So so\" ถา้ เปน็ D แสดงข้อความ \"Fails\" ถา้ เป็น E แสดงข้อความ \"Get lost\" ถา้ เปน็ ตัวอกั ษรอน่ื ๆ แสดงข้อความ \"Invalid data\"

จากโจทยส์ ามารถเขียน ผงั งาน (Flow chart) ไดด้ ังนี้ จากผงั งาน นามาเขยี นโปรแกรมได้ดงั นี้ // ประกาศตวั แปร grade เป็นชนดิ char // แสดงขอ้ ความ Enter grade. (A..E) 1 #include <stdio.h> // รอรบั เกรดจากแป้นพิมพ์ไปเกบ็ ที่ 2 #include <conio.h> 3 int main() ตวั แปร grade 4{ // ขน้ึ บรรทดั ใหม่ 3 บรรทดั 5 // ใช้คาสั่ง switch กับตัวแปร grade 6 char grade; 7 printf(\"Enter grade. (A..E) \"); เพ่ือเลือกสายงาน scanf(\"%c\",&grade); // เร่ิมต้นบล๊อกของ switch 8 // ถ้าเป็น 'A' แสดงข้อความ Excellent 9 printf(\"\\n\\n\\n\"); // หยดุ การทางานในคาสั่ง switch ท้ังหมด 10 switch (grade) // ถ้าเปน็ 'A' แสดงข้อความ Good // หยดุ การทางานในคาสง่ั switch ทั้งหมด 11 { 12 case 'A':printf(\"Excellent\"); 13 break; 14 case 'B':printf(\"Good\"); 15 break;

16 case 'C':printf(\"So so\"); // ถา้ เปน็ 'A' แสดงข้อความ So so 17 break; // หยุดการทางานในคาสงั่ switch ทั้งหมด 18 case 'D':printf(\"Fails\"); // ถา้ เปน็ 'A' แสดงข้อความ Fails 19 break; // หยุดการทางานในคาส่งั switch ทั้งหมด 20 case 'E':printf(\"Get lost\"); // ถ้าเปน็ 'A' แสดงข้อความ Get lost 21 break; // หยุดการทางานในคาสั่ง switch ท้ังหมด 22 default :printf(\"Invalid data\"); // กรณีอน่ื ๆ ที่ไม่อยใู่ นทุก ๆ case ใหแ้ สดงข้อความ Invalid data 23 } // จบบลอ๊ กของ switch 24 getch(); // รอดผู ลลพั ธ์จนกว่ากดแปน้ ใด ๆ 25 } ผลที่ไดจ้ ากการ Run มี 6 กรณี คอื กรณีเลือกกดแป้นพมิ พ์ B กรณีเลอื กกดแป้นพมิ พ์ A กรณเี ลอื กกดแป้นพิมพ์ C กรณเี ลอื กกดแป้นพมิ พ์ D กรณเี ลอื กกดแป้นพิมพ์ E กรณเี ลอื กกดแป้นพิมพ์อนื่ ๆ


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook