题目要求:
歌手比赛系统
对一次歌手比赛的成绩进行管理,输入每个选手的数据包括编号、姓名、10个评委的成绩,根据输入计算出总成绩和平均成绩(去掉最高分,去掉最低分)。
实现以下功能:
(1) 系统以菜单方式工作;
(2) 输入选手数据,评委打分;
(3) 成绩排序(按平均分);
(4) 数据查询;
(5) 写入数据文件;
(6) 退出系统。
备注:歌手数据包括以下信息:编号,姓名,平均得分。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int N = 10010;//结构体数组最大容量
const int LEN = 50;//名字最大长度
typedef struct
{
char name[LEN];//名字
int snumber;//编号
double avecore;//平均分
}singerinf;
singerinf singers[N];//结构体数组,每一个元素都是一个singerinf类型
int cnt = 0;//记录数组用到哪个位置
void menu()
{
printf("====================================\n");
printf("1.歌手信息录入\n");
printf("2.排序并查看所有歌手信息\n");
printf("3.歌手查询\n");
printf("4.读取数据\n");
printf("5.保存数据\n");
printf("6.退出\n");
printf("====================================\n");
}
void insingerinf()
{
singerinf singer;
printf("请输入名字\n");
scanf("%s",singer.name);
printf("请输入歌手编号\n");
scanf("%d",&singer.snumber);
printf("请输入十个评委的分数\n");
double core = 0,sum = 0,k;
for(k = 1;k <= 10; k ++)
{
printf("第%.0lf位评委的评分为:\n",k);
scanf("%lf",&core);
sum += core;
}
singer.avecore = sum / 10.00;
singers[cnt ++] = singer;
int idx1 = cnt - 1;
printf("-------------------录入成功!-------------------\n");
printf("歌手姓名:%s\n",singers[idx1].name);
printf("歌手编号:%d\n",singers[idx1].snumber);
printf("歌手均分:%.2lf\n",singers[idx1].avecore);
//printf("cnt = %d\n",cnt);
printf("------------------------------------------------\n");
}
void sortcheck(singerinf q[],int l,int r)//按平均分快速排序
{
if(l >= r) return;
int i = l - 1, j = r + 1, x = q[(l + r) / 2].avecore;
while(i < j)
{
do i ++; while(q[i].avecore < x);
do j --; while(q[j].avecore > x);
if( i < j)
{
singerinf t = q[i];
q[i]= q[j];
q[j]= t;
}
}
sortcheck(q,l,j);
sortcheck(q,j +1 ,r);
}
void check()
{
for(int i = 0;i < cnt;i ++)
{
printf("-------------------------------\n");
printf("歌手姓名:%s\n",singers[i].name);
printf("歌手编号:%d\n",singers[i].snumber);
printf("歌手均分:%.2lf\n",singers[i].avecore);
printf("-------------------------------\n");
}
printf("排序已完成!\n");
}
void inffind()
{
printf("---------------------------------\n");
printf("请输入查询姓名:");
char fname[LEN];
scanf("%s",fname);
for(int i = 0;i < cnt ; i ++)
{
if(!strcmp(fname,singers[i].name))
{
printf("歌手姓名%s\n",singers[i].name);
printf("歌手编号%d\n",singers[i].snumber);
printf("歌手均分%.2lf\n",singers[i].avecore);
break;
}
}
printf("---------------------------------\n");
}
void savedata()
{
FILE *fp = NULL;
fp = fopen("data.txt","wb");
//写入
for(int i = 0;i < cnt ; i ++)
{
fwrite(&singers[i],sizeof(singerinf),1,fp);
}
fclose(fp);
}
void readdata()
{
FILE *fp = NULL;
fp = fopen("data.txt","rb");
//读出
int i = 0;
while(!feof(fp))
{
fread(&singers[i],sizeof(singerinf),1,fp);
//printf("name = %s\n",singers[i].name);
//printf(" i = %d\n",i);
i ++;
}
i --;
cnt = i;
fclose(fp);
printf("读取成功!\n");
}
int main()
{
menu();
int op;
while(1)
{
scanf("%d",&op);
if(op == 1)
{
system("cls");
insingerinf();
menu();
}
else if(op == 2)
{
system("cls");
sortcheck(singers,0,cnt - 1);
check();
menu();
}
else if(op == 3)
{
system("cls");
inffind();
menu();
}
else if(op == 4)
{
system("cls");
readdata();
menu();
}
else if(op == 5)
{
system("cls");
savedata();
menu();
}
else if(op == 6)
{
break;
}
else printf("intput errpr!!\n");
}
return 0;
}