Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi
    solution
    Đăng nhập
    Đăng nhập

    Đề bài: Hệ thống lương nhân viên với Interface Payable và lớp trừu tượng

    📖Cần ôn lý thuyết? Đọc bài giảng Buổi 5: Lập trình hướng đối tượng (1): lớp và đối tượng — khóa Lập trình Java

    Một công ty có ba kiểu nhân sự: FullTime, PartTime và Freelancer. Mỗi nhân sự đều được trả lương — sử dụng interface Payable để biểu diễn khả năng đó.

    1. Interface Payable:
      • double pay() — số tiền nhận trong tháng.
    2. Abstract class Employee implements Payable:
      • id (String), name (String)
      • String describe() trả về <id>|<name>
    3. FullTime extends Employee:
      • baseSalary (double) — lương cứng tháng
      • bonus (double) — thưởng tháng
      • pay() = baseSalary + bonus
    4. PartTime extends Employee:
      • hourlyRate (double), hours (int)
      • pay() = hourlyRate * hours
      • Nếu hours > 100 thì 50 giờ vượt được trả 1.5x.
    5. Freelancer extends Employee:
      • projects — danh sách tiền nhận theo từng dự án (double[])
      • pay() = tổng projects * 0.9 (sau khi trừ 10% phí nền tảng)
    6. main:
      • Đọc N nhân sự. Mỗi nhân sự gồm loại + dữ liệu trên 1 dòng:
        • FT <id> <name> <baseSalary> <bonus>
        • PT <id> <name> <hourlyRate> <hours>
        • FL <id> <name> <k> <p1> <p2> ... <pk>
      • In ra mỗi nhân sự <id> <name> <pay> (2 chữ số thập phân) theo thứ tự giảm dần theo pay().
      • Khi pay() bằng nhau, in theo thứ tự nhập vào.
      • Dòng cuối: PAYROLL <tổng> (2 chữ số thập phân).
    • Định dạng đầu vào:
      • Dòng 1: N (1 ≤ N ≤ 200)
      • N dòng nhân sự theo format ở trên
    • Ràng buộc đầu vào:
      • baseSalary, bonus, hourlyRate, p_i ∈ [0, 10⁷]
      • hours ∈ [0, 400]
      • k ∈ [0, 50]
    • Định dạng đầu ra:
      • N dòng <id> <name> <pay> đã sắp xếp giảm dần theo pay
      • Dòng cuối: PAYROLL <tổng>

    Ví dụ:

    Đầu vào:

    3
    FT E01 An 10000000 2000000
    PT E02 Binh 50000 80
    FL E03 Cuong 3 5000000 3000000 2000000
    

    Đầu ra:

    E01 An 12000000.00
    E03 Cuong 9000000.00
    E02 Binh 4000000.00
    PAYROLL 25000000.00
    

    Giải thích:

    FT = 10M+2M = 12M. PT 80h ≤ 100h: 50K×80 = 4M. FL: (5M+3M+2M) × 0.9 = 9M. Sort giảm dần pay: E01(12M) → E03(9M) → E02(4M). PAYROLL = 25M.

    Đầu vào:

    2
    PT P01 Lan 100000 120
    PT P02 Mai 100000 100
    

    Đầu ra:

    P01 Lan 13000000.00
    P02 Mai 10000000.00
    PAYROLL 23000000.00
    

    Giải thích:

    P01 120h = 100h × 100K + 20h × 150K (×1.5) = 10M + 3M = 13M. P02 100h × 100K = 10M. PAYROLL = 23M.

    Đầu vào:

    1
    FL F1 Free 0
    

    Đầu ra:

    F1 Free 0.00
    PAYROLL 0.00
    

    Giải thích:

    0 dự án → pay = 0.

    Đầu vào:

    4
    FT A x 1000 0
    FT B y 1000 0
    FT C z 1000 0
    FT D w 1000 0
    

    Đầu ra:

    A x 1000.00
    B y 1000.00
    C z 1000.00
    D w 1000.00
    PAYROLL 4000.00
    

    Giải thích:

    Cùng pay = 1000 → giữ thứ tự nhập A, B, C, D.

    Đầu vào:

    3
    PT a x 1000 50
    PT b y 1000 150
    PT c z 1000 200
    

    Đầu ra:

    c z 225000.00
    b y 175000.00
    a x 50000.00
    PAYROLL 450000.00
    

    Giải thích:

    Test cận biên overtime: 150h = 100h + 50h×1.5 = 175K. 200h = 100h + 50h×1.5 + 50h = 225K. 50h = 50K (chưa overtime).

    Đầu vào:

    5
    FT f1 a 5000000 0
    PT p1 b 50000 100
    FL fl1 c 2 3000000 2000000
    FT f2 d 4000000 1000000
    PT p2 e 60000 90
    

    Đầu ra:

    p2 e 5400000.00
    f1 a 5000000.00
    p1 b 5000000.00
    f2 d 5000000.00
    fl1 c 4500000.00
    PAYROLL 24900000.00
    

    Giải thích:

    Mix 5 nhân viên 3 loại.

    Đầu vào:

    2
    PT a x 1000 400
    FL b y 5 1000 1000 1000 1000 1000
    

    Đầu ra:

    a x 425000.00
    b y 4500.00
    PAYROLL 429500.00
    

    Giải thích:

    PT 400h = 100h + 50h×1.5 + 250h = 425K. FL 5 dự án 1000 mỗi cái: 5000×0.9 = 4500.

    Chủ đề

    🧩 Lập trình hướng đối tượng☕ JavaJavaJava: OOPTất cả môn học

    Đang tải editor...