对参赛结果分数进行处理:参赛选手n人(n>1),评委m人(m>2),评委给每一选手打一个分数score(分数score为小于等于10的一个正实数)。选手的最后得分lastScore计算方法为
(1)m<9时,去掉一个最高分和一个最低分后另m-2个得分的平均值。
(2)m≥9时,去掉两个最高分和两个最低分后另m-4个得分的平均值。
假设事先已经建立了text型的数据文件f1.txt,其中依次记录着n个选手的编号(一个正整数)、姓名(一个字符串)以及m个评委给出的得分。
请编制程序,依次从数据文件f1.txt中读入n个选手的有关信息,而后按上述规定方法计算出每一个选手的最后得分,而且往屏幕上以及另一个text型文件f2.txt中同时输出如下形式的结果信息。
使用一个结构来保存每个选手的信息,然后使用结构数组读取f1.txt的比赛选手信息,经过计算后,把最终结果打印在屏幕和写入f2.txt即可,代码如下:
参考链接:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 存储比赛选手信息的结构
struct player{
int id; //选手编号
char name[20]; //姓名
double *score; // 指向存储m个评委分数的分数指针
double lastScore; // 最终成绩
};
// 计算一个字符串中,有多少个比赛成绩
int judgesNum(char * scores){
int i=0;
int num=0;
int start=0;
while(scores[i]!='\0'){
if(scores[i]>='0'&&scores[i]<='9'&&start==0){
start=1;
num++;
}
if((scores[i]<='0'||scores[i]>='9')&&start==1){
start=0;
}
i++;
}
return num;
}
int main(void){
FILE * fp = fopen("f1.txt","r");
if(fp==NULL){
printf("打开文件f1.txt失败,程序退出!\n");
return 0;
}
int n=0,m=0;
int tid;
char tname[20];
char temp[1000];
char * result ;
// 计算f1.txt文件中 比赛选手的个数,和评委的个数
while(feof(fp)==0){
if(n==0){
fscanf(fp,"%d %s",&tid,tname);
// https://baike.baidu.com/item/fgets/10942211?fr=aladdin
result=fgets(temp,1000,fp);
if(result!=NULL){
if(temp[strlen(temp)-1]=='\n'){
temp[strlen(temp)-1]='\0';
}
m = judgesNum(temp);
// printf("m=%d\n",m);
n++;
}
}else{
result=fgets(temp,1000,fp);
if(result!=NULL){
n++;
}
}
// printf("n=%d\n",n);
}
// https://baike.baidu.com/item/rewind/6391452?fr=aladdin
rewind(fp);
struct player * ps = (struct player *)malloc(sizeof(struct player)*n);
int i=0,j;
// 从f1.txt文件中 读取n个比赛选手的信息,同时计算不扣除最高分和最低分的初步最终成绩
while(i<n){
fscanf(fp,"%d %s",&ps[i].id,ps[i].name);
//printf("%d %s ",ps[i].id,ps[i].name);
ps[i].score = (double *)malloc(sizeof(double)*m);
ps[i].lastScore =0;
for(j=0;j<m;j++){
// https://blog.csdn.net/qq_41430551/article/details/90409644
fscanf(fp,"%lf",&ps[i].score[j]);
ps[i].lastScore += ps[i].score[j];
// printf("%lf ",ps[i].score[j]);
}
// printf("\n");
i++;
}
fclose(fp);
i=0;
j=0;
int k;
double ts;
// printf("排序后的结果为:\n");
// 排序每个选手获得的成绩后,减去最低分最高分后求求得其最终成绩
while(i<n){
// printf("%d %s ",ps[i].id,ps[i].name);
for(j=0;j<m-1;j++){
for(k=j+1;k<m;k++){
if(ps[i].score[j]>ps[i].score[k]){
ts=ps[i].score[j];
ps[i].score[j]= ps[i].score[k];
ps[i].score[k] = ts;
}
}
}
// int y;
// for(y=0;y<m;y++){
// printf("%f ",ps[i].score[y]);
// }
// printf("\n");
if(m<9){
ps[i].lastScore = (ps[i].lastScore-ps[i].score[0]-ps[i].score[m-1])/(m-2);
}else{
ps[i].lastScore = (ps[i].lastScore-ps[i].score[0]-ps[i].score[1]-ps[i].score[m-1]-ps[i].score[m-2])/(m-4);
}
i++;
}
i=0;
struct player pt;
// 按最终成绩排序选手
while(i<n){
// printf("%d %s ",ps[i].id,ps[i].name);
for(j=0;j<n-1;j++){
for(k=j+1;k<n;k++){
if(ps[j].lastScore<ps[k].lastScore){
pt = ps[j];
ps[j] = ps[k];
ps[k] = pt;
}
}
}
i++;
}
i=0;
fp = fopen("f2.txt","w");
// 在 屏幕上打印以及写入最终比赛结果
if(fp==NULL){
printf("打开或创建文件失败,程序退出!\n");
return 0;
}
printf("最终成绩为:\n");
fprintf(fp,"最终成绩为:\n");
while(i<n){
printf("第%d名:选手编号: %d, 姓名:%s , 最终成绩:%.2f\n",i+1,ps[i].id,ps[i].name,ps[i].lastScore);
fprintf(fp,"第%d名:选手编号: %d, 姓名:%s , 最终成绩:%.2f\n",i+1,ps[i].id,ps[i].name,ps[i].lastScore);
i++;
}
fclose(fp);
printf("数据保存成功!\n");
return 0;
}
f1.txt(测试文件内容-使用ANSI编码方式保存):
1 张三 1 1 2 2 3 3 4 4 5 5
2 李四 2 2 2 2 3 3 5 5 6 6
3 王五 9 8 7 6 6 5 4 3 3 2
4 赵六 10 9 9 8 8 7 7 6 6 5
5 丁七 3 4 5 6 7 8 9 10 10 9
6 章文 8 7 6 6 5 5 4 4 3 3
7 许九 9 8 8 7 7 6 6 5 5 4
8 田明 4 5 6 6 7 7 8 8 9 9
9 张花 5 6 6 7 7 8 8 9 9 10
10 蔡十 7 8 8 9 10 10 9 8 7 6