TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH
Nhập môn lập trình Lệnh rẽ nhánh/lựa chọn TS. Ngô Hữu Dũng
Nội dung
Rẽ nhánh/lựa chọn
Lệnh if..else Lệnh switch..case
Expression
Case 1 Statement(s)
Case 2 Statement(s) false true
Condition Case 3
Statement(s)
Statement(s) Statement(s)
Default
2
Nhập môn lập trình - Rẽ nhánh
Statement(s)
If statement – Câu lệnh if
Nếu Điều kiện đúng thì
Thực hiện Lệnh
Condition
true
Statement(s)
pseudocode IF (Condition)
false
THEN Statement(s);
ENDIF;
Statements; ...
1. // if syntax 2. if (Condition) 3. { 4. 5. 6. }
3
Nhập môn lập trình - Rẽ nhánh
Khối lệnh - Block
Khối lệnh: Gồm nhiều câu lệnh
Cần đặt giữa dấu {…} Cách gọi khác: Lệnh phức, lệnh ghép
Condition
Ví dụ:
true
Statement 1 Statement 2 Statement 3 Statement 4
false
Statement 1; Statement 2; Statement 3; Statement 4;
1. if (Condition) 2. { 3. 4. 5. 6. 7. }
4
Nhập môn lập trình - Rẽ nhánh
if…else statement – Câu lệnh if…else
Condition
Statement(s)
Statement(s)
false true
Statement(s); ...
pseudocode IF (Condition)
Statement(s); ...
1. // if else syntax 2. if (Condition) 3. { 4. 5. 6. } 7. else 8. { 9. 10. 11.}
THEN Statement(s); ELSE Statement(s);
ENDIF;
5
Nhập môn lập trình - Rẽ nhánh
Toán tử điều kiện
1. // Conditional ternary operator (?) 2. (Điều kiện) ? Lệnh 1 : Lệnh 2;
Điều kiện
Lệnh 1
Lệnh 2
false true
1. // C code 2. if (Điều kiện) 3. Lệnh 1; 4. else 5.
Lệnh 2;
6
Nhập môn lập trình - Rẽ nhánh
Lệnh if…else if…else
true
Statement(s) Condition 1
Statement(s);
false
true
Statement(s) Condition 2
false
Statement(s); ...
true
Statement(s) Condition 3
false
Statement(s)
Statement(s); ...
Kiểm tra nhiều trường hợp 1. if (Condition 1) 2. { 3. 4. } 5. else if(Condition 2) 6. { 7. 8. 9. } 10.... 11.else 12.{ 13. 14. 15.}
7
Nhập môn lập trình - Rẽ nhánh
Ví dụ minh hoạ if
a < 0
Trị tuyệt đối Nếu a < 0 a = -a Xuất a
true
a = -a
false
1. if (a < 0) a = -a; 2.
Print a
3. printf("%d", a);
8
Nhập môn lập trình - Rẽ nhánh
Ví dụ minh hoạ if … else… Kiểm tra chẵn lẻ
Nếu a chia chẵn cho 2 thì
a%2==0
a chẵn
a lẻ
Xuất a chẵn Ngược lại thì Xuất: a lẻ
pseudocode IF (a % 2 == 0)
false true
printf("a chan");
THEN Print a even; ELSE Print a odd;
1. // C code 2. if (a % 2 == 0) 3. 4. else 5.
printf("a le");
ENDIF;
(a%2==0) ? printf("a chan") : printf("a le");
9
Nhập môn lập trình - Rẽ nhánh
Ví dụ minh hoạ if … else if … Kiểm tra âm dương
a âm
a < 0
Nếu a < 0 a âm
Ngược lại Nếu a > 0
true
false
a dương
a > 0
a dương Ngược lại a bằng 0
true
false
printf("a am");
a bằng 0
printf("a duong");
1. if (a < 0) 2. 3. else if(a > 0) 4. 5. else 6.
printf("a bang 0");
10
Nhập môn lập trình - Rẽ nhánh
Ví dụ minh hoạ - Khối lệnh - Block
Tìm max
a > b
false true
max = a; printf("a max");
max = a Xuất a max
max = b Xuất b max
max = b; printf("b max");
1. if (a > b) 2. { 3. 4. 5. } 6. else 7. { 8. 9. 10.}
11
Nhập môn lập trình - Rẽ nhánh
Lồng nhau – Nested if
if(a < 0)
printf("a chan va am");
Một câu lệnh có thể nằm bên trong một câu lệnh khác
else if(a > 0)
printf("a chan va duong");
else
printf("a bang 0");
if(a == 0)
printf("a bang 0");
else{
1. if(a % 2 == 0) 2. 3. 4. 5. 6. 7. 8. else 9. 10. 11. 12. 13. printf("a le "); if (a < 0)
Các cấu trúc if được xem như một câu lệnh đơn if… if…else…
printf("va am");
else
Ví dụ
printf("va duong");
12
Nhập môn lập trình - Rẽ nhánh
14. 15. 16. }
Lỗi thường gặp
Lỗi trong chương trình sau
Chấm phẩy ở dòng 2 Điều kiện sau else ở dòng 5 Dòng 8 và 9 cần nằm trong khối lệnh
// “;” !?
if(b == 0)
printf("PT vo so nghiem"); // !?
else (b != 0)
printf("PT vo nghiem");
Thêm {…} 1. // Giai Phuong trinh ax + b = 0 2. if(a == 0); 3. 4. 5. 6. 7. else 8. 9.
x = -b/a; printf("x = %d", x);
// !?
13
Nhập môn lập trình - Rẽ nhánh
switch… case statement
Expression
case Value1:
Case 1 Statement(s)
Statement(s); break; case Value2:
Case 2 Statement(s)
Case 3
Statement(s); break; case Value3:
Statement(s)
Statement(s); break;
Default
... default :
Statement(s)
Statement(s);
1. // switch case syntax 2. switch(Expression) 3. { 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.}
14
Nhập môn lập trình - Rẽ nhánh
Nhận xét
Chia thành nhiều trường hợp
để xử lý
case :
Biểu thức có giá trị kiểu số
Lệnh 1; break;
nguyên
case :
Giá trị là một số nguyên cụ
Lệnh 2; break;
thể
case :
Các giá trị không được trùng
nhau
Lệnh 3; break;
Mỗi trường hợp kết thúc
... default :
bằng lệnh break
Lệnh n;
1. switch(Biểu thức) 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.}
Có thể khuyết phần default
15
Nhập môn lập trình - Rẽ nhánh
Ví dụ minh hoạ
true
Xuất “khong” a = 0
case 0:
false
true
printf("khong"); break;
Xuất “mot” a = 1
case 1:
false
printf("mot"); break;
true
Xuất “chin” a = 9
... case 9:
false
Xuất “Khong doc duoc”
printf("chin"); break; default :
printf("khong doc duoc");
1. // Đọc số 2. switch(a) 3. { 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.}
16
Nhập môn lập trình - Rẽ nhánh
Ví dụ minh hoạ - Khuyết default
true
Xuất “khong” a%10= 0
case 0:
false
true
printf("khong"); break;
Xuất “mot” a%10= 1
case 1:
false
printf("mot"); break;
true
case 2:
Xuất “hai” a%10= 2
false
printf("hai"); break;
true
Xuất “chin” a%10= 9
... case 9:
printf("chin");
1. // Đọc số 2. switch(a%10) 3. { 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.}
17
Nhập môn lập trình - Rẽ nhánh
Ví dụ minh hoạ - Khuyết break !?
true
a%10= 0
false
true
a%10= 2
false
case 0: case 2: case 4: case 6: case 8:
true
Xuất “chan” a%10= 8
printf("chan"); break; default :
false
printf("le");
Xuất “le”
1. // Chẵn lẻ 2. switch(a%10) 3. { 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.}
18
Nhập môn lập trình - Rẽ nhánh
// Số hàng chục
case 1:
// Số hàng đơn vị
printf("Thang muoi "); switch(thang%10) {
case 1: printf("mot."); break; case 2: printf("hai."); break;
} break;
case 0:
switch(thang){
case 1: printf("Thang mot."); break; ...
}
Ví dụ minh hoạ - Lồng nhau 1. // Đọc tháng 2. switch(thang/10) 3. { 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.} 19
Nhập môn lập trình - Rẽ nhánh
Lỗi thường gặp
// “;” !?
case 1.2:
// “1.2” !?
printf("1.2"); break;
case >0:
// “>0” !?
printf(">0"); break;
case 2:
printf("hai");
// Thiếu break;!?
case 3:
printf("ba"); break;
case 2:
// Trùng “2”
printf("trung"); break;
default
// Thiếu “:”
printf("bon");
1. switch(a); 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.}
20
Nhập môn lập trình - Rẽ nhánh
if vs. switch
Switch kiểm tra các giá trị số nguyên If kiểm tra kết quả đúng/sai (True/False)
1. if (a>=10 && a<100) 2.
printf("a:[10..99]");
printf("a khac 0");
3. if (a) 4. 5. if (!a) 6.
printf("a = 0");
case 0:
printf("a > 0");
printf("chan"); break;
case 1:
7. if (a>0) 8. 9. if (!(a>0)) 10.
printf("a <= 0");
printf("le");
Toán tử so sánh, Toán tử luận lý Giá trị bằng 0: False Giá trị khác 0: True 1. switch(a%2) 2. { 3. 4. 5. 6. 7. 8. }
21
Nhập môn lập trình - Rẽ nhánh
Tiền xử lý và lệnh rẽ nhánh
1. #include
2. #define MAX(A, B) (A > B ? A : B)
3. // preprocessor
4. int largest(int a, int b, int c)
5. {
6.
7.
8.
int result; result = MAX(a, b); result = MAX(result, c); return result;
9. 10. } 11. void main() 12. { 13.
printf("%d ", MAX(1,4)); printf("%d ", largest(7,3,8));
14. 15. }
22
Nhập môn lập trình - Rẽ nhánh
Bài tập 3.1 – Kiểm tra số
Nhập một số nguyên bất kỳ. Hãy kiểm tra xem số ấy có tính chất như thế nào? Là số dương, âm hay bằng không? Là số chẵn hay lẻ? Có phải là số có 2 chữ số hay không? Ví dụ: Nhập vào số 9, xuất ra màn hình: “Ban vua nhap so duong, so le, va khong phai la so co hai chu so.”
Gợi ý: Sử dụng lệnh if để kiểm tra từng điều kiện
Nhập môn lập trình - Rẽ nhánh
23
Tham khảo 3.1 – Kiểm tra số
1. #include
2. int main()
3. {
4.
5.
6.
int soNguyen; printf("Nhap mot so nguyen: "); scanf("%d", &soNguyen);
7.
8.
printf("Ban vua nhap so "); if (soNguyen > 0)
9.
10.
printf("duong"); else if (soNguyen < 0)
11.
printf("am");
12.
else
13.
14.
15.
printf("khong"); if (soNguyen % 2 == 0) ...
Nhập môn lập trình - Rẽ nhánh
24
Bài tập 3.2 – Đổi ký tự Nhập một ký tự. Nếu là chữ thường thì đổi sang chữ hoa, ngược lại đổi sang chữ thường, nếu không phải là chữ thì thông báo: “Khong phai chu”. Ví dụ: Nhập vào ký tự ‘a’, xuất ký tự ‘A’
Gợi ý: Ký tự ‘a’ có mã 97, các ký tự ‘b’, ‘c’… sau đó tăng dần Ký tự “A” có mã 65, các ký tự ‘B’, ‘C’… có mã tăng dần Kiểm tra ký tự thường
if(kyTu >= ‘a’ && kyTu <=‘z’) // hoặc if (islower(kyTu))
Chuyển sang ký tự thường
kyTu = kyTu – ‘A’ + ‘a’; // hoặc kyTu = tolower(kyTu);
Nhập môn lập trình - Rẽ nhánh
25
Tham khảo 3.2 – Đổi ký tự
1.
2.
3.
#include
4.
5.
6.
char kyTu; printf("Nhap mot ky tu: "); scanf("%c", &kyTu);
7.
8.
9.
if (kyTu>='a' && kyTu <= 'z'){ kyTu = kyTu - 'a' + 'A'; printf("Chuyen sang chu hoa: %c", kyTu);
10.
}else if (kyTu >= 'A' && kyTu <= 'Z'){
11.
12.
kyTu = kyTu - 'A' + 'a'; printf("Chuyen sang chu thuong: %c", kyTu);
13.
}else
14.
printf("Khong phai chu");
15.
Nhập môn lập trình - Rẽ nhánh
26
...
Bài tập 3.3 – Phương trình bậc nhất
Giải phương trình bậc nhất ax + b = 0.
Gợi ý: Nhập giá trị cho a và b Kiểm tra các trường hợp
a = 0
b = 0
PT có vô số nghiệm
b ≠ 0
PT vô nghiệm
a ≠ 0
PT có nghiệm x = -b/a
Nhập môn lập trình - Rẽ nhánh
27
Tham khảo 3.3 – Phương trình bậc nhất
1. #include
2. int main()
3. {
4.
5.
float a, b, x; // Nhập a, b
6.
if (a == 0)
7.
if (b == 0)
8.
printf("PT vo so nghiem");
9.
else
10.
printf("PT vo nghiem");
11.
else{
12.
13.
x = -b/a; printf("PT co Nghiem x = %f", x);
14.
15.
} ...
28
Nhập môn lập trình - Rẽ nhánh
Bài tập 3.4 – Phương trình bậc hai
Giải phương trình bậc hai ax2 + bx + c = 0.
Gợi ý: Kiểm tra các trường hợp
a = 0
Giải phương trình bậc nhất bx + c = 0
a ≠ 0
Tính Delta Kiểm tra Delta
Delta > 0: Hai nghiệm Delta = 0: Nghiệm kép Delta < 0: Vô nghiệm
Nhập môn lập trình - Rẽ nhánh
29
Tham khảo 3.4 – Phương trình bậc hai
1. #include
2. int main()
3. {
4.
5.
float a, b, c, Delta, x; // Nhập a, b, c
6.
if (a == 0)
7.
// Giải phương trình bx + c = 0
8.
else{
9.
10.
Delta = b*b – 4*a*c; if (Delta < 0)
11.
printf("PT vo nghiem");
12.
13.
else if (Delta > 0) ...
14.
15.
} ...
30
Nhập môn lập trình - Rẽ nhánh
Bài tập 3.5 – Tìm max
Nhập vào 4 số, tìm số có giá trị lớn nhất. Ví dụ: Nhập 5, 9, 1, 8 max = 9 Gợi ý: Cho max giá trị ban đầu, lần lượt kiểm tra max với các số Tạm cho max = a Nếu max < b max = b Nếu max < c max = c Nếu max < d max = d
Nhập môn lập trình - Rẽ nhánh
31
Tham khảo 3.5 – Tìm max
1. #include
2. int main()
3. {
4.
5.
float a, b, c, d, max; // Nhập a, b, c, d
6.
7.
max = a; if (max < b)
8.
max = b;
9.
if (max < c)
10.
max = c;
11.
...
32
Nhập môn lập trình - Rẽ nhánh
Bài tập 3.6 – Sắp xếp
Nhập vào 4 số, hãy sắp xếp giá trị của 4 số theo thứ tự tăng dần. Ví dụ: Nhập vào 5, 9, 1, 8 xuất ra 1, 5, 8, 9. Gợi ý: Cần hoán vị (x, y): tam = x; x = y; y = tam; Tìm min (a, b, c, d)
Nếu a>b: hoán vị (a, b); nếu a>c: hoán vị (a, c); nếu a>d: hoán vị (a, d)
Tìm min (b, c, d)
Nếu b>c: hoán vị (b, c); nếu b>d: hoán vị (b, d)
Tìm min (c, d)
Nếu c > d: hoán vị (c, d)
Nhập môn lập trình - Rẽ nhánh
33
Tham khảo 3.6 – Sắp xếp
1.
2.
3.
#include
4.
5.
float a, b, c, d, tam; // Nhập a, b, c, d
6.
7.
if (a > b){
8.
tam = a; a = b; b = tam;
9.
10.
} if (a > c){
11.
tam = a; a = c; c = tam;
12.
13.
} if (a > d){
14.
tam = a; a = d; d = tam;
15.
16.
17.
Nhập môn lập trình - Rẽ nhánh
34
} if (b > c){ ...
Bài tập 3.7 – Xếp loại
Viết chương trình nhập điểm trung bình và xếp loại sinh viên theo tiêu chí sau:
printf("Xuat sac");
printf("Kha");
9 <= ĐTB: Xuất sắc 8 <= ĐTB < 9: Giỏi 7 <= ĐTB < 8: Khá 5 <= ĐTB < 7: Trung bình 5 > ĐTB: Yếu
1. if (DTB >= 9) 2. 3. else if (DTB >= 8) printf("Gioi"); 4. 5. else if (DTB >= 7) 6. 7. ...
Gợi ý:
Kiểm tra các trường hợp dùng if… else if… … else…
Nhập môn lập trình - Rẽ nhánh
35
Tham khảo 3.7 – Xếp loại
1.
#include
2.
int main()
3.
{
4.
float DTB;
5.
// Nhập DTB
6.
7.
if (DTB >=0 && DTB <=10){
8.
if (DTB >= 9)
9.
printf("Xuat sac");
10.
else if (DTB >= 8)
11.
printf("Gioi");
12.
...
13.
}else
14.
printf("Nhap khong dung");
Nhập môn lập trình - Rẽ nhánh
...
15. 36
Bài tập 3.8 – Tiền taxi
Tính tiền đi taxi từ số km nhập vào. Biết:
1 km đầu giá 15000đ Từ km thứ 2 đến km thứ 5 giá 13500đ Từ km thứ 6 trở đi giá 11000đ Nếu trên 120km được giảm 10% tổng tiền.
Gợi ý
Mỗi km có giá khác nhau, ví dụ số km là 3 thì số tiền gồm giá 1 km
đầu và giá của 2 km sau đó: 15000 x 1 + 13500 x 2
Tính tiền theo các công thức khác nhau cho các trường hợp số km khác
nhau
Nhập môn lập trình - Rẽ nhánh
37
Bài tập 3.9 – Tam giác
Nhập vào 3 số, kiểm tra đó có phải là ba cạnh của tam giác hay không không? Nếu là tam giác thì đó là tam giác đều, tam giác cân, tam giác vuông hay tam giác thường? Ví dụ: Nhập vào 3, 4, 7:
Xuất: “3, 4, 7 khong phai ba canh cua tam giac”
Nhập vào 3, 4, 5:
Xuất: “3, 4, 5 la ba canh tam giac vuong”
Gợi ý: Điều kiện tam giác: Tổng hai cạnh bất kỳ lớn hơn cạnh còn lại
a + b > c && b + c > a && a + c > b
Kiểm tra loại tam giác theo tính chất của từng loại
Nhập môn lập trình - Rẽ nhánh
38
Bài tập 3.10 – Thời gian
Nhập vào 3 số nguyên tương ứng với giờ phút giây của
một đồng hồ điện tử. Kiểm tra xem 3 số có thoả mãn điều kiện giờ phút giây?
Giờ: [0..23], Phút: [0..59], Giây: [0..59]
Nếu thoả mãn điều kiện trên: Hãy cho biết sau một giây, thời
gian sẽ hiện thị như thế nào?
Gợi ý: Số giây tăng lên một, có thể xảy ra các trường hợp:
Nếu số giây tăng đến 60: giây sẽ trở về 0 và tăng phút. Nếu số phút tăng đến 60: phút sẽ trở về 0 và tăng giờ. Nếu số giờ tăng đến 24: giờ sẽ trở về 0 (sang ngày mới).
39
Nhập môn lập trình - Rẽ nhánh
Bài tập 3.11 – Đọc số Nhập vào một số nguyên có 3 chữ số, Kiểm tra xem số nguyên ấy có đúng 3 chữ số hay không? Nếu đúng 3 chữ số: Xuất ra màn hình dạng chữ. Ví dụ: Nhập vào số 36, xuất: “Khong phai so co ba chu so” Nhập vào số 365, xuất: “Ba tram sau muoi lam”. Nhập vào số 305, xuất: “Ba tram le nam”. Gợi ý: Tính số hàng trăm, hàng chục và hàng đơn vị, hai cách:
tram = so/100; chuc = (so/10)%10; donVi = so%10; t = so; donVi = t%10; t/=10; chuc = t%10; t/=10; tram=t%10; Lần lượt xuất các số hàng trăm, chục, đơn vị dùng switch
40
Nhập môn lập trình - Rẽ nhánh