c语言pat基础题0826L1056

img

img


#include<stdio.h>
struct person{
    int num;
    char name[8];
}p[10000];
int main(){
    int N,sum=0,bav,min;
    int flag;
    scanf("%d\n",&N);
    for(int i=0;i<N;i++){
        scanf("%s %d\n",p[i].name,&p[i].num);
    }
    for(int i=0;i<N;i++){
        sum+=p[i].num;
    }
    bav=sum/(2*N);
    int dv[N];
    for(int i=0;i<N;i++){
        dv[i]=p[i].num-bav;
    }
    min=dv[0];
    for(int i=1;i<N;i++){
        if(min>dv[i]){
            min=dv[i];
            flag=i;
        }
    }
    printf("%d %s\n",bav,p[flag].name);
}

我的代码出现问题,本题希望可以得到大家的指导,谢谢你的帮助!

修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>  // 修改
struct person{
    char name[8];
    int  num;
}p[10001];    // 修改
int main()
{
    int N,sum=0,min,flag;
    float bav;
    scanf("%d", &N); //scanf("%d\n",&N); 修改
    for(int i = 0;i < N; i++){
        scanf("%s %d", p[i].name, &p[i].num);
        //scanf("%s %d\n",p[i].name,&p[i].num); 修改
        sum += p[i].num;
    }
    //for(int i=0;i<N;i++){ // 修改
    //    sum+=p[i].num;
    //}
    bav = sum/(2.0 * N); // 修改
    int dv = abs(bav - p[0].num);   //int dv[N];
    flag = 0;            // 修改
    for(int i = 1;i < N; i++){
        //dv[i]=p[i].num-bav;
        if (dv > abs(bav - p[i].num)){ // 修改
            dv = abs(bav - p[i].num);
            flag = i;
        }
    }
    //min=dv[0];           // 修改
    //for(int i=1;i<N;i++){
    //    if(min>dv[i]){
    //        min=dv[i];
    //        flag=i;
    //    }
    //}
    printf("%d %s\n",(int)bav,p[flag].name);
    return 0;
}

【以下回答由 GPT 生成】

首先,让我们来分析问题,代码中的问题主要集中在计算平均值和查找最小值上。下面是我对你的代码进行优化的步骤:

  1. 在第一个for循环中,你可以使用scanf语句的返回值来判断是否成功读取数据,而不需要在字符串格式化中添加\n
scanf("%s %d",p[i].name,&p[i].num);
  1. 在第二个for循环中,累计求和的逻辑正确,但可以使用累计求和的方式来代替。
sum += p[i].num;
  1. 计算平均值时,你可以使用整数除法代替浮点数除法,以避免精度问题。
bav = sum / (2 * N);
  1. 计算差值数组时,你可以将计算放在累计求和的循环中。
dv[i] = p[i].num - bav;
  1. 在查找最小值时,你需要初始化flag变量,以避免未定义的行为。
flag = 0;
  1. 在查找最小值时,你可以使用增量循环而不是遍历数组来查找最小值。
for(int i = 1; i < N; i++){
    if(min > dv[i]){
        min = dv[i];
        flag = i;
    }
}

下面是优化后的代码:

#include<stdio.h>
struct person{
    int num;
    char name[8];
}p[10000];

int main(){
    int N, sum = 0, bav, min, flag = 0;
    scanf("%d", &N);
    for(int i = 0; i < N; i++){
        scanf("%s %d", p[i].name, &p[i].num);
        sum += p[i].num;
    }
    bav = sum / (2 * N);

    int dv[N];
    for(int i = 0; i < N; i++){
        dv[i] = p[i].num - bav;
    }

    min = dv[0];
    for(int i = 1; i < N; i++){
        if(min > dv[i]){
            min = dv[i];
            flag = i;
        }
    }

    printf("%d %s\n", bav, p[flag].name);
}

希望这些优化措施能够帮助你解决问题,如果还有其他问题,请随时告诉我。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你的思路还可以,结构体读入数据的时候,建议你按顺序读入。另外,有些地方的数据类型可能有点问题。