早教吧 育儿知识 作业答案 考试题库 百科 知识分享

c语言文件操作,结构体老师要统计所有同学的c语言成绩总分和排名,但是他又懒得算,就让你写个程序来帮他算。他将同学们的成绩存入了文件score.txt中,下面是score.in的样例5

题目详情
c语言文件操作,结构体
老师要统计所有同学的c语言成绩总分和排名,但是他又懒得算,就让你写个程序来帮他算。他将同学们的成绩存入了文件score.txt中,下面是score.in的样例


5

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
第一行是一个数字n,表示有n名同学。下面n行,每行分别表示每名同学的姓名、杭电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
▼优质解答
答案和解析
#include <stdio.h>

#define SCORERADIX    0.7

typedef struct tagScore
{
    double    m_nSumScore;
    long    m_lACM;
    int        m_nClass;
    int        m_nDone;
    int        m_nScore;
    char    m_strName[15];
}SCORE,*PSCORE;

int main()
{
    FILE *fpSrc = NULL,*fpDst = NULL;
    PSCORE pScore = NULL;
    long lCnt = 0l,i = 0l;
    int nIncr = 0;
    
    fpSrc = fopen("score.txt","r");
    
    if (NULL == fpSrc)
    {
        /*提示信息*/
        goto CLEARNNONE;
    }
    
    fpDst = fopen("rank.txt","w");
    if (NULL == fpDst)
    {
        /*提示信息*/
        goto CLEARNSRC;
    }
    
    if (EOF == fscanf(fpSrc,"%ld",&lCnt) || lCnt < 0l)
    {
        /*提示信息*/
        goto CLEARNALL;
    }
    
    pScore = (PSCORE)calloc(lCnt,sizeof(SCORE));
    
    if (NULL == pScore)
    {
        /*提示信息*/
        goto CLEARNALL;
    }
    
    for(i = 0l;i < lCnt;++i)
    {
        if (EOF == fscanf(fpSrc,"%s%ld%d%d%d",pScore[i].m_strName,&pScore[i].m_lACM,&pScore[i].m_nClass,&pScore[i].m_nDone,&pScore[i].m_nScore))
        {
            /*提示信息*/
            break;
        }
        
        pScore[i].m_nSumScore = (double)pScore[i].m_nScore * SCORERADIX;
        
        nIncr = pScore[i].m_nClass + pScore[i].m_nDone;
        if (pScore[i].m_lACM >= 80)
        {
            nIncr = 30;
        }
        else if (pScore[i].m_lACM > 30)
        {
            nIncr += ((pScore[i].m_lACM - 30) / 10) * 2;
            if (nIncr > 30)
            {
                nIncr = 30;
            }
        }
        else
        {
            /*do nothing*/
        }
        
        pScore[i].m_nSumScore += nIncr;
    }
    
    /*排序*/
    for(i = 0l;i < lCnt;++i)
    {
        /*........*/
    }
    
    /*输出*/
    for(i = 0l;i < lCnt;++i)
    {
        fprintf(fpDst,"%s %f\n",pScore[i].m_strName,pScore[i].m_nSumScore);
    }

CLEARNALL:
    free(pScore);
    fclose(fpDst);
CLEARNSRC:
    fclose(fpSrc);
CLEARNNONE:
    return 0;
}