
คำสั่งวนซ้ำ (While loop)

อัปเกรดสำหรับเนื้อหาเพิ่มเติม
True or false? If you want to repeat code, you can use a loop.
ลีน่าได้เขียนโปรแกรมให้กับหุ่นยนต์ของเธอ เพื่อให้มันสามารถมอบช็อกโกแลตที่ ลีออนและมาเรียชอบได้ ซึ่งมันก็ทำได้ดี ลีออนเริ่มเดินเครื่องหุ่นยนต์ มันหยิบช็อคโกแลตมาหนึ่งชิ้น ดูมันสิ ดูมันหยิบช็อกโกแลตนมขึ้นมา แถมยังตรวจดูด้วยว่า มีถั่วอยู่ในนั้นหรือเปล่า ไม่มี มันไม่มีถั่ว ดังนั้น มาเรียจึงได้ช็อคโกแลตชิ้นนั้นไป ลีออนไม่ได้ช็อกโกแลตเลย ดังนั้นเขาจึงรีสตาร์ทโปรแกรมใหม่ หุ่นยนต์หยิบช็อกโกแลตชิ้นใหม่ขึ้นมา คราวนี้มันเป็นช็อกโกแลตเข้ม หุ่นยนต์มอบช็อคโกแลตชิ้นนั้นให้ลีออน ฉันไม่เบื่อนะถ้าต้องรีสตาร์ท โปรแกรมใหม่อีกรอบน่ะ อย่านะ ถ้าเราต้องรีสตาร์ทหุ่นยนต์อีก เราไปหยิบช็อกโกแลตง่ายกว่าอีก มาเรียและลีออนไม่อยาก เริ่มโปรแกรมใหม่เรื่อยๆ แล้ว แล้วจะเลี่ยงได้ยังไงกันล่ะ? มาเรียอยากจะปรับปรุงโปรแกรมของลีน่า ก่อนอื่น เธอต้องดูว่ารหัสเทียม ที่เขียนไว้นั้นเป็นอย่างไร คำสั่งคือ หยิบช็อคโกแลตมาชิ้นหนึ่ง และมอบมันให้กับมาเรียหรือลีออน หรือโยนช็อคโกแลตทิ้งไป คำสั่งจะปฏิบัติได้เพียงครั้งเดียว แต่มาเรียต้องการให้โปรแกรมเริ่มต้นใหม่ และวนซ้ำ ความต้องการของเธอก็คือ ในขณะที่มีช็อคโกแลตอยู่ในกล่อง โปรแกรมควรจะทำซ้ำ หรือย้ำคำสั่งได้ ความต้องการของมาเรียคือเงื่อนไขแบบวนซ้ำ เมื่อเงื่อนไขเป็นจริง คำสั่งจะถูกทำซ้ำ แต่เมื่อเงื่อนไขเป็นเท็จ โปรแกรมก็ยังคงอยู่ในรหัส นี่คือคำสั่ง 'while' loop มาเรียเขียนให้โปรแกรม ควรถามคำถามกับผู้ใช้งานว่า มีช็อกโกแลตอยู่ในกล่องเท่าไหร่? คำตอบจะถูกบันทึกไว้ในตัวแปรชื่อ 'chocolates' ข้อกำหนด "ตราบใดที่มีช็อคโกแลต อยู่ในกล่อง" มันก็เหมือนกับตัวแปร "จำนวนช็อคโกแลตมากกว่า 0" หากคำสั่งในลูปถูกปฏิบัติ ช็อคโกแลตหนึ่งชิ้นจะถูกหยิบออกไป แล้วค่าใหม่สำหรับตัวแปรช็อคโกแลต จะถูกกำหนดขึ้น ดังนั้น มาเรียจึงใส่แถวๆหนึ่งไว้ ที่ด้านล่างของลูป ช็อคโกแลต เท่ากับ ช็อคโกแลต ลบ 1 ตอนนี้มันก็ยากสักหน่อยที่จะเห็นว่า แถวไหนเป็นแถวของลูป และซึ่งจะวนซ้ำ แล้วในรหัสจะชัดเจนขึ้นได้อย่างไร? มาเรียก็เลยขยับบรรทัดเข้าไปแบบนี้ ตอนนี้มาเรียกำลังจะทดสอบโปรแกรม เธอสตาร์ท และใส่ข้อมูลว่ามีช็อคโกแลตอยู่ 10 ชิ้น จากนั้นโปรแกรมก็จะทดสอบ เงื่อนไข while loop ตัวแปรช็อคโกแลตเท่ากับ 10 มันมากกว่า 0 เงื่อนไขเป็นจริง และหากเงื่อนไขเป็นจริง คำสั่งก็จะถูกดำเนินการในลูป หุ่นยนต์หยิบช็อคโกแลตขึ้นมา 1 ชิ้น มันเป็นช็อคโกแลตนม เมื่อเงื่อนไขแรกในลูปเป็นจริง เงื่อนไขต่อไปก็คือ: มีถั่วไหม? ไม่มีถั่ว แล้วคำสั่งก็จะไม่ทำตามข้อต่อไปคือ ทิ้งช็อคโกแลต แต่โปรแกรมจะไปที่คำว่า 'อื่นๆ': มอบช็อคโกแลตให้มาเรีย ตอนนี้จำนวนช็อคโกแลต เริ่มน้อยกว่าเดิมแล้ว และตัวแปรช็อคโกแลตก็จะกลายเป็น 10 ลบ 1 ซึ่งก็คือ 9 โปรแกรมได้ดำเนินการตาม คำสั่งทั้งหมดในลูป และกลับไปที่ด้านบนของลูป เงื่อนไขยังคงเป็นจริงใช่หรือไม่? ใช่ ช็อคโกแลตคือ 9 มันมากกว่า 0 คำสั่งในการวนซ้ำจะถูกดำเนินการอีกครั้ง หุ่นยนต์หยิบช็อคโกแลตขึ้นมาใหม่ และช็อคโกแลตก็ลดลง 1 ชิ้น เหลือแค่ 8 โปรแกรมได้ทดสอบเงื่อนไขอีกครั้ง 8 มากกว่า 0 และเงื่อนไขเป็นจริง แล้วหุ่นยนต์ก็ดำเนินการต่อไป มันจะวนซ้ำคำสั่ง ตราบใดที่เงื่อนไขเป็นจริง แต่เมื่อในกล่องว่างเปล่า คือจำนวนของช็อคโกแลตเป็น 0 แล้วเกิดอะไรขึ้น? 0 ไม่อาจมากไปกว่า 0 ได้ ดังนั้นเงื่อนไขจึงเป็นเท็จ และหุ่นยนต์จะไม่ทำตามคำสั่งในลูป โปรแกรมก็จะดำเนินต่อไป แต่ไม่มีแถวคำสั่งต่อไปจากลูปแล้ว โปรแกรมจึงจบลง ด้วยความช่วยเหลือของลูปใหม่ ลีออนกับมาเรียจึงได้ช็อคโกแลต จำนวนมากจากหุ่นยนต์ โดยไม่ต้องรีสตาร์ทโปรแกรม ดีจัง ใช่ไหมลีออนกับมาเรีย?