#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 生成】
首先,让我们来分析问题,代码中的问题主要集中在计算平均值和查找最小值上。下面是我对你的代码进行优化的步骤:
scanf
语句的返回值来判断是否成功读取数据,而不需要在字符串格式化中添加\n
。scanf("%s %d",p[i].name,&p[i].num);
sum += p[i].num;
bav = sum / (2 * N);
dv[i] = p[i].num - bav;
flag
变量,以避免未定义的行为。flag = 0;
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);
}
希望这些优化措施能够帮助你解决问题,如果还有其他问题,请随时告诉我。
【相关推荐】
你的思路还可以,结构体读入数据的时候,建议你按顺序读入。另外,有些地方的数据类型可能有点问题。