EP04: การควบคุมทิศทางการทำงานของโปรแกรม: โครงสร้างแบบเลือกทำ

(1) ทบทวนความรู้เดิม

  • ค่าความจริง (Boolean Values): True (จริง) และ False (เท็จ) ซึ่งเป็นผลลัพธ์สำคัญในการตัดสินใจของโปรแกรม
  • ตัวดำเนินการเปรียบเทียบ (Comparison Operators):
    • == (เท่ากับ), != (ไม่เท่ากับ)
    • > (มากกว่า), < (น้อยกว่า)
    • >= (มากกว่าหรือเท่ากับ), <= (น้อยกว่าหรือเท่ากับ)
    • การใช้ตัวดำเนินการเหล่านี้เปรียบเทียบค่าสองค่า และผลลัพธ์ที่ได้จะเป็น True หรือ False เสมอ
      • ตัวอย่าง: 5 > 3 (ได้ True), 10 == 20 (ได้ False), 'hello' == 'hello' (ได้ True)
  • ตัวดำเนินการตรรกะ (Logical Operators):
    • and (และ): ผลลัพธ์เป็น True เมื่อเงื่อนไข ทั้งสองข้าง เป็น True
      • ตัวอย่าง: (age >= 18) and (country == "Thailand")
    • or (หรือ): ผลลัพธ์เป็น True เมื่อเงื่อนไข อย่างน้อยหนึ่งข้าง เป็น True
      • ตัวอย่าง: (day == "Saturday") or (day == "Sunday")
    • not (ไม่): กลับค่าความจริงจาก True เป็น False และจาก False เป็น True
      • ตัวอย่าง: not is_member
  • การรับข้อมูล input() และการแปลงชนิดข้อมูล:
    • ทบทวนว่า input() คืนค่าเป็นสตริง (str) เสมอ
    • ความจำเป็นในการใช้ int(), float() เพื่อแปลงเป็นตัวเลขก่อนนำไปคำนวณหรือเปรียบเทียบเชิงตัวเลข

(2) แนวคิดการควบคุมการไหลของโปรแกรม (Control Flow Concept)

  • การทำงานแบบตามลำดับ (Sequential Flow): อธิบายว่าโปรแกรมที่ผ่านมาส่วนใหญ่ทำงานจากคำสั่งแรกไปจนถึงคำสั่งสุดท้ายตามลำดับ
  • การทำงานแบบเลือกทำ (Selection/Conditional Flow): แนะนำแนวคิดที่โปรแกรมสามารถ “ตัดสินใจ” ได้ว่าจะทำชุดคำสั่งใด โดยขึ้นอยู่กับเงื่อนไขบางอย่าง
    • อุปมาอุปมัย:
      • ถ้าฝนตก ให้กางร่ม (มิฉะนั้น ไม่ต้องกางร่ม)
      • ถ้าสอบได้คะแนนมากกว่า 50 คะแนน ให้แสดงว่า “ผ่าน” (มิฉะนั้น แสดงว่า “ไม่ผ่าน”)
      • ถ้าเลือกเมนูอาหารเป็น “กะเพราหมู” ให้คิดราคา 50 บาท

(3) โครงสร้างควบคุมแบบเลือกทำทางเดียว (One-Way Selection): if statement

  • หลักการ: ใช้เมื่อต้องการให้โปรแกรมทำงานบางอย่าง เฉพาะเมื่อ เงื่อนไขที่กำหนดเป็นจริงเท่านั้น ถ้าเงื่อนไขเป็นเท็จ โปรแกรมจะข้ามชุดคำสั่งนั้นไป
  • ไวยากรณ์ (Syntax):
Python
if <เงื่อนไข (condition)>:
    # ชุดคำสั่งที่จะทำงานเมื่อเงื่อนไขเป็นจริง
    # (ต้องมีการเยื้องเข้ามา)
    statement_1
    statement_2
    ...
# ชุดคำสั่งต่อไป (อยู่นอกบล็อก if)
  • การทำงาน:
    1. โปรแกรมจะประเมิน <เงื่อนไข>
    2. ถ้าผลลัพธ์ของ <เงื่อนไข> เป็น True ชุดคำสั่งที่อยู่ภายใต้ if (ที่เยื้องเข้าไป) จะถูกทำงาน
    3. ถ้าผลลัพธ์ของ <เงื่อนไข> เป็น False ชุดคำสั่งที่อยู่ภายใต้ if จะถูกข้ามไป และโปรแกรมจะไปทำงานคำสั่งถัดไปที่อยู่นอกบล็อก if
  • ผังงาน (Flowchart):
  • ความสำคัญของการเยื้อง (Indentation):
    • Python ใช้การเยื้อง (โดยทั่วไปคือ 4 เคาะเว้นวรรค หรือ 1 แท็บ) เพื่อกำหนดขอบเขตของชุดคำสั่งที่อยู่ภายใต้ if
    • การเยื้องที่ไม่ถูกต้องจะทำให้เกิด IndentationError หรือทำให้โปรแกรมทำงานผิดพลาด
  • ตัวอย่างโค้ด:
Python
age = int(input("กรุณาป้อนอายุของคุณ: "))
if age >= 18:
    print("คุณเป็นผู้ใหญ่แล้ว")
print("จบการตรวจสอบอายุ") # คำสั่งนี้จะทำงานเสมอ ไม่ว่าเงื่อนไขจะเป็นจริงหรือเท็จ

score = 75
if score >= 50:
    print("ยินดีด้วย! คุณสอบผ่าน")
    print("คุณได้คะแนน:", score)

(4) โครงสร้างควบคุมแบบเลือกทำสองทาง (Two-Way Selection): if-else statement

  • หลักการ: ใช้เมื่อต้องการให้โปรแกรมเลือกทำงานอย่างใดอย่างหนึ่งจากสองทางเลือก โดยขึ้นอยู่กับว่าเงื่อนไขเป็นจริงหรือเท็จ
  • ไวยากรณ์ (Syntax):
Python
if <เงื่อนไข (condition)>:
    # ชุดคำสั่งที่จะทำงานเมื่อเงื่อนไขเป็นจริง
    statement_block_1
else:
    # ชุดคำสั่งที่จะทำงานเมื่อเงื่อนไขเป็นเท็จ
    statement_block_2
# ชุดคำสั่งต่อไป
  • การทำงาน:
    1. โปรแกรมประเมิน <เงื่อนไข>
    2. ถ้าเป็น True ให้ทำ statement_block_1 แล้วข้าม statement_block_2 ไป
    3. ถ้าเป็น False ให้ข้าม statement_block_1 แล้วไปทำ statement_block_2
    4. จะมีเพียงบล็อกเดียวเท่านั้น (ใน if หรือ else) ที่ถูกทำงาน
  • ผังงาน (Flowchart):
  • ตัวอย่างโค้ด:
Python
number = int(input("ป้อนตัวเลขจำนวนเต็ม: "))
if number % 2 == 0:
    print(f"{number} เป็นเลขคู่")
else:
    print(f"{number} เป็นเลขคี่")

temperature = float(input("อุณหภูมิวันนี้ (องศาเซลเซียส): "))
if temperature > 30:
    print("วันนี้อากาศร้อนมาก!")
else:
    print("วันนี้อากาศไม่ร้อนเท่าไหร่")

(5) โครงสร้างควบคุมแบบเลือกทำหลายทาง (Multi-Way Selection): if-elif-else statement

  • หลักการ: ใช้เมื่อมีทางเลือกในการทำงานมากกว่าสองทาง โปรแกรมจะตรวจสอบเงื่อนไขไปตามลำดับ และจะทำงานในบล็อกของเงื่อนไขแรกที่เป็นจริงเท่านั้น
  • ไวยากรณ์ (Syntax):
Python
if <เงื่อนไข_1>:
    # ชุดคำสั่งเมื่อ เงื่อนไข_1 เป็นจริง
    statement_block_1
elif <เงื่อนไข_2>:
    # ชุดคำสั่งเมื่อ เงื่อนไข_1 เป็นเท็จ และ เงื่อนไข_2 เป็นจริง
    statement_block_2
elif <เงื่อนไข_3>:
    # ชุดคำสั่งเมื่อ เงื่อนไข_1,2 เป็นเท็จ และ เงื่อนไข_3 เป็นจริง
    statement_block_3
# ... (สามารถมี elif เพิ่มเติมได้ตามต้องการ)
else:
    # ชุดคำสั่งเมื่อทุกเงื่อนไขข้างบนเป็นเท็จทั้งหมด (เป็นทางเลือกเสริม)
    statement_block_else
# ชุดคำสั่งต่อไป
  • การทำงาน:
    1. ตรวจสอบ <เงื่อนไข_1> ถ้าเป็น True ทำ statement_block_1 แล้วออกจากโครงสร้าง if-elif-else ทั้งหมด
    2. ถ้า <เงื่อนไข_1> เป็น False ให้ตรวจสอบ <เงื่อนไข_2> ถ้าเป็น True ทำ statement_block_2 แล้วออกจากโครงสร้าง
    3. ทำเช่นนี้ไปเรื่อยๆ กับ elif ที่เหลือ
    4. ถ้าทุกเงื่อนไขใน if และ elif ทั้งหมดเป็น False และมี else อยู่ โปรแกรมจะทำ statement_block_else
    5. else เป็นส่วนที่ไม่บังคับ (optional)
  • ผังงาน (Flowchart):
  • ตัวอย่างโค้ด:
Python
score = int(input("ป้อนคะแนนสอบ (0-100): "))
if score >= 80:
    grade = "A"
elif score >= 70:
    grade = "B"
elif score >= 60:
    grade = "C"
elif score >= 50:
    grade = "D"
else:
    grade = "F"
print(f"คุณได้เกรด: {grade}")

choice = input("เลือกเมนู (1=กาแฟ, 2=ชา, 3=น้ำผลไม้): ")
if choice == '1':
    print("คุณเลือกกาแฟ ราคา 50 บาท")
elif choice == '2':
    print("คุณเลือกชา ราคา 40 บาท")
elif choice == '3':
    print("คุณเลือกน้ำผลไม้ ราคา 60 บาท")
else:
    print("คุณเลือกไม่ถูกต้อง กรุณาเลือกใหม่")

(6) การสร้างเงื่อนไขที่ซับซ้อน (Complex Conditions)

  • ทบทวนการใช้ตัวดำเนินการตรรกะ and, or, not เพื่อเชื่อมโยงนิพจน์เปรียบเทียบหลายๆ อันเข้าด้วยกัน
  • ตัวอย่าง:
Python
age = 25
is_student = True
if age < 18:
    print("เป็นผู้เยาว์")
elif age >= 18 and age <= 60:
    print("เป็นวัยทำงาน")
    if is_student: # Nested if example
        print("และยังเป็นนักศึกษา")
else:
    print("เป็นผู้สูงอายุ")

# ตัวอย่างการใช้ or
day = input("วันนี้วันอะไร (เช่น Monday, Sunday): ").capitalize() # ทำให้ตัวแรกเป็นตัวใหญ่
if day == "Saturday" or day == "Sunday":
    print(f"{day} เป็นวันหยุดสุดสัปดาห์!")
else:
    print(f"{day} เป็นวันทำงาน")
  • ลำดับความสำคัญ: not มาก่อน and และ and มาก่อน or ใช้วงเล็บ () เพื่อจัดกลุ่มและทำให้อ่านง่ายขึ้น

(7) (เสริม) คำสั่ง if ซ้อน if (Nested if Statements)

  • แนวคิด: คือการมีโครงสร้าง if (หรือ if-else, if-elif-else) อยู่ภายในบล็อกคำสั่งของโครงสร้าง if (หรือ else, elif) อีกชั้นหนึ่ง
  • ใช้สำหรับกรณีที่การตัดสินใจหนึ่งนำไปสู่การตัดสินใจย่อยๆ อีก
  • ตัวอย่าง:
Python
username = input("Username: ")
if username == "admin":
    password = input("Password: ")
    if password == "secret123":
        print("เข้าสู่ระบบสำเร็จในฐานะผู้ดูแลระบบ")
    else:
        print("รหัสผ่านไม่ถูกต้อง")
elif username == "user":
    print("เข้าสู่ระบบสำเร็จในฐานะผู้ใช้งานทั่วไป")
else:
    print("ไม่พบชื่อผู้ใช้งานนี้")
  • ข้อควรระวัง: การซ้อน if หลายชั้นเกินไปอาจทำให้โค้ดอ่านยากและซับซ้อน ควรพิจารณาทางเลือกอื่นถ้าเป็นไปได้ (เช่น การใช้ and หรือการแยกเป็นฟังก์ชันในภายหลัง)

(8) ความสำคัญของการเยื้อง (Indentation) ใน Python

  • Python ไม่ใช้เครื่องหมาย {} เพื่อกำหนดบล็อกของโค้ดเหมือนภาษาอื่น แต่ใช้ การเยื้อง
  • ทุกคำสั่งที่อยู่ในบล็อกเดียวกันต้องมีการเยื้องในระดับเดียวกัน
  • มาตรฐานคือใช้ 4 เคาะเว้นวรรค (spaces) ต่อการเยื้องหนึ่งระดับ
  • IDE ส่วนใหญ่จะช่วยจัดการการเยื้องอัตโนมัติเมื่อกด Enter หลังเครื่องหมาย :
  • IndentationError: จะเกิดขึ้นถ้าการเยื้องไม่ถูกต้อง หรือไม่สอดคล้องกัน

  • ปฏิบัติการที่ 1: เงื่อนไขเดียวเอาอยู่ (if)
    1. โจทย์ 1.1: ตรวจสอบเลขบวก:
      • คำสั่ง: เขียนโปรแกรมรับค่าตัวเลขจำนวนเต็มจากผู้ใช้ แล้วตรวจสอบว่าเป็นเลขบวก (มากกว่า 0) หรือไม่
      • ถ้าใช่: ให้แสดงข้อความว่า “คุณป้อนเลขบวก”
      • ตัวอย่าง Input/Output:
        • Input: 7 -> Output: คุณป้อนเลขบวก
        • Input: -3 -> (ไม่มี Output จาก if)
        • Input: 0 -> (ไม่มี Output จาก if)
    2. โจทย์ 1.2: ส่วนลดพิเศษ:
      • คำสั่ง: เขียนโปรแกรมรับราคาสินค้าจากผู้ใช้ ถ้าสินค้าราคามากกว่า 1000 บาท
      • ให้แสดงข้อความ: “คุณได้รับส่วนลดพิเศษ 5%!”
      • ตัวอย่าง Input/Output:
        • Input: 1200 -> Output: คุณได้รับส่วนลดพิเศษ 5%!
        • Input: 800 -> (ไม่มี Output)
  • ปฏิบัติการที่ 2: เลือกซ้ายหรือขวา (if-else)
    1. โจทย์ 2.1: เลขคู่เลขคี่:
      • คำสั่ง: เขียนโปรแกรมรับตัวเลขจำนวนเต็มจากผู้ใช้ แล้วตรวจสอบว่าเป็นเลขคู่หรือเลขคี่
      • แสดงผลลัพธ์: เช่น “7 เป็นเลขคี่” หรือ “4 เป็นเลขคู่”
    2. โจทย์ 2.2: ผ่าน/ไม่ผ่าน:
      • คำสั่ง: เขียนโปรแกรมรับคะแนนสอบ (เต็ม 100) จากผู้ใช้
      • เงื่อนไข: ถ้าคะแนนตั้งแต่ 50 ขึ้นไป ให้แสดงข้อความ “ยินดีด้วย! คุณสอบผ่าน” มิฉะนั้น ให้แสดงข้อความ “เสียใจด้วย คุณสอบไม่ผ่าน”
    3. โจทย์ 2.3: วัยรุ่นหรือไม่?:
      • คำสั่ง: เขียนโปรแกรมรับอายุจากผู้ใช้
      • เงื่อนไข: ถ้าอายุอยู่ระหว่าง 13 ถึง 19 ปี (รวมทั้ง 13 และ 19) ให้แสดงข้อความ “คุณเป็นวัยรุ่น” มิฉะนั้นให้แสดงข้อความ “คุณไม่ใช่วัยรุ่น” (แนะนำให้ใช้ตัวดำเนินการ and ในเงื่อนไข)
  • ปฏิบัติการที่ 3: หลากหลายทางเลือก (if-elif-else)
    1. โจทย์ 3.1: ตัดเกรด:
      • คำสั่ง: เขียนโปรแกรมรับคะแนนสอบ (0-100) จากผู้ใช้ แล้วตัดเกรดตามเกณฑ์ต่อไปนี้:
        • คะแนน 80 – 100: เกรด A
        • คะแนน 70 – 79: เกรด B
        • คะแนน 60 – 69: เกรด C
        • คะแนน 50 – 59: เกรด D
        • คะแนน 0 – 49: เกรด F
      • แสดงผลลัพธ์: เช่น “คุณได้เกรด: B”
      • (เสริม): ถ้าคะแนนป้อนมาไม่อยู่ในช่วง 0-100 ให้แสดงว่า “คะแนนไม่ถูกต้อง”
    2. โจทย์ 3.2: ขนาดเครื่องดื่ม:
      • คำสั่ง: เขียนโปรแกรมรับขนาดเครื่องดื่มที่ผู้ใช้ต้องการ โดยผู้ใช้ป้อนเป็นตัวอักษร S, M, หรือ L (ตัวพิมพ์ใหญ่หรือเล็กก็ได้) แล้วแสดงราคา
        • S หรือ s: ราคา 30 บาท
        • M หรือ m: ราคา 40 บาท
        • L หรือ l: ราคา 50 บาท
      • ถ้าผู้ใช้ป้อนขนาดอื่น ให้แสดงข้อความว่า “ขออภัย ไม่มีขนาดที่คุณเลือก”
      • (แนะนำให้ใช้ .upper() หรือ .lower() กับ input เพื่อทำให้การเปรียบเทียบง่ายขึ้น)
    3. โจทย์ 3.3: ทายผลลูกเต๋า:
      • คำสั่ง: เขียนโปรแกรมให้ผู้ใช้ป้อนตัวเลข 1 ถึง 6 ที่คิดว่าเป็นผลจากการทอยลูกเต๋า
      • เงื่อนไขการให้รางวัล:
        • ถ้าทายถูกเป็นเลข 6: แสดง “สุดยอด! คุณทายถูกเลข 6 ได้รางวัลใหญ่!”
        • ถ้าทายเป็นเลข 4 หรือ 5: แสดง “เกือบถูก! คุณทาย [เลขที่ทาย] ได้รางวัลปลอบใจ”
        • ถ้าทายเป็นเลข 1, 2, หรือ 3: แสดง “เสียใจด้วย คุณทาย [เลขที่ทาย] ครั้งหน้าลองใหม่นะ”
        • ถ้าป้อนเลขอื่นนอกเหนือจาก 1-6: แสดง “กรุณาป้อนตัวเลข 1-6 เท่านั้น”
  • ปฏิบัติการที่ 4: เงื่อนไขซับซ้อนขึ้นอีกนิด (ทบทวน and, or, not)
    1. โจทย์ 4.1: สิทธิ์เข้าชมรม:
      • คำสั่ง: เขียนโปรแกรมรับอายุ (ปี) และสถานะการเป็นสมาชิก (ป้อน ‘Y’ ถ้าเป็นสมาชิก, ‘N’ ถ้าไม่เป็น)
      • เงื่อนไขการแสดงผล:
        • ถ้าอายุระหว่าง 18 ถึง 25 ปี และ เป็นสมาชิก: แสดง “คุณมีสิทธิ์เข้าใช้บริการพิเศษของชมรม”
        • ถ้าอายุระหว่าง 18 ถึง 25 ปี แต่ ไม่ได้เป็นสมาชิก: แสดง “กรุณาสมัครสมาชิกเพื่อรับสิทธิ์ใช้บริการพิเศษ”
        • ถ้าอายุไม่อยู่ในช่วง 18-25 ปี: แสดง “คุณยังไม่มีสิทธิ์ใช้บริการนี้”
    2. โจทย์ 4.2: ตรวจสอบวันหยุดสุดสัปดาห์:
      • คำสั่ง: เขียนโปรแกรมรับชื่อวันเป็นภาษาอังกฤษ (เช่น Monday, Tuesday, …, Sunday)
      • เงื่อนไขการแสดงผล:
        • ถ้าเป็น “Saturday” หรือ “Sunday” (ไม่ว่าจะพิมพ์ตัวเล็กหรือตัวใหญ่): แสดง “[ชื่อวัน] เป็นวันหยุดสุดสัปดาห์! พักผ่อนให้เต็มที่”
        • มิฉะนั้น: แสดง “[ชื่อวัน] เป็นวันทำงาน สู้ๆ!”
      • (แนะนำให้ใช้ .lower() หรือ .capitalize() กับ input เพื่อให้ง่ายต่อการเปรียบเทียบ)
  • (เสริม) ปฏิบัติการที่ 5: เงื่อนไขซ้อนเงื่อนไข (Nested if)
    1. โจทย์ 5.1: ตรวจสอบการ Login:
      • คำสั่ง: กำหนด username ที่ถูกต้องเป็น “admin” และ password ที่ถูกต้องเป็น “pass123” ไว้ในโปรแกรม
      • รับ username จากผู้ใช้
      • ถ้า username ที่ป้อนมาตรงกับ “admin”:
        • ให้รับ password จากผู้ใช้
        • ถ้า password ที่ป้อนมาตรงกับ “pass123”: แสดง “Login successful! Welcome Admin.”
        • มิฉะนั้น (password ผิด): แสดง “Incorrect password.”
      • มิฉะนั้น (username ผิด): แสดง “Incorrect username.”

แบบฝึกหัดประยุกต์ (เลือกทำ 1-2 ข้อ หรือเป็นการบ้าน)

  1. โจทย์ประยุกต์ 1: คำนวณค่าส่งพัสดุ:
    • คำสั่ง: เขียนโปรแกรมรับน้ำหนักพัสดุ (หน่วยเป็นกิโลกรัม) จากผู้ใช้
    • เงื่อนไขการคำนวณค่าส่ง:
      • น้ำหนักไม่เกิน 1 กก.: ค่าส่ง 50 บาท
      • น้ำหนักมากกว่า 1 กก. แต่ไม่เกิน 5 กก.: ค่าส่ง 100 บาท
      • น้ำหนักมากกว่า 5 กก. แต่ไม่เกิน 10 กก.: ค่าส่ง 200 บาท
      • น้ำหนักมากกว่า 10 กก.: ค่าส่ง 350 บาท
    • แสดงผล: ค่าส่งที่คำนวณได้
  2. โจทย์ประยุกต์ 2: โปรแกรมร้านกาแฟขนาดเล็ก:
    • คำสั่ง: แสดงเมนูเครื่องดื่มให้ผู้ใช้เลือก:
    • --- Welcome to Our Cafe ---
    • 1. Espresso (50 Baht)
    • 2. Latte (60 Baht)
    • 3. Cappuccino (65 Baht)
    • 4. Americano (45 Baht)
    • Please enter your choice (1-4):
    • รับตัวเลือก (เป็นตัวเลข 1, 2, 3, หรือ 4) จากผู้ใช้
    • แสดงผล: ชื่อเครื่องดื่มและราคาตามที่ผู้ใช้เลือก
    • ถ้าผู้ใช้ป้อนตัวเลือกอื่นนอกเหนือจากนี้: แสดง “Invalid choice. Please try again.”
    • (เสริม): หลังจากผู้ใช้เลือกเครื่องดื่มแล้ว (ถ้าเป็น Espresso, Latte, หรือ Cappuccino) ให้ถามต่อว่า “ต้องการเพิ่มวิปครีมหรือไม่ (Y/N)? (เพิ่ม 10 บาท)”
      • ถ้าตอบ ‘Y’ หรือ ‘y’ ให้บวกราคาเพิ่ม 10 บาท แล้วแสดงราคารวมสุทธิ
      • ถ้าตอบ ‘N’ หรือ ‘n’ หรืออื่นๆ ก็แสดงราคาเดิม
Python
--- Welcome to Our Cafe ---
1. Espresso (50 Baht)
2. Latte (60 Baht)
3. Cappuccino (65 Baht)
4. Americano (45 Baht)
Please enter your choice (1-4):

พิเศษใส่ไข่

จงเขียนโปรแกรมคำนวณตามกฏของโฮห์มให้มีการทำงานดังนี้

Python
---โปรแกรมคำนวณ Ohm's Law---
1. คำนวณแรงดัน (Voltage)
2. คำนวณกระแส (Current)
3. คำนวณความต้านทาน (Resistance)
กรุณาเลือกตัวเลือก (1/2/3):

จากนั้นให้รับค่าแล้วคำนวณตามสูตร แล้วแาดงผลลัพธ์

สร้างขึ้นด้วย Padlet