Week 5 While and Do-While loop (Control Structure 2)
Outline การทำซ้ำ (Iteration) while statement do-while statement
Iteration การทำซ้ำ (Iteration) หรือการประมวลผลซ้ำ หลายครั้งในการเขียนโปรแกรม ที่เราต้องการทำงานตามคำสั่ง (statement) หรือ กลุ่มคำสั่ง (compound statement) ซำ้ๆมากกว่าหนึ่งครั้ง การประมวลผลซ้ำจะช่วยให้เราสามารถทำซ้ำๆได้อย่างต้องการ โดยที่ไม่จำเป็นต้องเขียน คำสั่งหรือกลุ่มคำสั่งที่ต้องการซ้ำไปมาในโปรแกรม อาจเรียกอีกอย่างว่า การวนลูป (Loop) ในการทำซ้ำลักษณะนี้จะอาศัยเงื่อนไข (condition) เป็นตัวกำหนด True - โปรแกรมจะวนทำคำสั่ง หรือชุดคำสั่งที่อยู่ภายในลูปซ้ำอีก False - โปรแกรมจะออกจากลูป แล้วทำงานคำสั่งถัดไป (next-statement)
Components of Iteration ส่วนประกอบของการทำซ้ำ มี 3 อย่าง ได้แก่ การกำหนดค่าเริ่มต้น (Initialization) กำหนดค่าตั้งต้นให้กับตัวแปร ซึ่งจะใช้เป็นเงื่อนไขในการทำงาน เช่น x = 0, y = 100, … การทดสอบเงื่อนไข (Condition Testing) ทดสอบเงื่อนไขในการทำซ้ำ ว่ายังเป็นจริงหรือไม่ จะมีการวนเข้าไปทำซ้ำในคำสั่งหรือกลุ่มคำสั่งที่กำหนด ตราบใดที่เงื่อนไขยังเป็น true จะจบการทำซ้ำ เมื่อผลการทดสอบเงื่อนไขเป็น false เช่น x < 10, x > -5, x <= 99, … การปรับปรุงค่า (Increment / Decrement) การเพิ่มค่า (increment) หรือลดค่า (decrement) ตัวแปรซึ่งใช้เป็นเงื่อนไขในการทำงาน เช่น x=x+1, x+=10, x++, x--, ++x, --x, x*=2, …
Type of Iterations ประเภทของคำสั่งในการทำซ้ำ ในวิชานี้จะสนใจเพียง 4 รูปแบบ ได้แก่ while statement do-while statement for statement break and continue statements
while statement เริ่มต้นด้วยการตรวจสอบเงื่อนไข (condition) while (condition) { statement1; statement2; ... statementN; } next-statement; เริ่มต้นด้วยการตรวจสอบเงื่อนไข (condition) หากเงื่อนไขเป็น true โปรแกรมจะเข้าลูปไปทำคำสั่ง หรือกลุ่มคำสั่งที่กำหนดไว้ เมื่อทำงานในลูปเสร็จสิ้น โปรแกรมจะวนกลับไปตรวจสอบเงื่อนไขอีก ดังนั้นโปรแกรมจะวนทำงานในลูป ตราบเท่าที่เงื่อนไขยังเป็น true เมื่อเงื่อนไขเป็น false โปรแกรมจะออกจาก ลูป แล้วจึงทำ next-statement Cond Statement 1 Statement 2 Entry True False Exit
อีกรูปแบบของ Flowchart while statement while (condition) { statement1; statement2; ... statementN; } next-statement; อีกรูปแบบของ Flowchart Cond Statement 1 Statement 2 Entry True False Exit Cond Statement 1 Statement 2 Entry True False Exit
Example: while statement Example 5.1: แสดงเลข 1 ถึง N หรือสามารถลดรูปลงได้เป็น จะเกิดอะไรขึ้น? ถ้าหาก... เปลี่ยนจาก i++ เป็น ++i Initialization: i=1; Testing: i<=n; Update: i+=1;
Example: while statement Example 5.2: แสดงสูตรคูณแม่ N ต้องแก้ไขอย่างไร หากต้องการให้แสดง ผลลัพธ์เพียงบรรทัดละ 5 ตัว? ใช้ modulo ช่วยในการทดสอบเกี่ยวกับการหารลงตัว (divisable by …) โดยหากเศษมีค่า “ไม่เท่ากับ 0” แสดงว่าหารไม่ลงตัว ซึ่งจะทำให้ (i%COL) มีค่าความจริงเป็น True เนื่องจากมีค่า “ไม่เท่ากับ 0” ทำให้โปรแกรมพิมพ์ช่องว่า “ “ และไม่ต้องขึ้นบรรทัดใหม่ แต่หากหารลงตัวจะมีเศษเท่า 0 ก็จะทำให้ (i%COL) มีค่าความจริงเป็น false ซึ่งจะทำให้มีการขึ้นบรรทัดใหม่ (newline) Initialization: i=1; Testing: i<13; Update: i++;
Example: while statement Example 5.3: หาค่าผลบวกกำลังสอง ของเลขคี่ระหว่าง 0 ถึง N มาก => น้อย!!! น้อย => มาก!!! Initialization: cin>>n; Testing: n>0; Update: n--; Initialization: i=1; Testing: i<=n; Update: i++;
Example: while statement Example 5.4: หาค่าผลรวมของจำนวนที่อยู่ระหว่าง M ถึง N ซึ่งหารด้วย X ลงตัว น้อย => มาก!!! Initialization: i=m; Testing: i<=n; Update: i++;
do-while statement do { statement1; statement2; ... statementN; } while (condition); next-statement; เริ่มต้นด้วยการเข้าลูปไปทำคำสั่ง หรือกลุ่มคำสั่งที่กำหนดไว้ก่อน เมื่อทำงานในลูปเสร็จสิ้น โปรแกรมจึงจะตรวจสอบเงื่อนไขการทำซ้ำ หากเงื่อนไขเป็น true โปรแกรมจะวนกลับเข้าลูปไปทำอีก และจะวนทำตราบใดที่เงื่อนไขยังเป็น true เมื่อเงื่อนไขเป็น false โปรแกรมจึงจะออกจากลูป แล้วทำ next-statement โปรแกรมจะทำในลูปอย่างน้อย 1 ครั้งเสมอ expr Statement 1 Statement 2 Entry True False Exit
Example: do-while statement Example 5.1: แสดงเลข 1 ถึง N while do-while Initialization: i=1; Testing: i<=n; Update: i+=1; การทำงานต่างกันหรือไม่ หากป้อนค่า n=0 ???
Example: do-while statement Example 5.2: แสดงสูตรคูณแม่ N while do-while Initialization: i=1; Testing: i<13; Update: i++;
Example: do-while statement Example 5.3: หาค่าผลบวกกำลังสอง ของเลขคี่ระหว่าง 0 ถึง N while do-while Initialization: cin >> n; Testing: n > 0; Update: n--; การทำงานต่างกันหรือไม่ หากป้อนค่า n=0
What could go wrong? ปัญหาที่พบบ่อยครั้งจากการทำซ้ำ แนวทางการแก้ไข โปรแกรมวนทำซ้ำโดยไม่ออกจากลูป (infinity loop) x=1, while (x<10), x-- โปรแกรมไม่เข้าไปทำงานในลูปเลย x=1, while (x>10) แนวทางการแก้ไข ตรวจสอบเงื่อนไข (condition) การทำซ้ำว่าเป็น true หรือ false เสมอหรือไม่ ตรวจสอบตัวแปรที่จะใช้ทดสอบ ว่ามีการปรับปรุงค่าหรือไม่ ตรวจสอบว่าตัวแปรสามารถจะมีค่าที่จะทำให้เงื่อนไขเป็นได้ทั้ง true และ false หรือไม่
Summary การทำซ้ำ (iteration) หรือการวนลูป จะช่วยให้เราทำงานคำสั่งหรือกลุ่มคำสั่งที่ต้องการได้หลายครั้ง โดยไม่จำเป็นต้องเขียนคำสั่งซ้ำไปมา ต้องมีการตรวจสอบเงื่อนไข (condition) ก่อนการทำงานในแต่ละรอบการวนลูป โปรแกรมจะเข้าไปทำงานในลูป เมื่อผลการทดสอบเงื่อนไขเป็น true เท่านั้น โปรแกรมจะจบการทำงานในลูป เมื่อผลการทดสอบเงื่อนไขเป็น false ส่วนประกอบในการทำซ้ำ ได้แก่ การกำหนดค่าเริ่มต้น (initialization) ให้กับตัวแปรที่จะใช้ทดสอบ การทดสอบเงื่อนไข (condition testing) กับตัวแปร การเพิ่มค่าหรือลดค่า (increment/decrement) ตัวแปรที่ใช้ทดสอบ
Summary สามารถใช้ while และ do-while ทดแทนกันได้ มักใช้ในกรณีที่ไม่สามารถระบุจำนวนรอบในการทำงานล่วงหน้าได้ เช่น continue (y/n)?, จำนวนข้อมูลที่หาร x ได้ลงตัว, … do-while loop จะมีการทำงานภายในลูปอย่างน้อย 1 รอบการทำงาน ในกรณีที่ทราบล่วงหน้าว่าถึงจำนวนรอบการทำงานที่แน่นอน มักจะนิยมใช้ for ซึ่งจะกล่าวถึงในหัวข้อถัดไป เมื่อพบปัญหาในการทำซ้ำ ให้พิจารณาและตรวจสอบที่การกำหนดค่าเริ่มต้น การทดสอบเงื่อนไข และการปรับปรุงค่าตัวแปร การวนทำซ้ำโดยไม่ออกจากลูป การไม่เข้าไปทำในลูป
Lab Lab 5.1 - หาค่าผลรวม (summation) ของจำนวนที่อยู่ระหว่าง M และ N ซึ่งหารด้วย X ลงตัว กำหนดให้ใช้ do-while ในการวนลูป แสดงผลจำนวนที่หารด้วย X ลงตัว จากมากไปหาน้อย Lab 5.2 - จาก lab 5.1 ให้ นศ. เพิ่มความสามารถให้โปรแกรมสามารถหาค่าเฉลี่ย (average) ของจำนวนทั้งหมดที่หารด้วย X ลงตัวด้วย สร้างตัวแปรใช้นับจำนวน (counter) ข้อมูลที่หารด้วย X ลงตัว สร้างตัวแปรที่ใช้เก็บค่าเฉลี่ย (average) และแสดงผลทางหน้าจอ
Lab Lab 5.3 - หาค่าของ n! (n factorial) โดยกำหนดให้ เมื่อ n < 0:
Lab Lab 5.4 - จาก lab 5.3 จงแก้ไขให้โปรแกรมสอบถามผู้ใช้ก่อนจบโปรแกรมว่า ต้องการทำงานต่อ (continue) หรือไม่ (y/n) y - ต้องการทำงานต่อ ให้โปรแกรมวนรับค่า n เพื่อคำนวณ n! อีกรอบ n หรือคำตอบอื่นๆ - ไม่ต้องการทำงานต่อ ให้จบการทำงาน