|
|
#include<stdio.h> //编译预处理命令
|
|
|
#include<stdlib.h> //定义杂项函数及内存分配函数
|
|
|
#include<string.h> //字符串处理
|
|
|
#include <time.h> //用到了time函数
|
|
|
int main()
|
|
|
{
|
|
|
int num=0;
|
|
|
while(1)
|
|
|
{
|
|
|
system("cls");
|
|
|
load();
|
|
|
printf("|----歌唱比赛管理系统----\n");
|
|
|
printf("\n ----------------------\n");
|
|
|
printf("| [1] 参赛歌手信息录入 |\n");
|
|
|
printf("| [2] 参赛歌手信息显示 |\n");
|
|
|
printf("| [3] 查询参赛歌手信息 |\n");
|
|
|
printf("| [4] 修改评委打分 |\n");
|
|
|
printf("| [5] 查询出场次序 |\n");
|
|
|
printf("| [6] 比赛结果排序 |\n");
|
|
|
printf("| [7] 退出系统 |\n");
|
|
|
printf(" ----------------------\n");
|
|
|
printf("请选择要进行的操作:");
|
|
|
scanf("%d",&num);
|
|
|
switch(num)//菜单
|
|
|
{
|
|
|
case 1 : info_sign();break;//录入
|
|
|
case 2 : info_show();break;//显示
|
|
|
case 3 : info_find();break;//查找
|
|
|
case 4 : grade_modify();break;//修改
|
|
|
case 5 : find_order();break;
|
|
|
case 6 : result_sort();break;
|
|
|
case 7 : exit(0);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
struct node{
|
|
|
int id;//编号
|
|
|
char name[20];//姓名
|
|
|
double score[11];//成绩
|
|
|
double sum;//平均分
|
|
|
|
|
|
}st[100],s;
|
|
|
int snum=0;
|
|
|
int load() /********************************************加载文件数据到内存 *************************************/
|
|
|
{
|
|
|
snum=0;
|
|
|
FILE *fp; //声明文件指针
|
|
|
fp=fopen("info.txt","r"); //以读的方式打开文件
|
|
|
if(fp==NULL)
|
|
|
{
|
|
|
printf("数据文件加载失败,疑似info.dat文件丢失,或者未导入数据\n");
|
|
|
}
|
|
|
else{
|
|
|
while(!feof(fp)){//遍历 文件数据
|
|
|
fread(&st[snum++],sizeof(struct node),1,fp); //snum是参赛选手的数量,每读取一条数据加一次。
|
|
|
}
|
|
|
}
|
|
|
if(snum>0)
|
|
|
snum--;
|
|
|
else snum=0;
|
|
|
fclose(fp);
|
|
|
printf("数据条数:%d\n",snum);
|
|
|
return 0;
|
|
|
}
|
|
|
int save() /**********************************将内存数据写入文件******************************************/
|
|
|
{
|
|
|
FILE *fp;
|
|
|
int i,t=0;
|
|
|
fp=fopen("info.txt","w");//以写的方式打开参赛选手信息文件
|
|
|
for(i=0;i<snum;i++){
|
|
|
fwrite(&st[i],sizeof(struct node),1,fp);
|
|
|
//依次将数据读入st结构体
|
|
|
}
|
|
|
fclose(fp);
|
|
|
printf("保存成功!\n");
|
|
|
|
|
|
//printf("%d\n",snum);//输出保存后的参赛选手数目,和课程数目
|
|
|
return 0;
|
|
|
}
|
|
|
int info_sign() /*************************添加参赛选手信息 *********************/
|
|
|
{
|
|
|
printf("数据条数:%d\n",snum);
|
|
|
int i;
|
|
|
printf("编号:");
|
|
|
scanf("%d",&st[snum].id);
|
|
|
printf("姓名:");
|
|
|
scanf("%s",st[snum].name);
|
|
|
printf("依次输入十位评委成绩:\n");
|
|
|
st[snum].sum=0;
|
|
|
double mi=0xffffff,ma=0;
|
|
|
for( i=0;i<10;i++)
|
|
|
{
|
|
|
scanf("%lf",&st[snum].score[i]);
|
|
|
if(mi>st[snum].score[i])
|
|
|
{
|
|
|
mi=st[snum].score[i];
|
|
|
}
|
|
|
if(ma<st[snum].score[i])
|
|
|
{
|
|
|
ma=st[snum].score[i];
|
|
|
}
|
|
|
st[snum].sum+=st[snum].score[i];
|
|
|
}
|
|
|
st[snum].sum=st[snum].sum-mi-ma;
|
|
|
st[snum].sum/=8;//求平均分
|
|
|
snum++;
|
|
|
save();//由于结构体里的数据有新的添加 ,所有这里调用一下保存函数
|
|
|
getchar();getchar();
|
|
|
}
|
|
|
int info_show() //打印所有信息
|
|
|
{ int i;
|
|
|
for(i=0;i<snum;i++)
|
|
|
{
|
|
|
printf("\n---------------------------------------------------------------------------------------------\n");
|
|
|
printf("| 编号:%04d | 姓名:%s | 平均分%.2f |\n",st[i].id,st[i].name,st[i].sum);
|
|
|
int j;
|
|
|
printf("|十位评委成绩:");
|
|
|
for(j=0;j<10;j++)
|
|
|
{
|
|
|
printf("[%d]%4.2f ",j+1,st[i].score[j]);
|
|
|
}
|
|
|
printf("\n---------------------------------------------------------------------------------------------\n");
|
|
|
}
|
|
|
getchar();
|
|
|
getchar();
|
|
|
return 0;
|
|
|
}
|
|
|
int info_find() //检索信息
|
|
|
{
|
|
|
int i;
|
|
|
printf("请输入参赛编号\n");
|
|
|
int k;
|
|
|
scanf("%d",&k);
|
|
|
for(i=0;i<snum;i++)//遍历结构体数组course[]查找对应的 课程id
|
|
|
{
|
|
|
if(st[i].id==k)//找到后输出
|
|
|
{
|
|
|
printf(" 编号:%04d 姓名:%s :平均分%.2f \n",st[i].id,st[i].name,st[i].sum);
|
|
|
int j;
|
|
|
printf("十个评委成绩:\n");
|
|
|
for(j=0;j<10;j++)
|
|
|
{
|
|
|
printf("[%d]%.2f ",j+1,st[i].score[j]);
|
|
|
}
|
|
|
printf("\n");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
getchar();getchar();
|
|
|
return 0;
|
|
|
}
|
|
|
int grade_modify()
|
|
|
{
|
|
|
int id,i;
|
|
|
printf("请输入参赛编号:");
|
|
|
|
|
|
scanf("%d",&id);
|
|
|
for(i=0;i<snum;i++)//遍历结构体数组course[]查找对应的 课程id
|
|
|
{
|
|
|
if(st[i].id==id)//找到后输出
|
|
|
{
|
|
|
printf(" 编号:%04d 姓名:%s :平均分%.2f \n",st[i].id,st[i].name,st[i].sum);
|
|
|
int j;
|
|
|
printf("十个评委成绩:\n");
|
|
|
for(j=0;j<10;j++)
|
|
|
{
|
|
|
printf("[%d]%.2f ",j+1,st[i].score[j]);
|
|
|
}
|
|
|
printf("\n");
|
|
|
|
|
|
while(1)
|
|
|
{
|
|
|
int k;
|
|
|
printf("\n\t\t请输入要修改第几位评委的评分:") ;
|
|
|
scanf("%d",&k);
|
|
|
printf("\t\t请输入要新成绩:");
|
|
|
scanf("%lf",&st[i].score[k-1]);
|
|
|
printf("\t\t十个评委成绩:\n");
|
|
|
for(j=0;j<10;j++)
|
|
|
{
|
|
|
printf("[%d]%.2f ",j+1,st[i].score[j]);
|
|
|
}
|
|
|
printf("\n");
|
|
|
printf("\t\t修改成功!\n");
|
|
|
printf("\t\t是否继续修改此人成绩 (y/n) : ");
|
|
|
int flag;
|
|
|
scanf("%d",&flag);
|
|
|
if(flag==0)
|
|
|
break;
|
|
|
//printf("gg");
|
|
|
}
|
|
|
// printf("kk");
|
|
|
double mi=0xffffff,ma=0;
|
|
|
for( j=0;j<10;j++)
|
|
|
{
|
|
|
|
|
|
if(mi>st[snum].score[j])
|
|
|
{
|
|
|
mi=st[snum].score[j];
|
|
|
}
|
|
|
if(ma<st[snum].score[j])
|
|
|
{
|
|
|
ma=st[snum].score[j];
|
|
|
}
|
|
|
st[snum].sum+=st[snum].score[j];
|
|
|
}
|
|
|
st[snum].sum=st[snum].sum-mi-ma;
|
|
|
st[snum].sum/=8;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
save();
|
|
|
return 0;
|
|
|
}
|
|
|
int find_order()
|
|
|
{
|
|
|
int v[105]={0};
|
|
|
int i,number;
|
|
|
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
|
|
|
for(i=0; i<snum; i++)
|
|
|
{
|
|
|
number = rand() % 100+1; //产生0-100的随机数
|
|
|
// printf("%d ", number);
|
|
|
if(v[i]==0)
|
|
|
{
|
|
|
v[number]=i+1;
|
|
|
}
|
|
|
else {
|
|
|
i--;
|
|
|
}
|
|
|
}
|
|
|
printf("随机出场次序是:\n");
|
|
|
printf("__________________\n");
|
|
|
printf("\n次序 | 编号 | 姓名\n\n");
|
|
|
int k=1;
|
|
|
for(i=0;i<101;i++)
|
|
|
{
|
|
|
if(v[i]!=0)
|
|
|
{
|
|
|
printf("[%02d] | %04d | %s \n",k,st[v[i]-1].id,st[v[i]-1].name);
|
|
|
k++;
|
|
|
}
|
|
|
}
|
|
|
getchar();getchar();
|
|
|
return 0;
|
|
|
}
|
|
|
result_sort() /**********************排序模块*********************************/
|
|
|
{
|
|
|
printf("冒泡排序\n");/****************两种选择************/
|
|
|
printf("选择排序方式:");
|
|
|
int k,i,j;
|
|
|
scanf("%d",&k);
|
|
|
if(k==1)
|
|
|
{
|
|
|
for(i=0;i<snum-1;i++) //冒泡排序
|
|
|
{
|
|
|
for(j=0;j<snum-1-i;j++)
|
|
|
{
|
|
|
if(st[j].sum<st[j+1].sum) //s为零时结构体变量;
|
|
|
{
|
|
|
s=st[j];
|
|
|
st[j]=st[j+1];
|
|
|
st[j+1]=s;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else{
|
|
|
for(i=1;i<snum;i++)
|
|
|
{
|
|
|
s = st[i]; //将要比较的值先绶存起来留出一个空位,方便移动
|
|
|
j = i - 1;
|
|
|
while(j>=0 && st[j].sum<s.sum) //比较直到出现比s.sum大的值,或向前找到头
|
|
|
{
|
|
|
st[j+1] = st[j]; //将前面的值往后移
|
|
|
j--;
|
|
|
}
|
|
|
st[j+1] = s; //插在st[j]的后面
|
|
|
}
|
|
|
}
|
|
|
for(i=0;i<snum;i++)
|
|
|
{
|
|
|
printf("\n---------------------------------------------|\n");
|
|
|
printf("| 编号:%04d | 姓名:%s | 平均分%.2f \n",st[i].id,st[i].name,st[i].sum);
|
|
|
}
|
|
|
getchar();
|
|
|
getchar();
|
|
|
}
|
|
|
|