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 int main() {

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 int main() {

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