เมื่อจบหัวข้อนี้ ผู้เรียนควรจะ
√ CLO2: เลือกใช้ตัวแปร ชนิดข้อมูล คำสั่งเงื่อนไข คำสั่งทำซ้ำ และไลบรารีมาตรฐานในการเขียนโปรแกรมได้อย่างเหมาะสม
ใช้คำสั่ง if-else, if-elif-else, match-case เพื่อเขียนโปรแกรมที่มีการตัดสินใจ
√ CLO5: เขียนโปรแกรมเพื่อแก้ปัญหาทางด้านคณิตศาสตร์ สถิติ และปัญหาในชีวิตประจำวัน
เขียนโปรแกรมเพื่อแก้ปัญหาโจทย์ที่มีการตัดสินใจแบบสองทางเลือก และหลายทางเลือก
√ CLO6: ทดสอบโปรแกรม ค้นหาจุดบกพร่อง และแก้ไขให้โปรแกรมทำงานถูกต้อง
ทดสอบโปรแกรมปัญหาแบบมีทางเลือก โดยสร้างกรณีทดสอบให้ครอบคลุมกรณีที่เป็นไปได้ทั้งหมด
ค้นหาจุดบกพร่อง (bug) และแก้ไข (debug) ให้โปรแกรมทำงานถูกต้อง
ในชีวิตประจำวันเรามักจะมีขั้นตอนที่เกี่ยวข้องกับการตัดสินใจอยู่เสมอ หากอัลกอริทึมมีขั้นตอนที่ต้องตัดสินใจเพื่อจะตอบสนองต่อทางเลือกที่แตกต่างกัน จะต้องใช้เงื่อนไข (condition) ในการตัดสินใจ ตัวอย่างเช่น
ในการถอนเงิน ถ้าจำนวนเงินถอนมากกว่าเงินที่เหลือในบัญชี จะไม่สามารถถอนเงินได้
ร้านอาหารแห่งหนึ่งมีระบบสมัครสมาชิก และจะลดราคาค่าอาหาร 10% ให้สำหรับสมาชิก
นักศึกษาระดับปริญญาตรี มหาวิทยาลัยแห่งหนึ่ง การตัดสินผลสอบจะให้เกรดเป็น 3 แบบ คือ H (คะแนน 76% ขึ้นไป) S (คะแนน 60-75%) U (คะแนนต่ำกว่า 60%)
การระบุเงื่อนไขในการเขียนโปรแกรม จะเขียนอยู่ในรูปของนิพจน์เปรียบเทียบและนิพจน์ตรรกะ ซึ่งทั้งสองนิพจน์จะให้ค่าเป็นจริงหรือเท็จ คือ ค่าของชนิดข้อมูลตรรกะ (Boolean) เสมอ
ตัวอย่างนิพจน์
นิพจน์เปรียบเทียบ เช่น x <= y, x+y > 10, x != False
นิพจน์ตรรกะ เช่น x >= 1 and x<=10, x == True or y != 5
คำสั่งที่ใช้ตัดสินใจในภาษาไพธอน มี 4 รูปแบบ ได้แก่
คำสั่ง if
คำสั่ง if
คำสั่ง if-else
คำสั่ง if-elif-else
คำสั่ง match (ตั้งแต่ version 3.10 เป็นต้นไป)
ผังงานคำสั่ง if ทั้งสามรูปแบบ
ตัวดำเนินการที่ใช้ในนิพจน์เพื่อระบุเงื่อนไข เป็นตัวดำเนินการที่มีความหมายเช่นเดียวกับตัวดำเนินการที่ใช้ในคณิตศาสตร์ แต่อาจจะใช้สัญลักษณ์ที่แตกต่างกันบ้างในบางตัว ประกอบด้วย
ตัวดำเนินการทางตรรกะ (logical operator) ได้แก่ and (และ), or (หรือ) และ not (นิเสธ)
ตัวดำเนินการเปรียบเทียบ (comparison operator) ได้แก่
Operator Name Example
== เท่ากับ x == 50
!= ไม่เท่ากับ x != 50
> มากกว่า x > 10
>= มากกว่าหรือเท่ากับ x >= 100
< น้อยกว่า x < 10
<= น้อยกว่าหรือเท่ากับ x <= 100
ตัวอย่าง นิพจน์เปรียบเทียบ (relation_ex.py)
a = 20
b = 10
c = 5
print("a == b ", a == b)
print("a != b ", a != b)
print("a > b ", a > b)
print("a >= b ", a >= (b*2))
print("a <= b ", a <= b)
print("c < b < a ", c < b < a)
ผลลัพธ์
a == b False
a != b True
a > b True
a >= b True
a <= b False
c < b < a True
แบบฝึกหัด
เปลี่ยนเงื่อนไขต่อไปนี้ให้อยู่ในรูปนิพจน์
ค่า x อยู่ระหว่าง 1-100
age ไม่เป็นค่าติดลบหรือ 0
num มีชนิดข้อมูลเป็น int และ num มีค่ามากกว่า 0
flag มีค่าเป็นจริง และ count น้อยกว่าหรือเท่ากับ 10
คำสั่งเงื่อนไข If ใช้ในการตรวจสอบเงื่อนไขเพื่อที่จะเลือกทำชุดคำสั่งที่ต้องการ สามารถเขียนได้ 3 รูปแบบย่อย ดังนี้
คำสั่ง if
ใช้เมื่อมีเพียงทางเลือกเดียวที่ต้องการทำหากเงื่อนไขเป็นจริง โดยจะทำชุดคำสั่งใน if-block ถ้าเงื่อนไขเป็นเท็จจะไม่คำสั่งใดๆ แต่จะข้ามไปทำคำสั่งลำดับถัดไป
block เป็นการจัดกลุ่มของคำสั่งไว้ด้วยกัน
ในไพธอนใช้การย่อหน้า (indent) เข้าไป 1 tab หรือใช้การเคาะช่องว่างนิยมใช้ขนาด 4 space
รูปแบบคำสั่ง
if เงื่อนไข :
(ชุด)คำสั่ง if-block
คำสั่งถัดไป
ตัวอย่าง if1.py
age = int(input('Enter your age: '))
if age >= 18 :
print('You have a right to vote.')
print('Let\'s vote!')
ผลลัพธ์
Enter your age: 18
You have a right to vote.
Let's vote!
Enter your age: 10
Let's vote!
คำสั่งที่อยู่ในบล็อคจะทำทุกครั้งที่เงื่อนไขเป็นจริง และสังเกตว่าคำสั่งสุดท้ายอยู่นอกบล็อค ดังนั้นจึงจะทำคำสั่งนี้ทุกครั้ง โดยไม่ขึ้นอยู่กับเงื่อนไขหลังคำสั่ง if
ตัวอย่าง if2.py
age = int(input('Enter your age: '))
if age >= 18 :
print('You have a right to vote.')
print('Let\'s vote!')
ผลลัพธ์
Enter your age: 18
You have a right to vote.
Let's vote!
Enter your age: 10
สังเกตว่าเมื่อย้ายคำสั่งสุดท้ายไปอยู่ในบล็อค จะทำคำสั่งนี้ก็ต่อเมื่อเงื่อนไขหลังคำสั่ง if เป็นจริงเท่านั้น ถ้าเงื่อนไขเป็นเท็จจะไม่ทำคำสั่งใด
แบบฝึกหัด
ทำโจทย์บนเครื่อง Grader เลือก tag 'If' (ข้อ 11-18)
คำสั่ง if-else
ใช้เมื่อมี 2 ทางเลือก โดยตรวจสอบเงื่อนไข ถ้าเป็นจริงแล้วให้ชุดคำสั่งใน if-block ถ้าเป็นเท็จให้ทำอีกชุดคำสั่งใน else-block
รูปแบบคำสั่ง
if เงื่อนไข :
(ชุด)คำสั่ง if-block
else :
(ชุด)คำสั่ง else-block
ตัวอย่าง if_else.py
age = int(input('Enter your age: '))
if age >= 18 :
print('You have a right to vote.')
print('Let\'s vote!')
else:
print('You don\'t have a right to vote yet.')
print('Please wait until you turn 18.')
ผลลัพธ์
Enter your age: 18
You have a right to vote.
Let's vote!
Enter your age: 10
You don't have a right to vote yet.
Please wait until you turn 18.
แบบฝึกหัด
ทำโจทย์บนเครื่อง Grader เลือก tag 'IfElse' (ข้อ 19-20, quiz2_1_65, mid1_65)
คำสั่ง if-elif-else
ใช้เมื่อมีทางเลือกมากกว่า 2 ทางเลือกขึ้นไป โดยตรวจสอบเงื่อนไข ถ้าเป็นจริงแล้วให้ชุดคำสั่งใน if-block ถ้าเป็นเท็จให้ทำอีกชุดคำสั่งใน else-block
รูปแบบคำสั่ง
if เงื่อนไข :
(ชุด)คำสั่ง if-block
elif เงื่อนไข :
(ชุด)คำสั่ง elif-block
elif เงื่อนไข :
(ชุด)คำสั่ง elif-block
else :
(ชุด)คำสั่ง else-block
ตัวอย่าง if_elif1.py
n = int(input('Enter integer: '))
if n > 0:
print('Positive')
elif n < 0:
print('Negative')
else:
print('Zero')
ผลลัพธ์
Enter integer: 10
Positive
Enter integer: -4
Negative
Enter integer: 0
Zero
ตัวอย่าง if_elif2.py
year = int(input('Enter year: '))
if year == 1:
print('freshman')
elif year == 2:
print('sophomore')
elif year == 3:
print('junior')
elif year == 4:
print('senior')
else:
print('super senior')
ผลลัพธ์
Enter year: 3
junior
Enter year: 8
super senior
แบบฝึกหัด
ทำโจทย์บนเครื่อง Grader เลือก tag 'NestedIf' (ข้อ 21-24, mid2_65 )
ใช้เมื่อมีทางเลือกมากกว่า 2 ทางเลือกขึ้นไป โดยตรวจสอบ parameter ว่าตรงกับค่าของ case ใดก็ให้ทำชุดคำสั่งใน block ของ case นั้น แต่ถ้าไม่ตรงกับ case ใดเลยกรณีสุดท้ายให้ใส่ _ ไว้เป็นค่าของ case สุดท้าย
รูปแบบคำสั่ง
match parameter :
case first :
first-block
case second :
second-block
case third :
third-block
.............
............
case n :
n-block
case _ :
nomatch-block
ตัวอย่าง match1.py
status = 400
match status:
case 400:
print("Bad request")
case 404:
print("Not found")
case 418:
print("I'm a teapot")
case _:
print("Something's wrong with the internet")
ตัวอย่าง match2.py
month = int(input('Enter month:'))
match month:
case 1 | 3 | 5 | 7 | 8 | 10 | 12 :
days = 31
case 2:
days = 28
case 4 | 6 | 9 | 11:
days = 30
case _:
days = 0
print('Month should be 1-12')
if days == 0:
print('incorrect month')
else:
print("Number of days in %d = %d" % (month, days))
ตัวอย่าง match3.py
payment_method = input("Select payment method: ")
match payment_method:
case "credit card":
print("Processing payment via credit card...")
case "paypal":
print("Processing payment via PayPal...")
case "bank transfer":
print("Processing payment via bank transfer...")
case _:
print("Unsupported payment method")
แบบฝึกหัด
ใช้คำสั่ง match ให้ได้ผลการทำงานแบบเดียวกับโปรแกรม if_elif2.py ในตัวอย่างคำสั่ง if-elif-else
คำสั่ง nested-if หมายถึง ชุดคำสั่งที่มีการใช้คำสั่ง if เขียนซ้อนกันมากกว่า 1 ชั้น เพื่อใช้ในการตรวจสอบเงื่อนไขที่มีความซับซ้อน ไม่มีรูปแบบที่ตายตัว สามารถซ้อนกันได้ทั้งใน if-block, elif-block หรือ else-block
ตัวอย่าง nested_if1.py
n = int(input('Enter integer: '))
if n >= 0:
if n > 0:
print('Positive')
else:
print('Zero')
else:
print('Negative')
ตัวอย่างการใช้งานคำสั่ง nested if เพื่อตรวจสอบปีอธิกสุรทิน
คำสั่ง nested if สามารถใช้เพื่อตรวจสอบว่าปีที่กำหนดเป็นปีอธิกสุรทินหรือไม่ (leap year)
ปีอธิกสุรทิน หมายถึง ปีที่มี 366 วัน เนื่องจากเดือนกุมภาพันธ์มี 29 วัน
เงื่อนไขในการตรวจสอบ คือ
1. ปีจะต้องหารด้วย 4 ลงตัว (ไม่มีเศษ)
2. ปีไม่สามารถหารด้วย 100 ลงตัวได้
3. ถ้าหารด้วย 100 ลงตัว แล้วต้องสามารถหารด้วย 400 ลงตัว
ตัวอย่างเช่น
- ปี 2004, 2008, 2012, 2016, 2020 เป็นปีอธิกสุรทิน เพราะหารด้วย 4 ลงตัว และหารด้วย 100 ไม่ลงตัว
- ปี 2000 เป็นปีอธิกสุรทิน เพราะหารด้วย 4 ลงตัว หารด้วย 100 ลงตัว และหารด้วย 400 ลงตัว
- ปี 1900 ไม่ใช่ปีอธิกสุรทิน เพราะหารด้วย 4 ลงตัว และหารด้วย 100 ลงตัว แต่หารด้วย 400 ไม่ลงตัว
- ปี 2002, 2010 ไม่ใช่ปีอธิกสุรทิน เพราะหารด้วย 4 ไม่ลงตัว
ตัวอย่าง nested_if2.py
year = int(input("Enter a year: "))
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
print(year, "is a leap year")
else:
print(year, "is not a leap year")
else:
print(year, "is a leap year")
else:
print(year, "is not a leap year")
แบบฝึกหัด
โปรแกรมตรวจสอบการเข้าสู่ระบบ
เขียนโปรแกรมตรวจสอบการเข้าสู่ระบบของผู้ใช้ โดยตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านตรงกับข้อมูลในระบบหรือไม่
กำหนดให้ username ที่ถูกต้องคือ admin และ password คือ password123
โดยรับชื่อผู้ใช้งาน และตรวจสอบชื่อผู้ใช้งานก่อน ถ้าชื่อผู้ใช้งานไม่ตรง เราจะแสดงข้อความว่า "Invalid username" ถ้าชื่อผู้ใช้งานถูกต้อง จะรับรหัสผ่านแล้วตรวจสอบรหัสผ่านว่าถูกต้องหรือไม่ ถ้ารหัสผ่านถูกให้แสดงข้อความ "Welcome, admin!" เพื่อต้อนรับผู้ใช้งาน แต่ถ้าชื่อผู้ใช้งานถูกต้องแต่รหัสผ่านไม่ถูก จะแสดงข้อความว่า "Invalid password"
ตัวอย่างผลรัน
Enter your username: admin
Enter your password: password123
Welcome, admin!
Enter your username: admin
Enter your password: pwd123
Invalid password
Enter your username: root
Invalid username
Enter your username: test
Invalid username