Slide Lesson 5 (คำสั่งเงื่อนไข)

Download Report

Transcript Slide Lesson 5 (คำสั่งเงื่อนไข)

คำสั่งเงื่อนไข
(Conditioning Statements)
ผู้สอน : ครู พัชรนันท์ กุลวรพิสิษฐ์
1
หัวข้อ ...
คำสั่งเงื่อนไขและตัวดำเนินกำร
คำสั่ง if
คำสั่ง
if-else
คำสั่ง nested-if
คำสั่ง switch
กำรประยุกต์ ใช้
2
 คำสั่งเงื่อนไข ใช้ ในการตัดสินใจเมื่อมีทางเลือก
มี 3 ชนิด
1. เงื่อนไขทางเลือกจาก 1 ทำง (if)
2. เงื่อนไขทางเลือกจาก 2 ทำง (if-else)
3. เงื่อนไขทางเลือกจาก n ทำง (nested if, switch)
 ชนิดของเงื่อนไข
yes
condition
statement
no
yes
no
condition
statement1
statement2
1
2
condition
3
statement1 statement2
statement3 . . .
n
statementn
3
yes
condition
statement
no
ตัวดาเนินการพื ้นฐานในคาสังเงื่อนไข คือ
ตัวดำเนินกำรสัมพันธ์ (Relational Operators) เช่น

== (equal)
!= (not equal)
< (less than), <= (equal & less than)
> (greater than),
>= (equal & greater than)

◦
ผลจำกเงื่อนไข เป็ นได้ 2 แบบ คือ
จริง (TRUE: 1) หรื อ เท็จ (FALSE: 0)
ตัวดำเนินกำรตรรกะ (Logical operators)
&& (AND)
|| (OR)
! (NOT)
(x > 0) && (x<50) ?
(x > 0) && (x<90) ?
(x < 10) || (x>90) ?
0
0
ถ้ ำ x = 75
x == 0 ?
x != 0 ?
x <= 75 ?
x > 75 ?
50
90
4

รูปแบบ
if (expression) statement;
if (expression) { s1; s2; ... }
expression
no
yes
statement(s)
statement
ผลจาก นิพจน์ ตรรกะ (Logical Expression) เป็ นได้ 2 แบบคือ
(TRUE หรื อ FALSE)


ถ้ า TRUE จะทา statement
ถ้ า FALSE จะไม่ทา statement
ตัวอย่ ำงเช่ น
x >= 60
no
yes
Print
“pass”
if(x >= 60) printf(“pass”);
5
เขียนโปรแกรมตรวจสอบเงื่อนไขเพื่อคัดเลือกผู้ท่ สี อบผ่ ำนตาม
เกณฑ์ (คะแนน X ³ 60)
เมื่อ Inputs คือ ID, Name, X
start
ผลลัพธ์
Enter ID): 53004100
_
Enter Name: A
_ AAAA
Enter X (0 - 100): _
75
53004100 AAAAA (Pass)
#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);
Input ID,
Name, X
no
X >= 60
yes
Print ID,Name
(Pass)
end
if (X >= 60)
printf(“%d %s (Pass) \n", ID, Name);
}
6
เขียนโปรแกรมหาค่า Absolute ของ X (|X|) เช่น ถ้ า X=-4 จะได้
|X|=4
แนวคิด ทดสอบเงื่อนไข if X < 0 ปรับค่า X = -X)
ผลลัพธ์
#include <stdio.h>
Enter X: _-4
void main()
|X| = 4
{
int
X;
printf("Enter X: "); scanf("%d", &X);
if (X < 0)
printf(“|X| = %d \n", X);
start
Input X
yes
X<0
X = -X
no
Print X
end
}
7
yes

รู ปแบบ
expression
statement
statement 11
no
statement
statement 22
if (expression) { statement1;… }
else { statement2; … }
ผลจาก นิพจน์ ตรรกะ (Expression) เป็ นได้ 2 แบบ คือ
(TRUE

หรื อ FALSE)
X = 75
ถ้ า TRUE จะทา statement 1
yes

ถ้ า FALSE จะทา statement 2
A
X >= 80
no
not
not A
A
ตัวอย่ ำงเช่ น
if (X>=80) printf (“%d %s A\n”, ID, Name);
else printf (“%d %s not A\n”, ID, Name);
8
เขียนโปรแกรมตรวจสอบเงื่อนไขเพื่อแบ่ งนักศึกษำออกเป็ น 2 กลุ่ม
ตามเพศ (Gender) คือ เพศชาย (Male) หรื อเพศหญิง (Female)
start
#include <stdio.h>
void main()
{
int ID;
yes
char Name[20], Gender;
printf("Enter ID: "); scanf("%d", &ID);
“Male”
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");
}
Input ID,
Name,Gender
Gender=‘M’
no
“Female”
end
ผลลัพธ์
Enter ID): 53004100
_
Enter Name: _ AAAAA
Enter Gender: _ F
Female
9
เขียนโปรแกรมรับค่า Integer (X) และตรวจสอบว่า X เป็ นเลขคู่
(Even) หรื อเลขคี่ (Odd)
แนวคิด: X เป็ น Even ถ้ า X หารด้ วย 2 ลงตัว
#include <stdio.h>
void main()
{
int X, rem;
printf("Enter X: "); scanf("%d", &X);
ผลลัพธ์
start
Enter X: _30
30 (Even)
Input x
rem = x%2
yes
rem = X % 2; // remainder of X/2
if (rem == 0) printf("%d (Even)\n", X);
else
printf("%d (odd)\n", X);
}
rem = 0
“Even”
no
“Odd”
end
10
exp1=true
yes statement1
statement 1
no
exp2=true

รู ปแบบ
yes statement2
statement 2
no
if (exp1) {statement1;…}
else if (exp2) {statement2;…}
else if (exp3) {statement3;…}
...
else if (exp n-1) {statement n-1;…}
else statement n;
...
expn-1=true
yes
statement
n
statementn-1
no
statement
statement nn
ผลจาก Expression เป็ นได้ 2 แบบคือ
ถ้ า TRUE จะทา statement 1
ถ้ า FALSE จะตรวจสอบ expression 2 ซึง่ ได้ ผล 2 แบบ คือ



ถ้ า TRUE จะทา statement 2

... ทดสอบเงื่อนไขต่อไปจนถึง expression n-1

ถ้ า TRUE จะทา statement n-1 หรื อ FALSE จะทำ statement n
11

เขียนโปรแกรมตัดเกรดจำกคะแนนสอบ (X) ตามเงื่อนไข
80 -100 => grade = ‘A’
70 - 79 => grade = ‘B’
60 - 69 => grade = ‘C’
50 - 59 => grade = ‘D’
x < 50 => grade = ‘F’
ผลลัพธ์
53004100
Enter ID: _
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
Input ID,
Name,X
x >= 80
x >= 70
x >= 60
x >= 50
X=75
yes
yes
yes
yes
Grade = ‘A’
Grade=‘B’
Grade
= ‘B’
Grade = ‘C’
Grade = ‘D’
Grade = ‘F’
Grade
end
12

เขียนโปรแกรมอ่าน Binary Expression (+, -, *, /) เช่น 123.5+59.3 ที่มี

แนวคิด: ทดสอบค่า Op ว่าเป็ น +, -, *, หรือ /
รูปแบบข้ อมูลเข้ า คือ X Op Y
ผลลัพธ์
Enter ID:123.5
_
+ 59.3
182.80
start
Input
X,Op,Y
#include <stdio.h>
Op = ‘+’
void main()
{
float X, Y, result=0;
Op = ‘-’
char Op;
printf("Enter expression: ");
Op = ‘*’
scanf("%f %c %f", &X, &Op, &Y);
Op = ‘\’
if (Op == ‘+’) result = X+Y;
else if (Op == ‘-’) result = X-Y';
Unknown Op
else if (Op == ‘*’) result = X*Y;
else if (Op = ‘/’) result = X/Y;
// Y > 0
else else printf(“%c \aUnknown operator\n”, op); result
printf("= %.2f\n", result);
end
}
Op=‘+’
yes
yes
yes
yes
result = X+Y
result=182.8
result = X-Y
result = X*Y
result = X/Y
13
exp
รู ปแบบ

1
st1
st2
st2
switch (expression) {
case value1: statement1; break;
case value2: statement2; break;
...
case value n: statementn; break;
default: statement; break;
}


3
st3
...
n
st nn
st
หมำยเหตุ
switch = nested if
exp=1
yes
st1
no
ผลจาก expression เป็ นได้ n แบบคือ

2
ถ้ าค่า expression ตรงกับ value i จะทา statement i
คาสัง่ break (มีผลทาให้ จบ case ของคาสัง่ switch)
คาสัง่ default (เป็ นกรณีอื่นๆ ที่ไม่มีในเงื่อนไข 1-n)
exp=2
yes
st2
...
no
exp=n
yes
st n
no
st
14
ตัวอย่างการเขียนโปรแกรม “ร้ านเหล้าไฮเทค” โดยใช้ ฟังก์ชั่น if-else
เงื่อนไข ถ้ าอายุมากกว่ า 18
เช็คเพศ หญิง หรือ ชาย
- ถ้ าเพศชาย ให้ ไป โซนขายเหล้า
- ถ้ าเพศหญิง ให้ ไป โซนขายไวท์
- ถ้ าอายุน้อยกว่ า 18 ห้ ามเข้ า
ใช้ If-else สองชัน้
15
โปรแกรม
#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(" ");
16
อันนี้ แบบที่สอง
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);
}
17
บทนีจ้ ะสอนการเช็คเงือ่ นไขในอีกลักษณะ เรียกว่า 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 :คาสั่ง
}
18
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 ก็ได้
}
19
ตัวอย่ าง 7.9 (ใช้ คาสั่ ง Swith Case)
โปรแกรมรับระดับผลการเรียนหรือเกรดมาจากแป้นพิมพ์ แล้วนามาพิจารณาตรวจสอบว่า เกรดที่
รับเข้ ามานั้นตรงกับตัวอักษรใดแล้วแสดงผลดังนี้
ถ้ าเป็ น A แสดงข้ อความ "Excellent"
ถ้ าเป็ น B แสดงข้ อความ "Good"
ถ้ าเป็ น C แสดงข้ อความ "So so"
ถ้ าเป็ น D แสดงข้ อความ "Fails"
ถ้ าเป็ น E แสดงข้ อความ "Get lost"
ถ้ าเป็ นตัวอักษรอืน่ ๆ แสดงข้ อความ "Invalid data"
20
สำมำรถนำมำเขียนผังงำนได้ดงั นี้
21
จำกผังงำนนำมำเขียนโค้ดได้ดงั นี้
22

เขียนโปรแกรมอ่าน Binary Expression (+, -, *, /) เช่น

แนวคิด: ทดสอบค่า Op ว่าเป็ น +, -, *, หรือ / โดยใช้ คาสัง่ switch
ผลลั
พ
ธ์
#include <stdio.h>
123.5+59.3 ที่มีรูปแบบข้ อมูลเข้ า คือ X Op Y
Enter ID:123.5
_
+ 59.3
182.80
start
void main()
Input
X,Op,Y
{
float X, Y, result=0;
char Op;
result = X+Y
Op = ‘+’
yes
printf("Enter expression: ");
scanf("%f %c %f", &X, &Op, &Y);
result = X-Y
Op = ‘-’
yes
switch (Op) {
result = X*Y
Op = ‘*’
case ‘+’: result = X+Y; break;
yes
case ‘-’: result = X-Y'; break;
result = X/Y
Op = ‘\’
yes
case ‘*’: result = X*Y; break;
Unknown Op
case ‘/’: result = X/Y; break; // Y > 0
default: printf(“%c \aUnknown operator\n”, op);
printf("= %.2f\n", result);
result
}
23
end

เขียนโปรแกรมรับค่าวันเป็ นตัวเลข (1-7) และพิมพ์ผล
เป็ นข้ อควำม (Sun,Mon,Tue,Wed,Thu,Fri,Sat) เช่น D=7 พิมพ์ Sat
ผลลัพธ์
#include <stdio.h>
Enter an integer (1-7): 7_
void main()
{ int D;
Sat
printf("Enter an integer (1-7): "); scanf("%d", &D);
switch(D) {
case 1: printf("Sun\n"); break;
start
case 2: printf("Mon\n"); break;
Input D
case 3: printf("Tue\n"); break;
case 4: printf("Wed\n"); break;
D
case 5: printf("Thu\n"); break;
1
2
7
case 6: printf("Fri\n");
break;
Print “Sun” Print “Mon”
Print “Sat”
case 7: printf("Sat\n"); break;
default: printf(“\a unknown integer %d\n", D);
}
end
}
24

เขียนโปรแกรมสร้ างรหัส Soundex Code ที่แปลงรหัสตัวอักษรเป็ น รหัสเลข
0: A,E,I,O,U,H,W,Y
กลุม่ 6 กลุม่
1: B,F,P,V
#include <stdio.h>
2: C,G,J,K,Q,S,X,Z
#include <ctype.h>
3: D,T
void main()
4: L
5: M,N
{
char ch; int group;
6: R
printf("Enter a character: "); scanf("%c", &ch);
ch = toupper(ch);
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”);
}
25

เขียนโปรแกรมนับตัวอักษรแต่ละตัวใน Text File
#include <stdio.h>
ผลลัพธ์
void main()
Enter text File: _C Programming
{
char File[500]; int i, n[30]={0};
printf("Enter text File: "); gets(File);
#a=1, #b=0, #c=1,#d=0,#e=0,
while(File[i]!=‘\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; #p=1, #q=0, #r=2,#s=0,#t=0,
case ‘b’: case ‘B’:
n[1]++; break; #u=0, #v=0, #w=0,#x=0,#y=0,
case ‘c’: case ‘C’:
n[2]++; break; #z=0, #0-9=0, #others=1
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]);
}
26