คำสั่ง switch case ในภาษา C

ในบทนี้ คุณจะได้เรียนรู้การใช้งานคำสั่ง switch case ในภาษา C สำหรับควบคุมเพื่อให้โปรแกรมสามารถทำงานแบบหลายทางเลือกจากเงื่อนไขที่กำหนด และเปรียบเทียบการใช้งานคำสั่ง switch case กับคำสั่ง if else-if ซึ่งเป็นคำสั่งที่มีการทำงานคล้ายกัน นี่เป็นเนื้อหาในบทนี้

  • คำสั่ง switch case
  • การใช้งานคำสั่ง switch case
  • การสร้างเงื่อนไขแบบ OR
  • คำสั่ง switch case กับคำสั่ง if else-if
  • ตัวอย่างโปรแกรมสัญญาณไฟจราจร

คำสั่ง switch case

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

switch (input)
{
case VALUE_1:
    // statements
    break;
case VALUE_2:
    // statements
    break;
case VALUE_3:
    // statements
    break;
default:
    // statements
}

ในการใช้งานกำหนดบล็อคด้วยคำสั่ง switch โดยส่งค่า input เพื่อนำไปตรวจสอบกับเงื่อนไข สำหรับแต่ละเงื่อนไขจะกำหนดด้วยคำสั่ง case โดยระบุ VALUE_N ที่เป็นค่าสำหรับนำไปเปรียบเทียบกับ input ในกรณีที่ค่าทั้งสองเท่ากัน โปรแกรมจะทำงานคำสั่งที่กำหนดหลังเครื่องหมายโคลอน (:) ของ case ดังกล่าว

เนื่องจากคำสั่ง switch case ไม่ได้ใช้วงเล็บ {} สำหรับกำหนดบล็อคของแต่ละ case ดังนั้นเราต้องจบการทำงานของแต่ละเงื่อนไขด้วยคำสั่ง break เสมอ ถ้าหากละเว้น โปรแกรมจะทำงานคำสั่งที่เหลือทั้งหมดของ case อื่นด้วย ซึ่งนี่สามารถใช้สำหรับสร้างเงื่อนไขแบบ OR ได้ ซึ่งเราจะพูดถึงเรื่องนี้ในภายหลัง

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

คำสั่ง switch จะเปรียบเทียบ input กับค่าของแต่ละ case ด้วยตัวดำเนินการตรวจสอบความเท่ากัน (==) และสำหรับแต่ละ case ค่าที่กำหนดจะต้องเป็นค่าคงที่ (Literal) ของตัวเลข Integer หรือ Char เท่านั้น คุณไม่สามารถใช้ค่าจากตัวแปรหรือข้อมูลประเภทอื่นๆ ได้ ยกตัวอย่างเช่น

case a:
case 1.5f:
case "hello":

ทั้งสาม case นี้เป็นการกำหนดเงื่อนไขที่ไม่ถูกต้องเนื่องจากค่าที่ใช้เป็นค่าจากตัวแปร a ตัวเลขทศนิยม และ String ซึ่งเป็นค่าที่ไม่ได้รับอนุญาติโดยคำสั่ง switch case

การใช้งานคำสั่ง switch case

ต่อไปเป็นตัวอย่างการใช้งานคำสั่ง switch case ในการเขียนโปรแกรมในภาษา C สำหรับตรวจสอบค่าของตัวเลขในตัวแปร และแสดงผลลัพธ์ออกมาเป็นคำอ่านของตัวเลขดังกล่าว นี่เป็นโค้ดการทำงานของโปรแกรม

switch_example.c
#include <stdio.h>

int main()
{
    int n = 2;
    switch (n) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    case 3:
        printf("Three\n");
        break;
    default:
        printf("Unknown\n");
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Two

เราได้ประกาศตัวแปร n สำหรับเก็บค่าของตัวเลขจำนวนเต็ม จากนั้นใช้คำสั่ง switch case เพื่อตรวจสอบค่าในตัวแปรนี้ เนื่องจากค่าในตัวแปรตรงกับเงื่อนไขที่กำหนดใน case 2 ดังนั้นโปรแกรมทำงานคำสั่งของเคสดังกล่าวโดยแสดงข้อความ "Two" ออกทางหน้าจอ

printf("Two\n");
break;

และเมื่อพบกับคำสั่ง break ถือว่าเป็นการจบการทำงานสำหรับเคส นั่นหมายความว่าคุณจะต้องใช้คำสั่งนี้ก่อนเริ่มต้นเคสใหม่เสมอ

ตอนนี้ลองเปลี่ยนค่าในตัวแปร n เป็นค่าอื่นๆ ที่ไม่ตรงกับ case ใดๆ ที่กำหนดในคำสั่ง switch case ยกตัวอย่างเช่น

int n = 5;

เราได้เปลี่ยนค่าในตัวแปรเป็น 5 และรันโปรแกรมอีกครั้ง เนื่องจากค่าในตัวแปรไม่ตรงกับเงื่อนไขใดๆ เลย โปรแกรมทำงานในบล็อคของเงื่อนไข default แทน และ "Unknown" ถูกแสดงออกทางหน้าจอ

การสร้างเงื่อนไขแบบ OR

คำสั่ง switch case สามารถใช้สำหรับสร้างเงื่อนไขแบบ OR ได้ เพื่อทำเช่นนี้เราเพียงกำหนดเคสต่อเนื่องกันและกำหนดสั่งการทำงานในเงื่อนไขสุดท้ายที่ร่วมกัน นี่เป็นตัวอย่างของระบบประเมินความพึงพอใจของหนังสือที่สามารถให้คะแนนจาก 1 - 5

book_rating.c
#include <stdio.h>

int main()
{
    int rating;

    printf("Enter 1-5 to rate this book: ");
    scanf("%d", &rating);

    switch (rating) {
    case 1:
    case 2:
        printf("Bad\n");
        break;
    case 3:
        printf("Average\n");
        break;
    case 4:
    case 5:
        printf("Good\n");
        break;
    default:
        printf("Invalid value\n");
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรมจากการรันสองครั้ง และเรากรอกค่านำเข้าเป็น 3 และ 4 ตามลำดับ

Enter 1-5 to rate this book: 3
Average
Enter 1-5 to rate this book: 4
Good

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

  • คะแนนโหวต 1-2 ประเมินผลเป็น Bad
  • คะแนนโหวต 3 ประเมินผลเป็น Average
  • คะแนนโหวต 4-5 ประเมินผลเป็น Good

จะเห็นว่าบางคะแนนนั้นให้ผลการประเมินที่เหมือนกัน และถ้าหากเงื่อนไขใดๆ มีการทำงานที่เหมือนกัน เราสามารถเขียน case เชื่อมต่อกันได้ เหมือนกับเคส 1,2 และ 4,5 ที่คุณเห็นในโปรแกรม

case 4:
case 5:
    printf("Good\n");
    break;

นั่นหมายความว่าเมื่อค่าของ rating เป็น 4 โปรแกรมจะทำงานคำสั่งของ case ใกล้ที่สุดที่มันเจอจนกว่าจะพบกับคำสั่ง break ซึ่งนี่เป็นวิธีที่เราสามารถละเว้นคำสั่ง break ในคำสั่ง switch case เนื่องจากมันสามารถใช้สำหรับสร้างเงื่อนไขแบบ OR ได้นั่นเอง

คำสั่ง switch case กับคำสั่ง if else-if

อย่างที่บอกไปแล้วในตอนต้น คำสั่ง switch case ใช้สำหรับเปรียบเทียบกับค่าที่แน่นอนเท่านั้น มันไม่สามารถใช้เปรียบเทียบกับค่าในตัวแปร หรือข้อมูลประเภทอื่นๆ นอกจาก Integer ได้ และนอกจากนี้ มันยังไม่สนับสนุนการกำหนดเงื่อนไขแบบช่วงข้อมูล

ยกตัวอย่างเช่น นี่เป็นโปรแกรมที่สามารถเขียนโดยใช้คำสั่ง if else แต่ยากที่จะเขียนโดยใช้คำสั่ง switch case เนื่องจากมันมีการตรวจสอบข้อมูลในรูปแบบของช่วงข้อมูล

if_comparison.c
#include <stdio.h>

int main()
{
    int age;
    printf("Enter your age: ");
    scanf("%d", &age);

    if (age >= 0 && age < 12) {
        printf("You're a children\n");
    } else if (age >= 12 && age < 18) {
        printf("You're a teenager\n");
    } else if (age >= 18 && age <= 100) {
        printf("You're an adult\n");
    } else {
        printf("Invalid age\n");
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรมเมื่อเรากรอกอายุเป็น 15

Enter your age: 15
You're a teenager

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

  • อายุ 0-12 เป็นเด็ก
  • อายุ 12-18 เป็นวันรุ่น
  • และอายุ 18-100 เป็นผู้ใหญ่

จะเห็นว่านี่สามารถเขียนได้อย่างง่ายดายโดยการใช้คำสั่ง if else-if ในการกำหนดเงื่อนไขแบบช่วง แต่ในการใช้คำสั่ง switch case เราจะทำแบบนี้ไม่ได้ วิธีเดียวที่จะทำได้คือการระบุ case ของอายุทั้งหมดจาก 0 - 100 แบบนี้

case 0:
case 1:
case 2:
case 3:
...
case 11:
    printf("You're a children\n");
    break;

จะเห็นว่าคุณจะต้องกำหนดทั้งหมด 12 เคสโดยการใช้เงื่อนไขแบบ OR สำหรับเงื่อนไขแรก ซึ่งนี่เป็นวิธีที่ไม่ยืดหยุ่น ดังนั้นจึงสามารถสรุปได้ว่าคำสั่ง switch case ไม่เหมาะสำหรับการตรวจสอบข้อมูลแบบช่วงของข้อมูล และเมื่อคุณพบกับปัญหาในลักษณะนี้การใช้คำสั่ง if else-if จะง่ายกว่า

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

cmp_using_if.c
#include <stdio.h>

int main()
{
    int priority = 1;

    if (priority == 0) {
        printf("Low\n");
    } else if (priority == 1) {
        printf("Medium\n");
    } else if (priority == 2) {
        printf("High\n");
    }
    return 0;
}

คุณสามารถเขียนมันโดยการใช้คำสัง switch case ได้เป็น

cmp_using_switch.c
#include <stdio.h>

int main()
{
    int priority = 1;

    switch (priority) {
    case 0:
        printf("Low\n");
        break;
    case 1:
        printf("Medium\n");
        break;
    case 2:
        printf("High\n");
        break;
    }
    return 0;
}

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

ตัวอย่างโปรแกรมสัญญาณไฟจราจร

สำหรับตัวอย่างสุดท้ายในบทนี้ เราจะมาเขียนโปรแกรมจำลองการทำงานของสัญญาณไฟจราจรที่ใช้ตัวเลขเก็บค่าของสัญญาณไฟ และแปลงมันเป็นค่าที่มีความหมายด้วยคำสั่ง switch case นี่เป็นโค้ดการทำงานของโปรแกรม

traffic_light.c
#include <stdio.h>

char *get_label(light)
{
    switch (light % 3) {
    case 0:
        return "Red";
    case 1:
        return "Orange";
    case 2:
        return "Green";
    }
}

int main()
{
    int light = 0;
    printf("Traffic light: %s\n", get_label(light));

    // Next light
    light++;
    printf("Traffic light: %s\n", get_label(light));

    light++;
    printf("Traffic light: %s\n", get_label(light));

    // Next two steps
    light += 2;
    printf("Traffic light: %s\n", get_label(light));

    // Previous light
    light--;
    printf("Traffic light: %s\n", get_label(light));
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Traffic light: Red
Traffic light: Orange
Traffic light: Green
Traffic light: Red
Traffic light: Green
Traffic light: Orange

นี่เป็นตัวอย่างจำลองการทำงานโปรแกรมสัญญาณไฟจราจรที่สามารถพบเห็นได้ทั่วไปบนท้องถนน เราได้กำหนดค่าของสัญญาณไฟเป็นตัวเลขจำนวนเต็มเก็บในตัวแปร light โดยความหมายของแต่ละค่าของตัวเลขจะเป็น

  • 0 หมายถึงสัญญาณไฟสีแดง
  • 1 หมายถึงสัญญาณไฟสีส้ม
  • 2 หมายถึงสัญญาณไฟสีเขียว

ดังนั้นเรามีฟังก์ชันสำหรับรับเอาชื่อของสัญญาณไฟจากตัวเลขของมันโดยการใช้คำสั่ง switch case สำหรับการตรวจสอบเงื่อนไข

char *get_label(light)
{
    switch (light % 3) {
    case 0:
        return "Red";
    case 1:
        return "Orange";
    case 2:
        return "Green";
    }
}

ฟังก์ชันรับสัญญาณไฟที่เป็นตัวเลขเข้ามา และในตอนส่งค่าเข้าไปยังคำสั่ง switch case เป็นการเอาเศษที่ได้จากการหารด้วย 3 (light % 3) นั่นหมายความว่าค่าที่ถูกเข้าไปจะมีค่าอยู่ระหว่าง 0 - 2 เท่านั้น และในคำสัง switch case เราสามารถใช้คำสั่ง return เพื่อส่งค่ากลับจากฟังก์ชันได้ทันที

light++;
light += 2;
light--;

ค่าของสัญญาณไฟถูกเก็บเป็นตัวเลข เนื่องจากนี่จะทำให้ง่ายในตอนคำนวณ เหมือนกับที่คุณเห็นวิธีเราเพิ่มและลดค่าในตัวแปร light และเมื่อต้องการแสดงผลมันควรเป็นค่าที่ม่ีความหมายกับผู้ใช้งาน ดังนั้นเราแปลงจากตัวเลขเป็นชื่อของสัญญาณไฟโดยการใช้คำสั่ง switch case

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับคำสั่ง switch case ในภาษา C เราได้พูดถึงการใช้งานคำสั่งสำหรับสร้างเงื่อนไขแบบมีทางเลือกให้กับโปรแกรม การสร้างเงื่อนไขแบบ OR และพูดถึงข้อดีและข้อจำกัดในการใช้งานของคำสั่ง switch case เมื่อเทียบกับคำสั่ง if else-if