8. การทำซ้ำ หรือ การวนลูป (for-while)
นี่คือหัวข้อสุดท้ายของหลักสูตรพื้นฐาน 1 นะครับ และเป็นหัวข้อที่สำคัญที่สุดของการเขียนโปรแกรมเลยก็ว่าได้ หากใครไม่เข้าใจหัวข้อนี้ ชีวิตการเขียนโปรแกรมจะยากลำบากมากแน่นอนครับ
การทำซ้ำ หรือ วนลูปนั้น ถูกทำขึ้นมาเพื่อลดขั้นตอนการเขียนโปรแกรมให้สั้นลง ตัวอย่างเช่น ถ้าหากเราต้องการแสดงตัวเลข 1 ถึง 100 หากไม่ใช้การวนลูปเราก็ต้องพิมพ์คำสั่ง disp(1) ถึง disp(100) ซึ่งคงเป็นเรื่องที่น่าเบื่อน่าดู แต่หากใช้การวนลูปนั้นชีวิตของเราจะง่ายขึ้นมา ดังนั้นเรามาดูการวนลูปแต่ละแบบกันเลยนะครับ
for start:step:end
…code…
end
*หมายเหตุ ถ้าหากค่า step เท่ากับ 1 เราสามารถละไว้ โดยไม่เขียนได้ กลายเป็น start:end
ตัวอย่างเช่น
1. ให้เขียนโปรแกรมแสดงตัวเลข 1 ถึง 20
รูปภาพข้างต้นนั้น ด้านซ้ายมือ คือ flow chart ส่วนด้านขวามือ คือ โค้ดโปรแกรมที่ได้จากการเขียนตาม flow chart
บรรทัดแรก clc;clear;
เป็นการเคลียร์ข้อมูล ซึ่งจะใส่หรือไม่ใส่ก็ได้ แต่โดยปกติผมจะใส่ไว้ในโปรแกรมเสมอ
ส่วนบรรทัดที่ 2-4 นั้นเป็นรูปแบบของ for-loop ซึ่งถ้าหากดูใน flow chart จะเห็นว่า m=1 คือค่าเริ่มต้น
ดังนั้น m=1 จึงถูกนำมาเขียนไว้ในตำแหน่ง “start”
ส่วนคำสั่ง m = m+1 ถ้าดูตามสมการนี้ก็คือ m จะมีค่าเพิ่มขึ้นทีละ 1 ทุกครั้งที่ทำซ้ำ ซึ่งกระบวนการนี้ตรงกับคำว่า “step” ซึ่งหมายความว่า ขั้นตอนการเปลี่ยนแปลงของค่า start จนถึง end เป็นอย่างไร และถ้ากลับไปดูที่หัวข้อการสร้างอาเรย์แบบใช้ตัวช่วย เราจะเห็นว่า colon ( : ) ใช้ในการสร้างอาเรย์ 1 มิติ ดังนั้นหากเราเอาโค้ด
>> m = 1:1:20;
ไปรันใน command window ก็จะเห็นว่า m มีค่าเริ่มต้นที่ 1 และเพิ่มทีละ 1 จนถึง 20 ดังนั้นรูปแบบการสร้างอาเรย์ 1 มิติแบบนี้ จึงถูกนำมาใช้เป็นเงื่อนไขของ for-loop เพราะให้ความหมายตรงกับเงื่อนไขของ for-loop
while(cond)
…code…
end
การวนลูปของ while จะต่างจาก for ตรงที่ ค่า start, step, end จะไม่ถูกระบุไว้ในฟอร์มรูปแบบของการวนลูป ซึ้งคำว่า “ไม่ระบุ” ไม่ได้หมายความว่าจำเป็นต้องเขียนเอาไว้ที่อื่น แต่หมายความว่า “มีหรือไม่มีก็ได้”
ดังนั้นข้อแตกต่างที่ชัดเจนระหว่าง for และ while คือ for-loop ใช้สำหรับการวนลูปที่มีจุดเริ่มต้นและจุดสิ้นสุดที่แน่นอน เช่นการวนลูปเพื่ออ่านค่าในอาเรย์ ส่วน while-loop นั้นเป็นการวนลูปแบบไม่มีจุดเริ่มต้น และไม่มีจุดสิ้นสุดที่แน่นอน ดังนั้น while-loop จึงถูกนำมาใช้สำหรับการทำซ้ำที่ไม่รู้จำนวนรอบที่แน่นอน เช่น วนลูปรับค่าจาก user ไปเรื่อยๆ จนกว่า user จะป้อนคำว่า “stop”
วิธีการหยุดการทำงานของ loop หรือ การออกจาก loop มีอยู่ 2 วิธีคือ
1. เงื่อนไขของ loop กลายเป็นเท็จ
2. ใช้คำสั่ง break
ซึ่งทั้ง 2 วิธีนี้ใช้ได้ทั้ง for-loop และ while-loop
ในตัวอย่างต่อไปนี้ เราจะใช้ while-loop เพื่อเขียนโปรแกรมเดียวกันกับ for-loop ก่อนหน้านี้
การทำซ้ำ หรือ วนลูปนั้น ถูกทำขึ้นมาเพื่อลดขั้นตอนการเขียนโปรแกรมให้สั้นลง ตัวอย่างเช่น ถ้าหากเราต้องการแสดงตัวเลข 1 ถึง 100 หากไม่ใช้การวนลูปเราก็ต้องพิมพ์คำสั่ง disp(1) ถึง disp(100) ซึ่งคงเป็นเรื่องที่น่าเบื่อน่าดู แต่หากใช้การวนลูปนั้นชีวิตของเราจะง่ายขึ้นมา ดังนั้นเรามาดูการวนลูปแต่ละแบบกันเลยนะครับ
8.1 การวนลูปด้วย for
รูปแบบของคำสั่ง for มีดังนี้for start:step:end
…code…
end
*หมายเหตุ ถ้าหากค่า step เท่ากับ 1 เราสามารถละไว้ โดยไม่เขียนได้ กลายเป็น start:end
ตัวอย่างเช่น
1. ให้เขียนโปรแกรมแสดงตัวเลข 1 ถึง 20
รูปภาพข้างต้นนั้น ด้านซ้ายมือ คือ flow chart ส่วนด้านขวามือ คือ โค้ดโปรแกรมที่ได้จากการเขียนตาม flow chart
บรรทัดแรก clc;clear;
เป็นการเคลียร์ข้อมูล ซึ่งจะใส่หรือไม่ใส่ก็ได้ แต่โดยปกติผมจะใส่ไว้ในโปรแกรมเสมอ
ส่วนบรรทัดที่ 2-4 นั้นเป็นรูปแบบของ for-loop ซึ่งถ้าหากดูใน flow chart จะเห็นว่า m=1 คือค่าเริ่มต้น
ดังนั้น m=1 จึงถูกนำมาเขียนไว้ในตำแหน่ง “start”
ส่วนคำสั่ง m = m+1 ถ้าดูตามสมการนี้ก็คือ m จะมีค่าเพิ่มขึ้นทีละ 1 ทุกครั้งที่ทำซ้ำ ซึ่งกระบวนการนี้ตรงกับคำว่า “step” ซึ่งหมายความว่า ขั้นตอนการเปลี่ยนแปลงของค่า start จนถึง end เป็นอย่างไร และถ้ากลับไปดูที่หัวข้อการสร้างอาเรย์แบบใช้ตัวช่วย เราจะเห็นว่า colon ( : ) ใช้ในการสร้างอาเรย์ 1 มิติ ดังนั้นหากเราเอาโค้ด
>> m = 1:1:20;
ไปรันใน command window ก็จะเห็นว่า m มีค่าเริ่มต้นที่ 1 และเพิ่มทีละ 1 จนถึง 20 ดังนั้นรูปแบบการสร้างอาเรย์ 1 มิติแบบนี้ จึงถูกนำมาใช้เป็นเงื่อนไขของ for-loop เพราะให้ความหมายตรงกับเงื่อนไขของ for-loop
8.2 การวนลูปด้วย while
รูปแบบของ while มีดังนี้while(cond)
…code…
end
การวนลูปของ while จะต่างจาก for ตรงที่ ค่า start, step, end จะไม่ถูกระบุไว้ในฟอร์มรูปแบบของการวนลูป ซึ้งคำว่า “ไม่ระบุ” ไม่ได้หมายความว่าจำเป็นต้องเขียนเอาไว้ที่อื่น แต่หมายความว่า “มีหรือไม่มีก็ได้”
ดังนั้นข้อแตกต่างที่ชัดเจนระหว่าง for และ while คือ for-loop ใช้สำหรับการวนลูปที่มีจุดเริ่มต้นและจุดสิ้นสุดที่แน่นอน เช่นการวนลูปเพื่ออ่านค่าในอาเรย์ ส่วน while-loop นั้นเป็นการวนลูปแบบไม่มีจุดเริ่มต้น และไม่มีจุดสิ้นสุดที่แน่นอน ดังนั้น while-loop จึงถูกนำมาใช้สำหรับการทำซ้ำที่ไม่รู้จำนวนรอบที่แน่นอน เช่น วนลูปรับค่าจาก user ไปเรื่อยๆ จนกว่า user จะป้อนคำว่า “stop”
วิธีการหยุดการทำงานของ loop หรือ การออกจาก loop มีอยู่ 2 วิธีคือ
1. เงื่อนไขของ loop กลายเป็นเท็จ
2. ใช้คำสั่ง break
ซึ่งทั้ง 2 วิธีนี้ใช้ได้ทั้ง for-loop และ while-loop
ในตัวอย่างต่อไปนี้ เราจะใช้ while-loop เพื่อเขียนโปรแกรมเดียวกันกับ for-loop ก่อนหน้านี้
จบหัวข้อที่ 8