题目来源:大工慕课 链接
作者:Caleb Sung
题目要求
假设有3名学生,每名学生的数据包括学号、姓名、3门课程的成绩。编写程序,计算每名学生的总成绩、平均成绩及名次。
要求使用结构体,结构体类型变量的初值在程序中给定(方便调试);采用p->成员名形式,按照原始输入顺序输出原始学生信息表(学号、姓名、3门成绩、总成绩、平均成绩及按总成绩排名次);经过计算总成绩、平均成绩和排名次后,要求采用p->成员名形式表示输出结果。
参考代码
#include<stdio.h>
int swap(int a[2][3]){
int t, i, j;
for(i=0; i<2; i++){
for(j=0; j<2-i; j++){
if(a[0][j] < a[0][j+1]){
t = a[0][j];
a[0][j] = a[0][j+1];
a[0][j+1] = t;
t = a[1][j];
a[1][j] = a[1][j+1];
a[1][j+1] = t;
}
}
}
return a[2][3];
}
void main(){
int i, j, tmp[2][3], t;
struct Student{
char id[18], name[10];
int subject[3], sum, rank;
double average;
}
stu[3] = {{"001", "Bob", 66, 88, 77, 0, 0, 0},
{"002", "Sam", 98, 87, 76, 0, 0, 0},
{"003", "Amy", 89, 78, 87, 0, 0, 0}}, *st;
for(i=0; i<3; i++){
for(j=0; j<3; j++)
stu[i].sum += stu[i].subject[j];
stu[i].average = (double)(stu[i].sum) / 3.0;
}
for(i=0; i<3; i++){
tmp[0][i] = stu[i].sum;
tmp[1][i] = i;
}
tmp[2][3] = swap(tmp);
for(i=0; i<3; i++)
stu[tmp[1][i]].rank = i+1;
printf("ID\tName\tSub1\tSub2\tSub3\tSUM\tAVG.\tRank\n");
printf("-------------------------------------------------------------\n");
st = &stu[0];
for(i=0; i<3; i++){
printf("%s\t%s\t%d\t%d\t%d\t%d\t%.2f\t%d\n",
st -> id,
st -> name,
st -> subject[0],
st -> subject[1],
st -> subject[2],
st -> sum,
st -> average,
st -> rank);
st++;
}
}
运行结果
ID Name Sub1 Sub2 Sub3 SUM AVG. Rank
-------------------------------------------------------------
001 Bob 66 88 77 231 77.00 3
002 Sam 98 87 76 261 87.00 1
003 Amy 89 78 87 254 84.67 2