c语言帮忙改错!输入n个学生的成绩信息,按照每个学生的个人平均成绩从高到低输出他们的信息

#include <stdio.h>
#include <stdlib.h>
struct student{
int num;
char name[10];
float score[3];
double average;
};
int main()
{int i,j,m,n,index,average;
struct student s[50];
printf("Input n=");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("num:");
scanf("%d",&s[i].num);
printf("name:");
scanf("%s",s[i].name);
for(j=0;j<3;j++)
{printf("score:");
scanf("%f",s[i].score);
average=s[0].score+s[1].score+s[2].score)/3;
}}

for(i=0;i<n-1;i++){
index=i;
for(j=i+1;j<n;j++){
if(s[j]>s[index])
{index=j;}
m=s[index];
s[index]=s[i];
s[i]=m;
}
}
printf("num\t name\t average\n");
for(i=0;i<n;i++)
printf("%d\t%s\t%.2f\n",s[i].num,s[i].name;s[i].average);
return 0;
}

不好意思。更正,之前说的有错,结构成员相同,不包含指针,可以直接交换。方便的话,给个差评,谢谢。
下面是完全按照你的代码改的,已调试运行,详细看 备注:
#include <stdio.h>#include <stdlib.h>#include<string.h>struct student{ int num; char name[10]; float score[3]; double average;};int main(){ int i,j,k,n,numSave; float scoreSave[3]; char nameSave[10]; double m,average;//错误:这里的变量 m及average你的意图是做平均成绩的中间变量及保存,你结构成员平均分用的是double,这里也得用double struct student s[50]; printf("Input n="); scanf("%d",&n); for(i=0;i<n;i++) { printf("num:"); scanf("%d",&s[i].num); printf("name:"); scanf("%s",s[i].name); printf("score:");//错误:score你定义的数组,如果这里是想求学生三科成绩平均分,这里下面这段循环应该是输入三科成绩,循环外再求平均分 average=0; for(j=0;j<3;j++) { scanf("%f",&s[i].score[j]);//错误:这里要用地址“&s[i].score[j]”!!!! average=average+s[i].score[j];//average要先给初值0 } average=average/3;// 这里才求平均分。 s[i].average=average;//错误:你少了赋值语句,这里average只是;临时变量,获取到平均分以后还得赋值给结构成员才行 } for(i=0;i<n;i++)//错误:这里冒泡排序要比的是成员平均分,你怎么直接拿结构比较,变量index也是多余的删了,如果直接用结构排序,就要用链表,否则就要交换所有成员值 { for(j=i+1;j<n;j++) { if(s[j].average>s[i].average)//这里冒泡排序,因为你用的是结构数组不是指针,所以只能全部成员逐一交换,相当繁琐,个人建议用链表写这个程序! { m=s[j].average; s[j].average=s[i].average; s[i].average=m; numSave=s[j].num; s[j].num=s[i].num; s[i].num=numSave; memset(nameSave,0,10);//字符数组保存新数据时,建议先用memset清空 strcpy(nameSave,s[j].name); memset(s[j].name,0,10); strcpy(s[j].name,s[i].name); memset(s[i].name,0,10); strcpy(s[i].name,nameSave); for(k=0;k<3;k++) scoreSave[k]=s[j].score[k]; for(k=0;k<3;k++) s[j].score[k]=s[i].score[k]; for(k=0;k<3;k++) s[i].score[k]=scoreSave[k]; } } } printf("num\t name\t average\n"); for(i=0;i<n;i++) printf("%d\t%s\t%.2lf\n",s[i].num,s[i].name,s[i].average);//错误:这里应该是逗号“s[i].name;” return 0;}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-04-19
#include <stdio.h>
#include <stdlib.h>

struct student{
int num;
char name[10];
double score[3];
double average;
};

int main()
{
int i,j,n,index; //
    struct student s[50],m; //
    printf("Input n=");
    scanf("%d",&n);

    for(i=0;i<n;i++){
        printf("num:");
        scanf("%d",&s[i].num);
printf("name:");
        scanf("%s",s[i].name);
        for(j=0;j<3;j++)
{
printf("score:");
scanf("%lf", &s[i].score); //少了&
}
s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3;//三个输入完,再算平均值
}

    for(i=0;i<n-1;i++){
        index=i;
        for(j=i+1;j<n;j++)
{
            if(s[j].average>s[index].average) //平均成绩比较
index=j;
}
//循环结束后,进行交换
m=s[index];
s[index]=s[i];
s[i]=m;
    }
    printf("num\t name\t average\n");
    for(i=0;i<n;i++)
        printf("%d\t%s\t%.2lf\n",s[i].num,s[i].name,s[i].average);//
    return 0;
}

本回答被提问者和网友采纳
第2个回答  2018-04-18
#include <stdio.h>
#include <stdlib.h>
struct student
{
int num;
char name[10];
float score[3];
double average;
};
int main()
{
int i,j,n,index,average;//加 Snum
struct student s[50],m;
float Snum=0;
printf("Input n=");
scanf("%d",&n);
for(i=0; i<n; i++)
{
printf("num:");
scanf("%d",&s[i].num);
printf("name:");
scanf("%s",s[i].name);
for(j=0; j<3; j++)  //这一块大动,你在缕缕
{
printf("score:");
scanf("%f",&s[i].score[j]);//缺&,i->j
//average=s[0].score+s[1].score+s[2].score)/3;
Snum=Snum+ s[i].score[j];
}
s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3;//加括号,不能再for循环里,
}

for(i=0; i<n-1; i++)
{
index=i;
for(j=i+1; j<n; j++)
{
if(s[j].average >s[index].average )
{
index=j;
}
m=s[index];
s[index]=s[i];
s[i]=m;
}
}
printf("num\t name\t average\n");
for(i=0; i<n; i++)
printf("%d\t%s\t%.2f\n",s[i].num,s[i].name,s[i].average);
return 0;
}

第3个回答  2018-04-18
GetStuInfo函数里的STUDENT *p是临时变量,函数返回后,p就无效了,你应该把pstu[i]传到函数内部去
第4个回答  2018-04-18
#include <stdio.h>
#include <stdlib.h>
/**c语言帮忙改错!输入n个学生的成绩信息,按照每个学生的个人平均成绩从高到低输出他们的信息*/
struct student
{
int num;
char name[10];
float score[3];
double average;
};
int main()
{
int i,j,n,index;
struct student m; //m应定义为相同结构体类型才能替换
struct student s[50];
printf("Input n=");
scanf("%d",&n);
for(i=0; i<n; i++)
{
printf("num:");
scanf("%d",&s[i].num);
printf("name:");
scanf("%s",s[i].name);
for(j=0; j<3; j++)
{
printf("第%d门score:",j+1);
scanf("%f",&s[i].score[j]); //i变为j,忘了加&
}
s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0; //这里有错误
}
for(i=0; i<n-1; i++)
{
index=i;
for(j=i+1; j<n; j++)
{
if(s[i].average < s[j].average) //这里应该比较平均分
{
index=j;
}
}
m=s[i]; //这里是i
s[i]=s[index];
s[index]=m;
}
printf("num\t name\t average\n");
for(i=0; i<n; i++)
printf("%d\t%s\t%.2f\n",s[i].num,s[i].name,s[i].average); //这里多了分号
return 0;
}