Nested loop and its applications.

Download Report

Transcript Nested loop and its applications.

Nested loop and its
applications.
หลักการทางานของ for loop
for loop mechanism
int i = 0;
for(i = 0; i < 5; println("in step : "+(++i)))
println("in loop : "+i);
println("out of loop i == " + i);
in loop : 0
in step : 1
in loop : 1
in step : 2
in loop : 2
in step : 3
in loop : 3
in step : 4
in loop : 4
in step : 5
out of loop i == 5
i =
0
5
4
3
2
1
Nested for loop
Nested for loop
for(int i=0; i<4; i++)
{
for(int j=0; j<2; j++)
{
print("["+i+""+j+"]");
}
println();
}
4 บรรทัด
[00][01]
[10][11]
[20][21]
[30][31]
i = 4
3
2
1
0
j = 1
0
2
2 คอลัมน์
More nested for loop (มากกว่า 2 ชัน)
้
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
{
for(int k=0; k < 5; k++)
print("["+i+","+j+","+k+"]");
}
println();
}
กระทาจาก loop ด้ านในก่อน แล้ วจึงค่อยๆออกมาทาข้ างนอกทีละชัน้
การประยุกต์ใช้ for loop สร้ างเป็ นรูปต่างๆ
พื ้นฐานของ output 2 มิติ
int row = 5;
int column = 10;
for(int i = 0; i<row; i++)
{
print("repeat once in each line :");
for(int j=0; j<column; j++)
{
print("["+i+", "+j+"]");
}
println("here comes new line");
}
int row = 5;
int column = 10;
for(int i = 0; i<row; i++)
{
print("repeat once in each line :");
for(int j=0; j<column; j++)
{
print("["+i+", "+j+"]");
}
println("here comes new line");
}
repeat
repeat
repeat
repeat
repeat
once
once
once
once
once
in
in
in
in
in
each
each
each
each
each
line
line
line
line
line
:[0,
:[1,
:[2,
:[3,
:[4,
0][0,
0][1,
0][2,
0][3,
0][4,
1][0,
1][1,
1][2,
1][3,
1][4,
2][0,
2][1,
2][2,
2][3,
2][4,
3][0,
3][1,
3][2,
3][3,
3][4,
4][0,
4][1,
4][2,
4][3,
4][4,
5][0,
5][1,
5][2,
5][3,
5][4,
6][0,
6][1,
6][2,
6][3,
6][4,
7][0,
7][1,
7][2,
7][3,
7][4,
8][0,
8][1,
8][2,
8][3,
8][4,
9]here
9]here
9]here
9]here
9]here
comes
comes
comes
comes
comes
ชันใน
้
: กาหนดความเปลี่ยนแปลงที่เกิดขึ ้น “ภายใน” บรรทัด (แกนนอน)
ชัน้ นอก : กำหนดควำมเปลี่ยนแปลงที่เกิดขึน้ “แต่ ละ” บรรทัด (แกนตัง้ )
new
new
new
new
new
line
line
line
line
line
ตัวอย่างการใช้ งาน
สี่เหลี่ยมมุมฉาก จากอักขระ *
ขนาด กว้ าง 5 สูง 5 :
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
print("*");
}
println();
}
*****
*****
*****
*****
*****
ขนาด กว้ าง 10 สูง 5 :
for(int i=0; i<5; i++)
{
for(int j=0; j<10; j++)
{
print("*");
}
println();
}
**********
**********
**********
**********
**********
สามเหลี่ยม จากอักขระ *
for(int i=0; i<5; i++)
{
for(int j=0; j<i; j++)
{
print("*");
}
println();
}
for(int i=0; i<5; i++)
{
for(int j=0; j<i; j++)
{
print("*");
}
println();
}
for(int i=5-2; i>0; i--)
{
for(int j=i; j>0;j--)
{
print("*");
}
println();
}
*
**
***
****
*
**
***
****
***
**
*
การประยุกต์ใช้ for loop สร้ างเป็ นรูปต่างๆ : กรณีศกึ ษา “ข้ าวหลามตัด”
การประยุกต์ใช้ for loop สร้ างเป็ นรูปต่างๆ : กรณีศกึ ษา “ข้ าวหลามตัด”
n = 3
*
***
*****
***
*
n = 4
*
***
*****
*******
*****
***
*
n = 5
*
***
*****
*******
*********
*******
*****
***
*
n = 5
*
***
*****
*******
*********
*******
*****
***
*
n = 5
####*
###***
##*****
#*******
*********
#*******
##*****
###***
####*
สังเกต : จานวนบรรทัด , จานวนเว้ นวรรค และจานวน *
0:
1:
2:
3:
4:
5:
6:
7:
8:
####*
###***
##*****
#*******
*********
#*******
##*****
###***
####*
ที่ n = 5 แต่ละบรรทัด มีอะไรกันบ้ าง??
0:
1:
2:
3:
4:
5:
6:
7:
8:
####*
###***
##*****
#*******
*********
#*******
##*****
###***
####*
line
Space count
Asterisk count
0
4
1
1
3
3
2
2
5
3
1
7
4
0
9
5
1
7
6
2
5
7
3
3
8
4
1
จากตาราง จะได้ วา่
1.จานวนบรรทัด = 2n-1 (ในที่นี ้คือ 9 บรรทัด จาก 2*5-1)
2.จานวนเว้ นวรรค = |n-i-1| (ใน for loop i เริ่มที่ 0 จึงต้ อง -1 ออก)
3.จานวน * = จานวนบรรทัด - จานวนเว้ นวรรคในบรรทัดนันๆ
้
= (2n-1) - |n-i-1|
นามาเขียนเป็ นโปรแกรมได้ ดงั นี ้ :
for(int i = 0; i < 2*n-1; i++)
{
for(int j=0; j < Math.abs(n-i-1);j++)
print(" ");
for(int j=0; j < (2*n-1) - 2*Math.abs(n-i-1);j++)
print("*");
println();
}
นอกจากนี ้ ยังอาจสามารถสร้ างได้ โดยใช้ วิธีคิดแบบอื่นๆอีกมากมาย ซึง่ ก็ขึ ้นอยูก่ บั
ความถนัดและประสบการณ์หรื อความเคยชินของแต่ละคน หากผลลัพธ์ออกมาเหมือนกัน
(ในที่นี ้จะยังไม่สนใจถึงเรื่ องประสิทธิภาพของโปรแกรม)
ข้ าวหลามตัด : แบ่งส่วน
0:
1:
2:
3:
4:
5:
6:
7:
8:
####*
###***
##*****
#*******
*********
#*******
##*****
###***
####*
line
Space count
Asterisk count
0
4
1
1
3
3
2
2
5
3
1
7
4
0
9
5
1
7
6
2
5
7
3
3
8
4
1
มองลาบากหรื อไม่?? ลองแบ่งปั ญหาข้ าวหลามตัดออกเป็ นปั ญหาย่อย ๆ ดูสิ!
0:
1:
2:
3:
4:
5:
6:
7:
8:
####*
###***
##*****
#*******
*********
#*******
##*****
###***
####*
line
Space count
Asterisk count
0
4
1
1
3
3
2
2
5
3
1
7
4
0
9
5
1
7
6
2
5
7
3
3
8
4
1
มองลาบากหรื อไม่?? ลองแบ่งปั ญหาข้ าวหลามตัดออกเป็ นปั ญหาย่อย ๆ ดูสิ!
- เหลือปั ญหาสามเหลี่ยมหงาย และสามเหลี่ยมคว่า และไส้ กลาง
อันดับแรก - ประกาศตัวแปรที่จะใช้ งานก่อน :
int n = 5;
int i = 0;
ถัดมา - สามเหลี่ยมบน :
for(i=0;i<n-1;i++)
{
for(int j=n-i-1; j>0;j--)
print(" "); //เว้ นวรรค เหมือนเดิมทุกประการ
for(int j=0;j<2*i+1;j++) //จำนวน * เริ่มที่ 1 ในบรรทัดแรก และเพิ่มขึน้ ทีละ 2 ในแต่ ละบรรทัด
print("*");
println();
}
วนตังแต่
้ i = 0 ถึง i = 3
หลังจากจบการทางานลูปนี ้ i = 4
(จากการหลุดเงื่อนไข i<n-1 โดยคาสัง่ i++)
องค์ประกอบสาคัญ - ไส้ กลาง :
//ไส้ กลางมีจานวน * เท่ากับ 2n-1
for(int mid=0; mid<2*n-1;mid++)
print("*");
println();
สุดท้ าย - สามเหลี่ยมล่าง :
จากสามเหลี่ยมบน วนจาก 0 ถึง 3 ดังนัน้ สามเหลี่ยมล่างต้ องวนจาก 3 ไปสู่ 0
จากเดิม i = 4 จึงต้ องลดค่าลงไป 1 ให้ เหลือ 3
i--;
for(;i>=0;i--) //ข้ างในเหมือนสามเหลี่ยมบนเป๊ ะๆ
{
for(int j=n-i-1; j>0;j--)
print(" ");
for(int j=0;j<2*i+1;j++)
print("*");
println();
}
Code ฉบับเต็ม
public void run()
{
int n=5;
int i = 0;
for(i=0;i<n-1;i++)
{
for(int j=n-i-1; j>0;j--)
print(" "); //เว้ นวรรค เหมือนเดิมทุกประการ
for(int j=0;j<2*i+1;j++) //จำนวน * เริ่มที่ 1 ในบรรทัดแรก และเพิ่มขึน้ ทีละ 2 ในแต่ ละบรรทัด
print("*");
println();
}
//ไส้ กลางมีจานวน * เท่ากับ 2n-1
for(int mid=0; mid<2*n-1;mid++)
print("*");
println();
i--;
for(;i>=0;i--)
{
//ข้ างในเหมือนสามเหลี่ยมบนเป๊ ะๆ
for(int j=n-i-1; j>0;j--)
print(" ");
for(int j=0;j<2*i+1;j++)
print("*");
println();
}
}