不好意思。更正,之前说的有错,结构成员相同,不包含指针,可以直接交换。方便的话,给个差评,谢谢。
下面是完全按照你的代码改的,已调试运行,详细看 备注:
#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;}
温馨提示:答案为网友推荐,仅供参考