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

目次

1. บทนำ: คำสั่งเงื่อนไข (Conditional Statements) ในภาษา C คืออะไร?

ความสำคัญและบทบาทของคำสั่งเงื่อนไข

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

พื้นฐานของคำสั่งเงื่อนไขในภาษา C

ในภาษา C มีวิธีการหลัก 2 วิธีในการสร้างเงื่อนไข:

  1. if-else statement
  2. switch-case statement

ในบรรดาวิธีเหล่านี้ switch-case เหมาะสำหรับการจัดการหลายเงื่อนไขได้อย่างมีประสิทธิภาพ โดยเฉพาะเมื่อมีตัวเลือกที่ชัดเจน

บทบาทและสถานการณ์ที่ใช้ switch-case

switch-case เป็นโครงสร้างควบคุมที่ใช้ในการเลือกการทำงานตามค่าของตัวแปร เหมาะสำหรับสถานการณ์ดังนี้:

  • โปรแกรมเลือกเมนู
  • การจัดหมวดหมู่ตามตัวเลขหรือตัวอักษร
  • การจัดการสถานะอย่างง่าย

ตัวอย่างสถานการณ์การใช้งาน

เช่น โปรแกรมที่ทำงานต่างกันตามหมายเลขเมนู หากผู้ใช้เลือก “1” โปรแกรมจะแสดง “เริ่มต้น” และหากเลือก “2” จะแสดง “สิ้นสุด”

ข้อดีของการเรียนรู้ switch-case

  • โค้ดกระชับและอ่านง่าย
  • ช่วยจัดระเบียบเงื่อนไขได้ชัดเจน ลดความผิดพลาด
  • เพิ่มประสิทธิภาพของโปรแกรม

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

2. โครงสร้างพื้นฐานและการใช้งาน switch-case

โครงสร้างพื้นฐาน

ตัวอย่างโครงสร้างพื้นฐานของ switch-case:

switch (expression) {
    case ค่าที่1:
        // คำสั่งที่1
        break;
    case ค่าที่2:
        // คำสั่งที่2
        break;
    default:
        // คำสั่งอื่น ๆ
}

โค้ดตัวอย่าง: โปรแกรมตรวจสอบวันในสัปดาห์

#include <stdio.h>

int main() {
    int day;
    printf("กรุณาใส่ตัวเลขวัน (1〜7): ");
    scanf("%d", &day);

    switch (day) {
        case 1:
            printf("วันจันทร์\n");
            break;
        case 2:
            printf("วันอังคาร\n");
            break;
        case 3:
            printf("วันพุธ\n");
            break;
        case 4:
            printf("วันพฤหัสบดี\n");
            break;
        case 5:
            printf("วันศุกร์\n");
            break;
        case 6:
            printf("วันเสาร์\n");
            break;
        case 7:
            printf("วันอาทิตย์\n");
            break;
        default:
            printf("ข้อมูลไม่ถูกต้อง\n");
    }

    return 0;
}

จุดสำคัญของตัวอย่างนี้

  • การใช้ break หลังแต่ละ case เพื่อควบคุมลำดับการทำงาน
  • การใช้ default เพื่อรองรับกรณีที่ผู้ใช้ใส่ค่าที่ไม่ถูกต้อง

ข้อดีของการใช้ switch-case

  • อ่านง่ายขึ้น: เงื่อนไขถูกเขียนแบบเรียบง่ายและชัดเจน
  • ลดจำนวนโค้ด: สามารถจัดการหลายเงื่อนไขของตัวแปรเดียวได้อย่างกระชับ
  • ลดข้อผิดพลาด: สามารถจัดการอินพุตที่ไม่คาดคิดได้ง่าย
年収訴求

3. คุณสมบัติและข้อควรระวังของ switch-case

คุณสมบัติ 1: เรียบง่ายและอ่านง่าย

switch-case ช่วยให้การจัดการหลายเงื่อนไขเป็นไปอย่างกระชับและอ่านง่าย

คุณสมบัติ 2: ใช้กับค่าประเภทจำนวนเต็มและตัวอักษร

switch-case ถูกออกแบบมาเพื่อใช้กับค่า int และ char

ข้อควรระวัง

1. อย่าลืมใส่ break

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
    case 2:
        printf("Two\n");
    default:
        printf("Other\n");
}

ผลลัพธ์:

One  
Two  
Other

วิธีแก้ไข:

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    default:
        printf("Other\n");
}

2. ใช้ได้เฉพาะค่าคงที่ (constant)

int x = 10;
switch (x) {
    case x:  // error
        printf("เกิดข้อผิดพลาด\n");
        break;
}

เวอร์ชันแก้ไข:

#define VALUE 10
switch (x) {
    case VALUE:
        printf("สำเร็จ\n");
        break;
}

สรุป

  • อย่าลืม break – ป้องกันการไหลต่อ (fall-through) โดยไม่ตั้งใจ
  • ใช้เฉพาะค่าคงที่ – ไม่สามารถใช้ตัวแปรหรือ expression ได้
  • จัดโครงสร้างให้เป็นระเบียบ – ใช้คอมเมนต์และการเว้นบรรทัดเพื่อให้อ่านง่าย

4. การเลือกใช้ if-else กับ switch-case: ควรเลือกแบบไหน?

ความแตกต่างพื้นฐาน

1. วิธีการประเมินเงื่อนไข

  • if-else ใช้ตรวจสอบเงื่อนไขเชิงตรรกะ เช่น การเปรียบเทียบหรือหลายเงื่อนไขซับซ้อน
  • switch-case ใช้ตรวจสอบค่าที่แน่นอน (เช่น ค่าคงที่หรือตัวอักษร) เท่านั้น

ตารางเปรียบเทียบ

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

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

ตัวอย่าง if-else:

int score = 85;

if (score >= 90) {
    printf("ดีมาก\n");
} else if (score >= 70) {
    printf("ดี\n");
} else {
    printf("พอใช้\n");
}

ตัวอย่าง switch-case:

int grade = 2;

switch (grade) {
    case 1:
        printf("ดีมาก\n");
        break;
    case 2:
        printf("ดี\n");
        break;
    case 3:
        printf("พอใช้\n");
        break;
    default:
        printf("ไม่ผ่าน\n");
}

5. ตัวอย่างการประยุกต์ใช้ switch-case

1. รวมหลาย case เข้าด้วยกัน

char grade = 'A';

switch (grade) {
    case 'A':
    case 'B':
        printf("ผ่าน\n");
        break;
    case 'C':
        printf("สอบใหม่\n");
        break;
    default:
        printf("ไม่ผ่าน\n");
}

2. ใช้ประโยชน์จากการ fall-through

int score = 85;

switch (score / 10) {
    case 10:
    case 9:
        printf("ยอดเยี่ยม\n");
        break;
    case 8:
    case 7:
        printf("ดี\n");
        break;
    default:
        printf("ไม่ผ่าน\n");
}

3. switch-case ซ้อนกัน

int menu = 1;
int subMenu = 2;

switch (menu) {
    case 1:
        switch (subMenu) {
            case 1:
                printf("เมนูย่อย 1-1\n");
                break;
            case 2:
                printf("เมนูย่อย 1-2\n");
                break;
        }
        break;
    case 2:
        printf("เมนู 2\n");
        break;
}

6. ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1. ลืมใส่ break

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
    case 2:
        printf("Two\n");
    default:
        printf("Other\n");
}

วิธีแก้ไข:

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    default:
        printf("Other\n");
}

2. ใช้ตัวแปรใน case แทนค่าคงที่

int x = 10;
switch (x) {
    case x:  // error
        printf("ค่าคือ 10\n");
        break;
}

เวอร์ชันแก้ไข:

#define VALUE 10
switch (x) {
    case VALUE:
        printf("สำเร็จ\n");
        break;
}

3. ละเว้น default

int num = 5;

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
}

วิธีแก้ไข:

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    default:
        printf("Other\n");
}

 

7. สรุปและก้าวต่อไป

1. สรุปประเด็นสำคัญ

  1. โครงสร้างพื้นฐานและการใช้งาน
  • switch-case เป็นโครงสร้างควบคุมที่ช่วยให้เลือกทำงานตามค่าที่กำหนดได้สะดวก
  • โค้ดอ่านง่าย เหมาะกับการแยกเงื่อนไขชัดเจน
  1. คุณสมบัติและข้อควรระวัง
  • switch-case ใช้ได้เฉพาะค่าคงที่ประเภทจำนวนเต็มหรืออักขระ
  • หากลืม break จะทำให้เกิดการไหลต่อ (fall-through) โดยไม่ตั้งใจ
  1. การเลือกใช้กับ if-else
  • if-else เหมาะกับเงื่อนไขซับซ้อนหรือช่วงค่า
  • switch-case เหมาะกับค่าที่แน่นอน เช่น ตัวเลือกเมนู
  1. การประยุกต์ใช้
  • รวมหลาย case เข้าด้วยกัน หรือใช้ fall-through เพื่อประเมินช่วงค่า
  • ซ้อน switch-case หรือใช้ร่วมกับฟังก์ชันเพื่อจัดการโค้ดที่ซับซ้อน
  1. ข้อผิดพลาดและวิธีแก้ไข
  • ข้อผิดพลาดที่พบบ่อย เช่น ลืม break, ใช้ตัวแปรใน case, ละเว้น default
  • การเข้าใจแนวทางแก้ไขช่วยให้ดีบักได้ง่ายขึ้น

2. ก้าวต่อไป

1. ทดลองสร้างโปรแกรมจริง
ลองสร้างโปรแกรม เช่น:

  • เครื่องคิดเลข: ใช้ switch-case สำหรับการคำนวณ
  • แอปเลือกเมนู: สร้างเมนูหลายระดับและควบคุมการทำงาน
  • ระบบจัดการผลการเรียน: แบ่งเกรดอัตโนมัติตามคะแนน

2. เรียนรู้หัวข้อที่เกี่ยวข้อง
เพื่อพัฒนาเพิ่มเติม:

  • if-else ขั้นสูง: เทคนิคเพิ่มเติมในการเขียนเงื่อนไข
  • ลูป (for, while): รวมการทำซ้ำกับการใช้เงื่อนไข
  • ฟังก์ชันและโครงสร้างข้อมูล (struct): สำหรับโปรแกรมขนาดใหญ่

3. การปรับปรุงและดีบักโค้ด

  • ใช้เครื่องมือ debug: เพื่อหาข้อผิดพลาดและแก้ไขอย่างรวดเร็ว
  • ทำ code review: แลกเปลี่ยนความคิดเห็นเพื่อเพิ่มคุณภาพโค้ด

3. บทสรุป

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

คุณสามารถพัฒนาทักษะได้อย่างมั่นใจด้วยการฝึกเขียนโค้ดจริง และก้าวไปสู่การเรียนรู้หัวข้อขั้นสูงเพื่อยกระดับทักษะการเขียนโปรแกรมของคุณ

侍エンジニア塾