คำสั่งเงื่อนไข (Conditioning Statements) บทที่ 5 คำสั่งเงื่อนไข (Conditioning Statements) ผู้สอน : ครูพัชรนันท์ กุลวรพิสิษฐ์
หัวข้อ ... คำสั่งเงื่อนไขและตัวดำเนินการ คำสั่ง if คำสั่ง switch คำสั่ง if-else คำสั่ง nested-if คำสั่ง switch การประยุกต์ใช้
5.1 คำสั่งเงื่อนไขและตัวดำเนินการ คำสั่งเงื่อนไข ใช้ในการตัดสินใจเมื่อมีทางเลือก ชนิดของเงื่อนไข มี 3 ชนิด 1. เงื่อนไขทางเลือกจาก 1 ทาง (if) condition yes statement no 2. เงื่อนไขทางเลือกจาก 2 ทาง (if-else) 3. เงื่อนไขทางเลือกจาก n ทาง (nested if, switch) statement1 condition statement2 . . . statement3 statementn n 1 2 3 condition no yes statement1 statement2
ตัวดำเนินการ ตัวดำเนินการพื้นฐานในคำสังเงื่อนไข คือ condition yes statement no ตัวดำเนินการพื้นฐานในคำสังเงื่อนไข คือ ตัวดำเนินการสัมพันธ์ (Relational Operators) เช่น == (equal) != (not equal) < (less than), <= (equal & less than) > (greater than), >= (equal & greater than) ผลจากเงื่อนไข เป็นได้ 2 แบบ คือ จริง (TRUE: 1) หรือ เท็จ (FALSE: 0) ถ้า x = 75 x == 0 ? x != 0 ? x <= 75 ? x > 75 ? ตัวดำเนินการตรรกะ (Logical operators) && (AND) || (OR) ! (NOT) (x > 0) && (x<50) ? 50 (x > 0) && (x<90) ? 90 (x < 10) || (x>90) ?
5.2 คำสั่ง if รูปแบบ ตัวอย่างเช่น expression yes statement(s) no รูปแบบ if (expression) statement; if (expression) { s1; s2; ... } statement ผลจาก นิพจน์ตรรกะ (Logical Expression) เป็นได้ 2 แบบคือ (TRUE หรือ FALSE) x >= 60 yes no Print “pass” ถ้า TRUE จะทำ statement ถ้า FALSE จะไม่ทำ statement ตัวอย่างเช่น if(x >= 60) printf(“pass”);
ตัวอย่าง 5.1 เขียนโปรแกรมตรวจสอบเงื่อนไขเพื่อคัดเลือกผู้ที่สอบผ่านตามเกณฑ์ (คะแนน X ³ 60) เมื่อ Inputs คือ ID, Name, X start Input ID, Name, X X >= 60 yes end no Print ID,Name (Pass) ผลลัพธ์ Enter ID): _ 53004100 #include <stdio.h> void main() { int ID, X; char Name[20]; printf("Enter ID: "); scanf("%d", &ID); printf("Enter Name: "); scanf("%s", &Name); printf("Enter X(0-100): "); scanf("%d", &X); Enter Name: _ AAAAA Enter X (0 - 100): _ 75 53004100 AAAAA (Pass) if (X >= 60) printf(“%d %s (Pass) \n", ID, Name); }
ตัวอย่าง 5.2 เขียนโปรแกรมหาค่า Absolute ของ X (|X|) เช่น ถ้า X=-4 จะได้ |X|=4 แนวคิด ทดสอบเงื่อนไข if X < 0 ปรับค่า X = -X) ผลลัพธ์ start Input X X < 0 yes end no Print X X = -X #include <stdio.h> void main() { int X; printf("Enter X: "); scanf("%d", &X); Enter X: _ -4 |X| = 4 if (X < 0) printf(“|X| = %d \n", X); }
5.3 คำสั่ง if-else expression no yes statement 1 statement 2 statement 1 statement 2 รูปแบบ if (expression) { statement1;… } else { statement2; … } ผลจาก นิพจน์ตรรกะ (Expression) เป็นได้ 2 แบบ คือ (TRUE หรือ FALSE) X = 75 X >= 80 no yes A not A ถ้า TRUE จะทำ statement 1 ถ้า FALSE จะทำ statement 2 not A ตัวอย่างเช่น if (X>=80) printf (“%d %s A\n”, ID, Name); else printf (“%d %s not A\n”, ID, Name);
ตัวอย่าง 5.3 เขียนโปรแกรมตรวจสอบเงื่อนไขเพื่อแบ่งนักศึกษาออกเป็น 2 กลุ่ม ตามเพศ (Gender) คือ เพศชาย (Male) หรือเพศหญิง (Female) start Input ID, Name,Gender Gender=‘M’ end yes “Male” no “Female” #include <stdio.h> void main() { int ID; char Name[20], Gender; printf("Enter ID: "); scanf("%d", &ID); printf("Enter Name: "); scanf("%s", &Name); fflush(stdin); // clear keyboard buffer printf("Enter Gender: "); scanf("%c", &Gender); ผลลัพธ์ if (Gender == ‘M’) printf("Male\n"); else printf("Female\n"); } Enter ID): _ 53004100 Enter Name: _ AAAAA Enter Gender: _ F Female
ตัวอย่าง 5.4 เขียนโปรแกรมรับค่า Integer (X) และตรวจสอบว่า X เป็นเลขคู่ (Even) หรือเลขคี่ (Odd) แนวคิด: X เป็น Even ถ้า X หารด้วย 2 ลงตัว ผลลัพธ์ start Input x rem = 0 end rem = x%2 yes “Even” no “Odd” #include <stdio.h> void main() { int X, rem; printf("Enter X: "); scanf("%d", &X); Enter X: _ 30 30 (Even) rem = X % 2; // remainder of X/2 if (rem == 0) printf("%d (Even)\n", X); else printf("%d (odd)\n", X); }
5.4 คำสั่ง nested-if ... รูปแบบ ผลจาก Expression เป็นได้ 2 แบบคือ exp1=true statement 1 yes no exp2=true statement 2 ... expn-1=true statement n statement1 statement2 รูปแบบ if (exp1) {statement1;…} else if (exp2) {statement2;…} else if (exp3) {statement3;…} ... else if (exp n-1) {statement n-1;…} else statement n; statementn-1 statement n ผลจาก Expression เป็นได้ 2 แบบคือ ถ้า TRUE จะทำ statement 1 ถ้า FALSE จะตรวจสอบ expression 2 ซึ่งได้ผล 2 แบบ คือ ถ้า TRUE จะทำ statement 2 ... ทดสอบเงื่อนไขต่อไปจนถึง expression n-1 ถ้า TRUE จะทำ statement n-1 หรือ FALSE จะทำ statement n
ตัวอย่าง 5.5 เขียนโปรแกรมตัดเกรดจากคะแนนสอบ (X) ตามเงื่อนไข ผลลัพธ์ 80 -100 => grade = ‘A’ 70 - 79 => grade = ‘B’ 60 - 69 => grade = ‘C’ 50 - 59 => grade = ‘D’ x < 50 => grade = ‘F’ ผลลัพธ์ Enter ID: _ 53004100 Enter Name: _ AAAAA Enter X (0-100): _ 75 Grade = B #include <stdio.h> void main() { int ID, X; char Name[20], Grade; printf("Enter ID: "); scanf("%d", &ID); printf("Enter Name: "); scanf("%s", &Name); printf("Enter X: "); scanf("%d", &X); if (X >= 80) Grade = 'A'; else if (X >= 70) Grade = 'B'; else if (X >= 60) Grade = 'C'; else if (X >= 50) Grade = 'D'; else Grade = 'F'; printf("Grade = %c\n", Grade); } start Grade = ‘F’ end Input ID, Name,X x >= 80 yes Grade = ‘A’ x >= 50 Grade = ‘D’ Grade x >= 70 Grade = ‘B’ x >= 60 Grade = ‘C’ X=75 Grade=‘B’
ตัวอย่าง 5.6 เขียนโปรแกรมอ่าน Binary Expression (+, -, *, /) เช่น 123.5+59.3 ที่มี รูปแบบข้อมูลเข้า คือ X Op Y แนวคิด: ทดสอบค่า Op ว่าเป็น +, -, *, หรือ / ผลลัพธ์ start Unknown Op end Input X,Op,Y Op = ‘+’ yes result = X+Y Op = ‘\’ result = X/Y result Op = ‘-’ result = X-Y Op = ‘*’ result = X*Y Op=‘+’ Enter ID: _ 123.5 + 59.3 #include <stdio.h> void main() { float X, Y, result=0; char Op; printf("Enter expression: "); scanf("%f %c %f", &X, &Op, &Y); if (Op == ‘+’) result = X+Y; else if (Op == ‘-’) result = X-Y'; else if (Op == ‘*’) result = X*Y; else if (Op = ‘/’) result = X/Y; // Y > 0 else else printf(“%c \aUnknown operator\n”, op); printf("= %.2f\n", result); } 182.80 result=182.8
ผลจาก expression เป็นได้ n แบบคือ 5.5 คำสั่ง switch st1 exp st2 ... st3 st n n 1 2 3 รูปแบบ switch (expression) { case value1: statement1; break; st1 st2 st3 st n หมายเหตุ switch = nested if case value2: statement2; break; ... case value n: statementn; break; default: statement; break; } exp=1 st1 yes no exp=2 st2 ... exp=n st n st ผลจาก expression เป็นได้ n แบบคือ ถ้าค่า expression ตรงกับ value i จะทำ statement i คำสั่ง break (มีผลทำให้จบ case ของคำสั่ง switch) คำสั่ง default (เป็นกรณีอื่นๆ ที่ไม่มีในเงื่อนไข 1-n)
ตัวอย่างการเขียนโปรแกรม “ร้านเหล้าไฮเทค” โดยใช้ฟังก์ชั่น if-else เงื่อนไข ถ้าอายุมากกว่า 18 เช็คเพศ หญิง หรือ ชาย - ถ้าเพศชาย ให้ไป โซนขายเหล้า - ถ้าเพศหญิง ให้ไป โซนขายไวท์ - ถ้าอายุน้อยกว่า 18 ห้ามเข้า ใช้ If-else สองชั้น
โปรแกรม #include [stdio.h] // เปลี่ยน [ , ] เป็น < , > int main() { char name[50]; // เก็บชื่อ เป็นข้อความจึงต้องประกาศเป็น string (char แบบหลายช่อง) char sex; // เก็บเพศ (m/f) เป็นอักษรตัวเดียว ประกศ char ธรรมดาพอ int age; // เก็บอายุ จริงๆแล้วใช้ char ก็ได้ เพราะ char ก็เก็บเลขได้ แต่นิยม int printf("What's your name : "); // คำถาม gets(name) // รับค่าชื่อ+สกุล ซึ่งมีช่องว่างคั่นอยู่ จึงต้องใช้ gets printf("How old are you : "); scanf("%d",&age); // รับค่าอายุ เป็นตัวเลข printf("Male/Female (m/f) : "); scanf("%c",&sex); // รับค่าเพศ เป็นอักษรตัวเดียว if(age<18) { // ถ้าอายุน้อยกว่า 18 ห้ามเข้า printf("Sorry you can'tenter this website"); } else { // ถ้าอายุไม่น้อยกว่า 18 ให้เช็คเพศ if(sex=='m') { // ถ้าผู้ชาย ไปโซนขายเหล้า printf("Hi Mr.%s welcome to exteen bar. enjoy with our spirits",name); } else { // ถ้าไม่ใช่(ก็คือเป็นหญิง) ไปโซนไวน์ printf("Hello Mrs.%s welcome to exteen bar. enyou with our wine",name); } } scanf(" "); return 0; }
อันนี้ แบบที่สอง if(age<18) { printf("Sorry, You can't enter this website"); } else if(sex=='m') { printf("Hi Mr.%s welcome to exteen bar. enjoy with our spirits",name); } else { printf("Hello Mrs.%s welcome to exteen bar. enyou with our wine",name); }
บทนี้จะสอนการเช็คเงื่อนไขในอีกลักษณะ เรียกว่า switch บทนี้จะสอนการเช็คเงื่อนไขในอีกลักษณะ เรียกว่า switch...case เช่น สร้างโปรแกรมที่มีเมนู กด 1 ให้ทำอันนึง กด 2 ให้ทำอันนึง กด 0 ให้ออก เป็นต้น นักเรียนจำทำยังไง ถ้าเราทำแบบที่เคยเรียนกันมา เราก็ต้องรับค่าจากผู้ใช้ ว่ากดอะไร แล้วมาเข้า if..else สมมติให้ตัวแปรชื่อ menu เก็บค่าเมนูที่ผู้ใช้เลือก (สมมติว่ารับค่าจาก scanf ) เวลาเช็คก็ทำงี้ if(menu==1) printf("You choose 1"); else if(menu==2) printf("You choose 2"); else if(menu==0) printf("You want to exit"); else printf("Wrong choosing"); ถ้าเมนูมีมากกว่า 3 อย่าง เราก็เพิ่มส่วน else if ไปเยอะๆ แต่เขียนแบบนี้บางทีมันยาว เราเลยจะใช้ switch...case ซึ่งมีรูปแบบ แบบนี้ switch(ตัวแปร) { case ค่า : คำสั่งที่จะให้ทำ; // case ค่า ตามด้วยโคลอน(กด shft+เซมิโคลอน) break; case ค่า : คำสั่ง; break; default :คำสั่ง }
switch(menu) { // ต้องการดูค่าใน menu case 1 : printf("Choose 1"); // ถ้า menu มีค่าเป็น 1 ให้ printf ตรงนี้มากกว่า 1 คำสั่งได้ break; // ใส่ break ก่อนขึ้นเคสต่อไป case 2 : printf("Choose 2 "); break; case 0 : printf("exit"); break; default : printf("Wrong"); // ถ้าไม่ตรงเลย จะมาทำหลัง default ซึ่งไม่ต้องมี break ก็ได้ }
ตัวอย่าง 7.9 (ใช้คำสั่ง Swith Case) โปรแกรมรับระดับผลการเรียนหรือเกรดมาจากแป้นพิมพ์ แล้วนำมาพิจารณาตรวจสอบว่า เกรดที่รับเข้ามานั้นตรงกับตัวอักษรใดแล้วแสดงผลดังนี้ ถ้าเป็น A แสดงข้อความ "Excellent" ถ้าเป็น B แสดงข้อความ "Good" ถ้าเป็น C แสดงข้อความ "So so" ถ้าเป็น D แสดงข้อความ "Fails" ถ้าเป็น E แสดงข้อความ "Get lost" ถ้าเป็นตัวอักษรอื่น ๆ แสดงข้อความ "Invalid data"
สามารถนำมาเขียนผังงานได้ดังนี้
จากผังงานนำมาเขียนโค้ดได้ดังนี้
ตัวอย่าง 5.7 เขียนโปรแกรมอ่าน Binary Expression (+, -, *, /) เช่น 123.5+59.3 ที่มีรูปแบบข้อมูลเข้า คือ X Op Y แนวคิด: ทดสอบค่า Op ว่าเป็น +, -, *, หรือ / โดยใช้คำสั่ง switch ผลลัพธ์ #include <stdio.h> void main() { float X, Y, result=0; char Op; printf("Enter expression: "); scanf("%f %c %f", &X, &Op, &Y); switch (Op) { case ‘+’: result = X+Y; break; case ‘-’: result = X-Y'; break; case ‘*’: result = X*Y; break; case ‘/’: result = X/Y; break; // Y > 0 default: printf(“%c \aUnknown operator\n”, op); printf("= %.2f\n", result); } Enter ID: _ 123.5 + 59.3 start Unknown Op end Input X,Op,Y Op = ‘+’ yes result = X+Y Op = ‘\’ result = X/Y result Op = ‘-’ result = X-Y Op = ‘*’ result = X*Y 182.80
ตัวอย่าง 5.8 เขียนโปรแกรมรับค่าวันเป็นตัวเลข (1-7) และพิมพ์ผล เป็นข้อความ (Sun,Mon,Tue,Wed,Thu,Fri,Sat) เช่น D=7 พิมพ์ Sat ผลลัพธ์ #include <stdio.h> void main() { int D; printf("Enter an integer (1-7): "); scanf("%d", &D); Enter an integer (1-7): _ 7 Sat switch(D) { case 1: printf("Sun\n"); break; case 2: printf("Mon\n"); break; case 3: printf("Tue\n"); break; case 4: printf("Wed\n"); break; case 5: printf("Thu\n"); break; case 6: printf("Fri\n"); break; case 7: printf("Sat\n"); break; default: printf(“\a unknown integer %d\n", D); } start Input D D end Print “Mon” 2 Print “Sat” 7 Print “Sun” 1
Case Study-1 เขียนโปรแกรมสร้างรหัส Soundex Code ที่แปลงรหัสตัวอักษรเป็น รหัสเลข กลุ่ม 6 กลุ่ม 0: A,E,I,O,U,H,W,Y 1: B,F,P,V #include <stdio.h> #include <ctype.h> void main() { char ch; int group; printf("Enter a character: "); scanf("%c", &ch); ch = toupper(ch); 2: C,G,J,K,Q,S,X,Z 3: D,T 4: L 5: M,N 6: R switch(ch) { case ‘A’: case ‘E’: case ‘I’: case ‘O’: case ‘U’: case ‘H’: case ‘W’: case ‘Y’: group = 0; break; case ‘B’: case ‘F’: case ‘P’: case ‘V’: group = 1; break; case ‘C’: case ‘G’: case ‘J’: case ‘K’: case ‘Q’: case ‘S’: case ‘X’: case ‘Z’: group = 2; break; case ‘D’: case ‘T’: group = 3; break; case ‘L’: group = 4; break; case ‘M’: case ‘N’: group = 5; break; case ‘R’: group = 6; break; default: group = 9; break; } if (group != -9) printf(“Soundex code = %d\n”, group); else printf(“\a%c is not a character (a-z, A-Z)\n”);
Case Study-2 เขียนโปรแกรมนับตัวอักษรแต่ละตัวใน Text File ผลลัพธ์ #include <stdio.h> void main() { char File[500]; int i, n[30]={0}; printf("Enter text File: "); gets(File); while(File[i]!=‘\0’) { Enter text File: _ C Programming #a=1, #b=0, #c=1,#d=0,#e=0, #f=0, #g=2, #h=0,#i=1,#j=0, #k=0, #l=0, #m=2,#n=1,#o=1, switch(File[i]) { case ‘a’: case ‘A’: n[0]++; break; case ‘b’: case ‘B’: n[1]++; break; case ‘c’: case ‘C’: n[2]++; break; case ‘d’: case ‘D’: n[3]++; break; case ‘e’: case ‘E’: n[4]++; break; case ‘f’: case ‘F’: n[5]++; break; case ‘g’: case ‘G’: n[6]++; break; case ‘h’: case ‘H’: n[7]++; break; ... case ‘z’: case ‘Z’: n[25]++; break; case ‘0’: case ‘1’: case ‘2’: case ‘3’: … case ‘9’: n[26]++; break; default: n[27]++; break; } i++; // move to next character for(i=0; i<=25; i++) printf(“#%c=%d, “, 97+i, n[i]); // ASCII ‘a’ = 97 printf(“\n#0-9=%d, #others=%d”, n[26], n[27]); #p=1, #q=0, #r=2,#s=0,#t=0, #u=0, #v=0, #w=0,#x=0,#y=0, #z=0, #0-9=0, #others=1