#include #include #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;xa[x].itmnum);//输入项目编号 scanf("%d",&p->a[x].itmkind);//输入项目类型 scanf("%s",p->a[x].itmname);//输入项目名称 scanf("%d",&p->a[x].l);//输入获奖名次数 for(i=0;ia[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;ia[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(ymscore=0;p->wscore=0; scanf("%d",&p->sclnum); scanf("%s",p->sclname); for(x=0;xa[x].itmnum); scanf("%d",&p->a[x].itmkind); scanf("%s",p->a[x].itmname); scanf("%d",&p->a[x].l); for(i=0;ia[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;ia[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;xa[x].itmkind); fprintf(fp,"%d\t\n",q->a[x].l); for(i=0;ia[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;xa[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;ia[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;xa[x].itmnum,&p->a[x].itmkind,&p->a[x].l); for(i=0;ia[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;ia[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(ymscore=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;ia[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;ia[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;xa[x].itmnum); printf("项目类型\n"); printf("%d\t\n",q->a[x].itmkind); printf("有%d个获奖名次:\t",q->a[x].l); for(i=0;ia[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;xa[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); } } }