10 Bài tập Python – lệnh Rẽ nhánh Nâng cao

Dưới đây là 10 bài tập nâng cao, tập trung vào các tình huống logic phức tạp, lồng ghép nhiều điều kiện và xử lý các trường hợp biên (edge cases) bằng if/elif/else.

[Xem 20 bài tập if, elif, else Python – Luyện tập chuyên sâu về các cấu trúc rẽ nhánh]

[10 bài tập Python cấu trúc rẽ nhánh (if, elif, else) – Với Ứng dụng thực tế]

Bài 1. Kiểm tra Ngày Hợp lệ (Logic Lồng ghép):

  • Đề bài: Nhập vào 3 số nguyên: ngay, thang, nam. Kiểm tra xem 3 số này có tạo thành một ngày hợp lệ hay không.
  • Mục tiêu: Luyện tập if lồng nhau và xử lý các điều kiện phức tạp.
  • Gợi ý:
    • Kiểm tra thang (1-12) và ngay (1-31) trước.
    • Nếu thang là 4, 6, 9, 11: ngay phải $\leq$ 30.
    • Nếu thang là 2: Phải kiểm tra năm nhuận (bài 12 cũ).
      • Nếu là năm nhuận: ngay phải $\leq$ 29.
      • Nếu không phải năm nhuận: ngay phải $\leq$ 28.

Bài 2. Tìm Ngày Tiếp theo (Xử lý Trường hợp Biên):

  • Đề bài: Nhập vào một ngày, tháng, năm hợp lệ (giả sử người dùng nhập đúng). In ra ngày, tháng, năm của ngày ngay sau đó.
  • Mục tiêu: Xử lý tất cả các trường hợp chuyển tiếp: cuối ngày, cuối tháng, và quan trọng nhất là cuối năm (31/12).
  • Ví dụ:
    • Nhập (1, 3, 2024) $\rightarrow$ Xuất (2, 3, 2024)
    • Nhập (31, 1, 2024) $\rightarrow$ Xuất (1, 2, 2024)
    • Nhập (28, 2, 2023) $\rightarrow$ Xuất (1, 3, 2023)
    • Nhập (28, 2, 2024) $\rightarrow$ Xuất (29, 2, 2024) (năm nhuận)
    • Nhập (31, 12, 2024) $\rightarrow$ Xuất (1, 1, 2025)

Bài 3. Tính điểm Blackjack (Xì Dách) (Logic Trạng thái):

  • Đề bài: Viết hàm nhận vào một danh sách các lá bài (ví dụ: ['A', 'K', '5']). Tính tổng điểm.
  • Luật: ‘K’, ‘Q’, ‘J’ = 10 điểm. ‘2’-’10’ = giá trị tương ứng. ‘A’ (Át) có thể là 1 hoặc 11 điểm. ‘A’ sẽ được tính là 11 trừ khi tổng điểm vượt quá 21, lúc đó nó sẽ được tính là 1.
  • Mục tiêu: Luyện tập if để xử lý một giá trị linh hoạt (‘A’) dựa trên tổng trạng thái hiện tại.
  • Gợi ý: Tính tổng điểm với ‘A’ = 11 trước. Nếu tổng > 21, hãy kiểm tra xem có lá ‘A’ nào không và trừ 10 cho mỗi lá ‘A’ cho đến khi tổng $\leq$ 21.

Bài 4. Xếp hạng 3 Số (Logic So sánh Phức tạp):

  • Đề bài: Nhập 3 số a, b, c. In ra 3 số này theo thứ tự giảm dần mà không sử dụng hàm sort() hay cấu trúc dữ liệu list.
  • Mục tiêu: Luyện tập if/elif/else lồng nhau để xử lý mọi hoán vị có thể có của 3 số.
  • Gợi ý: Bắt đầu bằng cách tìm số lớn nhất if a >= b and a >= c: ... Sau đó, bên trong if đó, bạn chỉ cần so sánh b và c.

Bài 5. Phân loại Tọa độ Điểm (Nhiều Nhánh):

  • Đề bài: Nhập vào 2 số x và y (tọa độ của điểm P). Xác định vị trí của P:
    • Góc phần tư I ($x > 0, y > 0$)
    • Góc phần tư II ($x < 0, y > 0$)
    • Góc phần tư III ($x < 0, y < 0$)
    • Góc phần tư IV ($x > 0, y < 0$)
    • Nằm trên trục Hoành (Ox)
    • Nằm trên trục Tung (Oy)
    • Tại Gốc tọa độ (0, 0)
  • Mục tiêu: Xử lý chính xác các trường hợp “bằng 0” (nằm trên trục) trước khi xử lý các góc phần tư.

Bài 6. Trò chơi Kéo – Búa – Bao (Logic Đối kháng):

  • Đề bài: Nhập lựa chọn của người chơi 1 và người chơi 2 (“keo”, “bua”, “bao”). Xác định người thắng.
  • Mục tiêu: Xây dựng logic if để so sánh hai giá trị.
  • Gợi ý:
    • if p1 == p2: Hòa.
    • elif p1 == 'keo':
      • if p2 == 'bao': p1 thắng.
      • else (p2 == 'bua'): p2 thắng.
    • Tiếp tục cho các trường hợp p1 == 'bua' và p1 == 'bao'.

Bài 7. Đánh giá Mật khẩu Nâng cao (Tính điểm):

  • Đề bài: Nhập một mật khẩu. Đánh giá độ mạnh dựa trên thang điểm.
  • Logic:
    • Bắt đầu với diem = 0.
    • if độ dài $\geq 8$: diem += 1.
    • if độ dài $\geq 12$: diem += 1.
    • if có chứa ít nhất 1 chữ số: diem += 1.
    • if có chứa ít nhất 1 chữ hoa: diem += 1.
    • if có chứa ít nhất 1 ký tự đặc biệt (ví dụ: !@#$): diem += 1.
  • Phân loại cuối cùng:
    • if diem == 5: “Rất mạnh”
    • elif diem >= 3: “Mạnh”
    • elif diem >= 2: “Trung bình”
    • else: “Yếu”
  • Mục tiêu: Luyện tập việc sử dụng một loạt các câu if độc lập để tích lũy điểm, sau đó dùng if/elif/else để phân loại dựa trên tổng điểm.

Bài 8. Xác định Giao của hai Đoạn (Logic Khoảng):

  • Đề bài: Nhập 4 số a, b, c, d đại diện cho hai đoạn trên trục số là $[a, b]$ và $[c, d]$. Tìm đoạn giao của chúng.
  • Mục tiêu: Xử lý logic so sánh giữa các điểm đầu và điểm cuối.
  • Gợi ý:
    • Điểm bắt đầu của đoạn giao là max(a, c).
    • Điểm kết thúc của đoạn giao là min(b, d).
    • Điều kiện quan trọng: if điểm bắt đầu $>$ điểm kết thúc $\rightarrow$ in ra “Không giao nhau”.
    • else $\rightarrow$ in ra đoạn giao.

Bài 9. Tính Phí Ship Đa cấp (Ma trận Quyết định):

  • Đề bài: Viết chương trình tính phí ship dựa trên cân nặng, khoảng cách và loại hàng.
  • Luật (Ví dụ):
    • Hàng “Hỏa tốc” (base_fee = 50.000)
      • Nếu $\leq 1$ kg: + 0
      • Nếu $> 1$ kg: + 10.000 mỗi kg thêm.
      • Nếu $> 10$ km: + 20.000
    • Hàng “Tiêu chuẩn” (base_fee = 25.000)
      • Nếu $\leq 2$ kg: + 0
      • Nếu $> 2$ kg: + 5.000 mỗi kg thêm.
      • Nếu $> 30$ km: + 15.000
  • Mục tiêu: Xây dựng một cây if lồng nhau phức tạp để xử lý nhiều yếu tố đầu vào cùng lúc.

Bài 10. Kiểm tra Điểm trong Hình (Logic Hình học):

  • Đề bài: Nhập tọa độ (x, y) của một điểm. Cho một hình chữ nhật được định nghĩa bởi tọa độ góc trên bên trái (x1, y1) và góc dưới bên phải (x2, y2). Kiểm tra xem điểm (x, y) nằm Trong, Trên cạnh hay Ngoài hình chữ nhật.
  • Mục tiêu: Xử lý chính xác các trường hợp “bằng” (==).
  • Gợi ý:
    • Nằm Trong: if x > x1 and x < x2 and y > y1 and y < y2.
    • Nằm Ngoài: if x < x1 or x > x2 or y < y1 or y > y2.
    • Nằm Trên cạnh: Trường hợp else (nghĩa là không trong cũng không ngoài). Đây là một cách suy luận đơn giản, hoặc bạn có thể viết điều kiện tường minh.

Comments are closed.