วันพุธที่ 17 กันยายน พ.ศ. 2557

06:40


4.2 คำสั่งทดสอบเงื่อนไขเพื่อการตัดสินใจ (decision  statements)
            คำสั่งทดสอบเงื่อนไขเพื่อการตัดสินใจ  เป็นคำสั่งที่มีการทดสอบเงื่อนไขก่อนที่จะทำงานตามคำสั่งที่กำหนดไว้  ซึ่งได้แก่คำสั่ง  if, if else, โครงสร้าง  else  if  (หรือ  nested  if)  และคำสั่ง  switch
            4.2.1 คำสั่ง  if
if  เป็นคำสั่งที่สั่งให้มีการทดสอบเงื่อนไขก่อนที่จะไปทำงานตามคำสั่งที่กำหนดไว้
รูปแบบการใช้คำสั่ง  if
if  (expression)  statement;
หรือ
if  (expression)
{
statement(s);
}
โดยที่  
            expression  คือ  นิพจน์เงื่อนไข  ซึ่งจะมีค่าจริงหรือเท็จอย่างใดอย่างหนึ่งเท่านั้น  ถ้าเงื่อนไขเป็นจริง  จะทำงานตามคำสั่งที่อยู่ใน  if  จากนั้นก็ออกจากคำสั่ง  if  ไปทำคำสั่งถัดไป  ถ้าเงื่อนไขเป็นเท็จจะออกจากคำสั่ง  if  ทันที
            ลักษณะการทำงานของคำสั่ง  if  สามารถเขียนเป็นแผนผังได้ดังนี้
 

รูปที่  4.4  ผังงานแสดงลักษณะการทำงานของคำสั่ง  if
ที่มา : สมชาย  รัตนเลิศนุสรณ์, 2545 : 90.  
โปรแกรมตัวอย่างที่  4.12  แสดงการใช้คำสั่ง  if  เพื่อตรวจสอบค่าที่รับจากคีย์บอร์ด

/*     if1.C.    */
#include <stdio.h>                                                                             /*  บรรทัดที่  1  */
#include <conio.h>                                                                            /*  บรรทัดที่  2  */
#include <ctype.h>                                                                            /*  บรรทัดที่  3  */
/*Capitalize Keys read from The Keyboard */                               /*  บรรทัดที่  4  */
main()                                                                                                    /*  บรรทัดที่  5  */
{                                                                                                        /*  บรรทัดที่  6  */
char any_char;                                                                                  /*  บรรทัดที่  7  */
clrscr();                                                                                               /*  บรรทัดที่  8  */
printf("Please type a lowercase letter : ");                                    /*  บรรทัดที่  9  */
   scanf("%c", &any_char);                                                                  /*  บรรทัดที่  10  */
  if(any_char >= 'a')                                                                             /*  บรรทัดที่  11  */
  printf("In uppercase: %c \n", toupper(any_char));                      /*  บรรทัดที่  12  */
  getch();                                                                                       /*  บรรทัดที่  13  */
  return(0);                                                                                      /*  บรรทัดที่  14  */
}                                                                                                      /*  บรรทัดที่  15  */

ผลลัพธ์ที่ได้จากโปรแกรม
แผนผังลำดับงาน: จอภาพ: Please type a lowercase letter : p  In uppercase : P   
    
คำอธิบายโปรแกรม 
            จากโปรแกรมตัวอย่างที่  4.12  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3  #include <ctype.h>  ให้การสนับสนุนฟังก์ชัน  toupper( )  ในบรรทัดที่  12
บรรทัดที่  4  เป็นคำอธิบายโปรแกรมเพื่อบอกให้ทราบว่าเป็นโปรแกรมที่แปลงตัวอักขระที่รับเข้ามาให้เป็นตัวพิมพ์ใหญ่
บรรทัดที่  9  และ  10  พิมพ์ข้อความแนะนำให้ผู้ใช้  พิมพ์ตัวพิมพ์เล็ก  แล้วรับเข้ามาเก็บไว้ในตัวแปร  any_char  ตามลำดับ
บรรทัดที่  11  คำสั่ง  if (any_char >= ‘a’)  ตรวจสอบอักขระที่เก็บในตัวแปร  any_char  ที่รับเข้ามาจากคีย์บอร์ด   ว่ามีค่ามากกว่าหรือเท่ากับ  ‘a‘  นั่นคือตรวจสอบว่าเป็นตัวพิมพ์เล็กหรือไม่  ถ้าใช่ให้ไปทำงานคำสั่งบรรทัดที่  12
บรรทัดที่  12  คำสั่งที่ให้ทำภายหลังจากตรวจสอบเงื่อนไข  if  แล้วได้ค่าเป็นจริง  คือ  เรียกใช้ฟังก์ชัน  toupper( )  เพื่อแปลงตัวพิมพ์เล็กที่เก็บไว้ในตัวแปร  any_char  เป็นตัวพิมพ์ใหญ่  คือ  toupper (any_char);  แสดงออกที่จอภาพ  แล้วหยุดรอรับค่าใด ๆ  จากคีย์บอร์ด  เช่น  ถ้ากด  enter  ก็จะกลับสู่โปรแกรม   

โปรแกรมตัวอย่างที่  4.13  แสดงการใช้คำสั่ง  if  เพื่อช่วยในการนับตัวอักขระและนับคำในประโยคที่ผู้ใช้พิมพ์

/*             if2.c        */
#include<stdio.h>                                                                   /*  บรรทัดที่  1  */
#include<conio.h>                                                                 /*  บรรทัดที่  2  */
void main(void)                                                                     /*  บรรทัดที่  3  */
{                                                                                             /*  บรรทัดที่  4  */            
      int charcnt = 0, wordcnt = 0;                                             /*  บรรทัดที่  5  */
      char ch;                                                                                 /*  บรรทัดที่  6  */
      clrscr();                                                                                  /*  บรรทัดที่  7  */
      printf("Type your  sentense or  a  phrase : ");  /*  บรรทัดที่  8  */
      while( (ch=getche( ) )  != '\r'  )                                          /*  บรรทัดที่  9  */
{                                                                                                      /*  บรรทัดที่  10  */
      charcnt++;                                                                        /*  บรรทัดที่  11  */
      if( ch==' ' ) wordcnt++;                                                  /*  บรรทัดที่  12  */
}  /*   end while  */                                                               /*  บรรทัดที่  13  */
printf("\n\nCharacter count is %d", charcnt);                 /*  บรรทัดที่  14  */
printf("\nWord count is %d", wordcnt+1);                       /*  บรรทัดที่  15  */
printf("\n\nPress any key back to program...");               /*  บรรทัดที่  16  */
getch();                                                                                  /*  บรรทัดที่  17  */
}                                                                                                /*  บรรทัดที่  18  */
ผลลัพธ์ที่ได้จากโปรแกรม
แผนผังลำดับงาน: จอภาพ: Type your  sentense or  a  phrase : I’m a teacher    Character count is 13  Word count is 3    Press any key back to program…

 คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่  4.13  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  5  ประกาศตัวแปรชนิดจำนวนเต็ม  โดยที่  charcnt  ใช้เก็บจำนวนตัวอักขระที่นับได้  และ  wordcnt  ใช้เก็บจำนวนคำที่นับได้ในประโยค
บรรทัดที่  9  คำสั่ง  while ((ch = getche()) ! = ‘ \r ‘)  เพื่อควบคุมการทำงานของโปรแกรมให้วนทำงานซ้ำ ๆ  จนกว่าเงื่อนไขเป็นเท็จจึงหยุด  นั่นคือ  ถ้าผู้ใช้กด  enter  แทนการเติมประโยค  จะทำให้เป็นเท็จ  แล้วจะออกจาก  loop  while  ไปทำคำสั่งบรรทัดที่  14  ถึง  17  แต่ถ้าเป็นจริง  คือ  ผู้ใช้เติมประโยค  ก็จะทำงานใน  loop  while  บรรทัดที่  11  และ  12
บรรทัดที่  11  คำสั่ง  charcnt ++;  ให้บวกสะสมตามจำนวนตัวอักขระที่ผู้ใช้พิมพ์รวมทั้งช่องว่างก็นับด้วย
บรรทัดที่  12  คำสั่ง  if (ch == ‘ ‘)  wordcnt ++  เพื่อตรวจสอบว่าตัวแปร  ch  เท่ากับช่องว่างหรือไม่  นั่นคือ  ผู้ใช้เคาะแป้นพิมพ์ที่  space bar  เพื่อเว้นช่องว่างกี่ครั้ง  จะบวกสะสมไว้ที่ตัวแปร  wordcnt
บรรทัดที่  14  พิมพ์แสดงจำนวนตัวอักขระที่นับสะสมไว้ในตัวแปร  charcnt  ออกจอภาพ
บรรทัดที่  15  พิมพ์แสดงจำนวนคำที่นับสะสมไว้ในตัวแปร  wordcnt  ออกจอภาพ  แต่ตัวแปร  wordcnt  ต้องเพิ่มอีก  1  เพราะถึงจะเป็นจำนวนคำที่ถูกต้อง
บรรทัดที่  16  และ  19  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับสู่โปรแกรม  และ  หยุดรอรับค่าใด ๆ  จากคีย์บอร์ด  เช่น  ถ้ากด  enter  ก็จะกลับสู่โปรแกรม  ตามลำดับ
4.2.2 คำสั่ง  if  else
            if else เป็นคำสั่งที่สั่งให้มีการทดสอบเงื่อนไข  โดยมีการตัดสินใจแบบ 2 ทางเลือก
รูปแบบการใช้คำสั่ง  if  else
if  (expression)  {
statementA(s);
}
else  {   
statementB(s);
}

           จากรูปแบบการใช้คำสั่ง  if  else  หมายความว่า  ถ้านิพจน์เงื่อนไข (expression)  มีค่าเป็นจริงจะทำตามคำสั่งชุด  A  (statementA(s);)  ถ้ามีค่าเป็นเท็จจะทำตามคำสั่งชุด  B  (statementB(s);)  เมื่อทำเสร็จก็ออกจากคำสั่งนี้
            ลักษณะการทำงานของคำสั่ง  if  else  สามารถเขียนเป็นแผนผังได้ดังนี้
 
รูปที่  4.5  ผังงานแสดงลักษณะการทำงานของคำสั่ง  if  else
ที่มา : สมชาย  รัตนเลิศนุสรณ์, 2545 : 92.
โปรแกรมตัวอย่างที่  4.14  แสดงการใช้คำสั่ง  if  else  เพื่อตรวจสอบค่าที่รับจากคีย์บอร์ด

/*             if_else1.c               */
#include <stdio.h>                                                                             /*  บรรทัดที่  1  */
#include <conio.h>                                                                            /*  บรรทัดที่  2  */
#include <ctype.h>                                                                            /*  บรรทัดที่  3  */
/*Capitalize Keys read from The Keyboard */                               /*  บรรทัดที่  4  */
main()                                                                                                    /*  บรรทัดที่  5  */
{                                                                                                           /*  บรรทัดที่  6  */
      char any_char;                                                                           /*  บรรทัดที่  7  */
      clrscr();                                                                                    /*  บรรทัดที่  8  */
      printf("Please type a lowercase letter : ");                                    /*  บรรทัดที่  9  */
      scanf("%c",&any_char);                                                          /*  บรรทัดที่  10  */
      if(any_char < 'a')                                                                      /*  บรรทัดที่  11  */
      printf("Sorry, I can not capitalize that.\n");                      /*  บรรทัดที่  12  */
     else                                                                                                 /*  บรรทัดที่  13  */
            printf("Thank you. In uppercase : %c.",toupper (any_char)); /*  บรรทัดที่  14  */
  printf("\n\nPress any key back to program...");                             /*  บรรทัดที่  15  */
  getch();                                                                                        /*  บรรทัดที่  16  */
return(0);                                                                                             /*  บรรทัดที่  17  */
}                                                                                                         /*  บรรทัดที่  18  */

ผลลัพธ์ที่ได้จากโปรแกรม
            กรณีที่เติมตัวอักษรพิมพ์เล็ก

แผนผังลำดับงาน: จอภาพ: Please type a lowercase letter : n  Thank you. In uppercase : N    Press any key back to program…    

            กรณีที่เติมตัวอักษรพิมพ์ใหญ่

แผนผังลำดับงาน: จอภาพ: Please type a lowercase letter : M  Sorry, I can not capitalize that.    Press any key back to program…   

 คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่  4.14  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  11  และ  12  คำสั่ง  if (any_char < ‘a’)  ตรวจสอบอักขระที่รับเข้ามาว่ามีค่าน้อยกว่า  ‘a’  หรือไม่  ถ้าใช่ให้พิมพ์ข้อความ  Sorry, I can not capitalize that.  นั่นคือตรวจสอบตัวอักขระที่รับเข้ามาว่าใช่ตัวอักขระพิมพ์ใหญ่หรือไม่  แต่ถ้าไม่ใช่  ให้ไปทำคำสั่งบรรทัดที่  13
บรรทัดที่  13  else  คือ  เงื่อนไขบรรทัดที่  11  เป็นเท็จ  (กรณีที่ตัวอักขระเป็นตัวพิมพ์เล็ก)  ให้ทำคำสั่งบรรทัดที่  14  คือ  เปลี่ยนตัวพิมพ์เล็กให้เป็นตัวพิมพ์ใหญ่  ด้วยฟังก์ชัน  toupper( )  และ  แสดงออกจอภาพ
บรรทัดที่  15  และ  16  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับสู่โปรแกรม  และหยุดรอรับค่าใด ๆ  จากคีย์บอร์ด  เช่น  ถ้ากด  enter  ก็จะกลับสู่โปรแกรม  ตามลำดับ 
โปรแกรมตัวอย่างที่  4.15  แสดงการใช้คำสั่ง  if else  เพื่อเปรียบเทียบค่าตัวเลขที่ผู้ใช้เติม

/* if_else2.c             */
#include<stdio.h>                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                             /*  บรรทัดที่  2  */
void main(void)                                                                    /*  บรรทัดที่  3  */
{                                                                                               /*  บรรทัดที่  4  */
      int  x, y;    char ch;                                                            /*  บรรทัดที่  5  */
      clrscr( );                                                                             /*  บรรทัดที่  6  */
      printf("Enter  an integer  of  X : ");                                  /*  บรรทัดที่  7  */
      scanf("%d",&x);                                                                /*  บรรทัดที่  8  */
      printf("Enter  an integer  of  Y : ");                                  /*  บรรทัดที่  9  */
      scanf("%d",&y);    ch=getchar( );                                  /*  บรรทัดที่  10  */
      if ( x==y )                                                                           /*  บรรทัดที่  11  */
            printf("\nX  equal to Y = %d\n",x);                     /*  บรรทัดที่  12  */
      else                                                                                    /*  บรรทัดที่  13  */
            printf("\nX = %d  not equal to Y= %d\n",x,y); /*  บรรทัดที่  14  */
      printf("\n\nPress any key back to program...");           /*  บรรทัดที่  15  */
      getch();                                                                              /*  บรรทัดที่  16  */
}                                                                                               /*  บรรทัดที่  17  */
ผลลัพธ์ที่ได้จากโปรแกรม
            กรณีที่เติมตัวเลข  2  ตัวเท่ากัน
แผนผังลำดับงาน: จอภาพ: Enter  an integer  of  X : 30  Enter  an integer  of  Y : 30  X equal to Y = 30    Press any key back to program…    

             กรณีที่เติมตัวเลข  2  ตัวไม่เท่ากัน

แผนผังลำดับงาน: จอภาพ: Enter  an integer  of  X : 10  Enter  an integer  of  Y : 25  X = 10 not equal to Y = 25    Press any key back to program…                     

คำอธิบายโปรแกรม 
            จากโปรแกรมตัวอย่างที่  4.15  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  7  และ  8  ให้ผู้ใช้เติมตัวเลขจำนวนเต็ม  แล้วเก็บไว้ที่ตัวแปร  x  ตามลำดับ
บรรทัดที่  9  และ  10  ให้ผู้ใช้เติมตัวเลขจำนวนเต็ม  แล้วเก็บไว้ที่ตัวแปร  y  ตามลำดับ
บรรทัดที่  11  if (x == y)  ทดสอบเงื่อนไขโดยการนำค่าตัวแปร  x  และ  y  เปรียบเทียบกันว่าเท่ากันจริงหรือเท็จ  ถ้าจริง  จะทำคำสั่งบรรทัดที่  12  คือให้พิมพ์บอกว่า  x  เท่ากับ  y  และพิมพ์ค่า  x  แสดงที่จอภาพ
บรรทัดที่  13  else  ถ้าเงื่อนไขบรรทัดที่  11  เป็นเท็จ  จะมาทำคำสั่งบรรทัดที่  13  และ  14  คือ  พิมพ์บอกว่า  x  ไม่เท่ากับ  y  พร้อมทั้งพิมพ์ค่า  ตัวแปร  x  และ  y  แสดงที่จอภาพ
บรรทัดที่  15  และ  16  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับสู่โปรแกรม  และหยุดรอรับค่าใด ๆ  จากคีย์บอร์ด  เช่น  ถ้ากด  enter  ก็จะกลับสู่โปรแกรม  ตามลำดับ
4.2.3 คำสั่งโครงสร้าง  else  if  (คำสั่ง  nested  if)
            else  if  เป็นโครงสร้างที่ทำให้เราสามารถใช้คำสั่ง  if  else  ซ้อนกันได้เรื่อย ๆ ส่วนมากจะใช้ในการตัดสินใจที่มากกว่า  2  ทางเลือกขึ้นไป  บางครั้งอาจเรียกโครงสร้างนี้ว่า  nested  if   
รูปแบบการใช้โครงสร้าง  nested  if  หรือ  else  if
else  if  (expression)  {
statementA(s);
}
else  if  (expression){        
statementB(s);
}
else  if  (expression){        
……..

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

/*  nestif1.c            */
#include<stdio.h>                                                                         /*  บรรทัดที่  1  */
#include<conio.h>                                                                     /*  บรรทัดที่  2  */
#include<stdlib.h>                                                                      /*  บรรทัดที่  3  */
void main(void)                                                                             /*  บรรทัดที่  4  */
{                                                                                                  /*  บรรทัดที่  5  */
      int score, n, i;                                                                              /*  บรรทัดที่  6  */
      char grade;                                                                                /*  บรรทัดที่  7  */
      char numstr[20];                                                                         /*  บรรทัดที่  8  */
      clrscr( );                                                                   /*  บรรทัดที่  9  */
      printf("Enter Number of Students : ");                                         /*  บรรทัดที่  10  */
      n = atoi(gets(numstr));                                                                 /*  บรรทัดที่  11  */
      for ( i=1; i<=n; i++ ){                                                                     /*  บรรทัดที่  12  */
            printf("\nEnter score of student #%d : ", i);                       /*  บรรทัดที่  13  */
            score = atoi(gets(numstr));                                                 /*  บรรทัดที่  14  */
            if ( score >= 80 )                                                /*  บรรทัดที่  15  */
                  grade = 'A';                                                   /*  บรรทัดที่  16  */
                  else if ( score >= 70 )                                  /*  บรรทัดที่  17  */
                        grade = 'B';                                           /*  บรรทัดที่  18  */
                  else if ( score >= 60 )                                 /*  บรรทัดที่  19  */
                        grade = 'C';                                           /*  บรรทัดที่  20  */
                  else if ( score >= 50 )                                /*  บรรทัดที่  21  */
                        grade = 'D';                                         /*  บรรทัดที่  22  */
                  else  grade = 'F';                                        /*  บรรทัดที่  23  */
            printf("Score = %d, Grade of std #%d is %c\n",score,i,grade); /*  บรรทัดที่  24 */
} /* end for */                                                              /*  บรรทัดที่  25  */
printf("\n\nPress any key back to program...");           /*  บรรทัดที่  26  */
getch();                                                                          /*  บรรทัดที่  27  */
}                                                                                    /*  บรรทัดที่  28  */


ผลลัพธ์ที่ได้จากโปรแกรม
แผนผังลำดับงาน: จอภาพ: Enter Number of Students : 3    Enter score of student #1 : 85  Score = 85, Grade of std #1 is A    Enter score of student #2 : 70  Score = 70, Grade of std #2 is B    Enter score of student #3 : 63  Score = 63, Grade of std #3 is C    Press any key back to program…      

คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่  4.16  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3  #include <stdlib.h>  สนับสนุนการใช้ฟังก์ชัน  atoi( )   ของคำสั่งบรรทัดที่  11
บรรทัดที่  10 และ  11  รับค่าตัวเลขที่เป็นจำนวนนักเรียน  แล้วทำคำสั่ง  n = atoi(gets(numstr));  คือนำค่าที่รับเข้ามาแปลงให้เป็นจำนวนเต็มแล้วเก็บไว้ที่ตัวแปร  n
บรรทัดที่  12 คำสั่ง  for (i=1; i<=n; i++)  เพื่อควบคุมการทำงานของโปรแกรมให้วนรอบทำงานตามจำนวนของตัวเลขที่เติมคือ   n   ครั้ง  ซึ่งถ้าตรวจสอบเงื่อนไข  for  แล้วเป็นจริงจะทำคำสั่งภายใน  loop for  คือคำสั่งบรรทัดที่  13  ถึง  24  แต่ถ้าตรวจสอบเงื่อนไข  for  แล้วเป็นเท็จ  จะไปทำคำสั่งบรรทัดที่  26  และ  27
บรรทัดที่  13  และ  14  รับค่าคะแนนที่ผู้ใช้เติม  แล้วแปลงให้เป็นจำนวนเต็มเก็บไว้ที่ตัวแปร score  ตามลำดับ
บรรทัดที่  15 คำสั่ง  if ( score >= 80 )  ตรวจสอบเงื่อนไขของตัวแปร score  ว่ามากกว่าหรือเท่ากับ  80  หรือไม่  ถ้าใช่ให้กำหนดตัวแปร  grade  เก็บ  A   แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่  17
บรรทัดที่  17  คำสั่ง  else if ( score >= 70 )    ตรวจสอบเงื่อนไขต่ออีกว่าตัวแปร score  ว่ามากกว่าหรือเท่ากับ  70  หรือไม่  ถ้าใช่ให้กำหนดตัวแปร  grade  เก็บ B  แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่  19
บรรทัดที่  19  คำสั่ง  else if ( score >= 60 )    ตรวจสอบเงื่อนไขต่ออีกว่าตัวแปร score  ว่ามากกว่าหรือเท่ากับ  60  หรือไม่  ถ้าใช่ให้กำหนดตัวแปร  grade  เก็บ  C แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่  21
บรรทัดที่  21  คำสั่ง  else if ( score >= 50 )    ตรวจสอบเงื่อนไขต่ออีกว่าตัวแปร score  ว่ามากกว่าหรือเท่ากับ  50  หรือไม่  ถ้าใช่ให้กำหนดตัวแปร  grade  เก็บ D  แต่ถ้าไม่ใช่ให้ไปทำงานคำสั่งบรรทัดที่  23
บรรทัดที่  23   คำสั่ง  else        grade = ‘F’;  กำหนดตัวแปร  grade  เก็บ  F
บรรทัดที่ 24  ภายหลังจากทำงานทุกเงื่อนไขแล้วจะมาทำคำสั่งบรรทัดที่  24  คือ  แสดงค่าตัวแปร  score  ตัวแปร  i  และตัวแปร  grade  ที่ได้แสดงออกจอภาพ
บรรทัดที่  26  และ  27  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับสู่โปรแกรม  สุดท้ายจะหยุดรอรับค่าใด ๆ  จากคีย์บอร์ด  เช่น  ถ้ากด  enter  ก็จะกลับสู่โปรแกรม  ตามลำดับ         
โปรแกรมตัวอย่างที่  4.17  แสดงการใช้คำสั่ง   nested  if  เพื่อเขียนเส้นทะแยงมุมในกรอบสี่เหลี่ยมพื้นสีเทา

/*             nestif2.c */
/* Prints two diagonal lines on screen  */                                     
#include <stdio.h>                                                                             /*  บรรทัดที่  1  */
#include <conio.h>                                                                            /*  บรรทัดที่  2  */
#include <dos.h>                                                                               /*  บรรทัดที่  3  */
void main(void)                                                                                    /*  บรรทัดที่  4  */
{                                                                                                          /*  บรรทัดที่  5  */
      int x, y;                                                                                 /*  บรรทัดที่  6  */
      clrscr();                                                                                       /*  บรรทัดที่  7  */
      printf("\n");                                                                               /*  บรรทัดที่  8  */
      for (y=1; y<24; y++)                                                                  /*  บรรทัดที่  9  */
{                                                                                                         /*  บรรทัดที่  10  */
            for (x=1; x<24; x++)                                                            /*  บรรทัดที่  11  */
                  if ( x == y )                                                                    /*  บรรทัดที่  12  */
                        printf("\xDB");                                                        /*  บรรทัดที่  13  */
                  else                                                                               /*  บรรทัดที่  14 */
                  if ( x == 24 - y )                                                 /*  บรรทัดที่  15  */
                        printf("\xDB");                                                 /*  บรรทัดที่  16  */
                  else                                                                          /*  บรรทัดที่  17  */
printf("\xB0");                                                                  /*  บรรทัดที่  18  */
printf("\n");                                                                                /*  บรรทัดที่  19  */
delay(200);                                                                                     /*  บรรทัดที่  20  */
}                                                                                                 /*  บรรทัดที่  21  */
printf("\n\nPress any key back to program...");                            /*  บรรทัดที่  22  */
getche();                                                                                  /*  บรรทัดที่  23  */
}                                                                                               /*  บรรทัดที่  24  */

ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ:    Press any key back to program…    

คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่  4.17  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3   #include <dos.h>  สนับสนุนฟังก์ชัน  delay( )   ในคำสั่งบรรทัดที่  20
บรรทัดที่  9  คำสั่ง for (y=1; y<24; y++) เพื่อควบคุมการทำงานของโปรแกรมให้ทำงานแถวที่  1  ถึง  แถวที่  23  ซึ่งถ้าตรวจสอบเงื่อนไข  for  เป็นจริงจะทำคำสั่งบรรทัดที่  11 ถึง  20  แต่ถ้าเงื่อนไขเป็นเท็จ  จะทำคำสั่งบรรทัดที่  22  และ  23
บรรทัดที่  11  คำสั่ง  for (x=1; x<24; x++)  เพื่อควบคุมการทำงานของโปรแกรมให้ทำงานคอลัมน์ที่  1  ถึง  คอลัมน์ที่  23   
บรรทัดที่  12  คำสั่ง  if (x==y)  ตรวจสอบเงื่อนไข  ถ้าค่าตัวแปร  x  เท่ากับ  ค่าตัวแปร  y  ถ้าเป็นจริงให้ทำคำสั่งบรรทัดที่  13  printf (“\xDB”);  คือให้พิมพ์อักขระกราฟฟิกรูป      ออกแสดงที่จอภาพ  (x==y  จะได้เส้นทะแยงมุม)  แต่ถ้า  x  ไม่เท่ากับ  y  คือเป็นเท็จ  ให้ตรวจสอบเงื่อนไขถัดไป  คือคำสั่งบรรทัดที่  14  และ  15
บรรทัดที่  14  และ  15  else if (x == 24 – y)  ตรวจสอบเงื่อนไขต่ออีกว่า  ตัวแปร  x==24-y  หรือไม่  ถ้าใช่  ให้ทำคำสั่งบรรทัดที่  16  printf (“\xDB”);  คือให้พิมพ์อักขระกราฟฟิกรูป       เส้นทะแยงมุมจากมุมบนขวาสุดไปยังมุมล่างซ้ายสุด  แต่ถ้าไม่ใช่  ให้ไปตรวจสอบเงื่อนไขถัดไป  คือคำสั่งบรรทัดที่  17  และ  18
บรรทัดที่  17  และ  18  ถ้าไม่เป็นไปตามเงื่อนไขดังที่กล่าวมาข้างต้น  ให้พิมพ์อักขระกราฟฟิกรูป  สีเทา  แสดงที่จอภาพ
บรรทัดที่  19  ภายหลังจากทำงานทุกเงื่อนไขแล้ว  จะทำคำสั่งบรรทัดที่  19  คือ  ขึ้นบรรทัดใหม่  และ  ทำคำสั่งบรรทัดที่  20
บรรทัดที่  20  คำสั่ง  delay (200);  คือ  ขณะที่วาดรูปอักขระกราฟฟิก  แต่ละครั้งให้หน่วงเวลาด้วย
บรรทัดที่  22  และ  23  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับสู่โปรแกรม  สุดท้ายจะหยุดรอรับค่าใด ๆ  จากคีย์บอร์ด  เช่น  ถ้ากด  enter  ก็จะกลับสู่โปรแกรม  ตามลำดับ   
      
4.2.4 คำสั่ง  switch
            switch  เป็นคำสั่งที่ใช้ทดสอบเงื่อนไขในกรณีที่มีทางเลือกสำหรับตัดสินใจมากกว่า  2  ทางขึ้นไปเช่นเดียวกันกับ  nested  if  โดยมากนิยมใช้คำสั่ง  switch  แทนคำสั่ง  nested  if  เพราะมีรูปแบบการใช้คำสั่งที่ง่ายและสะดวกในการแก้ไขคำสั่งเมื่อมีข้อผิดพลาดเกิดขึ้น
รูปแบบการใช้คำสั่ง  switch
switch  (expression) {
case  expression1:
statement(s);  break;
case  expression2:
statement(s);  break;
…..
case  expressionN:
statement(s);  break;
default:
statement(s);
}

โดยที่
 
expression  คือ  นิพจน์  หรือตัวแปรที่จะใช้เปรียบเทียบกับนิพจน์  expression1, expression2, …, expressionN  ว่ามีค่าตรงกับนิพจน์ใด
expression1, expression2, …, expressionN  คือ  นิพจน์  หรือค่าคงที่ในเงื่อนไขที่  1, 2, 3, …, N  ตามลำดับ
break  คือ  คำสั่งที่จะต้องใส่ไว้ในแต่ละ  case  เพื่อเป็นการบอกให้ออกจากคำสั่ง  switch  หลังจากทำคำสั่งที่อยู่ใน  case  นั้น ๆ แล้ว  ถ้าหากไม่มีคำสั่ง  break  ใน  case  ใด  เมื่อทำงานจบ  case  นั้นแล้ว  จะทำงานใน  case  ถัดไปจนกว่าจะเจอคำสั่ง  break  ซึ่งทำให้เกิดการทำงานผิดพลาดได้
default  คือ  กรณีที่  expression  ไม่ตรงกับเงื่อนไขใด ๆ เลย  ให้ทำงานตามคำสั่งที่เขียนไว้ใน  default  โดย  default  นี้ไม่จำเป็นต้องใส่คำสั่ง  break  เอาไว้  เพราะ  default  เป็นกรณีสุดท้ายของคำสั่ง  switch
ข้อควรระวังในการใช้คำสั่ง  switch  

            1) ถ้าใช้คำสั่ง  switch  ในแต่ละกรณี  (case)  จะต้องใส่คำสั่ง  break  เอาไว้ด้วยมิฉะนั้นจะเกิดการทำงานซ้ำใน  case  ต่อมาจนกว่าจะเจอคำสั่ง  break  ยกเว้นกรณี  default  ไม่ต้องใส่คำสั่ง  break
            2) expression  ที่อยู่หลังคำสั่ง  switch  ควรใช้เป็นตัวแปร เพื่อจะได้สะดวกในการนำไปเปรียบเทียบกับกรณีต่าง ๆ ส่วน  expression1, expression2, …, expressionN  ที่อยู่หลัง case  ต่าง ๆ ควรใช้เป็นค่าคงที่ 
โปรแกรมตัวอย่างที่  4.18  แสดงการใช้คำสั่ง  switch  เพื่อตรวจสอบเกรดที่ผู้ใช้เติม  ว่าตรงกับกรณีใด  แล้วแสดงเกรดที่เป็นตัวเลขออกจอภาพ

/*             switch.c                 */
#include<stdio.h>                                                                      /*  บรรทัดที่  1  */
#include<conio.h>                                                                     /*  บรรทัดที่  2  */
#include<stdlib.h>                                                                       /*  บรรทัดที่  3  */
#include<ctype.h>                                                                      /*  บรรทัดที่  4  */
void main(void)                                                                              /*  บรรทัดที่  5  */
{                                                                                                   /*  บรรทัดที่  6  */
      int  n, i;                                                                                         /*  บรรทัดที่  7  */
      float  gradepoint;                                                                           /*  บรรทัดที่  8  */
      char grade;                                                                                    /*  บรรทัดที่  9  */
      char numstr[20];                                                                           /*  บรรทัดที่  10  */
      clrscr( );                                                                                       /*  บรรทัดที่  11  */
      printf("Enter Number of Students : ");                                           /*  บรรทัดที่  12  */
      n = atoi(gets(numstr)) ;                                                                  /*  บรรทัดที่  13  */
      for ( i=1; i<=n; i++ ) {                                                                    /*  บรรทัดที่  14  */
            printf("\nEnter grade of student #%d: ", i);                               /*  บรรทัดที่  15  */
            grade = getche( );                                                                    /*  บรรทัดที่  16  */
            switch(toupper(grade)) {                                                           /*  บรรทัดที่  17  */
                  case 'A':                                                                            /*  บรรทัดที่  18  */
                        gradepoint = 4.0; break;                                   /*  บรรทัดที่  19  */
                  case 'B':                                                                  /*  บรรทัดที่  20  */
                        gradepoint = 3.0; break;                                   /*  บรรทัดที่  21  */
                  case 'C':                                                                    /*  บรรทัดที่  22  */
                        gradepoint = 2.0; break;                                   /*  บรรทัดที่  23  */
                  case 'D':                                                                  /*  บรรทัดที่  24  */
                        gradepoint = 1.0; break;                                   /*  บรรทัดที่  25  */
                  default:  gradepoint = 0.0;                                        /*  บรรทัดที่  26  */
            } /* end switch */                                                         /*  บรรทัดที่  27  */
            printf("\nGrade Point of Student#%d is %.2f\n",i,gradepoint);  /*  บรรทัดที่  28  */
      } /* end for */                                                                        /*  บรรทัดที่  29  */
printf("\n\nPress any key back to program...");                              /*  บรรทัดที่  30  */
getch();                                                                                           /*  บรรทัดที่  31  */
}  /* end main */                                                                              /*  บรรทัดที่  32  */

ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: Enter Number of Students : 2    Enter grade of student #1 : a  Grade Point of Student #1 : 4.00    Enter grade of student #2 : b  Grade Point of Student #2 : 3.00    Press any key back to program...         

 คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่  4.18  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  12  และ  13  ให้ผู้ใช้เติมจำนวนนักเรียน  แล้วนำค่าที่ผู้ใช้เติมมาแปลงให้เป็นจำนวนเต็ม  แล้วเก็บไว้ที่ตัวแปร  n
บรรทัดที่  14  for (i = 1;  i < n;  i++)  คำสั่งควบคุมการทำงานของโปรแกรมให้วนทำงานจำนวนรอบเท่ากับตัวแปร  n  หรือค่าตัวเลขที่ผู้ใช้เติม  เมื่อทดสอบเงื่อนไข  for  แล้วเป็นจริง  จะทำงานตามคำสั่งใน  loop for  คือ  คำสั่งบรรทัดที่  15  ถึง  29  แต่ถ้าเป็นเท็จ  จะไปทำงานตามคำสั่งบรรทัดที่  30  และ  31
บรรทัดที่  15  และ  16  ให้ผู้ใช้เติมเกรดแล้วเก็บไว้ที่ตัวแปร  grade
บรรทัดที่  17  ถึง  27  เป็น  loop  ของ  คำสั่ง  switch  ซึ่งทำงานซ้อนภายใน  loop  for  ดังนี้  จากตัวแปรเกรดที่รับเข้าจะแปลงให้เป็นตัวพิมพ์ใหญ่ทุกครั้ง  เพื่อนำไปทดสอบทุกกรณีของคำสั่ง  switch  เริ่มตรวจสอบกรณีแรก  คือ  ทดสอบว่าเป็นตัว  A  หรือไม่  ถ้าใช่  กำหนดตัวแปร  gradepoint  มีค่าเท่ากับ  4.0  แล้วหยุดการทำงานในกรณีนี้  (break)  แต่ถ้าไม่ใช่ตัว  A  ก็ไปตรวจสอบกรณีถัดไป  คือ  ใช่ตัว  B  หรือไม่  ถ้าใช่  กำหนดตัวแปร  gradepoint  มีค่าเท่ากับ  3.0  แล้วหยุดการทำงานในกรณีนี้  (break)  แต่ถ้าไม่ใช่ตัว  B  ก็ไปตรวจสอบกรณีถัดไป  คือ  ใช่ตัว  C  หรือไม่  ถ้าใช่  กำหนดตัวแปร  gradepoint  มีค่าเท่ากับ  2.0  แล้วหยุดการทำงานในกรณีนี้  (break)  แต่ถ้าไม่ใช่ตัว  C  ก็ไปตรวจสอบกรณีถัดไป  คือ  ใช่ตัว  D  หรือไม่  ถ้าใช่  กำหนดตัวแปร  gradepoint  มีค่าเท่ากับ  1.0  แล้วหยุดการทำงานในกรณีนี้  (break)  กรณีสุดท้าย  คือ  กรณีที่เติมตัวอื่นที่ไม่ใช่ทั้ง  4  กรณีข้างต้น  จะทำคำสั่งบรรทัดที่  26  คือ  default;  gradepoint = 0.0;  คือ  กรณีอื่น ๆ  ให้กำหนดตัวแปร  gradepoint  มีค่าเท่ากับ  0.0
บรรทัดที่  28  ภายหลังจากการทำงานทุกกรณีของคำสั่ง  switch  แล้ว  จะทำคำสั่งบรรทัดที่  28  คือ  แสดงค่าตัวแปร  gradepoint  ที่ได้ของแต่ละคน  แสดงที่จอภาพ
บรรทัดที่  30  และ  31   พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับสู่โปรแกรม  สุดท้ายจะหยุดรอรับค่าใด ๆ  จากคีย์บอร์ด  เช่น  ถ้ากด  enter  ก็จะกลับสู่โปรแกรม  ตามลำดับ          

0 ความคิดเห็น:

แสดงความคิดเห็น