Chương 04
CẤU TRÚC RẼ NHÁNH
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
1
Nội dung
Đặt vấn đề
Câu lệnh
Chương trình
Cấu trúc: if
Cấu trúc: if-else
Cấu trúc: if-else lồng nhau
Cấu trúc: switch-case
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
2
Đặt vấn đề
Bài toán 1: nhập một ngày (gồm ngày, tháng, năm)
Một chương trình tốt khơng được giả sử người
dùng phải nhập đúng ngày, tháng, năm (đã thuộc
miền giá trị cho phép)
Để kiểm tra trường hợp nhập sai tháng, ta có thể
sử dụng cấu trúc:
if ( (tháng < 0) hoặc (tháng > 12) )
// Xử lý lỗi với tháng nhập sai
endif
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
3
Đặt vấn đề
Bài tốn 2: Giải phương trình bậc 2
Chương trình cần yêu cầu nhập các hệ số A, B, C
Tuy nhiên A và B nhập vào không chắc sẽ khác 0
-> có thể suy biến về phương trình bậc 1
Dùng cấu trúc rẽ nhánh để kiểm tra các điều kiện
nói trên
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
4
Câu lệnh
Câu lệnh là một câu viết bằng ngôn ngữ lập trình.
Kết thúc câu lệnh là dấu chấm phẩy (;)
Các loại câu lệnh
Câu lệnh đơn (câu đơn)
Câu lệnh phức (câu phức)
Nhiều câu lệnh được đặt trong cặp ngoặc { … }
Cạu lệnh thuộc cấu trúc điều khiển như: if, ifelse, switch, for, while, do … while
Câu lệnh rỗng:
Trần Quang
© 2016
Ví dụ: câu khai báo biến, câu lệnh gán, …
Chỉ có dấu ; đứng cuối
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
5
Chương trình
Chương trình là một danh sách tuyến tính (có thứ
tự) của các câu lệnh (đơn, phức, …)
Mặc định máy tính sẽ thực hiện lần lượt từ câu
đầu tiên đến câu lệnh cuối cùng.
Trừ khi gặp các cấu trúc điều khiển như:
Rẽ nhánh
Lặp
Trần Quang
© 2016
if, if-else, switch
for, while, do … while
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
6
Câu lệnh: if
Cú pháp:
if (<biểu thức điều kiện>) <câu lệnh>
if (<biểu thức điều kiện>)
<câu lệnh>
if (<biểu thức điều kiện>)
{
<các câu lệnh>
}
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
7
Câu lệnh: if
<biểu thức điều kiện>
false
<biểu thức điều kiện>:
Biểu thức luận lý hoặc
phải chuyển đổi sang luận
lý được
true
<câu lệnh>
Trần Quang
© 2016
<câu lệnh>: một trong
các loại câu lệnh đơn, kép
hay rỗng
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
8
Câu lệnh: if
Cú pháp + phong cách lập trình:
if (<biểu thức điều kiện>) <câu lệnh>
if (<biểu thức điều kiện>)
<câu lệnh>
TAB
if (<biểu thức điều kiện>) {
<câu lệnh>
//có thể có 1 hay nhiều câu lệnh
}
if (<biểu thức điều kiện>)
{
<câu lệnh>
//có thể có 1 hay nhiều câu lệnh
}
TAB
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
9
Câu lệnh: if-else
Cú pháp:
if (<biểu thức điều kiện>)
<câu lệnh T>
else
<câu lệnh F>
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
10
Câu lệnh: if-else
<biểu thức điều kiện>
<biểu thức điều kiện>:
Biểu thức luận lý hoặc
phải chuyển đổi sang
luận lý được
false
true
<câu lệnh T>
Trần Quang
© 2016
<câu lệnh F>
<câu lệnh T>,
<câu lệnh T>: một
trong các loại câu lệnh
đơn, kép hay rỗng
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
11
Câu lệnh: if-else
Cú pháp + phong cách lập trình
if (<biểu thức điều kiện>)
<câu lệnh đơn khi đúng>
else
<câu lệnh đơn khi sai>
if (<biểu thức điều kiện>) {
<câu lệnh đơn/kép khi đúng>
//...
<câu lệnh đơn/kép khi đúng>
}
else {
<câu lệnh đơn/kép khi sai>
//...
<câu lệnh đơn/kép khi sai>
}
Trần Quang
© 2016
if (<biểu thức điều kiện>)
{
//...
}
else
{
//...
}
Chương 04: Cấu trúc rẽ nhánh
đúng>
đúng>
sai>
sai>
Kỹ thuật lập trình
12
Cần phân rã các cơng
việc con trong đó để có
giải thuật hồn thiện
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
13
Giải Phương trình bậc 2
#include <stdio.h>
#include <conio.h>
void main(){
float a, b, c, delta;
printf("Nhap vao gia tri cac so a, b, c: \n");
scanf("%f%f%f", &a, &b, &c);
if(a == 0) {
// giai phuong trinh bac 1
}
else {
delta = b*b - 4*a*c;
if(delta < 0) // tiep tuc giai phuong trinh bac 2 ...
}
getch();
}
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
14
Câu lệnh: if-else lồng nhau
Bài toán: xếp loại học sinh dựa theo điểm
Trần Quang
© 2016
Yếu: điểm thuộc [0, 5]
Trung bình: điểm thuộc [5, 6.5)
Khá: điểm thuộc [6.5, 8)
Giỏi: điểm thuộc [8, 9.5)
Xuất sắc: điểm thuộc [9.5, 10]
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
15
Câu lệnh: if-else lồng nhau
Đầu vào: điểm
diem < 5
true
false
false
diem < 6.5
diem < 8
true
true
loai = “K”
loai = “Y”
false
diem < 9.5
false
true
loai = “G”
loai = “XS”
loai = “TB”
Đầu ra: loại
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
16
Câu lệnh: if-else lồng nhau
Có nhiều cách biểu diễn
if (<biểu thức điều kiện 1>)
else if (<biểu thức điều kiện 2>)
else if (<biểu thức điều kiện 3>)
else <Câu lệnh thực thi 4>
<Câu lệnh thực thi 1>
<Câu lệnh thực thi 2>
<Câu lệnh thực thi 3>
if (<biểu thức điều kiện 1>)
<Câu lệnh thực thi 1>
else if (<biểu thức điều kiện 2>)
<Câu lệnh thực thi 2>
else if (<biểu thức điều kiện 3>)
<Câu lệnh thực thi 3>
else
<Câu lệnh thực thi 4>
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
17
Câu lệnh: if-else lồng nhau
if (<biểu thức điều kiện 1>) <Câu lệnh thực thi 1>
else if (<biểu thức điều kiện 2>) <Câu lệnh thực thi 2>
else if (<biểu thức điều kiện 3>) <Câu lệnh thực thi 3>
else <Câu lệnh thực thi 4>
if (<biểu thức điều kiện 1>)
<Câu lệnh thực thi 1>
else if (<biểu thức điều kiện 2>)
<Câu lệnh thực thi 2>
else if (<biểu thức điều kiện 3>)
<Câu lệnh thực thi 3>
else
<Câu lệnh thực thi 4>
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
18
Câu lệnh: if-else lồng nhau
Phong cách:
Canh lề thẳng đứng
Trần Quang
© 2016
#include <stdio.h>
#include <conio.h>
void main(){
float diem = 8.7f;
if(diem < 5.0f)
printf("%s", "Yeu");
else if(diem < 6.5f)
printf("%s", "Trung Binh");
else if(diem < 8.5f)
printf("%s", "Kha");
else if(diem < 9.5f)
printf("%s", "Gioi");
else
printf("%s", "Xuat sac");
getch();
}
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
19
Biểu thức điều kiện ? :
Cú pháp :
<điều kiện> ? <giá trị 1> : <giá trị 2>
nếu <điều kiện> đúng thì trả về <giá trị 1>, ngược lại
trả về <giá trị 2>
Ví dụ: lệnh
if (hours > 40) rate = 0.45;
else rate = 0.02;
có thể thay bằng :
rate = (hours > 40) ? 0.45 : 0.02;
Trần Quang
© 2016
Chương 04: Cấu trúc rẽ nhánh
Kỹ thuật lập trình
20