Bài giảng môn Nhập môn lập trình - Bài 3: Lệnh rẽ nhánh/lựa chọn
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng môn Nhập môn lập trình - Bài 3: Lệnh rẽ nhánh/lựa chọn", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_mon_nhap_mon_lap_trinh_bai_3_lenh_re_nhanhlua_chon.pdf
Nội dung text: Bài giảng môn Nhập môn lập trình - Bài 3: Lệnh rẽ nhánh/lựa chọn
- 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 Expression Lệnh switch case Case 1 Statement(s) Case 2 true false Statement(s) Condition Case 3 Statement(s) Statement(s) Statement(s) Default Statement(s) 2 Nhập môn lập trình - Rẽ nhánh
- If statement – Câu lệnh if Nếu Điều kiện đúng thì true Thực hiện Lệnh Condition false Statement(s) pseudocode IF (Condition) 1. // if syntax 2. if (Condition) THEN Statement(s); 3. { ENDIF; 4. Statements; 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 true Ví dụ: Condition 1. if (Condition) false Statement 1 2. { Statement 2 3. Statement 1; Statement 3 4. Statement 2; Statement 4 5. Statement 3; 6. Statement 4; 7. } 4 Nhập môn lập trình - Rẽ nhánh
- if else statement – Câu lệnh if else 1. // if else syntax 2. if (Condition) true false 3. { Condition 4. Statement(s); Statement(s) Statement(s) 5. 6. } 7. else 8. { pseudocode 9. Statement(s); IF (Condition) 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; true false 1. // C code Điều kiện 2. if (Điều kiện) 3. Lệnh 1; Lệnh 1 Lệnh 2 4. else 5. Lệnh 2; 6 Nhập môn lập trình - Rẽ nhánh
- Lệnh if else if else Kiểm tra nhiều trường hợp true 1. if (Condition 1) 2. { Condition 1 Statement(s) 3. Statement(s); false 4. } true 5. else if(Condition 2) Condition 2 Statement(s) 6. { 7. Statement(s); false 8. true 9. } Condition 3 Statement(s) 10 false 11.else 12.{ Statement(s) 13. Statement(s); 14. 15.} 7 Nhập môn lập trình - Rẽ nhánh
- Ví dụ minh hoạ if Trị tuyệt đối Nếu a < 0 true a = -a a < 0 Xuất a false a = -a 1. if (a < 0) 2. a = -a; 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ẻ true false Nếu a chia chẵn cho 2 thì a%2==0 Xuất a chẵn Ngược lại thì a chẵn a lẻ Xuất: a lẻ pseudocode 1. // C code IF (a % 2 == 0) 2. if (a % 2 == 0) THEN Print a even; 3. printf("a chan"); ELSE Print a odd; 4. else ENDIF; 5. printf("a le"); (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 true Nếu a 0 a dương false Ngược lại true a dương a bằng 0 a > 0 1. if (a 0) 4. printf("a duong"); 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 1. if (a > b) 2. { true false 3. max = a; a > b 4. printf("a max"); 5. } max = a max = b 6. else Xuất a max Xuất b max 7. { 8. max = b; 9. printf("b max"); 10.} 11 Nhập môn lập trình - Rẽ nhánh
- Lồng nhau – Nested if Một câu lệnh có thể 1. if(a % 2 == 0) 2. if(a 0) 5. printf("a chan va duong"); 6. else 7. printf("a bang 0"); Các cấu trúc if được 8. else xem như một câu 9. if(a == 0) 10. printf("a bang 0"); lệnh đơn 11. else{ 12. printf("a le "); if 13. if (a < 0) if else printf("va am"); 14. else Ví dụ 15. printf("va duong"); 16. } 12 Nhập môn lập trình - Rẽ nhánh
- 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 Thêm { } 1. // Giai Phuong trinh ax + b = 0 2. if(a == 0); // “;” !? 3. if(b == 0) 4. printf("PT vo so nghiem"); 5. else (b != 0) // !? 6. printf("PT vo nghiem"); 7. else 8. x = -b/a; 9. printf("x = %d", x); // !? 13 Nhập môn lập trình - Rẽ nhánh
- switch case statement 1. // switch case syntax 2. switch(Expression) 3. { Expression 4. case Value1: 5. Statement(s); Case 1 6. break; Statement(s) 7. case Value2: Case 2 8. Statement(s); Statement(s) 9. break; 10. case Value3: Case 3 Statement(s) 11. Statement(s); 12. break; 13. Default 14. default : Statement(s) 15. Statement(s); 16.} 14 Nhập môn lập trình - Rẽ nhánh
- Nhận xét 1. switch(Biểu thức) Chia thành nhiều trường hợp 2. { để xử lý 3. case : 4. Lệnh 1; Biểu thức có giá trị kiểu số 5. break; nguyên 6. case : 7. Lệnh 2; Giá trị là một số nguyên cụ 8. break; thể 9. case : Các giá trị không được trùng 10. Lệnh 3; 11. break; nhau 12. Mỗi trường hợp kết thúc 13. default : 14. Lệnh n; bằng lệnh break 15.} Có thể khuyết phần default 15 Nhập môn lập trình - Rẽ nhánh
- Ví dụ minh hoạ 1. // Đọc số true 2. switch(a) 3. { a = 0 Xuất “khong” 4. case 0: false 5. printf("khong"); 6. break; true a = 1 Xuất “mot” 7. case 1: 8. printf("mot"); false 9. break; 10. true a = 9 Xuất “chin” 11. case 9: 12. printf("chin"); false 13. break; Xuất “Khong doc duoc” 14. default : 15. printf("khong doc duoc"); 16.} 16 Nhập môn lập trình - Rẽ nhánh
- Ví dụ minh hoạ - Khuyết default 1. // Đọc số 2. switch(a%10) true 3. { a%10= 0 Xuất “khong” 4. case 0: 5. printf("khong"); false 6. break; true 7. case 1: a%10= 1 Xuất “mot” 8. printf("mot"); false 9. break; true 10. case 2: a%10= 2 Xuất “hai” 11. printf("hai"); 12. break; false 13. true 14. case 9: a%10= 9 Xuất “chin” 15. printf("chin"); 16.} 17 Nhập môn lập trình - Rẽ nhánh
- Ví dụ minh hoạ - Khuyết break !? 1. // Chẵn lẻ true 2. switch(a%10) a%10= 0 3. { 4. case 0: false 5. case 2: true 6. case 4: a%10= 2 7. case 6: 8. case 8: false 9. printf("chan"); true 10. break; a%10= 8 Xuất “chan” 11. default : false 12. printf("le"); 13.} Xuất “le” 18 Nhập môn lập trình - Rẽ nhánh
- Ví dụ minh hoạ - Lồng nhau 1. // Đọc tháng 2. switch(thang/10) // Số hàng chục 3. { 4. case 1: 5. printf("Thang muoi "); 6. switch(thang%10) // Số hàng đơn vị 7. { 8. case 1: printf("mot."); break; 9. case 2: printf("hai."); break; 10. } 11. break; 12. case 0: 13. switch(thang){ 14. case 1: printf("Thang mot."); break; 15. 16. } 17.} 19 Nhập môn lập trình - Rẽ nhánh
- Lỗi thường gặp 1. switch(a); // “;” !? 2. { 3. case 1.2: // “1.2” !? 4. printf("1.2"); break; 5. case >0: // “>0” !? 6. printf(">0"); break; 7. case 2: 8. printf("hai"); // Thiếu break;!? 9. case 3: 10. printf("ba"); break; 11. case 2: // Trùng “2” 12. printf("trung"); break; 13. default // Thiếu “:” 14. printf("bon"); 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) Toán tử so sánh, 1. if (a>=10 && a 0) 5. break; 8. printf("a > 0"); 6. case 1: 9. if (!(a>0)) 7. printf("le"); 10. printf("a <= 0"); 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. int result; 7. result = MAX(a, b); 8. result = MAX(result, c); 9. return result; 10. } 11. void main() 12. { 13. printf("%d ", MAX(1,4)); 14. printf("%d ", largest(7,3,8)); 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 23 Nhập môn lập trình - Rẽ nhánh
- Tham khảo 3.1 – Kiểm tra số 1. #include 2. int main() 3. { 4. int soNguyen; 5. printf("Nhap mot so nguyen: "); 6. scanf("%d", &soNguyen); 7. printf("Ban vua nhap so "); 8. if (soNguyen > 0) 9. printf("duong"); 10. else if (soNguyen < 0) 11. printf("am"); 12. else 13. printf("khong"); 14. if (soNguyen % 2 == 0) 15. 24 Nhập môn lập trình - Rẽ nhánh
- 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); 25 Nhập môn lập trình - Rẽ nhánh
- Tham khảo 3.2 – Đổi ký tự 1. #include 2. int main() 3. { 4. char kyTu; 5. printf("Nhap mot ky tu: "); 6. scanf("%c", &kyTu); 7. if (kyTu>='a' && kyTu = 'A' && kyTu <= 'Z'){ 11. kyTu = kyTu - 'A' + 'a'; 12. printf("Chuyen sang chu thuong: %c", kyTu); 13. }else 14. printf("Khong phai chu"); 15. 26 Nhập môn lập trình - Rẽ nhánh
- 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 27 Nhập môn lập trình - Rẽ nhánh
- Tham khảo 3.3 – Phương trình bậc nhất 1. #include 2. int main() 3. { 4. float a, b, x; 5. // 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. x = -b/a; 13. 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 29 Nhập môn lập trình - Rẽ nhánh
- Tham khảo 3.4 – Phương trình bậc hai 1. #include 2. int main() 3. { 4. float a, b, c, Delta, x; 5. // Nhập a, b, c 6. if (a == 0) 7. // Giải phương trình bx + c = 0 8. else{ 9. Delta = b*b – 4*a*c; 10. if (Delta 0) 13. 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 31 Nhập môn lập trình - Rẽ nhánh
- Tham khảo 3.5 – Tìm max 1. #include 2. int main() 3. { 4. float a, b, c, d, max; 5. // Nhập a, b, c, d 6. max = a; 7. 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) 33 Nhập môn lập trình - Rẽ nhánh
- Tham khảo 3.6 – Sắp xếp 1. #include 2. int main() 3. { 4. float a, b, c, d, tam; 5. // 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. if (b > c){ 17. 34 Nhập môn lập trình - Rẽ nhánh
- 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: 9 = 9) 8 = 8) 7 = 7) 6. printf("Kha"); 5 > ĐTB: Yếu 7. Gợi ý: Kiểm tra các trường hợp dùng if else if else 35 Nhập môn lập trình - Rẽ nhánh
- 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 = 9) 9. printf("Xuat sac"); 10. else if (DTB >= 8) 11. printf("Gioi"); 12. 13. }else 14. printf("Nhap khong dung"); 15. 36 Nhập môn lập trình - Rẽ nhánh
- 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 37 Nhập môn lập trình - Rẽ nhánh
- 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 38 Nhập môn lập trình - Rẽ nhánh
- 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