成绩输入输出排序(虞歌教材)

成绩输入排序(虞歌教材)

结构
第6题

【描述】

假设每个学生信息包括:姓名和3门课程的成绩。从键盘输入10个学生的数据,采用结构数组存储数据。输出3门课程的总平均分;输出每门课程分数最高的学生信息;按总分从高到低对这10个学生进行排序,并输出排序结果;输出平均分高于80分的学生信息。

【输入】

分行输入10个学生的数据,每行包括姓名和3门课程的成绩,以空格间隔。

【输出】

分行输出3门课程的总平均分、每门课程分数最高的学生信息、按总分从高到低输出学生信息以及平均分高于80分的学生信息。
原文链接:https://blog.csdn.net/u011545923/article/details/41852501
直接上代码。在这里插入代码#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 10
/* 学生信息结构 /
struct student {
char name[10]; /
姓名 /
double score[3]; /
3门课程的成绩 /
double total;
};
/
qsort比较函数,降序 */
int comp(const void *p, const void *q) {
return ((struct student *)q)->total - ((struct student )p)->total;
}
/
求3门课程总平均分 */
double average(struct student pStud, int n) {
int i, j;
double aver = 0;
for(i = 0; i < n; ++i)
for(j = 0; j < 3; ++j)
aver += pStud[i].score[j];
aver /= (n * 3);
return aver;
}
/
输出每门课程分数最高的学生信息 */
void topStudentForEachSubject(struct student *pStud, int n) {
int i, j;
struct student pMax;
for(i = 0; i < 3; ++i) {
for(pMax = pStud, j = 0; j < n; ++j) {
if(pMax->score[i] < (pStud + j)->score[i])
pMax = pStud + j;
}
printf("%s,%.2f,%.2f,%.2f\n", pMax->name, pMax->score[0], pMax->score[1], pMax->score[2]);
}
printf("\n");
}
/
输出平均分高于80分的学生信息 */
void studentGreaterThan80(struct student *pStud, int n) {
struct student pStart;
double aver;
for(pStart = pStud; pStart < pStud + n; ++pStart) {
aver = (pStart->score[0] + pStart->score[1] + pStart->score[2]) / 3;
if(aver > 80) {
printf("%s,%.2f,%.2f,%.2f,%.2f\n", pStart->name, pStart->score[0], pStart->score[1], pStart->score[2], aver);
}
}
printf("\n");
}
int main(void) {
struct student stud[ARRAY_SIZE]; /
存放学生数据的结构数组 /
double averageAll;
int i;
for(i = 0; i < ARRAY_SIZE; ++i) {
scanf("%s%lf%lf%lf", stud[i].name, &stud[i].score[0], &stud[i].score[1], &stud[i].score[2]);
stud[i].total = stud[i].score[0] + stud[i].score[1] + stud[i].score[2];
}
/
求3门课程总平均分 /
averageAll = average(stud, ARRAY_SIZE);
printf("%.2f\n\n", averageAll);
/
输出每门课程分数最高的学生信息 /
topStudentForEachSubject(stud, ARRAY_SIZE);
/
使用qsort函数按总分从高到低排序 /
qsort(stud, ARRAY_SIZE, sizeof(struct student), comp);
for(i = 0; i < ARRAY_SIZE; ++i) {
printf("%s,%.2f,%.2f,%.2f\n", stud[i].name, stud[i].score[0], stud[i].score[1], stud[i].score[2]);
}
printf("\n");
/
输出平均分高于80分的学生信息 */
studentGreaterThan80(stud, ARRAY_SIZE);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值