หน่วยที่ 5 การเขียนโปรแกรมแบบมีการทำซ้ำ (Loop)

หลักการเขียนโปรแกรมแบบมีการทำซ้ำ

ในหน่วยเรียนนี้จะศึกษาเกี่ยวกับการเขียนโปรแกรม

แแบการเขียนโปรแกรมที่มีการทําซ้ำ หรืออาจเรียกว่าการเขียนโปรแกรม แบบมีการวนลูป (Loop) ซึ่งเป็นการเขียนโป การพัฒนางานระบบโปรแกรมต่าง ๆ

5.1 หลักการเขียนโปรแกรมแบบมีการทําซ้ํา

ในการเขียนโปรแกรมบางครั้ง จะมีการทํางานของโปรแกรมที่ต้องทํางานซ้ํา ๆ ในการประมวลผล ปแบบเดียวกัน หากจะทําการเขียนโปรแกรมเพื่อให้มีการทํางานซ้ํา ๆ กันหลายบรรทัด จะเสียเวลาในการ เขียนโปรแกรม และเมื่อต้องการแก้ไขโปรแกรมที่มีการทํางานซ้ํา ๆ นั้นจะสร้างความยุ่งยาก เนื่องจาก

กรทัดคําสั่งมีเป็นจํานวนมาก ดังนั้นในภาษาการเขียนโปรแกรม จึงมีไวยากรณ์ชนิดหนึ่ง เขียนโปรแกรม นามารถนําไปใช้งานได้กับงานการประมวลผลที่ต้องมีการทํางานซ้ํา ๆ กันในขณะหนึ่ง ๆ ของโปรแกรม เรียกการเขียนโปรแกรมแบบนั้นว่า การเขียนโปรแกรมแบบมีการทําซ้ํา หรือ ลูป (Loop)

ไวยากรณ์สําหรับการเขียนโปรแกรมให้มีการทํางาน มี 3 รูปแบบที่จําเป็นต่อการเรียนรู้ ซึ่งในแต่ละ รูปแบบมีความเหมาะสมกับงานหรือวัตถุประสงค์ที่แตกต่างกัน ดังนี้

5.1.1 การเขียนโปรแกรมแบบมีการทําซ้ําในรูปแบบ While

โปรแกรมที่มีการทําการซ้ําโดยการใช้ While มีหลักการที่สําคัญคือ ถ้าเงื่อนไขที่เขียนไว้หลัง While ให้ค่าที่เป็นจริง (True) การวนซ้ําจะเกิดขึ้นต่อเนื่องไป แต่ถ้าเมื่อใดที่เงื่อนไขหลัง While เป็นเท็จ (False) การวนซ้ำหรือการทําซ้ำจะหยุดลงทันที (ดูรูปที่ 5.1)

รูปที่ 5.1 การทำงานของ While


จากรูปที่ 5.1 เมื่อนำมาเขียนเป็นไวยากรณ์ การเขียนโปรแกรมมีการทำซ้ำแบบ While ของ VB นั้น สามารถเขียนได้ดังนี้


ตัวอย่างเช่น หากต้องการเขียนเงื่อนไขหลัง While ให้ค่าตัวแปร a มีค่าน้อยกว่า 5 คำสั่งใน While จึงจะวนลูปการทำงานซ้ำ สามารถเขียนโค้ดโปรแกรมได้ ดังตัวอย่าง Ex.1


จากใน Ex.1 ในบรรทัดแรกของโปรแกรม มีการกําหนดค่าตัวแปร a เก็บค่าเลข 1 จากนั้นมีการวนลูบ While โดยกําหนดเงื่อนไข 2 ต้องมีค่าน้อยกว่า 5 นั่นหมายความว่า ถ้าค่าในตัวแปร 2 มีค่าเป็น 1, 2, 3, 4 คําสั่งใน While จะทํางาน ซึ่งในที่นี้คือ การแสดงกล่องข้อความออกมา (MsgBox( a) ในบรรทัดต่อมาเป็น การบวก (+) ค่าเพิ่มให้กับตัวแปร a ทุกครั้งที่มีการวนลูปเข้ามา ทั้งนี้เพื่อเป็นการเปลี่ยนแปลงค่าให้ตัวแปร

มีค่าเพิ่มขึ้น โดยการบวกเพิ่มเข้าไปครั้งละ 1 ต่อการวนเข้ามา 1 รอบ (a = a + 1) ซึ่งมีผลทําให้ a มีค่า เพิ่มขึ้นทุกครั้ง เมื่อค่า 8 มีค่าเพิ่มจนไม่น้อยกว่า 5 ตามเงื่อนไข การวนลูปของ While นี้จะสิ้นสุดลง

5.1.2 การเขียนโปรแกรมแบบมีการทําซ้ําในรูปแบบ Do...Loop

สําหรับคําสั่ง D๐ ... Loop นั้นจะคล้ายกับการใช้ While ที่ผ่านมา แต่การวนลูปของ Do นั้น จะแตกต่างตรงที่ การทํางานของ Do จะทํางานในคําสั่งการวนซ้ําก่อน 1 ครั้งเสมอ แม้เงื่อนไขจะไม่เป็นจริง ตั้งแต่แรกเลยก็ตาม

การใช้งาน Do...Loop มีการใช้งานอยู่ 2 แบบ คือแบบ Loop While และแบบ Loop Until ซึ่งทั้ง 2 แบบจะทํางานตรงข้ามกัน กล่าวคือ Loop While จะทําการวนทํางานซ้ําเมื่อเงื่อนไขยังเป็นจริงอยู่ แต่สําหรับ Loop Until จะทํางานเมื่อเงื่อนไขยังเป็นเท็จอยู่ นั่นคือทํางานตรงข้ามกันนั้นเองระหว่าง Loop While nu Loop Until

1. แบบ Do...Loop While

ดังที่กล่าวไปแล้วว่า Do...Loop While จะทํางานอย่างน้อย 1 ครั้ง แม้ว่าเงื่อนไขจะเป็นเท็จ ตั้งแต่แรก และจะยังมีการวนทํางานซ้ํา เมื่อเงื่อนไขยังเป็นจริงอยู่ พิจารณาดังรูปที่ 5.2


รูปที่ 5.2 การทำงานของDo....Loop While

ตัวอย่างเช่น มีเงื่อนไขในการวนลูป ตัวแปร a ต้องมีค่ามากกว่า 10 การวนลูปภายใน Do จึงจะทำงาน สามารถเขียนเป็นโค้ดภาษา VB ได้ ดังตัวอย่าง Ex.2


จากตัวอย่าง Ex.2 บรรทัดแรกของโปรแกรมเป็นการประกาศตัวแปร a เก็บค่าเลข 9 จากนั้นจึงเป็นบรรทัดการทํางานของ Do...Loop While ให้ดูเงื่อนไขที่หลัง While จะพบว่าเงื่อนไขคือ a ต้องมากกว่า 10 โค้ดภายใน D๐ จึงจะทํางาน (a 10) แต่ได้มีการประกาศค่าตัวแปร aไว้ในบรรทัดแรกว่า 229 ดังนั้น ลูปนี้จึงมีความเป็นเท็จตั้งแต่แรก ฉะนั้นการวนลูปภายใน D๐ จึงมีการทํางานแค่เพียง 1 รอบ ตามความหมายของการใช้งาน Do...Loop While

2. แบบ Do...Loop Until

สําหรับ Do...Loop Until จะคล้าย ๆ กับ Do...Loop While ที่ผ่านมา เพียงแต่ว่า Do. Loop Until นั้นจะทํางานก็ต่อเมื่อเงื่อนไขหลัง Until เป็นเท็จ (Do...Loop While เงื่อนไขต้องเป็นจริง) คือ มีเงื่อนไขตรงกันข้ามกันนั่นเอง พิจารณารูปที่ 5.3



ตัวอย่างเงื่อนไขที่ระบุว่า a < 5 ถ้าใช้ใน Loop Until จะหมายความว่า ถ้าค่าในตัวแปร a มีค่ามากกว่า 5 การวนลูปใน Do จึงจะทำงาน (เป็นเท็จจึงจะวนลูป) สามารถเขียนโค้ดภาษา VB ได้ดังตัวอย่าง Ex.3


จากตัวอย่าง Ex.3 บรรทัดแรกของโปรแกรมเป็นการประกาศตัวแปร a เก็บค่าเลข 10 จากนั้นจึงเป็น บรรทัดการทํางานของ Do...Loop Until ให้ดูเงื่อนไขที่หลัง Until จะพบว่าเงื่อนไขคือ 2 ต้องน้อยกว่า 5 กา รวนลูปจึงจะสิ้นสุด (เป็นจริงจะสิ้นสุดการวนลูป) ดังนั้น ถ้า a ยังมีค่ามากกว่า 5 การวนรอบการทํางานยัง จะคงกระทําต่อเนื่องไป (10, 9, 8, 7, 6, 5) ฉะนั้น เพื่อให้การวนลูปนี้มีการทํางานออกจากลูปได้ จึงเขียน โค้ดบรรทัด a = 2-1 ไว้ เพื่อให้ค่า a มีโอกาสน้อยกว่า 5 มิเช่นนั้นแล้ว การทํางานแบบกระทําซ้ํา หรือ การวนลูปจะเกิดการ Infinity Loop หรือการวนลูปไม่รู้จบเกิดขึ้นได้

5.1.3 การเขียนโปรแกรมแบบมีการทําซ้ําในรูปแบบ For ... Next

การวนลูปหรือโปรแกรมที่มีการทํางานในแบบ For จะมีหลักการในการทํางานคล้าย ๆ กา รวนลูปที่ผ่านมา แตกต่างกันในส่วนของไวยากรณ์การเขียน ซึ่งสามารถพิจารณาการทํางานของ Forได้จากรูป ที่ 5.4


อย่างเช่น ถ้ามีเงื่อนไขในการวนรูปแบบ For เป็นการวนลูปตั้งแต่เลข 1 ถึงเลข 5 สามารถเขียนเป็นได้โปรแกรมภาษา VB ได้ ดังตัวอย่าง Ex.4


จากตัวอย่าง EX.4 ในคําสั่ง For จะพบว่าสามารถประกาศตัวแปร a พร้อมทั้งการกําหนดค่า งไปได้ ซึ่งคือค่าเริ่มต้น (Start) ของการวนลูป ในที่นี้ให้ตัวแปร a เก็บค่า 1 และมีการกําหนดค่าเลข 5 ซึ่ง เงในค่าสิ้นสุด (End) ไว้หลัง To เพื่อบอกว่า จะเป็นการวนลูปตั้งแต่เลข 1 ถึงเลข 5 (1, 2, 3, 4, 5) ซึ่งคือ เงื่อนไขที่กําหนดไว้ หากตัวเลขยังอยู่ในช่วงระหว่างเลข 1-5 จะทําการวนลูปไปเรื่อย ๆ จนกว่าตัวเลขจะมากกว่าเลข 5

1. For ... Next แบบมี Step

ในการเขียนโปรแกรมแบบมีทํางานซ้ําในแบบ For ... Next ที่ผ่านมา จะพบว่าค่าที่เพิ่ม ขึ้นกับตัวแปรเริ่มต้น (Start) ทุกครั้งที่มีการวนลูป จะมีการเพิ่มค่าขึ้นครั้งละ 1 ซึ่งหากต้องการให้ค่าที่เพิ่มขึ้น เพิ่มขึ้นครั้งละ 2 หรือ 3 หรือใด ๆ สามารถระบุ Step หรือ วิธีการเพิ่มค่าของตัวเลขในแต่ละครั้งของการวน ลบได้ ตัวอย่างเช่น ถ้าต้องการให้ทุกครั้งการวนลูป ตัวเลขจะมีค่าเพิ่มขึ้นครั้งละ 2 สามารถทําได้ ดังนี้


จากตัวอย่าง Ex.5 เป็นการระบุ Step ให้เพิ่มขึ้นครั้งละ 2 (Step 2) นั่นหมายความว่า ทุกครั้ง การวนลูปตัวแปรเริ่มต้น (a) จะถูกเพิ่มค่าเข้าไปที่ละ 2 (a = a+2) ซึ่งค่าที่ได้จะเป็น 1, 3, 5, 7, 9 นั่นเอง

2. แบบ For Each ... Next

สําหรับการใช้งาน For Each...Next นั้น จะใช้กับตัวแปรประเภทอาร์เรย์ (Array) หรือ ข้อมูลประเภทคอลเลคชั่น (Collection) เนื่องจากการวนลูปในรูปแบบนี้ออกแบบมาเพื่อให้มีการทํางานกับ ตัวแปรประเภทดังที่กล่าวมา ซึ่งจะมีไวยากรณ์ ดังนี้


ตัวอย่างเช่น มีตัวแปรแบบอาร์เรย์ ในโปรแกรม แล้วโปรแกรมนั้นจําเป็นต้องเข้าถึงค่าข้อมูลของอาร์เรย์นั้นในทุกข้อมูล แบบนี้สามารถใช้ For Each...Next ในการเขียนโปรแกรมได้ ดังตัวอย่าง Ex. 6

จากตัวอย่าง Ex.6 ในบรรทัดแรกของโปรแกรมมีการประกาศตัวแปรอาร์เรย์ชื่อว่า ar เก็บค่า เป็น String โดยมีค่าข้อมูล 4 ค่า ต้องการเข้าถึงค่าข้อมูลนั้นทั้งหมด โดยใช้งาน For EachNext ในบรรทัด ต่อมา โดยที่หลัง Each มีการประกาศตัวแปร val เป็น String (val As String) ให้ทําการวนลูปเข้าไปในตัว แปร arr (In arr) หลังจากนั้นทําการแสดงผลด้วยกล่องข้อความ (MsgBox (val) โดยที่โปรแกรมนี้จะทําการวนลูปเข้าไปยังตัวแปร arr จนค่าข้อมูลหมดจากอาร์เรย์ จึงจะออกจากการวนลูป

ข้อควรระวังในการเขียนโปรแกรมแบบมีการทําซ้ำ

การเขียนโปรแกรมแบบวนซ้ํา ผู้เขียนโปรแกรมต้องมีความมั่นใจในเงื่อนไขที่จะสามารถทําให้ การทํางานซ้ําออกมาจากการวนลูปเพื่อทํางานได้จริง หากการเขียนโปรแกรมแบบมีการทํางานซ้ําไม่ สามารถหลุดออกมาจากการวนลูปเพื่อทํางานซ้ําได้ โปรแกรมจะเกิดการผิดพลาดและอาจเป็นอันตรายต่อ ระบบคอมพิวเตอร์ที่ใช้งานโปรแกรมที่ได้พัฒนาขึ้น การวนลูปแบบไม่รู้จบนี้ เรียกว่า Infinite Loop


โปรแกรมในตัวอย่าง Ex.7 เป็นการเขียนโปรแกรมโดยใช้ While ในการทํางาน โดยมีเงื่อนไข ตัวแปร x 10 ซึ่งสังเกตได้ว่า ในการวนลูปไม่มีบรรทัดเพื่อเปลี่ยนแปลงค่าตัวแปร x ให้มีค่ามากขึ้น ดังนั้น ไม่ว่าโปรแกรมจะทําการวนลูปทําซ้ํากี่รอบ เงื่อนไข x 2 10 จะเป็นจริงเสมอ (While จะออกจากลูปได้ เงื่อนไขต้องเป็นเท็จเท่านั้น) ทําให้เกิดการวนลูปไม่รู้จบ ซึ่งเป็นอันตรายต่อการใช้งานโปรแกรม