Câu lệnh điều kiện & rẽ nhánh trong C

Toán tử trong Ngôn ngữ C

Toán tử là một số ít những kí hiệu nhằm mục đích giúp C thực thi phép toán học nhất định. Ngôn ngữ C có sẵn rất nhiều toán tử và phân phối những kiểu toán tử sau đây :

  • Toán tử số học
  • Toán tử gán
  • Toán tử quan hệ
  • Toán tử logic
  • Toán tử bit
  • Toán tử hỗn hợp

Toán tử số học (Arithmetic Operators)

Toán tử số học là một loại toán tử được sử dụng thực hiện các phép toán: cộng, trừ, nhân, chia,… trên các giá trị số (biến và hằng). Đây là các toán tử cần sự tham gia của 2 giá trị số nên được phân loại là các toán tử 2 ngôi.

TOÁN TỬ Ý NGHĨA
+ phép toán cộng
phép toán trừ
* phép toán nhân
/ phép toán chia
% phép toán lấy số dư(chỉ áp dụng cho số nguyên)

Ví dụ code minh hoạ:

#include 
 
int main(){
    int a, b;
    printf("\nNhap a = "); scanf("%d", &a); 
    // Lưu ý nhập b != 0
    printf("\nNhap b = "); scanf("%d", &b); 
 
    // Phép (+)
    int sum = a + b;
    printf("\n%d + %d = %d", a, b, sum);
 
    // Phép (-)
    int sub = a - b;
    printf("\n%d - %d = %d", a, b, sub);
 
    // Phép (*)
    int mul = a * b;
    printf("\n%d * %d = %d", a, b, mul);
 
    // Phép (/)
    float div = a / (float)b;
    // float div = a / b * 1.0;
    // float div = (float)a / b;
    // float div = (float)(a / b); // do not use
    printf("\n%d / %d = %f", a, b, div);
 
    // Phép (%)
    int mod = a % b;
    printf("\n%d %% %d = %d", a, b, mod);
}

Toán tử tăng, giảm (Increment and Decrement)

Toán tử tăng, giảm là toán tử 1 ngôi, gồm có 2 toán tử sau :

  • Toán tử + +: Tăng giá trị lên 1 đơn vị.
  • Toán tử 

    – –

    : Giảm giá trị đi 1 đơn vị.

  • Với a++ và a- -: Chương trình sẽ thực hiện lệnh với a sau đó mới thực hiện tăng và giảm biến a.
  • Với ++a và – -a: Chương trình sẽ thực hiện tăng/giảm biến a sau đó mới thực hiện lệnh.

Ví dụ code minh hoạ:

#include 
 
int main(){
    int a;
    printf("\nNhap a = "); scanf("%d", &a);
    // Toán tử ++
    ++a;
    printf("\na++ = %d", a);
 
 
    // // Toán tử --
    --a;
    printf("\na-- = %d", a);
 
    a = 5;
    printf("\na = %d", a);
 
    // Tiền tố và hậu tố a++ và ++a
    printf("\n++a = %d", ++a);
    a = 5;
    printf("\n--a = %d", --a);
    a = 5;
    printf("\na++ = %d", a++);
    a = 5;
    printf("\na-- = %d", a--);
}

Toán tử gán (Assignment Operators)

Toán tử gán dùng để gán 1 giá trị cho 1 biến. Bao gồm các toán tử sau:
Cú pháp:  = ; hoặc  = ;

TOÁN TỬ VIẾT GỌN VIẾT ĐẦY ĐỦ
= a = b a = b
+= a += b a = a+b
-= a -= b a = a-b
*= a *= b a = a*b
/= a /= b a = a/b
%= a %= b a = a%b

Ví dụ code minh hoạ:

#include 
 
int main(){
    int a = 5, c;
    c = a;      // c is 5
    printf("c = %d\n", c);
    c += a;     // c is 10 => c = c + a
    printf("c = %d\n", c);
    c -= a;     // c is 5 => c = c - a
    printf("c = %d\n", c);
    c *= a;     // c is 25 => c = c * a
    printf("c = %d\n", c);
    c /= a;     // c is 5 => c = c / a
    printf("c = %d\n", c);
    c %= a;     // c = 0 => c = c % a
    printf("c = %d\n", c);
 
    // return 0;
}

Toán tử quan hệ (Relational Operators) hay toán tử so sánh

Toán tử quan hệ hay so sánh sử dụng những phép toán so sánh giữa những số, biến và hằng. Giá trị trả về là logic ( true hoặc false tương ứng với 1 hoặc 0 ) .

TOÁN TỬ Ý NGHĨA VÍ DỤ
== so sánh bằng 7 = = 3 cho kết quả là 0
> so sánh lớn hơn 5 > 1 cho kết quả là 1
< so sánh nhỏ hơn 5 < 2 cho kết quả là 0
!= so sánh khác 5 ! = 4 cho kết quả là 1
>= lớn hơn hoặc bằng

8 >= 3 

cho kết quả là 1

<= nhỏ hơn hoặc bằng 5 < = 0 cho kết quả là 0

Ví dụ code minh hoạ:

#include 
 
int main(){
 
    int a = 5, b = 5, c = 10;
    printf("%d == %d is %d \n", a, b, a == b);
    printf("%d == %d is %d \n", a, c, a == c);
    printf("%d > %d is %d \n", a, b, a > b);
    printf("%d > %d is %d \n", a, c, a > c);
    printf("%d < %d is %d \n", a, b, a < b);
    printf("%d < %d is %d \n", a, c, a < c);
    printf("%d != %d is %d \n", a, b, a != b);
    printf("%d != %d is %d \n", a, c, a != c);
    printf("%d >= %d is %d \n", a, b, a >= b);
    printf("%d >= %d is %d \n", a, c, a >= c);
    printf("%d <= %d is %d \n", a, b, a <= b);
    printf("%d <= %d is %d \n", a, c, a <= c);
}

Toán tử logic (Logical Operators)

Toán tử logic là một toán tử trong C. Toán tử logic gồm có những toán tử sau :

  • Toán tử và và: là toán tử

    AND

    , trả về true khi và chỉ khi tất cả các toán hạng đều đúng.

  • Toán tử 

    ||

    : là toán tử

    OR

    , trả về true khi có ít nhất 1 toán hạng đúng.

  • Toán tử 

    !

    : là toán tử

    NOT

    , phủ định giá trị của toán hạng.

Ví dụ code minh hoạ:

#include 
 
int main(){
    int a = 5;
    printf("\n%d", (a > 0 && a % 2 == 0));
    //              1   &&  0 = 0
    printf("\n%d", (a % 2 == 0 || a % 5 == 0));
    //                  0     ||  1 = 1
 
    printf("\n%d", !(a == 5));
 
 
    // Tại sao không dùng & hay |?
 
    int b = 5;
    // dấu ||
    printf("\n%d", (b == 5 || b++ > 0));
    printf("\nb = %d", b);
    b = 5;
    printf("\n%d", (b == 5 | b++ > 0));
    printf("\nb = %d", b);
 
    // dấu ||
    b = 5;
    printf("\n%d", (b != 5 && b++ > 0));
    printf("\nb = %d", b);
    b = 5;
    printf("\n%d", (b != 5 & b++ > 0));
    printf("\nb = %d", b);
}

Toán tử thao tác bit (Bitwise Operators)

Các toán tử dạng bit cho phép chúng ta thao tác trên từng bit riêng biệt trong các kiểu dữ liệu nguyên thủy. Giả sử A = 60 (= 0011 1100) và B = 13 (= 0000 1101).

Toán tử Miêu tả Ví dụ
& Toán tử AND (và) nhị phân sao chép một bit tới kết quả nếu nó tồn tại trong cả hai toán hạng. (A & B) sẽ cho kết quả là 12, tức là 0000 1100
| Toán tử OR (hoặc) nhị phân sao chép một bit tới kết quả nếu nó tồn tại trong một hoặc hai toán hạng. (A | B) sẽ cho kết quả là 61, tức là 0011 1101
^ Toán tử XOR nhị phân sao chép bit mà nó chỉ tồn tại trong một toán hạng mà không phải cả hai. (A ^ B) sẽ cho kết quả là 49, tức là 0011 0001
~ Toán tử đảo bit (đảo bit 1 thành bit 0 và ngược lại). (~A ) sẽ cho kết quả là -61, tức là 1100 0011.
<< Toán tử dịch trái. Giá trị toán hạng trái được dịch chuyển sang trái bởi số các bit được xác định bởi toán hạng bên phải. A << 2 sẽ cho kết quả 240, tức là 1111 0000 (dịch sang trái hai bit)
>> Toán tử dịch phải. Giá trị toán hạng trái được dịch chuyển sang phải bởi số các bit được xác định bởi toán hạng bên phải. A >> 2 sẽ cho kết quả là 15, tức là 0000 1111 (dịch sang phải hai bit)

Toán tử hỗn hợp trong C

Có một số toán tử hỗn hợp quan trọng là sizeof và ? : được hỗ trợ bởi ngôn ngữ C.

Toán tử Miêu tả Ví dụ
sizeof() Trả về kích cỡ biến sizeof(a), với a là integer, thì sẽ trả lại kết quả là 4.
& Trả về địa chỉ biến. &a sẽ cho địa chỉ thực sự của biến a.
* Trỏ tới biến. *a; sẽ trỏ tới biến a.
? : Biểu thức ĐK Nếu ĐK là true ? thì giá trị X : Nếu không thì giá trị Y

Thứ tự ưu tiên trong toán tử

Loại Toán tử Thứ tự ưu tiên
Postfix () ->. ++ – – Trái sang phải
Unary + – ! ~ ++ – – (type)* & sizeof Phải sang trái
Tính nhân * / % Trái sang phải
Tính cộng + – Trái sang phải
Dịch chuyển << >> Trái sang phải
Quan hệ < <= > >= Trái sang phải
Cân bằng == != Trái sang phải
Phép AND bit & Trái sang phải
Phép XOR bit ^ Trái sang phải
Phép OR bit | Trái sang phải
Phép AND logic && Trái sang phải
Phép OR logic || Trái sang phải
Điều kiện ?: Phải sang trái
Gán = += -= *= /= %=>>= <<= &= ^= |= Phải sang trái
Dấu phảy , Trái sang phải

Câu lệnh điều kiện if – else

Mệnh đề if trong C

Mệnh đề if được sử dụng để kiểm tra giá trị dạng boolean của điều kiện kèm theo. Khối lệnh sau if được thực thi nếu giá trị của điều kiện kèm theo là True. Cú pháp :

if (condition) {  
  // khối lệnh này được thực thi nếu condition = true
}

Ví dụ code minh hoạ:

// 1. Chỉ có if
// BT: Nhập vào 1 số nguyên, kiểm tra số đó có phải số chẵn hay ko?
 
#include 
 
int main(){
    int a;
    printf("Nhap a = "); scanf("%d", &a);
    if (a % 2 == 0) // a chia hết cho 2
    {
        printf("%d la so chan", a);
    }
    printf("\nXong!");
}

Mệnh đề if else trong C

if (condition){
    // statement1
    // khối lệnh sẽ thực hiện nếu điều kiện đúng
}else{
    // statement2
    // khối lệnh sẽ thực hiện nếu điều kiện sai
}

Ví dụ code minh hoạ:

// 2. Có if else
// BT: Nhập vào 1 số nguyên, kiểm tra số đó có phải số chẵn hay số lẻ
 
#include 
 
int main(){
    int a;
    printf("Nhap a = "); scanf("%d", &a);
 
    if (a % 2 == 0) // a chia hết cho 2
    {
        printf("%d la so chan", a);
    }else{
        printf("%d la so le", a);
    }
}

Cấu trúc if … elseif … else

if (test expression1) {
   // statement(1)
}
else if(test expression2) {
   // statement(2)
}
else if (test  expression3) {
   // statement(3)
}
.
.
else {
   // statement(n)
}

Ví dụ code minh hoạ:

// 3. if else if
// BT: Nhập vào hai số nguyên, đưa ra kết luận so sánh 2 số đó
 
#include 
 
int main(){
    int a, b;
    printf("Nhap a = "); scanf("%d", &a);
    printf("Nhap b = "); scanf("%d", &b);
 
    // a, b 
    if(a > b){
        //
        printf("%d lon hon %d", a, b);
    }else if(a == b){
        printf("%d bang %d", a, b);
    }else{
        printf("%d nho hon %d", a, b);
    }
}

Cấu trúc if else lồng nhau

Chính là việc bạn sử dụng một cấu trúc if else khác trong thân của một cấu trúc if else đã có. Xem ví dụ code sau đây để hiểu rõ hơn .

// 4. if else lồng nhau
// BT: Nhập vào 1 số nguyên, kiểm tra số đó là số âm chẵn, âm lẻ, dương chẵn hay dương lẻ hay là số 0?
 
#include 
 
int main(){
    int a;
    printf("Nhap a = "); scanf("%d", &a);
 
    if(a > 0){
        // Số dương
        if(a % 2 == 0){
            printf("Day la so duong chan!");
        }else{
            printf("Day la so duong le!");
        }
    }else if(a == 0){
        // Số 0
        printf("Day la so 0!");
    }else{ 
        // Số âm
        if(a % 2 == 0){
            printf("Day la so am chan!");
        }else{
            printf("Day la so am le!");
        }
    }
}

Câu lệnh rẽ nhánh switch – case

Lệnh switch case là một cấu trúc điều khiển & rẽ nhánh hoàn toàn có thể được thay thế bằng cấu trúc if else. Tuy nhiên, việc sử dụng switch case sẽ giúp code của chúng ta dễ viết và dễ đọc hơn; Một điều nữa là sử dụng switch case có vẻ như cho hiệu năng tốt hơn so với sử dụng if else.

Cú pháp của lệnh switch case:

switch (expression)
​{
    case constant1:
      // statements
      break;
    case constant2:
      // statements
      break;
    .
    .
    .
    default:
      // default statements
}
  • expression

     phải bắt buộc là giá trị hằng, có thể là biểu thức nhưng kết quả cần là hằng số.

  • Trong đó, 

    expression

     sẽ được tính toán 1 lần duy nhất và sau đó so sánh với các giá trị của các 

    case

    .

  • Nếu có 1 case nào đó khớp giá trị, các khối lệnh tương ứng sau case đó sẽ được thực hiện cho tới khi gặp lệnh

    break

    . Do đó, nếu chúng ta không sử dụng break thì tất cả các case kể từ case khớp giá trị đều được thực hiện.

  • Case 

    default

     sẽ được thực hiện nếu không có case nào khớp giá trị với 

    expression

    .

Sơ đồ khối của lệnh switch case:

Ví dụ code minh hoạ:

//Nhap 2 so a, b va tinh tong, hieu, tich & thuong
#include 
 
int main()
{
    int a, b;
    char opera;
    printf("\nNhap phep toan: ");
    scanf("%c", &opera);
 
    printf("\nNhap vao 2 so a, b: ");
    scanf("%d%d", &a, &b);
 
    switch (opera)
    {
    case '+':
        printf("%d + %d = %d", a, b, a + b);
        break;
    case '-':
        printf("%d - %d = %d", a, b, a - b);
        break;
    case '*':
        printf("%d * %d = %d", a, b, a * b);
        break;
    case '/':
        if(b == 0){
            printf("Khong the chia cho 0!");
        }else{
            printf("%d / %d = %.2f", a, b, (float)a / b);
        }
        break;
 
    default:
    printf("Khong co phep toan %c!", opera);
        break;
    }
}

Bài tập Minh hoạ

  1. Nhập một số bất kỳ. Hãy đọc giá trị của số nguyên đó nếu nó có giá trị từ 0 đến 9, ngược lại thông báo không đọc được.
  2. Nhập một chữ cái. Nếu là chữ thường thì đổi sang chữ hoa, ngược lại đổi sang chữ thường.
  3. Giải phương trình bậc nhất ax + b = 0.
  4. Giải phương trình bậc hai ax2 + bx + c = 0.
  5. Nhập 4 số nguyên a, b, c và d. Tìm số có giá trị nhỏ nhất (min).
  6. Nhập 4 số nguyên a, b, c và d. Hãy sắp xếp giá trị của 4 số nguyên này theo thứ tự tăng dần.
  7. Tính tiền đi taxi từ số km nhập vào. Biết:
    • 1 km đầu giá 15000đ.
    • Từ km thứ 2 đến km thứ 5 giá 13500đ.
    • Từ km thứ 6 trở đi giá 11000đ.
    • Nếu trên 120km được giảm 10% tổng tiền.
  8. Nhập vào tháng và năm. Cho biết tháng đó có bao nhiêu ngày.
  9. Nhập độ dài 3 cạnh 1 tam giác. Kiểm tra đó có phải là tam giác không và là tam giác gì?