C语言文件操作练习
fscanf和fprintf
老师要统计所有同学的c语言成绩总分和排名,但是他又懒得算,就让你写个程序来帮他算。他将同学们的成绩存入了文件score.txt中,下面是score.txt的样例。
Ultraman 113 10 10 70
Zhanghua 15 5 15 90
Tom 40 10 15 70
Pikachu 99 0 0 80
Doraemon 10 15 15 80
每行分别表示每名同学的姓名、杭电ACM刷题数,课题表现分,实验分和笔试成绩。总成绩按照下面的方式进行计算:
1.总成绩满分100。
2.笔试成绩×70%后再加到总分上。
3.实验分和课堂分合计30分。若杭电刷题超过30,则每刷10道,可再实验分和课堂分中加1分(但不可超过30分上限),若杭电刷题超过80,则实验分和课堂分得满分。
使用以上方式计算每名同学的总分,并按总分从大到小的顺序,将每名同学的姓名与成绩存入rank.txt文件中。若总分相同,则姓名从首位开始ASCII码小的同学排在前面。
结果如下:
Doraemon 86
Pikachu 86
Zhanghua 83
Ultraman 79
Tom 78
结果输出到rank.txt中。
代码
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct student{
char name[30];
int problem_num;
int class_score;
int experiment_score;
int exam_score;
double sum=0;
}stu[100];
bool cmp(student a,student b)
{
if(a.sum!=b.sum) return a.sum>b.sum;
else return a.name[0]<b.name[0];
}
int main()
{
FILE *fp=fopen("C:/Users/think/Desktop/score.txt","r");
int i=0;
//读取文件
while(fscanf(fp,"%s",stu[i].name)!=EOF)
{
fscanf(fp,"%d",&stu[i].problem_num);
fscanf(fp,"%d",&stu[i].class_score);
fscanf(fp,"%d",&stu[i].experiment_score);
fscanf(fp,"%d",&stu[i].exam_score);
i++;
}
/*for(int j=0;j<5;j++)
{
cout<<stu[j].name<<endl;
cout<<stu[j].problem_num<<endl;
cout<<stu[j].class_score<<endl;
cout<<stu[j].experiment_score<<endl;
cout<<stu[j].exam_score<<endl;
}*/
//计算总分
for(int j=0;j<i;j++)
{
double cla_epr=stu[j].class_score+stu[j].experiment_score;
stu[j].sum+=stu[j].exam_score*0.7;
if(stu[j].problem_num>=80)
{
cla_epr=30;
}
else
{
while((stu[j].problem_num-=10)>0?true:false)
{
cla_epr++;
}
if(cla_epr>30) cla_epr=30;
}
stu[j].sum+=cla_epr;
}
//排名
sort(stu,stu+i,cmp);
//写入rank.txt
FILE *fpWrite=fopen("C:/Users/think/Desktop/rank.txt","w");
//fprintf(fpWrite,"%s",stu[0].name);
for(int j=0;j<i;j++)
{
fprintf(fpWrite,"%s ",stu[j].name);
fprintf(fpWrite,"%2.f\n",stu[j].sum);
}
return 0;
}
结果