c语言大奖赛评分系统

对参赛结果分数进行处理:参赛选手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即可,代码如下:

参考链接:


https://blog.csdn.net/qq_41430551/article/details/90409644

#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   

img