อัลกอริทึ่มทำงานวนซ้ำ หลักการเขียนโปรแกรมคอมพิวเตอร์
เนื้อหา ทบทวนการไหลของโปรแกรม โปรแกรมที่ทำงานแบบวนซ้ำ ลูปแบบ while ลูปแบบ do..while ลูปแบบ For
การไหลของโปรแกรมแบบต่าง ๆ โปรแกรมอย่างง่าย มีการไหลจากบนลงล่าง Statement1 Statement2 Statementn END START Statement3 START END Statement โปรแกรมที่มีคำสั่งเดียว โปรแกรมที่มีหลายคำสั่ง
การไหลของโปรแกรมแบบต่าง ๆ โปรแกรมแบบมีเงื่อนไข START END Statement condition true false START END Statementf condition true false Statementt คำสั่ง if คำสั่ง if..else
การวนซ้ำ กิจกรรมหลายอย่างมีลักษณะการทำงานแบบซ้ำไปมา ตัวอย่างในชีวิตประจำวัน ก้าวไปข้างหน้า 10 ก้าว ขยี้ผ้าจนกว่าจะสะอาด เรียนวิชาคอมพิวเตอร์จนกว่าจะผ่าน ตัวอย่างในการเขียนโปรแกรม วนรับตัวเลขมา 10 ตัวเพื่อหาค่าเฉลี่ย
โปรแกรมแบบวนซ้ำดียังไง? เพื่อหลีกเลี่ยงการเขียนโค้ดแบบเดียวกันซ้ำหลายรอบ ได้โปรแกรมที่สั้นและกระชับขึ้น โปรแกรมจะมีความยืดหยุ่นมากกว่า เช่นรับข้อมูลได้หลากหลายขนาด โดยไม่ต้องแก้โปรแกรม ลองนึกถึงโปรแกรมที่หาผลรวมของตัวเลข 3 ตัว
ตัวอย่าง: หาผลรวมของตัวเลข 3 ตัว เกิดโจทย์เปลี่ยนเป็นหาผลรวมของเลข 100 ตัว? หรือกี่ตัวก็ได้จนกว่าผู้ใช้จะป้อนเลขลบ Start Set sum=0 Print “Enter a value” Input n Compute Sum=sum+n stop 1st number 2nd number 3rd number
หาผลรวมตัวเลข: โฟลว์ชาร์ต START sum = 0, i = 1 i num false true n sum = sum + n i = i + 1 sum END
ลูปแบบ while ทำ statement ตราบเท่าที่ condition เป็นจริง ทำ stmt1,…,stmtN ตราบเท่าที่ condition เป็นจริง START while (condition) statement; condition false true Statement while (condition) { stmt1; stmt2; : stmtN; } END
หาผลรวมตัวเลข: โปรแกรม EX1. ให้เขียนโปรแกรมหาผลรวมตัวเลขโดยใช้ลูป while และให้รับค่าจำนวนลูป (num) จากผู้ใช้
หาผลรวมตัวเลข: โฟลว์ชาร์ต START เงื่อนไขที่เปรียบเทียบระหว่างตัวนับรอบ กับ ค่าควบคุม loop sum = 0, i = 1 ค่าควบคุม loop num i num false true n ตัวนับรอบ ซึ่งจะเดินเข้าหา ค่าควบคุม loop เสมอ sum = sum + n i = i + 1 sum END
ลับสมอง เขียนโฟลว์ชาร์ตและโปรแกรมภาษา C เพื่อคำนวณค่า sum โดยที่ sum นิยามจากสูตร โดยที่ค่า N รับมาจากผู้ใช้ เช่นถ้า N = 3, sum = 1+4+9 = 14 ตัวอย่างผลลัพธ์ #include <stdio.h> #include <conio.h> void main() { int sum = 0, i = 1, N; printf("Enter N: "); scanf(“%d”,&N); while ( i <= N ) { sum = sum + i*i; i = i+1; } printf("The sum is %d.",sum); ??? ??? Enter N: 3 The sum is 14
ลูปแบบดักค่า ที่ผ่านมาเป็นตัวอย่างของลูปวนนับ (counter loop) จำนวนครั้งที่วนซ้ำขึ้นอยู่กับค่าที่กำหนดไว้แล้ว ทำอย่างไรหากเราไม่ทราบจำนวนล่วงหน้า ใช้ลูปแบบดักค่า (sentinel loop) นิยามค่าที่ใช้ดัก เพื่อให้โปรแกรมหลุดออกจากลูป ตัวอย่าง ตัวดัก Enter a number, or -1 to quit: 3 Enter a number, or -1 to quit: 10 Enter a number, or -1 to quit: 15 Enter a number, or -1 to quit: -1 The sum is 28
หาผลรวมตัวเลข: โฟลว์ชาร์ต START เงื่อนไขที่เปรียบเทียบค่าที่รับเข้ามา กับค่าที่ใช้ดัก (ในตัวอย่างนี้คือ -1) เพื่อให้ออกจาก loop sum = 0 ค่าที่ใช้ในการหา output และใช้สำหรับควบคุม loop num num <> -1 false true sum = sum + num num sum END
ลูปแบบ do...while ทำ stmt1...stmtN ตราบเท่าที่เงื่อนไขยังเป็นจริง START do { stmt1; stmt2; : stmtN; } while (condition); true Statement Statement condition false END
หาผลรวมตัวเลข: โฟลว์ชาร์ต START sum = 0, i = 1 ค่าควบคุม loop num n ตัวนับรอบ ซึ่งจะเดินเข้าหา ค่าควบคุม loop เสมอ sum = sum + n true i = i + 1 true i num เงื่อนไขที่เปรียบเทียบระหว่างตัวนับรอบ กับ ค่าควบคุม loop false sum END
ลูปแบบ do...while เปรียบเทียบการทำงานของส่วนของโปรแกรมทั้งสองแบบ โปรแกรมที่ 1 โปรแกรมที่ 2 a = 5 do { a=a+1 print a } While (a<5) a = 5 While (a<5) { a=a+1 print a }
สรุป การเขียนโปรแกรมแบบวนซ้ำ ลูปวนนับ ลูปดักค่า โครงสร้างลูปแบบ while โครงสร้างลูปแบบ do..while
แบบฝึกหัด 6.1 จงเขียนผังงานแสดงเลขคู่ที่อยู่ภายใน 1-100 ออกทางจอภาพโดยใช้โครงสร้างการวนซ้ำแบบ while…structure จงเขียนผังงานหาผลรวม และหาค่าเฉลี่ยของข้อมูลตัวเลขทศนิยมชุดหนึ่ง จำนวน 100 ตัว โดยใช้โครงสร้างการวนซ้ำแบบ while…structure จากโจทย์ข้อ 2 ให้เขียนด้วยโครงสร้างแบบ do/while…structure จากโจทย์ข้อ 1 แก้ไขโปรแกรมให้สามารถแสดงเลขคู่ได้ไม่จำกัดรอบ จนกว่าผู้ใช้จะกรอกตัวเลข -1
แบบฝึกหัด 6.1 1....... 2...... 3. ตรวจสอบว่า a <= 10 ใช่หรือไม่ - ใช่ - ทำ คำสั่งนี้... - วนกลับไปทำข้อ 3 - ไม่ใช่ ทำข้อ 4... 4. ... 1....... 2...... 3. ทำ คำสั่งนี้... 4. ตรวจสอบว่า a <= 10 ใช่หรือไม่ - ใช่ วนกลับไปทำข้อ 3 ... - ไม่ใช่ ทำข้อ 5 5. .....
จงเขียนผังงานหาผลรวม และหาค่าเฉลี่ยของข้อมูลตัวเลขทศนิยมชุดหนึ่ง จำนวน 100 ตัว START 1. กำหนดให้ i = 1, sum = 0 2. ตรวจสอบ i <= 100 ใช่หรือไม่ - ใช่ - รับค่าตัวเลขเก็บใน n - sum = sum+n - i = i+1 - วนกลับไปทำข้อ 2 - ไม่ใช่ ทำข้อ 3 3. avg = sum/100 4. แสดงค่า sum 5. แสดงค่า avg Let sum = 0 and i = 1 false i 100 true n Increment sum by n Increment i by 1 avg = sum / 100 sum, avg END
การวนซ้ำโดยใช้โครงสร้าง for
คำสั่ง for สะดวกสำหรับการนับรอบของลูป การดำเนินการที่เกี่ยวข้อง ทำ init_stmt หนึ่งครั้ง ตรวจสอบ condition; ถ้าเป็นจริงให้ทำงานใน loop body ทำ update_stmt, แล้วทำงานในขั้นตอนที่ 2 for (init_stmt; condition; update_stmt) statement; for (init_stmt; condition; update_stmt){ statement1; statement2; : statementN; }
คำสั่ง for: ผังการทำงาน START END false condition true Initialize counter Update counter Statement
for vs. while คำสั่ง: พิมพ์เลข 1,2,...,10 ออกหน้าจอ for loop #include <stdio.h> #include <conio.h> void main() { int i; i = 1; while (i <= 10) { printf(“%d”,i); i++; } while loop #include <stdio.h> #include <conio.h> void main() { int i; for (i = 1; i <= 10; i++) { printf(“%d”,i); } for loop
ทดสอบ: พิมพ์ดาว เขียนโปรแกรมเพื่อพิมพ์ดาวจำนวน N ดวง เมื่อ N กำหนดโดยผู้ใช้ ตัวอย่าง #include <stdio.h>; #include <conio.h>; void main() { int i,N; printf("Enter N: "); scanf(“%d“,N); for (i = 1; i <= N; i++) { printf("*"); } printf(“\n”); Enter N: 3 *** Enter N: 8 ******** ? ? ? ???
ตัวอย่าง แสดงค่า 0,2,4,...,20 แสดงค่า 1,3,5,...,19 แสดงค่า 15,12,9,...,0 for (i = 0; i <= 20; i += 2) printf(“%d”,i); for (i = 1; i <= 19; i += 2) printf(“%d”,i); ? ? ? for (i = 15; i >= 0; i -= 3) printf(“%d”,i); ? ? ?
ลูปหลายชั้น โปรแกรมที่มีความซับซ้อนมากขึ้นอาจมีความต้องการใช้ลูปหลายชั้น คล้ายกันกับคำสั่ง if ตัวอย่าง #include <stdio.h>; #include <conio.h>; void main() { int sum = 0, i, j, N; printf("Enter N: "); scanf(“%d“,N); for (i = 1; i <= N; i++) { for (j = 1; j <= i; j++) { sum = sum + j; } printf("Sum is %d", sum); Outer Loop Inner Loop
ตัวอย่าง: พิมพ์ดาวอีกครั้ง! เพิ่มเติมจากโปรแกรมพิมพ์ดาวเดิม ตัวอย่าง Enter N: 3 * ** *** #include <stdio.h>; #include <conio.h>; void main() { int i, j, N; printf(“Enter N:”); scanf(“%d”,&N); for (i = 1; i <= N; i++) { for (j = 1; j <= i; j++) { printf("*"); } printf(“\n”); Enter N: 5 * ** *** **** *****
แบบฝึกหัด 6.2 จงเขียนโปรแกรมเพื่อรับตัวเลขอินพุท N จากผู้ใช้และแสดงตัวเลขทั้งหมดที่เป็นตัวประกอบของ N (นำไปหาร N แล้วลงตัว)
แบบฝึกหัด 6.3 จงเขียนโปรแกรมเพื่อรับตัวเลขอินพุท N จากผู้ใช้และแสดงตัวเลขทั้งหมดที่เป็นตัวประกอบของ N (นำไปหาร N แล้วลงตัว)
หาค่าเฉลี่ยของเลข 100 จำนวนที่รับเข้ามาโดยใช้ loop แบบ for Increment sum by n END START Let sum = 0 and i = 1 n sum, avg avg = sum / 100 For i=1 to 100 step 1