题目:歌星大赛奖
要求:
(1)在歌星大赛中,有十个评委为参赛的选手打分。分数为1-100分。选手最后得分为:去掉一个最高分,去掉一个最低分其余8个分数的平均值。试写一段程序实现。
(2)同时对评委评分进行判断,即在10个评委中找出最公平(评分最接近平均分)的和最不公平的(即与平均分的差距最大)的评委。
这个问题的第一个算法要求简单,但是要注意在程序中判断最大,最小的变量是如何赋值;第二个要求要考虑效率,要用到排序技术。注意,要用到文件储存信息。
评分系统需要录入歌星的信息,输入10个评委的评分,然后求出相应的平均数,再求出最公平的和最不公平的评委,保存再相应的文件夹中。分为录入,计算,浏览,修改,删除,查询模块。
数据结构体设计:定义结构体变量struct people,进行数据输入,输出,保存,修改等功能。
其中定义M=50,指该数据库最多能放50组数据。N为可变数据组数,即当前数据组数。
main()
{
void re_file(); //读文件
int sele;
sele=1;
while(sele)
{
system("cls");
printf("\n\n"); //显示界面
printf(" ****************************************\n");
printf(" * *\n");
printf(" * 1:浏览 2:删除 *\n");
printf(" * 3:增加 4:修改 *\n");
printf(" * 5:退出 6:计算 *\n");
printf(" * 7查询 *\n");
printf(" * *\n");
printf(" ****************************************\n");
printf("\n\n 请输入选择功能序号:");
scanf("%d",&sele); //通过输入按键来判断执行那个步骤
switch(sele)
{
case 1:display();break;
case 2:display();delete1();break;
case 3:apepend();display();break;
case 4:display();modify();break;
case 5:sele=0;break;
case 6:caculate();display();break;
case 7:query();break;
}
wr_file(); //写文件
printf("\n按任意键继续\n");
getch();
}
}
/*先定义一个结构体struct people,包含每位歌星的评分信息,在用可读的方式打开文件zhongmo.txt.*/
struct people
{
char name[40];
char xuhao;
float pinjunfen;
float pingfen[10];
char xuanpingwei[2];
}ss[M];
/*M为最多的明星个数,程序中采用宏定义的方式,可以随时改变源程序中定义的修改值。本程序中宏定义:#define M 50。*/
//数据读入模块
void re_file()
{
char i;
FILE *fp;
fp=fopen("zhangmo.txt","r");
while(fscanf(fp,"%s%s%d%d%d",ss[i].name,&ss[i].xuhao,&ss[i].pinjunfen,
ss[i].xuanpingwei[0],ss[i].xuanpingwei[1]
)!=EOF) i++;
fclose(fp);
}
/*本程序为了简化计算结果,分数采用100进制整数形式,如果需要修改,可以定义为float类型。*/
本程序的目的是为了计算出每位明星的平均分和最佳或者最差评分员。采用冒泡法来计算最小值和最大值,从而判断平均值。在判断最好和最差评分员。
void caculate()
{char fenshu[10],zhongjinazhi;
int zhonggong=0;
int i,j,k;
int zuixiaozhi,zuidazhi;
for(k=0;k<N;k++)
{
for(i=0;i<10;i++)
fenshu[i]=ss[k].pingfen[i];
for(i=0;i<9;i++)
for(j=i;j<9;j++)
{
if(fenshu[i]>fenshu[j+1])
{
zhongjinazhi=fenshu[i];
fenshu[i]=fenshu[j+1];
fenshu[j+1] =zhongjinazhi;
}
}
for(i=1;i<9;i++)
zhonggong=zhonggong+fenshu[i];
zhonggong=zhonggong/8;
ss[k].pinjunfen=zhonggong;
zuidazhi=abs(zhonggong-ss[k].pingfen[0])
for(i=1;i<10;i++)
{
if(abs(zhonggong-ss[k].pingfen[i])>zuidazhi)
j=i;
}
ss[k].xuanpingwei[0]=j;//最差评委
zuixiaozhi=abs(zhonggong-ss[k].pingfen[0]);
for(i=1;i<10;i++)
{
if(zuixiaozhi>abs(zhonggong-ss[k].pingfen[i]))
{
zuixiaozhi=abs(zhonggong-ss[k].pingfen[i]);
j=i;
}
}
ss[k].xuanpingwei[1]=j;//最好评委
}
}
从键盘添加新的明星信息和评分
void apepend()
{
int n,i,j;
printf("\n增加歌星人数");
scanf("%d",&n); N=N+n; //新增人数叠加,不影响原来的明星
printf("\n现在,输入相关信息:\n");
for(i=1;i<n+1;i++)
{
printf("歌星:");
scanf("%s",&ss[N-n-1+i].name);
printf("序号:");
scanf("%s",&ss[N-n-1+i].xuhao);
printf("评委打分:");
for(j=0;j<10;j++)
{
printf("评委%d:",j+1);
scanf("%d",&ss[N-n-1+i].pingfen[j]);
}
}
}
该程序的功能是根据姓名或者序号修改明星的评分,序号,或者姓名。
void modify()
{
int i,j=-1,t;
char m[40],d[10];
printf("\n\n\n");
printf(" *******************************************\n");
printf(" * *\n");
printf(" * 1:姓名 2:序号 *\n");
printf(" * *\n");
printf(" *******************************************\n");
printf("请输入修改选项:");
scanf("%d",&i);
if(i==1)
{
printf("请输入歌星:");
scanf("%s",&m);
for(i=0;i<N;i++)
if(strcmp(m,ss[i].name)==0)
j=i;
}
else if(i==2)
{
printf("请输入序号:");
scanf("%s",&d);
for(i=0;i<N;i++)
if(strcmp(d,ss[i].xuhao)==0)
j=i;
}
if(j==-1)
printf("没有找到!\n");
else {
printf("序号 歌星 评委1 2 3 4 5 6 7 8 9 10 平均分最差评委最好评委\n");
printf("%3s%6s%8d%5d%5d%4d%4d%4d%4d%4d%4d%4d%8d%8d%6d\n",ss[j].xuhao,ss[j].name,
ss[j].pingfen[0],ss[j].pingfen[1],ss[j].pingfen[2],ss[j].pingfen[3],
ss[j].pingfen[4],ss[j].pingfen[5],ss[j].pingfen[6],ss[j].pingfen[7],
ss[j].pingfen[8],ss[j].pingfen[9],ss[j].pinjunfen,ss[j].xuanpingwei[0],
ss[j].xuanpingwei[1]);
}
printf("\n\n");
printf(" ********************************************************************\n");
printf(" * *\n");
printf(" * 1:序号 2:歌星名 3:评分 *\n");
printf(" * *\n");
printf(" ********************************************************************\n");
scanf("%d",&t);
switch(t)
{
case 1:printf("序号改为:");scanf("%s",&ss[j].xuhao);break;
case 2:printf("姓名改为:");scanf("%s",ss[j].name);break;
case 3:printf("评分改为:");
{
for(i=0;i<10;i++)
{
printf("评委%d",i+1);
scanf("%f",&ss[i].pingfen[i]);
}
}
break;
}
}
该程序的功能是根据序号或者明星姓名删除某位明星的评分数据。
void delete1()
{
int i,j=-1;
char m[40],d[10];
printf("删除模块:");
printf("\n\n");
printf(" ******************************************************************\n");
printf(" * *\n");
printf(" * 1:歌星名 2:序号 *\n");
printf(" * *\n");
printf(" ******************************************************************\n");
printf("输入删除选项:\n");
scanf("%d",&i);
if(i==1)
{
printf("输入歌星名:");
scanf("%s",m);
for(i=0;i<N;i++)
if(strcmp(m,ss[i].name)==0)
j=i;
}
if(i==2)
{
printf("输入序号:");
scanf("%s",d);
for(i=0;i<N;i++)
if(strcmp(d,ss[i].xuhao)==0)
j=i;
}
if(j!=-1)
{
N=N-1;
for(i=j;i<=N&&j!=-1;i++)
ss[i]=ss[i+1];
}
else if(j==-1)
printf("没有找到!\n");
}
该模块的功能是显示所有的明星评分数据。
void display()
{
int i,j;
system("cls");
printf("序号 歌星 评委1 2 3 4 5 6 7 8 9 10 平均分最差评委最好评委\n");
for(j=0,i=1;j<N;i++,j++)
{ printf("%3s%6s%8d%5d%5d%4d%4d%4d%4d%4d%4d%4d%8d%8d%6d\n",ss[j]. xuhao,ss[j].name,
ss[j].pingfen[0],ss[j].pingfen[1],ss[j].pingfen[2],ss[j].pingfen[3],
ss[j].pingfen[4],ss[j].pingfen[5],ss[j].pingfen[6],ss[j].pingfen[7],
ss[j].pingfen[8],ss[j].pingfen[9],ss[j].pinjunfen,ss[j].xuanpingwei[0],
ss[j].xuanpingwei[1]);
if(i%10==0)
{
printf("按任意键继续....");
getch();
puts("\n");
printf("序号 歌星 评委1 2 3 4 5 6 7 8 9 10 平均分最差评委最好评委\n");
}
}
}
通过输入序号或者歌星名,调取歌星的信息
void query()
{
int i,j[20]={-1},d,k,t=0;
char m[20];
printf("查询模块:");
printf("\n\n");
printf(" ********************************************************************\n");
printf(" * *\n");
printf(" * 1:歌星名 2:序号 *\n");
printf(" * *\n");
printf(" ********************************************************************\n");
printf("输入查询选项:\n");
scanf("%d",&k);
if(k==1)
{
printf("请输入姓名:");
scanf("%s",&m);
for(i=0;i<N;i++)
if(strcmp(m,ss[i].name)==0)
{
j[t]=i;t=t+1;
}
else if(k==2)
{
printf("请输入序号");
scanf("%d",&d);
for(i=0;i<N;i++)
if(d==ss[i].xuhao)
{
j[t]=i;t++;
}
if(j[0]==-1&&t==0)
printf("没有找到!\n");
if(j[0]!=-1&&t!=0)
{
printf("序号 歌星 评委1 2 3 4 5 6 7 8 9 10 平均分最差 评委最好评委\n");
for(i=0;i<t;i++) printf("%3s%6s%8d%5d%5d%4d%4d%4d%4d%4d%4d%4d%8d%8d%6d\n",ss[i].xuhao,ss[i].name,
ss[i].pingfen[0],ss[i].pingfen[1],ss[i].pingfen[2],ss[i].pingfen[3],
ss[i].pingfen[4],ss[i].pingfen[5],ss[i].pingfen[6],ss[i].pingfen[7],
ss[i].pingfen[8],ss[i].pingfen[9],ss[i].pinjunfen,ss[i].xuanpingwei[0],
ss[i].xuanpingwei[1]);
}
}
}
}
5上机操作
5.1主界面显示:
图5-1主界面
5.2浏览模块:按1进入
图5-2浏览模块
5-3增加模块:按3
图5-3增加模块
5-4删除模块:删除歌星1的数据
图5-4删除模块
5.5修改模块:按2修改。已将序号2变成了序号33.
图5-5修改模块
5.6删除模块:已将序号为33的学员信息删除。
图5-6删除模块
5.7计算模块:计算当前输入信息,判断平均分,最好评委,最差评委。
图5-7计算模块
5.8查询模块,可通过序号或者歌星名查询信息。
图5-8-1查询模块
显示相应的值:
5-8-2查询模块
5.9退出程序:
图5-9退出程序
5-10保存的文件夹
通过对本程序的写入,运行,调试,我知道如何将分离的模块函数综合起来,将C语言课程中学到的理论知识运用到实际中,编写一个小小的明星评分系统,很有些成就感。
在运行程序中,我有几次忘了改文件的输出格式,导致输出结构体乱码,文件的写入方式不对,也导致文件不能打开。明星评分系统写的函数不对,也导致输出的结果不对,最后改对了。
感谢学校能给我们这次机会实习,有幸接触到计算机编程,虽然和专业不大关系,但我们学习到了编程的奥秘和乐趣。
[1] 谭浩强. C程序设计(第三版)[M]. 北京: 清华大学出版社, 2005.
[2] 张冬梅, 刘远兴, 陈晶, 等. 基于PBL的C语言课程设计及学习指导[M]. 北京: 清华大学出版社, 2011.
[3] 网络资源……