240 likes | 420 Views
บทที่ 5. คำสั่งเงื่อนไข (Conditioning Statements). ผู้สอน : ครูพัชร นันท์ กุลว รพิ สิษฐ์. หัวข้อ. คำสั่งเงื่อนไขและตัวดำเนินการ คำสั่ง if คำสั่ง if-else คำสั่ง nested-if คำสั่ง switch การประยุกต์ใช้. condition. condition. statement1. statement 2. yes. condition. no.
E N D
บทที่5 คำสั่งเงื่อนไข (Conditioning Statements) ผู้สอน :ครูพัชรนันท์กุลวรพิสิษฐ์
หัวข้อ ... • คำสั่งเงื่อนไขและตัวดำเนินการ • คำสั่ง if • คำสั่ง if-else • คำสั่ง nested-if • คำสั่ง switch • การประยุกต์ใช้
condition condition statement1 statement2 yes condition no statement yes no n 1 2 3 . . . statement1 statement2 statement3 statementn 5.1 คำสั่งเงื่อนไขและตัวดำเนินการ • คำสั่งเงื่อนไข ใช้ในการตัดสินใจเมื่อมีทางเลือก • ชนิดของเงื่อนไข มี 3 ชนิด 1.เงื่อนไขทางเลือกจาก1 ทาง(if) 2.เงื่อนไขทางเลือกจาก 2 ทาง(if-else) 3.เงื่อนไขทางเลือกจาก nทาง(nested if, switch)
yes condition no statement 0 50 0 90 ตัวดำเนินการ • ตัวดำเนินการพื้นฐานในคำสังเงื่อนไข คือ ตัวดำเนินการสัมพันธ์(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) ? (x > 0) && (x<90) ? (x < 10) || (x>90) ?
expression statement(s) no no yes yes x >= 60 Print “pass” 5.2คำสั่งif • รูปแบบ if(expression)statement; if(expression) { s1;s2; ... } statement • ผลจากนิพจน์ตรรกะ(Logical Expression)เป็นได้ 2 แบบคือ(TRUE หรือ FALSE) • ถ้าTRUEจะทำstatement • ถ้าFALSE จะไม่ทำ statement • ตัวอย่างเช่น • if(x >= 60) printf(“pass”);
start Input ID, Name, X no X >= 60 yes Print ID,Name (Pass) end ตัวอย่าง5.1 • เขียนโปรแกรมตรวจสอบเงื่อนไขเพื่อคัดเลือกผู้ที่สอบผ่านตามเกณฑ์ (คะแนนX ³ 60) • เมื่อ Inputs คือ ID, Name, X #include <stdio.h> void main() { intID, 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 ID): _ 53004100 Enter Name: _ AAAAA Enter X (0 - 100): _ 75 53004100 AAAAA (Pass) if(X >= 60) printf(“%d %s (Pass) \n", ID, Name); }
start Input X yes X < 0 X = -X no Print X end ตัวอย่าง5.2 • เขียนโปรแกรมหาค่า Absolute ของ X(|X|) เช่น ถ้า X=-4 จะได้ |X|=4 • แนวคิด ทดสอบเงื่อนไข if X < 0 ปรับค่า X = -X) #include <stdio.h> void main() { intX; printf("Enter X: "); scanf("%d", &X); ผลลัพธ์ Enter X: _ -4 |X| = 4 if(X < 0) printf(“|X| = %d \n", X); }
A statement 1 statement2 not A expression X >= 80 yes yes no no 5.3คำสั่งif-else statement 1 statement2 • รูปแบบ if (expression){statement1;… } else{statement2; … } • ผลจากนิพจน์ตรรกะ(Expression)เป็นได้2แบบ คือ(TRUEหรือFALSE) X = 75 • ถ้าTRUEจะทำstatement 1 • ถ้าFALSEจะทำstatement 2 not A • ตัวอย่างเช่น if (X>=80) printf (“%d %s A\n”, ID, Name); elseprintf (“%d %s not A\n”, ID, Name);
Input ID, Name,Gender no start Gender=‘M’ yes “Female” “Male” end ตัวอย่าง5.3 • เขียนโปรแกรมตรวจสอบเงื่อนไขเพื่อแบ่งนักศึกษาออกเป็น 2 กลุ่มตามเพศ (Gender) คือ เพศชาย (Male) หรือเพศหญิง (Female) #include <stdio.h> void main() { intID; 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"); elseprintf("Female\n"); } Enter ID): _ 53004100 Enter Name: _ AAAAA Enter Gender: _ F Female
start yes Input x no rem = 0 rem = x%2 “Odd” “Even” end ตัวอย่าง 5.4 • เขียนโปรแกรมรับค่า Integer (X) และตรวจสอบว่า Xเป็นเลขคู่ (Even) หรือเลขคี่ (Odd) • แนวคิด: X เป็น Even ถ้า X หารด้วย 2 ลงตัว #include <stdio.h> void main() { int X, rem; printf("Enter X: "); scanf("%d", &X); ผลลัพธ์ 30 Enter X: _ 30 (Even) rem = X % 2; // remainder of X/2 if(rem == 0) printf("%d (Even)\n", X); elseprintf("%d (odd)\n", X); }
exp2=true expn-1=true exp1=true yes yes yes statement n statement 1 statement 2 ... no no no statement n 5.4คำสั่งnested-if 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
Grade = ‘A’ Grade = ‘B’ Grade = ‘C’ Grade = ‘D’ yes yes yes yes start Input ID, Name,X x >= 80 x >= 60 x >= 50 x >= 70 Grade = ‘F’ Grade end ตัวอย่าง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() { intID, 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); } X=75 Grade=‘B’
result = X/Y result = X*Y result = X+Y result = X-Y yes yes yes yes start Input X,Op,Y Op = ‘*’ Op = ‘-’ Op = ‘+’ Op = ‘\’ Unknown Op result end ตัวอย่าง5.6 • เขียนโปรแกรมอ่าน BinaryExpression(+, -, *, /)เช่น 123.5+59.3 ที่มีรูปแบบข้อมูลเข้า คือ X Op Y • แนวคิด:ทดสอบค่าOp ว่าเป็น +, -, *, หรือ / ผลลัพธ์ Op=‘+’ Enter ID: _ 123.5 + 59.3 182.80 #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 elseelseprintf(“%c \aUnknown operator\n”, op); printf("= %.2f\n", result); } result=182.8
exp=1 exp=n yes yes yes st1 st2 st n ... st1 st2 st3 stn no no no exp 1 2 3 n exp=2 ... st 5.5คำสั่งswitch st1 st2 st3 st n • รูปแบบ switch (expression){ case value1: statement1; break; หมายเหตุ switch = nested if case value2: statement2; break; ... case value n:statementn; break; default: statement; break; } • ผลจากexpression เป็นได้ nแบบคือ • ถ้าค่าexpression ตรงกับvalue iจะทำ statement i • คำสั่งbreak(มีผลทำให้จบ caseของคำสั่ง switch) • คำสั่ง default (เป็นกรณีอื่นๆ ที่ไม่มีในเงื่อนไข1-n)
ตัวอย่างการเขียนโปรแกรม “ร้านเหล้าไฮเทค”โดยใช้ฟังก์ชั่น if-else ใช้ If-else สองชั้น เงื่อนไข ถ้าอายุมากกว่า 18 เช็คเพศ หญิง หรือ ชาย- ถ้าเพศชาย ให้ไป โซนขายเหล้า- ถ้าเพศหญิง ให้ไป โซนขายไวท์- ถ้าอายุน้อยกว่า 18 ห้ามเข้า
โปรแกรม #include [stdio.h] // เปลี่ยน [ , ] เป็น < , > int main(){ char name[50]; // เก็บชื่อ เป็นข้อความจึงต้องประกาศเป็น string (char แบบหลายช่อง)char sex; // เก็บเพศ (m/f) เป็นอักษรตัวเดียว ประกศchar ธรรมดาพอint age; // เก็บอายุ จริงๆแล้วใช้ char ก็ได้ เพราะ char ก็เก็บเลขได้ แต่นิยม intprintf("What's your name : "); // คำถามgets(name) // รับค่าชื่อ+สกุล ซึ่งมีช่องว่างคั่นอยู่ จึงต้องใช้ getsprintf("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...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 ก็ได้}
result = X*Y result = X-Y result = X/Y result = X+Y yes yes yes yes start Input X,Op,Y Op = ‘+’ Op = ‘\’ Op = ‘-’ Op = ‘*’ Unknown Op result end ตัวอย่าง5.7 • เขียนโปรแกรมอ่าน BinaryExpression(+, -, *, /)เช่น 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 182.80
start D Input D 1 2 7 Print “Sun” Print “Mon” Print “Sat” end ตัวอย่าง5.8 • เขียนโปรแกรมรับค่าวันเป็นตัวเลข(1-7)และพิมพ์ผลเป็นข้อความ(Sun,Mon,Tue,Wed,Thu,Fri,Sat)เช่น D=7 พิมพ์ Sat ผลลัพธ์ #include <stdio.h> void main() { intD; 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); } }
Case Study-1 0: A,E,I,O,U,H,W,Y 1: B,F,P,V • เขียนโปรแกรมสร้างรหัส Soundex Codeที่แปลงรหัสตัวอักษรเป็น รหัสเลขกลุ่ม 6กลุ่ม #include <stdio.h> #include <ctype.h> void main() { char ch; intgroup; 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 ผลลัพธ์ #include <stdio.h> void main() { char File[500]; inti, n[30]={0}; printf("Enter text File: "); gets(File); while(File[i]!=‘\0’) { • เขียนโปรแกรมนับตัวอักษรแต่ละตัวใน Text File 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
Case Study-2 จิตตั้งมั่น