嘣叽 2026-03-16 23:42 采纳率: 60%
浏览 9

计算职工工资,C语言

#计算职工工资,为什么我的结果是对的,但是判定不对
##题目
给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。

##输入格式:
输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。

##输出格式:
按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。

##输入样例:
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80
##输出样例:
zhao 565.00
qian 430.00
zhou 630.00

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

typedef struct employ{
    char name[10];
    int base_money;
    int f_money;
    int pay;
}employ;

int main(){
    int N;
    scanf("%d", &N);
    for(int i = 0; i < N; i++){
        employ a;
        scanf("%s %d %d %d", a.name, &a.base_money, &a.f_money, &a.pay);
        float true_money = a.base_money + a.f_money - a.pay;
        if(i == 0)
            printf("%s %.2f", a.name, true_money);
        else
            printf("\n%s %.2f", a.name, true_money);
    }
    return 0;
}

##结果:

img

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2026-03-16 23:43
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你的程序在逻辑上是正确的,但输出格式不符合题目要求。根据题目描述,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。你当前的代码虽然计算正确,但在格式输出上存在一些问题。


    ✅ 问题分析

    1. 数据类型不匹配

      • base_moneyf_moneypay 都是 int 类型,而题目中提到“输入、输出保证在单精度范围内”,所以应该使用 floatdouble
      • 当前的 true_money = base_money + f_money - pay 是整数运算,可能会导致精度丢失(例如:240 + 400 - 75 = 565,没问题,但如果遇到小数就出错)。
    2. 输出格式错误

      • 你使用了 %.2f 来输出浮点数,这是对的。
      • 但你在第一行输出时没有换行,其他行却加了 \n,这样会导致第一个输出行前面没有换行,可能被系统判定为格式错误。
    3. 结构体定义建议

      • name 应该是 char name[10],但实际输入可能超过长度,建议使用 char name[11] 来防止溢出。
      • 建议将 base_money, f_money, pay 定义为 floatdouble

    🔧 修改后的代码如下:

    #include <stdio.h>
    
    typedef struct {
        char name[11]; // 增加空间以防止溢出
        float base_money;
        float f_money;
        float pay;
    } Employee;
    
    int main() {
        int N;
        scanf("%d", &N);
    
        for (int i = 0; i < N; i++) {
            Employee emp;
            scanf("%s %f %f %f", emp.name, &emp.base_money, &emp.f_money, &emp.pay);
    
            float real_salary = emp.base_money + emp.f_money - emp.pay;
    
            // 每行输出一个员工的信息
            printf("%s %.2f\n", emp.name, real_salary);
        }
    
        return 0;
    }
    

    🛠️ 修改说明

    1. 数据类型调整

      • base_money, f_money, pay 改为 float,确保支持小数运算。
    2. 结构体优化

      • name 字符串长度改为 11,防止输入超出范围。
    3. 输出格式统一

      • 所有行都使用 printf("%s %.2f\n", ...),确保每行末尾都有换行符,符合题目的输出格式要求。

    ✅ 示例运行结果

    对于输入:

    3
    zhao 240 400 75
    qian 360 120 50
    zhou 560 150 80
    

    输出应为:

    zhao 565.00
    qian 430.00
    zhou 630.00
    

    ✅ 总结

    | 问题 | 解决方案 | |------|----------| | 数据类型不匹配 | 将 base_money, f_money, pay 改为 float | | 输出格式错误 | 统一使用 printf("%s %.2f\n", ...) 确保每行换行 | | 结构体设计不当 | 增加 name 字符串长度,避免溢出 |

    请尝试修改后重新提交,应该可以解决判定错误的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月16日