【C语言】文件、结构体综合应用:小型学生成绩管理
功能:
读取学生人数;
依次输入学生的学号、姓名、多个学科成绩;
按照总成绩进行排序,总成绩相同分别按科目一、科目二、科目三成绩进行比较;
计算各科目的平均分,并输出学生成绩单到文件file.txt中。
最终成绩单:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 功能:文件与结构体的应用
时间:2024年10月
地点:贤者楼129
作者:LChen
*/
// 5个学生,每个学生三门成绩,计算平均分并存储查看
// 按照学生总成绩进行排序,成绩相同时依次比较第一科,第二科和第三科
typedef struct student{
int ID; // 学号
char name[20]; // 姓名
double score0; // 总成绩
double score1; // 科目一
double score2;
double score3;
}Student;
int main() {
FILE *fp; // 定义文件指针
char ch;
// 将数据写入文件中
fp=fopen("E:\\Desktop\\file2.txt","w"); //w为写权限
if(!fp){ // 文件打开失败结束程序
printf("can not open file\n");
exit(1);
}
int i,j;
Student temp,stu[5]; // 定义
double Score1=0,Score2=0,Score3=0;
for(i=0;i<5;i++){
scanf("%d %s %lf %lf %lf",&stu[i].ID,stu[i].name,&stu[i].score1,&stu[i].score2,&stu[i].score3);
stu[i].score0=stu[i].score1+stu[i].score2+stu[i].score3; //计算总成绩
Score1+=stu[i].score1; // 单科总分
Score2+=stu[i].score2;
Score3+=stu[i].score3;
}
for(i=0;i<4;i++) { // 共进行n-1趟排序
for(j=4;j>i;j--) { // 递减循环,从后往前比较
if(stu[j].score0>stu[j-1].score0) { //优先按照总成绩排序
temp=stu[j-1];
stu[j-1]=stu[j];
stu[j]=temp;
}
else if(stu[j].score0==stu[j-1].score0) {
if(stu[j].score1>stu[j-1].score1) { //其次比较第一科目成绩
temp=stu[j-1];
stu[j-1]=stu[j];
stu[j]=temp;
}
else if(stu[j].score1==stu[j-1].score1) {
if(stu[j].score2>stu[j-1].score2) { //再次比较第二科
temp=stu[j-1];
stu[j-1]=stu[j];
stu[j]=temp;
}
else if(stu[j].score2==stu[j-1].score2) {
if(stu[j].score3>stu[j-1].score3) {//最后比较第三科
temp=stu[j-1];
stu[j-1]=stu[j];
stu[j]=temp;
}
}
}
}
}
}
// 输出成绩排名
fprintf(fp,"科目一平均分:%.2lf 科目二平均分:%.2lf 科目三平均分:%.2lf\n",Score1/5,Score2/5,Score3/5);
for(i=0;i<5;i++)
fprintf(fp,"%d %s %.2lf %.2lf %.2lf %.2lf\n",stu[i].ID,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score0);
// ch=getchar();
// while(ch!='#'){ //写文件操作
// fputc(ch,fp); //调用fputc将刚读的字符写到文件
// ch=getchar();
// }
// 关闭文件
fclose(fp);
// 从文件中读取数据
fp=fopen("E:\\Desktop\\file2.txt","r");
if(!fp){ // 文件打开失败结束程序
printf("can not open file\n");
exit(1);
}
//读文件操作
while((ch=fgetc(fp))!=EOF) {
putchar(ch);
}
fclose(fp);
return 0;
}
// 测试数据
//5 chl 21 45 65
//4 ch2 87 32 12
//3 ch3 54 67 34
//1 ch4 12 43 23
//2 ch5 98 78 96