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.

379 lines
9.3 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>
#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);
}
}
}