Bài Tập Python: Tính Lương Nhân Viên Có Làm Thêm Giờ
Bài Tập Python: Tính Lương Nhân Viên Có Làm Thêm Giờ

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:


1. Đề bài 

Bài Tập Python: Tính Lương Nhân Viên Có Làm Thêm Giờ
Bài Tập Python: Tính Lương Nhân Viên Có Làm Thêm Giờ

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:

Bài Tập Python

Step-by-step

  1. Nhập dữ liệu: Dùng input() và ép kiểu sang float.

  2. Kiểm tra điều kiện: So sánh hours với 40.

  3. Tính toán: Áp dụng công thức tương ứng.

  4. 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.5 cho toàn bộ số giờ khi hours > 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

Bài Tập Python: Tính Lương Nhân Viên Có Làm Thêm Giờ
Bài Tập Python: Tính Lương Nhân Viên Có Làm Thêm Giờ

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_float riê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 Employee có thuộc tính name, 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 float chư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 .2f khô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ố 40 hay 1.5 vào nhiều nơi trong code. -> Tối ưu: Nên khai báo hằng số STANDARD_HOURS = 40OT_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:

  1. Tính thuế thu nhập: Áp dụng biểu thuế lũy tiến (nhiều mức if-elif).

  2. Tính lương Net/Gross: Trừ bảo hiểm, thuế trước khi ra lương thực nhận.

  3. Quản lý chấm công: Đọc file .txt hoặc .csv chứ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

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *