2025年2月27日 星期四 甲辰(龙)年 腊月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言按考试成绩排名次并存储到文件中

时间:10-08来源:作者:点击数:75

期末考试结束后要对同学们的考试成绩进行排序,张老师已经计算好了每一位同学的总成绩,并按学号排序填好了一张成绩表。请编写程序,按成绩高低输出名次表。

问题分析

该题的输入和输出都要通过操作文件来完成。从输入文件中读取一行数据,依次赋值给对应的结构体对象成员;输出时则把结构体对象成员的值按要求格式输出到文件中。输入输出文件格式如图 1 所示。

输入输出文件样例
图 1:输入输出文件样例
  • 输入文件格式:第一行,一个整数 n 表示学生人数(不超过 1000);之后 n 行,每行包括以空格分隔的三个数据,分别表示学号、姓名和总成绩。
  • 输出文件格式:共 n 行,每行包括学号、姓名、总成绩和名次,数据之间用空格分隔。

代码清单 1:从文件读取学生成绩排列名次后输出到另一个文件

  • #include <stdio.h>
  • int main( )
  • {
  • struct student{ //声明结构体 student
  • char id[5]; //学生学号(四位)
  • char name[40]; //学生姓名
  • float score; //期末总成绩
  • int num; //名次
  • }stu[100],temp; //定义结构体对象数组 stu 和临时对象 temp
  • int i,j,n;
  • char ch;
  • FILE *fin, *fout; //定义文件指针
  • fin = fopen("scoreIn.txt","r"); //打开输入文件
  • fout = fopen("scoreOut.txt","w"); //打开输出文件
  • fscanf(fin,"%d\n",&n);//读取学生人数
  • for(i=0;i<n;i++){ // A:逐行读取学生信息
  • fscanf(fin,"%s",stu[i].id);
  • fscanf(fin,"%s",stu[i].name);
  • fscanf(fin,"%f\n",&stu[i].score);
  • }
  • for(i=0;i<n;i++){ //按成绩排序(冒泡法)
  • for(j=i+1;j<n;j++)
  • if(stu[i].score<stu[j].score){
  • temp=stu[i];
  • stu[i]=stu[j];
  • stu[j]=temp;
  • } //结构体变量整体交换
  • stu[i].num = i+1;
  • }
  • for(i=0;i<n;i++){ // B:逐行输出到文件
  • fprintf(fout,"%s ",stu[i].id);
  • fprintf(fout,"%s ",stu[i].name);
  • fprintf(fout,"%.2f ",stu[i].score);
  • fprintf(fout,"%d\n",stu[i].num); //输出名次
  • }
  • fclose(fin);
  • fclose(fout);
  • fin = fopen("scoreIn.txt","r");
  • fscanf(fin,"%c",&ch);
  • printf("scoreIn.txt的内容为:\n");
  • while(!feof(fin))
  • {
  • putchar(ch);
  • fscanf(fin,"%c",&ch);
  • }
  • fclose(fin);
  • fout = fopen("scoreOut.txt","r");
  • fscanf(fout,"%c",&ch);
  • printf("\n\nscoreOut.txt的内容为:\n");
  • while(!feof(fout))
  • {
  • putchar(ch);
  • fscanf(fout,"%c",&ch);
  • }
  • fclose(fout);
  • return 0;
  • }

运行结果为:

scoreIn.txt的内容为:
4
0001 linda 485
0002 peter 496
0003 mary 520
0004 tony 512

scoreOut.txt的内容为:
0003 mary 520.00 1
0004 tony 512.00 2
0002 peter 496.00 3
0001 linda 485.00 4

以上程序中的 A 和 B 两段代码可以书写成如下形式:

  • A:fscanf(fin,"%s %s %f",stu[i].id,stu[i].name,&stu[i].score);
  • B:fprintf(fout,"%s %s %.2f %d",stu[i].id,stu[i].name,stu[i].score,stu[i].num);
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门