|
|
#include<stdio.h>
|
|
|
#include<stdlib.h>
|
|
|
#define n 2 //参赛学校数
|
|
|
#define m 1 //男子竞赛项目数
|
|
|
#define w 1 //女子竞赛项目数
|
|
|
typedef struct sco
|
|
|
{
|
|
|
int mark[5];//分数
|
|
|
int itmnum;//项目编号
|
|
|
int itmkind;//项目类型
|
|
|
char itmname[20];//项目名称
|
|
|
char name[10];//运动员姓名
|
|
|
int l; //获奖名次数
|
|
|
int range[5];//排名
|
|
|
}sc;
|
|
|
typedef struct school
|
|
|
{
|
|
|
int sclnum;//学校编号
|
|
|
char sclname[20];//学校名称
|
|
|
sc a[m+w];
|
|
|
int mscore;//男子团体总分
|
|
|
int wscore;//女子团体总分
|
|
|
int sum;//学校项目总分
|
|
|
struct school *next;
|
|
|
}scl;
|
|
|
scl *p,*q,*head,*g,*s,*u;//全局指针变量
|
|
|
/****************************************************************************/
|
|
|
/******************************菜 单 函 数*********************************/
|
|
|
void menu()
|
|
|
{
|
|
|
system("cls");
|
|
|
printf("*********************** 运动会比赛计分系统 *********************\n");
|
|
|
printf("********************* *** 编制 ********************\n");
|
|
|
printf("** 1------------------->>键盘输入 **\n");
|
|
|
printf("** 2------------------->>文件读入 **\n");
|
|
|
printf("** 3--------------------->>输出 **\n");
|
|
|
printf("** 4--------------------->>查询 **\n");
|
|
|
printf("** 5--------------------->>退出 **\n");
|
|
|
printf("**男子前五名依次得分:7分 5分 3分 2分 1分 **\n");
|
|
|
printf("**女子前三名依次得分:5分 3分 2分 **\n");
|
|
|
printf("=======================================================\n");
|
|
|
}
|
|
|
/******************************************************************************/
|
|
|
/*******************************计 分 函 数*******************************/
|
|
|
void compute(int i,int x,int k)
|
|
|
{
|
|
|
if(k==3) //女子项目取前三名
|
|
|
{
|
|
|
switch(p->a[x].range[i])
|
|
|
{
|
|
|
case 0: p->a[x].mark[p->a[x].range[i]]=0;break;
|
|
|
case 1: p->a[x].mark[p->a[x].range[i]]=5;break;
|
|
|
case 2: p->a[x].mark[p->a[x].range[i]]=3;break;
|
|
|
case 3: p->a[x].mark[p->a[x].range[i]]=2;break;
|
|
|
default: puts("输入有误!");exit(0);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
switch(p->a[x].range[i]) //男子项目取前五名
|
|
|
{
|
|
|
case 0: p->a[x].mark[p->a[x].range[i]]=0;break;
|
|
|
case 1: p->a[x].mark[p->a[x].range[i]]=7;break;
|
|
|
case 2: p->a[x].mark[p->a[x].range[i]]=5;break;
|
|
|
case 3: p->a[x].mark[p->a[x].range[i]]=3;break;
|
|
|
case 4: p->a[x].mark[p->a[x].range[i]]=2;break;
|
|
|
case 5: p->a[x].mark[p->a[x].range[i]]=1;break;
|
|
|
default: puts("输入有误!");break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
/***********************输 入 函 数***********************/
|
|
|
scl *input() //创建链表输入函数
|
|
|
{
|
|
|
int i,x,y=1,k;
|
|
|
p=(scl*)malloc(sizeof(scl)); //头结点的初始化
|
|
|
printf("\n**按如下格式输入(相同学校编号不重复输入)**\n");
|
|
|
printf("**项目类型有:111---男子 222---女子 **\n");
|
|
|
printf("**学校编号>>\n**学校名称>>\n**项目编号>>项目类型>>项目名称>>获得名次数>>名次>>姓名>>\n");
|
|
|
p->mscore=0;p->wscore=0;
|
|
|
scanf("%d",&p->sclnum);//输入学校编号
|
|
|
scanf("%s",p->sclname);//输入学校名称
|
|
|
for(x=0;x<m+w;x++)
|
|
|
{
|
|
|
scanf("%d",&p->a[x].itmnum);//输入项目编号
|
|
|
scanf("%d",&p->a[x].itmkind);//输入项目类型
|
|
|
scanf("%s",p->a[x].itmname);//输入项目名称
|
|
|
scanf("%d",&p->a[x].l);//输入获奖名次数
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
{
|
|
|
scanf("%d",&p->a[x].range[i]);//输入运动员的名次
|
|
|
scanf("%s",p->a[x].name); //运动员姓名
|
|
|
}
|
|
|
if(p->a[x].itmkind==222) //计分方式判断
|
|
|
k=3;
|
|
|
else
|
|
|
k=5;
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
{
|
|
|
compute(i,x,k);
|
|
|
if(p->a[x].itmkind==222 ) //共两种项目: 111(男子项目) 222(女子项目)
|
|
|
p->wscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
else
|
|
|
p->mscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
}
|
|
|
}
|
|
|
p->sum=p->mscore+p->wscore; //求学校总成绩
|
|
|
head=p;
|
|
|
q=p;
|
|
|
/********************************************************************/
|
|
|
while(y<n) //创建新节点
|
|
|
{
|
|
|
y++; //计数:控制输入学校的个数
|
|
|
p=(scl*)malloc(sizeof(scl));
|
|
|
p->mscore=0;p->wscore=0;
|
|
|
scanf("%d",&p->sclnum);
|
|
|
scanf("%s",p->sclname);
|
|
|
for(x=0;x<m+w;x++)
|
|
|
{
|
|
|
scanf("%d",&p->a[x].itmnum);
|
|
|
scanf("%d",&p->a[x].itmkind);
|
|
|
scanf("%s",p->a[x].itmname);
|
|
|
scanf("%d",&p->a[x].l);
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
{
|
|
|
scanf("%d",&p->a[x].range[i]);
|
|
|
scanf("%s",p->a[x].name);
|
|
|
}
|
|
|
if(p->a[x].itmkind==222)
|
|
|
k=3;
|
|
|
else
|
|
|
k=5;
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
{
|
|
|
compute(i,x,k);
|
|
|
if(p->a[x].itmkind==222)
|
|
|
p->wscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
else
|
|
|
p->mscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
}
|
|
|
}
|
|
|
p->sum=p->mscore+p->wscore;
|
|
|
q->next=p;
|
|
|
q=p;
|
|
|
}
|
|
|
p->next=NULL;
|
|
|
menu();
|
|
|
return head;
|
|
|
}
|
|
|
/********************输 出 函 数********************/
|
|
|
void output(scl *head) //输出成绩
|
|
|
{
|
|
|
scl *q=head;
|
|
|
int i,x,y=1;
|
|
|
FILE *fp;
|
|
|
int co;
|
|
|
printf("****1---------不输出,存入文件\n");
|
|
|
printf("****2---------输出,不存入文件\n");
|
|
|
scanf("%d",&co);
|
|
|
switch(co)
|
|
|
{
|
|
|
case 1:
|
|
|
{
|
|
|
fp=fopen("d:\\abc.txt","w+");
|
|
|
if(fp==NULL)
|
|
|
{printf("无法打开文件!");exit(0);}
|
|
|
while(q!=NULL)
|
|
|
{
|
|
|
fprintf(fp,"%d\n",q->sclnum);
|
|
|
for(x=0;x<m+w;x++)
|
|
|
{
|
|
|
fprintf(fp,"%d\t\n",q->a[x].itmkind);
|
|
|
fprintf(fp,"%d\t\n",q->a[x].l);
|
|
|
for(i=0;i<q->a[x].l;i++)
|
|
|
fprintf(fp,"%d\t",q->a[x].range[i]);
|
|
|
fprintf(fp,"\n");
|
|
|
}
|
|
|
q=q->next;
|
|
|
}
|
|
|
fclose(fp);
|
|
|
}break;
|
|
|
case 2:
|
|
|
while(q!=NULL)
|
|
|
{
|
|
|
printf("===================================\n");
|
|
|
printf(" 学校编号:\t");
|
|
|
printf("%d\n",q->sclnum);
|
|
|
printf(" 学校名称:\t");
|
|
|
printf("%s\n",q->sclname);
|
|
|
for(x=0;x<m+w;x++)
|
|
|
{
|
|
|
printf(" 项目编号:\t");
|
|
|
printf("%d\n",q->a[x].itmnum);
|
|
|
printf(" 项目类型:\t");
|
|
|
printf("%d\n",q->a[x].itmkind);
|
|
|
printf(" 项目名称:\t");
|
|
|
printf("%s\n",q->a[x].itmname);
|
|
|
printf(" 有%d个获奖名次:\t",q->a[x].l);
|
|
|
for(i=0;i<q->a[x].l;i++)
|
|
|
{
|
|
|
printf("第%d名\t",q->a[x].range[i]);
|
|
|
}
|
|
|
printf("\n\n");
|
|
|
}
|
|
|
printf("男子团体项目总分:\t%d\n",q->mscore);
|
|
|
printf("女子团体项目总分:\t%d\n",q->wscore);
|
|
|
printf("学校项目总得分:\t%d\n\n",q->sum);
|
|
|
printf("\n");
|
|
|
q=q->next;
|
|
|
}
|
|
|
break;
|
|
|
default :
|
|
|
puts("输入有误!");
|
|
|
exit(0);
|
|
|
}
|
|
|
}
|
|
|
/********************文 件 读 入 函 数********************/
|
|
|
scl *read()
|
|
|
{
|
|
|
FILE *fpa=NULL;
|
|
|
int i,x,y=1,k;
|
|
|
p=(scl *)malloc(sizeof(scl));
|
|
|
p->mscore=0;p->wscore=0;
|
|
|
fpa=fopen("d:\\abc.txt","r+");//打开文件
|
|
|
if(fpa==NULL)
|
|
|
{puts("对不起,无法打开文件!");exit(0);}
|
|
|
fscanf(fpa,"%d",&p->sclnum);
|
|
|
for(x=0;x<m+w;x++)
|
|
|
{
|
|
|
printf("已读入%d个项目\n",x+1);
|
|
|
fscanf(fpa,"%d%d%d",&p->a[x].itmnum,&p->a[x].itmkind,&p->a[x].l);
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
fscanf(fpa,"%d",&p->a[x].range[i]);
|
|
|
if(p->a[x].itmkind==222)
|
|
|
k=3;
|
|
|
else
|
|
|
k=5;
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
{
|
|
|
compute(i,x,k);
|
|
|
if(p->a[x].itmkind==222)
|
|
|
p->wscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
else
|
|
|
p->mscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
}
|
|
|
}
|
|
|
p->sum=p->mscore+p->wscore;
|
|
|
head=p;
|
|
|
q=p;
|
|
|
while(y<n)//控制输入学校个数
|
|
|
{
|
|
|
y++;
|
|
|
p=(scl *)malloc(sizeof(scl));
|
|
|
p->mscore=0;
|
|
|
p->wscore=0;
|
|
|
fscanf(fpa,"%d",&p->sclnum);
|
|
|
for(x=0;x<(m+w);x++)
|
|
|
{
|
|
|
printf("已读入%d个项目\n",x+1);
|
|
|
fscanf(fpa,"%d%d",&p->a[x].itmnum,&p->a[x].itmkind);
|
|
|
fscanf(fpa,"%d",&p->a[x].l);
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
fscanf(fpa,"%d",&p->a[x].range[i]);
|
|
|
if(p->a[x].itmkind==222)
|
|
|
k=3;
|
|
|
else
|
|
|
k=5;
|
|
|
for(i=0;i<p->a[x].l;i++)
|
|
|
{
|
|
|
compute(i,x,k);
|
|
|
if(p->a[x].itmkind==222)
|
|
|
p->wscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
else
|
|
|
p->mscore+=p->a[x].mark[p->a[x].range[i]];
|
|
|
}
|
|
|
}
|
|
|
p->sum=p->wscore+p->mscore;
|
|
|
q->next=p;
|
|
|
q=p;
|
|
|
}
|
|
|
p->next=NULL;
|
|
|
fclose(fpa);//关闭文件
|
|
|
return head;
|
|
|
}
|
|
|
/**************查 找 函 数***************/
|
|
|
void find(scl *head)
|
|
|
{
|
|
|
scl *q=head;
|
|
|
int num,x,i,cha,xiang,flag=0;
|
|
|
printf("按学校查找请输入1,按项目查找请输入2\n");
|
|
|
scanf("%d",&cha);
|
|
|
if(cha==1)
|
|
|
{
|
|
|
printf("请输入你要查询的学校编号:");
|
|
|
scanf("%d",&num);
|
|
|
while(q!=NULL)
|
|
|
{
|
|
|
if(num==q->sclnum)
|
|
|
{
|
|
|
printf("===================================\n");
|
|
|
printf("学校编号\n");
|
|
|
printf("%d\n",q->sclnum);
|
|
|
for(x=0;x<m+w;x++)
|
|
|
{
|
|
|
printf("项目编号\n");
|
|
|
printf("%d\t\n",q->a[x].itmnum);
|
|
|
printf("项目类型\n");
|
|
|
printf("%d\t\n",q->a[x].itmkind);
|
|
|
printf("有%d个获奖名次:\t",q->a[x].l);
|
|
|
for(i=0;i<q->a[x].l;i++)
|
|
|
{
|
|
|
printf("第%d名\t",q->a[x].range[i]);
|
|
|
}
|
|
|
printf("\n\n");
|
|
|
}
|
|
|
printf("男子团体项目总分:%d\n",q->mscore);
|
|
|
printf("女子团体项目总分:%d\n",q->wscore);
|
|
|
printf("学校项目总得分:%d\n\n",q->sum);
|
|
|
printf("\n");
|
|
|
flag=1;
|
|
|
printf("\n");
|
|
|
}
|
|
|
q=q->next;
|
|
|
}
|
|
|
if(flag==0)
|
|
|
puts("对不起!没有您要查询的对象");
|
|
|
}
|
|
|
else if(cha==2)
|
|
|
{
|
|
|
printf("请输入你要查询的项目编号:");
|
|
|
scanf("%d",&xiang);
|
|
|
while(q!=NULL)
|
|
|
{
|
|
|
for(x=0;x<m+w;x++)
|
|
|
{
|
|
|
if(xiang==q->a[x].itmnum&&q->a[x].itmkind==111)
|
|
|
{
|
|
|
printf("获得前5名的学校为:\n");
|
|
|
for(i=0;i<5;i++)
|
|
|
printf("学校编号和名称分别为:%d,%s\n",q->sclnum,q->sclname);
|
|
|
flag=1;
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
if(xiang==q->a[x].itmnum&&q->a[x].itmkind==222)
|
|
|
{
|
|
|
printf("获得前3名的学校为:\n");
|
|
|
for(i=0;i<3;i++)
|
|
|
printf("学校编号和名称分别为:%d,%s\n",q->sclnum,q->sclname);
|
|
|
flag=1;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
q=q->next;
|
|
|
}
|
|
|
if(flag==0)
|
|
|
puts("对不起!没有您要查询的对象");
|
|
|
}
|
|
|
}
|
|
|
/**********************主 函 数*************************/
|
|
|
void main() //主函数1
|
|
|
{
|
|
|
int ch;
|
|
|
menu();
|
|
|
while(1)
|
|
|
{
|
|
|
printf(">>>>>>>>>请选择\t");
|
|
|
scanf("%d",&ch);
|
|
|
switch(ch)
|
|
|
{
|
|
|
case 1: menu();g=input(); break;
|
|
|
case 2: menu();g=read(); break;
|
|
|
case 3: menu();output(g); break;
|
|
|
case 4: menu();find(g); break;
|
|
|
case 5: menu();puts("*********************谢谢您的使用!");exit(0);
|
|
|
default: menu();puts("对不起!输入有误");exit(0);
|
|
|
}
|
|
|
}
|
|
|
} |