=
=

Bài 3: Các câu lệnh rẽ nhánh

I. Khối lệnh

Chứa nhiều lệnh và được đặt trong dấu {} như các khối lệnh trong cấu trúc điều kiện, cấu trúc lặp hay hàm.

Thông thường, khối lệnh được viết thụt vô 1 tab so với cặp { }. Ví dụ:

{ //đầu khối
 a = 5;
 b = 6; //viết thụt vô 1 tab so với cặp { }
 printf("Tong %d + %d = %d", a, b, a+b);
} //cuối khối

II. Lệnh rẽ nhánh if

II.1. Lệnh if-else

Toán tử if cho phép lựa chọn chạy theo một trong hai nhánh tuỳ thuộc vào sự bằng không và khác không của biểu thức. Nó có hai cách viết sau :

/* Dạng một */
if (biểu thức) khối lệnh 1;

hay

/* Dạng hai */
if (biểu thức) khối lệnh 1;
else khối lệnh 2 ;

Hoạt động của biểu thức dạng 1:

Máy tính giá trị của biểu thức. Nếu biểu thức đúng (biểu thức có giá trị khác 0) máy sẽ thực hiện khối lệnh 1 và sau đó sẽ thực hiện các lệnh tiếp sau lệnh if trong chương trình. Nếu biểu thức sai (biểu thức có giá trị bằng 0) thì máy bỏ qua khối lệnh 1 mà thực hiện ngay các lệnh tiếp sau lệnh if trong chương trình.

Hoạt động của biểu thức dạng 2:

Máy tính giá trị của biểu thức. Nếu biểu thức đúng (biểu thức có giá trị khác 0) máy sẽ thực hiện khối lệnh 1 và sau đó sẽ thực hiện các lệnh tiếp sau khối lệnh 2 trong chương trình. Nếu biểu thức sai (biểu thức có giá trị bằng 0) thì máy bỏ qua khối lệnh 1 mà thực hiện khối lệnh 2 sau đó thực hiện tiếp các lệnh tiếp sau khối lệnh 2 trong chương trình.

Ví dụ:

Chương trình nhập vào hai số a và b, tìm max (số lớn nhất) của hai số rồi in kết quả lên màn hình. Chương trình có thể viết bằng cả hai cách trên như sau:

Cách 1

Nhập hai số bất kỳ cách nhau bởi khoảng trắng vào ô Stdin Inputs và nhấn nút Execute màu xanh để xem kết quả.

☛ Bài tập:
  • Nhấn dòng liên kết Edit this program in JDoodle.com để truy cập trang chủ JDoodle.
  • Thay đổi nội dung chương trình C yêu cầu người dùng nhập vào một số nguyên bất kỳ và hiển thị thông báo nếu số nguyên đó là số âm.
  • Lưu đến tài khoản cá nhân trên JDoodle.

Cách 2

Nhập hai số bất kỳ cách nhau bởi khoảng trắng vào ô Stdin Inputs và nhấn nút Execute màu xanh để xem kết quả.

☛ Bài tập:
  • Nhấn dòng liên kết Edit this program in JDoodle.com để truy cập trang chủ JDoodle.
  • Thay đổi nội dung chương trình C yêu cầu người dùng nhập vào một số nguyên bất kỳ và hiển thị thông báo số đó là chẵn hay lẻ.
  • Lưu đến tài khoản cá nhân trên JDoodle.

Sự lồng nhau của các toán tử if

C cho phép sử dụng các toán tử if lồng nhau có nghĩa là trong các khối lệnh (1 và 2) ở trên có thể chứa các toán tử if - else khác. Trong trường hợp này, nếu không sử dụng các dấu đóng mở ngoặc cho các khối thì sẽ có thể nhầm lẫn giữa các if-else.

Chú ý là máy sẽ gắn toán tử else với toán tử if không có else gần nhất. Chẳng hạn như đoạn chương trình ví dụ sau:

if (n > 0) /* if thứ nhất*/
if (a > b) /* if thứ hai*/ z = a;
else z = b;

thì else ở đây sẽ đi với if thứ hai.

Đoạn chương trình trên tương đương với:

if (n > 0) /* if thứ nhất*/
{
if (a > b) /* if thứ hai*/ z = a;
else z = b;
}

Trường hợp ta muốn else đi với if thứ nhất ta viết như sau:

if (n > 0) /* if thứ nhất*/
{
if (a > b) /* if thứ hai*/ z = a;
} else z = b;
II.2. Lệnh if - else if - else

Khi muốn thực hiện một trong n quyết định ta có thể sử dụng cấu trúc sau:

if (biểu thức 1) khối lệnh 1;
else if (biểu thức 2) khối lệnh 2;
...
else if (biểu thức n-1) khối lệnh n-1;
else khối lệnh n;

Trong cấu trúc này, máy sẽ đi kiểm tra từ biểu thức 1 trở đi đến khi gặp biểu thức nào có giá trị khác 0. Nếu biểu thức thứ i (1,2,...n-1) có giá trị khác 0, máy sẽ thực hiện khối lệnh i, rồi sau đó đi thực hiện lệnh nằm tiếp theo khối lệnh n trong chương trình. Nếu trong cả n-1 biểu thức không có biểu thức nào khác 0, thì máy sẽ thực hiện khối lệnh n rồi sau đó đi thực hiện lệnh nằm tiếp theo khối lệnh n trong chương trình.

Ví dụ chương trình sau đây.

Nhập số nguyên bất kỳ từ 1 đến 10 vào ô Stdin Inputs và nhấn nút Execute màu xanh để xem kết quả.

☛ Bài tập:
  • Nhấn dòng liên kết Edit this program in JDoodle.com để truy cập trang chủ JDoodle.
  • Thay đổi nội dung chương trình C yêu cầu người dùng nhập vào điểm của một học sinh từ 0 đến 10 và hiển thị thông báo theo quy tắc:
    • Nếu 9 <= điểm <= 10: Hiển thị thông báo là Xuất sắc.
    • Nếu 8 <= điểm < 9: Hiển thị thông báo là Giỏi.
    • Nếu 7 <= điểm < 8: Hiển thị thông báo là Khá.
    • Nếu 6 <= điểm < 7: Hiển thị thông báo là Trung bình Khá.
    • Nếu 5 <= điểm < 6: Hiển thị thông báo là Trung bình.
    • Nếu 0 <= điểm < 5: Hiển thị thông báo là Yếu.
  • Lưu đến tài khoản cá nhân trên JDoodle.

III. Lệnh lựa chọn switch

Là cấu trúc tạo nhiều nhánh đặc biệt. Nó căn cứ vào giá trị một biểu thức nguyên để để chọn một trong nhiều cách nhảy.

Cấu trúc tổng quát của nó là:

switch (biểu thức nguyên)
{
case n1 khối lệnh 1
case n2 khối lệnh 2
...
case nk khối lệnh k
[default khối lệnh k+1]
}

Với ni là các số nguyên, hằng ký tự hoặc biểu thức hằng. Các ni cần có giá trị khác nhau. Đoạn chương trình nằm giữa các dấu { } gọi là thân của toán tử switch. default là một thành phần không bắt buộc phải có trong thân của switch. Sự hoạt động của toán tử switch phụ thuộc vào giá trị của biểu thức viết trong dấu ngoặc ( ) như sau:

Khi giá trị của biểu thức này bằng ni, máy sẽ nhảy tới các câu lệnh có nhãn là case ni. Khi giá trị biểu thức khác tất cả các ni thì cách làm việc của máy lại phụ thuộc vào sự có mặt hay không của lệnh default như sau:

Chú ý: Máy sẽ nhảy ra khỏi toán tử switch khi nó gặp câu lệnh break hoặc dấu ngoặc nhọn đóng cuối cùng của thân switch. Ta cũng có thể dùng câu lệnh goto trong thân của toán tử switch để nhảy tới một câu lệnh bất kỳ bên ngoài switch. Khi toán tử switch nằm trong thân một hàm nào đó thì ta có thể sử dụng câu lệnh return trong thân của switch để ra khỏi hàm này ( lệnh return sẽ đề cập sau).

Khi máy nhảy tới một câu lệnh nào đó thì sự hoạt động tiếp theo của nó sẽ phụ thuộc vào các câu lệnh đứng sau câu lệnh này. Như vậy nếu máy nhảy tới câu lệnh có nhãn case ni thì nó có thể thực hiện tất cả các câu lệnh sau đó cho tới khi nào gặp câu lệnh break, goto hoặc return. Nói cách khác, máy có thể đi từ nhóm lệnh thuộc case ni sang nhóm lệnh thuộc case thứ ni+1. Nếu mỗi nhóm lệnh được kết thúc bằng break thì toán tử switch sẽ thực hiện chỉ một trong các nhóm lệnh này.

Ví dụ chương trình sau đây.

Nhập số nguyên bất kỳ từ 1 đến 10 vào ô Stdin Inputs và nhấn nút Execute màu xanh để xem kết quả.

☛ Bài tập:
  • Nhấn dòng liên kết Edit this program in JDoodle.com để truy cập trang chủ JDoodle.
  • Thay đổi nội dung chương trình C yêu cầu người dùng nhập vào hai số a, b và một ký tự bất kỳ. Chương trình sẽ hiển thị thông báo theo quy tắc sau:
    • Nếu kí tự nhập vào là +: Hiển thị tổng của a và b.
    • Nếu kí tự nhập vào là -: Hiển thị hiệu của a và b.
    • Các kí tự khác: Hiển thị Vui lòng nhập + hoặc -
  • Lưu đến tài khoản cá nhân trên JDoodle.