Lập trình nâng cao - Bài 2: Luồng điều khiển

pdf 44 trang vanle 1910
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình nâng cao - Bài 2: Luồng điều khiể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:

  • pdflap_trinh_nang_cao_bai_2_luong_dieu_khien.pdf

Nội dung text: Lập trình nâng cao - Bài 2: Luồng điều khiển

  1. Bài 2: Luồng điều khiển Giảng viên: Hoàng Thị Điệp Khoa Công nghệ Thông tin – ĐH Công Nghệ
  2. Chapter 2 Flow of Control Copyright © 2010 Pearson Addison-Wesley. All rights reserved
  3. Mục tiêu bài học • Biểu thức logic – Lập biểu thức, Tính giá trị & Các luật ưu tiên • Các cơ chế rẽ nhánh – if-else – switch – if-else lồng nhau • Lặp – while, do-while, for – Các vòng lặp lồng nhau DTH INT2202
  4. Biểu thức logic: Display 2.1 Các phép toán so sánh • Các phép toán logic – Phép AND logic (&&) – Phép OR logic (||) DTH INT2202
  5. Tính giá trị biểu thức logic • Kiểu dữ liệu bool – Trả về true hoặc false – true, false là các hằng định nghĩa sẵn trong thư viện • Bảng giá trị chân lý – Display 2.2 trong slide sau DTH INT2202
  6. Tính giá trị biểu thức logic: Display 2.2 Bảng giá trị chân lý DTH INT2202
  7. Display 2.3 Thứ tự ưu tiên các phép toán (1/4) DTH INT2202
  8. Display 2.3 Thứ tự ưu tiên các phép toán (2/4) DTH INT2202
  9. Display 2.3 Thứ tự ưu tiên các phép toán (3/4) DTH INT2202
  10. Display 2.3 Thứ tự ưu tiên các phép toán (4/4) DTH INT2202
  11. Ví dụ về thứ tự ưu tiên • Số học tính trước logic – x + 1 > 2 || x + 1 2 || (x + 1) = 0) && (y > 1) – Cẩn thận với toán tử tự tăng! • (x > 1) && (y++) • Dùng số nguyên như giá trị logic – Số khác 0 true – 0 false DTH INT2202
  12. Các cơ chế rẽ nhánh • Lệnh if-else – Lựa chọn giữa 2 lệnh dựa trên biểu thức điều kiện – Ví dụ: if (hrs > 40) grossPay = rate*40 + 1.5*rate*(hrs-40); else grossPay = rate*hrs; DTH INT2202
  13. Cú pháp lệnh if-else • Cú pháp hình thức: if ( ) else • Chú ý là mỗi lựa chọn chỉ là MỘT lệnh! • Để có nhiều lệnh thực hiện trong 1 nhánh hãy dùng lệnh gộp DTH INT2202
  14. Lệnh gộp/tạo khối • Chỉ được thực thi 1 lệnh ở mỗi nhánh • Ta phải dùng lệnh gộp { } cho 1 nhóm lệnh – Còn được gọi là lệnh tạo khối • Mỗi khối cần có 1 lệnh tạo khối – Ngay cả khi khối chỉ có 1 lệnh – Làm chương trình dễ đọc hơn DTH INT2202
  15. Ví dụ lệnh tạo khối • Chú ý cách lùi đầu dòng trong ví dụ: if (myScore > yourScore) { cout << "I win!\n"; wager = wager + 100; } else { cout << "I wish these were golf scores.\n"; wager = 0; } DTH INT2202
  16. Lỗi thường gặp • Nhầm lẫn phép "=" và phép "==" • Một là “phép gán” (=) • Một là “phép so sánh bằng” (==) – Rất khác nhau trong C++! – Ví dụ: if (x = 12) Chú ý phép toán sử dụng! Do_Something else Do_Something_Else DTH INT2202
  17. else là tùy chọn • Vế else là tùy chọn – Nếu trong nhánh false (else) bạn chẳng muốn làm gì thì có thể lược bớt nhánh này – Ví dụ: if (sales >= minimum) salary = salary + bonus; cout << "Salary = " << salary; – Chương trình sẽ tiếp tục thực thi lệnh cout DTH INT2202
  18. Các lệnh lồng nhau • Lệnh if-else có thể chứa lệnh nhỏ hơn – Lệnh bao ngoài có thể là lệnh kép hoặc lệnh đơn (như ta vừa thấy) – Lệnh bên trong có thể là bất cử lệnh gì, kể cả là một lệnh if-else khác! – Ví dụ: if (speed > 55) if (speed > 80) cout << "You’re really speeding!"; else cout << "You’re speeding."; • Chú ý lùi đầu dòng hợp lý! DTH INT2202
  19. Lệnh if-else nhiều nhánh • Không mới, chỉ lùi đầu dòng là khác • Tránh được lùi đầu dòng “quá nhiều” – Cú pháp: DTH INT2202
  20. Ví dụ lệnh if-else nhiều nhánh DTH INT2202
  21. Lệnh switch • Là một lệnh khác để điều khiển rẽ nhiều nhánh • Sử dụng biểu thức điều khiển có giá trị trả về kiểu bool (true hoặc false) • Cú pháp: – Slide sau DTH INT2202
  22. Cú pháp lệnh switch DTH INT2202
  23. Ví dụ lệnh switch DTH INT2202
  24. Lệnh switch: nhiều nhãn case • Chương trình sẽ thực thi switch tới khi gặp lệnh break – switch cung cấp một “lối vào” – Example: case "A": case "a": cout << "Excellent: you got an "A"!\n"; break; case "B": case "b": cout << "Good: you got a "B"!\n"; break; – Chú ý là có thể nhiều nhãn trỏ tới cùng “lối vào” DTH INT2202
  25. Lỗi thường gặp với switch • Quên lệnh break; – Đây không phải lỗi biên dịch – Chương trình đơn thuần thực thi cả các nhãn case phía sau tới khi gặp được 1 lệnh break; • Ứng dụng hay gặp nhất: TẠO MENU – Cho bạn một hình dung rõ ràng về “bức tranh toàn cảnh” – Thể hiện hiệu quả cấu trúc menu – Mỗi nhánh là một lựa chọn của menu DTH INT2202
  26. Ví dụ menu dùng switch • Lệnh switch và menu là “cặp đôi hoàn hảo” : switch (response) { case "1": // Execute menu option 1 break; case "2": // Execute menu option 2 break; case 3": // Execute menu option 3 break; default: cout << "Please enter valid response."; } DTH INT2202
  27. Toán tử điều kiện • Còn được gọi là “toán tử tam nguyên” – Cho phép nhúng các điều kiện vào biểu thức – Về cơ bản đây là toán tử viết tắt của “if-else” – Ví dụ: if (n1 > n2) max = n1; else max = n2; – Có thể viết thành: max = (n1 > n2) ? n1 : n2; • "?" và ":" tạo thành toán tử tam nguyên này DTH INT2202
  28. Lặp • 3 kiểu lặp trong C++ – while • Linh hoạt nhất • Không “giới hạn” – do-while • Kém linh hoạt nhất • Luôn thực thi thân vòng lặp ít nhất 1 lần – for • Là phép lặp “đếm” tự nhiên DTH INT2202
  29. Cú pháp lệnh lặp while DTH INT2202
  30. Ví dụ lệnh lặp while • Xem xét đoạn mã: count = 0; // Khởi tạo while (count < 3) // Điều kiện lặp { cout << "Hi "; // Thân vòng lặp count++; // Biểu thức cập nhật } – Thân vòng lặp được thực hiện bao nhiêu lần? DTH INT2202
  31. Cú pháp lệnh lặp do-while DTH INT2202
  32. Ví dụ lệnh lặp do-while • count = 0; // Khởi tạo do { cout << "Hi "; // Thân vòng lặp count++; // Biểu thức cập nhật } while (count < 3); // Điều kiện lặp – Thân vòng lặp được thực hiện bao nhiêu lần? – Lệnh lặp do-while luôn thực thi thân vòng lặp ít nhất 1 lần! DTH INT2202
  33. So sánh while và do-while • Rất giống nhau nhưng – Có một điểm khác biệt quan trọng • Vấn đề là “KHI NÀO” biểu thức logic được kiểm tra • while: kiểm tra TRƯỚC khi thân lặp được thực hiện • do-while: kiểm tra SAU khi thân lặp được thực hiện • Ngoài khác biệt này, về cơ bản chúng giống hệt nhau! • while phổ biến hơn vì nó linh hoạt hơn DTH INT2202
  34. Toán tử dấu phẩy • Tính một danh sách các biểu thức, trả về giá trị của biểu thức cuối cùng • Được dùng nhiều nhất trong vòng lặp for • Ví dụ: first = (first = 2, second = first + 1); – first được gán giá trị bằng 3 – second được gán giá trị bằng 3 • Không nói chắc được thứ tự tính các biểu thức DTH INT2202
  35. Cú pháp lệnh lặp for for (Khởi_tạo; Biểu_thức_logic; Cập_nhật) Thân_vòng_lặp • Giống như if-else, Thân_vòng_lặp có thể là một khối lệnh – Thật ra ta thường gặp dạng khối lệnh hơn DTH INT2202
  36. Ví dụ vòng lặp for • for (count=0;count<3;count++) { cout << "Hi "; // Thân vòng lặp } • Thân vòng lặp được thực hiện bao nhiêu lần? • Khởi_tạo, Điều_kiện_lặp và Cập_nhật đều được đưa vào cấu trúc lệnh lặp for. • Bản chất lệnh lặp này dựa trên đếm DTH INT2202
  37. Các vấn đề liên quan đến lệnh lặp • Biểu thức điều kiện của lệnh lặp có thể là bất cứ biểu thức logic nào • Ví dụ: while (count<3 && done!=0) { // Do something } for (index=0;index<10 && entry!=-99) { // Do something } DTH INT2202
  38. Lỗi thường gặp: Đặt dấu ; nhầm chỗ • Hãy cẩn thận vì bạn có thể đặt dấu ; nhầm chỗ – Ví dụ: while (response != 0) ; { cout > response; } – Chú ý dấu “;” phía sau điều kiện của while! • Kết quả của ví dụ trên là: Lặp vô hạn! DTH INT2202
  39. Lỗi thường gặp: Lặp vô hạn • Điều kiện lặp phải cho giá trị false ở lần lặp nào đó – Nếu không lặp vô hạn. – Ví dụ: while (1) { cout << "Hello "; } – Đây là một lệnh lặp hoàn toàn hợp lệ trong C++ luôn vô hạn! • Lặp vô hạn đôi khi là có chủ ý – Ví dụ: trong các hệ thống nhúng DTH INT2202
  40. Lệnh break và continue • Luồng điều khiển – Các lệnh lặp cho phép ta điều khiển “uyển chuyển” việc ra/vào luồng chương trình – Trong số ít trường hợp, ta có thể thay đổi luồng tự nhiên • break; – Buộc lệnh lặp dừng ngay lập tức. • continue; – Bỏ qua phần còn lại của thân vòng lặp • Những lệnh này ảnh hưởng tới luồng tự nhiên – Chỉ dùng khi thực sự cần thiết! DTH INT2202
  41. Lệnh lặp lồng nhau • Nhắc lại: Ta có thể đặt bất cứ lệnh C++ hợp lệ nào vào thân vòng lặp • Điều đó có nghĩa thân vòng lặp có thể là một lệnh lặp khác! – Gọi là các lệnh lặp lồng nhau • Đòi hỏi bạn phải lùi đầu dòng cẩn thận: for (outer=0; outer 2; inner ) cout << outer << inner; – Chú ý là ví dụ này không cần { } vì mỗi thân lặp chỉ có một lệnh – Phong cách lập trình tốt: thêm { } cho code dễ đọc DTH INT2202
  42. Tóm tắt 1 • Biểu thức logic – Tương tự như biểu thức số học kết quả là true hoặc false • Các lệnh rẽ nhánh của C++ – if-else, switch – Lệnh switch nên được dùng khi muốn tạo menu • Các lệnh lặp của C++ – while – do-while – for DTH INT2202
  43. Tóm tắt 2 • Lệnh lặp do-while – Thực thi thân vòng lặp ít nhất 1 lần • Lệnh lặp for – Về bản chất là phép lặp dựa trên đếm • Có thể thoát sớm các lệnh lặp – Lệnh break – Lệnh continue – Phong cách lập trình: Nên hạn chế dùng 2 lệnh này DTH INT2202
  44. Chuẩn bị bài tới • Đọc chương 3 giáo trình. DTH INT2202