Các cấu trúc điều khiển trong C++
I. Cấu trúc rẽ nhánh và cấu trúc chọn
I.1. Cấu trúc rẽ nhánh
Trong thực tế, khi giải quyết một công việc thường ta phải lựa chọn
nhiều phương án giải quyết khác nhau. Người ta thường biểu diễn vấn đề này
bằng 2 mệnh đề logic sau:
- [1]. Nếu … thì …;
- [2]. Nếu … thì … ngược lại thì…
Để mô phỏng hai mệnh đề đó, trong ngôn ngữ lập trình C++ đưa ra cấu
trúc rẽ nhánh.
Cú pháp:
if (<biểu thức điều kiện>) <Lệnh 1>;
[else <Lệnh 2>;]
ý nghĩa:
Nếu <biểu thức điều kiện> nhận giá trị đúng (TRUE), sẽ thực hiện <Lệnh1>,
ngược lại, nếu <biểu thức điều kiện> nhận giá trị sai (FALSE) sẽ thực hiện <Lệnh2>;
(nếu có thành phần [else <Lệnh 2>;]).
- <Lệnh 1> và <Lệnh 2> có thể là một lệnh, một khối lệnh hoặc một, một khối
các cấu trúc điều khiển. Các khối lệnh hoặc khối cấu trúc điều khiển được đặt
trong hai dấu { }.
Cấu trúc rẽ nhánh có hai dạng (tuỳ thuộc vào sự có hay không có thành
phần [else <Lệnh 2>;]) như trong sơ đồ khối dưới đây.
<BTĐK>
<Lệnh>
<BTĐK>
<Lệnh1>
<Lệnh 2>
TRUE
FALSE
TRUE
FALSE
a). Mô tả mệnh đề [1] b) Mô tả mệnh đề [2]
clrscr();
int T, km;
cout<<”Nhập số tiền “; cin>>T;
if (T>=300 && T <=400) km = T*0.2;
else
if (T>400) km = T*0.3;
else km = 0;
cout<<”Số tiền khuyến mại “<<km;
getch();
}
Nếu n khả năng là loại trừ nhau thì khi đó có thể sử dụng n-1 lệnh if lồng
nhau hoặc có thể sử dụng n lệnh if rời nhau cho n khả năng lựa chọn. Trường
hợp ngược lại, ta nên sử dụng các lệnh if rời nhau.
Ví dụ: Viết chương trình nhập vào điểm tổng kết và xếp loại đạo đức của một sinh
viên. Sau đó tính số tiền học bổng cho sinh viên đó như sau:
Nếu tổng kết >=7.00 thì được 300000.
Nếu điểm tổng kết >=9.00 và đạo đức = “T” thì được cộng thêm 100000.
Xét đoạn trình sau:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main()
{
clrscr(); float tk; char hk; long T;
cout<<”Nhap điểm tong ket”; cin>>tk;
cout<<”Nhap hanh kiem”; cin>>hk;
T=0;
if (tk >= 7) T = 300000;
else if (tk>=9 && hk = = ‘T’) T += 100000;
…
case <GT n>: <Lệnh n;> break;
[default: <Lệnh mặc định>;]
}
ý nghĩa: Kiểm tra giá trị của <Biến nguyên>:
Nếu <Biến nguyên> nhận giá trị <GT1>, thực hiện <Lệnh 1>
Nếu <Biến nguyên> nhận giá trị <GT2>, thực hiện <Lệnh 2>…
Nếu <Biến nguyên> nhận giá trị <GTn>, thực hiện <Lệnh n>
Nếu có thành phần [default: …], thực hiện <lệnh mặc định> khi
biến nguyên không nhận giá trị nào trong n giá trị ở trên.
Biến = GT1
Biến = GT2
Biến = GTn
<Lệnh 1>
<Lệnh 2>
<Lệnh n>
…
Lệnh mặc định
Sơ đồ khối:
- Lệnh switch chỉ thực hiện trên biến nguyên. Các câu lệnh <Lệnh 1>, <Lệnh
2>… có thể là một khối lệnh hoặc khối các cấu trúc điều khiển (tức nhiều lệnh,
nhiều cấu trúc điều khiển đặt giữa hai ký tự { và }). Sau đó phải có lệnh break;
nếu không lệnh switch sẽ chạy sai ý nghĩa của nó.
- Thành phần [default: …] là không bắt buộc. Nếu có thành phần này, <Lệnh
mặc định> sẽ được được thực hiện sau khi tất cả các trường hợp case đều
không thỏa mãn.
Ví dụ 1: Viết chương trình nhập vào mã học vị (là một số nguyên) của
một nhân viên. In ra học vị tương ứng với quy định:
Mã =1: Cử nhân.
Mã =2: Kỹ sư.
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: cout<<”Tháng có 31 ngày”; break;
case 4:
case 6:
case 9:
case 11: cout<<”Tháng có 30 ngày”; break;
case 2: if (N%4 = = 0) cout<<”Tháng có 28 ngày”;
else cout<<”Tháng có 29 ngày”;
break;
}
getch();
}
Chuyển đổi giữa cấu trúc chọn và rẽ nhánh:
Với cấu trúc rẽ nhánh, các biến trong biểu thức điều kiện có thể có kiểu
bất kỳ. Ngược lại, với cấu trúc chọn, chỉ lựa chọn các trường hợp của biến