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; }