
Tại sao bạn cần làm bài này?
-
Đây là bài toán kinh điển mô phỏng logic tính toán thực tế trong các hệ thống nhân sự (HRM).
-
Bạn sẽ thành thạo câu lệnh điều kiện (
if-else), làm việc với số thực (float) và định dạng chuỗi (f-string). -
Sau bài viết này, bạn không chỉ biết code chạy đúng mà còn biết cách viết code “sạch” và mở rộng được bài toán.
Tóm tắt nội dung
-
Phân tích đề bài và logic tính tăng ca (Overtime).
-
Giải pháp cơ bản (Standard) với
if-else. -
Giải pháp nâng cao: Xử lý lỗi nhập liệu (Try-except).
-
Mở rộng bài toán: Hướng đối tượng (OOP) để quản lý nhân sự.
-
Checklist kiểm tra lỗi và gợi ý tài liệu học tiếp.
Bạn xem thêm:
- Tính tổng hai số nhập từ bàn phím Python
- Tính Diện Tích và Chu Vi Hình Chữ Nhật Python
- Xoay Ma Trận 90 Độ Python: Thuật Toán In-place Tối Ưu
1. Đề bài

Do đầu vào chỉ có tên bài, xây dựng đề bài theo chuẩn ACM/ICPC để bạn luyện tư duy logic:
Mô tả:
Viết chương trình tính tổng lương cho nhân viên dựa trên số giờ làm việc (hours) và mức lương theo giờ (rate).
Quy định làm thêm giờ (Overtime):
-
Nếu làm việc <= 40 giờ/tuần: Trả lương theo mức bình thường.
-
Nếu làm việc > 40 giờ/tuần: 40 giờ đầu trả mức bình thường, các giờ vượt mức được trả gấp 1.5 lần mức lương cơ bản.
Input:
-
Dòng 1: Số giờ làm việc (số thực,
hours>= 0). -
Dòng 2: Mức lương theo giờ (số thực,
rate>= 0).
Output:
-
Một dòng duy nhất in ra tổng lương, định dạng chính xác 2 chữ số thập phân.
Constraints:
-
0 <= hours <= 168 (số giờ trong 1 tuần).
-
0 <= rate <= 1,000,000.
Ví dụ 1:
Input:
45
10.50
Output:
498.75
(Giải thích: 40h * 10.5 + 5h * 10.5 * 1.5 = 420 + 78.75 = 498.75)
Ví dụ 2:
Input:
30
10
Output:
300.00
2. Phân tích tư duy
Logic tính toán
Bài toán này không chỉ là nhân hours * rate. Chúng ta cần một điểm rẽ nhánh (branching logic) dựa trên ngưỡng (threshold) là 40 giờ.
Công thức tổng quát:
Step-by-step
-
Nhập dữ liệu: Dùng
input()và ép kiểu sangfloat. -
Kiểm tra điều kiện: So sánh
hoursvới 40. -
Tính toán: Áp dụng công thức tương ứng.
-
Xuất dữ liệu: Sử dụng f-string
:.2fđể làm tròn đúng yêu cầu tiền tệ.
Edge cases (Các trường hợp biên)
-
hours = 0: Lương phải là 0. -
hours = 40: Vừa đủ ngưỡng, không có giờ tăng ca. -
hours = 40.01: Có một chút xíu tăng ca (cần tính chính xác số thực). -
Người dùng nhập chữ thay vì số (Sẽ xử lý ở phần nâng cao).
Bẫy thường gặp
-
Sai công thức tăng ca: Nhiều bạn tính
hours * rate * 1.5cho toàn bộ số giờ khihours > 40. Sai! Chỉ phần dôi ra mới được nhân 1.5. -
Lỗi làm tròn: Sử dụng
round()quá sớm có thể gây sai số. Chỉ làm tròn khi in kết quả (print).
3. Giải pháp:
Đây là cách giải quyết trực diện nhất sử dụng if-else, phù hợp với người mới bắt đầu học Python.
Độ phức tạp:
-
Time Complexity: O(1) – Chỉ thực hiện các phép tính cơ bản, không phụ thuộc quy mô input.
-
Space Complexity: O(1) – Chỉ dùng vài biến lưu trữ.
# Solution 1: Basic If-Else Logic
import sys
def calculate_pay():
try:
# Đọc dữ liệu từ stdin (theo chuẩn competitive programming)
# Sử dụng sys.stdin.read().split() nếu nhập trên 1 dòng
# Ở đây dùng input() cho dễ hiểu từng dòng
hours_input = input().strip()
rate_input = input().strip()
# Ép kiểu dữ liệu sang số thực
hours = float(hours_input)
rate = float(rate_input)
# Kiểm tra logic tính lương
if hours <= 40:
pay = hours * rate
else:
overtime_hours = hours - 40
# 40 giờ đầu + giờ làm thêm (hệ số 1.5)
pay = (40 * rate) + (overtime_hours * rate * 1.5)
# In kết quả format 2 chữ số thập phân
print(f"{pay:.2f}")
except ValueError:
# Trường hợp input không phải số
print("Error: Please enter valid numeric input")
# Chạy hàm
if __name__ == "__main__":
calculate_pay()
4. Biến thể nâng cao

Khi đi làm hoặc phỏng vấn, bạn cần chứng minh code của mình “robust” (bền vững) và dễ bảo trì. Dưới đây là 2 cách nâng cấp bài toán.
Biến thể 1: Validate Input chặt chẽ
Trong thực tế, người dùng có thể nhập số âm hoặc dữ liệu rác. Chúng ta cần hàm nhập liệu an toàn.
Ý tưởng:
-
Viết hàm
get_valid_floatriêng biệt. -
Sử dụng vòng lặp
while Trueđể bắt người dùng nhập lại cho đến khi đúng.
# Partial Code Suggestion - Input Validation
def get_valid_float(prompt):
while True:
try:
value = float(input(prompt))
if value < 0:
print("Lỗi: Giá trị không được âm.")
continue
return value
except ValueError:
print("Lỗi: Vui lòng nhập số hợp lệ.")
# Logic chính ngắn gọn hơn
# pay = (hours * rate) if hours <= 40 else (40 * rate + (hours - 40) * rate * 1.5)
Biến thể 2: Hướng đối tượng (OOP) – Quản lý nhiều nhân viên
Khi cần tính lương cho cả công ty, chúng ta không dùng biến rời rạc mà dùng Class.
Ý tưởng:
-
Class
Employeecó thuộc tínhname,hours,rate. -
Method
calculate_salary()đóng gói logic tính toán.
# Partial Code Suggestion - OOP Approach
class Employee:
def __init__(self, name, hours, rate):
self.name = name
self.hours = hours
self.rate = rate
def calculate_salary(self):
if self.hours <= 40:
return self.hours * self.rate
else:
regular_pay = 40 * self.rate
overtime_pay = (self.hours - 40) * self.rate * 1.5
return regular_pay + overtime_pay
# Sử dụng
emp1 = Employee("Alice", 45, 10)
print(f"Lương của {emp1.name}: {emp1.calculate_salary():.2f}")
5. Lỗi thường gặp
Để code của bạn đạt chuẩn Senior, hãy kiểm tra danh sách này:
Checklist:
-
[x] Đã ép kiểu
floatchưa? (Lương và giờ thường lẻ). -
[x] Đã xử lý trường hợp
hours > 40đúng công thức tách dòng chưa? -
[x] Output có đúng format
.2fkhông? (Ví dụ 300 phải in là 300.00). -
[x] Tên biến có tiếng Anh, rõ nghĩa không? (Tránh dùng
a,b,x,y).
Lỗi thường gặp:
-
Hardcode: Viết thẳng số
40hay1.5vào nhiều nơi trong code. -> Tối ưu: Nên khai báo hằng sốSTANDARD_HOURS = 40vàOT_MULTIPLIER = 1.5ở đầu chương trình để dễ sửa sau này.
6. FAQ – Câu hỏi thường gặp
1. Bài tập tính lương Python này có cần dùng thư viện ngoài không?
Không. Bạn chỉ cần dùng các hàm có sẵn (built-in) của Python, đây là bài tập Python cơ bản giúp rèn tư duy logic.
2. Làm sao để rút gọn code if-else trong bài này?
Bạn có thể dùng biểu thức điều kiện (Ternary Operator) trong Python if else để viết logic tính toán trên 1 dòng, nhưng cần chú ý tính dễ đọc.
3. Tại sao input là 45 giờ nhưng kết quả tính lương làm thêm giờ Python lại sai?
Hãy kiểm tra lại công thức. Với tính lương làm thêm giờ Python, chỉ có 5 giờ dôi ra (45-40) mới được nhân hệ số 1.5, không phải toàn bộ 45 giờ.
4. :.2f trong Python có ý nghĩa gì khi format currency Python?
Đây là f-string format giúp hiển thị số thực với đúng 2 chữ số thập phân, rất quan trọng trong format currency Python để hiển thị tiền tệ chính xác.
5. Tôi là người mới, nên bắt đầu học lập trình Python cho người mới từ đâu?
Hãy bắt đầu từ cú pháp cơ bản, biến, kiểu dữ liệu và cấu trúc điều khiển như bài này. Lập trình Python cho người mới cần sự kiên nhẫn thực hành nhiều bài tập nhỏ.
6. Công thức tính tiền tăng ca Python chuẩn là gì?
Công thức tính tiền tăng ca Python thường là: (Giờ chuẩn * Lương) + ((Tổng giờ - Giờ chuẩn) * Lương * Hệ số OT).
7. Làm sao để chương trình không bị crash khi nhập chữ (xử lý lỗi nhập liệu Python)?
Bạn cần dùng khối try...except ValueError để bắt lỗi khi người dùng nhập sai định dạng, đây là kỹ thuật xử lý lỗi nhập liệu Python bắt buộc.
8. Có nên viết hàm tính lương Python riêng không?
Có. Việc tách logic thành hàm tính lương Python (def calculate_pay) giúp code gọn gàng, dễ tái sử dụng và dễ kiểm thử (test) hơn.
9. Khi nào nên dùng OOP Python ví dụ như Class nhân viên?
Khi bạn cần quản lý danh sách nhiều nhân viên với các thuộc tính đi kèm (tên, ID), OOP Python ví dụ sẽ giúp code có cấu trúc và dễ mở rộng hơn functional programming.
7. Bài tập tương tự
Nếu đã làm chủ bài này, hãy thử thách bản thân với các bài khó hơn:
-
Tính thuế thu nhập: Áp dụng biểu thuế lũy tiến (nhiều mức
if-elif). -
Tính lương Net/Gross: Trừ bảo hiểm, thuế trước khi ra lương thực nhận.
-
Quản lý chấm công: Đọc file
.txthoặc.csvchứa bảng chấm công và tính lương hàng loạt.
Các khóa học liên quan:
Một số sản phẩm từ Python:
Một số sách lập trình Python bạn hãy tham khảo
