while-Loop (Control Structure 2)
การประมวลผลคำสั่งซ้ำ ๆ หลายรอบ
การทำซ้ำ หรือ การประมวลผลซ้ำ
Note
True — โปรแกรมจะวนทำคำสั่งหรือชุดคำสั่งที่อยู่ภายในลูปซ้ำอีกFalse — โปรแกรมจะออกจากลูป แล้วทำงานคำสั่งถัดไป (next-statement)คำสั่งในการทำซ้ำ ที่นิยมใช้อย่างแพร่หลาย มี 2 แบบ ได้แก่
while statementfor statementโดยทั้งสองแบบ ยังสามารถใช้ควบคู่กับคำสั่ง break และ continue เพื่อเสริมการกำหนดรอบการทำซ้ำได้อีกด้วย
คุ้มไหมที่จะเขียนลูป automate งานซ้ำ ๆ?

ที่มา: xkcd #1205 — “Is It Worth the Time?” (CC BY-NC 2.5)
วนลูปตราบเท่าที่เงื่อนไขยังเป็นจริง
if → while: ต่างกันแค่ “วนกลับ”โค้ด หน้าตาเหมือนกันเป๊ะ ต่างแค่ keyword — แต่ผลลัพธ์ต่างกันมาก!
Important
if เช็คเงื่อนไข ครั้งเดียว · while พอจบบล็อกจะ กระโดดกลับไปเช็คเงื่อนไขใหม่ — วนซ้ำจนเงื่อนไขเป็นเท็จ
if ไปทางเดียว · while วนกลับif — ไหลลงทางเดียว ⬇️
while — มีลูกศร “วนกลับ” 🔁
ต่างกันแค่ ลูกศรสีแดง ของ while ที่พาการทำงาน กลับไปเช็คเงื่อนไขอีกครั้ง
condition)True โปรแกรมจะเข้าลูปไปทำ statement1, statement2, …condition อีกครั้งTrueFalse โปรแกรมจะออกจากลูป เพื่อทำ next-statement ต่อไปเพื่อควบคุมจำนวนรอบการทำงานของลูป while จำเป็นต้องออกแบบ 3 ส่วนประกอบ
x=0, y=100, ans="n"True) หรือไม่ เช่น x<10, x>-5, ans!="y"x+=1, x-=1, ans=input()
Tip
หากลืม update ตัวแปรเงื่อนไข ลูปจะวนไม่รู้จบ (infinite loop)
1 ถึง n)จงเขียนโปรแกรมแสดงเลข 1 ถึง n โดยใช้คำสั่ง while (n รับจากผู้ใช้)
กำหนด i=1 (Initialization) แล้ววนลูปตราบที่ i <= n
คิดก่อน: จะให้ลูปหยุดเมื่อใด และต้องเพิ่มค่า i อย่างไร?
Init: i=1 · Condition: i<=n · Update: i+=1
Note
n)จงเขียนโปรแกรมแสดงสูตรคูณแม่ n ตั้งแต่ \(1\times n\) ถึง \(12\times n\) โดยใช้ while
ใช้ i เป็นตัวคูณ เริ่มที่ i=1 แล้วพิมพ์ i*n ในแต่ละรอบ
จากโจทย์ #2a จงแสดงผลทีละบรรทัด บรรทัดละ 5 จำนวน โดยจัดช่องไฟให้เท่ากันด้วย f"{i*n:4}"
ขึ้นบรรทัดใหม่เมื่อ i = 5, 10, 15, … ซึ่งตรวจได้ด้วยเงื่อนไข i % 5 == 0
คิดก่อน: จะใช้ print() ว่าง ๆ เพื่อขึ้นบรรทัดใหม่เมื่อใด?
ลูปเดียว (i = 1..12) พิมพ์ต่อกันเป็นแถว — ทุกครั้งที่ i % 5 == 0 → print() ขึ้นบรรทัดใหม่
🔵 แถว 1 (i=1-5) · 🟢 แถว 2 (i=6-10) · 🟡 แถว 3 (i=11-12) — ลูป มิติเดียว ถูก i % 5 == 0 ตัดเป็น ตาราง 3 แถว
จงเขียนโปรแกรมหาผลบวกกำลังสองของเลขคี่ระหว่าง 1 ถึง n
\[1^2 + 3^2 + 5^2 + 7^2 + \ldots + n^2\]
13 → ได้ 45520 → ได้ 1330คิดก่อน: จะนับจากมากไปน้อย หรือน้อยไปมากดี? (มี 2 วิธี)
ใช้ n นับถอยหลัง n, n-1, …, 1 วนลูปตราบที่ n > 0
ในแต่ละรอบ: ถ้า n เป็นเลขคี่ ให้บวก n**2 เข้ากับ Sum แล้วลดค่า n ลงหนึ่ง
Init: input() · Condition: n>0 · Update: n-=1
Note
ทบทวน: Arithmetic % ** (Module 3) · if (Module 5)
ใช้ i นับขึ้น 1, 2, …, n วนลูปตราบที่ i <= n โดยไม่แก้ไขค่า n
คิดก่อน: วิธีนี้ต้องเพิ่มตัวแปรอะไร เทียบกับวิธีที่ 1?
Init: i=1 · Condition: i<=n · Update: i+=1
y)จงเขียนโปรแกรมเพื่อรับข้อมูลเรื่อย ๆ จนกว่าผู้ใช้จะป้อนค่า "y"
กำหนด ans เริ่มต้นเป็นค่าใดก็ได้ ยกเว้น "y" (เพื่อให้เข้าลูปรอบแรกได้) แล้ววนลูปตราบที่ ans != "y"
คิดก่อน: ทำไม ans เริ่มต้นจึงห้ามเป็น "y"?
Note
ทบทวน: input() (Module 3)
ลูปที่ไม่เข้า และลูปที่ไม่จบ
นักศึกษาต้องการให้พิมพ์ 6 7 8 9 10 exit-loop จึงเขียนโค้ดนี้ — เหตุใดจึงไม่ได้ผลลัพธ์ตามต้องการ?
นักศึกษาต้องการให้พิมพ์ 2 3 4 5 6 7 8 9 10 exit-loop จึงเขียนโค้ดนี้ — เหตุใดจึงไม่ได้ผลลัพธ์ตามต้องการ?
whileกับดัก 1 — False ตั้งแต่แรก → ไม่เข้าลูป (โจทย์ #5)
เงื่อนไขเป็นเท็จทันที → ข้ามงานในลูปทั้งหมด
กับดัก 2 — True เสมอ → วนไม่จบ (โจทย์ #6)
x -= 1 ทำให้ x วิ่งห่างจากเงื่อนไข → ลูปไม่จบ
ตรวจสอบเงื่อนไข (Condition) ว่าเป็น True หรือ False เสมอหรือไม่
False เสมอ = โค้ดในลูปไม่ถูกเรียกใช้True เสมอ = ลูปไม่จบการทำงานตรวจสอบตัวแปรที่ใช้ทดสอบเงื่อนไขของ while
True และ False หรือไม่หยุดลูปทันที
break = จบลูป ทันที แล้วออกไปทำ next-statement
if — เมื่อเงื่อนไขจริง ก็ หยุดวนทันทีNote
🔴 เส้นแดง = break พุ่งออกจากลูป ⚪ เส้นประเทา = วนปกติ (เมื่อ “ไม่เจอ”)
โปรแกรมต่อไปนี้พิมพ์เลข 11, 12, …, 20 จงแก้ไขให้พิมพ์ถึงแค่ 14 โดยใช้ break
โปรแกรมต่อไปนี้วนลูปไม่รู้จบ (while True) จงใช้ break ทำให้พิมพ์ค่า 10 ออกมา
ข้ามรอบปัจจุบัน แล้ววนต่อ
continue = จบ เฉพาะรอบนี้ แล้วกระโดดกลับไปเช็คเงื่อนไขรอบถัดไป
Note
🟠 เส้นส้ม = continue กลับไปเช็คเงื่อนไข โดย ข้าม “งานหลัง if” ของรอบนั้น
Note
เทียบกับ break — break หยุดลูปอย่างสมบูรณ์โดยไม่กลับไปตรวจเงื่อนไข ส่วน continue กลับไปตรวจเงื่อนไขทันที จึงมีโอกาสทำงานในรอบถัดไปอีก
โปรแกรมต่อไปนี้พิมพ์เลข 11, 12, …, 20 จงแก้ไขให้ยังคงพิมพ์ทั้งหมด ยกเว้นเลข 15 โดยใช้ continue
คิดก่อน: เมื่อ a เท่ากับ 15 ต้องการให้ข้ามไปทำรอบใหม่โดยไม่พิมพ์ — ใช้คำสั่งใด?
การทำซ้ำ (Iteration)
True ออกจากลูปเมื่อเป็น Falseส่วนประกอบของลูป
ปัญหาที่พบบ่อย
False เสมอ → ไม่เข้าลูปTrue เสมอ → ลูปไม่จบbreak / continue
break — จบลูปทันที ไปทำ next-statementcontinue — จบรอบนั้น แล้ววนกลับไปตรวจเงื่อนไขรอบถัดไปTip
อย่าลืม update ตัวแปรเงื่อนไข มิฉะนั้นลูปจะไม่จบ
🏠 259201 — Module 6 | ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเชียงใหม่