回 帖 发 新 帖 刷新版面

主题:各位高手可以帮忙解决下这个c语言编程问题吗?

设计一个程序处理歌手比赛成绩。有30个歌手参加比赛,12位评委和现场观众进行评分;记分办法:对于12位评委的分值,去掉一个最高分,去掉一个最低分,再按中间10位评委的分数计算评委平均分。
每位歌手唱两首歌,第一首歌曲是必选歌曲(即在事先公布的歌曲名单中选择一首),该歌曲的最后分数还要乘以系数1.05;第二首为自选歌曲。歌手的最后得分为两首歌曲的最后分值之和。

要求:
(1)每位歌手演唱完两首歌曲后,工作人员将他(她)两首歌曲的相关信息(歌手编号、歌手姓名、歌曲名称、各项得分)从键盘输入,而且要求程序将这些信息写入文本文件备日后查用. 
(2)对歌手按得分从高到低排序;按得分从高到低排序输出歌手编号、姓名与得分,并保存到文本文件中。

回复列表 (共1个回复)

沙发

#include <stdio.h>
#include <string.h>
#include <memory.h>

typedef struct{
    int id;/*歌手编号*/
    char name[10];/*歌手姓名*/
    char sname[2][20];/*歌曲名*/
    double judges[2][12];/*评委打分*/
    double marks;/*最终得分*/
}SINGER;

SINGER singers[30];
char fsn[20];/*第一首歌名*/
/*平均成绩*/
double avg(double *marks)
{
    int i,pos,pos2;
    double min,max,sum=0;
    /*最小值*/
    pos=0;
    for(i=1;i<12;i++)
        if(marks[i]<marks[pos])
            pos=i;
    min=marks[pos];
    marks[pos]=0;
    /*最大值*/
    pos2=0;
    for(i=1;i<12;i++)
        if(marks[i]>marks[pos])
            pos2=i;
    max=marks[pos2];
    marks[pos2]=0;
    
    for(i=0;i<12;i++)
        sum+=marks[i];
    marks[pos]=min;
    marks[pos2]=max;
    return sum/12;
}
/*输入选手信息*/
void input_info()
{
    int i,j,k;
    for(k=0;k<30;k++)
    {
        strcpy(singers[k].sname[0],fsn);
        printf("选手编号:");scanf("%d",&singers[k].id);
        printf("选手姓名:");scanf("%s",singers[k].name);
        printf("请输入第一首歌曲评委打分\n");
        for(j=0;j<12;j++)
        {
            printf("第%d位评委打分:",j+1);
            scanf("%lf",&singers[k].judges[0][j]);
        }
        printf("第二首歌曲名:");scanf("%s",singers[k].sname[1]);
        printf("请输入第二首歌曲评委打分\n");
        for(j=0;j<12;j++)
        {
            printf("第%d位评委打分:",j+1);
            scanf("%lf",&singers[k].judges[1][j]);
        }
        singers[k].marks=avg((double*)&singers[k].judges[0])*1.05+avg((double*)&singers[k].judges[1]);
    }
}
/*保存原始信息*/
void save_info()
{
    FILE *fp;int i;
    fp=fopen("info.txt","a+");
        if(!fp) return;
    for(int j=0;j<30;j++)
    {
        fseek(fp,0,2);
        char buf[2048]={0};
        sprintf(buf,"选手编号:%d 选手姓名:%s\n第一首歌曲名:%s\n",singers[j].id,singers[j].name,singers[j].sname[0]);
        strcat(buf,"评委打分:");
        char *p=buf+strlen(buf);
        for(i=0;i<12;i++,p+=strlen(p))
            sprintf(p,"%.2lf ",singers[j].judges[0][i]);
        sprintf(p,"\n第二首歌曲名:%s\n",singers[j].sname[1]);
        strcat(buf,"评委打分:");
        p=buf+strlen(buf);
        for(i=0;i<12;i++,p+=strlen(p))
            sprintf(p,"%.2lf ",singers[j].judges[1][i]);
        strcat(buf,"\n\n");
        fwrite(buf,strlen(buf),1,fp);
        
    }
    fclose(fp);
}
/*排序*/
void sort_marks()
{
    SINGER s;int i,j,pos;
    for(i=0;i<30;i++)
    {
        pos=i;
        for(j=i+1;j<30;j++)
            if(singers[pos].marks<singers[j].marks)
                pos=j;
        if(pos!=i)
        {
            s=singers[pos];
            singers[pos]=singers[i];
            singers[i]=s;
        }
    }

}
/*保存最终排名*/
void save_result()
{
    FILE *fp;int i;
    fp=fopen("result.txt","a+");
    if(!fp) return;
    char buf[1024]={0};
    for(i=0;i<30;i++)
    {
        memset(buf,0,1024);
        sprintf(buf,"名次:%d 选手编号:%d 选手姓名:%s 最终得分:%.2lf\n",i+1,singers[i].id,singers[i].name,singers[i].marks);
        fwrite(buf,strlen(buf),1,fp);
    }
    fclose(fp);
}
int main()
{
    printf("必选歌曲名:");
    scanf("%s",fsn);
    input_info();
    save_info();
    sort_marks();
    save_result();
    return 0;
}
写的有点乱,将就一下!
源码:http://115.com/file/cl75nel2#
marks.cpp

我来回复

您尚未登录,请登录后再回复。点此登录或注册