#include
struct Student
{
int num;
char name[20];
int banji;
char sex;
int math;
int english;
int chinese;
int sum[2];
}s[2],temp;
main()
{
int i,j,k;
printf("请输入学生的学号,姓名,班级,性别,数学成绩,英语成绩,语文成绩\n");
scanf("%d%s%d%s%d%d%d",&s[0].num,&s[0].name,&s[0].banji,&s[0].sex,&s[0].math,&s[0].english,&s[0].chinese);
scanf("%d%s%d%s%d%d%d",&s[1].num,&s[1].name,&s[1].banji,&s[1].sex,&s[1].math,&s[1].english,&s[1].chinese);
scanf("%d%s%d%s%d%d%d",&s[2].num,&s[2].name,&s[2].banji,&s[2].sex,&s[2].math,&s[2].english,&s[2].chinese);
s[0].sum[0]=s[0].math+s[0].english+s[0].chinese;
s[1].sum[1]=s[1].math+s[1].english+s[1].chinese;
s[2].sum[2]=s[2].math+s[2].english+s[2].chinese;
for(i=0;i<1;i++)
{
k=i;
for(j=i+1;j<2;j++)
if(s[j].sum[j]>s[k].sum[k])
k=j;
temp=s[k];
s[k]=s[i];
s[i]=temp;
}
for(i=0;i<2;i++)
{
// printf("%d",s[i].sum[i]);
printf("%d%s%d%s%d%d%d%d\n",s[i].num,s[i].name,s[i].banji,s[i].sex,s[i].math,s[i].english,s[i].chinese,s[i].sum);
}
}
scanf里面的数组名已经代表地址了,不用再加取地址符&了。
sum代表一个学生的成绩总和,为什么要定义成数组?
如果sum[0]是存放成绩总和,那sum[1]存放什么?
数组的存放是从下标为0的元素开始的,s[2]和sum[2]明显是错的。
数组越界了,基本不存在这两个元素。
s[2]要改为s[3]。
for(i = 0; i < 1; i++)什么意思?就循环一次。
你想一下,这一句要与不要有区别吗?
交换两个结构体居然用二重循环,完全没必要!
从你的代码可以看出你对数组和循环还是没掌握。
还需要弄明白什么是数组?什么是数组元素?如何表示数组元素?数组名代表什么?
数组地址代表什么?数组与指针的关系是什么?什么是数组指针?什么是指针数组?
不要以为数组很简单,数组还是有必要去深究的。
#include <stdio.h>
struct Student
{
int num;
char name[20];
char class[7];
char sex[3];
float math;
float english;
float chinese;
float sum;
}s[3],temp;
int main()
{
int i,j,k;
printf("请输入学生的学号,姓名,班级,性别,数学成绩,英语成绩,语文成绩\n");
scanf("%d%s%s%s%f%f%f",&s[0].num,s[0].name,s[0].class,s[0].sex,&s[0].math,&s[0].english,&s[0].chinese);
scanf("%d%s%s%s%f%f%f",&s[1].num,s[1].name,s[1].class,s[1].sex,&s[1].math,&s[1].english,&s[1].chinese);
scanf("%d%s%s%s%f%f%f",&s[2].num,s[2].name,s[2].class,s[2].sex,&s[2].math,&s[2].english,&s[2].chinese);
s[0].sum = s[0].math+s[0].english+s[0].chinese;
s[1].sum = s[1].math+s[1].english+s[1].chinese;
s[2].sum = s[2].math+s[2].english+s[2].chinese;
if(s[0].sum > s[1].sum )
{
temp = s[0];
s[0] = s[1];
s[1] = temp;
}
else if(s[0].sum > s[2].sum)
{
temp = s[0];
s[0] = s[2];
s[2] = temp;
}
else if(s[1].sum > s[2].sum)
{
temp = s[1];
s[1] = s[2];
s[2] = temp;
}
for(i = 0;i <= 2;i++)
{
printf("%d %s %s %s %.1f %.1f %.1f %.1f\n",s[i].num,s[i].name,s[i].class,s[i].sex,s[i].math,s[i].english,s[i].chinese,s[i].sum);
}
return 0;
}
运行结果:
请输入学生的学号,姓名,班级,性别,数学成绩,英语成绩,语文成绩
1 li class1 M 80 70 80
2 xi class1 M 70 70 70
3 qi class1 M 90 90 90
2 xi class1 M 70.0 70.0 70.0 210.0
1 li class1 M 80.0 70.0 80.0 230.0
3 qi class1 M 90.0 90.0 90.0 270.0
if(s[j].sum[j]>s[k].sum[k])
k=j;
temp=s[k];
s[k]=s[i];
s[i]=temp;
if语句,后面不打花括号,只能管1行。
你这样搞,数组不越界???
sum有必要定义成数组吗
之前看错了。你那个选择排序吧,没问题
但是
for(i=0;i<1;i++)
这里不对,这样根本没循环起来。
还有,你怎么输入的,所有变量都连在一起,还是有逗号
int sum就可以了,没必要数组,而且int s[2] 里面只能放两个遍历s[0],s[1],不能放入s[2],会下标越界
建议使用C++的类,把学生的这些属性封装成一个类,然后在实例化,很方便。