Giới Thiệu Lập Trình
Cấu Trúc Lựa Chọn
TS. Lê Ngun Khơi
Trường Đại học Công nghệ, ĐHQGHN
Nội Dung
Biểu thức lô-gic
Luồng điều khiển
Cấu trúc lựa chọn:
if
if … else
switch
Giới Thiệu Lập Trình
1
Biểu Thức Lơ-gic
Các phép tốn logic
PHỦ ĐỊNH (!), VÀ (&&), HOẶC (||)
Mức độ ưu tiên: && cao hơn ||
Kiểu dữ liệu cơ bản lô-gic bool
đúng (true), sai (false)
Chuyển đổi kiểu dữ liệu:
Không (0, 0.0) là sai (false)
Khác không là đúng (true)
Sai (false) là 0
Đúng (true) là 1
Giới Thiệu Lập Trình
2
Phép Tốn So Sánh
Phép Tốn Tốn Tử Ví Dụ
Nhỏ hơn
Nhỏ hơn
hoặc bằng
Lớn hơn
<
<=
>
Lớn hơn
hoặc bằng
>=
Bằng
==
Không bằng
(khác)
!=
a
1
a
1
a
1
a
1
a
1
a
1
< b
< 2
<= b
<= 2
> b
> 2
>= b
>= 2
== b
== 2
!= b
!= 2
Giới Thiệu Lập Trình
Kết quả
true
true
false
false
false
true
3
Phép Tốn Lơ-gic
Phép Tốn
Tốn Tử Ví Dụ
Và
&&
Hoặc
||
Phủ định
!
a && b
true && true
a || b
false || false
!a
!true
Giới Thiệu Lập Trình
Kết quả
true
false
false
4
Bảng Lơ-gic (Tốn Tử Lười)
a
b
false false
false true
true false
true true
a && b
false
false
false
true
a
b
false false
false true
true false
true true
a || b
false
true
true
true
int a = 0; bool b;
b = (false) && (1/a); cout << b;
b = (true) || (1/a); cout << b;
Giới Thiệu Lập Trình
5
Độ Ưu Tiên Các Phép Toán
Xác định thứ tự để tính giá trị biểu thức
Độ Ưu Tiên
Cao nhất
Tốn Tử
++, --, !
*, /, %
+, <, <=, >, >=
==, !=
&&
||
=, +=, -=, *=, /=, %=
Thấp nhất
x + 1 > 2 || x + 1 < -3 tương đương:
(( x + 1 ) > 2) || (( x + 1 ) < -3)
Giới Thiệu Lập Trình
6
Luồng Điều Khiển
Thứ tự các mệnh lệnh ch.tr. thực hiện
Thứ tự đơn giản: tuần tự
Thực hiện theo thứ tự viết trong mã nguồn
Thứ tự mệnh lệnh phụ thuộc dữ liệu đầu vào
Ví dụ: nhập 2 số ngun dương thì tính ucln, nếu
khơng, khơng tính, in ra thơng báo, và dừng ch.tr.
Cần lựa chọn mệnh lệnh nào thực hiện
Điều khiển mã nguồn chạy như thế nào
Giới Thiệu Lập Trình
7
Cấu Trúc Lựa Chọn Trong C++
if
if … else
switch
Giới Thiệu Lập Trình
8
Cấu Trúc Lựa Chọn if
Cú pháp:
if (BiểuThứcLôgic)
{
// thân if
MệnhLệnh;
MệnhLệnh;
… … …
}
Ý nghĩa: nếu BiểuThứcLôgic đúng (true),
thân if được thực hiện, nếu không, điều khiển
chuyển sang mệnh lệnh tiếp theo ngay sau cấu
trúc if
Giới Thiệu Lập Trình
9
Cấu Trúc Lựa Chọn if
Ví dụ:
double luong = MUC_LUONG_CO_BAN * soGioLam;
if (soGioLam > SO_GIO_LAM_QUY_DINH)
{
int luongTangThem = MUC_LUONG_CO_BAN * 0.5 *
(soGioLam - SO_GIO_LAM_QUY_DINH);
luong = luong + luongTangThem;
}
Giới Thiệu Lập Trình
10
Cấu Trúc Lựa Chọn if … else
Cú pháp:
if (BiểuThứcLôgic)
{
// thân if
MệnhLệnh;
… … …
}
else
{
// thân else
MệnhLệnh;
… … …
}
Giới Thiệu Lập Trình
11
Cấu Trúc Lựa Chọn if … else
Cú pháp:
if (BiểuThứcLôgic)
{
// thân if
}
else
{
// thân else
}
Ý nghĩa: nếu BiểuThứcLôgic đúng (true),
thân if được thực hiện, nếu BiểuThứcLôgic
sai (false), thân else được thực hiện
Giới Thiệu Lập Trình
12
Cấu Trúc Lựa Chọn if … else
Ví dụ:
bool hocCaiThien;
if (diemSo < 60)
{
hocCaiThien = true;
}
else
{
hocCaiThien = false;
}
Giới Thiệu Lập Trình
13
Cấu Trúc Lựa Chọn if … else
Ví dụ:
bool hocCaiThien = false;
if (diemSo < 60)
{
hocCaiThien = true;
}
else
{
hocCaiThien = false;
}
Giới Thiệu Lập Trình
14
Cấu Trúc Lựa Chọn if … else Lồng
char xepHang = 'F';
if (diemSo >= 80)
xepHang = 'A';
else if (diemSo >= 70)
xepHang = 'B';
else if (diemSo >= 60)
xepHang = 'C';
else if (diemSo >= 50)
xepHang = 'D';
else if (diemSo >= 40)
xepHang = 'E';
Giới Thiệu Lập Trình
15
Cấu Trúc Lựa Chọn if … else Lồng
char xepHang = 'F';
if (diemSo >= 80)
xepHang = 'A';
else
if (diemSo >= 70)
xepHang = 'B';
else
if (diemSo >= 60)
xepHang = 'C';
else
if (diemSo >= 50)
xepHang = 'D';
else
if (diemSo >= 40)
xepHang = 'E';
Giới Thiệu Lập Trình
16
Cấu Trúc Lựa Chọn if … else Lồng
char xepHang = 'F';
if (diemSo >= 80)
{
xepHang = 'A';
}
else
{
if (diemSo >= 70)
{
xepHang = 'B';
}
else
{
… … …
}
}
Sử dụng
{
… … …
}
để mã nguồn
dễ đọc,
dễ gỡ lỗi
Giới Thiệu Lập Trình
17
Cấu Trúc Lựa Chọn if … else Lồng
char xepHang = 'F';
if (diemSo >= 80)
xepHang = 'A';
soDiemA = soDiemA + 1;
else
… … …
Lỗi thường xảy ra:
error: ‘else’ without a previous if
Giới Thiệu Lập Trình
18
Cấu Trúc Lựa Chọn if … else Lồng
if (x > 5)
if (y > 5)
std::cout << "x va y > 5";
else
std::cout << "x <= 5";
else của if nào?
Khi x=5, mệnh lệnh nào thực hiện, in ra?
else của if gần nhất
Giới Thiệu Lập Trình
19
Cấu Trúc Lựa Chọn if … else
loại bỏ trường hợp không cần thiết
a
b
false false
false true
true false
true
true
output
false
true
true
true
if (!a && !b)
else if (!a && b)
else if (a && !b)
else if (a && b)
output
output
output
output
=
=
=
=
false;
true;
true;
true;
Phân tích và loại trường hợp khơng cần thiết
if (!a && !b)
else
output = false;
output = true;
Giới Thiệu Lập Trình
20
Cấu Trúc Lựa Chọn if … else
Bài tập (xem mã nguồn)
1. Kiểm tra số nhập vào chẵn hay lẻ
2. Tìm số lớn nhất trong 3 số nhập vào
3. Đoán số
Giới Thiệu Lập Trình
21
Một Số Lưu Ý
Nhầm lẫn giữa gán (=) và so sánh bằng (==)
Không lỗi khi dịch
Kết quả chạy khác nhau
if (a = 1)
// luôn đúng
if (a = 0)
// luôn sai
if (a = b)
// tương đương
if ( (a = b) != 0 )
Thực hiện phép gán xong rồi kiểm tra điều kiện
Không (0, 0.0) là sai (false)
Khác không là đúng (true)
Giới Thiệu Lập Trình
22
Một Số Lưu Ý
Biểu thức lơ-gic trong tốn học
(0 ≤ tuoi ≤ 150)
Chuyển sang ngơn ngữ lập trình
(0 <= tuoi <= 150)
dịch không lỗi nhưng chạy sai!!!
Biểu thức logic trong ngơn ngữ lập trình
Phải sử dụng các phép tốn lơ-gic
(0 <= tuoi && tuoi <= 150)
Lỗi thường gặp: biểu thức lô-gic luôn sai/đúng
(0 >= tuoi && tuoi >= 150)
Giới Thiệu Lập Trình
23
Cấu Trúc Lựa Chọn switch
Cú pháp:
switch (BiểuThức)
{
case HằngSố1: CụmMệnhLệnh1; break;
case HằngSố2: CụmMệnhLệnh2; break;
case HằngSố3: CụmMệnhLệnh2; break;
… … …
default: CụmMệnhLệnhMặcĐịnh;
}
Lưu ý: kiểu của BiểuThức là kiểu số nguyên
(bool, char, int, short, long)
Giới Thiệu Lập Trình
24