การทำซ้ำ
การทำซ้ำเป็นรูปแบบหนึ่งของการเขียนโปรแกรม และนอกจากนั้นยังเป็น 1 ในคุณสมบัติของคอมพิวเตอร์ด้วย เราสามารถเขียนโปรแกรมให้ทำงาน ซ้ำได้ ยกตัวอย่างเช่น
ถ้าหากเราต้องการเขียนโปรแกรมให้แสดงข้อความว่า Hello ‘ world 5 ครั้งถ้าเราเขียนแบบปกติเราอาจเขียนได้ว่า
#include"iostream.h"
int main()
{
cout << "Hello ' s world" << endl;
cout << "Hello ' s world" << endl;
cout << "Hello ' s world" << endl;
cout << "Hello ' s world" << endl;
cout << "Hello ' s world" << endl;
return 0;
}
ซึ่งการเขียนแบบนี้ก็จะเป็นการแสดงข้อความว่า Hello ‘s world 5 ครั้ง
แต่ถ้าหากเราต้องการเขียนโปรแกรม ให้แสดง คำว่า Hello ‘s world 100 ครั้งเราคงต้องเสียเวลามาก ถ้าเราใช้วิธีนี้ เพราะฉะนั้นเราควรเขียนโปรแกรมโดยใช้ loop เช่น for หรือ do while ถ้าหากเราเขียนโปรแกรมให้แสดงข้อความว่า Hello ‘s world 5 ครั้งโดยใช้ loop for โปรแกรม จะมี Source code ดังนี้
#include"iostream.h"
int main()
{
int i;
for(i=1;i<=5;i++)
cout << "Hello ' s world" << endl;
return 0;
}
ถ้าเขียนแบบนี้ก็จะได้การทำงานเหมือนกัน
}
For
การทำซ้ำโดยใช้ For
มีรูปแบบ
for(< intilize>;<Condition>;<increment>) Statement
intilize คือค่าเริ่มต้นของตัวแปรจะทำงานแค่ครั้งเดียว
Condition เงื่อนไขที่ว่าเป็นจริงถึงจะทำจะตรวจสอบทุกครัง้ที่แต่ละรอบของการทำงาน
Inclement ค่าของตัวแปรที่เพิ่มขึ้นหรือลดลงแต่ละครั้ง
Statement จะทำตราบเท่าที่ Condition เป็น true
โปรแกรมที่ 6-1 ตัวอย่างการใช้ loop for
Source code
1:#include “iostream.h”
2:int main()
3:{
4: int i;
5: for(i=1;i<=5;I++) cout << “Hello ‘ world”;
6: return 0;
7:}
Output
“Hello ‘ world”
“Hello ‘ world”
“Hello ‘ world”
“Hello ‘ world”
“Hello ‘ world”
บรรทัดที่ 5: for(i=1;I<=5;I++)มีความหมายว่า เป็นการวนลูปโดยที่ตัวแปร i มีค่าเริ่มต้นคือ 1
for(I=1;I<=5;I++) มีความหมายว่าจะวนลูปไปเรีอยๆตราบเท่าที่ ตัวแปร i ยังคงน้อยกว่าหรือเท่ากับ 5
for(I=1;I<=5;i++) ในแต่ละรอบให้ค่า i เพิ่มอีก 1
บรรทัดที่ 5:cout << “Hello ‘ world”; นี่คือ Statement ที่จะทำถ้าหากเงื่อนไขในCondition เป็นจริง
ใน C++ เราสามารถประกาศตัวแปร ในตอนเริ่มต้นได้เช่น
for(int i=1; i<=5;i++)
จะเท่ากับ
int i; for (i=1;I<=5;i++)
เราสามารถเขียนอีกอย่างได้ว่า
for(i=1;i<=5;i=i+1) cout << “Hello ‘ world”;
ก็จะมีการทำงานเหมือนกัน
เราสามารถให้ค่าเพิ่มหรือลดลงก็ได้ในการวนลูปแต่ถ้าให้ค่าตัวแปรลดลงในแต่ละครั้งค่าตัวแปรตอนเริ่มต้นก็ต้องมากกว่าเงื่อนไขที่กำหนดด้วยไม่งั้น Statement ก็จะไม่ทำงานเช่น
for(i=1;i>=10;i--) cout << “Hello ‘ World”;
ถ้าเราเขียนแบบนี้โปรแกรมจะไม่ทำงาน เพราะค่า i ที่กำหนดให้ตอนเริ่มต้นมีค่า 1 แล้วในแต่ละรอบ
โปรแกรมจะเช็คว่า I >=10 จริงรึเปล่าซึ่งไม่สามารถเป็นจริงได้เพราะในแต่ละรอบค่า I จะลดลงที่ละ 1
loop แบบนี้เรียกว่า loop infinite คือ loop ที่ทำงานไปเรื่อยๆไม่มีที่สิ้นสุด
Loop For ที่มีหลาย Statement
มีรูปแบบ
for(< intilize>;<Condition>;<increment>)
{
statement ที่ต้องการให้ทำในแต่ละรอบ
statement ที่ต้องการให้ทำในแต่ละรอบ
statement ที่ต้องการให้ทำในแต่ละรอบ
statement ที่ต้องการให้ทำในแต่ละรอบ
}
เช่น
โปรแกรมที่ 6-2 ตัวอย่างการใช้ loop for ที่มีหลาย Statement
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5: for(i=1;i<=3;i++)
6: {
7: cout << "Hello" << endl;
8: cout << "C++ is Easy" << endl;
9: }
10: return 0;
11:}
Output
Hello
C++ is Easy
Hello
C++ is Easy
Hello
C++ is Easy
บรรทัดที่ 5: เป็นการบอกว่านี่เป็นการทำงานลูป For เหมือนโปรแกรมที่ 5.1
บรรทัดที่ 6:เป็นวงเล็บ ปีกกาที่บอกถึงว่านี่เป็นส่วนเริ่มต้นของ ของ Statement
บรรทัดที่ 9:เป็นวงเล็บปีกกาที่บอกว่านี่เป็นส่วนจบของ Statement โปรแกรมจะทำงานในStatement ตั้งแต่ บรรทัดที่ 6 จะ ถึง บรรทัด ที่ 9 ตามจำนวนรอบที่กำหนดไว้ตรง Loop For
หรือจะเขียนแบบนี้ก็ได้
for(I=1;I<=3;I++){cout << “Hello” << endl; cout << “C++ is Easy” << endl;}
แบบนี้ก็จะได้ผลรันเหมือนกัน และก็ถือว่าเป็น LoopFor ที่มีหลาย Statement ด้วย
การนำค่าตัวแปรที่ใช้ในการวน loop for มาใช้
เราสามารถนำค่าตัวแปรที่ใช้ในการวนloop มาใช้ในloop มาได้ เช่นเราใช้ตัวแปร i ในการวน loop และ Statement ที่อยู่ใน loop เราก็นำค่าตัวแปร i มาใช้ เข่นใช้ในการกำหนดข้อมูลใช้ในการคำนวณ หรือใช้ในการแสดงผล แต่เราไม่ควรกับหนดค่าให้กับตัวแปรที่ใช้ในการวน loop ใน Statement ของ loop เพราะอาจจะทำให้ loop มีปัญหาและอาจเกิด loop infinite ได้
โปรแกรมที่6-3 ตัวอย่างการนำค่าตัวแปรที่ใช้ในการวน loop for มาใช้
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5: for(i=1;i<=5;i++)
6: cout << i << " " << i * 5 << endl;
7:
8: return 0;
9:}
Output
1 5
2 10
3 15
4 20
5 25
อธิบาย Source code
บรรทัดที่ 5: เป็นการใช้ loop for ที่ใช้ตัวแปร i โดยที่ให้ค่าตัวแปร i ตอนเริ่มต้นเท่ากับ 1 และเงื่อนไขที่จะทำตราบเท่าที่เป็นจริงคือ i <= 5 และในแต่ละรอบให้ ค่าตัวแปร i เพิ่มอีก 1
บรรทัดที่ 6: cout << i << " " << i * 5 << endl; เป็น Statement ที่จะทำตราบเท่าที่เงื่อนไขใน loop for เป็นจริง
โดย Statement นี้จะมีการทำงานคือ ในแต่ละรอบที่ loop for ทำงาน ให้แสดงค่าตัวแปร i และต่อด้วยข้อความว่างๆ1ช่อง(“ “) และต่อด้วย ให้แสดงค่าตัวแปร i * 5
จะเห็นได้ว่าเราสามารถนำค่าตัวแปรที่ใช้ในการวน loop for มาใช้ในการแสดงผลหรือใช้ในการคำนวณได้
การใช้ Statement ทีอยู่ใน loop กำหนดค่าให้กับตัวแปรที่ใช้ในการวน loop
การใช้ Statement ทีอยู่ใน loop กำหนดค่าให้กับตัวแปรที่ใช้ในการวน loop จะก่อให้เกิดปัญหาได้ถ้าไม่จำเป็นไม่ควรทำ เช่น
โปรแกรมที่ 6-4 แสดงตัวอย่างการใช้ Statement ที่อยู่ใน loop กำหนดค่าให้กับตัวแปรที่ใช้ในการวน loop for
แล้วเกิดปัญหา loop infinite
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5: for(i=1;i<=5;i++)
6: {
7: i--;
8: cout << i << " " << i * 5 << endl;
9: }
10: return 0;
11:}
Output จะแสดงเลข 0 0 ไปเรื่อยๆไม่มีที่สิ้นสุด
อธิบาย Source code
บรรทัดที่ 5:เป็นการใช้ตัวแปร i ในการใช้ loop for โดยที่ค่าเริ่มต้นของตัวแปร i คือ 1 และเงื่อนไขที่จะทำตราบเท่าที่เป็นจริงคือ i <= 5 ซึ่งถ้าค่า i ไม่มีการเปลี่ยนแปลงคือเป็น 1 ตลอด loop นี้ก็จะทำงานไปเรื่อยๆไม่มีที่สิ้นสุดเราจึงต้องกำหนดให้ค่า i เพิ่มขึ้นทุกครั้งในการ วน loop คือ i++ ในเมื่อเรากำหนดแล้ว แล้วทำไม loop ยังทำงานไม่มีที่สิ้นสุดนั่นเป็นเพราะ ในบรรทัดที่ 7:i—เป็นการกำหนดให้ค่าตัวแปร i มีค่าลดลง 1 ซึ่ง Statement นี้จะทำงานทุกครั้งที่มีการวน loop เพราะฉะนั้นค่า i จะไม่สามารถเพิ่มขึ้นได้เลยก็จะ <=5 อยู่ตลอด เพราะว่าถึงแม้เราจะสั่งให้ i++ ในแต่ละรอบของการวน loop แต่ Statement ใน loop นั้นก็ไปลดค่า i ลงอีก จึงเป็นสาเหตุให้เกิด loop infinite
loop for ไม่จำเป็นต้องเพิ่ม หรือลดทีละ 1 เช่น
for(i=1;i<=30;i = i +5) cout << “Hello”;
ที่ยกตัวอย่างมาเป็นรูปแบบการใช้ For ในแบบพื้นฐานแต่ความจริงแล้ว
ภาษา C++ เป็นภาษาที่มีความยืดหยุ่นมากในความจริงแล้วการใช้ Loop For ไม่จำเป็นต้องมีรูปแบบอย่างที่ยกตัวอย่างมาก็ได้
for(< initialize>;<Condition>;<increment>)
ในส่วน Initialize, condition , increment ทั้ง 3 ส่วนนี้ไม่จำเป็นต้องมีก็ได้
การใช้ loop for โดยไม่มีส่วนของ initialize
ถ้าไม่มีส่วนของ initialize ก็จะไม่มีค่าเริ่มต้นของตัวแปร ที่ใช้ ในการวน loop ถ้าหากในส่วนของ condition คือ i <= 10 คือถ้าค่า i น้อยกว่าหรือเท่ากับ 10 Statement ใน loop ก็จะทำงาน แต่ถ้าค่า i เป็น 20 ตั้งแต่แรก Statement ใน loop ก็จะไม่ได้ทำงาน เลย สักรอบ เราสามารถไม่ไม่อะไรเลยในส่วนของ initialize ได้ โดยโปรแกรมจะนำค่าปัจจุบันของตัวแปรที่ใช้ในการวน loop มาใช้
ถ้าเราไม่ใส่อะไรเลยในส่วน Initialize เราก็ควรจะกำหนดค่าเริ่มต้นของตัวแปรที่ใช้ในการวน loop ก่อน
โปรแกรมที่ 6-5 ตัวอย่างการใช้ for โดยไม่มี initialize
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5: i = 1;
6: for( ;i<=10;i++)
7: cout << i << " Hello C++." << endl;
8:
9: return 0;
10:}
Output
1 Hello C++.
2 Hello C++.
3 Hello C++.
4 Hello C++.
5 Hello C++.
6 Hello C++.
7 Hello C++.
8 Hello C++.
9 Hello C++.
10 Hello C++.
อธิบาย Source code
บรรทัดที่ 4:เป็นการประกาศตัวแปร ประเภท int ชื่อ i และกำหนดค่าให้เท่ากับ 1 ในบรรทัดที่ 5
บรรทัดที่ 6 และ 7:
6: for( ;i<=10;i++)
7: cout << i << " Hello C++." << endl;
ในที่นี้จะเห็นได้ว่า ใน loop for เราไม่ได้ใส่ Source code ในส่วนของ initlize เลยซึ่งการวน loop ก็ยังทำงานอยู่ โดย Statement ที่จะทำงาน คือ Statement ในบรรทัดที่ 7 คือให้แสดงค่าตัวแปร i และคำว่า “Hello C++” ส่วยสาเหตุที่โปรแกรมทำงาน 10 รอบก็เพราะว่า ในส่วนของ condition คือ i <= 10 ยังทำงานอยู่คือ Statement ในบรรทัดที่ 7 จะทำงานตราบเท่าที่ i ยังน้อยกว่า หรือ เท่ากับ 10 และในส่วนของ increment คือ
i++ ก็ยังทำงานอยู่คือในแต่ละรอบเราให้ค่าตัวแปร i เพิ่มอีก1
การใช้ loop for โดยไม่มีส่วนของ condition และการใช้ break
ส่วนของ condition จะเป็นการเช็คเงื่อนไขในแต่ละรอบว่าจะทำตราบเท่าที่เงื่อนไข ใน condition เป็นจริง เช่น i <= 10 ก็คือ ตราบเท่าที่ i ยังน้อยกว่า หรือเท่ากับ 10 ก็จะทำโดยที่เรามักจะเขียนโปรแกรมให้ตัวแปร i เพิ่มค่า ในแต่ละรอบในส่วน ของ increment เมือตัวแปร i มากกว่า 10 เมื่อไหร่ loop ก็จะหยุดทำ แต่ถ้าเราไม่มีส่วนของ condition แล้วเราจะออกจาก loop ได้อย่าง ไร
ในC++ เราสามารถใช้ breakในการออกจาก loop ได้ เมื่อ Compiler มาเจอ Statement นี้ก็จะออกจาก loop เราสามารถใช้ break ร่วมกับ if ได้
เช่น
for(i = 1; i <= 10; i++)
if ( i == 5) break;
ถ้าเขียนแบบนี้เมื่อค่าตัวแปร i เท่ากับ 5 โปรแกรมก็จะออกจาก loop โดยที่จะไม่ทำถึง 10 รอบ
การใช้ break;ไม่จำเป็นต้องใช้กับ loop for ที่ไม่มีส่วนของ condition เท่านั้น loop for ทั่วไปก็สามารถใช้ break ได้
จะมีข้อสังเกตุว่าถ้าเราใช้ loop for ที่ไม่มีส่วนของ condition และเราจะใช้ break ร่วมกับ if แทน เงื่อนไขใน if จะเป็นไปในทางตรงกันข้ามกับ condition
เช่นถ้าในส่วนของ condition ถ้าเราต้องการเขียนให้ ทำงาน 10 รอบ เราอาจเขียนเป็น
for(i=1; i <= 10 ; i ++)
แต่ถ้าเราใช้ if ควรเขียนเป็น
if(i > 10 ) break;
เป็นเพราะว่า condition คือเงื่อนไขที่ถ้าเป็นจริง Statement ใน loop จะ ทำงาน
แต่ การใช้ if ในกรณีนี้ส่วนใหญ่ เป็นเงื่อนไขที่ถ้าเป็นจริงจะออกจาก loop
โปรแกรมที่ 6-6 การใช้ loop for โดยไม่มีส่วนของ condition
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5:
6: for(i=1; ;i++)
7: {
8: if(i>10)break;
9:
10: cout << i << " Hello C++." << endl;
11: }
12:
13: return 0;
14:}
Output เหมือนโปรแกรมที่ 6-5
อธิบาย Source code
บรรทัดที่ 6:เราใช้ loop for โดยใช้ตัวแปร i ที่ไม่มีส่วนของ condition loop for ก็จะทำงานต่อไปเรื่อยๆไม่มีที่สิ้นสุด แต่สาเหตุที่ loop for นี้ทำงานแค่ 10 รอบเนื่องจาก ในบรรทัดที่ 8 เรามีการเช็คเงื่อนไขว่า ถ้าตัวแปร i > 10 จริง ให้ break; นั่นคือการ ออกจาก loop และถึงแม้ loop นี้จะไม่มีในส่วน ของ condition แต่ส่วนของ initialize ยังมีอยู่ โดยเรากำหนดให้ตอนเริ่มต้นตัวแปร i เป็น 1 และในส่วนของ increment เราก็กำหนดให้ตัวแปร i เพิ่มค่าอีก 1 โดยที่เมื่อถึงรอบที่ 11 ตัวแปร i ก็จะมีค่า 11 และพอเจอ Statement ในบรรทัดที่ 8 : โปรแกรมก็จะทำการเช็คเงื่อนไขซึ่งในรอบที่ 1 ถึง รอบ ที่ 10 เงื่อนไขในบรรทัดที่ 8 จะเป็นเท็จ เพราะว่า ค่าตัวแปร i น้อยกว่า 10 แต่พอรอบที่ 11 เงื่อนไขในบรรทัดที่ 8 ที่เช็คจะเป็นจริง ก็จะทำงาน Statement break; ก็จะออกจาก loop
การใช้ loop for โดยไม่มีส่วนของ increment
ในการใช้ for ในการวน loop ถ้าไม่มีส่วนของ increment ค่าตัวแปรที่ใช้ ในการวน loop ก็จะไม่มีการเปลี่ยนแปลง โปรแกรมอาจจะทำงาน วน loop ไปเรื่อยๆ โดยที่ไม่มีการหยุดเนื่องจาก ค่าของตัวแปรใช้ในการวน loop ไม่เปลี่ยนแปลง ในส่วนของ condition ก็จะเป็นจริง แล้วก็จะทำงาน Statement ที่อยู่ใน loop ไปทุกๆรอบ
เช่น ถ้าเราเขียน Source code
for (i = 1;i <= 10; )
Statement ที่อยู่ใน loop for ก็จะทำงานไปเรื่อยๆเนื่องจากในส่วนของ condition เป็นจริงคือ i<=10 ถ้าเราไม่มีส่วนของ increment มาเพิ่มค่าตัวแปร i โปรแกรมก็จะทำงานวน loop อยู่อย่างนั้น ไม่สามารถออกจาก loop ได้
ใน C++ อนุญาติให้เราไม่ต้องเขียน Source code ในส่วนของ increment ได้แต่เราก็ควรกำหนดค่าของตัวแปรที่ใช้ในการวน loop ให้เพิ่มขึ้นหรือลดลงเองในส่วนของ Statement ใน loop เพื่อป้องกัน ปัญหา loop infinite แต่การ กำหนดค่าให้กับตัวแปรที่ใช้ในการวนloop โดย Statement ใน loop อาจทำให้โปรแกรมมีปัญหาได้ถ้าไม่จำเป็นก็ไม่ควรทำ
โปรแกรมที่ 6-7 ตัวอย่าง การใช้ loop for ที่ไม่มีส่วน increment
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5:
6: for(i=1;i<=10;)
7: {
8: cout << i << " Hello C++." << endl;
9: i++;
10: }
11:
12: return 0;
13:}
Output เหมือนโปรแกรมที่ 6-5
อธิบาย Source code
บรรทัดที่ 6: เป็นการใช้ loop for โดยไม่มีส่วนของ increment ซึ่งโปรแกรมก็จะทำการวน loop ไม่เรื่อยๆ เนื่องจาก เงื่อนไขใน condition เป็นจริง แต่โปรแกรมนี้จะมีการทำงานแค่ 10 รอบเนื่องจาก ในบรรทัดที่ 9:เราได้เขียน ให้ตัวแปร i เพิ่มค่าอีก 1 ในทุกๆรอบ พอถึงรอบที่ 10 หลังจากพิมพ์ข้อความ 10 Hello C++. แล้วค่าตัวแปร i ก็เพิ่มขึ้นอีก 1 แล้วก็จะไม่ทำการวน loop อีกแล้ว เนื่องจากในส่วนของ condition คือ i <= 10 ไม่เป็นจริงแล้ว โปรแกรมก็จะไม่ทำงาน ในส่วนของ Statement ที่อยู่ใน loop
โปรแกรมที่ 6-8 การใช้ loop for โดยไม่มีส่วนของ initialize , condition, increment
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5: i = 1;
6: for(; ;)
7: {
8: if(i > 10)break;
9: cout << i << " Hello C++." << endl;
10: i++;
11: }
12:
13: return 0;
14:}
Output เหมือนโปรแกรมที่ 6-5
โปรแกรมนี้เป็นการใช้ loop for โดยที่ไม่มีส่วนของ initialize , condition, increment จะเห็นได้ว่าเราไม่ได้เขียน Source code อะไรไปเลยในแต่ละส่วน โปรแกรมก็ยังทำการวน loop ได้ 10 รอบ เนื่องจาก ใน Source code เราได้มีส่วนที่เขียน แล้วสามารถใช้แทน initialize , condition, increment แล้ว
บรรทัดที่ 5:เป็นการกำหนดให้ค่าตัวแปร i เท่ากับ 1 ซึ่งทำให้เราไม่จำเป็นต้องเขียนส่วนของ initialize
บรรทัดที่ 8:เป็นการเขียนโปรแกรมให้เช็คเงื่อนไขในแต่ละรอบว่า ถ้า i > 10 จริงให้ออกจาก loop นี่คือส่วนที่ทำให้เราไม่ต้องเขียน Source code ในส่วนของ condition
บรรทัดที่ 10:เป็นการกำหนดให้ค่าตัวแปร i เพิ่มขึ้นอีก 1 ทำให้เราไม่จำเป็นต้องเขียน Source code ในส่วนของ increment
นอกจากนี้แล้วในส่วนของ initialize , condition, increment เรายังสามารถกำหนดรายละเอียดได้มากกว่านี้อีก
initizlize เราสามารถกำหนดค่าในมากกว่า1ค่า เช่น i= 1,j=2
condition เราสามารถมีเงื่อนไขที่สามารถนำมาเชื่อมกันได้เช่น i > 10 && j > 20
increment สามารถมีตัวแปรได้มากกว่า1 ตัวในการเพิ่มหรือลดค่าในแต่ละครั้งรวมถึงตัวแปรที่ไม่ได้ใช้ในการวน loop เราก็สามารถกำหนดให้เพิ่มค่าหรือลดค่าในส่วนของ increment ได้
โปรแกรมที่ 6-9 การใช้ for ในการวน loop
Source code
#include "iostream.h"
int main()
{
int i,x;
for(i=1,x=2;i<=10 || x <=7;i +=x,x++)
{
cout << i << " " << x << endl;
}
return 0;
}
Output
1 2
3 3
6 4
10 5
15 6
21 7
บรรทัดที่ 4: ในโปรแกรมนี้มีความหมายว่า เป็นการใช้ Loop For โดยที่
initilize ค่าเริ่มต้นมี 2 ตัวคือ I และ X โดยที่ I = 1 ,X = 2
condition เงื่อนไขในการตรวจสอบว่าถ้าเป็นจริงจะทำคือ I<=10 หรือ X <=7
increment ในแต่ละรอบค่า i = i +x ส่วน x = x + 1
โปรแกรมนี้จะทำงานไปเรื่อยๆ ตราบเท่าที่ ค่า ตัวแปร i <= 10 หรือ x<= 7 ในแต่ละรอบก็จะพิมพ์ค่าตัวแปร i และ ตัวแปร x ทางจอถาพ และให้ค่าตัวแปร i จะเท่ากับ i + x และค่าตัวแปร x จะ เพิ่มที่ละ 1
การใช้ Loop For เขียนโปรแกรม
ในที่นี่จะเป็นตัวอย่างโปรแกรมที่ใช้ loop for ในการเขียน
ตัวอย่างโปรแกรมที่ 6-10 ให้เขียนโปรแกรมที่จะทำการ รวมผลบวกที่ได้ ตั้งแต่ เลข 1 ถึง 100 โดยใช้ loop for
คำว่ารวมผลบวกที่ได้ในที่นี้หมายถึง 1 ถึง 4 จะมีค่าเท่ากับ 1+2+3+4 ได้เท่ากับ 10
1 ถึง 6 1+2+3+4+5+6 ได้เท่ากับ 21 โปรแกรมนี้ให้ทำการบวกตั้งแต่ 1 ถึง 100
วิเคราะห์อัลกอริทึ่ม อย่างง่ายๆก่อน
1. โปรแกรมต้องการวน loop ร้อย รอบ ในที่นี้ให้ใช้ loop for
2.ถ้าเราจะหาค่าของผลรวมตั้งแต่ 1 to 100 เราอาจใช้ตัวแปรที่ใช้ในการเก็บค่าได้เช่น
Total = Total +1+2+3…+100;
แต่ถ้าทำอย่างนั้น Source code จะยาวมากและอีกอย่างคือ โปรแกรมนี้ โจทย์บังคับให้ใช้ loop for
โดยที่ค่าของ ตัวแปรที่ใช้ในการวน loop ในแต่ละรอบจะมีค่าตั้งแต่ 1 ถึง 100 เพราะฉะนั้นเราน่าจะเขียนโปรแกรมให้ ในแต่ละรอบค่าของตัวแปร จะเท่ากับค่าของตัวแปร บวกตัวแปรที่ใช้ในการวน loop
เช่น
(loop ที่จะทำงาน 3 ครั้ง)
Total = Total + i;
สมมุติว่า loop นี้ทำงาน 3 รอบ โดยที่ค่าของตัวแปรที่ใช้ในการวน loop คือ i จะมีค่า 1,2,3 ตามลำดับ
และค่าของตัวแปร Total มีค่าเท่ากับ 0
ในรอบแรกค่า i จะเท่ากับ 1
Total = Total + 1 หรือมีค่าเท่ากับ Total = 0 + 1
ในรอบ 2 ค่า i จะเท่ากับ 2
Total = Total + 2 หรือมีค่าเท่ากับ Total = 1 + 2
ในรอบ 3 ค่า i จะเท่ากับ 3
Total = Total + 3 หรือมีค่าเท่ากับ Total = 3 + 3
หลังจากวน loop ครบ 3 รอบแล้ว
Total จะเท่ากับ 6 ซึ่งเท่ากับ 1+2+3
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i,Total;
5: Total = 0;
6:
7: for(i=1;i<=100;i++)
8: Total = Total +i;
9:
10: cout << Total;
11: return 0;
12:}
Output
5050
ในส่วนของการ อธิบาย Source code โปรแกรมนี้จะไม่มีเพราะได้ อธิบาย ไปในส่วนของการวิเคราะห์อัลกอริทึ่มแล้ว
โปรแกรมที่ 6-12
ถ้าหากโจทย์ต้องการให้เรารับค่าตัวเขเข้าไปแล้วแสดงผลออกมาเป็นสูตรคูณของแม่นั้น เช่น
รับ ค่า 3
แสดง
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
ไปจนถึง 12
วิเคราะห็โจทย์
1.จากโจทย์จะเห็นได้ เราต้องการรับเลขและแสดงสูตรคูณของแม่นั้นโดยที่ต้องแสดงทั้งหมด 12 รอบ เราควรใช้ Loop For เพื่อความสะดวกในการเขียนโปรแกรม
2. สิ่งที่ต้องแสดงในแต่ละรอบแบ่ง 5 ส่วนเช่นถ้าเป็นแม่ 3
3 * 1 = 3
3 * 2 = 6
ตำแหน่งที่ 1 เลข 3 ตัวแรกคือแม่ของสูตรคูณที่เรารับค่ามา
ตำแหน่งที่ 2 เครื่องหมาย * ในทุกๆรอบจะเป็นเครื่องหมายนี้อยู่แล้วไม่มีการเปลี่ยนแปลง
ตำแหน่งที่ 3 จำนวนรอบมีทั้งหมด 12 รอบจะเปลี่ยนไปทุกครั้งตั้งแต่ 1 ถึง 12
ตำแหน่งที่ 4 เครื่องหมาย = ในทุกๆรอบจะเป็นเครื่องหมายนี้อยู่แล้วไม่มีการเปลี่ยนแปลง
ตำแหน่งที่ 5 เลข 3 ตัวสุดท้าย คือผลคูณในแต่ละรอบได้มาจาก ตัวแปรที่เก็บค่าแม่ * จำนวนรอบ
Source code
1:#include "iostream.h"
2:int main()
3:{
4: int i,Mae;
5: cout << "Please Enter your number :";
6: cin >> Mae;
7: for(i=1;i<=12;i++)
8: {
9: cout << Mae << " * " << i << " = " << Mae*i;
10: cout << endl;
11:
12: }
13:
14: return 0;
15:}
Output
Please Enter your number :5
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
5 * 10 = 50
5 * 11 = 55
5 * 12 = 60
อธิบาย Source code
บรรทัดที่ 4: เป็นการประกาศตัวแปรประเภท integer 2 ตัวคือ i และ Mae i ใช้ในการวน Loop ส่วน Mae ใข้ในการ เก็บค่าหมายเลขของแม่
บรรทัดที่ 5: เป็นการให้แสดงผลข้อความให้ผู้ใช้รู้ว่าต้องทำอะไร
บรรทัดที่ 6:เป็นการค่ามาเก็บไว้ในตัวแปร Mae
บรรทัดที่ 7: เป็นการบอกว่าให้มีการใช้ Loop For เพื่อทำงาน 12 รอบ
บรรทัดที่ 9: cout << Mae << " * " << i << " = " << Mae*i;
เป็นการพิมพ์ ตัวแปร Mae และ เครื่องหมาย * และ รอบที่ และเครื่องหมาย = และผลของการ
คำนวณ สมมุติว่า แม่ 5
รอบที่ 1 5 * 1 = 5
รอบที่ 2 5 * 2 = 10
บรรทัดที่ 11:เป็นการขึ้นบรรทัดใหม่ในการจบแต่ละรอบ
ตัวอย่างโปรแกรมที่ 6-12-1
ถ้าหากโจทย์ต้องการให้เราเขียนโปรแกรมที่มีการแสดงเลขโดยที่ต้องมีการจัดรูปแบบแบบนี้ด้วย
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35
ถ้าหากตัวเลขมีแค่นี้เราอาจ จะ ใช้ วิธีพิมพ์ไปทั้งหมดแล้วใช้ cout แสดง ผลก็ได้ แต่ถ้าหากมีเลข เป็น ร้อยก็จะทำให้เสียเวลามากเพราะฉะนั้นเราน่าจะใช้วิธีการทำซ้ำมากกว่า
วิเคราะห์โจทย์ อย่างง่ายๆก่อน
1.โจทย์ต้องการ ให้แสดงเลข 1 –35
2.การจัดตำแหน่งควรจะมีรูปแบบสวยงาม
ไม่ควรให้เป็นแบบ นี้-à 8 9 10 11 12 13 14
15 16 17 18 19 20 21
3.ใน 1 บรรทัด แสดง แค่ 7 ตัว พอตัวต่อไปให้ขึ้นบรรทัดใหม่
วิธีการทำงานวิธีที่ 1
ในข้อ 1 ที่ทำงาน 35 ครั้ง เพื่อที่จะแสดงตัวเลขในที่นี้เราสามารถใช้ตัวแปรที่ใช้ในการวน loop แสดงค่าออกมาได้
ข้อ 2 เราใช้ Manipulater setw ในการแสดงผลที่หน้าจอได้ได้
ข้อ 3 นี่คือส่วนที่ยากที่สุดสำหรับโจทย์นี้ สำหรับคำที่ว่า “พอครบ 7 ตัวให้ขึ้นบรรทัดใหม่”
ถ้าเราจะเขียนโปรแกรมให้เช็คเงื่อนไข
if(ครบเจ็ดตัว) cout << endl;
เราไม่สามารถสั่งให้ compiler ทำงาน แบบนั้นได้ แต่เราสามารถสั่งให้ compiler เช็คเงื่อนไขบางอย่างได้ เช่นในแต่ละรอบของการ แสดงผลตัวเลขแต่ละตัว ให้มีตัวแปรที่ใช้การนับ (ในที่นี้สมมุติตัวแปร ชื่อ count ) ด้วยว่านี่เป็นตัวที่เท่าไหร่ โดยวิธีการคือให้ตัวแปร นั้นเพิ่มค่าทีละ 1
ส่วนในการเช็คเงื่อนไข ก็เช็คว่า ถ้าตัวแปรนั้นเท่ากับ 7 จริงก็ให้ขึ้นบรรทัดใหม่
แล้วหลังจากที่ขึ้นบรรทัดใหม่แล้วก็ให้กำหนดค่าตัวแปร ที่ใช้ นับ ให้เท่ากับ 0
สาเหตุที่ทำไมต้องกำหนดให้ตัวแปรที่ใช้นับ เป็น 0 เมื่อขึ้นบรรทัดใหม่เนื่องจากว่าถ้าหากว่ารอบการทำงานของโปรแกรมถึงรอบที่ 7 ตัวแปร count ก็จะเท่ากับ 7 ก็จะขึ้นบรรทัดใหม่แต่พอรอบการทำงานถึงรอบที่ 14 ตัวแปร count ก็จะเท่ากับ 14 โปรแกรมก็จะไม่ขึ้นบรรทัดใหม่เพราะเงื่อนไขของเราคือต้องเท่ากับ 7 ถึงขึ้นบรรทัดใหม่ อัลกอริทึ่มนี้ผู้เขียนคิดว่าน่าจะตรงกับความคิดของคนเรามากที่สุด
Source code
1:#include"iostream.h"
2:#include"iomanip.h"
3:int main()
4:{
5: int i,Count=0;
6: for(i=1;i<=35;i++)
7: {
8: cout << setw(3) << i;
9: Count++;
10:
11: if(Count ==7)
12: {
13: cout << endl;
14: Count =0;
15: }
16: }
17:
18: return 0;
19:}
Output เหมือนกับที่โจทย์ต้องการ
อธิบาย Source code
บรรทัดที่ 5:เป็นการประกาศตัวแปร ประเภท int ชื่อ i ใช้ในการวน loop และตัวแปร ชื่อ count ไว้ใช้ในการนับในแต่ละรอบโดยกำหนดค่าเริ่มต้นให้เป็น 0 ด้วย
บรรทัดที่ 6:เป็นการวน loop for โดยใช้ตัวแปร i โดยให้วน loop 35 รอบ
บรรทัดที่ 8: cout << setw(3) << i; เป็น Statement ที่อยู่ใน loop ที่จะทำงาน โดย Statement นี้จะพิมพ์ค่าตัวแปร i ออกทางจอภาพโดยมีการจัดตำแหน่งด้วย
บรรทัดที่ 9: Count++ เป็นการเพิ่มค่าให้กับตัวแปร Count อีกหนึ่งในแต่ละรอบเพื่อที่จะสามารถใช้นับได้ว่าเราพิมพ์ตัวเลขไปกี่ตัวแล้ว
บรรทัดที่ 11:เป็นการเช็คเงื่อนไขว่า ถ้าตัวแปร Count == 7 จริง คือได้มีการพิมพ์ตัวเลขครบ 7 ตัวแล้ว ให้ทำงาน Statement ในบรรทัดที่ 12 คือการขึ้นบรรทัดใหม่ และในบรรทัดที่ 13 เป็นการกำหนดค่าให้กับตัวแปร Count เป็น 0 ใหม่
โปรแกรมที่ 6-12-2
โจทย์เหมือนกับโปรแกรมที่ 6-12-1 แต่เปลี่ยนตรงอัลกอริทึ่ม
จากรูปแบบของการแสดงผลของโปรแกรมที่ 6-12-1 คือ
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35
จะมีข้อสังเกตุได้ว่าเราอาจไม่ต้องนับว่าในแต่ละบรรทัดมีเลขครบ 7 ตัวแล้วจึงขึ้นบรรทัดแต่เราอาจใช้วิธีให้ในแต่ละรอบของการทำงานคือการพิมพ์เลขออกมา ถ้าหากเลขนั้น คือเลข 7,14,21,28 ก็ให้ขึ้นบรรทัดใหม่ ตัวเลขชุดนี้ถ้านำไป %(หารเอาแต่ส่วน) กับ 7 จะได้ 0 เช่น
7 % 7 จะได้ 0
14 % 7 จะได้
เพราะฉะนั้นเราอาจเขียนโปรแกรมเพื่อที่จะทำการตรวจสอบการทำงานในแต่ละรอบได้ว่าถ้า จำนวนรอบ % 7 แล้วได้เท่ากับ 0 จริง ก็ให้ขึ้นบรรทัดใหม่
Source code
1:#include "iostream.h"
2:#include "iomanip.h"
3:int main()
4:{
5: int i;
6: for(i=1;i<=35;i++)
7: {
8: cout << setw(3) << i;
9:
10: if(i % 7 ==0) cout << endl;
11: }
12:
13: return 0;
14:}
Output เหมือนที่โจทย์ต้องการ
บรรทัดที่ 6: โปรแกรมจะทำงาน 35 รอบ
บรรทัดที่ 8: ในแต่ละรอบโปรแกรมจะแสดงผลค่า i โดยที่เราใช้ Manipulater setw ในการจัดตำแหน่ง
บรรทัดที่ 10: โปรแกรมจะเช็คว่า ถ้าลำดับของรอบ % 7 ได้เท่ากับ 0(ครบ 7 รอบ) ให้ขึ้นบรรทัดใหม่
Loop For ที่ซ้อนกัน
เราสามารถใช้ Loop For ซ้อนกันได้ในกรณีที่ต้องการให้มีการวน Loop ซ้อนกันโดยที่ รูปแบบการใช้ก็จะเหมือนรูปแบบปกติ ถ้ามีหลาย Statement ก็ต้อง มีวงเล็บ ปีกกาด้วย
รูปแบบ
for(< intilize>;<Condition>;<increment>)
{
statement ที่ต้องการให้ทำในแต่ละรอบ
statement ที่ต้องการให้ทำในแต่ละรอบ
for(< intilize>;<Condition>;<increment>)
{
statement ที่ต้องการให้ทำในแต่ละรอบ
statement ที่ต้องการให้ทำในแต่ละรอบ
}
}
โดยที่ Loop ที่อยู่ด้านนอก
โจทย์ที่5.3
ตัวอย่างเช่นโจทย์ต้องการให้แสดงผล
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
เราอาจใช้ Loop For ที่ซ้อนกัน โดยให้ Loop แรกทำงาน 5 ครั้ง(มี 5 บรรทัด) Loop ที่ซ้อนอยู่ทำงาน 10 ครั้ง ในการพิมพ์ตัวเลข
โปรแกรมที่ 6-13 การใช้ loop for ซ้อนกัน
Source code
1:#include "iostream.h"
2:int main()
3:{
4: int i,j;
5: for(i=1;i<=5;i++)
6: {
7: for(j=1;j<=10;j++)cout << j << " " ;
8:
9: cout << endl;
10: }
11:
12: return 0;
13:}
ผลรันจะเป็นเหมือนที่โจทย์ต้องการ
บรรทัดที่ 4:ประกาศตัวแปร i และ j เป็นตัวแปรประเภท integer เพื่อใช้ กับ Loop For
บรรทัดที่ 5:เป็นการบอกว่า Loop i จะทำงาน 5 ครั้ง
บรรทัดที่ 7: Loop j จะทำงาน 10 ครั้ง โดยแต่ละครั้งให้ แสดงผลค่า j และ “ “ ในการเว้นวรรคการที่ Loop jอยู่ใน Loop i มีความหมายว่า เมื่อ Loop i ทำงาน 1 ครั้ง Loop j ก็จะทำงาน 10 ครั้ง Loop i ทำงาน 5 ครั้ง Loop j
ก็จะทำงาน รวมแล้ว 50 ครั้ง
บรรทัดที่ 9: เป็นการให้ขึ้นบรรทัดใหม่เมื่อจบ Loop i แต่ละครั้ง Statement ในบรรทัดที่ 9 นี้จะไม่ถือว่าเป็น Statement ใน loop j เนื่อง จาก loop j เป็น loop แบบมี Statement เดียว เพราะฉะนั้นในการทำงานในแต่ละรอบของ loop j คือจะทำงาน Statement cout << j << " " ; ในบรรทัดที่ 7 เท่านั้นแต่ไม่ได้ทำงาน Statement ในบรรทัดที่ 9 ด้วย
โจทย์ที่ 6-14
ต้องการโปรแกรมที่รับค่าด้านกว่างของรูปสี่เหลี่ยมจตุรัสแล้วแสดงจำนวนเสาที่ล้อมรอบเช่น
ด้านยาว 2
แสดงผล
**
**
ด้านยาว 4
****
* *
* *
****
ด้านยาว 6
******
* *
* *
* *
* *
******
วิเคราะห์โจทย์
โปรแกรมนี้เราต้องรับค่าความยาวของด้านของรูปสี่เหลี่ยมจุตุรัส และเราก็ต้องแสดงภาพเสาที่ใช้ล้อมรอบรูปสี่เหลี่ยม ซึ่งในที่นี้เราควรเขียนโปรแกรมให้มีการใช้ loop for ที่ซ้อนกัน โดยที่ loop แรกจะทำงานเท่ากับความยาวของ ด้าน และloop ที่ 2 ที่ซ้อนอยู่ใน loop แรก ก็จะทำงาน เท่ากับ ความยาวของด้านของ รูปสี่เหลี่ยมจัตุรัสเพื่อที่จะแสดงตัวอักษร *
โปรแกรมที่ 6-14-1
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int Len,i,j;
5: cout << "Please enter Length:";
6: cin >> Len;
7: for(i=1;i<=Len;i++)
8: {
9: for(j=1;j<=Len;j++) cout << "*";
10:
11: cout << endl;
12: }
13: return 0;
14:
15:}
Output
Please enter Length:6
******
******
******
******
******
******
อธิบาย Source code
บรรทัดที่ 6:เป็นการรับค่าตัวแปร Len
บรรทัดที่ 7:เป็นการวน loop for โดยใช้ตัวแปร i จำนวนรอบของตัวแปรนี้ จะทำงานเท่ากับตัวแปร Len
บรรทัดที่ 9:เป็นการวน loop for โดยใช้ตัวแปร j จำนวนรอบของตัวแปรนี้ จะทำงานเท่ากับตัวแปร Len โดยที่ loop j อยู่ใน loop i เพราะฉะนั้น เมื่อ loop i ทำงาน 1 ครั้ง loop j ก็จะทำงานตามจำนวนของตัวแปร Len ถ้าตัวแปร Len เท่ากับ 6 เมื่อ loop i ทำงาน 1 loop j ก็ต้องทำงาน 6 รอบ เพื่อที่จะดูเข้าใจง่ายให้คิดว่า
i = แถว , j = คอลัมน์
รอบแรก i = 1 j ก็เป็นรอบที่ 1
i = 1 j = 1
*
รอบต่อมา i ยังเป็นรอบที่ 1 j เป็นรอบที่ 2
i = 1 j = 2
**
จนถึง i ยังเป็นรอบที่ 1 j เป็นรอบที่ 6
i = 1 j = 6
******
i เปลี่ยน เป็น รอบที่2 j จะต้องเริ่มรอบที่ 1 ใหม่
i = 2 j = 1
******
*
i ยังเป็นรอบที่ 2 j ในรอบต่อมาจะเพิ่มเป็น 2 แล้ว
i = 2 j = 2
******
**
จนถึง i เท่ากับ 2 แต่ j ไปถึงรอบที่ 6
******
******
จนเมื่อไปถึงรอบที่ i เท่ากับ 6 และ j เท่ากับ 6
******
******
******
******
******
******
รวมแล้วloop j ทำงาน 36 รอบ
รู้สึกว่าโปรแกรมนี้ยังทำงานได้ไม่ตรงตามที่เราต้องการเท่าไหร่ เพราะที่เราต้องการคือแสดงแค่เสาที่ล้อมรอบเท่านั้นไม่จำเป็นต้องแสดงส่วนภายใน แต่โดยรวมๆแล้วโปรแกรมที่ 6-14-1 ก็ทำงานได้ดีพอสมควรเพียงแค่เรามาเปลี่ยนแปลงบางส่วนของโปรแกรมก็จะสามารถทำงานอย่างที่โจทย์ต้องการได้
เราสามารถเขียนโปรแกรมที่แสดงรูปสี่เหลี่ยมจัตุรัสได้แล้ว(คำว่าสี่เหลี่ยมจัตุรัสในที่นี้มีความหมายว่ามีความกว้างเท่ากับความยาวคือจำนวนเครื่องหมาย * เท่ากัน แต่ตอนแสดงผลอานจะดูไม่เหมือนสักเท่าไหร่ เพราะว่าความห่างระหว่างบรรทัดมีมาก) ที่เราต้องทำต่อคือเขียนโปรแกรมที่มีการทำงานคล้ายลักษณะเดิมแต่ไม่จำเป็นต้องพิมพ์เครื่องหมาย * ในระหว่างช่องสี่เหลี่ยม เช่น
****
* *
* *
****
ถ้าหารเราเขียนโปรแกรมให้พิมพ์เครื่องหมาย * ไปจนเต็มแล้ว และจะทำให้ตรงกลางว่างๆ จะยุ่งยากมาก เพราะฉะนั้น เราควรเขียนโปรแกรมให้ไม่ต้องมีการพิมพ์เครื่องหมาย * แต่ให้พิมพ์ช่องว่าง แทนถ้าหากเป็นบริเวณส่วนตรงกลางของเครื่องหมายสี่เหลี่ยม
เราไม่สามารถเขียน Code ว่า if(บริเวณส่วนตรงกลาง) cout << “ “; แบบนี้ได้แต่เราสามารถเช็คได้ว่าบริเวณไหนคือบริเวณตรงกลางของรูปสี่เหลี่ยม นั่นคือ สมมุติความยาวของรูปสี่เหลี่ยมคือ 5 บริเวณตรงกลางคือบริเวณที่ แถว ต้องไม่เป็น 1 กับ 5 และ คอลัมน์ ต้องไม่เป็น 1 กับ 5 เพราะบริเวณ 1 กับ 5 คือบริเวณรอบๆรูป
ในขณะที่ ถ้าความยาวของรูปสี่เหลี่ยมคือ 6 บริเวณตรงกลางคือบริเวณที่ แถว ต้องไม่เป็น 1 กับ 6 และ คอลัมน์ ต้องไม่เป็น 1 กับ 6 เพราะฉะนั้นเราควรเช็คเงื่อนไข คือ
สมมุติว่าความยาว 5
12345
1 *****
2 * *
3 * *
4 * *
5 *****
เราจะพิมพ์เครื่องหมาย * ต่อเมื่อ แถวต้องเป็น 1 หรือ ความยาว(5)
หรือ
คอลัมน์ต้องเป็น 1 หรือ ความยาว(5)
ถ้าไม่ตรงกับเงื่อนไขนี้ให้พิมพ์ “ “ แทน
แบบนี้แทนที่จะเช็คจากค่าคงที่ และเงื่อนไขของเรายังไม่ส่วนของ คอลัมน์อีกด้วย เราจึงต้องเขียน Source code เป็น
สำหรับการเช็คแถวเพียงอย่างเดียว
if (i == 1 || i ==Len)
สำหรับการเช็คคอลัมน์ด้วย
if ((i == 1 || i == Len)) || (j ==1 || j == Len)) cout << “ “;
else cout << “*”;
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int Len,i,j;
5: cout << "Please enter Length:";
6: cin >> Len;
7: for(i=1;i<=Len;i++)
8: {
9: for(j=1;j<=Len;j++)
10: if((i==1 || i==Len) || (j==1 || j==Len))cout << "*";
11: else cout << " ";
12:
13: cout << endl;
14: }
15: return 0;
16:
17:}
Output เหมือนอย่างที่โจทย์ต้องการ
อธิบาย Source code ในโปรแกรมนี้ไม่มีเพราะว่าได้อธิบายไปก่อนหน้านี้แล้ว
การใช้ continue กับ loop for
การใช้ continue เป็นการใช้ที่จะเริ่มวนloop ต่อไปโดยที่ไม่ต้องทำงาน Statement ที่เหลือต่อ ถ้าหาก
เช่น
รอบที่ทำงานคือรอบที่ 5 และโปรแกรมมาเจอ Statement continue ก็จะเริ่มทำงานรอบที่ 6 โดย Statement ที่เหลือในรอบที่ 5 จะไม่ทำงาน
โปรแกรมที่ 6-15 การใช้ continue กับ loop for
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5: for(i=1;i<=10;i++)
6: {
7: if(i==5)continue;
8:
9: cout << i << endl;
10: }
11:
12: return 0;
13:}
Output
1
2
3
4
6
7
8
9
10
อธิบาย Source code
บรรทัดที่ 5: เป็นการใช้ loop for โดยใช้ตัวแปร i ที่จะทำงาน 10 รอบ โดยที่บรรทัดที่ 9 จะเป็นการแสดงค่า i
แต่ทำไมค่าตัวแปร i ที่แสดงไม่แสดงเลข 5 พอแสดงเลข 4 และก็แสดงเลข 6 เลย นั่นเป็นเพราะว่าในบรรทัดที่ 7
if(i==5)continue; เป็น การใช้ if ที่จะทำการเช็คเงื่อนไขว่า ค่าตัวแปร i ได้ เท่ากับ 5 หรือเปล่าถ้าเท่ากับ 5 ก็ให้ continue โปรแกรมก็จะไปทำงานในบรรทัดที่ 5 ใหม่แต่คราวนี้ตัวแปร i เป็น 6 แล้ว เท่ากับว่า Statement ที่ใช้ในการแสดงค่า i ในการวน loop รอบที่ 5 ก็จะไม่มีการได้ทำ จะไปทำรอบที่ 6 เลย
การใช้ continue เป็น Statement สุดท้ายที่อยู่ใน loop
ปกติแล้วการใช้ continue จะวางไว้ก่อน Statement ใดๆใน loop เพื่อใช้เช็คเงื่อนไขว่าถ้าเงื่อนไขเป็นจริงก็ให้ไม่ต้องทำงาน Statement ที่เหลือใน loop นั้นให้ไปทำรอบใหม่ได้เลย แต่ถ้าเราวาง Statement continue ไว้ เป็นลำดับสุดท้าย Statement ที่อยู่ใน loop โปรแกรมอาจจะทำงานเหมือนไม่ได้มีการใช้ Statement continue ก็ได้
โปรแกรมที่ 6-16 ตัวอย่างการใช้ continue เป็น Statement สุดท้าย ใน loop
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i;
5: for(i=1;i<=10;i++)
6: {
7:
8: cout << i << endl;
9:
10: if(i==5)continue;
11: }
12:
13: return 0;
14:}
Output จะเป็น เลข 1 ถึง 10 โดยไม่มีการเว้นเลขไหนเลย
อธิบาย Source code
บรรทัดที่ 10:เป็นการเช็คเงื่อนไขว่า ถ้า i == 5 จริงให้ continue คือให้กลับไปทำงานบรรทัดที่ 5 และให้เริ่มต้น loop ใหม่ ใน รอบที่ 6 โดยที่ไม่ต้องทำงาน Statement ที่เหลือ อยู่ใน loop ที่ 5 แต่ทำไม Output ออกมาถึงมีเลข 5 ด้วย ไม่เหมือนโปรแกรมที่ 6-15 นั่นเป็นเพราะว่า การใช้ continue ในบรรทัดที่ 10 เป็นส่วนสุดท้ายของ Statement ใน loop ก่อนที่จะมาเจอ Statement continue โปรแกรมก็ได้ทำ Statement ในบรรทัดที่ 8 คือ พิมพ์ค่าตัวแปร i ไปแล้ว เพราะฉะนั้น การทำงานของ โปรแกรมจึงดูเหมือนไม่ได้มีการใช้ continue เลย
Loop while
เป็น Loop ที่มีการเช็คเงื่อนไขว่าถ้าเป็นจริงถึงจะทำงาน Source code ที่อยู่ใน loop ถ้าเป็นเท็จก็จะไม่ทำ loop while มีรูปแบบการใช้ดังนี้
While (condition) statement
Condition เงื่อนไขที่ว่าเป็นจริงถึงจะทำจะตรวจสอบทุกครัง้ที่แต่ละรอบของการทำงาน
Statement จะทำตราบเท่าที่ condition เป็น จริง
โปรแกรมที่ 6-17 ตัวอย่างการใช้ while loop
Source code
1:#include "iostream.h"
2:int main()
3:{
4: int i;
5: while(i!=1) cin >> i;
6:
7: return 0;
8:}
Output
5
6
7
8
1
บรรทัดที่ 5: ของโปรแกรมนี้จะทำการรับค่าจาก Keyboard ไปเรื่อย จนกว่า ค่า i จะเท่ากับ 1 จึงหยุดโปรแกรม ถ้า i ไม่เท่ากับ 1 ก็จะทำไปเรื่อยๆ
Loop While ที่มีหลาย Statement
รูปแบบ
While (condition) statement
{
statement 1
statement 2
}
ตัวอย่างการใช้ loop while ที่มีหลาย Statement ถ้าเราจะนำโปรแกรมที่ 6-11 ซึ่งเป็นโปรแกรม สูตรคูณ มาปรับปรุงใหม่ โดยให้มีการป้อนข้อมูลว่าต้องการแสดงสูตรคูณแม่อะไรเสร็จแล้วให้แสดงผล หลังจากที่แสดงผลแล้วก็ให้ผู้ใช้ ป้อนข้อมูลต่อไปอีกว่าต้องการแม่อะไร ไปเรื่อยๆ ถ้าหากผู้ใช้ต้องการจบการทำงานของ โปรแกรมก็ให้ป้อน เลข 0 โปรแกรมก็จะจบการทำงาน
โปรแกรมที่ 6-18-1
Source code
1:int main()
2:{
3: int i,Mae;
4: while(Mae != 0)
5: {
6: cout << "Please Enter your number :";
7: cin >> Mae;
8: for(i=1;i<=12;i++)
9: {
10: cout << Mae << " * " << i << " = " << Mae*i;
11: cout << endl;
12:
13: }
14: }
15:
16: return 0;
17:}
Output โปรแกรมนี้ ก็จะเป็นการให้ผู้ใช้ป้อนข้อมูลว่าต้องการสูตรคูณแม่อะไรหลังจากนั้นก็รับค่า อีกต่อไปเรื่อยๆจนกว่าผู้ใช้จะป้อนเลข 0 แต่พอผู้ใช้ ป้อนเลข 0 โปรแกรมจะยังไม่จบการทำงาน แต่จะแสดงสูตรคูณแม่ 0 แล้วค่อยจบโปรแกรม
0 * 1= 0
0 * 2= 0
0 * 3= 0
0 * 4= 0
0 * 5= 0
0 * 6= 0
0 * 7= 0
0 * 8= 0
0 * 9= 0
0 * 10= 0
0 * 11= 0
0 * 12= 0
สาเหตุที่โปรแกรมจะยังไม่หยุดโปรแกรมจะอธิบาย ในส่วน อธิบาย Source code
อธิบาย Source code
บรรทัดที่ 4: while(Mae != 0) มีความหมายว่าจะทำงานวน loop ไปเรื่อยๆตราบเท่าที่ ตัวแปร Mae != 0 ซึ่ง Source code ในส่วนที่จะทำการ วน loop คือ Source code ที่อยู่ระหว่างบรรทัดที่ 5 และ 14
บรรทัดที่ 6 และ บรรทัดที่ 7:เป็นการให้ผู้ใช้ป้อนข้อมูลแม่ที่ต้องการ
บรรทัดที่ 8 ถึงบรรทัดที่ 13:เป็นการแสดงผลสูตรคูณของแม่ ที่ผู้ใช้ป้อนเข้ามา
สาเหตุที่ทำไมผู้ใช้ป้อนข้อมูล เลข 0 แล้วโปรแกรมยังไม่หยุดทำงานเนื่องจาก Source code ในส่วนของการรับข้อมูลตัวแปร Mae จะอยู่ในบรรทัดที่ 7 ซึ่งในบรรทัดที่ 7 ตัวแปร Mae จะเท่ากับ 0 แล้ว แต่ยังมี Source code ที่เหลือที่โปรแกรมต้องทำงานสำหรับ loop นี้คือ บรรทัดที่ 8 ถึง 13 โปรแกรมก็เลยแสดงผลสูตรคูณแม่ 0 แล้วพอเริ่มรอบใหม่ loop while ก็จะไม่ทำงานแล้วเพราะว่า ค่าตัวแปร Mae != 0
จะเห็นได้ว่าถ้าเรากำหนดให้ตัวแปร Mae != 0 ซึ่งจะทำให้เงื่อนไขใน condition เป็นเท็จ โปรแกรมก็จะยังทำงาน Statement ที่เหลืออยู่ใน loop จากนั้นในรอบต่อไปถึงค่อยออกจาก loop
ในเมื่อเรารู้แล้วว่า ถึงแม้ว่าเราจะป้อนค่าของตัวแปร Mae ให้เท่ากับ 0 โปรแกรมก็ยังจะทำงาน Statement ที่เหลืออยู่ เพราะฉะนั้น เราอาจจะใช้ เขียน โปรแกรมให้รับค่าตัวแปร Mae ให้เป็น Statement สุดท้ายของ loop ถ้าเราเขียนอย่างนี้แล้วเวลาเราป้อนข้อมูลตัวแปร Mae เท่ากับ 0 โปรแกรมก็ไม่เหลือ Statement อื่นให้ทำงานอีกแล้ว และก็จะเริ่ม วน loop รอบใหม่เลยแต่พอจะทำงานรอบใหม่เงื่อนไข ใน condition ก็เป็น เท็จ โปรแกรมก็จะออกจาก loop
ถ้าเราเขียนโปรแกรมให้รับค่าตัวแปร Mae เป็น Statement สุดท้ายของ loop while โปรแกรมก็จะทำการแสดงผลสูตรคูณก่อน ก่อนที่จะรับค่า เพราะฉะนั้นเราควรเขียน Statement ที่อยู่นอก loop ที่แยกออกมาต่างหากในการรับค่าตัวแปร Mae ครั้งแรก หลังจากนั้น โปรแกรมก็จะทำงาน Statement ทีอยู่ใน loop แสดงสูตรคูณ จากนั้นก็จะใช้ Statement รับค่าตัวแปร Mae ใน loop while
โปรแกรมที่ 6-18-2 ตัวอย่างการใช้ loop while
Source code
1:#include "iostream.h"
2:int main()
3:{
4: int i,Mae;
5: cout << "Please Enter your number :";
6: cin >> Mae;
7:
8: while(Mae != 0)
9: {
10:
11: for(i=1;i<=12;i++)
12: {
13: cout << Mae << " * " << i << " = " << Mae*i;
14: cout << endl;
15:
16: }
17: cout << "Please Enter your number :";
18: cin >> Mae;
19: }
20:
21: return 0;
22:}
Output จะได้อย่างที่ต้องการแล้วล่ะ
อธิบาย Source code
บรรทัดที่ 5 กับ บรรทัดที่ 6:เป็นการให้ผู้ใช้ป้อนข้อมูลตัวแปร Mae ในครั้งแรกซึ่ง Source code ในส่วนนี้ไม่อยู่ใน loop
บรรทัดที่ 8: while(Mae != 0) มีความหมายว่าจะทำตราบเท่าที่ตัวแปร Mae != 0 ซึ่ง Source code ส่วนที่จะทำอยู่ระหว่างบรรทัดที่ 9 ถึง บรรทัดที่19
บรรทัดที่ 11 ถึง บรรทัดที่ 16 :เป็นการแสดงผลสูตรคูณที่อยู่ใน loop while จะเห็นได้ว่าใน loop while เราแสดงผล สูตรคูณก่อนที่จะทำการรับค่าตัวแปร Mae ในบรรทัดที่ 17 และ 18 นี่คือสาเหตุที่ต้องมีบรรทัดที่ 5 และ 6 ในการรับค่าตัวแปร Mae ในรอบแรก
บรรทัดที่ 17 และบรรทัดที่ 18: เป็นการรับค่าตัวแปร Mae ถ้าหากผู้ใช้ป้อนเลข 0 โปรแกรมก็จะทำงาน Statement ที่เหลืออยู่ใน loop นี้ ซึ่งในที่นี้ ไม่มี Statement อะไรแล้ว เพราะว่า Statement รับค่าตัวแปร Mae เป็น Statement สุดท้ายของ while loop เราก็จะไม่ต้องเห็นโปรแกรมทำการแสดงผล สูตรคูณแม่ 0 แล้วล่ะ แล้วพอโปรแกรมจะทำงาน Statement ใหม่ ก็จะทำการเช็คเงื่อนไขใน condition เนื่องจาก เงื่อนไขเป็นเท็จก็จะออกจาก loop และออกจาก โปรแกรม
loop do
loop do เป็น การวน loop ที่จะทำงาน Statement ใน loop ก่อน 1 รอบถึงจะตรวจสอบเงื่อนไขใน condition ถ้าเป็นจริงก็จะทำรอบต่อๆไป ถ้าเป็น เท็จก็จะไม่ทำ
loop do มีรูปแบบดังนี้
do
Statement;
while(condition);
โปรแกรมที่ 6-19 ตัวอย่างการใช้ do loop
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i =0;
5:
6: do
7: i++;
8: while(i<10);
9:
10: cout << i;
11: return 0;
12:}
Output
10
อธิบาย Source code
โปรแกรมนี้เป็นตัวอย่างการใช้ loop do ในการทำซ้ำในการเพิ่มค่าให้กับตัวแปร i
บรรทัดที่ 4:ประกาศตัวแปร i และยังกำหนดค่าให้เท่ากับ 0
บรรทัดที่ 6:มีความหมายว่า เป็นการใช้ loop do
บรรทัดที่ 8:มีความหมายว่า loop do จะทำงานตราบเท่าที่ค่าตัวแปร i < 10 โดยที่ Statement ของ loop do ในที่นี้คือ Statement ในบรรทัดที่ 7 คือการเพิ่มค่าให้กับตัวแปร i ครั้งละ 1 พอรอบที่ 10 ตัวแปร i มีค่าไม่น้อยกว่า 10 แล้วก็จะไม่ทำอีก
โปรแกรมที่ 6-20 ตัวอย่างการใช้ loop do
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i =0;
5:
6: do
7: i++;
8: while(i >10);
9:
10: cout << i;
11: return 0;
12:}
Output
1
อธิบาย Source code
โปรแกรมนี้คล้ายโปรแกรมที่ 6-19 มากแต่จะต่างกันก็ตรงที่เงื่อนไขของ loop do ในบรรทัดที่ 8 จะเปลี่ยนเป็น i > 10 ซึ่งในบรรทัดที่ 4 เราประกาศและกำหนดค่าตัวแปร i ให้เท่ากับ 0 เงื่อนไขใน condition ก็จะเป็นเท็จ แต่ loop do ก็จะทำงาน Statement ใน loop ก่อน 1 รอบ ถึงแม้เงื่อนไขจะเป็นเท็จ Statement ที่ทำงาน ก็คือการเพิ่มค่าให้กับตัวแปร i อีก 1 ซึ่งทำให้เราได้ Output เท่ากับ 1
loop do ที่มีหลาย Statement
เราสามารถเขียน โปรแกรมโดยใช้ loop do ที่มีหลาย Statement ได้โดยมีรูปแบบดังนี้
do
{
Statement;
Statement;
}
while(condition);
โปรแกรมที่ 6-21 ตัวอย่างการใช้ loop do เขียนโปรแกรมสูตรคูณ
Source code
1:#include "iostream.h"
2:int main()
3:{
4: int i=1,Mae;
5:
6: cout << "Please Enter your number :";
7: cin >> Mae;
8: do
9: {
10: cout << Mae << " * " << i << " = " << Mae*i;
11: cout << endl;
12: i++;
13: }
14: while(i<13);
15:
16:
17: return 0;
18:}
Output ได้เหมือนโปรแกรมที่ 6-11
อธิบาย Source code
บรรทัดที่ 8:มีความหมายว่าเป็นการใช้ loop do
บรรทัดที่ 14:มีความหมยว่า Statement ใน loop do จะทำงาน ตราบเท่าที่เงื่อนไข i < 13 เป็นจริง
บรรทัดที่ 12:นี่คือ Statement ใน loop do โดย Statement นี้จะทำการเพิ่มค่าตัวแปร i ให้เพิ่มอีก 1 ในแต่ละรอบ
โปรแกรมที่ 6-22 โปรแกรมนี้จะมีการทำงานโดยรับข้อมูลตัวเลขจากผู้ใช้และจะแสดงรูปสามเหลี่ยมโดยใช้เครื่องหมาย *
ถ้าตัวเลขคือ 2 แสดงผล
*
**
ถ้าตัวเลขคือ 3 แสดงผล
*
**
***
ถ้าตัวเลขคือ 5 แสดงผล
*
**
***
****
*****
วิเคราะห์โจทย์แบบง่ายๆก่อน
โปรแกรมต้องการแสดงผลในลักษณะนี้เราอาจใช้ loop do ที่ซ้อนกันโดยให้ loop แรกแสดง แถว และ loop ที่ซ้อนอยู่แสดงเครื่องหมาย * ในแต่ละคอลัมน์
ในแต่ละแถวจำนวนคอลัมน์ที่ต้องแสดงจะมีจำนวนเท่ากับลำดับของแถว เช่นถ้าผู้ใช้ป้อนข้อมูลเลข 5
12345
1*
2**
3***
4****
5*****
จะเห็นได้ว่าถ้าเป็นแถวที่ 1 ก็แสดงเครื่องหมาย * 1ครั้ง ถ้าเป็นแถวที่ 5 ก็แสดงเครื่องหมาย * 5 ครั้ง เพราะฉะนั้นเราควรเขียนโปรแกรมให้ loop ที่ซ้อนอยู่ที่มีหน้าที่แสดงเครื่องหมาย * ให้วน loop เท่ากับ การทำงานใน loop แรก
Source code
1:#include"iostream.h"
2:int main()
3:{
4: int i=0,col,j=0;
5: cout << "Please enter number:";
6: cin >> col;
7: do
8: {
9:
10: i++;
11: j =0;
12: do
13: {
14: cout << "*";
15: j++;
16: }while(j < i);
17:
18: cout << endl;
19:
20: }
21: while(i < col);
22: return 0;
23:}
Output
Please enter number:3
*
**
***
อธิบาย Source code
บรรทัดที่ 7 ถึง บรรทัดที่ 21:เป็นการใช้ loop do ที่จะทำงานไปเรื่อยๆ ถ้าตัวแปร i ยังน้อยกว่าตัวแปร col อยู่โดยที่บรรทัดที่ 10 เราได้ทำการเพิ่มค่าให้กับตัวแปร i อีก 1 ในแต่ละรอบ ถ้าหากตัวแปร i ไม่น้อยกว่าตัวแปร col โปรแกรมก็ยังจะทำงาน Source code ใน loop อยู่ 1 รอบ เพราะเราใช้ loop do
บรรทัดที่ 12 ถึง บรรทัดที่ 16:เป็นการใช้ loop do ที่จำทำงานไปเรื่อยๆ ตราบเท่าที่ตัวแปร j น้อยกว่าตัวแปร i โดยที่ในแต่ละรอบเราจะทำการเพิ่มค่าให้กับตัวแปร j อีก 1 ด้วย และ loop นี้มีหน้าที่การทำงานคือแสดงเครื่องหมาย * ถ้าหากตัวแปร j ไม่น้อยกว่าตัวแปร i โปรแกรมก็ยังจะทำงาน Source code ใน loop อยู่ 1 รอบ เพราะเราใช้ loop do
ในที่นี้เพื่อความเข้าใจง่ายเราจะเรียก loop do อันแรกว่า loop i
และ เราจะเรียก loop do ที่ซ้อนอยู่ใน loop i ว่า loop j
ถ้าตัวแปร col = 3
loop i ก็จะทำงาน 3 รอบคือ 3 บรรทัด
และใน loop i แต่ละรอบก็จะมี loop j ที่ทำงาน เท่ากับ ตัวแปร i
ในรอบแรกตัวแปร i เป็น 1
loop j ก็จะทำงาน 1 รอบคือแสดงผล
*
ในรอบที่ 2 ตัวแปร i เป็น 2
loop j ก็จะทำงาน 2 รอบคือแสดงผล
**
ในรอบที่ 3 ตัวแปร i เป็น 3
loop j ก็จะทำงาน 3 รอบคือแสดงผล
***
เมื่อรวมกันแล้วก็จะได้ Output อย่างที่เราต้องการ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น