20.คำสั่ง Switch case

คำสั่ง Switch case



เงื่อนไข(SWITCH CASE)

          เงื่อนไข(switch case)เป็นเงื่อนไขเช่นเดียวกับ if-else แต่จะมีความเที่ยงตรงที่สูงกว่า และใช้ได้ค่อยข้างจำกัด โดยส่วนใหญ่แล้วจะใช้ในการควบคุมการแสดงผลทางเมาส์ และคีย์บอร์ด แต่ก็สามารถนำมาใช้เป็นเงื่อนไขเช่นเดียวกับ if-else ซึ่งการใช้นั้นจะต้องใช้ตามรูปแบบหรือ syntax ของมันครับ หากไม่ต้องกับรูปแบบแล้วเงื่อนไขก็จะใช้ไม่ได้หรือerror นั่นเองครับ การใช้ switch case นั้นนิยมใช้กับ main manu ครับ เพื่อที่จะได้เลือกใช้ฟังก์ชันย่อยๆต่อไป

รูปแบบการใช้งาน

switch ( ตัวแปร )
{
          case ' ตัวอักขระ ' :
                    สิ่งที่ต้องการทำหากผลของเงื่อนไขเป็นจริง
                    break;
          case ค่าคงที่  :
                    สิ่งที่ต้องการทำหากผลของเงื่อนไขเป็นจริง
                    break;
          default : 
                    สิ่งที่ต้องการทำหากผลของเงื่อนไขเป็นเท็จ
}

อธิบายโปรแกรม 
          จะเห็นว่าค่าตัวแปรที่ใช้ในการเงื่อนไข จะอยู่หลัง switch  และเงื่อนไขจะอยู่หลัง case  ส่วนสิ่งที่จะทำหากผลของเงื่อนไขเป็นจริง อยู่ใต้เครื่องหมาย : สิ่งที่สำคัญที่สุดคือคำสั่ง break เพราะหากไม่ใส่คำสั่งนี้โปรแกรมจะทำงานต่อไปโดยแสดงผลให้เราดูเพียงไม่กี่วินาที ซึ่งในความเป็นจริงเราดูไม่ทันหรอกครับ เพราะเฉพาะใส่ไปซะ break เนี่ย  ส่วนdefault คือนอกเหนือจาก case อื่นๆที่กล่าวมาครับ หมายหมายเหมือนกับ else ครับ  อีกสิ่งที่แตกต่างกันคือเงื่อนไขครับ หากเป็นตัวอักขระให้ใส่เครื่องหมาย '...'  แต่ถ้าเป็นค่าคงที่ไม่ต้องใส่ครับ

เปรียบเทียบกับ if-else
switch case
 switch ( A )
          case  1  :
                   cout<<"Yes";
                   break;
          case  2  :
                   cout<<"No";
                   break;
          default : 
                   cout<<"Error";
}

if-else
if ( A == 1)
{
         cout<<"Yes";
}
 else if ( A == 2)                   
{        
          cout<<"No";
}                 
 else         
{      
          cout<<"Error";
}

ซึ่่งทั้งสองโปรแกรมนี้มีการประมวลผล และแสดงผลเหมือนกัน

--------------------------------------------------------------

ตัวอย่างการใช้งาน

1.ตัวอย่างแรกง่ายๆก่อนนะครับ
#include <iostream>
main()
{
   int A;
   cout<<"i = ";
    cin>>A);
   switch ( A )
   { 
                  case 1 :
                          cout<<"Yes";
                          break;
                  case 2 :
                          cout<<"No";
                          break;
                  default : 
                          cou>>"Error";
         }
         getchar();
}

จะเห็นว่าเมื่อรับข้อมูลค่าตัวแปรA แล้วจากนั้นจะตรวจสอบเงื่อนไข หากตัวแปรA มีค่าเท่ากับ 1 จะแสดงผลทางหน้าจอคือ Yes หากตัวแปรA มีค่าเท่ากับ 2 จะแสดงผลทางหน้าจอคือ No และถ้าไม่ต้องกับเงื่อนไขใดๆเลย จะแสดงผลทางหน้าจอคือ Error
--------------------------------------------------------------

2.ตัวอย่างที่สองเริ่มยากขึ้นมานะครบนะครับ
#include <iostream>
main()
{
   char A;
   cou<<"Your grad : ";
   A=getchar();
   switch ( A )
   { 
           case 'a' :
                    cout<<"Excellent!";
                    break;
           case 'b' :
                    cout<<"Well!";
                    break;
          case 'c' :
                    cout<<"Good!";
                    break;
           case 'd' :
                    cout<<"So-so!";
                    break;
           case 'e' :
                    cout<<"Badly!";
                    break;
           case 'f' :
                    cout<<"Oh god!";
                    break;
           default : 
                    cout<<"Error";
}
       getchar();
}
จะเห็นว่าเมื่อรับข้อมูลค่าตัวแปรA ที่เป็นตัวอักขระ แล้วจากนั้นจะตรวจสอบเงื่อนไข หากตัวแปรA มีค่าเท่ากับ a จะแสดงผลทางหน้าจอคือ Excellent! หากตัวแปรA มีค่าเท่ากับ b จะแสดงผลทางหน้าจอคือ Well! หากตัวแปรA มีค่าเท่ากับ c จะแสดงผลทางหน้าจอคือ Good!หากตัวแปรA มีค่าเท่ากับ d จะแสดงผลทางหน้าจอคือ So-so! หากตัวแปรA มีค่าเท่ากับ e จะแสดงผลทางหน้าจอคือ Badly! หากตัวแปรA มีค่าเท่ากับ f จะแสดงผลทางหน้าจอคือ Oh god! และถ้าไม่ต้องกับเงื่อนไขใดๆเลย จะแสดงผลทางหน้าจอคือ Error



คำสั่ง switch-case นั้นคล้ายกับ คำสั่ง If-else เป้าหมายของมันเพื่อตรวจสอบกับค่าคงที่ นี่เป็นตัวอย่างการใช้คำสั่ง switch
#include <iostream>

using namespace std;

int main()
{
    int n = 1;
    switch (n)
    {
    case 1:
        cout << "n is 1";
        break;
    case 2:
        cout << "n is 2";
        break;
    default:
        cout << "Unknown n";
    }
    return 0;
}
switch expression สามารถมีได้แค่หนึ่งค่าเพื่อประเมิน คำสั่ง case เป็นคำสั่งเงื่อนไขเพื่อเปรียบเทียบค่า ในตัวอย่าง case 1: จะทำงานเมื่อ n มีค่าเท่ากับ 1 หลังจากคำสั่งด้านล่างเราต้องใส่คำสั่ง break เพื่อหยุดสำหรับแต่ละ case ไม่เช่นนั้นโปรแกรมจะทำงานไปจนกว่าจะพบคำสั่ง break หรือสิ้นสุดบล็อคคำสั่งของ switch และคำสั่ง default นั้นเป็นทางเลือกเมื่อโปรแกรมไม่ตรงกับเงื่อนไขใดๆ ก่อนหน้าเช่นเดียวกับคำสั่ง else
ในตัวอย่าง มันสามารถถูกเขียนโดยการใช้คำสั่ง if-else ได้ดังด้านล่างนี้
#include <iostream>

using namespace std;

int main()
{
    int n = 1;
    if (n == 1)
    {
        cout << "n is 1";
    }
    else if (n == 2)
    {
        cout << "n is 2";
    }
    else
    {
        cout << "Unknown n";
    }
    return 0;
}
ในตัวอย่าง คุณจะเห็นว่าการใช้งานคำสั่ง switch นั้นสามารถที่จะแทนที่ด้วยคำสั่ง if ได้ แต่อย่างก็ตามคำสั่ง switch นั้นยังมักจะถูกใช้กับการเปรียบเทียบที่ง่ายและรวดเร็ว ดังนั้น switch นั้นจึงใช้ได้เพียงกับข้อมูลประเภท Integer หรือ Char เท่านั้น ในขณะที่ if นั้นสามารถใช้กับข้อมูลทุกแบบ

คำสั่ง switch - case

การควบคุมเงื่อนไขด้วย switch-case (switch-statement)
                    นอกจากประโยคคำสั่ง if-else แล้วในภาษา c++ ก็ยังมีการควบคุมเงื่อนไขด้วยการใช้ประโยคคำสั่ง switch โดยประโยคคำสั่ง switch เหมาะกับการนำไปประยุกต์ใช้กับโปรแกรมที่มีเมนูให้เลือกรายการต่างๆ

                        รูปแบบ :
                                    switch (integer_expression)
                                            {
                                                case     constant_1;
                                                             statement_1;
                                                             break;

                                                case     constant_2;
                                                             statement_2;
                                                             break;

                                                case     constant_3;
                                                             statement_3;
                                                             break;

                                                default;
                                                            statement;

                                            }

                        ผลการตรวจสอบเงื่อนไข จะขึ้นอยู่กับค่า integer_expression ถ้าเงื่อไขที่ตรวจสอบอยู่ภายในเงื่อนไขที่กำหนด ก็จะทำงานชุดคำสั่งภายใน case ของ constant นั้น แต่ถ้าหากไม่พบเงื่อนไขตามแต่ละ case ที่กำหนดไว้เลย ก็จะไปทำชุดคำสั่งที่ default แทน อย่างไรก็ตามเงื่อนไขของแต่ละ case นั้นควรบรรจุคำสั่ง break เข้าไปด้วยทั้งนี้เพื่อป้องกันมิให้ตรวจสอบเงื่อนไขถัดไป ส่วนกรณี default นั้นไม่จำเป็นต้องมีคำสั่ง break


switch statement allows a variable to be tested for equality against a list of values. Each value is called a case, and the variable being switched on is checked for each case.

Syntax

The syntax for a switch statement in C++ is as follows −
switch(expression) {
   case constant-expression  :
      statement(s);
      break; //optional
   case constant-expression  :
      statement(s);
      break; //optional
  
   // you can have any number of case statements.
   default : //Optional
      statement(s);
}
The following rules apply to a switch statement −
  • The expression used in a switch statement must have an integral or enumerated type, or be of a class type in which the class has a single conversion function to an integral or enumerated type.
  • You can have any number of case statements within a switch. Each case is followed by the value to be compared to and a colon.
  • The constant-expression for a case must be the same data type as the variable in the switch, and it must be a constant or a literal.
  • When the variable being switched on is equal to a case, the statements following that case will execute until a break statement is reached.
  • When a break statement is reached, the switch terminates, and the flow of control jumps to the next line following the switch statement.
  • Not every case needs to contain a break. If no break appears, the flow of control will fall through to subsequent cases until a break is reached.
  • switch statement can have an optional default case, which must appear at the end of the switch. The default case can be used for performing a task when none of the cases is true. No break is needed in the default case.

Flow Diagram

C++ switch statement

Example

#include <iostream>
using namespace std;
 
int main () {
   // local variable declaration:
   char grade = 'D';

   switch(grade) {
      case 'A' :
         cout << "Excellent!" << endl; 
         break;
      case 'B' :
      case 'C' :
         cout << "Well done" << endl;
         break;
      case 'D' :
         cout << "You passed" << endl;
         break;
      case 'F' :
         cout << "Better try again" << endl;
         break;
      default :
         cout << "Invalid grade" << endl;
   }
   cout << "Your grade is " << grade << endl;
 
   return 0;
}
This would produce the following result −
You passed
Your grade is D


คลิปการตรวจสอบเงื่อนไขด้วย switch case ลอกมาจากhttps://www.youtube.com/watch?v=VN-Aij0UVdc



#include <iostream>

 

using namespace std;

 

void demo_switch() {

    cout << "1. kid" << endl;

    cout << "2. adult" << endl;

    cout << "3. senior" << endl;

    cout << "select a choice. ";

    int fare; // undefined behavior

    char choice;

    cin >> choice;

    switch (tolower(choice)) {

        case '1':

        case 'k':

//        case 'K':

        case '3':

        case 's':

//        case 'S':

            fare = 10;

            cout << "kid or senior" << endl;

            break;

        case '2':

        case 'a':

//        case 'A':

            fare = 20;

            cout << "adult" << endl;

            break;

        default:

            fare = 20;

            cout << "default fare rate" << endl;

            break;

    }

//    if (choice == '1' || tolower(choice) == 'k' || choice == '3' || tolower(choice) == 's') {

//        cout << "kid or senior" << endl;

//        fare = 10;

//    } else if (choice == '2' || tolower(choice) == 'a') {

//        cout << "adult" << endl;

//        fare = 20;

//    } else {

//        fare = 20;

//        cout << "default fare rate" << endl;

//    }

    cout << "fare = " << fare << endl;

}

 

int main() {

    demo_switch();

    return 0;

}

C++ Tutorial - 21 - Switch Statement



การใช้คำสั่ง switch...case
รูปแบบของคำสั่ง switch...case
 

การพัฒนาโปรแกรมแบบเลือกหลายทาง

โปรแกรมแบบเลือกหลายทางจะใช้สำหรับกรณีที่มีทางเลือกหลายทาง แต่ให้เลือกทำเพียงทางเลือกเดียวเท่านั้น การใช้ฟังก์ชัน switch ในการเขียนลักษณะการทำงานจึงเหมือนกับฟังก์ชัน if…else…ซ้อนกัน แต่ใช้งานได้สะดวกกว่า เหมาะอย่างยิ่งสำหรับเขียนโปรแกรม เพื่อสร้างทางเลือกรายการ (Menu) ของโปรแกรม ภาษาซีจึงมีคำสั่ง switch() สำหรับทำงานดังกล่าว และมีโครงสร้างของรูปแบบเลือกหลายทางโดยทั่วไปเขียนได้ดังนี้

 
ตามรูป แสดงว่า การทำงานจะเป็นไปตามลำดับ ดังนี้
- เริ่มให้รับค่าตัวแปรที่จะนำมาใช้ในการตรวจสอบเงื่อนไข แล้วให้ตรวจสอบเงื่อนไขตัวแปรที่รับเข้ามามีค่าตรงกับเงื่อนไขในกรณีใด กล่าวคือ
ถ้าเงื่อนไขที่ 1 เป็นจริง จะให้ทำกิจกรรมที่ 1
แล้วทำงานลำดับต่อไป
ถ้าเงื่อนไขที่ 1ไม่จริงให้ไปตรวบสอบเงื่อนไขที่ 2
ถ้าเงื่อนไขที่ 2 เป็นจริง จะให้ทำกิจกรรมที่ 2
แล้วทำงานลำดับต่อไป
ถ้าเงื่อนไขที่ 2 ไม่จริง ให้ไปตรวบสอบเงื่อนไข
อื่น ๆ ต่อไป จนถึงเงื่อนไขที่ n
ถ้าเงื่อนไขที่ n เป็นจริง จะให้ทำกิจกรรมที่ n
แล้วทำงานลำดับต่อไป
ถ้าเงื่อนไขที่ n ไม่จริงให้ไปทำกิจกรรมอื่น ๆ
ที่ระบุไว้ แล้วทำงานอื่นต่อไป
 
เราสามารถเขียนเป็นคำบรรยายเทียบกับรูปแบบของคำสั่ง switch() ดังนี้
คำบรรยาย
ตรวจสอบเงื่อนไข
กรณี 1 : ทำกิจกรรมที่ 1
กรณี 2 : ทำกิจกรรมที่ 2
.......... .....................
กรณี n : ทำกิจกรรมที่ n
อื่น ๆ : ทำกิจกรรมอื่น ๆ
จบกรณี
รูปแบบของคำสั่ง switch
switch(ชื่อตัวแปร)
{ case 1 : คำสั่งทำกิจกรรมที่ 1 ;
case 2 : คำสั่งทำกิจกรรมที่ 2 ;
......... ..................
case n : คำสั่งทำกิจกรรมที่ n ;
default : คำสั่งทำกิจกรรมอื่น ๆ ;
}
 
โดยทั่วไปการทำงานของคำสั่ง switch() จะมีอยู่ 2 รูปแบบขึ้นอยู่กับการใช้คำสั่งย่อย break หรือไม่ใช้ การทำงานจะได้ผลลัพธ์ต่างกัน แสดงตามผังงานดังนี้
จากผังงานรูปที่ 12-2 แสดงการทำงานของคำสั่ง switch() ที่ไม่มีคำสั่ง break ทำให้ทราบว่า การทำงานหลังจากตรวจสอบว่าเงื่อนไขที่ 1เป็นจริง จะทำกิจกรรมที่ 1 เสร็จแล้วจะทำกิจกรรมที่ 2 ทำกิจกรรมต่อ ๆ ไปจนถึง กิจกรรมที่ n กล่าวคือ จะทำกิจกรรมทุกกิจกรรมที่อยู่ต่อจากกิจกรรมที่ 1 แต่ถ้าเงื่อนไขที่ 1 ไม่จริง จะไปตรวจสอบเงื่อนไขที่ 2 ถ้าเงื่อนไขที่ 2 เป็นจริง จะทำกิจกรรมตั้งแต่กิจกรรมที่ 2 และทำงานตามกิจกรรมอื่น ๆ ที่อยู่ต่อจากกิจกรรมที่ 2 ด้วย การทำงานจะเป็นลักษณะเช่นนี้ต่อไปเรื่อย ๆ หรืออธิบายให้เข้าใจง่าย ๆ ก็คือ คำสั่งswitch() จะทำงานตามคำสั่งตั้งแต่ที่พบว่า การตรวจสอบเงื่อนไขใดเป็นจริงและทำต่อไปทุกคำสั่งทั้งที่เงื่อนไขอื่น อาจจะไม่จริงก็ได้ ซึ่งการทำงานมักจะไม่ถูกต้อง และไม่เป็นไปตามความต้องการของผู้ใช้
ภาษาซี จึงแก้ปัญหานี้โดยเพิ่มคำสั่ง break ต่อจากคำสั่งแต่ละชุดของเงื่อนไขนั้น ๆ การทำงานจะเป็นไปตามรูปที่ 12-3 ที่แสดงผังงานของคำสั่ง switch รูปแบบที่มีคำสั่ง break กล่าวคือ หลังจากตรวจสอบเงื่อนไขที่ 1 ทราบว่าเป็นจริง จะทำกิจกรรมที่ 1 แล้ว ออกจากคำสั่ง switch ข้ามไปทำงานตามคำสั่งที่อยู่ต่อจากคำสั่ง switch() ต่อไป เช่นเดียวกับที่ตรวจสอบเงื่อนไขที่ 2 ถ้าเป็นจริง จะทำกิจกรรมที่ 2 แล้วออกจากคำสั่งswitch() แล้วข้ามไปทำงานต่อไป ซึ่งจะสอดคล้องกับความต้องการของผู้ใช้โปรแกรมที่เมื่อเลือกกรณีใดแล้ว การทำงานก็ควรจะทำเฉพาะที่เงื่อนไขนั้นเป็นจริงเท่านั้น การทำงานของเงื่อนไขอื่น ๆ ก็ไม่ควรทำ เราจะสามารถเขียนเป็นรูปแบบของคำสั่ง switch() ทั้ง 2 รูปแบบได้ดังนี้
รูปแบบของคำสั่ง switch() กรณีไม่มีคำสั่ง break
switch (ตัวแปร)
{ case ค่าคงที่ : คำสั่งชุดที่ 1;
case ค่าคงที่ : คำสั่งชุดที่ 2;
.................. : ................
case n : คำสั่งชุดที่ n
default : คำสั่งชุดที่ n+1;
}
รูปแบบของคำสั่ง switch() กรณีมีคำสั่ง break
switch (ตัวแปร)
{ case ค่าคงที่ : คำสั่งชุดที่ 1; break ;
case ค่าคงที่ : คำสั่งชุดที่ 2; break ;
.................. : ................ ........
case n : คำสั่งชุดที่ n ; break ;
default : คำสั่งชุดที่ n+1;
}
 
เมื่อ ตัวแปร หมายถึง


ชื่อตัวแปรที่ใช้เก็บข้อมูลจากการเลือก 1 กรณี จากหลายทางเลือก แต่มีข้อจำกัด คือ
ตัวแปรนี้จะต้องเป็นชนิดตัวเลขจำนวนเต็ม (int,short,long) หรือเป็นชนิด
ตัวอักษร 1 ตัว (char) เท่านั้น
ค่าคงที่ หมายถึง
ค่าคงที่ ที่เป็นชนิดเดียวกันกับตัวแปร และเป็นค่าที่ต้องการให้โปรแกรมตรวจสอบว่า
ถ้าตัวแปรมีค่าเท่ากับค่าคงที่นี้ จะให้ทำงานตามคำสั่ง ที่อยู่ต่อจากค่าคงที่นี้
เป็นของแต่ละกรณีไป
คำสั่งชุดที่ 1 …n หมายถึง คำสั่งหรือกลุ่มของคำสั่งที่ต้องการให้ทำงานตามเงื่อนไขที่เลือก
break หมายถึง
คำสั่งที่สั่งให้ออกจาก case นั้นแล้วกลับไปทำงานต่อจากคำสั่งที่อยู่ ต่อจากคำสั่ง switch()
default หมายถึง
ส่วนที่จะให้ทำงานเมื่อไม่มีค่าของตัวแปรตรงกับเงื่อนไขใดในแต่ละ case ซึ่งส่วน
default นี้จะมีหรือไม่มีก็ได้ ถ้าไม่มี เมื่อเงื่อนไขที่เลือกไม่ตรงกับ case ใดก็จะออกจาก
คำสั่ง switch() นี้ เพื่อทำงานต่อไป