主题:各位高手可以帮忙解决下这个c语言编程问题吗?
619337037
[专家分:0] 发布于 2011-09-04 22:16:00
设计一个程序处理歌手比赛成绩。有30个歌手参加比赛,12位评委和现场观众进行评分;记分办法:对于12位评委的分值,去掉一个最高分,去掉一个最低分,再按中间10位评委的分数计算评委平均分。
每位歌手唱两首歌,第一首歌曲是必选歌曲(即在事先公布的歌曲名单中选择一首),该歌曲的最后分数还要乘以系数1.05;第二首为自选歌曲。歌手的最后得分为两首歌曲的最后分值之和。
要求:
(1)每位歌手演唱完两首歌曲后,工作人员将他(她)两首歌曲的相关信息(歌手编号、歌手姓名、歌曲名称、各项得分)从键盘输入,而且要求程序将这些信息写入文本文件备日后查用.
(2)对歌手按得分从高到低排序;按得分从高到低排序输出歌手编号、姓名与得分,并保存到文本文件中。
沙发
45177659 [专家分:0] 发布于 2011-10-08 01:02:00
#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