การท้าซ ้า (iteration)nutthanon/88510459/lect04.pdf · -...

15
การท้าซ้า (Iteration) วัตถุประสงค์ - เข้าใจว่าทาไมต้องมีการใช้ loop - สามารถใช้และเข้าใจการควบคุม loop while, for และ do…while - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง while, for และ do...while - สามารถเขียน nested loop ได้ - สามารถใช้ break และ continue ใน loop ได้ ท้าไมต้องมีการใช้ loop คอมพิวเตอร์ต้องดาเนินการซา ๆ บ่อยครัง เช่น ผู้ใช้อาจสั่งให้คอมพิวเตอร์ print ข้อความเดิม ๆ ออก หน้าจอ 100 บรรทัด หรือ เวลาผู้ใช้เปิด file คอมพิวเตอร์ต้องอ่านข้อมูลจาก hard drive จนกว่าจะสินสุด file หรือ คอมพิวเตอร์ต้องดาเนินการรอรับข้อมูลจากผู้ใช้จนกว่าจะปิดเครื่อง ดังนันการทาชุดคาสั่งเดิมซาจึงถูกพบเห็น ได้บ่อยมาก Java มีคาสั่งให้คอมพิวเตอร์ดาเนินการซา (หรือ วน loop) ดังนี while, for, และ do…while Statement While เมื่อเราต้องการให้คอมพิวเตอร์ดาเนินการซา ๆ ในกรณีที่เงื่อนไขเป็นจริง เราอาจใช้ while ในการสร้าง loop โดยใช้ไวยากรณ์และ flow chart ดังนี while (เงื่อนไข) { คาสั่งหรือกลุ่มคาสั่ง ; } ดาเนินการกลุ่มคาสั่ง เช็คเงื่อนไข จริง เท็จ

Upload: others

Post on 04-Nov-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

การทาซ า (Iteration)

วตถประสงค

- เขาใจวาท าไมตองมการใช loop

- สามารถใชและเขาใจการควบคม loop while, for และ do…while

- เขาใจถงความคลายและความแตกตางระหวาง while, for และ do...while

- สามารถเขยน nested loop ได

- สามารถใช break และ continue ใน loop ได

ทาไมตองมการใช loop

คอมพวเตอรตองด าเนนการซ า ๆ บอยคร ง เชน ผใชอาจสงใหคอมพวเตอร print ขอความเดม ๆ ออก

หนาจอ 100 บรรทด หรอ เวลาผใชเปด file คอมพวเตอรตองอานขอมลจาก hard drive จนกวาจะส นสด file

หรอ คอมพวเตอรตองด าเนนการรอรบขอมลจากผใชจนกวาจะปดเครอง ดงน นการท าชดค าสงเดมซ าจงถกพบเหน

ไดบอยมาก

Java มค าสงใหคอมพวเตอรด าเนนการซ า (หรอ วน loop) ดงน while, for, และ do…while

Statement While

เมอเราตองการใหคอมพวเตอรด าเนนการซ า ๆ ในกรณทเงอนไขเปนจรง เราอาจใช while ในการสราง

loop โดยใชไวยากรณและ flow chart ดงน

while (เงอนไข) {

ค าสงหรอกลมค าสง ;

}

ด าเนนการกลมค าสง

เชคเงอนไข จรง

เทจ

Page 2: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

แมในวงเลบ ( ) ของ while จะเปนเงอนไข เหมอนในวงเลบ ( ) ของ if แตเราจะใช if เมอเราตองการเลอกท ากลมค าสงใดค าสงหนง ในชณะทเราจะใช while เมอเราตองการสงใหท าทกค าสงใน { } ของ while ซ า ๆ

Java จะด าเนนการค าสงหรอกลมค าสงทอยถดจาก while (เงอนไข) กตอเมอเงอนไขใน ( ) เปนจรง และจะวนกลบมาท าซ ากลมค าสงเดมจนกวาเงอนไขจะเปนเทจ ตวอยางเชน

1: int counter = 0; 2: while ( counter < 100 ) { 3: System.out.println(“Welcome to Java!”); 4: counter++; 5: }

โปรแกรมขางตนเปนโปรแกรมทใชพมพ “Welcome to Java” 100 บรรทดออกทางหนาจอ โดย

โปรแกรมจะวน loop 100 loop แตละ loop จะพมพแคหนงบรรทด

การวน loop ขางตนใหครบ 100 loop เราจะตองมตวแปรชวยนบจ านวน loop (จ านวนการท าซ า) ซง

ในทน ตวแปรทชวยนบชอ counter ทถกประกาศและต งคาเรมตนใหเทากบ 0 ในบรรทดท 1

บรรทดทสองเปนการเชควาคาในตวแปร counter นอยกวา 100 หรอไม ถานอยกวารอย กลมค าสงบรรทดท 3 และ 4 จะถกด าเนนการ นนคอ “Welocome to Java!” จะถกพมพออกทางหนาจอหนงบรรทด และ คาของ counter จะถกเพมข นหนง

*** ใหสงเกต การต งคาต งตนให counter เทากบ 0 ในบรรทดแรก การต งเงอนไขเชค counter นอยกวา 100 ในบรรทดท 2 การเพมคา counter ทละหนงในบรรทดท 4 จะท าให โปรแกรมรน loop ขางตน 100 loop พอด ซงมรายละเอยดดงน

- counter มคาเปน 0 ทจดเรมตนของ loop รอบท 1 และมคาเปน 1 ททาย loop - counter มคาเปน 1 ทจดเรมตนของ loop รอบท 2 และมคาเปน 2 ททาย loop - เปนอยางน เรอยไปจนถง loop รอบท 100 ซง counter มคาเปน 99 ทจดเรมตนของ loop ท 100

และมคาเปน 100 ททาย loop ซง loop รอบท 100 น จะเปน loop สดทายเนองจาก เวลาโปรแกรมกลบไป check เงอนไขอกท และพบวา เงอนไขเปนเทจ ท าใหตองออกจาก loop

*** ถาเราก าหนดคา counter เทากบ 1 ในบรรทดแรก loop และ เงอนไข counter < 100 ในบรรทดท 2 โปรแกรมจะวนท าซ า 99 รอบ แตถาเงอนไขในบรรทดท 2 เปน counter <= 100 โปรแกรมจะวนท าซ า 100 รอบ (เปรยบเหมอนกรณทเรานบ 1 ถง 99 กบ 1 ถง 100)

Page 3: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

บรรทดท 5 เปนการก าหนดขอบเขตส นสดของ block ของ statement while ซงขอบเขตของ block เปนเรองส าคญ เพราะเราจะตองก าหนดบอก Java วา ค าสงใดอยใน block (ใหท าซ า) ค าสงใดทอยนอก block ใหท าคร งเดยว

เงอนไขใน ( ) ของ while คอเงอนไขทให while ท างานตอไปเรอย ๆ คอ เงอนไขทระบวายงท างานไมเสรจ นสตตองต งเงอนไขในน ใหด มฉะน นโปรแกรมอาจท างานตดลป และท างานไมรจบ ซงรปแบบในการต งเงอนไขสวนใหญจะประกอบไปดวย 1) ตวแปรทมคาเปลยนไปเรอย ๆ เมออยในลป (เชนคาของตวแปร counter ทถกเพมไปเรอย) ซงจะถกน าไปเปรยบเทยบกบ 2) คาเปาหมาย โดยใช 3) ตวด าเนนการเปรยบเทยบ หรอ comparison operator

ขอควรระวง 1 การใช while loop มขอควรระวงทคลายกบของการใช if นนคอ การใช ; หลง (เงอนไข)

ทนทจะท าใหโปรแกรมมขอผดพลาด กลาวคอ int counter = 0;

while ( counter < 100 ) ; { System.out.println(“Welcome to Java!”); counter++; }

จะใหผลเหมอนกบผลของ code ขางลาง เปนผลให โปรแกรมเขาไปใน loop แลวไมสามารถออกจาก loop ไดเนองจากการด าเนนการ Null statement ใน block ของ while ไมท าใหคาของ counter เพม และเงอนไขจะไมมทางเปนเทจได

int counter = 0; while ( counter < 100 ) { ; // <-- Null Statement }

{ System.out.println(“Welcome to Java!”); counter++; }

ขอควรระวง 2 ถาเราตองการให โปรแกรมวนท าซ าค าสงท งหมดในกลมค าสง เราตองใสค าสงท งหมดท

อยากให Java ด าเนนการซ าไวในเครองหมาย { } ถดจาก (เงอนไข) ของ while นนคอ

int counter = 0; while ( counter < 100 ) System.out.println(“Welcome to Java!”); counter++;

Page 4: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

จะใหผลเหมอนกบผลของ code ขางลาง เปนผลให โปรแกรมเขาไปใน loop แลวพมพ “Welcome to Java!” ไปเรอย ๆ ไมรจบ ไมสามารถออกจาก loop ไดเนองจากคาของ counter ไมไดถกท าใหเพม ท าใหเงอนไขเปนจรงตลอดเวลา

int counter = 0; while ( counter < 100 ) { System.out.println(“Welcome to Java!”); } counter++;

บางคร ง เราตองการเขยนโปรแกรมใหท าซ า แตไมรจ านวนทจะท าซ าแนนอน เชน บางคร งเราอาจวน

loop รบ input จากผใชไปเรอย ๆ จนกวาผใชจะใสคาทเปน sentinel (คาทรกนระหวางผเขยนโปรแกรมกบผใช

วา ผใชตองการใหโปรแกรมเลกรอรบคาได) ดงตวอยางตอไปน

0: import java.util.Scanner; 1: Scanner my_obj = new Scanner(System.in); 2: int counter = my_obj.nextInt();

3: while ( counter != -1 ) { 4: System.out.println(“Welcome to Java!”); 5: counter = my_obj.nextInt(); 6: }

บรรทดท 2 แสดงการรบคาจ านวนเตมชนด int จาก keyboard มาต งคาเรมตนใหตวแปร counter ซง

จะถกเชคเงอนไขในบรรทดท 3 ถาคาใน counter ไมเทากบ -1 โปรแกรมจะท าการด าเนนการค าสงท งหมดใน

block { } ของ while (สงเกตวา เปนเงอนไขตรวจสอบวา ยงไมถงเปาหมายใชม ย คอ input ยงไมเทากบ 1 ในท า

ตอไปเรอย ๆ) ในบรรทดท 4 และ 5 นนคอ print “Welcome to Java!” ออกทางหนาจอทตน loop และรอรบ

คาจาก Keyboard แลวน าคามาใสในตวแปร counter ใหมททาย loop

สงเกตวา ทก ๆ คร งทโปรแกรมจะด าเนนการกลมค าสงใน loop จะ check คาในตวแปร counter กอน

ดงน น ถาเราอยากจะให โปรแกรมรนจบไมตด loop เราตองมนใจวา เงอนไขใน ( ) มโอกาสเปนเทจ ซงใน code

ขางตน ผใชมโอกาสเปลยนคาใน counter ไดททายของ loop ทก ๆ loop ชวยใหโปรแกรมออกจาก loop ไดถา

ผใชใสคา -1 จาก key board

Page 5: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

ตวอยางการต งเงอนไขของ while loop ทมปญหา ตวอยางท 1

1: i = 5; 2: while ( i > 0 ) {

4: System.out.println(i + " "); 5: i++; 6: }

เนองจาก ก าหนดคา i เรมตนท 5 ซงท าใหเงอนไขในบรรทดท 2 เปนจรง เมอเขามาในลป บรรทดท 5

เพมคา i มากข นไปอก i จงไมเคยนอยกวาหรอเทากบ 0 ซะท ท าใหท างานไมรจบ

ตวอยางท 2 1: i = 5; 2: while ( i > 5 ) {

4: System.out.println(i + " "); 5: i--; 6: }

เนองจาก ก าหนดคา i เรมตนท 5 ซงท าใหเงอนไขในบรรทดท 2 เปนเทจ ค าสงในลปกจะไมเคยถกเรยก

ท างาน ดงน นมบรรทดท 2-6 กเหมอนไมม ไมตองใสมาใหสบสนกได

ตวอยางท 3 1: i = 5; 2: while ( i < 0 ) {

4: System.out.println(i + " "); 5: i--; 6: }

เหมอนกบตวอยางท 3 เนองจาก ก าหนดคา i เรมตนท 5 ซงท าใหเงอนไขในบรรทดท 2 เปนเทจ ค าสงใน

ลปกจะไมเคยถกเรยกท างาน ดงน นมบรรทดท 2-6 กเหมอนไมม

ตวอยางท 4 1: i = 1; 2: while ( i < 20 ) {

4: System.out.println(i + " "); 5: }

เนองจาก ก าหนดคา i เรมตนท 1 ซงท าใหเงอนไขในบรรทดท 2 เปนจรง ค าสงในลปถกเรยกท างาน แต

คา i ไมเคยถกเปลยนเลย !!!! นนคอ คาใน i จะเปนหนงตลอดกาล เงอนไขในบรรทดท 2 ไมเคยเปนเทจ ท าให

โปรแกรมท างานไมรจบ

Page 6: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

จากตวอยางขางตน ขออธบายซ าอกทวา เงอนไขใน ( ) ของ while คอเงอนไขทให while ท างานตอไปเรอย ๆ จนกวาเงอนไขจะเปนเทจ นสตตองต งเงอนไขในน ใหด มฉะน นโปรแกรมอาจท างานไมรจบเพราะตดลป ซงรปแบบในการต งเงอนไขสวนใหญ จะประกอบไปดวย 1) ตวแปรทมคาเปลยนไปเรอย ๆ เมออยในลป ซงจะถกน าไปเปรยบเทยบคากบ 2) คาเปาหมาย โดยใช 3) ตวด าเนนการเปรยบเทยบ หรอ comparison operator

Statement For

พจารณา code while loop ดานลางตอไปน :- 1: int counter = 0;

2: while ( counter < 100 ) { 3: System.out.println(“Welcome to Java!”); 4: counter++; 5: }

code while loop ขางตน (บรรทดแรก ต งคาต งตนให counter, บรรทดท 2 check condition กอน

เขา loop, และ บรรทดท 4 เพมคาใน counter 1 คา) สามารถน ามาเขยนเปน for loop ทใหผลในการ

ด าเนนการเหมอนกนไดดงน

1: int counter;

2: for (counter = 0; counter < 100; counter++ ) { 3: System.out.println(“Welcome to Java!”); 4: }

ซงสามารถเขยน flow chart ไดดงน

print “Welcome …”

counter < 100

true

false

counter = 0

counter++;

Page 7: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

การท างานของ for statement ขางตนเรมจากต งคาต งตนใหตวแปร counter เทากบ 0 จากน น

โปรแกรมจะ check เงอนไขวา counter นอยกวา 100 หรอไม ซง 0 นอยกวา 100 โปรแกรมจะเขา loop มา

เพอด าเนนการพมพ “Welcome to Java!” จากน นคา counter จะถกเพมข นเปน 1 แลวโปรแกรมจะวนกลบไป

check เงอนไขเดมวา counter นอยกวา 100 หรอไม ซง 1 นอยกวา 100 โปรแกรมกจะเขา loop เปนคร งท 2

เพอมาด าเนนการพมพ “Welcome to Java!” จากน นคา counter จะถกเพมข นเปน 2 โปรแกรมจะท าซ า

เรอยไปจนคาของ counter เทากบ 100 จงจะออกจาก loop

รปแบบการเขยน loop (มการต งคาต งตน, มการเชคเงอนไขกอนเขา loop อกคร ง, และ มการ

ด าเนนการอยางหนงซ า ๆ กนทกคร งททาย loop) ขางตนพบไดบอยมาก ซงบางคร ง เราสามารถใช for loop ใน

การเขยน loop ลกษณะน ได ซงขอดคอ for statement จะรวมการต งคาต งตน การเชคเงอนไขกอนเขา loop

และ การด าเนนการทาย loop ไวอยในบรรทดเดยว (คนดวย ; ) โดยใสไวใน ( ) หลง for ท าใหผอาน code

สามารถท าความเขาใจการท างานของ loop น น ๆ ไดมากยงข น โดยสวนใหญ for loop จะถกใชเมอเรารจ านวน

ของการวน loop แนนอน

พจารณาจาก code for loop ขางตน เราจะเหนไดวา for statement ม syntax และ flow chart ดงน for (ค ำสงแรกและท ำเพยงครงเดยว ; เงอนไขเพอเขำ loop; ค ำสงทำย loop ท ำกอน ขน loop ใหม) {

ค าสงหรอกลมค าสง; }

ด ำเนนกำรกลมค ำสง

เชคเงอนไข true

false

กำรกระท ำแรกเรม

กำรกระท ำทำย loop

Page 8: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

การกระท าเรมแรก เงอนไขเพอเขา loop และ การกระท าทาย loop กอนข น loop ใหม จะอยในวงเลบ

เดยวกนหลงค าสง for และมเครองหมาย ; คน

ใหสงเกต flow chart วาการกระท าแรกเรมถกด าเนนการคร งเดยวเทาน น (กอนทจะ check เงอนไขเขา

loop แรก) แมวาโปรแกรมจะวน loop มาใหมอกกคร ง โปรแกรมจะไมด าเนนการการกระท าน อก สวนใหญการ

กระท าแรกเรมจะเปนการประกาศและต งคาต งตนตวแปรทใชในการนบจ านวน loop เชน counter = 0;

*** บางคร ง ผเขยนอาจไมใสอะไรเลยหรอใส comma เขาไปในสวนของ การกระท าแรกเรม และ การกระท าทาย loop กได เชน

// ตวอยางท 1 1: int counter = 0;

2: for ( ; counter < 100; ) { 3: System.out.println(“Welcome to Java!”); 4: counter++; 5: }

( ) หลง for ใน code ขางตน ม ; 2 ตว และมแตสวนเงอนไข นนคอ ผเขยนบอก Java วาไมตอง

ด าเนนการในสวนกำรกระท ำแรกเรมและในสวนการกระท าทาย loopในวงเลบ

// ตวอยางท 2 1: for ( int i = 0, j = 0 ; (i + j) < 100; i++, j+=2 ) { 2: System.out.println(“Welcome to Java!”); 3: }

ในตวอยางท 2 ของ code ขางตน เราไดประกาศตวแปร i กบ j และต งคา 0 ใหท ง i และ j ในสวนการ

กระท าแรกเรมใน ( ) หลง for ส าหรบการกระท าทาย loop คา i ถกเพมทละ 1 ขณะท j ถกเพมทละ 2 loop

จะจบกตอเมอ ผลรวมคา i และ j มคามากกวาหรอเทากบ 100

// ตวอยางท 3 for (int i = 0; i < 100; System.out.println(i++));

code ในตวอยางท 3 สามารถถก run ไดโดยไมม error โดยมนจะต งคาต งตนให i เทากบ 0 จากน นจะ

เขาไปใน loop และพมพคา i ออกมากอนคอยท าการเพมคาของ i ทละหนงคา loop รนจนกวาคา i จะเทากบ

100 นนคอ code ขางตนจะพมพคา i ต งแต 0 ถง 99 (ท งหมด 100 บรรทด) ออกทางหนาจอ

Page 9: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

// ตวอยางท 4 1: for ( int i = 10, i >= 0; i--) { 2: System.out.println(“Welcome to Java!”); 3: }

code ในตวอยางท 4 จะท า println ซ า 11 คร ง คา i คอย ๆ ลดทละหนง (เพราะสวนทสามใน วงเลบ

ของ for loop เปน i--) จาก 10 ไปถง 0

// ตวอยางท 5 1: for ( int i = 0, i != 9; i+2) { 2: System.out.println(i+" "); 3: }

code ในตวอยางท 5 จะท า println คา i ดงน 0, 2, 4, 6, 8 10, 12, … ไปเรอย ๆ ไมรจบเพราะ i ไม

เทากบ 9

*** บางคร งถาเราตองการเขยนโปรแกรมให loop ถกรนตลอดไป เราอาจใช for หรอ while ดงน

for ( ; ; ) { while (true) {

// Do something ( ซงเหมอนกบ ) // Do something

} }

Statement Do…While

บางคร งเราตองการเขยนโปรแกรมเพอด าเนนการซ า แตเราตองการใหด าเนนการกบกลมค าสงกอนทจะ

ตรวจสอบเงอนไขดงแสดงใน flow chart ขางตน (ตวอยางเชน เราสงใหโปรแกรมวนรบ input จากผใชไปเรอย ๆ

ด าเนนการกลมค าสง

เชคเงอนไข true false

Page 10: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

จนกวา ผใชจะปอน input ทถกตอง) Java มค าสง do…while เพอรองรบรปแบบการท าซ าแบบน โดย syntax

ของ statement do..while มดงน

do { ค าสงหรอกลมค าสง ; } while ( เงอนไข );

สงเกตในกรณ do…while เราจะม ; อยหลง ( เงอนไข ) ไดและจะไมท าใหเกดความผดพลาดในการใช

loop เหมอนในกรณของ while อยางเดยว

นอกจากน ใหสงเกตความแตกตางระหวาง flow chart ของ while และของ do…while ค าสงหรอกลม

ค าสงใน { } หลง do…while จะถกด าเนนการกอนไมวาเงอนไขจะเปนจรงหรอเทจกตาม (ตางจาก statement

while ทเงอนไขตองเปนจรงเทาน น) ดงน นค าสงหรอกลมค าสงใน { } หลง do จะถกด าเนนการแน ๆ อยางนอย

หนงคร ง ดงตวอยาง

1: int counter = 100; 2: do { 3: System.out.println(“Welcome to Java!”); 4: counter++; 5: } while ( count < 100 );

ในตวอยางขางตน แมในบรรทดท 1 counter จะถกต งคาไวท 100 แลว แตโปรแกรมกยงจะพมพ “Welcome to Java!” ออกมาหนงคร ง กอนทจะเพมคา counter ใหเปน 101 และออกจาก loop เนองจากเงอนไขเปนเทจ การเลอกชนดของ loop

โดยปกตแลว loop ท ง 3 ชนด (while, for, do…while) จะสามารถเขยนแทนกนได โดยใหผลการ

ด าเนนการค าสงเทากน เชน

while ( เงอนไข ) { for ( ; เงอนไข; ) { ค าสงหรอกลมค าสง ; จะใหผลลพธเหมอนกบ ค าสงหรอกลมค าสง ;} }

Page 11: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

หรอ ค าสงเรมตน ; for ( ค าสงเรมตน; เงอนไข ; ค าสงทาย loop ) { while ( เงอนไข ) { ค าสงหรอกลมค าสง ; จะใหผลลพธเหมอนกบ ค าสงหรอกลมค าสง ; } ค าสงทาย loop; }

ดงน น เราจงเลอกใชรปแบบ loop ใดกไดทท าใหเราคดวา จะท าใหการเขยน code และ การท าความ

เขาใจโปรแกรมของเรางายทสด ซงโดยปกต for loop จะถกใชเมอเรารจ านวนของการวน loop แนนอน เชน

ตองการพมพขอความ 100 บรรทด while loop จะถกใชเวลาจ านวนของการวนไมแนนอน เชนในกรณของ

โปรแกรมรบคา input จากผใชไปเรอย ๆ จนกวาผใชจะใส 0

สวน do…while จะถกใชเวลาเราจะด าเนนการค าสงหรอกลมค าสงกอนตรวจสอบเงอนไข

Break และ Continue

เราเคยเรยนรการใช break ใน statement switch มาแลว ซงการใช break ใน statement switch

เปนการบอกใหโปรแกรมหยดด าเนนการค าสงใด ๆ ใน statement switch และใหออกจาก statement switch

ได การใช break ใน loop for, while, do…while กเหมอนกน มนเปนการบอกโปรแกรมของเราใหหยดท างาน

ใน loop และ ออกจาก loop ได ดงตวอยางตอไปน

for ( int i = 0; i < 10000; i++ ) { if ( i == 2000 ) { break; } System.outprintln(i); }

Page 12: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

โปรแกรมขางตนจะพมพคา i ต งแตคา 0 ถง 1999 ออกทางหนาจอกอนจะออกจาก loop ดวยค าสง

break

การใช continue ใน loop for, while, do…while เปนการบอกโปรแกรมของเราใหละการท างานท

เหลอใน loop รอบปจจบน แลวใหไปข นรอบใหมเลย ดงตวอยางตอไปน

for ( int i = 0; i < 10000; i++ ) { if ( i == 2000 ) { continue; } System.out.println(i); } โปรแกรมขางตนจะพมพคา i ต งแตคา 0 ถง 1999 ออกทางหนาจอ จากน นพอ i มคาเทากบ 2000 ค าสง

continue จะถกด าเนนการ ท าใหโปรแกรมหยดด าเนนการใน loop รอบปจจบน (ไมพมพคา 2000 ออกมา) และ

ข น loop รอบใหม แลวท าการพมพคา 2001 จากน นวน loop เรอยไปจนพมพ 9999 ออกทางหนาจอ โปรแกรม

จงจะออกจาก loop

Nested Loop

บางคร ง ในแตละการท าซ า (ในแตละ loop) เรากตองการใหโปรแกรมวนซ าท างานอกอยางหนงใหเรา ลกษณะน เปนการท า loop ซอน loop (Nested loop) ยกตวอยางเชน ถาเราตองการพมพเลข 1 ถง 12 ใหอยในบรรทดเดยวกนออกทางหนาจอ เราอาจใชแค loop เดยว แตถาเราตองการพมพบรรทดดงกลาว 20 บรรทด เราอาจใช loop ซอน loop ในการด าเนนการ ดงน

1: int i, j; 2: for ( i = 0; i < 20; i++ ) { 3: for( j = 0; j < 12; j++) { 4: System.out.print(j + “ “); 5: } 6: System.out.println(“ “); 7: }

Page 13: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

เราประกาศตวแปร i และ j ในบรรทดท 1 (ความจรงเราประกาศตวแปร i ใน () หลงค าสง for ทบรรทด

ท 2 และ ประกาศตวแปร j ใน ( ) หลง for ทบรรทดท 3 กได)

เราเรยก for loop ในบรรทดท 2 วา loop ดานนอก (outer loop) เราเรยก for loop ในบรรทดท 3

วา loop ดานใน (inner loop) ในทน loop ดานนอกจะถกวนจ านวน 20 คร ง แตละคร งของ loop ดานดานนอก

loop ดานในจะถกวน 12 คร ง นนคอบรรทดท 3, 5, 6 จะถกด าเนนการ 20 คร ง แตบรรทดท 4 จะถกด าเนนการ

20 * 12 = 240 คร ง

ขอสงเกต 1 ถาเราตองการท า loop ซอน loop และตองการนบจ านวน loop ท ง loop ดานนอกและ

ดานใน เราควรใชตวแปรทใชนบ loop ตางกน (ในทน เราใช i นบจ านวน loop ดานนอก และ ใช j นบจ านวน

loop ดานใน)

ขอสงเกต 2 ในบรรทดท 3 j จะถกต งคาเรมตนใหเทากบ 0 ทกคร ง กอนทเขาไปวน loop ดานใน ท าให

เรามนใจไดวา จ านวนการวน loop ดานในจะเรมจาก j เทากบ 0 ถง j เทากบ 11 ทกคร ง เราจงไมควรลม reset

คา j กอนเรมวน loop ดานในทกคร ง

ขอสงเกต 3 การประกาศตวแปร i และ j ไมตองท าทบรรทดท 1 โดยเราสามารถประกาศตวแปร i ใน ( )

หลง for ในบรรทดท 2 และ สามารถประกาศตวแปร j ใน ( ) หลง for ในบรรทดท 3

ขอสงเกต 4 ส าหรบทนสตทเรมเขยนโปรแกรมใหม ๆ ใหนสตเรมเขยนจาก loop ดานในใหเสรจกอนแลว

คอยมาเขยนโคดส าหรบ loop ดานนอกครอบโคดของ loop ดานในอกท นอกจากน นสตควร println คาของตว

แปรสองตวทควบคมจ านวน loop ท งสองดวย (นนคอ ตวแปร i และ j) เพอตรวจสอบศกษาการท างานของลป

ใหนสตสงเกตตวอยางตอไปน

1. for (i = 1; i <= 4; i++) {

2. for (j = 1; j <= i; j++) {

3. System.out.print("*"); 4. } 5. System.out.println( ); 6. }

ซงให output ดงตอไปน

* ** *** ****

Page 14: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

สงเกต loop ดานใน (บรรทดท 2-4) ม j เปนตวแปรควบคมจ านวน loop จะเหนไดวา j จะเรมจาก 1

เสมอ และคาของมน จะเพมทละหนงไปเรอย ๆ จนถงคา i (ในสวนทสองของ ( ) ของ for มเงอนไข j <= i) นนคอ โปรแกรมจะสง print * ในบรรทดท 3 ซ า i คร ง ดงน น พอออกจาก loop น แลว จะเหน * ตดกน i ตว พอออกจาก loop ดานใน โปรแกรมจะท าตอทบรรทดท 5 ซงมค าสง System.out.println( ); เปนการแสดงการข นบรรทดใหมท console ซงบรรทดท 5 อยใน loop ดานนอก นนคอ จะมการข นบรรทดใหมใน console ตามจ านวนการถกเรยกซ าของ loop ดานนอก ซง ตวแปร i เปนตวแปรควบคม loop ดานนอกน (ดงน น i ใชแทนเลขของบรรทดใน console ไดดวย) ใหดรายละเอยดดงน

เมอ i = 1, คา j เรมท 1 หยดท 1 บรรทดท 3 ถกเรยกแคคร งเดยว บรรทดท 5 ถกเรยกหนงคร ง ท าให console แสดงผลดงน

* เมอ i = 2, คา j เรมท 1 หยดท 2 บรรทดท 3 ถกเรยกอก 2 คร ง บรรทดท 5 ถกอกเรยกหนงคร ง ท าให

console แสดงผลดงน * **

เมอ i = 3, คา j เรมท 1 หยดท 3 บรรทดท 3 ถกเรยกอก 3 คร ง บรรทดท 5 ถกอกเรยกหนงคร ง ท าให console แสดงผลดงน

* ** ***

เมอ i = 4 คา j เรมท 1 หยดท 4 บรรทดท 3 ถกเรยกอก 4 คร ง บรรทดท 5 ถกอกเรยกหนงคร ง ท าให console แสดงผลดงน

* ** *** ****

เมอ i = 5, เงอนไขในสวนท 2 ของ ( ) ของ for ในบรรทดท 1 จะเปนเทจ ท าใหไมเขา loop อก

Page 15: การท้าซ ้า (Iteration)nutthanon/88510459/Lect04.pdf · - เข้าใจถึงความคล้ายและความแตกต่างระหว่าง

ขอควรระวงส าหรบการใชเลขทศนยมในเงอนไขกอนจะเขา loop

เราไมควรใชเลขทศนยมหรอตวแปรทศนยมในการสรางเงอนไข (ประเภทการเปรยบเทยบเทากบหรอไม

เทากบ) เพอควบคม loop เพราะคาทศนยมบางคาเปนแคการประมาณ ท าใหการควบคมไมถกตอง ดงตวอยาง

ตอไปน

// data should be zero double data = (Math.sqrt(2)* Math.sqrt(2)) - 2; while (data != 0) {

System.out.println("data is not zero"); } จะเหนวา ในทางคณตศาสตร square root ของ 2 คณกบ square root ของ 2 ตองได 2 เมอน ามา – 2

แลวจะตองไดคา 0 แตเนองจาก Math.sqrt(2) ใหผลลพธเปนชนด double ซงสามารถเกบต าแหนงของทศนยมไดจ ากด ท าใหทศนยมบางสวนโดนตดท ง square root ของ 2 คณกบ square root ของ 2 จงใหคาไมเทากบ 2 ท าใหจรง ๆ แลว data มคาไมเทากบ 0 เปนผลให loop ขางตนจงถกวนไมรจบ