21-1การทำงานแบบวนรอบภายในโปรแกรม

 ในบางครั้งเราจำเป็นต้องการให้โปรแกรมทำงานเดิมซ้ำหลาย ๆ ครั้ง ตัวอย่าง เช่น การเขียนโปรแกรมหาค่า factorial ของตัวเลขที่รับเข้ามา เช่น  5! = 5x4x.x2x1 จากตัวอย่างนี้จะเห็นได้ว่าความรู้ที่ผ่านมาไม่เพียงพอต่อการคำนวณหาค่าในลักษณะนี้ ดังนั้นในที่นี้เราจะพูดถึงการเขียนโปรแกรมเพื่อวนรอบการทำงานซ้ำ ซึ่งมีกลุ่มคำสั่งที่เกี่ยวข้องด้วยกันหลายคำสั่ง โดยมีหลักการร่วมกันดังต่อไปนี้
  • ต้องกำหนดค่าเริ่มต้นในการวนรอบ
  • อาจจะมีการเพิ่มหรือลดค่าของตัววนรอบในบางกรณี
  • ต้องมีเงื่อนไขที่ทำให้หลุดจากการวนรอบ ไม่เช่นนั้นการทำงานของโปรแกรมจะกลายเป็นลูปอนันต์ (Infinity loop) ไป


การทำซ้ำด้วยคำสั่ง while

      คำสั่ง while เป็นคำสั่งที่เกี่ยวข้องกับการวนรอบ ในการใช้งานคำสั่งนี้จะเริ่มจากการกำหนดค่าให้กับตัวแปรเพื่อใช้ในการเริ่มต้นการวนรอบ ภายในวงเล็บของคำสั่ง while จะเป็นเงื่อนไขในการทำซ้ำ หากเงื่อนไขภายในวงเล็บของ while เป็นจริง โปรแกรมจะเข้าไปทำงานภายในขอบเขตของสัญลักษณ์ปีกกาเปิดและปิด “{ }” ของคำสั่ง while และจะออกจากลูปการทำงานของ while เมื่อเงื่อนไขเป็นเท็จโดยทั่วไปจะโครงสร้างของคำสั่งดังต่อไปนี้
โครงสร้างของคำสั่ง while
รูปที่ 1. โครงสร้างของคำสั่ง while
      ตัวอย่างด้านล่างเป็นการเขียนโปรแกรมหาค่า factorial ของ 5! ดังนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
 void main()
{
  int loop = 5;
  int factorial = 1;
  while (loop > 1)
  {
     factorial = factorial*loop;
     loop = loop-1;          
  }
  cout << "5! = " << factorial << endl;
}
      ในตัวอย่างนี้ได้กำหนดให้ตัวแปร loop เป็นตัวแปรที่ใช้ในการตรวจสอบเงื่อนไขการวนรอบ โดยกำหนดให้มีค่าเริ่มต้นในการวนรอบเป็น 5 โดยมีเงื่อนไขในการเข้าไปทำงานภายใต้เงื่อนไขของ while คือ ค่าของตัวแปร loop ต้องมากกว่า 1 หากเป็นจริง จะเข้าไปยังส่วนการทำซ้ำของคำสั่ง while ได้แก่ factorial = factorial*loop; เป็นการนำค่าของ factorial คูณกับค่าของตัววนรอบ หลังจากนั้นจึงทำการลดค่าของตัวแปร loop ลงครั้งละ 1 ค่าและจะออกจากลูปนี้ไปเมื่อค่าของตัวแปร loop เป็น 0 เพื่อให้เห็นภาพชัดเจนขึ้นจะขอแสดงตารางผลลัพธ์ของตัวแปรในแต่ละรอบการทำงานดังนี้
ตารางที่ 1. ค่าของตัวแปรต่าง ๆ ในแต่ละรอบการทำงาน
ครั้งที่วนรอบค่าของตัวแปร loopค่าของตัวแปร factorialfactorial x loop
1      5      5      1x5
2      4      20      5x4
336020x3
4212060x2
      โดยทั่วไปแล้วการใช้คำสั่ง while ในการวนรอบนั้นมักเลือกใช้กับการวนรอบที่โปรแกรมเมอร์ไม่สามารถทราบจำนวนครั้งที่วนรอบว่ามีเท่าไหร่ ดังตัวอย่างด้านล่างเป็นการวนรอบการทำงานโปรแกรมจนกว่าผู้ใช้จะทำการกดปุ่ม ‘n’ บนคีย์บอร์ด
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
 void main()
{
  char choice = 'y';
  while (choice != 'n')
  {
     cout  << "Do you want to continue? (Y/N)" << endl;
     cin >> choice;
     cout << "Your choice is " << choice << endl;
  }
}

ผลลัพธ์ที่ได้จากการใช้คำสั่ง while ในการวนรอบ
รูปที่ 2. ผลลัพธ์ที่ได้จากการใช้คำสั่ง while ในการวนรอบ

      จากตัวอย่างจะเห็นได้ว่าหากผู้ใช้กดปุ่มใด ๆ บนคีย์บอร์ดที่ไม่ใช่ ‘n’ แล้วโปรแกรมยังคงวนรอบทำงานภายในลูป while ซ้ำเรื่อย ๆ ไม่รู้จบ โดยทำการกำหนดค่าเริ่มต้นให้กับตัวแปร choice เป็น ‘y’ ซึ่งในความจริงแล้วสามารถกำหนดเป็นค่าใดก็ได้ที่ไม่ใช่ ‘n’ เนื่องจากหากกำหนดให้เป็น ‘n’ ตั้งแต่เริ่มต้นเงื่อนไขของ while จะเป็นเท็จตั้งแต่เริ่มทำให้โปรแกรมไม่เข้าไปทำงานภายในการวนรอบของ while จากตัวอย่างนี้แสดงให้เห็นว่าในการวนรอบนั้นบางครั้งการเพิ่มหรือลดค่าตัววนรอบก็ไม่มีความจำเป็นต้องใช้งานแต่อย่างใด

การทำซ้ำด้วยคำสั่ง do-while

จากตัวอย่างที่ผ่านมาจะเห็นได้ว่าหากกำหนดค่าของตัวแปร choice ในตอนเริ่มต้นให้มีค่าเป็น ‘n’ โปรแกรมจะไม่เข้าไปทำงานยังส่วนของ while loop ซึ่งในบางครั้งมีความเป็นต้องให้การทำงานในส่วนของ while ทำงานไปก่อนแล้วค่อยตรวจสอบทีหลัง ดังนั้นจึงมีการสร้างคำสั่ง do-while เพื่อแก้ปัญหานี้ โดยมีจุดประสงค์หลักเพื่อให้โปรแกรมทำงานในส่วนของการทำซ้ำไปก่อนหนึ่งครั้งแล้วค่อยตรวจสอบเงื่อนไขว่าเป็นจริงหรือเท็จ หากภายในเงื่อนไขของ while เป็นจริงการทำซ้ำจะเกิดขึ้นอีกครั้ง หากไม่ใช่โปรแกรมก็จะหลุดออกจากการทำงานในส่วนของ do-while ไปยังส่วนที่เหลือของโปรแกรมโดยมีลักษณะโครงสร้างของคำสั่ง do-while ดังนี้
โครงสร้างของคำสั่ง do-while
รูปที่ 3. โครงสร้างของคำสั่ง do-while
      สิ่งที่ต้องระวังในการใช้งาน do-while ได้แก่ส่วนของวงเล็บสำหรับเงื่อนไขของ while ต้องตามด้วยสัญลักษณ์ “;” เสมอ เพื่อให้คอมไพเลอร์รับรู้ว่านี้คือส่วนสิ้นสุดของคำสั่ง do-while
      จากตัวอย่างที่ผ่านมาเราสามารถเปลี่ยนไปใช้คำสั่ง do-while โดยกำหนดค่าเริ่มต้นของตัวแปร choice ดังนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
void main()
{
  char choice = 'n';
  do
  {
     cout  << "Do you want to continue? (Y/N)" << endl;
     cin >> choice;
     cout << "Your choice is " << choice << endl;
  }while (choice != 'n');
}

การทำซ้ำด้วยคำสั่ง for

      คำสั่ง for ใช้ในการวนรอบเช่นเดียวกับคำสั่ง while เพียงแต่มีการแบ่งสัดส่วนของคำสั่งให้ชัดเจนขึ้นและเหมาะกับการทำงานที่รู้ถึงจำนวนรอบในการทำงานที่แน่นอน โดยมีลักษณะโครงสร้างของคำสั่งดังนี้
โครงสร้างของคำสั่ง for
รูปที่ 4. โครงสร้างของคำสั่ง for
      ตัวอย่างด้านล่างเป็นการเขียนโปรแกรมหาผลรวมของตัวเลขตั้งแต่ 1 – 10 ซึ่งมีการเขียนคำสั่งดังต่อไปนี้
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;
void main()
{
  int i, sum = 0;
  for (i = 1; i < 10; i++)
  {
     sum += i;
  }
  cout << "Sum value = " << sum << endl;
}
      ในตัวอย่างด้านบนส่วนของการเพิ่มค่า i++ มีความหมายเช่นเดียวกับ i = i+1 เพียงแต่เขียนลดรูปเพื่อความสะดวกและรวดเร็วในการเขียนโค้ดเท่านั้น สำหรับตัวแปร sum ใช้สำหรับหาผลรวมของตัวเลขทั้งหมด ซึ่งคำสั่ง sum += I มีความหมายเช่นเดียวกับ sum = sum + I นั่นเอง

คำสั่ง break, continue และ exit

      จากคำสั่งวนรอบทั้งหมดที่กล่าวมายังมีคำสั่งย่อย ที่เกี่ยวข้องกับการวนรอบเหล่านั้นได้แก่คำสั่ง break, continue และ exit

break

      เป็นคำสั่งที่ใช้ในการออกจากลูปทันที ซึ่งมีประโยชน์อย่างมากในการหยุดการทำงานแบบวนรอบเมื่อพบเงื่อนไขที่ต้องการ ซึ่งมักพบในการเขียนโปรแกรมที่มีการวนรอบแบบนิรันด์ (Infinty loop) ดังตัวอย่างต่อไปนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
void main()
{
  while(true)
  {
     int number;
     cout << "Guess number :" ;
     cin >> number;
     if(number == 10)
       break;
     else
       cout << "Wrong number T_T" << endl;
  }
  cout << "You win :)" << endl;
  cin.get();
}
      โค้ดด้านบนเป็นโปรแกรมที่ให้ผู้ใช้ทำการใส่ข้อมูลตัวเลขที่ต้องการทาย หากทายได้ถูกต้องจะทำการออกจากโปรแกรม หากสังเกตในส่วนเงื่อนไขของ while จะเห็นได้ว่าส่วนของเงื่อนไขเป็นจริงตลอดเวลา เนื่องจากกำหนดค่าให้เป็น true ดังนั้นโดยปรกติแล้วการวนรอบนี้จะไม่มีการออกจากลูปได้เราจึงเรียกการวนรอบลักษณะนี้ว่า Infinity loop หรือ ลูปอนันต์นั่นเอง
      สำหรับตัวอย่างด้านบนสามารถแปลงให้อยู่ในรูปของ for ได้เช่นกันดังนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
void main()
{
  for(;;)
  {
     int number;
     cout << "Guess number :" ;
     cin >> number;
     if(number == 10)
       break;
     else
       cout << "Wrong number T_T" << endl;
  }
  cout << "You win :)" << endl;
  cin.get();
}
      จากโค้ดจะเห็นได้ว่าการสร้าง Infinity loop ด้วยคำสั่ง for จะไม่มีการกำหนดค่าเริ่มต้น การตรวจสอบเงื่อนไข และการปรับลดค่าของตัววนรอบแต่อย่างใด เพียงแต่ใส่สัญลักษณ์ “;” คั่นไว้สำหรับแต่ละช่วงเท่านั้น

continue

      เป็นคำสั่งที่ใช้ในการข้ามขั้นตอนการทำงานภายใต้การวนรอบของโปรแกรมที่อยู่ถัดจากคำสั่ง continue ไปยังรอบถัดไปทันทีดังตัวอย่างด้านล่าง
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
void main()
{
  int i, sum = 0;
  for (i = 1; i < 10; i++)
  {
     if(i%2 == 0)
       continue;
     sum += i;
  }
  cout << "Sum value = " << sum << endl;
}
      จากตัวอย่างด้านบนเป็นการหาผลบวกของเลขคี่ตั้งแต่ 1 – 10 สาเหตุที่สามารถทำเช่นนี้ได้เนื่องจาก ภายใต้การตรวจสอบเงื่อนไข if(i%2 == 0) ซึ่งหมายถึงตัววนรอบ i หารด้วย 2 ลงตัว (มีเศษของการหารเป็น 0) หากเงื่อนไขนี้เป็นจริงซึ่งจะเกิดขึ้นที่ i = 2, 4, 6, 8 ตามลำดับ คำสั่ง continue จะถูกเรียกใช้งานทำให้ข้ามไปยังรอบต่อไปโดยทันทีทำให้คำสั่ง sum += i ไม่ถูกเรียกใช้งานนั่นเอง

exit()

      ความจริงแล้วคำสั่งนี้ไม่เกี่ยวข้องกับการวนรอบมากนัก สามารถเรียกใช้งานที่ใดก็ได้ในโปรแกรม เมื่อใดก็ตามที่คำสั่ง exit ทำงานจะหมายถึงการออกจากโปรแกรมที่กำลังทำงานอยู่โดยทันที ฟังก์ชัน exit() จะประกอบไปด้วยพารามิเตอร์จำนวนหนึ่งตัว ใช้สำหรับระบุถึงรหัสในการจบโปรแกรม โดยปรกติจะกำหนดให้มีค่าเป็น 0 เพื่อเป็นการแจ้งให้ระบบปฏิบัติการรับรู้วาโปรแกรมนี้ได้ปิดตัวเองโดยไม่มีปัญหาใด ๆ เกิดขึ้น
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
void main()
{
  for(;;)
  {
     int number;
     cout << "Guess number :" ;
     cin >> number;
     if(number == 10)
       exit(0);
     else
       cout << "Wrong number T_T" << endl;
  }
  cout << "You win :)" << endl;
  cin.get();
}
      จากตัวอย่างนี้หากผู้ใช้ป้อนเลข 10 จะเป็นการปิดโปรแกรมโดยทันทีและไม่แสดงข้อความ You win :) เนื่องจากโปรกแกรมได้ปิดการทำงานไปตั้งแต่พบคำสั่ง exit() แล้ว

ตัวอย่าง


while loop statement repeatedly executes a target statement as long as a given condition is true.

Syntax

The syntax of a while loop in C++ is −
while(condition) {
   statement(s);
}
Here, statement(s) may be a single statement or a block of statements. The condition may be any expression, and true is any non-zero value. The loop iterates while the condition is true.
When the condition becomes false, program control passes to the line immediately following the loop.

Flow Diagram

C++ while loop
Here, key point of the while loop is that the loop might not ever run. When the condition is tested and the result is false, the loop body will be skipped and the first statement after the while loop will be executed.

Example

#include <iostream>
using namespace std;
 
int main () {
   // Local variable declaration:
   int a = 10;

   // while loop execution
   while( a < 20 ) {
      cout << "value of a: " << a << endl;
      a++;
   }
 
   return 0;
}
When the above code is compiled and executed, it produces the following result −
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19