Transcript if (a == b)

418115 การเขียนโปรแกรมเชิงโครงสร้าง
คาสัง่ เงือ่ นไข (1)
ประมุข ขันเงิน
[email protected]
เช็คเลขคู่เลขคี่
 เราจะเช็คว่าตัวแปร x ชนิด int ว่าเป็ นเลขคู่ได้ อย่างไร?
 ใช้ นิพจน์น้ ี: x%2 == 0
 มีค่า 1 ถ้ า x เป็ นเลขคู่
 มีค่า 0 ถ้ า x เป็ นเลขคี่
 หรือใช้ นิพจน์น้ ี: x & 1
 มีค่า 0 ถ้ า x เป็ นเลขคู่
 มีค่า 1 ถ้ า x เป็ นเลขคี่
โปรแกรมเช็คเลขคู่เลขคี่
 ต้ องการโปรแกรมอย่างนี้
Enter a number: 10
10 is an even number.
Enter a number: 7
7 is an odd number.
สังเกต
 ข้ อความที่เป็ นผลลัพธ์ของทั้งสองกรณีมค
ี วามแตกต่างกันแค่คาเดียว
 “odd” กับ “even”
10 is an even number.
7 is an odd number.
พิมพ์ขอ้ ความผลลัพธ์
 ดังนั้นเราอาจจะพิมพ์ข้อความนี้ด้วยคาสั่ง printf ต่อไปนี้
printf(“%d is an %s number”, x, ???);
 โดยที่ ??? มีค่าเป็ น
 “even” ถ้ า x เป็ นเลขคู่
 “odd” ถ้ า x เป็ นเลขคี่
นิพจน์แบบมีเงือ่ นไข
 เราสามารถเขียน ??? ได้ ด้วยนิพจน์ต่อไปนี้
(x%2 == 0) ? “even” : “odd”
 ไวยากรณ์
( นิพจน์ทางตรรกศาสตร์ ) ? ค่าถ้ านิพจน์เป็ นจริง : ค่าถ้ านิพจน์เป็ นเท็จ
 อะไรคือ “จริง”?
 อะไรก็ตามที่ไม่ใช่ 0 (…, -2, -1, 1, 2, …)
 0 คือเท็จ
ทัง้ โปรแกรม
#include <stdio.h>
int main()
{
int x;
printf("Enter a number: ");
scanf("%d", &x);
printf("%d is an %s number.\n", x,
(x % 2 == 0) ? "even" : "odd");
return 0;
}
อีกแบบหนึง่
#include <stdio.h>
int main()
{
int x;
printf("Enter a number: ");
scanf("%d", &x);
printf("%d is an %s number.\n", x,
(x & 1) ? "odd" : "even");
return 0;
}
อีกแบบหนึง่
#include <stdio.h>
int main()
{
int x;
printf("Enter a number: ");
scanf("%d", &x);
printf("%d is an %s number.\n", x,
(x % 2) ? "odd" : "even");
return 0;
}
โปรแกรมบอกจานวนวันในปี
 เราต้ องการโปรแกรมที่เมื่อรับเลขปี คริสตศักราชมา แล้ วบอกว่าปี นั้นมีก่วี น
ั
 คาตอบมีได้ ก่แี บบ?
 365 ถ้ าเป็ นปี ธรรมดา
 366 ถ้ าเป็ นปี อธิกสุรธิน
 ตัวอย่าง
Enter year: 2001
Year 2001 has 365 days.
Enter year: 2004
Year 2004 has 366 days.
Enter year: 2100
Year 2001 has 365 days.
ปี อธิกสุรธิน
 คือปี ที่
 เลขปี หารด้ วย 4 ลงตัว แต่หารด้ วย 100 ไม่ลงตัว
 หรือหารด้ วย 400 ลงตัว
 สมมติว่าตัวแปร y มีเลขปี เราจะเช็คว่ามันเป็ นปี อธิกสุรธินได้ อย่างไร?
 ใช้ นิพจน์น้ ี
((y%4==0) && (y%100!=0)) || (y%400==0)
 มีค่าเป็ น 1 เมื่อ y เป็ นปี อธิกสุรธิน
 มีค่าเป็ น 0 เมื่อ y ไม่เป็ นปี อธิกสุรธิน
จานวนวันในปี อธิกสุรธิน
 สมมติว่าเราเก็บผลลัพธ์ของนิพจน์ท่แี ล้ วไว้ ในตัวแปร is_leap_year
is_leap_year = ((y%4==0) && (y%100!=0)) ||
(y%400==0);
 เราสามารถหาจานวนวันได้ ด้วยนิพจน์
(is_leap_year) ? 366 : 365
หรือ
365 + is_leap_year
ก็ได้
ทัง้ โปรแกรม
#include <stdio.h>
int main()
{
int y, is_leap_year, days;
printf("Enter year: ");
scanf("%d", &y);
is_leap_year =
((y%4==0)&&(y%100!=0))||(y%400==0);
days = (is_leap_year) ? 366 : 365;
printf("Year %d has %d days.\n", y, days);
return 0;
}
โปรแกรมบอกจานวนวันในปี (เวอร์ชนั 2)
 คราวนี้ถ้าปี ที่ให้ มาเป็ นปี อธิกสุรธิน (leap year) เราต้ องการให้ โปรแกรมบอก
ด้ วยว่ามันเป็ นปี อธิกสุรธิน
 ตัวอย่าง
Enter year: 2001
Year 2001 has 365 days.
Enter year: 2004
Year 2004 is a leap year. <<< บรรทัดใหม่
Year 2004 has 366 days.
โปรแกรมบอกจานวนวันในปี (เวอร์ชนั 2)
 เราสามารถคานวณตัวแปร is_leap_year เหมือนเดิม
 ต้ องพิมพ์ “Year ??? is a leap year.” เมื่อ is_leap_year มีค่าเป็ น 1
 ไม่ต้องพิมพ์ถ้ามันเป็ น 0
คาสัง่ if
 ไวยากรณ์
if (นิพจน์ทางตรรกศาสตร์)
คาสั่ง;
 การทางาน
 หาค่าของนิพจน์ทางตรรกศาสตร์
 ถ้ ามีค่าเป็ น “จริง” (ไม่เป็ น 0) ให้ ทาคาสั่งที่อยู่ข้างใต้
 ถ้ ามีค่าเป็ น “เท็จ” (เป็ น 0) ก็ไม่ต้องทาอะไร (ไปทาคาสั่งต่อไปในโปรแกรม)
ผังงาน
เงือ่ นไข
จริง
คำสัง่
เท็จ
โปรแกรมบอกจานวนวันในปี (เวอร์ชนั 2)
 ต้ องพิมพ์ “Year ??? is a leap year.” เมื่อ is_leap_year มีค่าเป็ น 1
 ไม่ต้องพิมพ์ถ้ามันเป็ น 0
if (is_leap_year)
printf(“Year %d is a leap year”, y);
ทัง้ โปรแกรม
#include <stdio.h>
int main()
{
int y, is_leap_year, days;
printf("Enter year: ");
scanf("%d", &y);
is_leap_year =
((y%4==0)&&(y%100!=0))||(y%400==0);
days = (is_leap_year) ? 366 : 365;
if (is_leap_year)
printf("Year %d is a leap year.\n", y);
printf("Year %d has %d days.\n", y, days);
return 0;
}
โปรแกรมหาเลขทีม่ ากกว่า
 ต้ องการเขียนโปรแกรมรับจานวนเต็มสองตัว
 แล้ วพิมพ์เลขตัวที่มากกว่าออกทางหน้ าจอ
 แต่ถ้าเลขสองตัวเท่ากัน จะไม่มต
ี วั เลขที่มากกว่า
 ในกรณีน้ ใี ห้ บอกว่ามันเท่ากัน
 ตัวอย่าง
Enter a number: 2001
Enter another number: 2002
2002 is bigger.
Enter a number: 2009
Enter another number: 2009
The two numbers are equal.
คาสัง่ if (รูปแบบที่ 2)
 ไวยากรณ์
if (นิพจน์ทางตรรกศาสตร์)
คาสั่ง 1;
else
คาสั่ง 2;
 การทางาน
 หาค่าของนิพจน์ทางตรรกศาสตร์
 ถ้ ามีค่าเป็ น “จริง” (ไม่เป็ น 0) ให้ ทาคาสั่ง 1
 ถ้ ามีค่าเป็ น “เท็จ” (เป็ น 0) ให้ ทาคาสั่ง 2
ผังงาน
เงือ่ นไข
จริง
คำสัง่ 1
เท็จ
คำสัง่ 2
ออกแบบโปรแกรม
 รับเลขสองตัว สมมติว่าใส่ตวั แปร a และ b
 ถ้ าเลขสองตัวเท่ากัน
 ให้ พิมพ์ว่ามันเท่ากัน
 มิเช่นนั้น
 ให้ พิมพ์เลขที่มากกว่า
if (a == b)
printf(“The two numbers are equal.\n”);
else
พิมพ์เลขตัวที่มากกว่า
หาเลขตัวทีม่ ากกว่า
 เราสามารถหาเลขที่มากกว่าได้ ด้วยนิพจน์
(a > b) ? a : b
 ข้ อสังเกต:ถ้ า a กับ b เท่ากัน นิพจน์จะเอาค่ามาจาก b (ซึ่งมีค่าเท่ากับ a อยู่ดี)
 กรณีท่ี a เท่ากับ b จะไม่เกิดขึ้น เพราะเราเช็คแล้ วว่ามันไม่เป็ นจริง
if (a == b)
printf(“The two numbers are equal.\n”);
else
printf(“%d is bigger.\n”, (a > b) ? a : b);
ทัง้ โปรแกรม
#include <stdio.h>
int main()
{
int a, b;
printf("Enter a number: ");
scanf("%d", &a);
printf("Enter another number: ");
scanf("%d", &b);
if (a == b)
printf("The two numbers are equal.\n");
else
printf("%d is bigger.\n", (a > b) ? a : b);
return 0;
}
หาเลขทีม่ ากกว่าโดยไม่ต้องใช้นพิ จน์เงือ่ นไข
 จริงๆ แล้ วเราสามารถหาเลขที่มากกว่าโดยไม่ต้องใช้ นิพจน์เงื่อนไข
 สร้ างตัวแปรชื่อ M ไว้ เก็บเลขที่มากกว่า
 กาหนดค่า M ได้ ดงั นี้
if (a > b)
M = a;
else
M = b;
 พิมพ์ M แทนที่จะพิมพ์ (a > b) ? a : b
ทัง้ โปรแกรม
#include <stdio.h>
int main()
{
int a, b, M;
[ ... รับข้ อมูลเข้ า ... ]
if (a > b)
M = a;
else
M = b;
if (a == b)
printf("The two numbers are equal.\n");
else
printf("%d is bigger.\n", M);
return 0;
}
ตัดเกรด
 ต้ องการเขียนโปรแกรมรับคะแนนของนักเรียน (เต็ม 100)
80  เกรด A
ถ้ าได้ คะแนนตั้งแต่ 70…79  เกรด B
ถ้ าได้ คะแนนตั้งแต่ 60…69  เกรด C
ถ้ าได้ คะแนนตั้งแต่ 50…59  เกรด D
ถ้ าได้ คะแนนต่ากว่า
50  เกรด F
 ถ้ าได้ คะแนนไม่ต่ากว่า




ตัดเกรด
Enter score: 96
Grade = A
Enter score: 72
Grade = B
Enter score: 65
Grade = C
Enter score: 54
Grade = D
Enter score: 33
Grade = F
คะแนนเท่าไหร่ได้เกรดเท่าไหร่
 เราสามารถเขียนโปรแกรมนี้โดย
 เช็คว่าคะแนนที่ได้ มาอยู่ในช่วงของเกรด A หรือไม่
 ถ้ าได้ กพ
็ ิมพ์ “Grade = A”
 เช็คว่าคะแนนที่ได้ มาอยู่ในช่วงของเกรด B หรือไม่
 ถ้ าได้ กพ
็ ิมพ์ “Grade = B”
 เช็คว่าคะแนนที่ได้ มาอยู่ในช่วงของเกรด C หรือไม่
 ถ้ าได้ กพ
็ ิมพ์ “Grade = C”
 เช็คว่าคะแนนที่ได้ มาอยู่ในช่วงของเกรด D หรือไม่
 ถ้ าได้ กพ
็ ิมพ์ “Grade = D”
 เช็คว่าคะแนนที่ได้ มาอยู่ในช่วงของเกรด E หรือไม่
 ถ้ าได้ กพ
็ ิมพ์ “Grade = E”
เช็คช่วงเกรด
 สมมติเราอ่านค่าคะแนนมาเก็บไว้ นตัวแปร score
 จะได้ เกรด A เมื่อ
 score >= 80
 จะได้ เกรด B เมื่อ
 (score >= 70) && (score < 80)
 จะได้ เกรด C เมื่อ
 (score >= 60) && (score < 70)
 จะได้ เกรด D เมื่อ
 (score >= 50) && (score < 59)
 จะได้ เกรด F เมื่อ
 score < 50
ทัง้ โปรแกรม
#include <stdio.h>
int main()
{
int score;
printf("Enter score: ");
scanf("%d", &score);
if (score >= 80)
printf("Grade = A\n");
if ((score >= 70) && (score < 80))
printf("Grade = B\n");
if ((score >= 60) && (score < 70))
printf("Grade = C\n");
if ((score >= 50) && (score < 60))
printf("Grade = D\n");
if (score < 50)
printf("Grade = F\n");
return 0;
}
ข้อสังเกต
 ถ้ านักเรียนได้ เกรด B แล้ วจะไม่ได้ เกรด A
 เงื่อนไข A คือ score >= 80
 เงี่อนไข B คือ (score >= 70) && (score < 80)
 สังเกตว่า score >=80 และ score < 80 เป็ นจริงพร้ อมกันไม่ได้
 ในโปรแกรมที่แล้ ว เราจึงมีการเช็คเงินไขซา้ ซ้ อน
 ถ้ า score >= 80 ไม่เป็ นจริง เราไม่จาเป็ นต้ องเช็ค score < 80 อีก
 ถ้ า score >= 70 ไม่เป็ นจริง เราไม่จาเป็ นต้ องเช็ค score < 70 อีก
 ถ้ า score >= 60 ไม่เป็ นจริง เราไม่จาเป็ นต้ องเช็ค score < 60 อีก
 ถ้ า score >= 50 ไม่เป็ นจริง เราไม่จาเป็ นต้ องเช็ค score < 50 อีก
คาสัง่ if (รูปแบบที่ 3)
 ไวยากรณ์
if (นิพจน์ทางตรรกศาสตร์ 1)
คาสั่ง 1;
else if (นิพจน์ทางตรรกศาสตร์ 2)
คาสั่ง 2;
else if (นิพจน์ทางตรรกศาสตร์ 3)
คาสั่ง 3;
:
:
else if (นิพจน์ทางตรรกศาสตร์ n)
คาสั่ง n;
else
คาสั่ง n+1;
คาสัง่ if (รูปแบบที่ 3)
 การทางาน
 หาค่าของนิพจน์ทางตรรกศาสตร์ 1
 ถ้ ามีค่าเป็ น “จริง” (ไม่เป็ น 0) ให้ ทาคาสั่ง 1 แล้ วเลิก
 ถ้ ามีค่าเป็ น “เท็จ” (เป็ น 0) ให้ หาค่าของนิพจน์ทางตรรกศาสตร์ 2


ถ้ ามีค่าเป็ น “จริง” (ไม่เป็ น 0) ให้ ทาคาสั่ง 2 แล้ วเลิก
ถ้ ามีค่าเป็ น “เท็จ” (เป็ น 0) ให้ หาค่าของนิพจน์ทางตรรกศาสตร์ 3
o ถ้ ามีค่าเป็ น “จริง” (ไม่เป็ น 0) ให้ ทาคาสั่ง 3 แล้ วเลิก
o ถ้ ามีค่าเป็ น “เท็จ” (เป็ น 0) ให้ หาค่าของนิพจน์ทางตรรกศาสตร์ 4
• ...
• …
• ถ้ ามีค่าเป็ น “เท็จ” (เป็ น 0) ให้ หาค่าของนิพจน์ทางตรรกศาสตร์ n
• ถ้ ามีค่าเป็ น “จริง” (ไม่เป็ น 0) ให้ ทาคาสั่ง n แล้ วเลิก
• ถ้ ามีค่าเป็ น “เท็จ” (ไม่เป็ น 0) ให้ ทาคาสั่ง n+1 แล้ วเลิก
ผังงาน
จริง
คำสัง่ 1
เงือ่ นไข 1
จริง
คำสัง่ 2
เท็จ
เงือ่ นไข 2
จริง
คำสัง่ 3
เท็จ
เงือ่ นไข 3
จริง
คำสัง่ 4
เท็จ
เงือ่ นไข 4
เท็จ
คำสัง่ 5
ตัดเกรด
 เช็คว่า score >= 80 หรือไม่
 ถ้ าใช้ แสดงว่าได้ เกรด A
 ถ้ าไม่ใช่ ให้ เช็คว่า score >= 70 หรือไม่
 ถ้ าใช่แสดงว่าได้ เกรด B
 ถ้ าไม่ใช่ ให้ เช็คว่า score >= 60 หรือไม่
 ถ้ าใช่แสดงว่าได้ เกรด C
 ถ้ าไม่ใช่ ใช้ เช็คว่า score >= 50 หรือไม่
o ถ้ าใช่แสดงว่าได้ เกรด D
o ถ้ าไม่ใช่แสดงว่าได้ เกรด F
ทัง้ โปรแกรม
#include <stdio.h>
int main()
{
int score;
printf("Enter score: ");
scanf("%d", &score);
if (score >= 80)
printf("Grade = A\n");
else if (score >= 70)
printf("Grade = B\n");
else if (score >= 60)
printf("Grade = C\n");
else if (score >= 50)
printf("Grade = D\n");
else
printf("Grade = F\n");
return 0;
}