使用“结构”统计学生成绩

最后更新于:2022-04-01 14:29:10

设学生信息包括学号,姓名和五门功课的成绩,要求编写输入输出 学生信息的函数。在输入一组学生信息后,以学生成绩的总分从高 到低顺序输出学生信息。 这个相对来说比较简单,可以创建一个学生的结构体,结构体里面有三个成员:学号,姓名和五门功课的成绩。下面请看一下我的整体代码。这个思路也比较简单,主要是为了练习使用结构体。 ~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 200 #define SCORES 5 #define NUMLEN 10 /** * 设学生信息包括学号,姓名和五门功课的成绩,要求编写输入输出 * 学生信息的函数。在输入一组学生信息后,以学生成绩的总分从高 * 到低顺序输出学生信息。 */ struct student{ char number[NUMLEN]; /* 学号 */ char *name; /* 学生姓名 */ int scores[SCORES]; /* 学生五门功课的成绩 */ }; struct student stus[N]; int order[N]; int total[N]; int readstu(struct student *stu){ int len,j; char buf[120]; //缓冲区 printf("Number : "); if(scanf("%s",buf) == 1){ strncpy(stu->number,buf,NUMLEN-1); }else{ return 0; //ctrl+z退出 } printf("Name : "); if(scanf("%s",buf) == 1){ len = strlen(buf); stu->name = (char *)malloc(len+1); strcpy(stu->name,buf); }else{ return 0; } printf("Scores : "); for(j = 0;j < SCORES;j++) if(scanf("%d",stu->scores+j) != 1) break; if(j == 0){ //一个成绩也没有录入,清空name所占有的内存 free(stu->name); return 0; } for(;j<SCORES;j++) stu->scores[j] = 0; return 1; } /* 输出学生信息 */ void writeStu(struct student *stu){ int i; printf("Number : %s\n",stu->number); printf("Name : %s\n",stu->name); printf("Scores : "); for(i = 0;i < SCORES;i++) printf("%4d ",stu->scores[i]); printf("\n\n"); } int main() { int n,i,j,t; //获取学生信息 for(n = 0; readstu(stus+n); n++); for(i = 0;i < n;i++){ order[i] = i; for(t = 0,j = 0;j < SCORES;j++){ t += stus[i].scores[j]; } total[i] = t; } //冒泡排序输出 for(i = 0;i < n;i++){ for(j = 0;j < n-1;j++){ if(total[order[j]] < total[order[j+1]]){ //交换 t = order[j]; order[j] = order[j+1]; order[j+1] = t; } } } for(j = 0;j <n;j++){ writeStu(stus+order[j]); } return 0; } ~~~ 下面是我的输出的结果: ![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-24_5743c07659f9d.jpg "")
';