STDIO Trong lập trình, chắc hẳn bạn sẽ gặp phải những vấn đề phức tạp, xuất hiện nhiều trường hợp khác nhau cần những hướng giải quyết khác nhau. Để giải quyết những trường hợp ấy dễ dàng hơn, C/C++ đã cung cấp cho chúng ta một số cấu trúc rẽ nhánh và một trong số đó chính là cấu trúc rẽ nhánh switch…case.
Nội dung bài viết

Giới thiệu

Trong lập trình, chắc hẳn bạn sẽ gặp phải những vấn đề phức tạp, xuất hiện nhiều trường hợp khác nhau cần những hướng giải quyết khác nhau. Để giải quyết những trường hợp ấy dễ dàng hơn, C/C++ đã cung cấp cho chúng ta một số cấu trúc rẽ nhánh và một trong số đó chính là cấu trúc rẽ nhánh switch…case.

Tiền đề bài viết

Trong quá trình trao đổi kinh nghiệm với một số lập trình viên mới bước chân vào lập trình, tôi nhận thấy rằng họ không thường xuyên hoặc thậm chí là không dùng cấu trúc rẽ nhánh switch..case. Điều này xảy ra do một số lí do như: không biết đến cấu trúc này, không thường xuyên dùng nên không hiểu bản chất và cách dùng switch…case như thế nào,… Vì thế, bài viết này ra đời để giới thiệu cấu trúc switch…case đến với mọi người.

Đối tượng hướng đến

Bài viết hướng đến những lập trình viên mới bắt đầu học lập trình căn bản, những lập trình viên khác có thể xem bài viết như là một tài liệu tham khảo.

Cấu trúc rẽ nhánh switch…case

Switch so sánh một biểu thức nguyên với một danh sách giá trị các số nguyên, các hằng kí tự hoặc biểu thức hằng. Mỗi giá trị trong danh sách chính là một case (trường hợp) trong khối lệnh của switch. Ngoài ra, trong khối lệnh switch còn có thể có một default case (trường hợp mặc định) có thể có hoặc không. Mặt khác, trong mỗi trường hợp còn chứa các khối lệnh chờ được thực thi.

Cú pháp của cấu trúc rẽ nhánh switch…case

Muốn sử dụng cấu trúc switch…case, bạn dùng cú pháp như sau:

switch (expression)
{
    case constant_1:
    {
        Statements;
        break;
    }
    case constant_2:
    {
        Statements;
        break;
    }
    .
    .
    .
    case constant_n:
    {
        Statements;
        break;
    }
    default:
    {
        Statements;
    }
}

Ví dụ:

#include <iostream.h>
using namespace std;

int main()
{
    int month;
    cout << "Month: " << endl;
    cin >> month;

    switch (month)
    {
        case 1:
        {
            cout << "January" << endl;
            break;
        }
        case 2:
        {
            cout << "February" << endl;
            break;
        }
        case 3:
        {
            cout << "March" << endl;
            break;
        }
        case 4:
        {
            cout << "April" << endl;
            break;
        }
        case 5:
        {
            cout << "May" << endl;
            break;
        }
        case 6:
        {
            cout << "June" << endl;
            break;
        }
        case 7:
        {
            cout << "July" <<endl;
            break;
        }
        case 8:
        {
            cout << "August" << endl;
            break;
        }
        case 9:
        {
            cout << "September" << endl;
            break;
        }
        case 10:
        {
            cout << "October" << endl;
            break;
        }
        case 11:
        {
            cout << "November" << endl;
            break;
        }
        case 12:
        {
            cout << "December" << endl;
            break;
        }
        default:
        {
            cout << "Input is false" << endl;
        }
    }

    return 0;
}

Nguyên tắc hoạt động cấu trúc switch…case

Biểu thức nguyên trong switch được tính toán và kiểm tra lần lượt với giá trị của từng case. Đầu tiên, nó sẽ được so sánh với giá trị của case đầu tiên, nếu bằng nhau thì sẽ thực hiện các lệnh (statement) trong case này cho đến khi nó gặp được từ khoá break. Khi đó, cấu trúc switch…case kết thúc. Chương trình sẽ thực hiện tiếp những dòng lệnh sau cấu trúc switch…case. Ngược lại, nếu như giá trị biểu thức nguyên không bằng giá trị case đầu tiên thì nó sẽ tiếp tục so sánh đến giá trị của case thứ hai và tiếp tục thực hiện như những bước trên. Giả sử, đến cuối cùng vẫn không tìm được giá trị bằng nó thì các khối lệnh trong default sẽ được thực hiện nếu như có tồn tại default.

Ta có sơ đồ hoạt động của cấu trúc switch…case như sau:

ss_1

Một số lưu ý khi dùng cấu trúc rẽ nhánh switch…case

  • Các giá trị của mỗi case phải cùng kiểu dữ liệu với giá trị của biểu thức được so sánh.
  • Số lượng các case là không giới hạn nhưng chỉ có thể có duy nhất một default.
  • Giá trị của các case là một hằng số và các giá trị của các case phải khác nhau.
  • Từ khóa break có thể sử dụng hoặc không. Nếu không được sử dụng thì chương trình sẽ không kết thúc cấu trúc switch…case khi đã thực hiện hết khối lệnh của case đó. Thay vào đó, nó sẽ thực hiện tiếp các khối lệnh tiếp theo cho đến khi gặp từ khoá break hoặc dấu “ } “ cuối cùng của cấu trúc switch…case. Vì vậy, các bạn có thể sử dụng một khối lệnh cho nhiều trường hợp khác nhau.

Ví dụ:

 #include <iostream.h>
using namespace std;

int main()
{
        int month, day;
        cout << "Month: " << endl;
        cin >> month;

        switch (month)
        {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
            {
                day = 30;
                break;
            }
            case 4:
            case 6:
            case 9:
            case 11:
            {
                day = 31;
                break;
            }
            default:
            {
                day = 28;
            }
        }

        return 0;
}
THẢO LUẬN
ĐÓNG