4.2 คำสั่งทดสอบเงื่อนไขเพื่อการตัดสินใจ (decision statements) คำสั่งทดสอบเงื่อนไขเพื่อการตัดสินใจ เป็นคำสั่งที่มีการทดสอบเงื่อนไขก่อนที่จะทำงานตามคำสั่งที่กำหนดไว้ ซึ่งได้แก่คำสั่ง if, if else, โครงสร้าง else if (หรือ nested if) และคำสั่ง switch 4.2.1 คำสั่ง if if เป็นคำสั่งที่สั่งให้มีการทดสอบเงื่อนไขก่อนที่จะไปทำงานตามคำสั่งที่กำหนดไว้ รูปแบบการใช้คำสั่ง if if (expression) statement; หรือ if (expression) { statement(s); }
โดยที่ expression คือ นิพจน์เงื่อนไข ซึ่งจะมีค่าจริงหรือเท็จอย่างใดอย่างหนึ่งเท่านั้น ถ้าเงื่อนไขเป็นจริง จะทำงานตามคำสั่งที่อยู่ใน if จากนั้นก็ออกจากคำสั่ง if ไปทำคำสั่งถัดไป ถ้าเงื่อนไขเป็นเท็จจะออกจากคำสั่ง if ทันที
ลักษณะการทำงานของคำสั่ง if สามารถเขียนเป็นแผนผังได้ดังนี้
รูปที่ 4.4 ผังงานแสดงลักษณะการทำงานของคำสั่ง if ที่มา : สมชาย รัตนเลิศนุสรณ์, 2545 : 90. โปรแกรมตัวอย่างที่ 4.12 แสดงการใช้คำสั่ง if เพื่อตรวจสอบค่าที่รับจากคีย์บอร์ด
| | | | | |
/* if1.C. */ #include <stdio.h> /* บรรทัดที่ 1 */ #include <conio.h> /* บรรทัดที่ 2 */ #include <ctype.h> /* บรรทัดที่ 3 */ /*Capitalize Keys read from The Keyboard */ /* บรรทัดที่ 4 */ main() /* บรรทัดที่ 5 */ { /* บรรทัดที่ 6 */ char any_char; /* บรรทัดที่ 7 */ clrscr(); /* บรรทัดที่ 8 */ printf("Please type a lowercase letter : "); /* บรรทัดที่ 9 */ scanf("%c", &any_char); /* บรรทัดที่ 10 */ if(any_char >= 'a') /* บรรทัดที่ 11 */ printf("In uppercase: %c \n", toupper(any_char)); /* บรรทัดที่ 12 */ getch(); /* บรรทัดที่ 13 */ return(0); /* บรรทัดที่ 14 */ } /* บรรทัดที่ 15 */ | | | | |
ผลลัพธ์ที่ได้จากโปรแกรม คำอธิบายโปรแกรม จากโปรแกรมตัวอย่างที่ 4.12 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 3 #include <ctype.h> ให้การสนับสนุนฟังก์ชัน toupper( ) ในบรรทัดที่ 12 บรรทัดที่ 4 เป็นคำอธิบายโปรแกรมเพื่อบอกให้ทราบว่าเป็นโปรแกรมที่แปลงตัวอักขระที่รับเข้ามาให้เป็นตัวพิมพ์ใหญ่ บรรทัดที่ 9 และ 10 พิมพ์ข้อความแนะนำให้ผู้ใช้ พิมพ์ตัวพิมพ์เล็ก แล้วรับเข้ามาเก็บไว้ในตัวแปร any_char ตามลำดับ บรรทัดที่ 11 คำสั่ง if (any_char >= ‘a’) ตรวจสอบอักขระที่เก็บในตัวแปร any_char ที่รับเข้ามาจากคีย์บอร์ด ว่ามีค่ามากกว่าหรือเท่ากับ ‘a‘ นั่นคือตรวจสอบว่าเป็นตัวพิมพ์เล็กหรือไม่ ถ้าใช่ให้ไปทำงานคำสั่งบรรทัดที่ 12 บรรทัดที่ 12 คำสั่งที่ให้ทำภายหลังจากตรวจสอบเงื่อนไข if แล้วได้ค่าเป็นจริง คือ เรียกใช้ฟังก์ชัน toupper( ) เพื่อแปลงตัวพิมพ์เล็กที่เก็บไว้ในตัวแปร any_char เป็นตัวพิมพ์ใหญ่ คือ toupper (any_char); แสดงออกที่จอภาพ แล้วหยุดรอรับค่าใด ๆ จากคีย์บอร์ด เช่น ถ้ากด enter ก็จะกลับสู่โปรแกรม โปรแกรมตัวอย่างที่ 4.13 แสดงการใช้คำสั่ง if เพื่อช่วยในการนับตัวอักขระและนับคำในประโยคที่ผู้ใช้พิมพ์
| | | | | |
/* if2.c */ #include<stdio.h> /* บรรทัดที่ 1 */ #include<conio.h> /* บรรทัดที่ 2 */ void main(void) /* บรรทัดที่ 3 */ { /* บรรทัดที่ 4 */ int charcnt = 0, wordcnt = 0; /* บรรทัดที่ 5 */ char ch; /* บรรทัดที่ 6 */ clrscr(); /* บรรทัดที่ 7 */ printf("Type your sentense or a phrase : "); /* บรรทัดที่ 8 */ while( (ch=getche( ) ) != '\r' ) /* บรรทัดที่ 9 */ { /* บรรทัดที่ 10 */ charcnt++; /* บรรทัดที่ 11 */ if( ch==' ' ) wordcnt++; /* บรรทัดที่ 12 */ } /* end while */ /* บรรทัดที่ 13 */ printf("\n\nCharacter count is %d", charcnt); /* บรรทัดที่ 14 */ printf("\nWord count is %d", wordcnt+1); /* บรรทัดที่ 15 */ printf("\n\nPress any key back to program..."); /* บรรทัดที่ 16 */ getch(); /* บรรทัดที่ 17 */ } /* บรรทัดที่ 18 */ | | | | | ผลลัพธ์ที่ได้จากโปรแกรม
คำอธิบายโปรแกรม จากโปรแกรมตัวอย่างที่ 4.13 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 5 ประกาศตัวแปรชนิดจำนวนเต็ม โดยที่ charcnt ใช้เก็บจำนวนตัวอักขระที่นับได้ และ wordcnt ใช้เก็บจำนวนคำที่นับได้ในประโยค บรรทัดที่ 9 คำสั่ง while ((ch = getche()) ! = ‘ \r ‘) เพื่อควบคุมการทำงานของโปรแกรมให้วนทำงานซ้ำ ๆ จนกว่าเงื่อนไขเป็นเท็จจึงหยุด นั่นคือ ถ้าผู้ใช้กด enter แทนการเติมประโยค จะทำให้เป็นเท็จ แล้วจะออกจาก loop while ไปทำคำสั่งบรรทัดที่ 14 ถึง 17 แต่ถ้าเป็นจริง คือ ผู้ใช้เติมประโยค ก็จะทำงานใน loop while บรรทัดที่ 11 และ 12 บรรทัดที่ 11 คำสั่ง charcnt ++; ให้บวกสะสมตามจำนวนตัวอักขระที่ผู้ใช้พิมพ์รวมทั้งช่องว่างก็นับด้วย บรรทัดที่ 12 คำสั่ง if (ch == ‘ ‘) wordcnt ++ เพื่อตรวจสอบว่าตัวแปร ch เท่ากับช่องว่างหรือไม่ นั่นคือ ผู้ใช้เคาะแป้นพิมพ์ที่ space bar เพื่อเว้นช่องว่างกี่ครั้ง จะบวกสะสมไว้ที่ตัวแปร wordcnt บรรทัดที่ 14 พิมพ์แสดงจำนวนตัวอักขระที่นับสะสมไว้ในตัวแปร charcnt ออกจอภาพ บรรทัดที่ 15 พิมพ์แสดงจำนวนคำที่นับสะสมไว้ในตัวแปร wordcnt ออกจอภาพ แต่ตัวแปร wordcnt ต้องเพิ่มอีก 1 เพราะถึงจะเป็นจำนวนคำที่ถูกต้อง บรรทัดที่ 16 และ 19 พิมพ์ข้อความให้กดคีย์ใด ๆ เพื่อกลับสู่โปรแกรม และ หยุดรอรับค่าใด ๆ จากคีย์บอร์ด เช่น ถ้ากด enter ก็จะกลับสู่โปรแกรม ตามลำดับ 4.2.2 คำสั่ง if else if else เป็นคำสั่งที่สั่งให้มีการทดสอบเงื่อนไข โดยมีการตัดสินใจแบบ 2 ทางเลือก รูปแบบการใช้คำสั่ง if else if (expression) { statementA(s); } else { statementB(s); } จากรูปแบบการใช้คำสั่ง if else หมายความว่า ถ้านิพจน์เงื่อนไข (expression) มีค่าเป็นจริงจะทำตามคำสั่งชุด A (statementA(s);) ถ้ามีค่าเป็นเท็จจะทำตามคำสั่งชุด B (statementB(s);) เมื่อทำเสร็จก็ออกจากคำสั่งนี้
ลักษณะการทำงานของคำสั่ง if else สามารถเขียนเป็นแผนผังได้ดังนี้ รูปที่ 4.5 ผังงานแสดงลักษณะการทำงานของคำสั่ง if else ที่มา : สมชาย รัตนเลิศนุสรณ์, 2545 : 92. โปรแกรมตัวอย่างที่ 4.14 แสดงการใช้คำสั่ง if else เพื่อตรวจสอบค่าที่รับจากคีย์บอร์ด
| | | | | |
/* if_else1.c */ #include <stdio.h> /* บรรทัดที่ 1 */ #include <conio.h> /* บรรทัดที่ 2 */ #include <ctype.h> /* บรรทัดที่ 3 */ /*Capitalize Keys read from The Keyboard */ /* บรรทัดที่ 4 */ main() /* บรรทัดที่ 5 */ { /* บรรทัดที่ 6 */ char any_char; /* บรรทัดที่ 7 */ clrscr(); /* บรรทัดที่ 8 */ printf("Please type a lowercase letter : "); /* บรรทัดที่ 9 */ scanf("%c",&any_char); /* บรรทัดที่ 10 */ if(any_char < 'a') /* บรรทัดที่ 11 */ printf("Sorry, I can not capitalize that.\n"); /* บรรทัดที่ 12 */ else /* บรรทัดที่ 13 */ printf("Thank you. In uppercase : %c.",toupper (any_char)); /* บรรทัดที่ 14 */ printf("\n\nPress any key back to program..."); /* บรรทัดที่ 15 */ getch(); /* บรรทัดที่ 16 */ return(0); /* บรรทัดที่ 17 */ } /* บรรทัดที่ 18 */ | | | | |
ผลลัพธ์ที่ได้จากโปรแกรม กรณีที่เติมตัวอักษรพิมพ์เล็ก
กรณีที่เติมตัวอักษรพิมพ์ใหญ่
คำอธิบายโปรแกรม จากโปรแกรมตัวอย่างที่ 4.14 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 11 และ 12 คำสั่ง if (any_char < ‘a’) ตรวจสอบอักขระที่รับเข้ามาว่ามีค่าน้อยกว่า ‘a’ หรือไม่ ถ้าใช่ให้พิมพ์ข้อความ Sorry, I can not capitalize that. นั่นคือตรวจสอบตัวอักขระที่รับเข้ามาว่าใช่ตัวอักขระพิมพ์ใหญ่หรือไม่ แต่ถ้าไม่ใช่ ให้ไปทำคำสั่งบรรทัดที่ 13 บรรทัดที่ 13 else คือ เงื่อนไขบรรทัดที่ 11 เป็นเท็จ (กรณีที่ตัวอักขระเป็นตัวพิมพ์เล็ก) ให้ทำคำสั่งบรรทัดที่ 14 คือ เปลี่ยนตัวพิมพ์เล็กให้เป็นตัวพิมพ์ใหญ่ ด้วยฟังก์ชัน toupper( ) และ แสดงออกจอภาพ บรรทัดที่ 15 และ 16 พิมพ์ข้อความให้กดคีย์ใด ๆ เพื่อกลับสู่โปรแกรม และหยุดรอรับค่าใด ๆ จากคีย์บอร์ด เช่น ถ้ากด enter ก็จะกลับสู่โปรแกรม ตามลำดับ โปรแกรมตัวอย่างที่ 4.15 แสดงการใช้คำสั่ง if else เพื่อเปรียบเทียบค่าตัวเลขที่ผู้ใช้เติม
| | | | | |
/* if_else2.c */ #include<stdio.h> /* บรรทัดที่ 1 */ #include<conio.h> /* บรรทัดที่ 2 */ void main(void) /* บรรทัดที่ 3 */ { /* บรรทัดที่ 4 */ int x, y; char ch; /* บรรทัดที่ 5 */ clrscr( ); /* บรรทัดที่ 6 */ printf("Enter an integer of X : "); /* บรรทัดที่ 7 */ scanf("%d",&x); /* บรรทัดที่ 8 */ printf("Enter an integer of Y : "); /* บรรทัดที่ 9 */ scanf("%d",&y); ch=getchar( ); /* บรรทัดที่ 10 */ if ( x==y ) /* บรรทัดที่ 11 */ printf("\nX equal to Y = %d\n",x); /* บรรทัดที่ 12 */ else /* บรรทัดที่ 13 */ printf("\nX = %d not equal to Y= %d\n",x,y); /* บรรทัดที่ 14 */ printf("\n\nPress any key back to program..."); /* บรรทัดที่ 15 */ getch(); /* บรรทัดที่ 16 */ } /* บรรทัดที่ 17 */ | | | | | ผลลัพธ์ที่ได้จากโปรแกรม กรณีที่เติมตัวเลข 2 ตัวเท่ากัน
กรณีที่เติมตัวเลข 2 ตัวไม่เท่ากัน
คำอธิบายโปรแกรม จากโปรแกรมตัวอย่างที่ 4.15 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 7 และ 8 ให้ผู้ใช้เติมตัวเลขจำนวนเต็ม แล้วเก็บไว้ที่ตัวแปร x ตามลำดับ บรรทัดที่ 9 และ 10 ให้ผู้ใช้เติมตัวเลขจำนวนเต็ม แล้วเก็บไว้ที่ตัวแปร y ตามลำดับ บรรทัดที่ 11 if (x == y) ทดสอบเงื่อนไขโดยการนำค่าตัวแปร x และ y เปรียบเทียบกันว่าเท่ากันจริงหรือเท็จ ถ้าจริง จะทำคำสั่งบรรทัดที่ 12 คือให้พิมพ์บอกว่า x เท่ากับ y และพิมพ์ค่า x แสดงที่จอภาพ บรรทัดที่ 13 else ถ้าเงื่อนไขบรรทัดที่ 11 เป็นเท็จ จะมาทำคำสั่งบรรทัดที่ 13 และ 14 คือ พิมพ์บอกว่า x ไม่เท่ากับ y พร้อมทั้งพิมพ์ค่า ตัวแปร x และ y แสดงที่จอภาพ บรรทัดที่ 15 และ 16 พิมพ์ข้อความให้กดคีย์ใด ๆ เพื่อกลับสู่โปรแกรม และหยุดรอรับค่าใด ๆ จากคีย์บอร์ด เช่น ถ้ากด enter ก็จะกลับสู่โปรแกรม ตามลำดับ 4.2.3 คำสั่งโครงสร้าง else if (คำสั่ง nested if) else if เป็นโครงสร้างที่ทำให้เราสามารถใช้คำสั่ง if else ซ้อนกันได้เรื่อย ๆ ส่วนมากจะใช้ในการตัดสินใจที่มากกว่า 2 ทางเลือกขึ้นไป บางครั้งอาจเรียกโครงสร้างนี้ว่า nested if รูปแบบการใช้โครงสร้าง nested if หรือ else if else if (expression) { statementA(s); } else if (expression){ statementB(s); } else if (expression){ …….. ข้อควรระวังในการใช้ nested if การเขียนคำสั่ง nested if ค่อนข้างยุ่งยาก อาจเกิดความสับสนได้ ควรเขียนคำสั่ง nested if ให้เยื้องกันเพื่อความสะดวกในการแก้ไขคำสั่งในภายหลัง โปรแกรมตัวอย่างที่ 4.16 แสดงการใช้คำสั่ง nested if เพื่อตรวจสอบคะแนนที่ผู้ใช้เติม แล้วให้เกรดตามเงื่อนไขที่กำหนดในโปรแกรม
| | | | | |
/* nestif1.c */ #include<stdio.h> /* บรรทัดที่ 1 */ #include<conio.h> /* บรรทัดที่ 2 */ #include<stdlib.h> /* บรรทัดที่ 3 */ void main(void) /* บรรทัดที่ 4 */ { /* บรรทัดที่ 5 */ int score, n, i; /* บรรทัดที่ 6 */ char grade; /* บรรทัดที่ 7 */ char numstr[20]; /* บรรทัดที่ 8 */ clrscr( ); /* บรรทัดที่ 9 */ printf("Enter Number of Students : "); /* บรรทัดที่ 10 */ n = atoi(gets(numstr)); /* บรรทัดที่ 11 */ for ( i=1; i<=n; i++ ){ /* บรรทัดที่ 12 */ printf("\nEnter score of student #%d : ", i); /* บรรทัดที่ 13 */ score = atoi(gets(numstr)); /* บรรทัดที่ 14 */ if ( score >= 80 ) /* บรรทัดที่ 15 */ grade = 'A'; /* บรรทัดที่ 16 */ else if ( score >= 70 ) /* บรรทัดที่ 17 */ grade = 'B'; /* บรรทัดที่ 18 */ else if ( score >= 60 ) /* บรรทัดที่ 19 */ grade = 'C'; /* บรรทัดที่ 20 */ else if ( score >= 50 ) /* บรรทัดที่ 21 */ grade = 'D'; /* บรรทัดที่ 22 */ else grade = 'F'; /* บรรทัดที่ 23 */ printf("Score = %d, Grade of std #%d is %c\n",score,i,grade); /* บรรทัดที่ 24 */ } /* end for */ /* บรรทัดที่ 25 */ printf("\n\nPress any key back to program..."); /* บรรทัดที่ 26 */ getch(); /* บรรทัดที่ 27 */ } /* บรรทัดที่ 28 */ | | | | |
ผลลัพธ์ที่ได้จากโปรแกรม
คำอธิบายโปรแกรม จากโปรแกรมตัวอย่างที่ 4.16 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 3 #include <stdlib.h> สนับสนุนการใช้ฟังก์ชัน atoi( ) ของคำสั่งบรรทัดที่ 11 บรรทัดที่ 10 และ 11 รับค่าตัวเลขที่เป็นจำนวนนักเรียน แล้วทำคำสั่ง n = atoi(gets(numstr)); คือนำค่าที่รับเข้ามาแปลงให้เป็นจำนวนเต็มแล้วเก็บไว้ที่ตัวแปร n บรรทัดที่ 12 คำสั่ง for (i=1; i<=n; i++) เพื่อควบคุมการทำงานของโปรแกรมให้วนรอบทำงานตามจำนวนของตัวเลขที่เติมคือ n ครั้ง ซึ่งถ้าตรวจสอบเงื่อนไข for แล้วเป็นจริงจะทำคำสั่งภายใน loop for คือคำสั่งบรรทัดที่ 13 ถึง 24 แต่ถ้าตรวจสอบเงื่อนไข for แล้วเป็นเท็จ จะไปทำคำสั่งบรรทัดที่ 26 และ 27 บรรทัดที่ 13 และ 14 รับค่าคะแนนที่ผู้ใช้เติม แล้วแปลงให้เป็นจำนวนเต็มเก็บไว้ที่ตัวแปร score ตามลำดับ บรรทัดที่ 15 คำสั่ง if ( score >= 80 ) ตรวจสอบเงื่อนไขของตัวแปร score ว่ามากกว่าหรือเท่ากับ 80 หรือไม่ ถ้าใช่ให้กำหนดตัวแปร grade เก็บ A แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่ 17 บรรทัดที่ 17 คำสั่ง else if ( score >= 70 ) ตรวจสอบเงื่อนไขต่ออีกว่าตัวแปร score ว่ามากกว่าหรือเท่ากับ 70 หรือไม่ ถ้าใช่ให้กำหนดตัวแปร grade เก็บ B แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่ 19 บรรทัดที่ 19 คำสั่ง else if ( score >= 60 ) ตรวจสอบเงื่อนไขต่ออีกว่าตัวแปร score ว่ามากกว่าหรือเท่ากับ 60 หรือไม่ ถ้าใช่ให้กำหนดตัวแปร grade เก็บ C แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่ 21 บรรทัดที่ 21 คำสั่ง else if ( score >= 50 ) ตรวจสอบเงื่อนไขต่ออีกว่าตัวแปร score ว่ามากกว่าหรือเท่ากับ 50 หรือไม่ ถ้าใช่ให้กำหนดตัวแปร grade เก็บ D แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่ 23 บรรทัดที่ 23 คำสั่ง else grade = ‘F’; กำหนดตัวแปร grade เก็บ F บรรทัดที่ 24 ภายหลังจากทำงานทุกเงื่อนไขแล้วจะมาทำคำสั่งบรรทัดที่ 24 คือ แสดงค่าตัวแปร score ตัวแปร i และตัวแปร grade ที่ได้แสดงออกจอภาพ บรรทัดที่ 26 และ 27 พิมพ์ข้อความให้กดคีย์ใด ๆ เพื่อกลับสู่โปรแกรม สุดท้ายจะหยุดรอรับค่าใด ๆ จากคีย์บอร์ด เช่น ถ้ากด enter ก็จะกลับสู่โปรแกรม ตามลำดับ โปรแกรมตัวอย่างที่ 4.17 แสดงการใช้คำสั่ง nested if เพื่อเขียนเส้นทะแยงมุมในกรอบสี่เหลี่ยมพื้นสีเทา
| | | | | |
/* nestif2.c */ /* Prints two diagonal lines on screen */ #include <stdio.h> /* บรรทัดที่ 1 */ #include <conio.h> /* บรรทัดที่ 2 */ #include <dos.h> /* บรรทัดที่ 3 */ void main(void) /* บรรทัดที่ 4 */ { /* บรรทัดที่ 5 */ int x, y; /* บรรทัดที่ 6 */ clrscr(); /* บรรทัดที่ 7 */ printf("\n"); /* บรรทัดที่ 8 */ for (y=1; y<24; y++) /* บรรทัดที่ 9 */ { /* บรรทัดที่ 10 */ for (x=1; x<24; x++) /* บรรทัดที่ 11 */ if ( x == y ) /* บรรทัดที่ 12 */ printf("\xDB"); /* บรรทัดที่ 13 */ else /* บรรทัดที่ 14 */ if ( x == 24 - y ) /* บรรทัดที่ 15 */ printf("\xDB"); /* บรรทัดที่ 16 */ else /* บรรทัดที่ 17 */ printf("\xB0"); /* บรรทัดที่ 18 */ printf("\n"); /* บรรทัดที่ 19 */ delay(200); /* บรรทัดที่ 20 */ } /* บรรทัดที่ 21 */ printf("\n\nPress any key back to program..."); /* บรรทัดที่ 22 */ getche(); /* บรรทัดที่ 23 */ } /* บรรทัดที่ 24 */ | | | | |
ผลลัพธ์ที่ได้จากโปรแกรม
คำอธิบายโปรแกรม จากโปรแกรมตัวอย่างที่ 4.17 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 3 #include <dos.h> สนับสนุนฟังก์ชัน delay( ) ในคำสั่งบรรทัดที่ 20 บรรทัดที่ 9 คำสั่ง for (y=1; y<24; y++) เพื่อควบคุมการทำงานของโปรแกรมให้ทำงานแถวที่ 1 ถึง แถวที่ 23 ซึ่งถ้าตรวจสอบเงื่อนไข for เป็นจริงจะทำคำสั่งบรรทัดที่ 11 ถึง 20 แต่ถ้าเงื่อนไขเป็นเท็จ จะทำคำสั่งบรรทัดที่ 22 และ 23 บรรทัดที่ 11 คำสั่ง for (x=1; x<24; x++) เพื่อควบคุมการทำงานของโปรแกรมให้ทำงานคอลัมน์ที่ 1 ถึง คอลัมน์ที่ 23 บรรทัดที่ 12 คำสั่ง if (x==y) ตรวจสอบเงื่อนไข ถ้าค่าตัวแปร x เท่ากับ ค่าตัวแปร y ถ้าเป็นจริงให้ทำคำสั่งบรรทัดที่ 13 printf (“\xDB”); คือให้พิมพ์อักขระกราฟฟิกรูป ออกแสดงที่จอภาพ (x==y จะได้เส้นทะแยงมุม) แต่ถ้า x ไม่เท่ากับ y คือเป็นเท็จ ให้ตรวจสอบเงื่อนไขถัดไป คือคำสั่งบรรทัดที่ 14 และ 15 บรรทัดที่ 14 และ 15 else if (x == 24 – y) ตรวจสอบเงื่อนไขต่ออีกว่า ตัวแปร x==24-y หรือไม่ ถ้าใช่ ให้ทำคำสั่งบรรทัดที่ 16 printf (“\xDB”); คือให้พิมพ์อักขระกราฟฟิกรูป เส้นทะแยงมุมจากมุมบนขวาสุดไปยังมุมล่างซ้ายสุด แต่ถ้าไม่ใช่ ให้ไปตรวจสอบเงื่อนไขถัดไป คือคำสั่งบรรทัดที่ 17 และ 18 บรรทัดที่ 17 และ 18 ถ้าไม่เป็นไปตามเงื่อนไขดังที่กล่าวมาข้างต้น ให้พิมพ์อักขระกราฟฟิกรูป สีเทา แสดงที่จอภาพ บรรทัดที่ 19 ภายหลังจากทำงานทุกเงื่อนไขแล้ว จะทำคำสั่งบรรทัดที่ 19 คือ ขึ้นบรรทัดใหม่ และ ทำคำสั่งบรรทัดที่ 20 บรรทัดที่ 20 คำสั่ง delay (200); คือ ขณะที่วาดรูปอักขระกราฟฟิก แต่ละครั้งให้หน่วงเวลาด้วย บรรทัดที่ 22 และ 23 พิมพ์ข้อความให้กดคีย์ใด ๆ เพื่อกลับสู่โปรแกรม สุดท้ายจะหยุดรอรับค่าใด ๆ จากคีย์บอร์ด เช่น ถ้ากด enter ก็จะกลับสู่โปรแกรม ตามลำดับ 4.2.4 คำสั่ง switch switch เป็นคำสั่งที่ใช้ทดสอบเงื่อนไขในกรณีที่มีทางเลือกสำหรับตัดสินใจมากกว่า 2 ทางขึ้นไปเช่นเดียวกันกับ nested if โดยมากนิยมใช้คำสั่ง switch แทนคำสั่ง nested if เพราะมีรูปแบบการใช้คำสั่งที่ง่ายและสะดวกในการแก้ไขคำสั่งเมื่อมีข้อผิดพลาดเกิดขึ้น รูปแบบการใช้คำสั่ง switch switch (expression) { case expression1: statement(s); break; case expression2: statement(s); break; ….. case expressionN: statement(s); break; default: statement(s); } โดยที่
expression คือ นิพจน์ หรือตัวแปรที่จะใช้เปรียบเทียบกับนิพจน์ expression1, expression2, …, expressionN ว่ามีค่าตรงกับนิพจน์ใด expression1, expression2, …, expressionN คือ นิพจน์ หรือค่าคงที่ในเงื่อนไขที่ 1, 2, 3, …, N ตามลำดับ break คือ คำสั่งที่จะต้องใส่ไว้ในแต่ละ case เพื่อเป็นการบอกให้ออกจากคำสั่ง switch หลังจากทำคำสั่งที่อยู่ใน case นั้น ๆ แล้ว ถ้าหากไม่มีคำสั่ง break ใน case ใด เมื่อทำงานจบ case นั้นแล้ว จะทำงานใน case ถัดไปจนกว่าจะเจอคำสั่ง break ซึ่งทำให้เกิดการทำงานผิดพลาดได้ default คือ กรณีที่ expression ไม่ตรงกับเงื่อนไขใด ๆ เลย ให้ทำงานตามคำสั่งที่เขียนไว้ใน default โดย default นี้ไม่จำเป็นต้องใส่คำสั่ง break เอาไว้ เพราะ default เป็นกรณีสุดท้ายของคำสั่ง switch ข้อควรระวังในการใช้คำสั่ง switch
1) ถ้าใช้คำสั่ง switch ในแต่ละกรณี (case) จะต้องใส่คำสั่ง break เอาไว้ด้วยมิฉะนั้นจะเกิดการทำงานซ้ำใน case ต่อมาจนกว่าจะเจอคำสั่ง break ยกเว้นกรณี default ไม่ต้องใส่คำสั่ง break 2) expression ที่อยู่หลังคำสั่ง switch ควรใช้เป็นตัวแปร เพื่อจะได้สะดวกในการนำไปเปรียบเทียบกับกรณีต่าง ๆ ส่วน expression1, expression2, …, expressionN ที่อยู่หลัง case ต่าง ๆ ควรใช้เป็นค่าคงที่ โปรแกรมตัวอย่างที่ 4.18 แสดงการใช้คำสั่ง switch เพื่อตรวจสอบเกรดที่ผู้ใช้เติม ว่าตรงกับกรณีใด แล้วแสดงเกรดที่เป็นตัวเลขออกจอภาพ
| | | | | |
/* switch.c */ #include<stdio.h> /* บรรทัดที่ 1 */ #include<conio.h> /* บรรทัดที่ 2 */ #include<stdlib.h> /* บรรทัดที่ 3 */ #include<ctype.h> /* บรรทัดที่ 4 */ void main(void) /* บรรทัดที่ 5 */ { /* บรรทัดที่ 6 */ int n, i; /* บรรทัดที่ 7 */ float gradepoint; /* บรรทัดที่ 8 */ char grade; /* บรรทัดที่ 9 */ char numstr[20]; /* บรรทัดที่ 10 */ clrscr( ); /* บรรทัดที่ 11 */ printf("Enter Number of Students : "); /* บรรทัดที่ 12 */ n = atoi(gets(numstr)) ; /* บรรทัดที่ 13 */ for ( i=1; i<=n; i++ ) { /* บรรทัดที่ 14 */ printf("\nEnter grade of student #%d: ", i); /* บรรทัดที่ 15 */ grade = getche( ); /* บรรทัดที่ 16 */ switch(toupper(grade)) { /* บรรทัดที่ 17 */ case 'A': /* บรรทัดที่ 18 */ gradepoint = 4.0; break; /* บรรทัดที่ 19 */ case 'B': /* บรรทัดที่ 20 */ gradepoint = 3.0; break; /* บรรทัดที่ 21 */ case 'C': /* บรรทัดที่ 22 */ gradepoint = 2.0; break; /* บรรทัดที่ 23 */ case 'D': /* บรรทัดที่ 24 */ gradepoint = 1.0; break; /* บรรทัดที่ 25 */ default: gradepoint = 0.0; /* บรรทัดที่ 26 */ } /* end switch */ /* บรรทัดที่ 27 */ printf("\nGrade Point of Student#%d is %.2f\n",i,gradepoint); /* บรรทัดที่ 28 */ } /* end for */ /* บรรทัดที่ 29 */ printf("\n\nPress any key back to program..."); /* บรรทัดที่ 30 */ getch(); /* บรรทัดที่ 31 */ } /* end main */ /* บรรทัดที่ 32 */ | | | | |
ผลลัพธ์ที่ได้จากโปรแกรม
คำอธิบายโปรแกรม จากโปรแกรมตัวอย่างที่ 4.18 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 12 และ 13 ให้ผู้ใช้เติมจำนวนนักเรียน แล้วนำค่าที่ผู้ใช้เติมมาแปลงให้เป็นจำนวนเต็ม แล้วเก็บไว้ที่ตัวแปร n บรรทัดที่ 14 for (i = 1; i < n; i++) คำสั่งควบคุมการทำงานของโปรแกรมให้วนทำงานจำนวนรอบเท่ากับตัวแปร n หรือค่าตัวเลขที่ผู้ใช้เติม เมื่อทดสอบเงื่อนไข for แล้วเป็นจริง จะทำงานตามคำสั่งใน loop for คือ คำสั่งบรรทัดที่ 15 ถึง 29 แต่ถ้าเป็นเท็จ จะไปทำงานตามคำสั่งบรรทัดที่ 30 และ 31 บรรทัดที่ 15 และ 16 ให้ผู้ใช้เติมเกรดแล้วเก็บไว้ที่ตัวแปร grade บรรทัดที่ 17 ถึง 27 เป็น loop ของ คำสั่ง switch ซึ่งทำงานซ้อนภายใน loop for ดังนี้ จากตัวแปรเกรดที่รับเข้าจะแปลงให้เป็นตัวพิมพ์ใหญ่ทุกครั้ง เพื่อนำไปทดสอบทุกกรณีของคำสั่ง switch เริ่มตรวจสอบกรณีแรก คือ ทดสอบว่าเป็นตัว A หรือไม่ ถ้าใช่ กำหนดตัวแปร gradepoint มีค่าเท่ากับ 4.0 แล้วหยุดการทำงานในกรณีนี้ (break) แต่ถ้าไม่ใช่ตัว A ก็ไปตรวจสอบกรณีถัดไป คือ ใช่ตัว B หรือไม่ ถ้าใช่ กำหนดตัวแปร gradepoint มีค่าเท่ากับ 3.0 แล้วหยุดการทำงานในกรณีนี้ (break) แต่ถ้าไม่ใช่ตัว B ก็ไปตรวจสอบกรณีถัดไป คือ ใช่ตัว C หรือไม่ ถ้าใช่ กำหนดตัวแปร gradepoint มีค่าเท่ากับ 2.0 แล้วหยุดการทำงานในกรณีนี้ (break) แต่ถ้าไม่ใช่ตัว C ก็ไปตรวจสอบกรณีถัดไป คือ ใช่ตัว D หรือไม่ ถ้าใช่ กำหนดตัวแปร gradepoint มีค่าเท่ากับ 1.0 แล้วหยุดการทำงานในกรณีนี้ (break) กรณีสุดท้าย คือ กรณีที่เติมตัวอื่นที่ไม่ใช่ทั้ง 4 กรณีข้างต้น จะทำคำสั่งบรรทัดที่ 26 คือ default; gradepoint = 0.0; คือ กรณีอื่น ๆ ให้กำหนดตัวแปร gradepoint มีค่าเท่ากับ 0.0 บรรทัดที่ 28 ภายหลังจากการทำงานทุกกรณีของคำสั่ง switch แล้ว จะทำคำสั่งบรรทัดที่ 28 คือ แสดงค่าตัวแปร gradepoint ที่ได้ของแต่ละคน แสดงที่จอภาพ บรรทัดที่ 30 และ 31 พิมพ์ข้อความให้กดคีย์ใด ๆ เพื่อกลับสู่โปรแกรม สุดท้ายจะหยุดรอรับค่าใด ๆ จากคีย์บอร์ด เช่น ถ้ากด enter ก็จะกลับสู่โปรแกรม ตามลำดับ |
0 ความคิดเห็น:
แสดงความคิดเห็น