การท้าซ ้า (iteration)nutthanon/88510459/lect04.pdf · -...
TRANSCRIPT
การทาซ า (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 (เงอนไข) {
ค าสงหรอกลมค าสง ;
}
ด าเนนการกลมค าสง
เชคเงอนไข จรง
เทจ
แมในวงเลบ ( ) ของ 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)
บรรทดท 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++;
จะใหผลเหมอนกบผลของ 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
ตวอยางการต งเงอนไขของ 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 ไมเคยเปนเทจ ท าให
โปรแกรมท างานไมรจบ
จากตวอยางขางตน ขออธบายซ าอกทวา เงอนไขใน ( ) ของ 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++;
การท างานของ 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
การกระท าเรมแรก เงอนไขเพอเขา 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 บรรทด) ออกทางหนาจอ
// ตวอยางท 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
จนกวา ผใชจะปอน 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 ( ; เงอนไข; ) { ค าสงหรอกลมค าสง ; จะใหผลลพธเหมอนกบ ค าสงหรอกลมค าสง ;} }
หรอ ค าสงเรมตน ; 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); }
โปรแกรมขางตนจะพมพคา 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: }
เราประกาศตวแปร 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 ดงตอไปน
* ** *** ****
สงเกต 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 อก
ขอควรระวงส าหรบการใชเลขทศนยมในเงอนไขกอนจะเขา 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 ขางตนจงถกวนไมรจบ