300 likes | 554 Views
คำสั่งทำซ้ำ ( 3 ). ภาพรวมเนื้อหา. i f () break ; i f () continue ; Nested for แบบมีทางเลือก การติดตามการทำงานของโปรแกรมด้วยมือ. วงวนไม่รู้จบ. เช่น ลักษณะการทำงานของโปรแกรมที่ ทำซ้ำเช่นนี้ไปเรื่อยๆจนกว่าผู้ใช้จะเลิกการทำงานของโปรแกรมเอง
E N D
ภาพรวมเนื้อหา • if () break ; • if () continue ; • Nested for แบบมีทางเลือก • การติดตามการทำงานของโปรแกรมด้วยมือ
วงวนไม่รู้จบ • เช่น ลักษณะการทำงานของโปรแกรมที่ ทำซ้ำเช่นนี้ไปเรื่อยๆจนกว่าผู้ใช้จะเลิกการทำงานของโปรแกรมเอง • วิธีการสร้างวงวน (loop) เพื่อให้ทำซ้ำคำสั่งไปเรื่อยๆไม่รู้จบ ทำได้ด้วยคำสั่ง while(1) ดังนี้ while (1) { //กลุ่มคำสั่งที่ต้องการทำซ้ำ } // เมื่อถึงบรรทัดนี้จะวนกลับไปทำใหม่ รับข้อมูล ประมวลผล แสดงผล
ตัวอย่าง • เขียนโปรแกรมรับค่าข้อมูลไปเรื่อยๆ จากนั้นให้แสดงผลลัพธ์ของตัวเลขที่รับเข้ามาทางหน้าจอ เขียน code ได้ดังนี้ while(1) { Input x Print x }
วงวนไม่รู้จบ • อาจสงสัยว่า แล้วโปรแกรมจะเลิกทำงานเมื่อไหร่ • โปรแกรมจะทำงานไม่เลิก ผู้ใช้ต้องหยุดการทำงานเองโดยกดปุ่ม Ctrl + c • การทำงานของวงวนเพื่อทำกลุ่มคำสั่งซ้ำๆ จะน่าสนใจมากขึ้น ถ้าเราสามารถหยุดการทำซ้ำ แล้วกระโดดออกจากวงวนไปทำอย่างอื่นต่อ
การกระโดดออกจากวงวน • การกระโดดออกจากวงวนใช้คำสั่ง if ( เงื่อนไข) break; หมายความว่า ถ้าเงื่อนไขภายในวงเล็บเป็นจริง ให้กระโดดออกจากวงวนที่คำสั่งนี้อยู่ • ตัวอย่าง เช่น คำสั่งบรรทัดนี้จะทำให้โปรแกรมกระโดดออกจากวงวนเมื่อ x มีค่าเป็น 2 ผลลัพธ์โปรแกรม
การกระโดดออกจากวงวน • การกระโดดออกจากวงวนใช้คำสั่ง if ( เงื่อนไข) break; • เราไม่สามารถใช้คำสั่ง break โดดๆโดยไม่มี if เพื่อกระโดดออกจากวงวน • แม้ทำได้ คำสั่งที่ตามหลัง break จะไม่ทำงานเลย (เราจะเขียนไปทำไม) เมื่อเข้ามาใน while โปรแกรมจะกระโดดออกไปบรรทัด 7 เลย
if () … break; • เป็นคำสั่งที่ใช้ในการทดสอบเงื่อนไข เพื่อออกจากการทำงานของ loop • ถ้าเงื่อนไขในวงเล็บหลัง if เป็นเท็จ จะวนทำคำสั่งใน loop ไปเรื่อยๆ • เมื่อเงื่อนไขในวงเล็บหลัง if เป็นจริงจะหยุดการทำงานใน loop
ตัวอย่าง : การทดสอบจำนวนเฉพาะ • จำนวนเฉพาะ (prime number) คือ จำนวนเต็มมากกว่า 1 ที่มีแค่ 1 และตัวมันเองเท่านั้นหารลงตัว • วิธีง่ายสุดในการทดสอบว่า จำนวนเต็ม n เป็นจำนวนเฉพาะหรือไม่ • ลองนำ 2, 3, 4,… จนถึง n-1 ไปหาร n • ถ้าไม่มีตัวใดหาร n ลงตัวเลย แสดงว่า n เป็นจำนวนเฉพาะ • จากแนวคิดข้างต้น เราจะใช้วงวนเพื่อทดสอบการหารลงตัวของ n÷kกัน • เริ่มค่า k ที่ 2 และเพิ่มค่าขึ้นรอบละ 1 และ กระโดดออกจากวงวนเมื่อ • k มีค่าเท่ากับ n หรือ พบ k ที่หาร n ลงตัว
ตัวอย่าง : การทดสอบจำนวนเฉพาะ • วิเคราะห์โปรแกรม • คำสั่งในส่วนของ loopiเริ่มตั้งแต่ 2 จนถึง n - 1 • มีเงื่อนไขการกระโดดออกจาก loop เมื่อพบว่า iหาร n ลงตัว • หารลงตัว คือ เหลือเศษเป็น 0 • เนื่องจากหลุดออกจาก loop มี 2 วิธี ตอนจะตอบต้องมาทดสอบเงื่อนไขก่อน • ถ้า i == n แสดงว่าโปรแกรมนี้ทำงานใน loop จนครบ • ดังนั้น n เป็นจำนวนเฉพาะ • ถ้า i < n แสดงว่ามีการกระโดดออกจาก loop ระหว่างทาง • ดังนั้น n ไม่ใช่จำนวนเฉพาะ
ตัวอย่าง : การทดสอบจำนวนเฉพาะ โปรแกรมทดสอบจำนวนเฉพาะ Input n // จำนวนที่ต้องการทดสอบว่าเป็นจำนวนเฉพาะหรือไม่ i = 2 // ลองหารด้วย 2, 3, … ไปเรื่อยๆจนถึง n-1 while (i < n) { วนทำการตรวจสอบตัวเลขไปเรื่อยๆ if( (n%i ) == 0) break; // ออกจาก loop เมื่อมีตัวเลขที่หาร n ลงตัว i++; } if( i ==n) print “เป็นจำนวนเฉพาะ” else print “เป็นตัวประกอบ” ตัวอย่างผลลัพธ์
ตัวอย่าง : การทดสอบจำนวนเฉพาะ • หากต้องการทดสอบจำนวนเฉพาะได้หลายๆจำนวน จนกว่าผู้ใช้จะใส่ค่า n <= 1 ค่อยเลิกทำงาน เขียน code ได้ ดังนี้ โปรแกรมทดสอบจำนวนเฉพาะ while (1) { Input n // จำนวนที่ต้องการทดสอบว่าเป็นจำนวนเฉพาะหรือไม่ if (n <= 1) break; inti= 2; // ลองหารด้วย 2, 3, … ไปเรื่อยๆจนถึง n while (i < n) { if( (n%i ) == 0) break; // ออกจาก loop เมื่อมีตัวเลขที่หาร n ลงตัว i++; } if( k==n) { Print“เป็นจำนวนเฉพาะ” } else { Print“เป็นตัวประกอบ” } }
ตัวอย่าง : การทดสอบจำนวนเฉพาะ • จากตัวอย่างในสไลด์ที่แล้ว พบว่า • เราสามารถใส่ loop ซ้อนกันได้ • การออกจาก loop ด้วย if … break จะออกจาก loop ที่คำสั่งอยู่เท่านั้น • if (n <= 1) break; ออกจาก loop นอก • if( (n% i) == 0) break; ออกจาก loop ใน while (1) { if (n <= 1) break; i = 2; while (i < n) { if( (n%i ) == 0) break; // ออกจาก loop เมื่อมีตัวเลขที่หาร n ลงตัว i++; } }
if … continue • เราใช้ if … break เพื่อออกจาก loop ที่คำสั่งนี้อยู่ • แต่ในบางครั้ง ระหว่างการทำงานใน loop เราอาจต้องการกระโดดกลับไปทำบรรทัดแรกของ loop • if … continue คือ คำสั่งที่เมื่อเงื่อนไขหลัง if เป็นจริง continue จะทำให้วนกลับไปทำบรรทัดแรกของ loop ที่คำสั่งนี้อยู่ทันที
ตัวอย่าง • ส่วนโปรแกรมต่อไปนี้ แสดงตัวอย่างการทำงานของ Continue inti = 0; while(1) { i++ if(i == 5) { break;} if(i == 3) { continue; } System.out.println(“This is round ” + i); } System.out.println(“Loop run ” + i + “round”); เมื่อ Compile และ รันโปรแกรม จะได้ผลลัพธ์ดังนี้ This is round 1 This is round 2 This is round 4 Loop run 5 rounds
ตัวอย่าง : Nested if แบบมีทางเลือก
ตัวอย่าง 1 • เขียนโปรแกรมรับค่า n จากนั้นแสดงผลทั้งหมด n บรรทัด • ถ้าเป็นบรรทัดแรก หรือ บรรทัดสุดท้าย แสดง * จำนวน n ตัว • บรรทัดอื่น ๆ แสดง A จำนวน n ตัว n จำนวนแถว (i) ขึ้นอยู่กับ จำนวนคอลัมน์ (j)ขึ้นอยู่กับ n
ตัวอย่าง 1 n จำนวนแถว (i) ขึ้นอยู่กับ n จำนวนคอลัมน์ (j)ขึ้นอยู่กับ for i from 1 to n for j from 1 to n if i = 1 or i = n print * else print A end if end for end for
ตัวอย่าง 2 • เขียนโปรแกรมรับค่า n จากนั้นแสดงผลทั้งหมด n บรรทัด • ถ้าเป็นบรรทัดคี่ แสดง ^ จำนวน n ตัว • ถ้าเป็นบรรทัดคู่ แสดง v จำนวน n ตัว จำนวนแถว (i) ขึ้นอยู่กับ n n จำนวนคอลัมน์ (j)ขึ้นอยู่กับ
ตัวอย่าง 2 n จำนวนแถว (i) ขึ้นอยู่กับ จำนวนคอลัมน์ (j)ขึ้นอยู่กับ n for i from 1 to n for j from 1 to n if i is odd print ^ else print v end if end for end for
ติดตามการทำงานของโปรแกรมด้วยมือติดตามการทำงานของโปรแกรมด้วยมือ • มีขั้นตอน ดังนี้ • เขียนชื่อตัวแปรที่ปรากฎในโปรแกรม • ตัวแปรไหนมีการกำหนดค่าเริ่มต้น กำหนดค่าลงไป • ทำงานทีละคำสั่งไปเรื่อยๆ
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร เขียนชื่อตัวแปรทั้งหมด 2. กำหนดค่าแต่ละตัวแปรอ้างอิงตาม code
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร 3. เริ่มทำงานทีละคำสั่งเรื่อย ๆ
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร 9
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร 172
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร (No)
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร 2 17 11
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร (No) (No) (Yes)
ตัวอย่าง • โปรแกรมต่อไปนี้แสดงผลลัพธ์อะไร (No) (No) 19 (Yes)