首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

PAT 基礎編程題解:工齡分段計算加班工資(含邏輯錯誤分析)

     編輯:關於C語言

題目需求

根據工齡與周工作時長計算周薪:

  • 工齡 < 5 年(新員工):前 40h 按 30/h,超時按 1.5倍 (45/h)
  • 工齡 ≥ 5 年(老員工):前 40h 按 50/h,超時按 1.5倍 (75/h)
  • 輸入異常(負數、周工時>168h)不處理

原代碼邏輯錯誤分析

// 原代碼老員工超時計算(第 44 行)
salary = (*worktime - 40) * 30 * 1.5 + 40 * 50;
//                   ^^^ 基礎時薪用了 30,應為 50!

關鍵錯誤:老員工加班費基礎時薪應為 **50**(正常時薪),而非 30。正確公式:

// 新員工:正常 30,加班 45
salary = (wt <= 40) ? wt * 30 : 40*30 + (wt-40)*45;
// 老員工:正常 50,加班 75
salary = (wt <= 40) ? wt * 50 : 40*50 + (wt-40)*75;

修正後完整代碼

#include <stdio.h>
#include <stdlib.h>

double calc_salary(int work_years, int work_hours) {
    if (work_hours < 0 || work_years < 0 || work_hours > 168) return -1;

    if (work_years < 5) {  // 新員工
        if (work_hours <= 40) return work_hours * 30.0;
        return 40*30.0 + (work_hours - 40) * 45.0;
    } else {               // 老員工
        if (work_hours <= 40) return work_hours * 50.0;
        return 40*50.0 + (work_hours - 40) * 75.0;
    }
}

int main() {
    int years, hours;
    if (scanf("%d %d", &years, &hours) != 2) return 1;
    double sal = calc_salary(years, hours);
    if (sal < 0) return 0;  // 異常輸入不輸出
    printf("%.2f\n", sal);
    return 0;
}

測試用例驗證

工齡工時正確輸出原代碼輸出說明
330900.00900.00新員工無加班
3501650.001650.00新員工加班:40*30+10*45
5301500.001500.00老員工無加班
5502750.002150.00老員工加班:原碼錯用30基礎
10603500.002600.0040*50+20*75 vs 錯誤計算

代碼結構優化建議

  1. 提取常量:`BASE_NEW=30, OT_MULT=1.5, BASE_OLD=50` 避免魔術數字
  2. 統一計算函數:`double calc(int base, int hours)` 避免重複邏輯
  3. 邊界測試:0h、40h、41h、168h、負數、大數
  4. 輸入驗證:`scanf` 返回值檢查、範圍校驗

擴展:月薪制換算

若題目為月薪制,需考慮:

  • 月標準工時:21.75 天 × 8h = 174h(中國法定)
  • 加班費基數:合同約定或最低工資標準
  • 法定節假日 3倍、休息日 2倍、工作日 1.5倍

總結

本題核心是**分段函數邏輯與基礎薪資參數正確性**。原代碼老員工加班費基礎時薪寫錯(30 代替 50),導致部分測試用例失敗。修正後邏輯清晰:正常工時×基礎時薪 + 加班工時×基礎時薪×1.5。工程中務必用常量定義薪資參數,編寫參數化計算函數,便於政策調整維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved