数据结构课设----运动会分数统计系统

时间:2025-03-28 20:01:07
#include<> #include<> #include<> #define N 20 //学校最大数目 #define M 20 //男子项目最大数 #define W 20 //女子项目最大数 //存放项目信息的结构体 typedef struct { int inum;//项目编号 int top;//取名次的数目 int range[5];//名次 int mark[5];//分数 }itemnode; //存放学校信息的结构体 typedef struct { int snum;//学校编号 int score;//学校总分 int mscore;//男子总分 int wscore;//女子总分 itemnode t[M + W];//项目数组 }snode; snode a[N];//定义一个学校数组 //菜单函数 void menu(int n,int m,int w) {//n代表学校数,m代表男子数,w代表女子数 int c; void input(int n,int m,int w);//输入功能 void output(int n,int m,int w);//输入功能 void sortput(int n,int m,int w);//排序输出 void search(int n,int m,int w);//查询功能 printf("\t\t\t欢迎使用\t\t\t\t\t\n"); printf("华信运动会分数统计系统\n\n"); printf("1.信息输入\n"); printf("2.统计输出\n"); printf("3.排序输出\n"); printf("4.信息查询\n"); printf("5.退出系统\n\n"); printf("=======================================================\n\n"); printf("请输入您想要实现的功能(0--4):"); scanf("%d",&c); switch(c){ case 1: input(n,m,w); break; case 2: output(n,m,w); break; case 3: sortput(n,m,w); break; case 4: search(n,m,w); break; case 5: printf("感谢使用,祝您天天开心!!\n"); exit(0);//正常退出 default: printf("您输入有误,请重新输入!"); menu(n,m,w); } } //将信息写入文件中 void savetofile() { FILE *fp;//定义一个文件指针 int i; if(NULL == (fp = fopen("","w"))){ printf("打开文件失败!\n"); return; } for(i = 0;i < N;i ++){ if('\0' != a[i].snum) if(fwrite(&a[i],sizeof(snode),1,fp) != 1){ printf("存入信息失败!\n"); return; } } fclose(fp);//关闭文件 } //将信息从文件里取出 void readfromfile() { int i; FILE *fp; if((fp=fopen("","rb"))==NULL){ printf("文件打开失败!\n"); return; } for(i = 0;i < N;i ++){ fread(&a[i],sizeof(snode),1,fp); } fclose(fp); } //信息输入功能 void input(int n,int m,int w) { int i,j,s,k,q = 1; for(i = 0;i < n;i ++){ printf("请输入学校的编号:"); scanf("%d",&a[i].snum); for(j = 0;j < m + w;j ++){//总的项目的输入 printf("请输入项目编号:"); scanf("%d",&a[i].t[j].inum); printf("请输入该项目取前3还是前5(输入3或5):"); scanf("%d",&a[i].t[j].top); if(3 == a[i].t[j].top){ printf("获得的名次的个数(1--3):"); }else if(5 == a[i].t[j].top){ printf("获得的名次的个数(1--5):"); }else{ printf("输入有误!程序退出...."); return; } scanf("%d",&k);//输入获得名次的个数 for(s = 0;s < k;s ++){ if(3 == a[i].t[j].top){ printf("请输入获得的名次(1--3):"); }else{ printf("请输入获得的名次(1--5):"); } scanf("%d",&a[i].t[j].range[s]);//输入所获得的名次的信息 } printf("\n"); } } for(i = 0;i < n;i ++){ //初始化分数 a[i].score=0;//学校总分 a[i].mscore=0;//男子总分 a[i].wscore=0;//女子总分 } for(i = 0;i < n;i ++){ for(j = 0;j < m + w;j ++){ if(0 == i){ printf("项目%d取得是前3还是前5(输入3或5):",j + 1); scanf("%d",&a[i].t[j].top); } for(s = 0;s < 5;s ++){ if(3 == a[i].t[j].top){//如果是取前三 switch(a[i].t[j].range[s]){ case 0: a[i].t[j].mark[s] = 0 ; break; case 1: a[i].t[j].mark[s] = 5; break; case 2: a[i].t[j].mark[s] = 3; break; case 3: a[i].t[j].mark[s] = 2; break; } }else if(5 == a[i].t[j].top){ switch(a[i].t[j].range[s]){ case 0: a[i].t[j].mark[s] = 0; break; case 1: a[i].t[j].mark[s] = 7; break; case 2: a[i].t[j].mark[s] = 5; break; case 3: a[i].t[j].mark[s] = 3; break; case 4: a[i].t[j].mark[s] = 2; break; case 5: a[i].t[j].mark[s] = 1; break; } }else if(a[i].t[j].top != 3 || a[i].t[j].top != 5){ printf("信息输入错误!程序退出\n"); printf("\n"); exit(0); } a[i].score = a[i].score + a[i].t[j].mark[s];//学校总分 if(j < m){ a[i].mscore = a[i].mscore + a[i].t[j].mark[s]; }else{//女子总分 a[i].wscore = a[i].wscore + a[i].t[j].mark[s]; } } } } printf("输入完毕!(返回菜单请输入1):"); scanf("%d",&q); printf("\n"); if(q != 1){ printf("不能再添加信息了!"); } printf("\n"); savetofile();//保存文件 menu(n,m,w); } #if(1) void output(int n,int m,int w) /*2.统计输出*/ { readfromfile(); int i,j,s,q=0; for(i = 0;i < n;i++) /*显示结果*/ { printf("学校编号:%d 学校总分:%d 男子总分:%d 女子总分:%d\n",a[i].snum,a[i].score,a[i].mscore,a[i].wscore); for(j=0;j< m+w;j++) { printf("项目编号:%d 所取名次数量:%d\n",a[i].t[j].inum,a[i].t[j].top); for(s=0;s<5;s++) { if(a[i].t[j].range[s]!=0) printf("名次:%d 分数:%d\n",a[i].t[j].range[s],a[i].t[j].mark[s]); } } printf("\n"); } printf("\n"); printf("统计完毕!返回? 1是 2否"); /*返回菜单*/ scanf("%d",&q); printf("\n"); if(q!=1) printf("统计已经结束!"); printf("\n"); menu(n,m,w); } #endif //排序输出 void sortput(int n,int m,int w) { readfromfile(); int c,i,j,k,q = 0; int temp[N]; printf("\t**************排序输出系统**************\n\n"); printf("\t\t****1.按学校编号输出****\n"); printf("\t\t****2.按学校总分输出****\n"); printf("\t\t****3.按男子总分输出****\n"); printf("\t\t****4.按女子总分输出****\n"); printf("=======================================================\n\n"); do{ printf("请选择您想实现的功能的编号(1--4):"); scanf("%d",&c); switch(c){ case 1: for(i = 0;i < n;i ++){ temp[i] = i; } //用的是冒泡排序输出 for(i = 0;i < n;i ++){ for(j = i + 1;j < n;j ++){ if(a[temp[i]].snum > a[j].snum){ k = temp[i]; temp[i] = temp[j]; temp[j] = k; } } } for(i = 0;i < n;i ++){ printf("学校标号:%d 学校总分:%d 男子总分:%d 女子总分:%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore); } break; case 2: for(i = 0;i < n;i ++){ temp[i] = i; } for(i = 0;i < n;i ++){ for(j = i + 1;j < n;j ++){ if(a[temp[i]].score < a[j].score){ k = temp[i]; temp[i] = temp[j]; temp[j] = k; } } } for(i = 0;i < n;i ++){ printf("学校编号:%d 学校总分:%d 男子总分:%d 女子总分:%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore); } break; case 3: for(i = 0;i < n;i ++){ temp[i] = i; } for(i = 0;i < n;i ++){ for(j = i + 1;j < n;j ++){ if(a[temp[i]].mscore < a[j].mscore){ k = temp[i]; temp[i] = temp[j]; temp[j] = k; } } } for(i = 0;i < n;i ++){ printf("学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore); } break; case 4: for(i = 0;i < n;i ++){ temp[i] = i; } for(i = 0;i < n;i ++){ for(j = i + 1;j < n;j ++){ if(a[temp[i]].wscore<a[j].wscore){ k = temp[i]; temp[i] = temp[j]; temp[j] = k; } } } for(i = 0;i < n;i ++){ printf("学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore); } break; default: printf("您的输入有误!请从新输入..."); } printf("请选择 1.返回主菜单 0.继续"); scanf("%d",&q); printf("\n"); } //======================= while(0 == q); printf("\n"); //======================= if(q != 0){ menu(n,m,w); } } //查询功能 void search(int n,int m,int w) { readfromfile(); int c,i,j,k,d,l,q = 0; printf("\t****************查询系统****************\n\n"); printf("\t\t****1.按学校编号查询****\n"); printf("\t\t****2.按项目编号查询****\n"); printf("=======================================================\n\n"); do { k = -1;d = -1;l = -1; printf("请选择要实现功能的编号(1--2):"); scanf("%d",&c); switch(c){ case 1: printf("要查询的学校编号:"); /*查找学校编号下标*/ scanf("%d",&c); for(i = 0;i < n;i ++){ if(c == a[i].snum){ k=i; } } if(-1 == k){ printf("错误:这个学校没有参加此次运动会!\n"); }else{ printf("要查询的项目编号:"); /*查找项目编号下标*/ scanf("%d",&c); for(j = 0;j < m +w;j ++){ if(c == a[k].t[j].inum){ d = j; } } if(-1 == d){ printf("此次运动会没有这个项目\n"); } else{ printf("这个项目取前 %d名,该学校的成绩如下:\n", a[k].t[d].top); for(i = 0;i < 5;i ++){ if(a[k].t[d].range[i] != 0){ printf("名次:%d\n",a[k].t[d].range[i]); } } } } break; case 2: printf("要查询的项目编号:"); /*查找项目编号下标*/ scanf("%d",&c); for(i = 0;i < n;i ++){ for(j = 0;j < m + w;j ++){ if(c == a[i].t[j].inum){ l = j; } if(-1 == l){ printf("此次运动会没有该项目"); }else{ printf("该项目取前 %d名,取得名次的学校\n",a[0].t[l].top); for(i = 0;i < n;i ++){ for(j = 0;j < 5;j ++){ if(a[i].t[l].range[j]!=0){ printf("学校编号:%d,名次:%d\n",a[i].snum,a[i].t[l].range[j]); } } } } } } break; default: printf("输入错误,请重试!\n"); } printf("请选择:1.返回主菜单 0.继续"); scanf("%d",&q); printf("\n"); } while(0 == q); printf("\n"); if(q != 0){ menu(n,m,w); } } //主函数 int main() { int n,m,w;//n为学校个数,m为男子数,w为女子数 printf("\t\t\t欢迎使用\t\t\t\t\n\n"); printf("\t***********运动会分数统计系统***********\n\n"); printf("请先输入运动会主要信息\n"); printf("输入学校个数:"); scanf("%d",&n); printf("输入男子项目个数:"); scanf("%d",&m); printf("输入女子项目个数:"); scanf("%d",&w); menu(n,m,w); }