EP05: การทำงานซ้ำด้วยโครงสร้างควบคุมแบบวนซ้ำ (Loops)

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

  • โครงสร้างควบคุมแบบเลือกทำ: ทบทวนคำสั่ง if, elif, else และการสร้างเงื่อนไข
  • นิพจน์เงื่อนไข (Boolean Expressions): การใช้ตัวดำเนินการเปรียบเทียบ (==, !=, >, <, >=, <=) และตัวดำเนินการตรรกะ (and, or, not) ที่ให้ผลลัพธ์เป็น True หรือ False ซึ่งสำคัญต่อการควบคุม while loop

(2) แนวคิดเรื่องการวนซ้ำ (Iteration/Repetition)

  • ทำไมต้องใช้ Loop?
    • ประสิทธิภาพ: ลดการเขียนโค้ดที่ซ้ำซ้อนเมื่อต้องการทำงานอย่างเดียวกันหลายๆ ครั้ง
    • การประมวลผลข้อมูลชุดใหญ่: สามารถทำงานกับข้อมูลจำนวนมากทีละรายการได้ เช่น การอ่านข้อมูลนักเรียนทุกคนในห้อง
    • การสร้างรูปแบบซ้ำๆ: เช่น การวาดตาราง, การแสดงผลเป็นชุด
  • อุปมาอุปมัยในชีวิตประจำวัน:
    • การแปรงฟัน (ทำซ้ำจนกว่าจะสะอาด)
    • การรับประทานอาหาร (ตักอาหารเข้าปากซ้ำๆ จนกว่าจะอิ่มหรือหมดจาน)
    • การนับเลข 1 ถึง 10

(3) โครงสร้างควบคุมแบบวนซ้ำประเภทกำหนดจำนวนรอบ (for loop – Definite Loop)

  • หลักการ: ใช้เมื่อทราบจำนวนครั้งที่ต้องการให้โปรแกรมทำงานซ้ำ หรือเมื่อต้องการวนซ้ำกับสมาชิกทุกตัวในกลุ่มข้อมูล (sequence)
  • ไวยากรณ์ (Syntax):
Python
for <ตัวแปรควบคุม (loop variable)> in <กลุ่มข้อมูล (sequence)>:
    # ชุดคำสั่งที่จะทำงานซ้ำ (ต้องมีการเยื้อง)
    statement_1
    statement_2
    ...
# ชุดคำสั่งต่อไป (อยู่นอกบล็อก for)
  • ตัวแปรควบคุม (loop variable): จะรับค่าสมาชิกแต่ละตัวจากกลุ่มข้อมูลมาทีละตัวในแต่ละรอบ
  • กลุ่มข้อมูล (sequence): อาจเป็น range(), สตริง, ลิสต์, ทูเพิล ฯลฯ
  • การใช้ for loop กับฟังก์ชัน range():
    • range(stop): สร้างลำดับตัวเลขตั้งแต่ 0 จนถึง stop-1
      • ตัวอย่าง: for i in range(5): print(i) จะแสดงผล 0, 1, 2, 3, 4
    • range(start, stop): สร้างลำดับตัวเลขตั้งแต่ start จนถึง stop-1
      • ตัวอย่าง: for i in range(1, 6): print(i) จะแสดงผล 1, 2, 3, 4, 5
    • range(start, stop, step): สร้างลำดับตัวเลขตั้งแต่ start จนถึง stop-1 โดยเพิ่ม/ลดทีละ step
      • ตัวอย่าง 1 (เพิ่ม): for i in range(2, 11, 2): print(i) จะแสดงผล 2, 4, 6, 8, 10
      • ตัวอย่าง 2 (ลด): for i in range(5, 0, -1): print(i) จะแสดงผล 5, 4, 3, 2, 1
  • การใช้ for loop กับลำดับข้อมูลอื่นๆ:
    • สตริง (String): วนซ้ำเพื่อเข้าถึงอักขระแต่ละตัวในสตริง
Python
message = "Hello"
for char in message:
    print(char)
# Output:
# H
# e
# l
# l
# o
  • (เกริ่นนำ) ลิสต์ (List), ทูเพิล (Tuple): (จะเรียนละเอียดในหน่วยถัดไป) สามารถวนซ้ำเพื่อเข้าถึงสมาชิกแต่ละตัวได้เช่นกัน
Python
# ตัวอย่างกับลิสต์ (จะเรียนในหน่วยที่ 6)
# numbers = [10, 20, 30]
# for num in numbers:
#     print(num)
  • ผังงาน (Flowchart) ของ for loop (แบบง่ายสำหรับ range):

(4) โครงสร้างควบคุมแบบวนซ้ำประเภทมีเงื่อนไข (while loop – Indefinite Loop)

  • หลักการ: ใช้เมื่อต้องการให้โปรแกรมทำงานซ้ำตราบใดที่เงื่อนไขที่กำหนดยังคงเป็นจริง โดยไม่จำเป็นต้องทราบจำนวนรอบที่แน่นอนล่วงหน้า
  • ไวยากรณ์ (Syntax):
Python
while <เงื่อนไข (condition)>:
    # ชุดคำสั่งที่จะทำงานซ้ำ (ต้องมีการเยื้อง)
    statement_1
    statement_2
    # ...ต้องมีคำสั่งที่ทำให้เงื่อนไขมีโอกาสเป็นเท็จ...
# ชุดคำสั่งต่อไป (อยู่นอกบล็อก while)
  • ส่วนประกอบสำคัญของ while loop ที่ต้องพิจารณา:
    1. การกำหนดค่าเริ่มต้น (Initialization): การกำหนดค่าเริ่มต้นให้กับตัวแปรที่ใช้ใน <เงื่อนไข> ก่อนที่ loop จะเริ่มทำงาน
    2. เงื่อนไข (Condition): นิพจน์ที่ให้ค่าเป็น Boolean (True หรือ False) จะถูกตรวจสอบก่อนเข้าทำงานในแต่ละรอบ
    3. การปรับปรุงค่า (Update/Modification): คำสั่งภายใน loop ที่จะปรับปรุงค่าของตัวแปรที่ใช้ใน <เงื่อนไข> เพื่อให้เงื่อนไขนั้นมีโอกาสกลายเป็น False และ loop สามารถจบการทำงานได้
  • Infinite Loop (การวนซ้ำไม่รู้จบ):
    • เกิดขึ้นเมื่อ <เงื่อนไข> ของ while loop เป็น True เสมอ และไม่มีการปรับปรุงค่าที่ทำให้เงื่อนไขเป็น False ได้
    • วิธีหยุดโปรแกรมที่ติด Infinite Loop ใน Terminal/Console ส่วนใหญ่คือการกด Ctrl+C
    • ตัวอย่าง Infinite Loop (ที่ควรหลีกเลี่ยง):
Python
# count = 1
# while count <= 5: # ไม่มี count += 1 ใน loop
#     print("Looping...")
  • ผังงาน (Flowchart) ของ while loop:
  • ตัวอย่างโค้ด:
Python
# ตัวอย่างที่ 1: นับเลข 1 ถึง 5
count = 1  # Initialization
while count <= 5:  # Condition
    print(count)
    count += 1  # Update
print("Loop finished")

# ตัวอย่างที่ 2: รอรับ input จนกว่าผู้ใช้จะพิมพ์ 'exit'
command = ""
while command.lower() != "exit":
    command = input("Enter command (type 'exit' to quit): ")
    if command.lower() != "exit":
        print(f"Executing: {command}")
print("Exiting program.")

(5) คำสั่งควบคุมการทำงานภายใน Loop (Loop Control Statements) (ประมาณ 15-20 นาที)

  • break statement:
    • หลักการ: ใช้เพื่อสั่งให้ออกจาก loop (ทั้ง for และ while) ทันที โดยไม่สนใจว่าเงื่อนไขของ loop จะยังเป็นจริงอยู่หรือไม่ หรือยังวนไม่ครบรอบ
    • มักใช้ร่วมกับคำสั่ง if เพื่อตรวจสอบเงื่อนไขพิเศษบางอย่างภายใน loop
    • ตัวอย่าง:
Python
for i in range(1, 11): # วน 1 ถึง 10
    if i == 5:
        print("Found 5, breaking loop!")
        break  # ออกจาก for loop ทันที
    print(i)
print("After loop")
# Output: 1, 2, 3, 4, Found 5, breaking loop!, After loop
  • continue statement:
    • หลักการ: ใช้เพื่อสั่งให้ข้ามการทำงานของคำสั่งที่เหลือทั้งหมดในรอบปัจจุบันของ loop และเริ่มการทำงานของ loop ในรอบถัดไปทันที
    • มักใช้ร่วมกับคำสั่ง if เพื่อข้ามบางกรณีที่ไม่ต้องการประมวลผล
    • ตัวอย่าง:
Python
for i in range(1, 6): # วน 1 ถึง 5
    if i == 3:
        print("Skipping 3")
        continue # ข้ามไปรอบถัดไป ไม่ print(i) สำหรับ i=3
    print(i)
print("After loop")
# Output: 1, 2, Skipping 3, 4, 5, After loop

(6) (เสริม) else clause ใน Loop (ประมาณ 5-10 นาที)

  • หลักการ: สามารถใช้ else: ต่อท้ายโครงสร้าง for loop หรือ while loop ได้
  • การทำงาน: บล็อกคำสั่งในส่วน else จะถูกทำงานก็ต่อเมื่อ loop นั้นทำงานจนจบครบทุกรอบตามปกติ (คือ ไม่ได้ ถูกสั่งให้ออกจาก loop ด้วยคำสั่ง break)
  • ตัวอย่างกับ for loop:
Python
numbers = [1, 3, 7, 9]
search_value = 5
for num in numbers:
    if num == search_value:
        print(f"Found {search_value}!")
        break
else: # ทำงานเมื่อ for loop จบปกติ (ไม่เจอ break)
    print(f"{search_value} not found in the list.")
# Output: 5 not found in the list.

search_value = 7
for num in numbers:
    if num == search_value:
        print(f"Found {search_value}!")
        break
else:
    print(f"{search_value} not found in the list.")
# Output: Found 7!
  • ตัวอย่างกับ while loop:
Python
count = 0
while count < 3:
    print(f"Count is {count}")
    count += 1
    # if count == 2: break # ลอง uncomment บรรทัดนี้ดู
else:
    print("Loop finished normally.")
# Output (ไม่มี break): Count is 0, Count is 1, Count is 2, Loop finished normally.
# Output (มี break ตอน count == 2): Count is 0, Count is 1 (แล้วหลุดจาก loop, else ไม่ทำงาน)

(7) (เสริม) Loop ซ้อน Loop (Nested Loops) (ประมาณ 10 นาที)

  • แนวคิด: การมีโครงสร้าง loop หนึ่ง (เรียกว่า Inner loop) อยู่ภายในบล็อกคำสั่งของ loop อีกตัวหนึ่ง (เรียกว่า Outer loop)
  • การทำงาน: ในแต่ละรอบของ Outer loop, Inner loop จะทำงานซ้ำจนครบทุกรอบของมัน
  • ตัวอย่างการใช้งาน:
    • การสร้างตาราง (เช่น ตารางสูตรคูณ)
    • การประมวลผลข้อมูลที่มีลักษณะเป็นสองมิติ (เช่น pixel ในภาพ, ช่องในตาราง)
    • การสร้างรูปแบบต่างๆ
  • ตัวอย่างโค้ด (ตารางสูตรคูณ):
Python
for i in range(1, 4):  # Outer loop (แม่สูตรคูณ)
    print(f"--- Multiplication Table for {i} ---")
    for j in range(1, 6):  # Inner loop (ตัวคูณ)
        print(f"{i} x {j} = {i*j}")
    print("-" * 20) # เส้นคั่น

  • ปฏิบัติการที่ 1: วนด้วย for และ range()
    1. โจทย์ 1.1: แสดงตัวเลข 1 ถึง 10:
      • คำสั่ง: เขียนโปรแกรมเพื่อแสดงตัวเลขตั้งแต่ 1 ถึง 10 ออกทางหน้าจอ โดยแต่ละตัวเลขอยู่คนละบรรทัด
    2. โจทย์ 1.2: แสดงเลขคู่ตั้งแต่ 2 ถึง 20:
      • คำสั่ง: เขียนโปรแกรมเพื่อแสดงเลขคู่ตั้งแต่ 2 ถึง 20 (รวม 20) ออกทางหน้าจอ
    3. โจทย์ 1.3: แสดงตัวเลข 5 ถึง 1 (นับถอยหลัง):
      • คำสั่ง: เขียนโปรแกรมเพื่อแสดงตัวเลขนับถอยหลังจาก 5 ลงไปจนถึง 1
    4. โจทย์ 1.4: ผลบวกของตัวเลข 1 ถึง N:
      • คำสั่ง: เขียนโปรแกรมรับค่าตัวเลขจำนวนเต็ม N จากผู้ใช้ จากนั้นคำนวณและแสดงผลบวกของตัวเลขทั้งหมดตั้งแต่ 1 จนถึง N
      • ตัวอย่าง Input: N = 5
      • ตัวอย่าง Output: ผลบวกตั้งแต่ 1 ถึง 5 คือ 15
  • ปฏิบัติการที่ 2: วนกับสตริงด้วย for
    1. โจทย์ 2.1: แสดงอักขระในสตริง:
      • คำสั่ง: เขียนโปรแกรมรับข้อความ (สตริง) จากผู้ใช้ แล้วแสดงอักขระแต่ละตัวในข้อความนั้นออกมาทางหน้าจอ บรรทัดละหนึ่งอักขระ
    2. โจทย์ 2.2: นับจำนวนสระ:
      • คำสั่ง: เขียนโปรแกรมรับข้อความ (สตริง) จากผู้ใช้ แล้วนับและแสดงจำนวนสระ (a, e, i, o, u ทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ที่มีอยู่ในข้อความนั้น
      • ตัวอย่าง Input: “Hello World”
      • ตัวอย่าง Output: จำนวนสระในข้อความคือ 3
  • ปฏิบัติการที่ 3: วนด้วย while อย่างมีสติ
    1. โจทย์ 3.1: while นับเลข 1 ถึง 5:
      • คำสั่ง: เขียนโปรแกรมเพื่อแสดงตัวเลข 1 ถึง 5 โดยใช้ while loop
    2. โจทย์ 3.2: บวกเลขไปเรื่อยๆ จนกว่าจะป้อน 0:
      • คำสั่ง: เขียนโปรแกรมรับตัวเลขจำนวนเต็มจากผู้ใช้ไปเรื่อยๆ และทำการบวกสะสมค่าเหล่านั้น จนกว่าผู้ใช้จะป้อนเลข 0 ให้หยุดรับค่าแล้วแสดงผลบวกสะสมทั้งหมด (ไม่รวมเลข 0 ที่ใช้หยุด)
    3. โจทย์ 3.3 (เกมทายตัวเลข):
      • คำสั่ง: ให้โปรแกรมสุ่มตัวเลขจำนวนเต็มระหว่าง 1 ถึง 10 ขึ้นมาหนึ่งตัว (ใช้โค้ดนี้ในการสุ่ม: import random; secret_number = random.randint(1, 10)) จากนั้นให้ผู้ใช้ทายตัวเลขไปเรื่อยๆ จนกว่าจะทายถูก
      • ในแต่ละครั้งที่ผู้ใช้ทายผิด ให้โปรแกรมบอกใบ้ว่าตัวเลขที่ทายนั้น “มากไป” หรือ “น้อยไป”
      • เมื่อผู้ใช้ทายถูก ให้แสดงข้อความยินดีและจำนวนครั้งที่ผู้ใช้ทาย
      • ตัวอย่างการเล่น:
Python
(โปรแกรมสุ่มได้เลข 7)
ทายตัวเลข (1-10): 5
น้อยไป!
ทายตัวเลข (1-10): 8
มากไป!
ทายตัวเลข (1-10): 7
ถูกต้อง! คุณทายไปทั้งหมด 3 ครั้ง
  • ปฏิบัติการที่ 4: ควบคุม Loop ด้วย break และ continue
    1. โจทย์ 4.1 (ใช้ break): ผลรวมเลขบวก (หยุดเมื่อเจอเลขลบ):
      • คำสั่ง: เขียนโปรแกรมรับตัวเลขจำนวนเต็ม 5 จำนวนจากผู้ใช้เพื่อหาผลรวม แต่ถ้าผู้ใช้ป้อนตัวเลขที่เป็นค่าลบ ให้หยุดการรับข้อมูลทันที (แม้จะยังไม่ครบ 5 จำนวน) แล้วแสดงผลรวมของตัวเลขบวกที่ป้อนเข้ามาก่อนหน้านั้น
    2. โจทย์ 4.2 (ใช้ continue): แสดงเฉพาะเลขคี่:
      • คำสั่ง: เขียนโปรแกรมเพื่อแสดงตัวเลขจำนวนเต็มตั้งแต่ 1 ถึง 10 แต่ให้ข้าม (ไม่แสดงผล) ตัวเลขที่เป็นเลขคู่
  • (เสริม) ปฏิบัติการที่ 5: else ใน Loop และ Nested Loops
    1. โจทย์ 5.1 (ใช้ else กับ for): ค้นหาตัวเลข:
      • คำสั่ง: กำหนดลิสต์ของตัวเลขไว้ในโปรแกรม เช่น my_numbers = [11, 23, 8, 42, 17, 5]
      • เขียนโปรแกรมรับตัวเลขหนึ่งตัวจากผู้ใช้เพื่อค้นหาในลิสต์
      • ถ้าเจอตัวเลขนั้นในลิสต์ ให้แสดงข้อความ “เจอตัวเลข [เลขที่ค้นหา] ในลิสต์!” แล้วออกจาก loop (ใช้ break)
      • ถ้าวน loop จนจบแล้วไม่เจอตัวเลขนั้น ให้ (ในบล็อก else ของ loop) แสดงข้อความ “ไม่เจอตัวเลข [เลขที่ค้นหา] ในลิสต์”
    2. โจทย์ 5.2 (ใช้ Nested for loops): ตารางสูตรคูณ:
      • คำสั่ง: เขียนโปรแกรมเพื่อแสดงตารางสูตรคูณตั้งแต่แม่ 2 ถึง แม่ 5 โดยแต่ละแม่ให้คูณถึง 12
      • ตัวอย่าง Output (บางส่วน):
Python
--- สูตรคูณแม่ 2 ---
2 x 1 = 2
2 x 2 = 4
...
2 x 12 = 24
--------------------
--- สูตรคูณแม่ 3 ---
3 x 1 = 3
...
  • แบบฝึกหัดประยุกต์ (เลือกทำ 1-2 ข้อ หรือเป็นการบ้าน)
    1. โจทย์ประยุกต์ 1: คำนวณค่าเฉลี่ยของคะแนน N วิชา:
      • คำสั่ง: เขียนโปรแกรมรับจำนวนวิชา (N) จากผู้ใช้ จากนั้นให้ผู้ใช้ป้อนคะแนนของแต่ละวิชาทีละวิชาจนครบ N วิชา แล้วคำนวณและแสดงค่าเฉลี่ยของคะแนนทั้งหมด
    2. โจทย์ประยุกต์ 2: วาดรูปสามเหลี่ยมมุมฉากด้วยดอกจัน:
      • คำสั่ง: เขียนโปรแกรมรับจำนวนแถว (rows) จากผู้ใช้ แล้วแสดงผลเป็นรูปสามเหลี่ยมมุมฉากที่สร้างจากเครื่องหมายดอกจัน (*)
      • ตัวอย่าง Input: rows = 4
      • ตัวอย่าง Output:
Python
*
**
***
****
  • คำใบ้: อาจจะต้องใช้ Nested loops โดย loop นอกควบคุมจำนวนแถว และ loop ในควบคุมจำนวนดอกจันในแต่ละแถว