5 โครงสร้างโปรแกรมการทำงานแบบวนซ้ำ
วัตถุประสงค์
เพื่อให้เข้าใจการทำงานแบบวนซ้ำ
เพื่อให้เข้าใจการทำงานแบบวนซ้ำแบบซับซ้อน
เพื่อให้สามารถเขียนโปรแกรมด้วยคำสั่ง while, do-while และ for ได้
เพื่อให้สามารถใช้คำสั่ง break และ continue กับการเขียนโปรแกรมแบบวนซ้ำได้
เพื่อให้สามารถเขียนโปรแกรมเพื่อแก้ปัญหาที่มีการทำงานแบบวนซ้ำได้
คอมพิวเตอร์เป็นเครื่องมือที่สามารถทำงานซ้ำ ๆ ได้อย่างมีประสิทธิภาพและรวดเร็วกว่ามนุษย์ เช่น การคำนวณผลการเรียนประจำภาคของนักศึกษาทั้งมหาวิทยาลัย การคำนวณดอกเบี้ยเงินฝากให้กับลูกค้าธนาคารทุกบัญชี เป็นต้น ในการสั่งงานให้คอมพิวเตอร์ทำซ้ำนั้นต้องอาศัยการเขียนโปรแกรมแบบวนซ้ำ การสร้างวงวน (loop) เพื่อให้กลุ่มคำสั่งที่ต้องการทำซ้ำสามารถทำได้ด้วยคำสั่ง while, do-while และ for โดยสร้างเงื่อนไขเพื่อใช้ในการพิจารณาว่าต้องวนซ้ำหรือไม่และจะหยุดวนซ้ำเมื่อใด
5.1 คำสั่ง WHILE
คำสั่ง while เป็นคำสั่งในการควบคุมการทำงานแบบวนซ้ำด้วยการตรวจสอบเงื่อนไข ถ้าเงื่อนไขเป็นจริงจะทำกลุ่มคำสั่งที่อยู่ภายในวงวน เมื่อทำคำสั่งต่าง ๆ ในวงวนเสร็จแล้วจะกลับไปตรวจสอบเงื่อนไขอีกครั้งถ้าเงื่อนไขยังเป็นจริงอยู่ก็จะทำคำสั่งในวงวนซ้ำอีกแล้วกับไปตรวจสอบเงื่อนไขอีกครั้งทำเช่นนี้ไปเรื่อย ๆ จนว่าเงื่อนไขจะเป็นเท็จ คำสั่ง while มีรูปแบบไวยากรณ์ดังนี้
ก่อนการทำคำสั่งภายในวงวนที่สร้างด้วยคำสั่ง while จะต้องทำการตรวจสอบเงื่อนไขก่อนถ้าเงื่อนไขเป็นจริงจึงจะทำคำสั่งในวงวน ดังนั้นหากเงื่อนไขเป็นเท็จตั้งแต่ครั้งแรกกลุ่มคำสั่งภายในวงวนที่สร้างด้วยคำสั่ง while จะไม่มีการทำงานเลย การวนซ้ำด้วยคำสั่ง while สามารถแสดงการทำงานได้ดังผังงานในภาพที่ 5-1
ตัวอย่างโปรแกรมการทำงานแบบวนซ้ำด้วยคำสั่ง while ในการพิมพ์ตัวเลขตั้งแต่ 1 – 3 เป็นดังตัวอย่างที่ 5.1 และมีผังงานดังภาพที่ 5-2
จากตัวอย่างที่ 5.1 สามารถอธิบายการทำงานของโปรแกรมได้ดังตารางต่อไปนี้
รอบที่ | ค่า count | while (count<=3) | ผลการทำงาน | count++ |
---|---|---|---|---|
ค่าเริ่มต้น | 1 | - | - | - |
1 | 1 | TRUE | count = 1 | 2 |
2 | 2 | TRUE | count = 2 | 3 |
3 | 3 | TRUE | count = 3 | 4 |
4 | 4 | FALSE | ออกจากวงวน | - |
การทำงานของโปรแกรมในตัวอย่างที่ 5.1 เงื่อนไขในการวนซ้ำของคำสั่ง while จะมีค่าความจริงเป็นจริง 3 ครั้ง ทำให้คำสั่งภายในวงวนทำงานซ้ำ 3 รอบ ในครั้งที่ 4 ของการตรวจสอบเงื่อนไขเนื่องจากตัวแปร count มีค่าเท่ากับ 4 ทำให้เงื่อนไขเป็นเท็จจึงทำให้สิ้นสุดการทำซ้ำออกจากวงวน
คำสั่ง while เหมาะกับการวนซ้ำที่ไม่จำเป็นต้องกำหนดจำนวนรอบที่แน่นอน ตัวอย่างเช่นโปรแกรมในตัวอย่างที่ 5.2 โปรแกรมจะวนรับข้อความทางแป้นพิมพ์ไปเรื่อย ๆ โดยจะหยุดการวนซ้ำเมื่อผู้ใช้พิมพ์ข้อความที่ขึ้นต้นด้วยตัวอักษร Q หรือ q และนับจำนวนครั้งทั้งหมดที่ผู้ใช้ป้อนข้อความ ดังนั้นจะเห็นได้ว่าจำนวนครั้งของการวนซ้ำในโปรแกรมนี้ขึ้นอยู่ผู้ใช้
5.2 โครงสร้างทั่วไปอย่างง่ายของโปรแกรมการทำงานแบบวนซ้ำ
หากสังเกตจากโปรแกรมตัวอย่างที่ 5.1 โครงสร้างทั่วไปอย่างง่ายของโปรแกรมการทำงานแบบวนซ้ำ ประกอบด้วย
ก่อนเข้าวงวนให้ประกาศตัวแปรที่ใช้ในการควบคุมวงวน และกำหนดค่าเริ่มต้นให้กับตัวแปรนั้น
สร้างเงื่อนไขให้ในการวนซ้ำ โดยใช้การเปรียบเทียบค่ากับตัวแปรที่ใช้ในการควบคุมวงวน (ถ้าเงื่อนไขเป็นจริงจึงจะทำคำสั่งภายในวงวน แต่ถ้าเงื่อนไขเป็นเท็จจะออกไปทำคำสั่งนอกวงวน)
ส่วนสุดท้ายของวงวนให้ทำการเปลี่ยนแปลงค่าของตัวแปรที่ใช้ในการควบคุมการทำซ้ำ
จากตัวอย่างที่ 5.1 โครงสร้างของการวนซ้ำอย่างง่าย ได้แก่ ส่วนที่ 1 คือ คำสั่ง int count = 1; ในบรรทัดที่ 3 เป็นการกำหนดค่าตัวแปร count ซึ่งใช้ในการควบคุมวงวน ให้มีค่าเริ่มต้นเท่ากับ 1
ส่วนที่ 2 คือ เงื่อนไข (count <= 3) ในบรรทัดที่ 4 เป็นส่วนของเงื่อนไขในในการวนซ้ำโดยใช้ตัวแปร count มาเปรียบเทียบว่าน้อยกว่าหรือเท่ากับ 3 หรือไม่ ส่วนที่ 3 คือ คำสั่ง count++; ในบรรทัดที่ 6 เป็นส่วนของการเปลี่ยนแปลงค่าตัวแปร count เพิ่มอีกหนึ่ง
จากตัวอย่างที่ 5.3 เป็นโปรแกรมที่พิมพ์ข้อความ Hello จำนวน 10 ครั้ง ซึ่งมีโครงสร้างการวนซ้ำอย่างง่าย ได้แก่
ส่วนที่ 1 คือ คำสั่ง int i = 0; ในบรรทัดที่ 3 เป็นการกำหนดค่าตัวแปร i ซึ่งใช้ในการควบคุมวงวน ให้มีค่าเริ่มต้นเท่ากับ 0
ส่วนที่ 2 คือ เงื่อนไข (i < 10) ในบรรทัดที่ 4 เป็นส่วนของเงื่อนไขในในการวนซ้ำโดยใช้ตัวแปร i มาเปรียบเทียบว่าน้อยกว่า 10 หรือไม่
ส่วนที่ 3 คือ คำสั่ง i++; ในบรรทัดที่ 6 เป็นส่วนของการเปลี่ยนแปลงค่าตัวแปร i เพิ่มอีกหนึ่ง
โปรแกรมในตัวอย่างที่ 5.3 หากต้องการพิมพ์ข้อความ Hello ซ้ำจำนวน 2000 ครั้ง สามารถทำได้โดยเปลี่ยนเงื่อนไขการวนซ้ำจาก i < 10 เป็น i < 2000 แทน
5.3 คำสั่ง DO-WHILE
คำสั่ง do-while เป็นคำสั่งที่การควบคุมการทำงานแบบวนซ้ำโดยจะดำเนินการกลุ่มคำสั่งในวงวนแบบ do-while ก่อนแล้วทำการตรวจสอบเงื่อนไขการวนซ้ำในภายหลัง หากเงื่อนไขเป็นจริงจะวนซ้ำกลุ่มคำสั่งในวงวน do-while อีกครั้ง ทำเช่นนี้จนกระทั้งเงื่อนไขเป็นเท็จจึงจะหยุดการวนซ้ำ คำสั่ง do-while มีรูปแบบไวยากรณ์ดังนี้
หลังการทำกลุ่มคำสั่งภายในวงวนที่สร้างด้วยคำสั่ง do-while แล้วจึงทำการตรวจสอบเงื่อนไขโดยในขณะที่เงื่อนไขเป็นจริงกลุ่มคำสั่งในวงวนจะถูกประมวลผลซ้ำอีก ดังนั้นคำสั่งภายในวงวนจะต้องถูกประมวลผลแน่นอนอย่างน้อย 1 ครั้งเสมอ ข้อสังเกตจากไวยากรณ์ของคำสั่ง do-while หลังวงเล็บของเงื่อนไขจะต้องใส่เครื่องหมายอัฒภาค (;) ด้วย การวนซ้ำด้วยคำสั่ง do-while แสดงได้ดังผังงานในภาพที่ 5-3
ตัวอย่างโปรแกรมการทำงานแบบวนซ้ำด้วยคำสั่ง do-while ในการพิมพ์ตัวเลขตั้งแต่ 1 – 3 เป็นดังตัวอย่างที่ 5.4 และมีผังงานดังภาพที่ 5-4
จากตัวอย่างที่ 5.4 สามารถอธิบายการทำงานของโปรแกรมได้ดังตารางต่อไปนี้
ตารางที่ 5.2 การทำงานของโปรแกรมในตัวอย่างที่ 5.4
รอบที่ | ค่า count | ผลการทำงาน | count++ | while (count<=3) |
---|---|---|---|---|
ค่าเริ่มต้น | 1 | - | - | - |
1 | 1 | count = 1 | 2 | TRUE |
2 | 2 | count = 2 | 3 | TRUE |
3 | 3 | count = 3 | 4 | FALSE |
- | ออกจากวงวน |
การทำงานของโปรแกรมในตัวอย่างที่ 5.4 จะทำให้คำสั่งภายในวงวนซ้ำ 3 รอบ การตรวจสอบเงื่อนไขในการวนซ้ำของคำสั่ง do-while จะมีค่าความจริงเป็นจริง 2 ครั้ง ในครั้งที่ 3 ของการตรวจสอบเงื่อนไขเนื่องจากตัวแปร count มีค่าเท่ากับ 4 เงื่อนไขเป็นเท็จจึงทำให้สิ้นสุดการทำซ้ำและออกจากวงวน
จากตัวอย่างที่ 5.4 เป็นโปรแกรมที่พิมพ์ข้อความ Hello จำนวน 10 ครั้ง โดยใช้คำสั่ง do-while
5.4 คำสั่ง FOR
จากโครงสร้างการทำซ้ำทั่วไปซึ่งประกอบไปด้วย 3 ส่วนดังได้กล่าวไปแล้วในหัวข้อที่ 5.2 นั้น หากต้องการเขียนโปรแกรมที่มีการวนซ้ำซึ่งสามารถระบุจำนวนรอบได้อย่างชัดเจน เราสามารถเขียนโปรแกรมให้ง่ายขึ้นได้โดยใช้คำสั่ง for ซึ่งมีรูปแบบไวยากรณ์ ดังนี้
บรรทัดแรกหลังคำว่า for จะประกอบไปด้วย 3 ส่วนคั่นด้วยเครื่องหมายอัฒภาค (;) โดยส่วนที่หนึ่งคือสิ่งที่จะดำเนินการก่อนการทำซ้ำในคำสั่ง for ซึ่งส่วนนี้จะทำครั้งแรกเพียงครั้งเดียวเป็นการกำหนดค่าเริ่มต้นให้กับตัวแปรที่ใช้ในการควบคุมการวนซ้ำ ส่วนที่ 2 คือเงื่อนไขการวนซ้ำ โดยก่อนการทำงานกลุ่มคำสั่งในวงวนจะต้องมีการตรวจสอบเงื่อนไขก่อนถ้าเงื่อนไขเป็นจริงจึงจะทำคำสั่งในวงวน แต่ถ้าเงื่อนไขเป็นเท็จจะยุติการทำซ้ำ และส่วนที่ 3 เป็นส่วนที่จะดำเนินการหลังจากสิ้นสุดการการวนซ้ำในแต่ละรอบ เป็นการเปลี่ยนแปลงค่าตัวแปรที่ใช้ในการควบคุมการทำซ้ำด้วยคำสั่ง for ดังนั้นการทำซ้ำด้วยคำสั่ง for เป็นดังผังงานในภาพที่ 5-5
ตัวอย่างโปรแกรมการทำงานแบบวนซ้ำด้วยคำสั่ง for ในการพิมพ์ตัวเลขตั้งแต่ 1 – 3 เป็นดังตัวอย่างที่ 5.5 และมีผังงานดังภาพที่ 5-6
ตารางที่ 5.3 การทำงานของโปรแกรมในตัวอย่างที่ 5.5
รอบที่ | ค่า i | while (i<=3) | ผลการทำงาน | i++ |
---|---|---|---|---|
ค่าเริ่มต้น | 1 | - | - | - |
1 | 1 | TRUE | count = 1 | 2 |
2 | 2 | TRUE | count = 2 | 3 |
3 | 3 | TRUE | count = 3 | 4 |
4 | 4 | FALSE | ออกจากวงวน | - |
จากผังงานในภาพที่ 5-6 และการทำงานของโปรแกรมในตารางที่ 5.3 จะเห็นได้ว่าการทำงานจะเหมือนกับโปรแกรมในตัวอย่างที่ 5-1 ซึ่งใช้คำสั่ง while แต่การวนซ้ำด้วยคำสั่ง for จะมีการแบ่งโครงสร้างการทำซ้ำออกเป็น 3 ส่วนอย่างชัดเจนจึงเหมาะกับการนำไปใช้ในการทำซ้ำที่มีการกำหนดจำนวนรอบที่จะทำซ้ำได้อย่างชัดเจน
5.5 วงวนแบบไม่รู้จบ
วงวนไม่รู้จบ (infinite loop) คือการที่กลุ่มคำสั่งหนึ่งทำซ้ำไปเรื่อย ๆ ไม่รู้จบ ตัวอย่างของโปรแกรมที่เกิดวงวนไม่รู้จบ เช่น
จากตัวอย่างที่ 5.6 เงื่อนไขของคำสั่ง while เป็นจริงไปตลอดทำให้เกิดการวนพิมพ์ Hello ซ้ำไม่รู้จบ
จากตัวอย่างที่ 5.7 ตัวแปร i ที่ใช้ในการควบคุมการวนซ้ำในโปรแกรมนี้มีค่าเริ่มต้นเป็นหนึ่งและแต่ละรอบค่าของตัวแปร i จะเพิ่มขึ้นทีละหนึ่ง จึงทำให้ค่า i มากกว่าหรือเท่ากับ 1 ตลอดไป ทำให้เงื่อนไขเป็นจริงตลอดไป เกิดการวนพิมพ์ Hello ซ้ำไม่รู้จบ
จากตัวอย่างที่ 5.8 โปรแกรมไม่มีข้อผิดพลาดทางไวยากรณ์ แต่จะเกิดวงวนไม่รู้จบ พิมพ์ Hello ไปเรื่อย ๆ
5.6 ข้อผิดพลาดของโปรแกรม (ข้อผิดพลาดทางไวยากรณ์, ข้อผิดพลาดระหว่างการทำงาน และข้อผิดพลาดทางตรรกะ)
การพัฒนาโปรแกรมย่อมจะเกิดข้อผิดพลาดขึ้นได้ ข้อผิดพลาดของโปรแกรมแบ่งออกเป็น 3 ประเภทคือ ข้อผิดพลาดทางไวยากรณ์ (syntax error), ข้อผิดพลาดระหว่างการทำงาน (runtime error) และข้อผิดพลาดทางตรรกะ (logic error)
ข้อผิดพลาดทางไวยากรณ์ คือข้อผิดพลาดที่เกิดจากการเขียนโปรแกรมไม่ตรงตามข้อกำหนดหรือไวยากรณ์ของภาษา สามารถตรวจพบได้ด้วยตัวแปรโปรแกรมในระหว่างการแปลโปรแกรม เช่น ไม่ได้ใส่เครื่องหมายอัฒภาค (;) หลังจบคำสั่ง เป็นต้น
ข้อผิดพลาดระหว่างการทำงาน คือข้อผิดพลาดที่เกิดในระหว่างการทำงานของโปรแกรมซึ่งจะตรวจสอบได้ยากกว่าข้อผิดพลาดทางไวยากรณ์ เช่น การหารด้วยศูนย์, ชนิดข้อมูลไม่ถูกต้อง เป็นต้น เมื่อเกิดข้อผิดพลาดขึ้นโปรแกรมจะหยุดทำงาน
ข้อผิดพลาดทางตรรกะ คือข้อผิดพลาดที่เกิดจากผลลัพธ์ของโปรแกรมไม่ตรงตามที่ต้องการซึ่งอาจเกิดได้จากหลายสาเหตุ เช่น เกิดจากการวิเคราะห์และออกแบบโปรแกรมที่ไม่ถูกต้องเนื่องจากไม่เข้าใจปัญหาหรือตีความปัญหาผิดหรืออาจเกิดจากการเขียนโปรแกรมผิดขั้นตอน ข้อผิดพลาดทางตรรกะเป็นข้อผิดพลาดที่แก้ไขได้ยากที่สุด ตัวอย่างเช่นวงวนไม่รู้จบที่เกิดขึ้นในตัวอย่างที่ 5.8 หากวัตถุประสงค์ของโปรแกรมคือต้องการพิมพ์ Hello ซ้ำ 10 ครั้ง ดังนั้นข้อผิดพลาดนี้จึงเกิดจากการกำหนดเงื่อนไขของการวนซ้ำไม่ถูกต้อง ซึ่งต้องแก้ไขด้วยการเปลี่ยนเงื่อนไขของ for เป็น i <=10 เป็นต้น
5.7 การทดสอบโปรแกรม
โปรแกรมที่ผ่านการแปลโปรแกรมแล้วเมื่อนำโปรแกรมนั้นไปใช้งานอาจได้ผลลัพธ์ที่ไม่ถูกต้องตามที่ต้องการอันเนื่องมาจากการเกิดข้อผิดพลาดขึ้นได้ ดังนั้นจึงควรต้องทำการทดสอบความถูกต้องของโปรแกรมโดยการทดสอบมี 2 รูปแบบ คือ การทดสอบแบบกล่องดำ (black-box testing) และการทดสอบแบบกล่องขาว (white-box testing)
- การทดสอบแบบกล่องดำ คือการทดสอบโดยโปรแกรมที่ถูกทดสอบจะถูกมองในรูปของกล่องดำ เป้าหมายของการทดสอบเพื่อดูผลลัพธ์ของโปรแกรมว่ามีความถูกต้องตรงตามความต้องการหรือไม่โดยไม่สนใจหรือพิจารณาโครงสร้างของโปรแกรม ดังภาพที่ 5-13 การทดสอบจะใช้ค่าข้อมูลนำเข้าและข้อมูลส่งออกมาพิจารณาเทียบกับผลลัพธ์ที่คาดหวัง
การทดสอบแบบนี้ทำขึ้นเพื่อทำให้แน่ใจว่าโปรแกรมที่พัฒนาขึ้นเป็นไปตามความต้องการที่กำหนดไว้อย่างแท้จริง โดยในการทดสอบจะต้องมีการจัดเตรียมกรณีทดสอบ (test case) เพื่อระบุข้อมูลทดสอบและผลลัพธ์ที่คาดหวัง แล้วทำการทดสอบให้โปรแกรมทำงานโดยใส่ข้อมูลนำเข้าที่กำหนดแล้วเมื่อโปรแกรมทำงานและให้ข้อมูลนำออกหรือผลลัพธ์จริงให้นำไปเปรียบเทียบว่าตรงกับผลลัพธ์ที่คาดหวังซึ่งได้กำหนดไว้ในกรณีทดสอบนั้น ๆ หรือไม่ ในส่วนของการกำหนดข้อมูลทดสอบที่จะเป็นข้อมูลนำเข้ามีหลายวิธีการ เช่น การใส่ข้อมูลที่ถูกต้องเพื่อดูผลลัพธ์ว่าเป็นไปตามที่คาดหวังหรือไม่ การใช้ขอบเขตของข้อมูลและความถูกต้องของข้อมูลเป็นการทดสอบ การใช้ความสมเหตุสมผลของข้อมูล ประเภทข้อมูลแบบต่าง ๆ ที่เป็นตัวเลขและตัวอักษร ข้อกำหนดของรูปแบบข้อมูล เป็นต้น
- การทดสอบแบบกล่องขาวหรือกล่องแก้ว (glass-box tesing) คือการทดสอบโปรแกรมโดยมีการใช้โครงสร้างการควบคุมของโปรแกรมมาช่วยในการออกแบบการทดสอบ ดังนั้นในการทดสอบแบบนี้จำเป็นจะต้องรู้และเข้าใจโครงสร้างการทำงานของโปรแกรมที่จะทดสอบด้วย โครงสร้างการทำงานของโปรแกรม ได้แก่ การทำงานตามโครงสร้างแบบลำดับ การทำงานตามโครงสร้างแบบเลือกทำ และการทำงานตามโครงสร้างแบบวนซ้ำ เป็นการทดสอบคำสั่งต่าง ๆ ในโปรแกรม ดังนั้นในการออกแบบกรณีทดสอบจะต้องดำเนินการทดสอบทุกเส้นทางการทำงานของแต่ละส่วนของโปรแกรม ทดสอบการจัดสินใจเชิงตรรกะในทุกกรณี และทดสอบโครงสร้างข้อมูลทั้งหมดที่อยู่ภายในโปรแกรม
5.8 การแก้จุดบกพร่อง
ข้อผิดพลาดทางตรรกะเรียกว่า จุดบกพร่องหรือบัก (bug) กระบวนการในการหาและแก้ไขข้อผิดพลาดเรียกว่าการแก้จุดบกพร่องหรือการดีบัก (debugging) แนวทางทั่วไปในการแก้จุดบกพร่องสามารถใช้หลายวิธีร่วมกันเพื่อทำให้ส่วนของโปรแกรมที่เกิดจุดบกพร่องแคบลงซึ่งจะทำให้หาจุดบกพร่องง่ายขึ้น เช่น ใช้การไล่โปรแกรมหรือการอ่านโปรแกรม หรือสามารถเพิ่มคำสั่งพิมพ์เพื่อแสดงค่าของตัวแปรหรือการประมวลผลการทำงานในแต่ละขั้นตอนของโปรแกรม เป็นต้น แนวทางเหล่านี้สามารถใช้กับโปรแกรมที่มีขนาดเล็กและไม่ซับซ้อนมากนัก
หากเป็นโปรแกรมขนาดใหญ่ที่มีความซับซ้อนมากจะต้องใช้เครื่องมือหรือโปรแกรมตรวจแก้จุดบกพร่องที่มีอยู่ในซอฟต์แวร์ช่วยในการพัฒนาโปรแกรมหรือไอดีอี ตัวอย่างเช่น โปรแกรม Jcreator Pro, โปรแกรม Eclipse, โปรแกรม Netbean เป็นต้น การใช้โปรแกรมตัวแก้จุดบกพร่อง (debugger) ที่มีในไอดีอีเหล่านี้จะมีลักษณะเป็นแบบกราฟฟิกในการหาข้อผิดพลาดของโปรแกรมจะช่วยให้สามารถหาจุดบกพร่องของโปรแกรมที่เขียนขึ้นได้ง่ายและรวดเร็วกว่าการคาดเดาเอง หรือการไล่และอ่านโปรแกรม
ในส่วนต่อไปนี้ขอยกตัวอย่างวิธีการใช้โปรแกรม JCreator Pro เพื่อตรวจแก้จุดบกพร่องของโปรแกรม ดังนี้
โปรแกรม JCreator Pro มีวิธีการในการดีบักโปรแกรมโดยการไปที่เมนู Run เลือก Debug Project (หรือกดปุ่ม Ctrl+F5 หรือคลิกเลือกไอคอน ) ในกรณีที่มีไฟล์เดียวสามารถเลือกเมนู Debug File ดังภาพที่ 5-7
จากนั้นจะปรากฏกล่องข้อความความโต้ตอบที่ถามว่าต้องการจะเริ่มทำการดีบักที่เมท็อดหลักหรือ เมท็อด main ใช่หรือไม่ ให้คลิกปุ่ม Yes กรณีที่ต้องการเริ่มต้นตรวจสอบการทำงานที่เมธอด main แต่หากต้องการเริ่มตรวจสอบที่ส่วนอื่นให้ตอบ No ดังภาพที่ 5-8
จากนั้นให้กดปุ่ม F10 เพื่อดูการทำงานทีละคำสั่งตามลำดับขั้นตอนการทำงานของโปรแกรม แต่หากมีการเรียกใช้โปรแกรมย่อยหรือเมท็อดต้อง กดปุ่ม F11 เพื่อดูการทำงานแต่ละขั้นตอนย่อยในเมท็อดนั้น หากกดปุ่ม F10 จะแสดงเฉพาะผลลัพธ์จากการทำงานของเมท็อดนั้นเท่านั้น หากต้องการหยุดการดีบักก่อนที่โปรแกรมจะทำงานเสร็จสามารถทำได้โดยการกดปุ่ม Ctrl+B หรือไอคอน ตัวอย่างการดีบักโปรแกรมจะเห็นได้ว่าจะมีลูกศรชี้ว่าขณะนี้กำลังทำงานอยู่ที่บรรทัดใด ดังภาพที่ 5-9 และสามารถตรวจดูได้ด้วยว่าค่าที่เก็บอยู่ในตัวแปรแต่ละตัวคืออะไร รวมถึงการทำงานในขั้นตอนนั้น ๆ
ตัวอย่างการแสดงค่าที่เก็บในตัวแปรในขณะที่ทำคำสั่งนั้น โดยจะแสดงค่าตัวแปรในแท็บ Locals ดังภาพที่ 5-10
ตัวอย่างการแสดงหน้าจอผลการทำงานของโปรแกรมในแท็บ Debug Output
นอกจากนี้เราสามารถกำหนดจุด break point โดยการคลิกที่เลขบรรทัดในบรรทัดคำสั่งที่ต้องการให้โปรแกรมหยุดเพื่อตรวจสอบค่าตัวแปรต่าง ๆ และการกำหนดจุด break point สามารถทำได้หลายจุด ดังภาพที่ 5-12
จากภาพที่ 5-12 โปรแกรม JCreator Pro จะหยุดการทำงานอยู่ที่ตำแหน่งของ break point ที่ได้กำหนดไว้ เมื่อถึงตำแหน่งของ break point แล้ว โปรแกรม Jcreator Pro จะแสดงข้อมูลเพื่อให้สามารถตรวจสอบค่าของตัวแปรต่าง ๆ และผลลัพการทำงานได้
5.9 การวนซ้ำแบบหลายชั้น
โปรแกรมที่ประกอบไปด้วยคำสั่งที่ใช้วนซ้ำในการทำงานซ้อนกันสามารถเป็นคำสั่ง while, do-while, หรือ for แบบใดซ้อนกันก็ได้ การทำงานของโปรแกรมจะเริ่มด้วยการทดสอบเงื่อนไขของวงวนภายนอกก่อนเมื่อเงื่อนไขเป็นจริงจึงเข้าไปทำงานกลุ่มคำสั่งภายในวงวนภายนอก เมื่อพบวงวนภายในจะทำงานจนครบตามจำนวนรอบของวงวนภายใน แล้วทำคำสั่งต่อไปของวงวนภายนอกจนครบทุกคำสั่ง จากนั้นจึงจะกลับไปตรวจสอบเงื่อนไขของวงวนภายนอกอีกครั้งหากเงื่อนไขเป็นจริงจะทำซ้ำตามขั้นตอนที่กล่าวมาซ้ำอีก
ตัวอย่างที่ 5.9 เป็นตัวอย่างของโปรแกรมที่มีการวนซ้ำแบบหลายชั้นซึ่งในตัวอย่างนี้เป็นวงวน for ซ้อนอยู่ในวงวน for การทำงานของโปรแกรมอธิบายได้ดังตารางที่ 5.4
ตารางที่ 5.4 การทำงานของโปรแกรมในตัวอย่างที่ 5.9
row รอบที่ |
column รอบที่ |
row | for row<height |
column | for column<width |
ผลการทำงาน | column++ | row++ |
---|---|---|---|---|---|---|---|---|
R1 | C1 | 0 | TRUE | 0 | TRUE | * | 1 | - |
C2 | 1 | TRUE | * | 2 | - | |||
C3 | 2 | TRUE | * | 3 | - | |||
C4 | 3 | TRUE | * | 4 | - | |||
C5 | 4 | FALSE | - | - | 1 | |||
R2 | C1 | 1 | TRUE | 0 | TRUE | * | 1 | - |
C2 | 1 | TRUE | * | 2 | - | |||
C3 | 2 | TRUE | * | 3 | - | |||
C4 | 3 | TRUE | * | 4 | - | |||
C5 | 4 | FALSE | - | - | 2 | |||
R3 | - | 2 | FALSE | - | - | - | - | - |
End |
จากโปรแกรมในตัวอย่างที่ 5.9 วงวนภายนอกจะทำซ้ำ 2 รอบ และวงวนภายในจะทำซ้ำ 4 รอบเพื่อพิมพ์ * ดังนั้นผลการทำงานของวงวนภายในคือพิมพ์ * จำนวน 4 ครั้ง แต่เนื่องจากวงวนภายนอกมาควบคุมให้วงวนภายในต้องซ้ำตั้งแต่ต้นทั้งหมด 2 ครั้ง ผลการทำงานจึงมีการพิมพ์ * ทั้งหมด 8 ครั้งใน 2 บรรทัด ผังงานของโปรแกรมเป็นดังภาพที่ 5-7
5.10 คำสั่ง BREAK และ CONTINUE
คำสั่ง break และ continue เป็นคำสั่งที่นำมาใช้ร่วมกับโปรแกรมที่มีการทำงานแบบเลือกทำ และโปรแกรมแบบวนซ้ำ
คำสั่ง break มีการทำงานคือจะทำให้หยุดการทำซ้ำในวงวนทันที (สิ้นสุดการทำงานของวงวน) มักใช้ร่วมกับคำสั่ง if การทำงานของคำสั่ง break เป็นดังผังงานต่อไปนี้
คำสั่ง continue มีการทำงานคือจะหยุดการทำงานที่จุดนั้นแล้วย้อนกลับไปเริ่มต้นการทำงานที่ต้นวงวนใหม่ในรอบถัดไปทันที โดยไม่สนใจว่ายังมีคำสั่งในวงวนนั้นอีกหรือไม่ (สิ้นสุดการทำงานในรอบนั้นแล้วขึ้นรอบใหม่) มักใช้ร่วมกับคำสั่ง if การทำงานของคำสั่ง continue เป็นดังผังงานต่อไปนี้
จากโปรแกรมในตัวอย่างที่ 5.10 มีการวนซ้ำโดยใช้คำสั่ง while ซึ่งเงื่อนไขเป็นจริงตลอดไป แต่การวนซ้ำรอบที่ num = 2 กับรอบที่ num = 6 เงื่อนไขของคำสั่ง if เป็นจริงบรรทัดที่ 10 ทำให้โปรแกรมทำคำสั่ง continue ในบรรทัดที่ 11 โปรแกรมจึงขึ้นรอบใหม่โดยข้ามคำสั่งพิมพ์ค่า num ไปทำให้ในรอบที่ num = 2 กับรอบที่ num = 6 ผลการทำงานของโปรแกรมไม่มีการพิมพ์ค่า num และในส่วนของเงื่อนไข if ในบรรทัดที่ 6 เป็นจริงเมื่อ num = 10 จึงไปทำคำสั่ง break แล้วจึงหยุดหรือสิ้นสุดการทำซ้ำของวงวนนี้
ในกรณีที่มีวงวนซ้ำกันหลายชั้นคำสั่ง break และคำสั่ง continue จะดำเนินการกับวงวนที่อยู่ในสุดที่คำสั่ง break และคำสั่ง continue นั้นสังกัดอยู่ ถ้าต้องการให้โปรแกรมออกจากวงวนที่อยู่เหนือกว่าวงวนที่อยู่ในสุด จะต้องใช้คำสั่ง break และคำสั่ง continue แบบมี label โดยการกำหนด label ให้กับวงวนเปรียบเสมือนการตั้งชื่อให้กับวงวนจึงทำให้สามารถระบุได้ว่าต้องการให้คำสั่ง break และ continue ดำเนินการกับวงวนใด ดังโปรแกรมในตัวอย่างที่ 5.11 ไม่มีการกำหนด label และโปรแกรมในตัวอย่างที่ 5.12 มีการกำหนด label และใช้งานคำสั่ง continue ร่วมกับ label
จากโปรแกรมในตัวอย่างที่ 5.11 คำสั่ง continue จะไปขึ้นรอบใหม่ของวงวน while ( j <= 2 ) ซึ่งเป็นวงวนในสุดที่คำสั่ง continue นี้สังกัดอยู่ ดังนั้นในรอบที่ค่า i = 2 และ j = 2 เงื่อนไขของ if เป็นจริง โปรแกรมจึงทำคำสั่ง continue ในบรรทัดที่ 10 แล้วกลับขึ้นไปทำงานที่ต้นวงวนของ while ทำให้ไม่ได้ทำคำสั่งพิมพ์ค่า num ผลลัพธ์ของโปรแกรมจึงไม่มีการพิมพ์ค่า num ในรอบที่ i = 2 และ j = 2
จากโปรแกรมในตัวอย่างที่ 5.12 คำสั่ง continue จะไปขึ้นรอบใหม่ของวงวน for(i=1; i<=3; i++) ซึ่งเป็นวงวนที่มีชื่อ label คือ outerloop ตามที่กำหนดในบรรทัดที่ 12 เนื่องจากในรอบที่ค่า i = 2 และ j = 2 เงื่อนไขของ if เป็นจริง โปรแกรมจึงทำคำสั่ง continue ในบรรทัดที่ 12 แล้วกลับขึ้นไปทำงานที่ต้นวงวนของ for ทำให้ไม่ได้ทำคำสั่งพิมพ์ค่า num ผลลัพธ์ของโปรแกรมจึงไม่มีการพิมพ์ค่า num ในรอบที่ num = 2 และ num = 3 เพราะไปขึ้นรอบใหม่ที่ให้ i = 3
ตัวอย่างโปรแกรมเกมทายตัวเลขเป็นดังตัวอย่างที่ 5.13 โปรแกรมนี้จะทำการสุ่มตัวเลขในช่วง 1 – 100 ขึ้นมา ผู้เล่นจะต้องทำการทายตัวเลขโดยต้องทายให้ถูกภายใน 7 ครั้ง และหากต้องการออกจากโปรแกรมให้ผู้เล่นป้อนตัวเลข 999 โดยสามารถออกจากโปรแกรมได้โดยไม่ต้องรอให้เล่นจนจบเกมก่อนก็ได้ หากยังไม่ออกจากเกม เมื่อทายครบ 7 ครั้งแล้วโปรแกรมจะเริ่มต้นเกมใหม่ไปเรื่อย ๆ
5.11 แบบฝึกหัด
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
1.1 เมื่อ initial = 0, boundary = 10
1.2 เมื่อ initial = 10, boundary = 10
1.3 เมื่อ initial = 5, boundary = 4
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
2.1 เมื่อ initial = 20, boundary = 10
2.2 เมื่อ initial = 10, boundary = 10
2.3 เมื่อ initial = 5, boundary = 4
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
3.1 เมื่อ initial = 0, boundary = 10
3.2 เมื่อ initial = 10, boundary = 10
3.3 เมื่อ initial = 2, boundary = 5
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
4.1 เมื่อ initial = 0, boundary = 16
4.2 เมื่อ initial = 3, boundary = 24
4.3 เมื่อ initial = 1, boundary = 8
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
5.1 เมื่อ initial = 0, boundary = 16
5.2 เมื่อ initial = 3, boundary = 24
- ให้หาค่า sum หลังจากทำคำสั่งต่อไปนี้
- ให้หาค่า prod หลังจากทำคำสั่งต่อไปนี้
- ให้หาค่า sum หลังจากทำคำสั่งต่อไปนี้
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
- ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
ให้เขียนโปรแกรมจากโจทย์ในตัวอย่างที่ 1.5 ในบทที่ 1 เพื่อพิจารณาหาค่าธรรมเนียมการศึกษาในภาคฤดูร้อนของมหาวิทยาลัยแห่งหนึ่งซึ่งเรียกเก็บค่าธรรมเนียมการศึกษาในภาคฤดูร้อน ในอัตราดังนี้
ลงทะเบียนตั้งแต่ 1 – 3 หน่วยกิต ภาคการศึกษาละ 3,000 บาท
ลงทะเบียนตั้งแต่ 4 – 6 หน่วยกิต ภาคการศึกษาละ 4,500 บาท
ลงทะเบียนตั้งแต่ 7 – 9 หน่วยกิต ภาคการศึกษาละ 6,000 บาท
ให้นำจำนวนหน่วยกิตมาหาว่านักศึกษาต้องจ่ายค่าธรรมเนียมการศึกษาในภาคฤดูร้อนเท่าใด แล้วแสดงผลลัพธ์ออกทางจอภาพ นอกจากนี้แล้วมหาวิทยาลัยไม่อนุญาตให้นักศึกษาลงทะเบียนเกิน 9 หน่วยกิตโดยเด็ดขาด ดังนั้นหากจำนวนหน่วยกิตเกินให้กลับไปรับค่าจำนวนหน่วยกิตใหม่อีกครั้ง
- จากโจทย์ในแบบฝึกหัดข้อที่ 5 ให้เขียนโปรแกรมเพิ่มเติมเพื่อแสดงตารางการผ่อนชำระหนี้ ตัวอย่างผลลัพธ์ของโปรแกรมเมื่อป้อนจำนวนเงินกู้ 10000 บาท จำนวนปี 1 ปี และอัตราดอกเบี้ยต่อปี 0.07 (7%)
ให้สร้างกรณีทดสอบ และทำการทดสอบโปรแกรม พร้อมทั้งแก้ไขโปรแกรมต่อไปนี้ให้สามารถทำงานได้ โปรแกรมนี้ต้องการรับค่าอายุเป็นจำนวนเต็มเข้ามาแล้วตรวจสอบช่วงอายุเพื่อประเมินช่วงวัยของบุคคล ดังนี้
ถ้ามีอายุเท่ากับ 0 ปี ให้แสดงข้อความว่าระบุช่วงวัยเป็นทารก (baby)
ถ้ามีอายุตั้งแต่ 12 ปี ให้แสดงข้อความว่าระบุช่วงวัยเป็นเด็ก (child)
ถ้ามีอายุมากกว่า 12 ปี แต่น้อยกว่าหรือเท่ากับ 19 ปี ให้แสดงข้อความระบุช่วงวัยเป็นวัยรุ่น (teenager)
ถ้ามีอายุมากกว่า 19 ปี แต่น้อยกว่าหรือเท่ากับ 65 ปี ให้แสดงข้อความระบุช่วงวัยเป็นวัยผู้ใหญ่ (adult)
ถ้ามีอายุมากกว่า 65 ปี แต่น้อยกว่าหรือเท่ากับ 120 ปี ให้แสดงข้อความระบุช่วงวัยเป็นวัยผู้สูงอายุ (senior citizen)
หากมีอายุนอกช่วงที่กำหนดให้แสดงข้อความว่า Unknown age classification.