Hay kể tên các cấu trúc rẽ nhánh trong Pascal

Trong việc thực thi chương trình, các câu lệnh được thực hiện theo tuần tự, tức là thực hiện từ câu lệnh đầu tiên, lần lượt từng câu lệnh tiếp theo cho đến câu lệnh cuối cùng. Nhưng để linh hoạt và hiệu quả trong việc giải quyết vấn đề, các ngôn ngữ lập trình bậc cao đều có các cấu trúc rẽ nhánh và cấu trúc lặp cho phép chương trình không thực hiện theo trình tự thông thường. Trong bài này, thầy sẽ giới thiệu đến các em cấu trúc rẽ nhánh trong ngôn ngữ lập trình C++.

Câu lệnh là đơn vị cơ bản của ngôn ngữ lập trình. Các câu lệnh giống như chỉ thị, hướng dẫn cho máy tính biết phải làm gì, xử lí dữ liệu thế nào.

Câu lệnh có thể là câu lệnh đơn hoặc câu lệnh phức. Sau đây, thầy sẽ giới thiệu cho các em về hai khái niệm đó.

Câu lệnh đơn (câu lệnh đơn giản) chỉ gồm 1 câu lệnh chỉ thị, hay nói cách khác là 1 câu lệnh chỉ hướng dẫn máy tính thực hiện 1 thao tác.

Một số câu lệnh đơn phổ biến trong việc học như:

int a;

a = b + c;

return 0;

Như các em có thể thấy với mỗi câu lệnh trên, chương trình chỉ thực hiện một công việc. Bên cạnh đó còn các kiểu câu lệnh đơn khác, nhưng do không phổ biến trong việc học nên thầy không giới thiệu, các em có thể tìm hiểu thêm trên mạng.

Câu lệnh phức (câu lệnh phức hợp) là các câu lệnh gồm nhiều lệnh chỉ thị, hay nói cách khác là một nhóm lệnh hướng dẫn máy tính thực hiện nhiều công việc.

Ở đây, thầy sẽ giới thiệu cho em khái niệm khối lệnh. Một khối lệnh có cấu trúc như sau:

{

;

;

...

;

}

Như vậy, khối lệnh có dạng nhiều câu lệnh được để trong { và }.

Bên cạnh đó, các lệnh cấu trúc rẽ nhánh và cấu trúc lặp thầy sắp giới thiệu cũng là các câu lệnh phức.

Để dễ dàng cho các em liên tưởng, thầy sẽ cho một số ví dụ sau.

Ví dụ 1:

Nếu trời mưa, tôi sẽ ở nhà. Ngược lại, tôi sẽ đi chơi.

Ví dụ 2:

...Nếu là thỏ, Cho xem tai...

...Nếu là nai, Cho xem gạc...

...Nếu là gió, Xin mời vào...

Các em có thể thấy ở các ví dụ trên, với các điều kiện/trường hợp khác nhau thì sẽ có những hành động khác nhau được thực hiện tương ứng. Đó là những ví dụ cho cấu trúc rẽ nhánh trong thực tế.

Trong ngôn ngữ lập trình C++, ta dùng câu lệnh if và else hoặc câu lệnh switch-case để thiết lập việc đặt điều kiện, phân chia các trường hợp để cho chương trình thực hiện các câu lệnh tương ứng.

Câu lệnh if và else có dạng đầy đủ như sau:

if (<điều kiện>)

else

Tuy nhiên cũng có trường hợp không dùng đến phần else. Trong trường hợp đó, các em không cần viết phần else, và cấu trúc sẽ trở thành như sau:

if (<điều kiện>)

Trong đó <điều kiện> có thể là biểu thức quan hệ hoặc biểu thức logic.

Câu lệnh if và else này sẽ được thực hiện như sau:

    • Nếu <điều kiện> đúng, tức là có giá trị true hoặc khác 0, sẽ được thực hiện.

    • Nếu <điều kiện> sai, tức là có giá trị false hoặc bằng 0, sẽ được thực hiện. Trong trường hợp không có lệnh else thì điều này không xảy ra.

    • Sau đó câu lệnh tiếp theo sẽ được thực hiện.

Có thể các em thấy hơi khó hiểu, nên thầy sẽ lấy ví dụ với chương trình sau đây:

#include

using namespace std;

int main(){

int a, b;

cout << "Nhap so thu nhat: ";

cin >> a;

cout << "Nhap so thu hai: ";

cin >> b;

if (a > b) //Nếu a lớn hơn b

cout << "a lon hon b" << endl; //thì xuất ra màn hình "a lon hon b"

else //ngược lại

cout << "a khong lon hon b" << endl; //thì xuất ra màn hình "a khong lon hon b"

return 0;

}

Do phần khai báo và nhập xuất thầy đã viết ở các bài trước (em nào quên thì phải coi lại nhé), nên ở đây, thầy chỉ giải thích cách hoạt của câu lệnh if và else.

Trường hợp 1: Thầy sẽ nhập vào các giá trị cho a, b lần lượt là 9 và 1.

Như các em thấy 9 lớn hơn 1, nên <điều kiện> có kết quả đúng. Trong trường hợp này, chương trình sẽ xuất ra màn hình dòng chữ:

a lon hon b

Sau đó, lệnh

return 0;

sẽ được thực hiện.

Trường hợp 2: Thầy sẽ nhập vào các giá trị cho a, b lần lượt là 5 và 5.

Như các em có thể thấy 5 không lớn hơn 5, nên <điều kiện> có kết quả sai. Trong trường hợp này, chương trình sẽ xuất ra màn hình dòng chữ:

a khong lon hon b

Sau đó, lệnh

return 0;

sẽ được thực hiện.

Các em có thể thấy rằng, trong hai trường hợp trên, câu lệnh if và else đã làm cho chương trình không thực hiện các lệnh theo tuần tự mà rẽ thành hai nhánh cho hai trường hợp. Các em cũng có thể lồng ghép nhiều lệnh if và else vào nhau, nhưng cũng cần chú ý là else chỉ đi với if gần nó nhất mà chưa có cặp thôi nhé. Ví dụ:

if (a>=b)

if (a=b)

cout << "a bang b" << endl;

else

cout << "a lon hon b" << endl;

else

cout << "a nho hon b" << endl;

Nó tương đương với:

if (a>=b)

{

if (a=b)

cout << "a bang b" << endl;

else

cout << "a lon hon b" << endl;

}

else

cout << "a nho hon b" << endl;

Câu lệnh if-else chỉ cho phép các em rẽ hai nhánh lệnh. Nếu muốn rẽ thêm các nhánh lệnh cho nhiều trường hợp thì các em có thể lồng ghép nhiều lệnh if-else vào nhau, như vậy sẽ gây khó khăn cho các em việc đọc và dò lỗi. Thật may mắn là bên cạnh câu lệnh if-else, các ngôn ngữ lập trình bậc cao thường có thêm câu lệnh switch cho phép chương trình chọn một trong nhiều nhánh lệnh để thực hiện.

Câu lệnh switch trong ngôn ngữ lập trình C++ có cấu trúc như sau:

switch () {

case:

<(các) câu lệnh>;

break;

case:

<(các) câu lệnh>;

break;

...

case:

<(các) câu lệnh>;

break;

default:

<(các) câu lệnh>;

}

Thầy sẽ giải thích về cấu trúc trên:

    • phải có kiểu nguyên hoặc kí tự.

    • Các em có thể đặt bao nhiêu case tùy thích. Theo sau case là một giá trị và dấu hai chấm (:).

    • Các phải có cùng kiểu dữ liệu với ở switch và có giá trị là một hằng.

    • Khi giá trị của ở switch bằng giá trị của ở một case, <(các) câu lệnh> ở case đó sẽ được thực hiện cho đến khi gặp lệnh break.

    • Khi gặp lệnh break, câu lệnh switch kết thúc và chương trình thực hiện câu lệnh tiếp theo, sau câu lệnh switch.

    • Mỗi case không bắt buộc phải có break. Nếu case được thực hiện không có lệnh break, chương trình sẽ thực hiện <(các) câu lệnh> ở các case tiếp theo đến khi gặp lệnh break.

    • Một câu lệnh switch có thể có trường hợp default, tức là trường hợp mặc định, nhưng không bắt buộc phải có. Nếu có trường hợp default, chương trình sẽ thực hiện <(các) câu lệnh> ở default nếu giá trị ở switch không bằng giá trị ở tất cả các case. Trường default không cần break.

Dưới đây, thầy sẽ cho một chương trình ví dụ để giải quyết bài toán sau:

Nhập điểm kiểm tra (A, B, C, D hoặc F). Nếu điểm A, xuất ra màn hinh "Gioi"; nếu điểm B và C, xuất ra màn hình "Kha"; nếu điểm D, xuất ra màn hình "Trung binh"; nếu điểm F, xuất ra màn hình "Yeu"; nếu dữ liệu nhập vào không thỏa điều kiện đề bài, xuất ra màn hình "Xay ra loi".

#include;

using namespace std;

int main(){

char diem;

cout << "Nhap diem kiem tra: ";

cin >> diem;

if (diem>='a') diem-=32; //In hoa kí tự nếu kí tự là chữ in thường

switch (diem){

case 'A':

cout << "Gioi" << endl;

break;

case 'B':

case 'C':

cout << "Kha" << endl;

break;

case 'D':

cout << "Trung binh" << endl;

break;

case 'F':

cout << "Yeu" << endl;

break;

default:

cout << "Xay ra loi" << endl;

}

return 0;

}

Thầy sẽ giải thích một số điều mới và câu lệnh switch trong ví dụ trên:

Điều mới:

    • Ta có thể xem một kí tự là một số tương ứng với giá trị thập phân của nó trong bảng mã ASCII.

    • Ngôn ngữ lập trình C++ có các phép gán phức với các toán tử như +=, -=, *=, /=,v.v.. có dạng chung là:

=

Có ý nghĩa là thực hiện phép toán giữa giá trị của và sau đó gán lại vào , ở ví dụ trên, thầy đã dùng:

diem-=32;

Với ý nghĩa là trừ giá trị của diem đi 32 đơn vị và gán giá trị đó vào diem.

    • Mã ASCII của kí tự in thường lớn hơn mã ASCII của kí tự in hoa 32 đơn vị.

Câu lệnh switch:

    • Các em có thể thấy ở case 'B': thầy để trống. Trong trường hợp giá trị của diem là 'B', chương trình sẽ đi vào nhánh case 'B': để thực hiện lệnh. Do không gặp lệnh break, chương trình thực hiện tiếp câu lệnh ở nhánh case 'C': xuất ra màn hình dòng chữ Kha và xuống hàng. Sau đó do gặp lệnh break nên câu lệnh switch kết thúc.

    • Trong trường hợp diem không mang giá trị 'A', 'B', 'C', 'D' hay 'F' thì chương trình sẽ thực hiện lệnh ở nhánh default: xuất ra màn hình dòng chữ Xay ra loi và xuống hàng. Sau đó câu lệnh switch kết thúc.