Java根据成绩排名次_C语言按考试成绩排名次并存储到文件中

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

问题分析

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

7e606da6ce3c62530ad09e904b4fd48e.gif

图 1:输入输出文件样例

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

输出文件格式:共 n 行,每行包括学号、姓名、总成绩和名次,数据之间用空格分隔。

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

#include

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

fscanf(fin,"%s",stu[i].id);

fscanf(fin,"%s",stu[i].name);

fscanf(fin,"%f\n",&stu[i].score);

}

for(i=0;i

for(j=i+1;j

if(stu[i].score

temp=stu[i];

stu[i]=stu[j];

stu[j]=temp;

}   //结构体变量整体交换

stu[i].num = i+1;

}

for(i=0;i

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值