You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

291 lines
6.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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();
}