Điều khiển luồng trong lập trình C

Các cấu trúc điều khiển luồng yêu cầu lập trình viên xác định một hoặc nhiều điều kiện để đánh giá và kiểm tra bởi chương trình, cùng với các lệnh được thực hiện nếu điều kiện được xác định là đúng, hoặc các lệnh khác được thực hiện nếu điều kiện xác định là sai.

Dưới đây là mẫu chung của một cấu trúc điều khiển luồng hay gặp trong ngôn ngữ lập trình.

Ngôn ngữ lập trình C giả sử rằng mọi giá trị không phải zero hoặc không phải null đều có giá trị true, nếu có giá trị zero hoặc null, nó có giá trị false.

Ngôn ngữ C cung cấp các kiểu cấu trúc điều khiển luồng sau.

Lệnh Mô tả
Lệnh if Một lệnh if bao gồm một biểu thức logic theo sau bởi một hoặc nhiều lệnh khác.
Lệnh if…else Một lệnh if có thể theo sau bởi một lệnh else (tùy ý: có hoặc không), mà có thể được thực hiện khi biểu thức logic có giá trị false.
Lồng lệnh if Bạn có thể sử dụng lệnh if hoặc else if bên trong lệnh ifhoặc else if khác.
Lệnh switch Một lệnh switch cho phép kiểm tra điều kiện của một biến trước khi thực thi các lệnh.
Lồng lệnh switch Bạn có thể sử dụng một lệnh switch bên trong một lệnh switch khác.

Toán tử điều kiện ? : trong C

Chúng ta đã bàn về toán tử điều kiện ? : trong chương trước mà có thể được dùng để đổi vị trí cho lệnh if…else. Nó có mẫu chung như sau:

bieuthuc1 ? bieuthuc2 : bieuthuc3;

Trong đó Exp1, Exp2 và Exp3 là các biểu thức. Chú ý việc sử dụng và đặt của dấu hai chấm.

Giá trị của biểu thức Exp1 trước dấu ? có giá trị true, Exp2 được thực hiện, và giá trị của nó là giá trị của biểu thức. Nếu Exp1 là false thì Exp3 được thực hiện và giá trị của nó là giá trị của biểu thức.

Lệnh if trong C

Một lệnh if trong Ngôn ngữ C chứa một biểu thức logic được theo sau bởi một hoặc nhiều lệnh.

Cú pháp:

Sau đây là cú pháp của một lệnh if trong Ngôn ngữ C:

if(bieu_thuc_boolean)
{
   /* cac lenh se duoc thuc thi neu bieu thuc boolean la true */
}

Nếu biểu thức logic được ước lượng là true, thì sau đó khối code bên trong lệnh if sẽ được thực thi. Nếu biểu thức logic được ước lượng là false, thì khi đó, lệnh ngay sau lệnh if sẽ được thực thi.

Ngôn ngữ C giả sử rằng bất kỳ giá trị non-zeronon-nulltrue, và nếu nó là zero hoặc null, thì khi đó nó cho là giá trị false.

Sơ đồ:

Ví dụ:

#include <stdio.h>
 
int main ()
{
   /* phan dinh nghia bien cuc bo */
   int a = 15;
 
   /* kiem tra dieu kien voi lenh if */
   if( a < 20 )
   {
       /* neu dieu kien la true thi in dong sau */
       printf("a la nho hon 20\n" );
   }
   printf("Gia tri cua a la: %d\n", a);
   printf("===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");
 
   return 0;
}

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau:

Lệnh if…else trong C

Một lệnh if có thể được theo sau bởi một lệnh else tùy ý, mà thực hiện khi biểu thức logic là false.

Cú pháp:

Cú pháp của một lệnh if…else trong Ngôn ngữ C là:

if(bieu_thuc_boolean)
{
   /* cac lenh se duoc thuc thi neu bieu thuc boolean la true */
}
else
{
  /* cac lenh se duoc thuc thi neu bieu thuc boolean la false */
}

Nếu biểu thức logic được ước lượng là true, thì khi đó khối if sẽ được thực thi, nếu không thì khối else sẽ được thực thi.

Ngôn ngữ C giả sử rằng bất kỳ giá trị non-zero và non-null là true, và nếu nó là zero hoặc null, thì khi đó nó cho là giá trị false.

Sơ đồ:

Ví dụ:

#include <stdio.h>
 
int main ()
{
   /* phan dinh nghia bien cuc bo */
   int a = 36;
 
   /* kiem tra dieu kien */
   if( a < 20 )
   {
       /* neu dieu kien la true thi in dong sau */
       printf("a la nho hon 20\n" );
   }
   else
   {
       /* neu dieu kien la false thi in dong sau */
       printf("a khong nho hon 20\n" );
   }
   printf("Gia tri cua a la: %d\n", a);
   printf("===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");
 
   return 0;
}

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau:

Lệnh if lồng nhau trong C

Nó là hợp lệ để lồng các lệnh if-else trong Ngôn ngữ C, nghĩa là bạn có thể sử dụng một lệnh if hoặc else bên trong lệnh if hoặc else khác.

Cú pháp:

Cú pháp để lồng các lệnh if như sau:

if( bieu_thuc_boolean 1)
{
   /* Thuc thi khi bieu thuc boolean 1 la true */
   if(bieu_thuc_boolean 2)
   {
      /* Thuc thi khi bieu thuc boolean 2 la true */
   }
}

Bạn có thể lồng else if…else theo cách tương tự như bạn đã lồng lệnh if.

Ví dụ:

#include <stdio.h>
 
int main ()
{
   /* phan dinh nghia bien cuc bo  */
   int a = 667;
   int b = 7028;
 
   /* kiem tra dieu kien */
   if( a == 667 )
   {
       /* neu dieu kien la true thi tiep tuc kiem tra dieu kien sau */
       if( b == 7028 )
       {
          /* neu dieu kien la true thi in dong sau */
          printf("Gia tri cua a la 667 va cua b la 7028\n" );
       }
   }
   printf("Gia tri chinh xac cua a la: %d\n", a );
   printf("Gia tri chinh xac cua b la: %d\n", b );
   printf("===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");
 
   return 0;
}

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau:

Lệnh switch trong C

Một lệnh switch cho một biến được kiểm tra một cách bình đẳng trong danh sách các giá trị. Mỗi giá trị được gọi là một case – trường hợp và biến được chuyển tới được kiểm tra cho mỗi switch case.

Cú pháp:

Cú pháp của lệnh switch trong Ngôn ngữ C như sau:

switch(bieu_thuc){
    case bieu_thuc_hang  :
       cac_lenh;
       break;                /* tuy y */
    case bieu_thuc_hang  :
       cac_lenh;
       break;               /* tuy y */
  
    /* ban co the co bao nhieu lenh case tuy y */
    default :                  /* tuy y */
       cac_lenh;
}

Các quy tắc sau được áp dụng tới một lệnh switch:

Biểu thức bieu_thuc được sử dụng trong một lệnh switch phải có kiểu là số nguyên hoặc liệt kê, hoặc là một trong các kiểu lớp trong đó lớp có một hàm biến đổi đơn tới một kiểu integer hoặc kiểu liệt kê.

Bạn có thể có bất kỳ số lệnh case nào trong một switch. Mỗi case được theo sau bởi giá trị để được so sánh và một dấu hai chấm.

bieu_thuc_hang cho một case phải cùng kiểu dữ liệu với biến trong switch, và nó phải là hằng số.

Khi biến được chuyển tới là cân bằng với một case, lệnh theo sau case đó sẽ thực thi tới khi gặp lệnh break.

Khi gặp lệnh break, switch kết thúc, và dòng điều khiển nhảy tới dòng lệnh tiếp theo của lệnh switch đó.

Không phải mỗi case cần chứa một lệnh break. Nếu không có lệnh break nào xuất hiện, dòng điều khiển sẽ không tới được case tiếp theo cho tới khi bắt gặp một lệnh break.

Một lệnh switch có thể có một case mặc định (default) tùy chọn, mà phải xuất hiện ở cuối cùng của switch. Case mặc định này có thể được sử dụng để thực hiện một nhiệm vụ khi không có case nào true. Trong trường hợp case mặc định này thì không cần lệnh break.

Sơ đồ:

Ví dụ:

#include <stdio.h>
 
int main ()
{
   /* phan dinh nghia bien cuc bo  */
   char hocluc = 'B';

   switch(hocluc)
   {
   case 'A' :
      printf("Xuat sac!\n" );
      break;
   case 'B' :
      printf("Gioi\n" );
      break;
   case 'C' :
      printf("Kha\n" );
      break;
   case 'D' :
      printf("Trung Binh\n" );
      break;
   case 'F' :
      printf("Ban phai hoc lai !!!\n" );
      break;
   default :
      printf("Du lieu nhap khong hop le\n" );
   }
   printf("Hoc luc cua sinh vien la  %c\n", hocluc );
   printf("===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");
 
   return 0;
}

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau:

Lồng các lệnh switch trong C

Nó là có thể để có một lệnh switch như là một phần của dãy lệnh trong một lệnh switch ở vòng ngoài. Ngay cả khi hằng số case trong và ngoài lệnh switch chứa các giá trị bình thường, sẽ không có sự xung đột diễn ra ở đây.

Cú pháp:

Cú pháp để lồng các lệnh switch vào nhau như sau:

switch(ch1) {
   case 'A': 
      printf("A la mot phan cua lenh switch ben ngoai" );
      switch(ch2) {
         case 'A':
            printf("A la mot phan cua lenh switch ben trong" );
            break;
         case 'B': /* phan code tuong tu khac */
      }
      break;
   case 'B': /* phan code tuong tu khac */
}

Ví dụ:

#include <stdio.h>
 
int main ()
{
   /* phan dinh nghia bien cuc bo  */
   int a = 35;
   int b = 26;
 
   switch(a) {
      case 35: 
         printf("Day la mot phan cua lenh switch ben ngoai\n", a );
         switch(b) {
            case 26:
               printf("Day la mot phan cua lenh switch ben trong\n", a );
         }
   }
   printf("Gia tri chinh xac cua a la : %d\n", a );
   printf("Gia tri chinh xac cua b la : %d\n", b );
   printf("===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");
 
   return 0;
}

Biên dịch và thực thi chương trình C trên sẽ cho kết quả sau: