根據工齡與周工作時長計算周薪:
// 原代碼老員工超時計算(第 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;
}
| 工齡 | 工時 | 正確輸出 | 原代碼輸出 | 說明 |
|---|---|---|---|---|
| 3 | 30 | 900.00 | 900.00 | 新員工無加班 |
| 3 | 50 | 1650.00 | 1650.00 | 新員工加班:40*30+10*45 |
| 5 | 30 | 1500.00 | 1500.00 | 老員工無加班 |
| 5 | 50 | 2750.00 | 2150.00 | 老員工加班:原碼錯用30基礎 |
| 10 | 60 | 3500.00 | 2600.00 | 40*50+20*75 vs 錯誤計算 |
若題目為月薪制,需考慮:
本題核心是**分段函數邏輯與基礎薪資參數正確性**。原代碼老員工加班費基礎時薪寫錯(30 代替 50),導致部分測試用例失敗。修正後邏輯清晰:正常工時×基礎時薪 + 加班工時×基礎時薪×1.5。工程中務必用常量定義薪資參數,編寫參數化計算函數,便於政策調整維護。