ใบความรู้

ใบความรู้ที่ 4.5

คำสั่งควบคุม

 

          คำสั่งควบคุมเป็นคำสั่งที่สำคัญในการเขียนโปรแกรม คือ ช่วยควบคุมทิศทางการทำงานของโปรแกรมให้เป็นไปตามที่ต้องการ โดยแบ่งออกเป็น 2 ประเภท คือ คำสั่งเงื่อนไข (Condition Statement) ได้แก่ if, if-else, switch-case และคำสั่งทำซ้ำ (Iteration Statement) ได้แก่ for, while, do-while

คำสั่งเงื่อนไข(Condition Statement)

          เป็นคำสั่งที่ใช้เลือกทำโดยพิจารณาจากเงื่อนไขที่กำหนด

คำสั่งเงื่อนไข if

รูปแบบ

 

if (เงื่อนไข) {

        คำสั่งที่ 1;

}

คำสั่งที่ 2;

          หากเงื่อนไขที่กำหนดเป็นจริงแล้ว คำสั่งต่างๆ ที่อยู่ภายในบล็อกของเงื่อนไข if ก็จะได้รับการประมวลผล (ซึ่งอาจมีมากกว่า 1 คำสั่ง) แต่ถ้าตรวจสอบแล้วพบว่าเงื่อนไขเป็นเท็จ คำสั่งที่อยู่ภายในบล็อกของเงื่อนไข if ก็จะไม่ได้รับการประมวลผล คือ จะข้ามไปทำการประมวลผลคำสั่งที่อยู่ถัดจากบล็อกของ if ทันที

 

รูปที่ 9.1 โฟลวชาร์ตแสดงการทำงานของคำสั่งเงื่อนไข if

 

ตัวอย่างที่ 9.1 โปรแกรมแสดงการทำงานของคำสั่งเงื่อนไข if

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

 

#include <stdio.h>

 

main(){

     int  age;

 

     printf(“How old are you? :”);

     scanf(“%d”, &age);

     if(age<18)

          printf(“You are young\n”);

      printf(“You are %d year old”);

}

ผลลัพธ์ของโปรแกรม

รันครั้งที่ 1

 

How old are you? : 15

You are young

You are 15 year old

รันครั้งที่ 2

 

How old are you? : 18

You are 18 year old

ตัวอย่างที่ 9.2 โปรแกรมแสดงการทำงานของคำสั่งเงื่อนไข if

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

 

#include <stdio.h>

 

main(){

     int  age;

 

     printf(“How old are you? :”);

     scanf(“%d”, &age);

     if(age<18){

          printf(“You are less than 18 year old\n”);

          printf(“You are young\n”);

     }

     printf(“You are %d years old”, age);

}

ผลลัพธ์ของโปรแกรม

รันครั้งที่ 1

 

How old are you? : 15

You are less than 18 years old

You are young

You are 15 year old

รันครั้งที่ 2

 

How old are you? : 18

You are 18 year old

อธิบายโปรแกรม

          ตัวอย่างที่ 9.1 ทำการตรวจสอบเงื่อนไขว่า หากอายุน้อยกว่า 18 ปี ให้พิมพ์ข้อความ “You are young” ซึ่งสังเกตโปรแกรมนี้ให้ดี บรรทัดที่ 9 เท่านั้นที่เป็นคำสั่งภายในบล็อกของคำสั่ง if ส่วนบรรทัดที่ 10 เป็นคำสั่งนอกบล็อกของ if ดังจะเห็นได้จากผลลัพธ์ที่แสดง ดังนี้

          หากเงื่อนไขที่ตรวจสอบเป็นจริง ข้อความในบรรทัดที่ 9 ก็จะถูกพิมพ์ หลังจากนั้นก็จะทำคำสั่งที่อยู่นอกเงื่อนไข if ต่อไป คือ พิมพ์ข้อความในบรรทัดที่ 10

          แต่หากเงื่อนไขที่ตรวจสอบเป็นเท็จ ข้อความในบรรทัดที่ 9 ที่เป็นคำสั่งในส่วนของเงื่อนไข if ก็จะไม่ถูกประมวลผล แต่จะข้ามการทำงานไปประมวลผลในบรรทัดที่ 10 ทันที

          ตัวอย่างที่ 9.2 ต่างจากตัวอย่างที่ 9.1 ตรงที่มีการนำเครื่องหมาย { } มาใช้คลุมคำสั่งที่อยู่ภายในบล็อกของ if กล่าวคือ หากภายในบล็อกของเงื่อนไข if มีคำสั่งที่ต้องทำงานเพียง 1 คำสั่งเหมือนโปรแกรมที่ 1 ก็ไม่จำเป็นต้องใส่ { } ให้กับบล็อกของ if (แต่ถ้าจะใส่ก็ไม่ผิด) แต่สำหรับโปรแกรมที่ 2 นี้ เมื่อตรวจสอบว่าอายุน้อยกว่า 18 แล้ว จะมี 2 คำสั่งที่ต้องทำคือ บรรทัดที่ 9 และ 10 ดังนั้นต้องใส่ { } คลุมด้วย (เมื่อทำบรรทัดที่ 9 และ 10 เรียบร้อยแล้ว ก็จะไปทำงานในบรรทัดที่ 12 ต่อไป) และหากอายุมากกว่าหรือเท่ากับ 18 ก็จะข้ามการทำงานในบล็อกของ if ไปทำบรรทัดที่ 12 ทันที

คำสั่งเงื่อนไข if-else

รูปแบบ

 

if (เงื่อนไข) {

        คำสั่งที่ 1;

}

else {

        คำสั่งที่ 2;

}

คำสั่งที่ 3;

          เป็นคำสั่งที่ช่วยให้การตรวจสอบเงื่อนไขสมบูรณ์ขึ้น โดยหากตรวจสอบเงื่อนไขของ if แล้วเป็นจริง ก็จะประมวลผลคำสั่งในบล็อกของ if แต่หากเงื่อนไขเป็นเท็จ ก็จะประมวลผลคำสั่งในบล็อกของ else แทน และเมื่อตรวจสอบเงื่อนไขและประมวลผลตามคำสั่งเงื่อนไข if-else เรียบร้อยแล้ว ก็จะทำงานตามคำสั่งที่อยู่ถัดจาก if-else นั้นต่อไป

 

รูปที่ 9.2 โฟลวชาร์ตแสดงการทำงานของคำสั่งเงื่อนไข if-else

 

ตัวอย่างที่ 9.3 การทำงานของคำสั่งเงื่อนไข if-else

 

 

#include  <stdio.h>

 

main(){

     int  points;

    

     printf(“Please enter points : ”);

     scanf(“%d”, &points);

 

     if(points >= 50)

          printf(“Pass exam...Congratulations\n;”);

      else

          printf(“Fail...Attempt again\n”);

      

      printf(“Bye bye...see you again next semester”);

}

ผลลัพธ์ของโปรแกรม

รันครั้งที่ 1

 

Please enter points : 49

Fail...Attempt again

Bye bye...see you again next semester

รันครั้งที่ 2

 

Please enter points : 79

Pass exam...Congratulations

Bye bye...see you again next semester

อธิบายโปรแกรม

          ทำการรับค่าคะแนน (points) เข้ามาในโปรแกรม จากนั้นตรวจสอบด้วยเงื่อนไข if-else

          หากคะแนนมากกว่าหรือเท่ากับ 50 ให้พิมพ์ข้อความ “Pass exam...Congratulations” และออกจากบล็อกการทำงานของคำสั่งเงื่อนไข if-else ไปทำงานในคำสั่งถัดไป คือ พิมพ์ข้อความ “Bye bye...see you again next semester”

          หากคะแนนน้อยกว่า 50 ให้พิมพ์ข้อความ “Fail...Attempt again” และออกจากบล็อคการทำงานของคำสั่งเงื่อนไข if-else ไปทำงานในคำสั่งถัดไป คือ พิมพ์ข้อความ “Bye bye...see you again next semester”

ตัวอย่างที่ 9.4 การทำงานของคำสั่งเงื่อนไข if-else

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

 

#include  <stdio.h>

#define THIS_YEAR 2013

 

main(){

     int  year;

    

     printf(“What year were you born? : ”);

     scanf(“%d”, &year);

 

     if(year > THIS_YEAR) {

          printf(“Please insert year\n;”);

          printf(“Insert in C.E. format\n”);

     }

     else {

          year = THIS_YEAR – year;

          printf(“You are %d years old\n”, year);

     }

     printf(“Finish! Goodbye”);

}

ผลลัพธ์ของโปรแกรม

รันครั้งที่ 1

 

What year were you born? : 2542

Please insert year

Insert in C.E. format

Finish! Goodbye

รันครั้งที่ 2

 

What year were you born? : 1998

You are 15 year old

Finish! Goodbye

อธิบายโปรแกรม

          บรรทัดที่ 2     ทำการกำหนดค่าคงที่แบบ Defined constants ชื่อ

THIS_YEAR ให้มีค่าเท่ากับ 2013

          บรรทัดที่ 8     ทำการรับค่าปี ค.ศ. ที่เกิดเข้ามาในโปรแกรม และบรรทัดที่ 10

ทำการตรวจสอบค่าปีเกิดที่รับเข้ามานั้นว่ามากกว่า 2013 หรือไม่

หากมากกว่า 2013 แสดงว่าผู้ใช้ป้อนปีเกิดเข้ามาเป็น พ.ศ. ให้

พิมพ์ข้อความในบรรทัดที่ 11-12 เพื่อเตือนให้กรอกปีเป็น ค.ศ.

แต่หากปีที่ป้อนเข้ามามีค่าไม่มากกว่า 2013 ก็จะเข้าสู่บล็อกการ

ทำงานของ else ในบรรทัดที่ 15 ซึ่งทำการหาอายุโดยนำค่า

2013 ลบด้วยค่าปีเกิดที่ป้อนเข้ามา จะได้ค่าอายุออกมา และใน

บรรทัดที่ 16 ทำการพิมพ์ค่าผลลัพธ์นั้นออกทางหน้าจอ ซึ่งเมื่อ

ตรวจสอบและทำงานด้วยคำสั่งเงื่อนไข if-else เรียบร้อยแล้ว จะ

ออกจากบล็อคการทำงานของคำสั่ง if-else ไปทำคำสั่งถัดไป

คือ พิมพ์ข้อความในบรรทัดที่ 18

คำสั่งเงื่อนไข if ซ้อน if (nested if)

รูปแบบ

 

if (เงื่อนไขที่ 1) {

        คำสั่งที่ 1;

}

else if (เงื่อนไขที่ 2) {

        คำสั่งที่ 2;

}

else if (เงื่อนไขที่ 3) {

        คำสั่งที่ 3;

}

else {

        คำสั่งที่ 4;

}

คำสั่งที่ 5;

          การใช้คำสั่ง if ซ้อน if นี้เป็นวิธีที่ช่วยให้การตรวจสอบเงื่อนไขสมบูรณ์มากยิ่งขึ้น เนื่องจากสามารถตรวจสอบได้หลายเงื่อนไข จากรูปแบบการใช้งานและรูปที่ 9.3 ซึ่งเป็นตัวอย่างการใช้ if ซ้อน if รูปแบบหนึ่ง หากตรวจสอบเงื่อนไขที่ 1 แล้วพบว่าเป็นจริง ก็จะทำงานตามคำสั่งที่ 1 แต่ถ้าเงื่อนไขที่ 1 เป็นเท็จ จะทำการตรวจสอบเงื่อนไขต่อไป คือ เงื่อนไขที่ 2 ซึ่งหากเงื่อนไขที่ 2 เป็นจริง จะทำคำสั่งที่ 2 ถ้าเป็นเท็จจะไปตรวจสอบเงื่อนไขที่ 3 ซึ่งถ้าเงื่อนไขที่ 3 เป็นจริงก็จะทำคำสั่งที่ 3 แต่ถ้าเป็นเท็จจะทำคำสั่งที่ 4 ทันที เพราะไม่มีเงื่อนไขใดๆ ให้ตรวจสอบแล้วในกรณีของตัวอย่างนี้ จะเห็นว่าหากตรวจสอบเงื่อนไขแล้วไม่มีเงื่อนไขใดเป็นจริงเลย ก็จะเข้ามาทำงานในคำสั่งที่ 4 ทุกครั้ง และเมื่อทำการตรวจสอบเงื่อนไขและประมวลผลตามคำสั่งของ nested if เรียบร้อยแล้ว ก็จะทำงานในคำสั่งที่ 5 ต่อไป


รูปที่ 9.3 โฟลวชาร์ตแสดงการทำงานของคำสั่งเงื่อนไข nested-if

 

ตัวอย่างที่ 9.5a โปรแกรมแสดงการทำงานของ if-else

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

 

#include  <stdio.h>

 

main(){

     int  points;

    

     printf(“Please enter points : ”);

     scanf(“%d”, &points);

     if(points >= 80) {

         printf(“Congratulations\n”);

         printf(“C Language programming subject\n”);

         printf(“You get grade A\n”);

     }

     else

         if(points>=70)

            printf(“You get grade B\n”);

         else

            if(points>=60)

               printf(“You get grade C\n”);

            else

               if(points>=50)

                  printf(“You get grade D\n”);

               else

                     printf(“You get grade F\n”);

     printf(“See you again! Next course”);

}

ตัวอย่างที่ 9.5b โปรแกรมแสดงการทำงานของ nested if

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

 

#include  <stdio.h>

 

main(){

     int  points;

    

     printf(“Please enter points : ”);

     scanf(“%d”, &points);

     if(points >= 80) {

         printf(“Congratulations\n”);

         printf(“C Language programming subject\n”);

         printf(“You get grade A\n”);

     }

     else  if(points>=70)

            printf(“You get grade B\n”);

     else  if(points>=60)

            printf(“You get grade C\n”);

     else  if(points>=50)

            printf(“You get grade D\n”);

     else

            printf(“You get grade F\n”);

 

     printf(“See you again! Next course”);

}

ผลลัพธ์ของโปรแกรม

          รันครั่งที่ 1

 

Please enter points :  55

You get grade D

See you again! Next course

          รันครั่งที่ 2

 

Please enter points :  80

Congratulations

C Language programming subject

You get grade A

See you again! Next course

          รันครั่งที่ 3

 

Please enter points :  45

You get grade F

See you again! Next course

อธิบายโปรแกรม

          ตัวอย่างที่ 9.5a และ 9.5b นี้เป็นโปรแกรมที่เหมือนกันทุกประการ เพียงแต่เขียนในรูปแบบที่ต่างกันเท่านั้น โปรแกรมนี้จะคำนวณเกรดจากคะแนนที่ป้อนเข้ามา โดยใช้คำสั่งในรูปแบบ if ซ้อน if ในการตรวจสอบ ซึ่งหลักการทำงานก็เหมือนกับคำสั่งเงื่อนไข if และ if-else ในตัวอย่างที่ผ่านมา คือ หากตรวจสอบเงื่อนไขใดแล้วพบว่าเป็นจริง ก็จะทำงานตามคำสั่งของบล็อคนั้น ๆ เช่น หากได้คะแนน 75 คะแนน จะได้ว่าเงื่อนไขที่ 2 คือ points >= 70 เป็นจริง ดังนั้นจึงแสดงข้อความว่า “You get grade B” และเมื่อตรวจสอบและทำงานตามคำสั่งในส่วนของ nested if เรียบร้อยแล้ว ก็จะแสดงข้อความ “See you again! Next course” เสมอ

คำสั่งเงื่อนไข switch-case

 

switch (ตัวแปร/นิพจน์ที่จะตรวจสอบ) {

      case   ค่าที่ 1 :

                คำสั่งที่ 1;

                break;

      case   ค่าที่ 2 :

                คำสั่งที่ 2;

                break;

      case   ค่าที่ 3 :

                คำสั่งที่ 3;

                break;

      default  :  คำสั่งที่ 3;

}

          เป็นคำสั่งที่ใช้เลือกทำงานตามคำสั่งต่าง ๆ โดยพิจารณาจากค่าของตัวแปรหรือนิพจน์ที่กำหนดว่าตรงกับกรณี (case) ใด กล่าวคือ ถ้าคำสั่ง switch ตรวจสอบค่าของตัวแปรหรือนิพจน์ที่กำหนดแล้วพบว่าตรงกับ case ใดก็จะทำงานตามคำสั่งที่อยู่ภายใต้ case นั้น แต่หากตรวจสอบแล้วไม่ตรงกับ case ใดๆเลย ก็จะเข้าสู่การทำงานภายใต้ส่วนของ default ทั้งนี้คำสั่ง switch-case จะมีหรือไม่มีส่วนของ default ก็ได้

          ถ้ามี default : เมื่อตรวจสอบค่าของตัวแปร/นิพจน์แล้วไม่ตรงกับ case ใด ๆ ก็จะเข้ามาทำงานที่ default

          ถ้าไม่มี default : เมื่อตรวจสอบค่าของตัวแปร/นิพจน์แล้วไม่ตรงกับ case ใดๆก็จะไม่ทำงานตามคำสั่งใดๆ ภายใน switch-case นั้นเลย


รูปที่ 9.4 โฟลวชาร์ตแสดงการทำงานของคำสั่งเงื่อนไข switch-case

 

          จากรูปแบบการทำงานของคำสั่งเงื่อนไข switch-case จะสังเกตเห็นว่าในแต่ละ case เมื่อทำงานตามคำสั่งต่าง ๆ ของ case นั้น ๆ เรียบร้อยแล้ว จะต้องจบด้วยคำสั่ง break ทุกครั้ง (ยกเว้นกรณีของ default เนื่องจากเป็นกรณีสุดท้ายจึงไม่จำเป็นต้องใส่คำสั่ง break) ซึ่งสาเหตุที่ต้องใส่คำสั่ง break เพราะหลังจากทำงานตามคำสั่งใน case นั้น ๆ เรียบร้อยแล้ว หากไม่มีคำสั่ง break โปรแกรมจะทำงานตามคำสั่งใน case อื่น ๆ ที่อยู่ถัดไปด้วย ดังนั้นจึงจำเป็นต้องใช้คำสั่ง break ในการควบคุมให้โปรแกรมกระโดดออกจากการทำงานของคำสั่งเงื่อนไข switch-case (ข้ามการทำงานของ case อื่นๆที่อยู่ถัดไป)ไปทำคำสั่งที่อยู่นอกชุดคำสั่ง switch-case ต่อไป

ตัวอย่างที่ 9.7 โปรแกรมแสดงการทำงานของคำสั่งเงื่อนไข switch-case

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 

#include  <stdio.h>

 

main(){

     char  ch;

    

     scanf(“%c”, &ch);

 

     switch(ch) {

         case ‘\n’ :

              printf(“You press enter”);

              break;

         case ‘\t’ :

              printf(“You press tab”);

              break;

         case ‘  ’ :

              printf(“You press spacebar”);

              break;

         default :

              printf(“You don’t press enter, tab and spacebar”);

      }

}

อธิบายโปรแกรม

          โปรแกรมนี้จะรับตัวอักษรเข้ามาเก็บไว้ในตัวแปร ch และทำการตรวจสอบตัวแปร ch ว่ามีค่าเป็นอะไร เพื่อพิจารณาว่าผู้ใช้ได้กดคีย์ใดเข้ามา โดยหากกด enter (ตัวแปร ch มีค่าเท่ากับ ‘\n’) ก็จะตรงกับกรณีของบรรทัดที่ 9 และจะทำงานตามคำสั่งในบรรทัดที่ 10-11 ถ้ากด tab (ตัวแปร ch มีค่าเท่ากับ ‘\t’) จะเข้ากรณีของบรรทัดที่ 12 และจะทำตามคำสั่งบรรทัดที่ 13-14 และถ้ากด space (ตัวแปร ch มีค่าเท่ากับ ‘ ’) จะตรงกับกรณีของบรรทัดที่ 15 ก็จะทำตามคำสั่งบรรทัดที่ 16-17 ซึ่งหากป้อนตัวอักษรอื่น ๆ นอกเหนือจาก enter, tab และ space แล้ว เมื่อตรวจสอบเงื่อนไขก็จะไม่ตรงกับกรณีใดๆเลย จึงเข้าสู่การทำงานภายใต้ส่วนของ default ในบรรทัดที่ 18 และทำการพิมพ์ข้อความออกมาตามคำสั่งในบรรทัดที่ 19

ตัวอย่างที่ 9.8 โปรแกรมหาค่าผลบวก ลบ คูณ หาร หรือยกกำลังของเลข 2 จำนวน

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

36

37

38

39

40

41

42

 

#include <stdio.h>

#include <math.h>

 

main() {

          int choice;

          double num1,num2;

 

          printf("############################\n");

          printf("#           Please select choice                 #\n");

          printf("############################\n");

          printf("#               1. Plus      (+)                              #\n");

          printf("#               2. Minus     (-)                             #\n");

          printf("#               3. Multiply  (*)                            #\n");

          printf("#               4. Divide    (/)                            #\n");

          printf("#               5. Power                                     #\n");

          printf("############################\n");

          printf("\n \t Select : ");

          scanf("%d",&choice);

          printf("\nEnter number1 : ");

          scanf("%lf",&num1);

          printf("Enter number2 : ");

          scanf("%lf",&num2);

          switch(choice) {

                   case 1 :

                             printf("%3.2lf + %3.2lf = %3.2lf\n",num1,num2,num1+num2);

                             break;

                   case 2 :

                             printf("%3.2lf - %3.2lf = %3.2lf\n",num1,num2,num1-num2);

                             break;

                   case 3 :

                             printf("%3.2lf * %3.2lf = %3.2lf\n",num1,num2,num1*num2);

                             break;

                   case 4 :

                             printf("%3.2lf / %3.2lf = %3.2lf\n",num1,num2,num1/num2);

                             break;

                   case 5 :

                             printf("%3.2lf power %3.2lf=%3.2lf\n",num1,num2,pow(num1,num2));

                             break;

                   default :

                             printf("Please select choice 1-5 only\n");

          }

}

ผลลัพธ์ของโปรแกรม

รันครั้งที่ 1

############################

#           Please select choice                 #

############################

#               1. Plus      (+)                              #

#               2. Minus     (-)                             #

#               3. Multiply  (*)                            #

#               4. Divide    (/)                            #

#               5. Power                                     #

############################

 

          Select : 1

 

Enter number1 : 2

Enter number2 : 3

2.00 + 3.00 = 5.00

รันครั้งที่ 2

############################

#           Please select choice                 #

############################

#               1. Plus      (+)                              #

#               2. Minus     (-)                             #

#               3. Multiply  (*)                            #

#               4. Divide    (/)                            #

#               5. Power                                     #

############################

 

          Select : 5

 

Enter number1 : 2

Enter number2 : 3

2.00 power 3.00 = 8.00

รันครั้งที่ 3

############################

#           Please select choice                 #

############################

#               1. Plus      (+)                              #

#               2. Minus     (-)                             #

#               3. Multiply  (*)                            #

#               4. Divide    (/)                            #

#               5. Power                                     #

############################

 

          Select : 7

 

Enter number1 : 2

Enter number2 : 3

Please select choice 1-5 only

อธิบายโปรแกรม

          บรรทัดที่ 2 ทำการ include ไฟล์ math.h ซึ่งเป็นเฮดเดอร์ไฟล์ของภาษาซีที่รวบรวมการประกาศของฟังก์ชั่นที่ใช้ทำงานต่าง ๆ ด้านคณิตศาสตร์ไว้ สาเหตุที่ต้องรวมไฟล์นี้เข้าไว้ในโปรแกรม เนื่องจากในบรรทัดที่ 37 มีการเรียกใช้ฟังก์ชั่น pow() เพื่อคำนวณเลขยกกำลัง โดย pow() เป็นฟังก์ชั่นที่มีการประกาศอยู่ในเฮดเดอร์ไฟล์ math.h ดังนั้น จึงต้องรวมเฮดเดอร์ไฟล์นี้เข้าไว้ในโปรแกรมด้วย

          หากลองนำโปรแกรมที่ 9.8 มาเปลี่ยนแปลง โดยลบคำสั่ง break ออกจาก case ทุก case ของโปรแกรม ผลลัพธ์ที่ได้จะเป็นดังนี้

 

คำสั่งทำซ้ำ (Iteration Statement)

          เป็นคำสั่งที่ใช้กำหนดวงรอบ (loop) การทำงานของโปรแกรม ซึ่งมีประโยชน์มากในกรณีที่ต้องทำงานหนึ่งๆซ้ำกันหลายๆครั้ง

คำสั่งทำซ้ำ for

for (กำหนดค่าเริ่มต้นให้กับตัวแปร; เงื่อนไขที่ต้องการตรวจสอบ; ปรับค่าของตัวแปร) {

       คำสั่งที่ 1;

}

คำสั่งที่ 2;

          คำสั่งนี้ประกอบด้วย 3 ส่วน คือ

  1. 1.ส่วนกำหนดค่าเริ่มต้นให้กับตัวแปร
  2. 2.ส่วนเงื่อนไขที่ต้องการตรวจสอบ
  3. 3.ส่วนปรับค่าของตัวแปร

การทำงานของ for นั้น จะเริ่มจากส่วนแรกคือกำหนดค่าเริ่มต้นให้กับตัวแปรก่อน จากนั้นจะไปตรวจสอบเงื่อนไขในส่วนที่ 2 ว่าเป็นจริงหรือไม่ ถ้าเป็นจริงก็จะเข้าสู่การทำงานของลูป (ถ้าเป็นเท็จจะไม่เข้าสู่ลูป แต่จะไปทำคำสั่งต่อไปที่อยู่ถัดจากลูปเลย) และเมื่อทำงานตามคำสั่งทั้งหมดที่อยู่ภายในลูปแล้วก็จะเข้าไปทำงานในส่วนที่ 3 ของคำสั่ง for เพื่อปรับค่าของตัวแปร และทำการตรวจสอบเงื่อนไขใหม่อีกครั้ง ซึ่งท่าเงื่อนไขเป็นจริงก็ยังคงอยู่ใน ลูปต่อไป และจะทำอย่างนี้เรื่อยๆจนกระทั่งผลการตรวจสอบเงื่อนไขเป็นเท็จจึงค่อยออกจากลูปไปทำคำสั่งที่อยู่นอกลูปต่อไป


รูปที่ 9.5 โฟลวชาร์ตแสดงการทำงานของคำสั่งทำซ้ำ for

 

ตัวอย่างที่ 9.9 โปรแกรมแสดงการทำงานของคำสั่ง for

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 

#include <stdio.h>

#include <conio.h>

 

main() {

          int i,j;

          clrscr();

          for(i=1,j=1;i<=10;i++) {

                   if(i==3){

                             j++;

                             continue;

                             printf("This is round %d\n",i);

                   }

                   else {

                             printf("This is round %d\n",j);

                             j++;

                   }

                   if(i==5) break;

          }

          printf("Loop perform %d rounds\n",i);

          getch();

}

ผลลัพธ์ของโปรแกรม

This is round 1

This is round 2

This is round 4

This is round 5

Loop perform 5 rounds

อธิบายโปรแกรม

บรรทัดที่ 2 : ทำการ include ไฟล์ conio.h ซึ่งเป็นเฮดเดอร์ไฟล์ของภาษาซีเข้ามาในโปรแกรม เนื่องจากในบรรทัดที่ 6 มีการเรียกใช้ฟังก์ชั่น clrscr() เพื่อเคลียร์หน้าจอ(Clear screen)ให้ว่าง และ บรรทัดที่ 20 มีการเรียกใช้ฟังก์ชั่น getch() ซึ่งทั้งสองฟังก์ชั่นมีการประกาศอยู่ในเฮดเดอร์ไฟล์ conio.h จึงจำเป็นต้องรวมเฮดเดอร์ไฟล์นี้เข้ามาในโปรแกรม

จากผลลัพธ์จะเห็นว่าการทำงานในรอบที่ 3 ไม่ได้พิมพ์ ”This is round 3” ออกมาทางจอภาพ ซึ่งเป็นผลมาจากคำสั่ง continue ในบรรทัดที่ 10 กล่าวคือเมื่อพบคำสั่ง continue โปรแกรมจะไม่ทำงานต่อจนจบรอบการทำงานรอบนั้นของลูป แต่จะวนกลับขึ้นไปทำงานในรอบการทำงานใหม่ทันที

และจากผลลัพธ์จะเห็นว่าโปรแกรมทำงานเพียง 5 รอบ ทั้งที่กำหนดการทำงานไว้ 10 รอบ (คือให้ทำตั้งแต่ i เป็น 1 และจะหยุดทำเมื่อ i มากกว่า 10 โดยเพิ่มค่า i รอบละ 1) ที่เป็นเช่นนี้เนื่องมาจากคำสั่ง break ในบรรทัดที่ 17 กล่าวคือ ในรอบการทำงานรอบที่ 5 เมื่อพบคำสั่ง break โปรแกรมจะออกจากลูปทันที

บรรทัดที่ 20 : ทำการใส่ฟังก์ชั่น getch() ไว้ในโปรแกรม เนื่องจากต้องการให้โปรแกรมหยุดรอการกดคีย์ใด ๆ ก่อนที่จะจบการทำงาน เพื่อให้เราได้เห็นผลลัพธ์บนหน้าจอ

ตัวอย่างที่ 9.10 โปรแกรมสูตรคูณแม่ 2 แสดงการทำงานซ้ำๆโดยใช้คำสั่งทำซ้ำ for

1

2

3

4

5

6

7

8

9

10

11

 

#include <stdio.h>

#include <conio.h>

 

main() {

          int i;

          clrscr();

          for(i=1;i<=12;i++){

                   printf("\t 2*%d \t = \t %d\n",i,2*i);

          }

          getch();

}

ผลลัพธ์ของโปรแกรม

2*1    =       2

2*2    =       4

2*3    =       6

2*4    =       8

2*5    =       10     

2*6    =       12

2*7    =       14

2*8    =       16

2*9    =       18

2*10  =       20

2*11  =       22

2*12  =       24

การใช้คำสั่ง for ซ้อน for (nested for)

          nested for เป็นการนำคำสั่งทำซ้ำ for หลายๆชุดมาทำงานซ้อนกัน ซึ่งการทำงานจะเริ่มจากลูป for ที่อยู่ข้างนอก (outer loop)ไปสู่การทำงานของลูป for ที่อยู่ข้างใน (inner loop) และจะทำลูป for ข้างในจนเสร็จสมบูรณ์จึงจะกลับออกไปทำลูปนอกอีกครั้ง ซึ่งจะทำงานเช่นนี้ไปเรื่อยๆจนกว่าเงื่อนไขของลูปนอกจะเป็นเท็จ

ตัวอย่างที่ 9.12 โปรแกรมแสดงการพิมพ์ * ออกทางจอภาพ โดยใช้ nested for ควบคุมการพิมพ์

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

 

#include <stdio.h>

#include <conio.h>

 

main() {

          int i,j;

          clrscr();

          for(i=1;i<=9;i+=2) {

                   for(j=1;j<=i;j++)

                             printf("*");

                   printf("\n");

          }

 

          for(i=9;i>=1;i-=2) {

                   for(j=i;j>=1;j--)

                             printf("*");

                   printf("\n");

          }

          getch();

}

ผลลัพธ์ของโปรแกรม

*

***

*****

*******

*********

*********

*******

*****

***

*

อธิบายโปรแกรม

          โปรแกรมนี้มี nested for อยู่ 2 ชุด ชุดแรกคือ บรรทัดที่ 7-11 และชุดที่สองคือ บรรทัดที่ 13-17 โดย nested for ชุดแรกจะทำการพิมพ์ * ออกทางจอภาพ โดยเพิ่มจำนวนการพิมพ์ขึ้นครั้งละ 2 คือ จาก 1 ไป 3, 5, 7, 9 ดวงตามลำดับ ส่วน nested for ชุดที่สองจะพิมพ์ * ออกทางจอภาพ โดยลดจำนวนการพิมพ์จาก 9 ไป 7, 5, 3, 1 ดวงตามลำดับ

          การทำงานของ nested for ชุดแรกนั้น เริ่มจากลูปนอก รอบแรกจะมีค่า i เป็น 1 จากนั้นจะเข้าสู่การทำงานของลูปใน คือ เริ่มที่ j=1 และจะพิมพ์ * จนกว่าเงื่อนไข j <= i จะเป็นเท็จ จึงกลับไปทำงานลูปนอกต่อ ซึ่งจะสิ้นสุดการทำงานของลูปนอกเมื่อเงื่อนไข i<= 9 เป็นเท็จ

          สำหรับ nested for ชุดที่สอง ก็จะมีการทำงานเหมือนกับ nested for ชุดแรก เพียงแต่เปลี่ยนส่วนของการกำหนดค่าเริ่มต้นให้กับตัวแปร, เงื่อนไขที่ใช้ตรวจสอบการออกจากลูป และการปรับค่าตัวแปรเท่านั้น แต่หลักการทำงานจะเหมือนกัน

คำสั่งทำซ้ำ while

รูปแบบ

     while (เงื่อนไข) {

              คำสั่งที่ 1;

      }

      คำสั่งที่ 2;

          หลักการทำงาน คือ จะทำการตรวจสอบเงื่อนไขก่อนการทำงานทุกครั้ง หากเงื่อนไขเป็นจริง จึงเข้าไปทำงานในบล็อกการทำงานของลูป while แต่หากเงื่อนไขเป็นเท็จ จะไม่เข้าสู่การทำงานของลูป while แต่จะไปทำงานคำสั่งถัดไปที่อยู่นอกลูป while ทันที

 

รูปที่ 9.6 โฟลวชาร์ตแสดงการทำงานของคำสั่งทำซ้ำ while

 

ตัวอย่างที่ 9.15 โปรแกรมเกมทายตัวเลข

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

#include <stdio.h>

#include <conio.h>

 

main() {

          int number;

          clrscr();

          printf("Guess number : ");

          scanf("%d",&number);

          while(number != 3) {

                   printf("You are wrong! try again\n");

                   printf("Guess number : ");

                   scanf("%d",&number);

          }

          printf("You win! Congratulations\n");

          getch();

}

ผลลัพธ์ของโปรแกรม

Guess number : 5

You are wrong! try again

Guess number : 7

You are wrong! try again

Guess number : 2

You are wrong! try again

Guess number : 3

You win! Congratulations

อธิบายโปรแกรม

          โปรแกรมนี้เป็นโปรแกรมเกมทายตัวเลข โดยใช้ลูป while ตรวจสอบค่าตัวเลขที่ป้อนเข้ามาว่าเป็นเลข 3 หรือไม่ หากไม่ใช่เลข 3 แสดงว่าทายผิด ก็จะวนลูปกลับไปให้ทำการป้อนค่าตัวเลขใหม่ โดยโปรแกรมจะวนลูปให้ทายค่าของตัวเลข จนกว่าจะทำการทายถูกว่าเป็นเลข 3 (คือ ถ้า number เป็น 3 จะทำให้เงื่อนไข while เป็นเท็จ ก็จะหลุดออกจากการทำงานของลูปไป)

คำสั่งทำซ้ำ do-while

รูปแบบ

      do {

              คำสั่งที่ 1;

      } while (เงื่อนไข);

      คำสั่งที่ 2;

          หลักการทำงาน คือ คำสั่งนี้จะทำงานอย่างน้อยที่สุด 1 ครั้งก่อนเสมอไม่ว่าเงื่อนไขจะเป็นจริงหรือเท็จก็ตาม จากนั้นจึงค่อยตรวจสอบเงื่อนไขในภายหลัง ซึ่งหากเงื่อนไขเป็นจริงก็จะวนลูปกลับไปทำงานที่บล็อคของคำสั่ง do-while อีกครั้ง แต่หากเงื่อนไขเป็นเท็จก็จะหลุดจากการทำงานของคำสั่ง do-while ไปทำคำสั่งที่อยู่นอกลูปต่อไป


รูปที่ 9.7 โฟลวชาร์ตแสดงการทำงานของคำสั่งทำซ้ำ do-while

ตัวอย่างที่ 9.16 โปรแกรมแสดงการทำงานของคำสั่งทำซ้ำ do-while

1

2

3

4

5

6

7

8

9

10

11

12

 

#include <stdio.h>

#include <conio.h>

 

main() {

          int i = 100;

          clrscr();

          do{

                   i = i+1;

                   printf("%d",i);

          }while(i>200);

          getch();

}

ผลลัพธ์ของโปรแกรม

   101

อธิบายโปรแกรม

          บรรทัดที่ 5     : กำหนดค่าเริ่มต้นให้กับตัวแปร i เป็น 100

          บรรทัดที่ 7-10 : มีการนำคำสั่งทำซ้ำ do-while มาใช้ในการตรวจสอบ ซึ่งอย่างที่กล่าวแล้วว่า คำสั่งนี้จะทำงานก่อนอย่างน้อย 1 ครั้งเสมอ ดังนั้น จึงทำงานบรรทัดที่ 8 ได้ค่า i เท่ากับ 101 และทำการพิมพ์ค่า i ออกทางจอภาพ จากนั้นจึงทำการตรวจสอบเงื่อนไขว่า i มากกว่า 200 หรือไม่ ปรากฏว่าตรวจสอบแล้ว i น้อยกว่า 200  แสดงว่าเงื่อนไขเป็นเท็จ ดังนั้น จึงไม่วนลูปกลับไปทำงานต่อ โปรแกรมนี้จึงทำงานเพียงแค่ 1 รอบเท่านั้น  (หากทดลองเปลี่ยนทำซ้ำจาก do-while เป็น while แล้วตรวจสอบ ผลที่ได้ จะพบว่าหากใช้คำสั่ง while โปรแกรมจะไม่พิมพ์ค่าใดๆออกทางหน้าจอ เนื่องจากเมื่อเริ่มเข้าสู่ลูปของ while เงื่อนไขก็เป็นเท็จแล้ว)

ตัวอย่างที่ 9.17 โปรแกรมตรวจสอบการเลือกเมนูผลลัพธ์ของโปรแกรม

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 

#include <stdio.h>

#include <conio.h>

#include <math.h>

main() {

          int choice;

          clrscr();

          printf("############################\n");

          printf("#           Please select choice                 #\n");

          printf("############################\n");

          printf("#               1. Plus      (+)                              #\n");

          printf("#               2. Minus     (-)                             #\n");

          printf("#               3. Multiply  (*)                            #\n");

          printf("#               4. Divide    (/)                            #\n");

          printf("#               5. Power                                     #\n");

          printf("############################\n");

          do{

                   printf("\n \t Select ( Please select choice 1-5 only ) : ");

                   scanf("%d",&choice);

          }while (choice < 1 || choice > 5);

          getch();

}

 

 

############################

#           Please select choice                 #

############################

#               1. Plus      (+)                              #

#               2. Minus     (-)                             #

#               3. Multiply  (*)                            #

#               4. Divide    (/)                            #

#               5. Power                                     #

############################

 

          Select ( Please select choice 1-5 only ) : 0

 

          Select ( Please select choice 1-5 only ) : 7

 

          Select ( Please select choice 1-5 only ) :  10

 

          Select ( Please select choice 1-5 only ) :  3

อธิบายโปรแกรม

          โปรแกรมนี้มีเมนูให้เลือกทั้งหมด 5 เมนู ซึ่งหากไม่เขียนโปรแกรมตรวจสอบข้อผิดพลาดไว้ อาจมีผู้ใช้งานโปรแกรมบางคนทำการเลือกเมนูที่ไม่ใช่เมนูที่ 1-5 ทำให้โปรแกรมเกิดข้อผิดพลาดได้ ดังนั้น โปรแกรมนี้จึงได้นำคำสั่งทำซ้ำ do-while มาใช้สำหรับตรวจสอบการเลือกเมนู โดยบรรทัดที่ 16-19 จะวนลูปเพื่อรับค่าการเลือกเมนู หากเมนูที่เลือกไม่ใช่เมนูที่ 1-5 (คือ ค่าของเมนูที่เลือกมีค่าน้อยกว่า 1 หรือมีค่ามากกว่า 5) ก็จะทำการวนลูปเพื่อรับค่าไปเรื่อย ๆ จนกว่าผู้ใช้งานโปรแกรมจะเลือกเมนูที่ 1-5 เมนูใดเมนูหนึ่ง