Week 5 การทำซ้ำโดย while loop และ do while loop
Outline Loop while Statement do-while Statement Mini Debugging Lab การใช้ Loop ในภาษา C สามารถทำได้โดยใช้คำสั่ง “while”, “do while” และ “for” ใน คาบเรียนนี้ จะเรียน “while” และ “do while” ก่อน และเรียน “for” ในคาบถัดไป
Loop ในการเขียนโปรแกรม จะมีการประมวลผลซ้ำ (Loop หรือ Iterate) เพื่อให้ โปรแกรมทำงานตาม Statement หรือการประมวลผล ที่กำหนดไว้ ซ้ำมากกว่า 1 ครั้ง โดยไม่จำเป็นที่จะต้องเขียน Statement นั้น ซ้ำไปซ้ำมาในโค้ด การทำงานจะทำงานตาม Statement ไปจนหมด แล้ว ถ้าหาก เงื่อนไขที่กำหนดไว้ให้ทำซ้ำ ยังเป็นจริง โปรแกรมจะวนกลับไปทำงานตาม Statement อีกรอบ จนกว่า เงื่อนไขที่กำหนดไว้จะเป็นเท็จ
ส่วนประกอบของการ iteration มีอยู่ 3 ประเภท Initialization คือ การกำหนดค่าเริ่มต้นของตัวแปรที่จะเป็นเงื่อนไขในการ iteration เช่น x = 1 Testing คือ การทดสอบว่า เงื่อนไขที่ทำการ Iteration นั้นยังเป็นจริงหรือไม่ จะมีการทำ Iteration ไปเรื่อยๆ หากเงื่อนไขยังเป็นจริง เช่น x > 99 Incrementing เป็นการเปลี่ยนแปลงค่าของตัวแปรที่ใช้เป็นเงื่อนไขในการ Iteration เช่น x = x + 1 การทำงานของ Loop จะมีการกำหนดเงื่อนไขที่จะให้ โปรแกรมทำงานซ้ำ และ เงื่อนไขที่จะทำให้โปรแกรมหยุดการทำงานซ้ำ โดยทั่วไป สามารถใช้ตัวแปรมาช่วยในการกำหนดเงื่อนไขดังกล่าวได้ เช่น กำหนดให้ตัวแปร x เป็นจำนวนครั้ง จะทำเงื่อนไขเดิมซ้ำเรื่อยๆ หากจำนวนครั้งยังน้อยกว่า 10 หรือ x < 10 นั่นเอง และ ทุกครั้งที่ทำงานจะต้องมีการเพิ่มค่าของตัวแปร x เข้าไป ดังนั้น ส่วนประกอบของการทำซ้ำ หรือ Iteration จึงประกอบไปด้วย 3 ส่วน คือ Initialization เพื่อกำหนดค่าเริ่มต้นของตัวแปรที่ใช้ทดสอบ Testing ดูว่าค่าของตัวแปรนั้นยังอยู่ในเงื่อนไขที่ให้ทำซ้ำอยู่หรือไม่ เปลี่ยนแปลงค่าของตัวแปรที่ใช้ทดสอบ
ประเภทของ Iteration Statement คือ วิธีการทำให้โปรแกรมทำงานเป็น Loop ได้ ในภาษา C มีอยู่ 4 ชนิดด้วยกัน while statement do-while statement for statement break and continue statement วิธีการมีอยู่ 4 ประเภท while do while for break และ continue สำหรับประเภทที่ 4 break และ continue จะเป็นคำสั่งที่สามารถใช้ร่วมกับ 1-3 เพื่อกำหนดเงื่อนไขให้ Loop หยุดทำงาน หรือให้ Loop ทำงานต่อไป
while statement
while Statement มีการตรวจสอบเงื่อนไขก่อน หากเงื่อนไขเป็นจริง โปรแกรมจะเริ่มทำตาม Statement ที่กำหนดไว้ แล้วกลับไปเริ่มต้นใหม่ จนกว่าเงื่อนไขจะเป็นไม่เป็นจริง ถึงจะหยุดการทำงาน แล้วออกไปจาก Loop การใช้ while จะแตกต่างกับ do while จะมีลักษณะการใช้งานคล้ายๆ กัน แต่แตกต่างกันตรงที่ว่า while จะมีการตรวจสอบเงื่อนไขก่อน ถึงจะเริ่มทำในครั้งแรก และยังจะตรวจสอบเงื่อนไขสำหรับตอบต่อๆ ไปอีกด้วย แต่ do while จะเริ่มทำทำงานตามคำสั่งก่อน 1 ครั้ง จากนั้นถึงจะตรวจสอบเงื่อนไงสำหรับรอบต่อ ๆไป
Syntax while (condition) { statement1; statement2; ... statementN; } จะเริ่มต้นด้วยการกำหนดเงื่อนไข ที่จะให้ทำงานเป็น Loop ก่อนเสมอ และภายใน statement ใน Loop ควรจะมี statement ที่ทำการเปลี่ยนแปลงค่าตัวแปรที่ใช้ตรวจสอบ มิเช่นนั้น Loop อาจทำงานไม่หยุด
Flowchart Entry Statement 2 True Statement 1 False Exit expr จาก Flowchart จะพบว่า เริ่มต้น จะต้องมีการทดสอบ เงื่อนไข (Condition) จาก Expression (expr) เสมอ ว่าเป็นจริงหรือไม่ False Exit
Example Example 1 พิมพ์เลข 1 ถึง 10 โดยใช้ while loop Example 2 เลือกการทำงานจากตัวเลข Menu ที่กำหนดไว้ หากเลือกตัวเลขนอกเหนือที่กำหนดไว้ จะต้อง ใส่ตัวเลขที่เลือกใหม่
Example 1 #include <stdio.h> void main() { int count; count = 1; printf(“Print count from 1 to 10\n”); while (count <= 10) { printf(“%d ”, count); count++; } printf(“\n”); ในตัวอย่างนี้ จะพิมพ์ตัวเลขตั้งแต่ 1 ถึง 10 เงื่อนไขที่ให้ loop ทำงานคือ ตราบใด ที่ ตัวแปร count น้อยกว่าหรือเท่ากับ 10 ให้ทำงานต่อไปเรื่อยๆ while (count <= 10) โดยที่ ตัวแปร count จะมีค่าเริ่มต้นเท่ากับ 1 และภายใน Loop จะมีการเปลี่ยนแปลงค่าของตัวแปร count คือ ทุกๆ รอบการทำงาน ตัวแปร count จะมีค่าเพิ่มขึ้นมา 1 count++ Print count from 1 to 10 1 2 3 4 5 6 7 8 9 10 ตัวอย่าง Output จากการทำงาน
Example 2 #include <stdio.h> int main() { int a; /* initatialize value of a so that it can enter the loop */ a = 4; while (a != 1 && a !=2 && a !=3) { printf("1. Check spelling\n"); printf("2. Correct spelling errors\n"); printf("3. Display spelling errors\n"); printf("Enter your choice (1-3): "); scanf(“\n%d", &a); /* read selection from keyboard */ switch(a) { case 1: printf("Check spelling\n"); break; case 2: printf("Correct spelling errors\n"); case 3: printf("Display spelling errors\n"); default: /* do nothing */ } จากตัวอย่างนี้ ผู้ใช้จะต้องเลือกตัวเลือกที่มาจาก 1 และ 2 และ 3 หากผู้ใช้ใส่ตัวเลือกนอกเหนือจาก 1 และ 2 และ 3 Loop จะทำการรับค่าซ้ำไปเรื่อยๆ จนกว่าผู้ใช้จะใส่ตัวเลขให้ตรงเงื่อนไข สิ่งที่ทำซ้ำใน Loop คือ การแสดงผลตัวเลือกในเมนูออกมาทุกครั้ง และรับค่าจากผู้ใช้ เนื่องจากการใช้งาน while loop จะต้องการตรวจสอบเงื่อนไขก่อนมีเงื่อนไข จึงต้องมีการกำหนดค่าตัวแปร a ที่ใช้ในการตรวจสอบเงื่อนไข ให้มีค่าเริ่มต้นที่จะสามารถทำให้ Loop เริ่มทำงานนั่นเอง นั่นก็คือ Loop จะทำงานได้เมื่อ ตัวแปร a ไม่ค่าไม่เท่ากับ 1 และ 2 และ 3 ดังนั้นตัวแปร a จะถูกกำหนดให้เป็นค่าใดๆ ก็ได้ที่นอกเหนือไปจาก 1 และ 2 และ 3 Note ในคำสั่ง scanf จะใช้ scanf(“\n%d", &a); มีการใส่ \n เข้ามา เนื่องจากการใส่ค่าลงไป จะกดตัวอักษรและ Enter แต่โปรแกรมจะทำการอ่านค่าตัวอักษร ในรอบแรกและรอบถัดไปจะอ่านค่า Enter ทำให้ในการทำงานรอบที่สองโปรแกรมไม่รอรับค่า ละเพื่อให้การทำงานในรอบต่อๆ ไปสามารถทำได้ จะมีการใช่ \n เพื่อให้โปรแกรมทิ้งค่า Enter ไปแล้วรอรับอักษรรอบใหม่ ซึ่งสามารถใช้คำสั่ง getchar แทนได้
Example 2 1. Check spelling 2. Correct spelling errors 3. Display spelling errors Enter your choice (1-3): 5 Enter your choice (1-3): 1 Check spelling ตัวอย่าง Output จากการทำงาน
do while Statement
do while Statement จะแตกต่างจาก while Statement โดยที่ โปรแกรมจะเริ่มทำงานตาม Statement ที่ระบุไว้เลย โดยไม่มีการเช็ค Condition ก่อน จากนั้นเมื่อทำงานเสร็จแล้วถึงจะเช็คเงื่อนไข หากเงื่อนไขเป็นจริง จะทำการทำซ้ำ แต่หากเงื่อนไขเป็นเท็จจะจบการทำงานแล้วออกจาก Loop ข้อแตกต่างของ do while จาก while คือ do while จะเริ่มทำงานครั้งแรกโดยไม่ตรวจสอบเงื่อนไขเลย แต่จะเริ่มตรวจสอบเงื่อนไขสำหรับรอบครั้งถัดไป
Syntax do { statement1; statement2; ... statementN; } while (condition); รูปแบบการใช้งาน จะแตกต่างจาก while ตรงที่ว่า คำสั่ง while (condition) จะย้ายจากบรรทัดบนสุดไปอยู่บรรทัดท้ายสุด
Flowchart Entry Statement 1 Statement 2 True False Exit expr จาก Flowchart พบว่า ในรอบแรกจะเริ่มทำงานตาม Statement ใน Loop เลย โดยไม่มีการตรวจสอบเงื่อนไขก่อน False Exit
Example Example 1 พิมพ์เลข 1 ถึง 10 โดยใช้ while Loop Example 2 เลือกการทำงานจากตัวเลข Menu ที่กำหนดไว้ หากเลือกตัวเลขนอกเหนือที่กำหนดไว้ จะต้อง ใส่ตัวเลขที่เลือกใหม่
Example 1 /* print count from 1 to 10 */ #include <stdio.h> void main() { int count; count = 1; printf(“Print count from 1 to 10\n”); do { printf(“%d ”, count); count++; } while (count <=10); printf(“\n”); } สิ่งที่เปลี่ยนแปลงไปคือ ใช้ do while เข้ามาแทน while แต่ผลที่ได้รับยังเหมือนกัน Print count from 1 to 10 1 2 3 4 5 6 7 8 9 10 ตัวอย่าง output จากการทำงาน
Example 2 #include <stdio.h> void main() { int a; do { printf("1. Check spelling\n"); printf("2. Correct spelling errors\n"); printf("3. Display spelling errors\n"); printf("Enter your choice (1-3): "); scanf(“\n%d", &a); /* read selection from keyboard */ switch(a) { case 1: printf("Check spelling\n"); break; case 2: printf("Correct spelling errors\n"); case 3: printf("Display spelling errors\n"); default: /* do nothing */ } } while (a != 1 && a != 2 && a !=3); สิ่งที่แตกต่างจากการใช้ do while ก็คือ โปรแกรมจะเริ่มทำงานใน Loop โดยไม่มีการตรวจสอบเงื่อนไขก่อน ดังนั้น จึงไม่จำเป็นต้องกำหนดค่าให้ ตัวแปรตั้งแต่แรก เนื่องจากว่า ใน Loop จะมีคำสั่งที่ใช้รับค่าของตัวแปร a เข้ามาจากผู้ใช้อยู่แล้ว (ตัวอย่างที่ 1 ไม่มีการรับค่าจากผู้ใช้ จึงต้องมีการกำหนดค่าเริ่มต้นให้ตัวแปร count)
Example 2 1. Check spelling 2. Correct spelling errors 3. Display spelling errors Enter your choice (1-3): 5 Enter your choice (1-3): 1 Check spelling ตัวอย่าง output จากการทำงาน
Mini Debugging ปัญหาที่พบได้บ่อยจากการใช้ Loop แนวทางการแก้ไข Infinity Loop คือ โปรแกรมทำงานตาม Statement ไปเรื่อยๆ โดยไม่สามารถออกจาก Loop ได้ โปรแกรม ไม่สามารถทำงาน ใน Loop ได้ แนวทางการแก้ไข ตรวจสอบ Condition ที่กำหนด ว่า เป็น จริง หรือ เป็น เท็จ เสมอ หรือไม่ ตรวจสอบค่าของตัวแปรที่ใช้งาน ว่ามีการเปลี่ยนแปลงค่าได้หรือไม่ ตรวจสอบ ว่า ค่าของตัวแปรที่ใช้ในเงื่อนไข สามารถทำให้ Condition เป็น จริง หรือ เท็จได้หรือไม่