Lập trình C: Bài 5 – if else, switch case trong C

Trong cuộc sống có rất nhiêu điều chúng ta phải lựa chọn, ví như lựa chọn giữa người ta yêu và người yêu ta, chọn nghe theo con tim hay là lý trí,… Nếu hôm nay được nghỉ thì sẽ ở nhà học hay là đi chơi, nếu có người yêu thì ngồi code hay đi mua kem cùng ăn ngoài cổng trường, vân vân và mây mây. Và lập trình là đi từ cuộc sống, phục vụ cuộc sống nên nó cũng phải có những thứ như vậy. Bài này chúng ta sẽ tìm hiểu về các lệnh để phục vụ những lựa chọn như vậy, các lệnh này gọi là lệnh rẽ nhánh.

Trước khi tìm hiểu về cấu trúc các lệnh rẽ nhánh, chúng ta nên tìm hiểu một chút về lệnh đơn và khối lệnh.

1. Lệnh và khối lệnh

Lệnh là một tác vụ, biểu thức, hàm, cấu trúc điều khiển… nào đó đơn lẻ.

Ví dụ:

x = x + 2; // đây là một lệnh đơn 
printf("Day la mot lenh\n");  // đây cũng là một lệnh đơn.

Khối lệnh: là một dãy các câu lệnh được bọc bởi cặp dấu { }.

Ví dụ:

{ //dau khoi
    a = 78;
    b = 26;
    printf("Tong %d + %d = %d", a, b, a+b);
} //cuoi khoi

Khi muốn thực hiện một dãy các câu lệnh liên tiếp nào đó thì chúng ta dùng khối lệnh, tức là đặt chúng vào cặp dấu {} và viết thụt vào 1 tab cho dễ nhìn.

Lưu ý: Khi một lệnh được đặt trong cặp ngoặc {} thì cũng được coi là khối lệnh.

2. Lệnh if và if else

2.1 Lệnh if

Lệnh if dịch ra có nghĩa là nếu cái này thì làm cái kia. Ví dụ nếu bạn có người yêu thì chắc bạn sẽ đi chơi cùng ẻm chứ không ngồi xem bài của mình…

Cú pháp của lệnh if

Lệnh if

Cú pháp, lưu đồ và cách hoạt động của lệnh if

Chú ý:
Không đặt dấu chấm phẩy sau câu lệnh if. Ví dụ: if (a > 0);
Khi đặt dấu chấm phẩy ở lệnh if thì coi như kết thúc lệnh if tại đó nên khối lệnh sẽ không được thực hiện dù điều kiện đúng hay sai.

Ví dụ: Ban đầu bạn có 100 (tỷ), hãy nhập vào một số tiền. Nếu số tiền là số dương thì cộng thêm vào ví của bạn ngược lại thì không làm gì cả. In ra số tiền bạn có sau khi nhập.

#include <stdio.h>

int main()
{     
    int x = 100; // So tien ban dau ban co
    int y; // so tien nhap moi

    printf("Nhap so tien = ");
    scanf("%d", &y);

    if( y > 0 ) // neu so tien nhap vao lon hon 0 thi cong vao vi
    {
        x = x + y;
    }

    printf("So tien sau = %d \n", x);

    return 0;
}

Thật đơn giản. Bạn chạy chương trình và xem cách nó hoạt động nhé.

2.2 Lệnh if – else

Lệnh if-else là dạng đủ của lệnh if. if là nếu, else là ngược lại.

Cú pháp lệnh if – else

Lệnh if else

Cú pháp, lưu đồ và cách hoạt động lệnh if – else

Ví dụ: Tương tự ví dụ trên. Ban đầu bạn có 100 (tỷ), vợ bạn có 50 (tỷ), hãy nhập vào một số tiền. Nếu số tiền là số dương thì cộng thêm vào ví của bạn một nửa, của vợ bạn một nửa, ngược lại thì chỉ cộng vào ví của bạn (bản chất là trừ đi vì số tiền có thể âm hoặc bằng 0). In ra số tiền bạn và vợ bạn có sau khi nhập.

#include <stdio.h>

int main()
{
    float x = 100, y = 50; // So tien ban va vo ban co
    float z; // so tien nhap moi

    printf("Nhap so tien = ");
    scanf("%f", &z);

    if( z > 0 ) // neu so tien nhap vao lon hon 0 thi cong vao vi
    {
        x = x + z / 2;
        y = y + z / 2;
    } else 
    {
        x = x + z;
    }

    printf("So tien cua ban = %.2f \n", x);
    printf("So tien cua vo ban = %.2f \n", y);

    return 0;
}

Khá là đơn giản. Bạn thử chạy và xem kết quả nhé. (Ở bài này mình dùng kiểu float vì có phép chia nên số tiền có thể lẻ).

2.3 Lệnh if else lồng nhau và if-else-if

Trong nhiều trường hợp, chúng ta cần phải xử lý nhiều điều kiện chứ không chỉ có 1 điều kiện. Do vậy chúng ta có thể lồng nhiều câu lệnh if else vào với nhau.

Ví dụ: Công ty đang triển khai một loại cân sao cho cân theo cặp phục vụ cho cân các cặp tình nhân, và thông báo ra bạn trai nặng hơn hay bạn gái nặng hơn hay hai bạn nặng bằng nhau.

Như vậy chúng ta cần xử lý 3 trường hợp chứ không phải chỉ đơn giản là nếu và ngược lại nữa. Chúng ta có code như sau:

#include <stdio.h>

int main()
{
    float a; // can nang cua ban trai
    float b; // can nang cua ban gai

    printf("Nhap vao can nang ban trai va ban gai: \n");
    scanf("%f%f", &a, &b);

    if( a > b )
    {
        printf("Ban trai nang hon!\n");
    } else 
    {
        if( a < b)
        {
            printf("Ban gai nang hon\n");
        } else
        {
            printf("Hai ban nang bang nhau\n");
        }
    }

    return 0;
}

Ok. Vậy là chúng ta sử dụng được chúng lồng vào nhau. Tuy nhiên cách này sẽ làm code hơi rối và tốn giấy mực. Bạn có thể sử dụng lệnh if-else-if như sau:

#include <stdio.h>

int main()
{
    float a; // can nang cua ban trai
    float b; // can nang cua ban gai

    printf("Nhap vao can nang ban trai va ban gai: \n");
    scanf("%f%f", &a, &b);

    if( a > b )
    {
        printf("Ban trai nang hon!\n");
    } else if( a < b)
    {
        printf("Ban gai nang hon\n");
    } else
    {
        printf("Hai ban nang bang nhau\n");
    }

    return 0;
}

Cách code và ý nghĩa cũng rất rõ ràng, dễ hiểu thôi :).

2.4 Toán tử điều kiện – If else rút gọn

Chúng ta có một toán tử rút gọn của lệnh if else như sau:

điều kiện ? biểu thứ 1: biểu thức 2;

Nếu điều kiện đúng thì biểu thức 1 được thực hiện và giá trị của biểu thức 1 là giá trị của toàn bộ lệnh. Nếu điều kiện sai thì biểu thức 2 được thực hiện và giá trị của biểu thức 2 trở thành giá trị của toàn bộ lệnh.

Ví dụ:

#include <stdio.h>

int main()
{
    int x = 3;
    int y = 4;
    int z;

    z = x > y ? x : y;

    printf("z = %d\n", z);

    x = x > y ? x : 100;

    printf("x = %d\n", x);

    return 0;
}

Kết quả sau khi chạy chương trình:

z = 4
x = 100

Như vậy ta thấy biểu thức 2 và biểu thức 3 có thể là 1 giá trị biến, hằng, hoặc một hàm nào đó có trả về giá trị.

2. Lệnh switch case

Lệnh switch cũng giống cấu trúc if, nhưng nó mềm dẻo hơn và linh động hơn nhiều so với sử dụng if. Tuy nhiên, nó cũng có mặt hạn chế là kết quả của biểu thức phải là giá trị hằng nguyên (có giá trị cụ thể). Một bài toán sử dụng lệnh switch thì cũng có thể sử dụng if, nhưng ngược lại thì còn tùy thuộc vào giải thuật của bài toán.

Cấu trúc lệnh switch case

Lệnh switch case

Cú pháp, lưu đồ và cách hoạt động lệnh switch case

Ví dụ: Nhập vào 1 số từ 1->5 và in ra cách đọc tương ứng:

#include <stdio.h>

int main()
{
    int a;
    printf("Nhap a = ");
    scanf("%d",&a);

    switch(a)
    {
        case 1: printf("Mot\n"); 
                break;
        case 2: printf("Hai\n"); 
                break;
        case 3: printf("Ba\n"); 
                break;
        case 4: printf("Bon\n"); 
                break;
        case 5: printf("Nam\n"); 
                break;
    }

    return 0;
}

Các bạn chạy thử, và thử bỏ một vài lệnh break xem nó ra sao nhé.

Ngoài ra, chúng ta có cấu trúc switch-case-default nữa. Nguyên lý hoạt động giống như switch-case nhưng nếu các trường hợp đều không thỏa mãn thì sẽ thực hiện lệnh của trường hợp default (dịch là trường hợp mặc định).

#include <stdio.h>

int main()
{
    int a;
    printf("Nhap a = ");
    scanf("%d",&a);

    switch(a)
    {
        case 1: printf("Mot\n"); 
                break;
        case 2: printf("Hai\n"); 
                break;
        case 3: printf("Ba\n"); 
                break;
        case 4: printf("Bon\n"); 
                break;
        case 5: printf("Nam\n"); 
                break;
        default: printf("Ban da nhap mot so khac\n");
                break;
    }

    return 0;
}

3. Khi nào dùng if-else, khi nào dùng switch-case

Như mình đã nói ở trên, lệnh switch case có tính mềm dẻo và linh động hơn if else, cách viết cũng thoáng và khó nhầm hơn if else nhưng một bài dùng được switch case thí chắc chắn dùng được bằng if else còn khi dùng if else lại chưa chắc dùng được bằng switch case.

Vậy các bạn nên dùng switch case khi:

  • Số lượng điều kiện là lớn như dạng menu chọn,… -> switch case viết sẽ lạch mạc, dễ kiểm soát.
  • Các trường hợp điều kiện phải có giá trị là số nguyên hoặc ký tự.

Các trường hợp còn lại, các bạn hãy dùng if – else.

Bài tập:

  1. Viết chương trình nhập vào 4 số nguyên. Tìm và in ra số lớn nhất.
    Hướng dẫn: Ta có 4 số nguyên a, b, c, d. Tìm 2 số nguyên lớn nhất x, y của 2 cặp (a, b) và (c, d). Sau đó so sánh x và y để tìm ra số nguyên lớn nhất.

  2. Hãy nhập vào một số là 1 tháng trong năm, in ra xem tháng đó có bao nhiêu ngày. (Coi như không có năm nhuận).

  3. Hãy lập trình chương trình giải phương trình bậc 2: ax^{2} + bx + c = 0 với a, b, c nhập từ bàn phím.

  4. Viết chương trình nhập vào 3 giá trị nguyên dương a, b, c. Kiểm tra xem a, b, c có phải là 3 cạnh của tam giác không? Nếu là 3 cạnh của tam giác thì tính diện tích của tam giác theo công thức:

    S = \sqrt{p(p-a)(p-b)(p-c)} với p là nửa chu vi tam giác. p = \frac{a+b+c}{2}

  5. Viết chương trình tính tiền điện gồm các điều kiện sau:

  • Tiền thuê bao điện kế: 1000đ/tháng
  • Định mức sử dụng điện cho mỗi hộ là: 50 KW với giá 230đ/KW
  • Nếu phần vượt định mức <= 50KW thì tính giá 480đ/KW
  • Nếu 50KW < phần vượt định mức < 100KW thì tính giá 700đ/K
  • Nếu phần vượt định mức >= 100KW thì tính giá 900đ/KW

    Chỉ số mới và cũ được nhập vào từ bàn phím. In ra màn hình chỉ số cũ, chỉ số mới, tiền trả định mức, tiền trả vượt định mức, tổng tiền phải trả.