题目:
设计一个程序,统计一个班(最多50人)的学生成绩,要求能实现如下3个功能:
(1) 由键盘或文件输入每个学生的学号和四门课程的成绩;
(2) 计算每个学生的平均成绩和总成绩;
(3) 按总成绩从高到低排名,并按名次输出每个学生的情况,包括:
学号,各科成绩,平均成绩,总成绩,排名
我写的代码如下
问题在于,输入、计算部分都没有问题,但是,运行结果显示,**并没有进行排序操作,也就是说**,排序代码并未生效。
麻烦各位大佬帮忙看看哪里出了问题,感激不尽
#include <stdio.h>
#include <stdlib.h>
struct student{
char id[10];
float sub_1;
float sub_2;
float sub_3;
float sub_4;
float sum;
float aver;
//int order;
};
//函数原型
void order_stu(struct student stu[],int sum_stu);
void aver_stu(struct student *pt_1);
void main()
{
int sum_stu;//学生的人数
printf("Please input the sum of students in this class:");
scanf("%d",&sum_stu);
getchar();
struct student stu[sum_stu];
//从键盘读取学生学号和四门课的成绩
int i;
for(i=0;i<sum_stu;i++)
{
printf("请分别输入第%d名学生的学号、四门课的成绩,以空格隔开:",i);
scanf("%s %f %f %f %f",&stu[i].id,&stu[i].sub_1,&stu[i].sub_2,&stu[i].sub_3,&stu[i].sub_4);
getchar();
aver_stu(&stu[i]);
}
order_stu(stu,sum_stu);
}
//计算总分和平均值
//利用指针,目的在于在本函数内为结构体内的aver和sum赋值,即改变结构体的内容
void aver_stu(struct student *pt_1)
{
pt_1->sum=pt_1->sub_1+pt_1->sub_2+pt_1->sub_3+pt_1->sub_4;
pt_1->aver=(pt_1->sum)/4;
}
//排名次
void order_stu(struct student stu[],int sum_stu)
{
float sum_score;//总分
float aver;
int i,j;
struct student *p[sum_stu];//定义一个指针数组
//使每个指针指向一个结构体数组元素
for(i=0;i<sum_stu;i++)
{
p[i]=&stu[i];
}
struct student *temp;
//用冒泡排序法排序(从大到小)
for(i=0;i<sum_stu-1;i++)
{//遍历sum_stu-1轮
for(j=0;j<sum_stu-i-1;j++)
{//每过一轮,遍历的元素数目-1
if((p[j]->sum)<(p[j+1]->sum))
{
temp=p[j+1];//交换两结构体在结构体数组中的位置
p[j+1]=p[j];
p[j]=temp;
}
}
}
//将结果通过列表的方式打印在屏幕上
printf("id sub_1 sub_2 sub_3 sub_4 average order\n");
for(i=0;i<sum_stu;i++)
printf("%s %5f %5f %5f %5f %7f %5d\n",stu[i].id,stu[i].sub_1,stu[i].sub_2,stu[i].sub_3,stu[i].sub_4,stu[i].aver,i+1);
}
运行结果如图所示