ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingงง nested loop ค๊าบ ท่านใดช่วยสอนหน่อยครับ
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: งง nested loop ค๊าบ ท่านใดช่วยสอนหน่อยครับ  (อ่าน 5826 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
Jenosize
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 89
ออฟไลน์ ออฟไลน์

กระทู้: 2,589



ดูรายละเอียด
« เมื่อ: 16 พฤศจิกายน 2007, 02:03:58 »

 for (int i = 1; i <= 6; i++){
 for (int j = 0; j < i; j++){
 System.out.print("*");
 }
 System.out.println();
 }


มันมีหลักการทำงานอย่างไรหรอครับ ถึงได้ออกมาเป็น

*
**
***
****
*****
******
 Huh?
บันทึกการเข้า

สู้ตายโว้ย.
แอร๊ยยยๆๆๆ
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 50
ออฟไลน์ ออฟไลน์

กระทู้: 2,765



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 16 พฤศจิกายน 2007, 02:16:22 »

for (int i = 1; i <= 6; i++){ เริ่มต้นด้วยการกำหนดค่า i =1 แล้ววนลูปนี้จน i มีค่ามากกว่า 6 แล้วกำไร i++ ในทุกรอบคือ i+ เพิ่มที่ละ 1
 for (int j = 0; j < i; j++){ กำหนด j=0 ในรอบแรก แล้วเช็คว่า หาก j ยังน้อยกว่า i ในรอบนั้นก้อให้ทำ ถ้ามีค่า false ก้ออกจากลูป j
 System.out.print("*"); แสดงค่า *
 }
 System.out.println(); เริ่มบรรทัดใหม่
 }

บันทึกการเข้า

EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 16 พฤศจิกายน 2007, 02:19:17 »

อยากให้ตอบจริงๆ เหรอครับ  Lips Sealed

แน่นอนว่า for (int i = 1; i <= 6; i++){
คือก็วนลูปทั้งหมด 6 ครั้ง

แต่พอ  for (int j = 0; j < i; j++){
มันหมายถึงวนลูปไปตามจำนวนที่ได้จากค่า i
หรือก็คือวนรอบตามเลขครั้งของลูปในขณะนั้น

อย่างเวลาลูปแรกทำงานรอบ 1 แล้วค่า i ก็จะเป็น1
พอมันทำงานในลูป ลูปตัว 2 จะทำงานต่อโดนอิงจากค่า i ของลูปแรก

ทำให้ทุกรอบลูป * จะเพิ่มตามจำนวนครั้งของลูปตัวแรก

 Tongue งงไหม
บันทึกการเข้า

แอร๊ยยยๆๆๆ
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 50
ออฟไลน์ ออฟไลน์

กระทู้: 2,765



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 16 พฤศจิกายน 2007, 02:55:48 »

มองให้มันเป็นภาชนะครอบครับ

อันใหญ่คือภาชนะ i

อันเล็กคือภาชนะ j

ซ้อนกันอยู่ แล้วไล่การทำงานจากใหญ่ไปเล็กจนกว่าเงื่อนไขจะเป็น false
บันทึกการเข้า

ball6847
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 212
ออฟไลน์ ออฟไลน์

กระทู้: 4,174



ดูรายละเอียด
« ตอบ #4 เมื่อ: 16 พฤศจิกายน 2007, 05:13:13 »

อันนี้คือเอาไว้สั่ง print (*) ตามจำนวนครั้งที่เราตั้ง (ลำดับของหมายเลขบรรทัด)

อ้างถึง
for(int j = 1; j<=จำนวนครั้ง; j++){
   System.out.print("*");    // พิมพ์ (*)
}

อันนี้เอาไว้สั่งให้ขึ้นบรรทัดใหม่ ตามจำนวนครั้งที่เราตั้ง (จำนวนบรรทัดที่ต้องการ)

อ้างถึง
for (int i = 1; i <= จำนวนครั้ง; i++){ // ในที่นี้เราต้องการ 6 บรรทัดก็ต้องแทนด้วย 6
   System.out.println();     // ขึ้นบรรทัดใหม่
 }

ดังนั้น ก่อนขึ้นบรรทัดใหม่ เราก็ต้องพิมพ์ (*) ก่อน

อ้างถึง
for (int i = 1; i <= 6; i++){
      for (int j = 1; j <= i; j++){
           System.out.print("*");
      }
     System.out.println();
}




ลองพิสูจน์รอบต่อรอบ เพื่อความชัดเจน
ตัวตั้ง คือ i = 1 และให้ i เพิ่มรอบละ 1 ( i++ )

รอบแรก
i = 1 ;
ตรวจสอบเงื่อนไข 1 <= 6 ผลคือ จริง ทำตามต่อไปนี้

อ้างถึง
for(int j = 1; j<=1; j++){
    System.out.print("*");    // พิมพ์ (*) 1 ที
}
System.out.println();  // แล้วขึ้นบรรทัดใหม่

รอบที่สอง
i = 2 ;
ตรวจสอบเงื่อนไข 2 <= 6 ผลคือ จริง ทำตามต่อไปนี้

อ้างถึง
for(int j = 1; j<=2; j++){
    System.out.print("*");    // พิมพ์ (*) 2 ที
}
System.out.println();  // แล้วขึ้นบรรทัดใหม่

...
...
...

รอบที่หก
i = 6 ;
ตรวจสอบเงื่อนไข 6 <= 6 ผลคือ จริง ทำตามต่อไปนี้

อ้างถึง
for(int j = 1; j<=6; j++){
    System.out.print("*");    // พิมพ์ (*) 6 ที
}
System.out.println();  // แล้วขึ้นบรรทัดใหม่

รอบที่เจ็ด
i = 7 ;
ตรวจสอบเงื่อนไข 7 <= 6 ผลคือ เท็จ หลุดออกจาก loop ทันที

ผลที่ได้คือ

พิมพ์ (*) 1 ที ,แล้วขึ้นบรรทัดใหม่
พิมพ์ (*) 2 ที ,แล้วขึ้นบรรทัดใหม่
พิมพ์ (*) 3 ที ,แล้วขึ้นบรรทัดใหม่
พิมพ์ (*) 4 ที ,แล้วขึ้นบรรทัดใหม่
พิมพ์ (*) 5 ที ,แล้วขึ้นบรรทัดใหม่
พิมพ์ (*) 6 ที ,แล้วขึ้นบรรทัดใหม่

หรือ

*
**
***
****
*****
******




ผมทำให้งงขึ้นป่ะคับ
อุตส่าโพสท์ซะยาว กะเอาให้ชัดเลย หุหุ (เว่อไปป่าวเนี่ย ผมอ่ะ)
ผมพอรู้เรื่องพื้นฐานอ่ะคับ มากกว่านี้ไม่ค่อยได้แระ

บันทึกการเข้า

Jenosize
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 89
ออฟไลน์ ออฟไลน์

กระทู้: 2,589



ดูรายละเอียด
« ตอบ #5 เมื่อ: 16 พฤศจิกายน 2007, 10:35:06 »

ขอบคุณมากครับคุณ  แอร๊ยยยๆๆๆ ,Ethaizone และ คุณ ball6847 ละเอียดยิบเลย
สุดยอดครับ แบบนี้เข้าใจแล้วครับ
« แก้ไขครั้งสุดท้าย: 16 พฤศจิกายน 2007, 10:40:47 โดย Jenosize » บันทึกการเข้า

สู้ตายโว้ย.
Jenosize
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 89
ออฟไลน์ ออฟไลน์

กระทู้: 2,589



ดูรายละเอียด
« ตอบ #6 เมื่อ: 16 พฤศจิกายน 2007, 11:36:58 »

มา งง อีกแล้วครับ  Smiley ท่านคือผมจะลองให้มันเป็น

*****
****
***
**
*

for(int i=1; i<5; i++){
for(int j=5; j<0; j--){
System.out.print("*");
}
System.out.println();
}

โดยตามที่ผมเข้าใจดังต่อไปนี้

ค่า i เริ่ม 1และน้อยกว่า 5 เป็นจริง ไปทำ loop ใน เพิ่ม i รอบละ 1 จาก i++
อ้างถึง
for(int i=1; i<5; i++){

มาทำใน loop นี้ โดย j เริ่ม 5 j น้อยกว่า 0 เป็นจริง j ลดลงรอบละ 1 จาก j--
อ้างถึง
for(int j=5; j<0; j--){

ไปพิมพ์ * จำนวน 5 ครั้งจาก j--
อ้างถึง
System.out.print("*");

ตามด้วยขึ้นบรรทัดใหม่จาก
อ้างถึง
System.out.println();

เริ่มบรรทัดที่ 2 จากค่า i=2 และ i น้อยกว่า 5 เป็นจริง i เพิ่ม++
แล้วไปเริ่ม loop 2 ใหม่ จาก j = 4 j ลดรอบละ 1 จากนั้นไปพิมพ์
* จำนวน 4 ครั้ง แล้วขึ้นบรรทัดใหม่
อ้างถึง
for(int i=1; i<5; i++){
for(int j=5; j<0; j--){
System.out.print("*");
}
System.out.println();
}

ทำซ้ำขั้นตอนไปเรื่อยๆจนครบ

แต่ไหง output ผมออกมาเป็นบรรทัดใหม่ 5 ช่อง หว่า


บันทึกการเข้า

สู้ตายโว้ย.
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 16 พฤศจิกายน 2007, 12:29:03 »

for(int i=1; i<=5; i++){
for(int j=5; j>=i; j--){
System.out.print("*");
}
System.out.println();
}

 Tongue
บันทึกการเข้า

chuanguru
ก๊วนเสียว
*

พลังน้ำใจ: 10
ออฟไลน์ ออฟไลน์

กระทู้: 337



ดูรายละเอียด
« ตอบ #8 เมื่อ: 16 พฤศจิกายน 2007, 13:49:48 »

code ของคุณ  Jenosize  นั้น i กับ j ไม่มีความสัมพันธ์กันเลย
มันไม่มีตัวเชื่อมโยงกันอ่ะ
โค๊ด:
for(int i=1; i<5; i++){
for(int j=5; j<0; j--){
System.out.print("*");
}
System.out.println();
}

มันก็ไม่ต่างอะไรกับ
โค๊ด:
for(int i=1; i<5; i++){

System.out.println();
}

นั่นเอง
ผมคิดถูกไหมครับ
เพราะ
โค๊ด:
for(int j=5; j<0; j--){
System.out.print("*");
}
นั้น เป็นเท็จครับเลยไม่พิมพ์อะไรเลย เพราะถ้า j เป็น 5 แล้ว 5 มันไม่น้อยกว่า 0 อ่ะครับ
ถ้าจะให้แสดงผลต้อง
โค๊ด:
for(int j=5; j>0; j--){
System.out.print("*");
}
จึงจะพิมพ์ *****
« แก้ไขครั้งสุดท้าย: 16 พฤศจิกายน 2007, 14:26:57 โดย chuanguru » บันทึกการเข้า

chuanguru
ก๊วนเสียว
*

พลังน้ำใจ: 10
ออฟไลน์ ออฟไลน์

กระทู้: 337



ดูรายละเอียด
« ตอบ #9 เมื่อ: 16 พฤศจิกายน 2007, 14:16:11 »

ที่ต้องมี i ในลูป j เพราะอะไรผมว่า i มันเพิ่มค่ารอบละ 1 อยู่แล้ว (i++) ครับจึงเอามันมาใช้ประโยชน์ในลูป j ถ้าไม่มีลูป i ข้างนอกแล้ว ต้องทำเช่นนี้ครับ
โค๊ด:
for(int j=5; j>=1; j--){
System.out.print("*");
}
System.out.println();
for(int j=5; j>=2; j--){
System.out.print("*");
}
System.out.println();
for(int j=5; j>=3; j--){
System.out.print("*");
}
System.out.println();
for(int j=5; j>=4; j--){
System.out.print("*");
}
System.out.println();
for(int j=5; j>=5; j--){
System.out.print("*");
}
System.out.println();
จะได้ผลลัพธ์
*****
****
***
**
*
เหมือนกัน อิอิ
บันทึกการเข้า

Jenosize
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 89
ออฟไลน์ ออฟไลน์

กระทู้: 2,589



ดูรายละเอียด
« ตอบ #10 เมื่อ: 16 พฤศจิกายน 2007, 14:38:14 »

กระจ่างอีกแล้วครับ แฮะ Grin

ขอบคุณมากครับผม
บันทึกการเข้า

สู้ตายโว้ย.
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #11 เมื่อ: 16 พฤศจิกายน 2007, 14:55:37 »

ผมไม่ค่อยถนัด java ดังนั้นลอง php อันนี้ละกัน

$round = 10; //แก้เป้นเลขอื่นที่ลงท้ายด้วยเลขคู่
for($i=1; $i<=$round; $i++){
$i2 = $i > $round/2 ? 1 : $i;
$j2 = $i > $round/2 ? $i-$round/2 : $round/2;
for($j = $j2; $j>=$i2; $j--){
echo "*";
}
echo "<br>";
}

ลองเอาไปดูการทำงานเล่นๆ ครับ  Tongue
บันทึกการเข้า

หน้า: [1]   ขึ้นบน
พิมพ์