You are on page 1of 36

MÔN: NHẬP MÔN VỀ LẬP TRÌNH

Chương 04
CẤU TRÚC RẼ NHÁNH

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 1
Chuẩn đầu ra
 L.O.3.1 – Liệt kê được các kiểu điều khiển và vẽ
sơ đồ mô tả chúng.
 L.O.3.2 – Mô tả được được nguyên tắc kết hợp
các kiểu điều khiển để mô tả các giải thuật.
 L.O.3.3 – Hiện thực được các kiểu điều khiển
bằng ngôn ngữ C.
 L.O.3.4 – Sử dụng các cấu trúc điều khiển để giải
quyết bài toán thực tế.

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 3
Đặt vấn đề
Bài toá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

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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)
 Ví dụ: câu khai báo biến, câu lệnh gá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, if-else,
switch, for, while, do … while
 Câu lệnh rỗng:
 Chỉ có dấu ; đứng cuối

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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
 if, if-else, switch
 Lặp
 for, while, do … while

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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>
}
if (<biểu thức điều kiện>)
{
<các câu lệnh>
}
Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 7
Câu lệnh: if

<biểu thức điều kiện>:


false Biểu thức luận lý hoặc
<biểu thức điều kiện>
phải chuyển đổi sang luận
lý được
true
<câu lệnh>: một trong các
<câu lệnh> loại câu lệnh đơn, kép hay
rỗng

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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>
//có thể có 1 hay nhiều 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âu lệnh>
TAB //có thể có 1 hay nhiều câu lệnh
}

TAB

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 9
Câu lệnh: if-else
 Cú pháp:

if (<biểu thức điều kiện>)


<câu lệnh cho ĐK đúng>
else
<câu lệnh cho ĐK sai>

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 10
Câu lệnh: if-else

<biểu thức điều kiện>:


false Biểu thức luận lý hoặc
<biểu thức điều kiện>
phải chuyển đổi sang
luận lý được
true
<câu lệnh T>,
<câu lệnh T> <câu lệnh F> <câu lệnh T>: một trong
các loại câu lệnh đơn,
kép hay rỗng

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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>)
{
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> //...
//... <câu lệnh đơn/kép khi đúng>
<câu lệnh đơn/kép khi đúng> }
} else
else { {
<câu lệnh đơn/kép khi sai> <câu lệnh đơn/kép khi sai>
//... //...
<câu lệnh đơn/kép khi sai> <câu lệnh đơn/kép khi sai>
} }

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 12
Cần phân rã các công
việc con trong đó để có
giải thuật hoàn thiện

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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();
}
Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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
 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]

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 15
Câu lệnh: if-else lồng nhau

Đầu vào: điểm

false false false false


diem < 5 diem < 6.5 diem < 8 diem < 9.5

true true true true

loai = “G” loai = “XS”


loai = “K”

loai = “TB”
loai = “Y”

Đầu ra: loại

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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>) <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>

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 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>

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 18
Câu lệnh: if-else lồng nhau
#include <stdio.h>
#include <conio.h>
void main(){
float diem = 8.7f;
Phong cách: if(diem < 5.0f)
Canh lề thẳng đứng 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();
}

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 19
̣ n?:
Biểu thức điều kiê
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;

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 20
Câu lệnh switch-case
Ví dụ: chương trình quản lý sách
 Chương trình cung cấp menu các chức năng cho
người dùng chọn
 Người dùng chọn một mục của menu
 Chương trình thực hiện khối công việc tương ứng
với menu đã chọn
=> Phù hợp cấu trúc switch-case

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 21
Câu lệnh switch-case
Cú pháp: switch (<mã trường hợp>){
case <mã 1>: <câu lệnh 1>
case <mã 2>: <câu lệnh 2>
...
case <mã N>: <câu lệnh N>
default: <câu lệnh mặc nhiên>
}

switch, case, default: Từ khoá


<mã trường hợp>: là biểu thức thuộc một trong các kiểu sau đây
(1) Các kiểu số nguyên, hoặc dẫn xuất từ nó thông qua typedef
(2) Kiểu enum
<mã i>: (i=1,.., N), các giá trị có thể của mã trường hợp

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 22
Câu lệnh switch-case

false false false


<case 1> <case 2> <case N>
true true true

<câu lệnh 1> <câu lệnh 2> <câu lệnh N> <mặc nhiên>

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 23
Câu lệnh switch-case

 Chương trình kiểm tra xem trường hợp nào xảy ra trong
các trường hợp được liệt kê: <case 1>, <case 2>, ..,
<case N>
 Nếu trường hợp thứ i xảy ra (i = 1 .. N):
 Thực hiện lần lượt các câu lệnh từ i đến N, kể cả câu

lệnh <mặc nhiên>


 Nếu gặp lệnh break; thì chương trình thoát khỏi cấu

trúc switch-case
 Nếu không có trường hợp nào xảy ra thì chương trình
thực thi câu lệnh <mặc nhiên> và thoát khỏi cấu trúc
switch-case

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 24
Câu lệnh switch-case

switch (<mã trường hợp>){


case <mã 1>:
case <mã 2>:
case <mã 3>: <câu lệnh 3>

case <mã N>: <câu lệnh N>


default: <câu lệnh mặc nhiên>
}

Trường hợp muốn:


<câu lệnh 3> được thực thi cho cả 3 trường hợp 1, 2, và 3

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 25
Câu lệnh switch-case

switch (<mã trường hợp>){


case <mã 1>: <câu lệnh 1> break;
case <mã 2>: <câu lệnh 2>

case <mã N>: <câu lệnh N>


default: <câu lệnh mặc nhiên>
}

Trường hợp muốn:


<câu lệnh 1> khi được thực thi xong thi thoát khỏi cấu trúc
switch-case luôn, không thực thi các câu lệnh kế tiếp.

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 26
Câu lệnh switch-case

switch (<mã trường hợp>){


case <mã 1>: <câu lệnh 1> break;
case <mã 2>: <câu lệnh 2> break;

case <mã N>: <câu lệnh N> break;


default: <câu lệnh mặc nhiên>
}

Trường hợp muốn:


Muốn mỗi câu lệnh thực thi với chỉ trường hợp tương ứng

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 27
Ví dụ
#include <stdio.h>
#include <conio.h>
int main(){
int luachon;
printf("Nhap vao lua chon: \n");
scanf("%d", &luachon);
switch (luachon){
case 1:
printf("Truong hop 1\n"); printf("Hanh dong 1\n");
case 2:
printf("Truong hop 2\n"); printf("Hanh dong 2\n");
default:
printf("Hanh dong mac dinh\n");
}
return 0;
}

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 28
Ví dụ
#include <stdio.h>
#include <conio.h>
int main(){
int luachon; break: khiến chương trình
printf("Nhap vao lua chon: \n"); chỉ in ra tên hành động
scanf("%d", &luachon); tương ứng lựa chọn
switch (luachon){
case 1:
printf("Truong hop 1\n"); printf("Hanh dong 1\n"); break;
case 2:
printf("Truong hop 2\n"); printf("Hanh dong 2\n"); break;
default:
printf("Hanh dong mac dinh\n");
}
return 0;
}

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 29
Sử dụng kiểu liệt kê (enum)
#include <stdio.h>
#include <conio.h>
enum THop {DongY, TuChoi, ChuaQuyetDinh};
int main(){
enum THop luachon;
printf ("Nhap vao lua chon cua ban \n");
printf ("0. Ban dong y \n");
printf ("1. Ban tu choi \n");
printf ("2. Ban chua co quyet dinh \n");
scanf ("%d", &luachon);
switch (luachon) {
case DongY: printf ("Ban dong y\n"); break;
case TuChoi: printf ("Ban tu choi y\n"); break;
case ChuaQuyetDinh:printf ("Ban chua co quyet dinh\n"); break;
default: printf ("Ban khong nhap lua chon dung\n");
}
return 0;
}

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 30
So sánh if - else với switch
 không dùng switch-case cho bài toán xếp loại sinh
viên theo điểm vì điểm không phải kiểu số nguyên
 Câu lệnh switch có thể được biểu diễn lại bằng
một trình tự các câu lệnh if-else
 Một số trường hợp switch-case tường minh và dễ
hiểu hơn.
 Tất cả các cấu trúc điều khiển có thể được biểu
diễn lại bằng các câu lệnh if-else và các câu lệnh
goto (Với sự hỗ trợ của các nhãn)

Đại học Bách Khoa TpHCM Chương 4: Cấu trúc rẽ nhánh Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 31
Ôn tập
1. Câu lệnh nào dưới đây 2. Câu lệnh nào sau đây
không hợp lệ: KHÔNG tăng giá trị của
biến a lên 1
A. x = y;
B. x = x + 1; A. a++;
C. x + 1 = x; B. a += 1;
D. x += x * x; C. a = a + 1;
D. a += a + 1;

Đại học Bách Khoa TpHCM Chương 6: Hàm và tổ chức chương trình Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 32
Ôn tập
3. Hãy cho biết sau khi 4. Hãy cho biết câu lệnh
thực hiện đoạn chương sau xuất kết quả gì ra màn
trình sau, x có giá trị bằng hình
bao nhiêu? printf ("%f\n", cos(90));
int x = 2, y = 7;
x *=(y + 2) + 3;

Đại học Bách Khoa TpHCM Chương 6: Hàm và tổ chức chương trình Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 33
Ôn tập
5. Hãy cho biết kết xuất 6. Hãy cho biết kết xuất của
của chương trình sau đoạn chương trình sau
void main() { void main() {
int a = 6, b = 6; int a = 6;
if(a > 5) { printf( " a = %d ", a++);
a -= 1; b += 1; printf( " a = %d", ++a);
} {
else { int a = 8;
a += 1; b -= 1; printf( " a = %d", ++a );
} }
printf( " a = %d", a ); printf( " a = %d\n", a);
printf( " b = %d", b); }
}

Đại học Bách Khoa TpHCM Chương 6: Hàm và tổ chức chương trình Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 34
Ôn tập
7. Hãy cho biết kết xuất 8. Hãy cho biết câu lệnh
của đoạn chương trình sau đây:
sau switch (i)
void main(){ { case 1:
case 2:
int x = 6, y = 8; case 3:
if (x++ < 6) case 7: j = i; break; }
printf (“%d \n“, ++y ); tương đương với câu lệnh
nào dưới đây:
if(x > 6)
A. if (i == 1) j = i;
printf(“%d \n”, --y); B. if (i == 7) j = i;
else C. if ((i == 1) && (i == 2) &&
printf(“%d \n”, y++ );} (i == 3) && (i == 7)) j = i;
D. if ((i == 1) || (i == 2) ||
(i == 3) || (i == 7)) j = i;
Đại học Bách Khoa TpHCM Chương 6: Hàm và tổ chức chương trình Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 35
Ôn tập
9. Đoạn chương trình sau 10. Đoạn chương trình sau
xuất gì ra màn hình xuất gì ra màn hình
int x = 4; int x = 6;
int y = 7; int y = 4;
if ( x > 5 ) if ( x > 5 )
if ( y > 5 ) if ( y > 5 )
printf ("x and y are > 5"); printf( "x and y are > 5" );
else else
printf( "x is <= 5"); printf( "x is <= 5");

Đại học Bách Khoa TpHCM Chương 6: Hàm và tổ chức chương trình Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 36

You might also like