运动会分数统计 C语言 动态创建 链表

        有n个学校参加运动会,学校名对应的编号为1……n。比赛分成m个男子项目,和w个女子项目。每个项目取前三名积分,前三名的积分分别为:5、3、2;数据可以存储在一个数据文件中,数据结构、具体数据自定。

具体功能有:

(1)从键盘输入学校、项目、项目得分信息;

(2)能统计各学校总分;

(3)能统计各个项目的前三名;

(4)可以按学校编号或名称、学校总分、男女团体总分排序输出;

(5)可以按学校编号查询学校某个项目的情况;

(6)可以按项目编号查询取得前三名的学校。

(7)数据存入文件并能随时查询。

 zb大学 2018到2019年数据结构课设 17级 lzx 留,过去的祖传代码已经不适合当前需求了,学长在此留下代码,供后面的做些许参考,不希望写完的代码仅仅放在磁盘里。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define N 20   //男子,女子项目的最大个数 
int n;  //学校的个数 
int m;  //男子项目的个数 
int w;   //女子项目的个数
FILE *fp;

typedef struct {
	int num;
	int score;
	int rank;    
}Woman;

typedef struct {
	int num;
	int score;
	int rank;     
}Man;

typedef struct Item {
	int num;  //学校编号
	char schoolName[N];   //学校名字
	int score;           //该学校所有成绩的综合 
	int Mscore;          //男子所有项目的成绩和
	int Wscore;           //女子所有项目的成绩和
	Man manItem[N];
	Woman womanItem[N];	
	struct Item *next;  
}Item,*ItemNode;

//链表的创建
void ListCreat(ItemNode &I){     
     ItemNode p,q,temp;
     printf("请问此次有多少学校参加运动会?\n");
     scanf("%d",&n); 
     printf("请问此次活动有多少男子项目?\n");
     scanf("%d",&m);
     printf("请问此次活动有多少女子项目?\n");
     scanf("%d",&w);
     p=I;
     if((fp=fopen("sports.txt","w"))==NULL){
     	printf("文件打开失败\n");
     	getchar();
     	exit(1);
	 } else {
	 	for(int i=1;i<=n;i++){
     	q = (ItemNode)malloc(sizeof(Item));
     	printf("第%d所学校的名字为:",i);
     	scanf("%s",q->schoolName);
     	fprintf(fp,"第%d所学校的名字为:",i);
     	fprintf(fp,"%s\n",q->schoolName);
     	
     	printf("第%d所学校的编号为:",i);
     	scanf("%d",&q->num);
     	fprintf(fp,"第%d所学校的编号为:",i);
     	fprintf(fp,"%d\n",q->num);
     	fprintf(fp,"第%d所学校男子信息录入\n",i);
        //男子项目信息的录入 
        for(int j=1;j<=m;j++){
     		printf("第%d所学校的第%d个男子项目的编号是:\n",i,j);
     		scanf("%d",&q->manItem[j].num);
     		printf("该学校该项目获得第几名?\n");
			scanf("%d",&q->manItem[j].rank);
			fprintf(fp,"编号:%d\t",j);
			fprintf(fp,"名次:%d\n",q->manItem[j].rank); 
		 }
		 
		 fprintf(fp,"第%d所学校女子信息录入\n",i);
		 //女子项目信息的录入 
		 for(int k=1;k<=w;k++){
     		printf("第%d所学校的第%d个女子项目的编号是:\n",i,k);
     		scanf("%d",&q->womanItem[k].num);	
     		printf("该学校该项目获得第几名?\n");
			scanf("%d",&q->womanItem[k].rank); 
			fprintf(fp,"编号:%d\t",k);
			fprintf(fp,"名次:%d\n",q->womanItem[k].rank); 			 	
		 } 
		 p->next = q;
		 p = q;
		 printf("\n******************************************\n\n");
		 fprintf(fp,"\n");
	 }
	 q->next = NULL;
	 fclose(fp);   
	 	
	 }
     
}
//对于得分情况的计算
void calculate(ItemNode &I){
	ItemNode p;
	int i,j,k;
	int Wresult=0;
	int Mresult=0;
    p=I;
    //对获得名次的项目赋值
    for(i=1;i<=n;i++){	
   		p=p->next;	 
   		//给男子项目计算分数 
   		for(j=1;j<=m;j++){
   			switch(p->manItem[j].rank){
   				case 1:p->manItem[j].score = 5; continue;
   				case 2:p->manItem[j].score = 3; continue;
   				case 3:p->manItem[j].score = 2; continue;
   				default :p->manItem[j].score = 0;continue;
			   }
		  
		}
		//给女子项目计算分数 
		for(k=1;k<=w;k++){
   			switch(p->womanItem[k].rank){
   				case 1:p->womanItem[k].score = 5; continue;
   				case 2:p->womanItem[k].score = 3; continue;
   				case 3:p->womanItem[k].score = 2; continue;
   				default :p->womanItem[k].score = 0;continue;
			   }
			   		  		
		}
			
//		for(j=1;j<=m;j++){
//			p->Mscore += p->manItem[j].score; 
//		}
		
	    printf("学校编号:%d\t",p->num);
	    printf("学校名字:%s\n",p->schoolName);
	    for (j=1;j<=m;j++){
	    	printf("男子等级:%d\t",p->manItem[j].rank);
	    	printf("男子分数:%d\n",p->manItem[j].score);
	    	Mresult += p->manItem[j].score;
		}
		p->Mscore = Mresult;
		for(k=1;k<=w;k++){
			printf("女子等级:%d\t",p->womanItem[k].rank);
	    	printf("女子分数:%d\n",p->womanItem[k].score);
			Wresult += p->womanItem[k].score;
		}
		p->Wscore = Wresult;
		
		p->score = p->Mscore + p->Wscore;
		printf("男子分数是:%d\t",p->Mscore); 
		printf("女子分数是:%d\t",p->Wscore);
		printf("分数和:%d\n\n",p->score);
		printf("\n-----------------------------------------------------------------------\n");
		printf("\n");
		Mresult = 0;
		Wresult = 0;
	
	} 
	
} 
//创建头指针 
ItemNode creat_head(){   

	ItemNode p; 
	p = (ItemNode)malloc(sizeof(Item));
	p->next = NULL;
	return(p);
} 

//给学校的总分排名
void school_rank(ItemNode &I){
	ItemNode p;
	ItemNode school_rank[n];
	p=I;
    for(int i=1;i<=n;i++){
    	p=p->next;
    	school_rank[i] = p;
	}
	

	for (int i=1;i<=n;i++){
		for(int j=1;j<=n-i;j++){
			if(school_rank[j]->score<school_rank[j+1]->score){
				ItemNode temp = school_rank[j];
				school_rank[j] = school_rank[j+1];
				school_rank[j+1] = temp;
			}
		}
	}
	printf("\t\t【运动会学校排名】\n\n");
	printf("\t学校编号\t名称学校\t学校总分数\n");

	for(int i=1;i<=n;i++){
		printf("\t%d\t\t%s\t\t%d\n",school_rank[i]->num,school_rank[i]->schoolName,school_rank[i]->score);		
	}
	printf("\n**********************************************************************\n");		

} 

//给男子团体排序
void m_rank(ItemNode &I){
	ItemNode p;
	ItemNode m_rank[n];
	p=I;
	for (int i=1;i<=n;i++){
		p=p->next;
		m_rank[i]  = p;		
	}
	
	//给男子团体排序
	for(int i=1;i<=n;i++){
		for (int j=1;j<=n-i;j++){
			if(m_rank[j]->Mscore < m_rank[j+1]->Mscore){
				ItemNode temp = m_rank[j];
				m_rank[j] = m_rank[j+1];
				m_rank[j+1] = temp;		
			}			
		}
	}
	
	//输出男子团体成绩的排名
	printf("\t\t\t【运动会男子团体排名】\n\n"); 
	printf("学校编号\t\t学校名称\t\t学校男子团体的成绩\n");
	for(int i=1;i<=n;i++){
		printf("%d\t\t\t%s\t\t\t%d\n",m_rank[i]->num,m_rank[i]->schoolName,m_rank[i]->Mscore);
	} 
printf("\n**********************************************************************\n");		
}
//给女子团体排序 
void w_rank(ItemNode &I){
	ItemNode p;
	ItemNode w_rank[n];
	p=I;
	for (int i=1;i<=n;i++){
		p=p->next;
		w_rank[i]  = p;		
	}	
	//给女子团体排序
	for(int i=1;i<=n;i++){
		for (int j=1;j<=n-i;j++){
			if(w_rank[j]->Wscore<w_rank[j+1]->Wscore){
				ItemNode temp = w_rank[j];
				w_rank[j] = w_rank[j+1];
				w_rank[j+1] = temp;		
			}
			
		}
	}
	
	//输出女子团体成绩的排名
	printf("\t\t\t【运动会女子团体排名】\n\n");
	printf("学校编号\t\t学校名称\t\t学校女子团体的成绩\n");
	for(int i=1;i<=n;i++){
		printf("%d\t\t\t%s\t\t\t%d\n",w_rank[i]->num,w_rank[i]->schoolName,w_rank[i]->Wscore);
	}
	printf("\n-----------------------------------------------------------------------\n");	 	
	
}
//按照学校编号查询某个项目的具体情况
void quety_item(ItemNode &I){
	system("cls");
	printf("\n\n\n");
	printf("\t\t\t【查询项目详情】\n\n");
	printf("\t\t\t[1]查询全部项目\n");
	printf("\t\t\t[2]查询单个项目\n");
	printf("\t\t\t[0]返回上一单元\n");
	printf("\t\t\t您要进行的操作1/2/0.....\n");
	ItemNode p;
	p=I;
	int q1;
	scanf("%d",&q1);
	system("cls");
	if(q1==0){
		printf("点击任意键返回!!!\n");
		return;
	}
	if(q1==1){
		int q2;
		int flag = 1;
		printf("您要查询的学校的编号?\n");
		scanf("%d",&q2); 
		printf("\n********************************************************************\n");
		for(int i=1;i<=n;i++){
			p=p->next;
			if(p->num==q2)
			{
				flag = 0;
				printf("该学校男子项目\n");
				for (int j=1;j<=m;j++){
					printf("男子项目[%d]排名%d\t",j,p->manItem[j].rank);
					printf("男子项目[%d]得分%d\n",j,p->manItem[j].score);
				}
				printf("男子项目 总得分是%d\n\n",p->Mscore);
				
				printf("该学校女子项目\n");
				for (int k=1;k<=w;k++){
					printf("女子项目[%d]排名%d\t",k,p->womanItem[k].rank);
					printf("女子项目[%d]得分%d\n",k,p->womanItem[k].score);
				}
				printf("女子项目 总得分是%d\n\n",p->Wscore);
			} 
		}
		if(flag){
			printf("查无此校。请输入正确在查询\n");		
		}		
	} else if(q1==2){
		int q2;
		int q3;
		int q4;
		int isNum = 0; 
		printf("请输入您要查询的学校的编号\n");
		scanf("%d",&q2);
		//查询是否拥有该学校
		for(int i=1;i<=n;i++){
			p=p->next;
			if(p->num==q2){
				isNum = 1;
			}
		}
		
		if(isNum){
			p=I;
			printf("\n*****************************************************************************\n\n");
			printf("[1]男子项目\n");
			printf("[2]女子项目\n");
			printf("[0]返回上一单元\n");
			printf("您要进行的操作1/2.....\n");
			scanf("%d",&q3);
			if(q3==0){
				printf("点击任意键,返回上一单元\n");
				return;
			}
			if(q3<0||q3>2){
				printf("请输入正确操作!!1\n");
				printf("顶级任意键返回\n");
				return;
			}
			printf("您要查询的项目的编号是?\n");
			scanf("%d",&q4);
			if(q3==1){
				int flag =1;
				for (int i=1;i<=m;i++){
					flag = 0;
					p=p->next;
					if(q4==p->manItem[i].num){
						printf("该学校男子项目[%d]\n等级是%d\t",q4,p->manItem[i].rank);
						printf("得分%d",p->manItem[i].score);
					}
				}
				if(flag){
					printf("该学校并没有参加该项运动");
				}			
			} 
			else if(q3==2){
				int flag = 1;
				for (int i=1;i<=w;i++){
					p=p->next;
					if(q4==p->womanItem[i].num){
						flag = 0;
						printf("该学校女子项目[%d]\n等级是%d\t",q4,p->womanItem[i].rank);
						printf("得分%d\n",p->womanItem[i].score); 
					}		
		 		}
				if(flag){
					printf("该学校并没有参加该项运动");
				}	 
			}else {
				printf("请输入正确的操作\n");
		  	}							
		} else {
			printf("查无此校!!!\n");
		}	
    	} else {
	   		printf("请输入正确的操作\n");
    	}	
}

//按照编号查询前三名的学校
void quety_num(ItemNode &I){
	ItemNode p;
	p=I;
	int q1;
	int q2;
	int flag = 0;
	ItemNode quety_num[n];
	system("cls");
	printf("\n\n\n");
	printf("\t\t\t【查询女子/男子男子项目】\n\n"); 
	printf("\t\t\t[1]男子项目\n");
	printf("\t\t\t[2]女子项目\n");
	printf("\t\t\t[0]返回上一单元\n");
	printf("\t\t\t您要进行的操作1/2/0.....\n");
	scanf("%d",&q1);
	if(q1==0){
		printf("\t\t\t按任意键返回上一单元\n");
		return;
	}
	if(q1<0||q1>2){
		printf("输入错误!!!\n");
		printf("按任意键返回\n");
		return;
	}
	printf("您想要查询的项目?\n");
	scanf("%d",&q2);
	if(q1==1){
		for (int i=1;i<=n;i++){
			p=p->next;
			for(int j=1;j<=m;j++){
				if(p->manItem[j].num == q2){
					quety_num[i] = p;
					flag = j;
				}					 	 
			}		
		}
		//对输出的前三进行排序 
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n-i;j++){
				if(quety_num[j]->manItem[flag].score<quety_num[j+1]->manItem[flag].score){
					ItemNode temp = quety_num[j];
					quety_num[j] = quety_num[j+1];
					quety_num[j+1] = temp;				
				}
			}
		}
		if(flag){
			printf("学校编号\t\t学校名字\t\t项目编号\t\t项目名次\t\t项目分数\n");
			if(n<3){
				for(int i=1;i<=n;i++){
				printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->manItem[flag].num,quety_num[i]->manItem[flag].rank,quety_num[i]->manItem[flag].score);
				} 
				printf("\n-----------------------------------------------------------------------------------------------------------\n");		
			} else {
				for(int i=1;i<=3;i++){
					printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->manItem[flag].num,quety_num[i]->manItem[flag].rank,quety_num[i]->manItem[flag].score);
					} 
				printf("\n------------------------------------------------------------------------------------------------------------\n");
			}
			
		} else {
			printf("对不起,查无此项目!!!\n");
		}
		
		
	}else if(q1==2){
		for(int i=1;i<=n;i++){
			p=p->next;
			for(int j=1;j<=m;j++){
				if(p->womanItem[j].num == q2){
					quety_num[i] = p;
					flag = j;
				}					 	 
			}		
		}
		//对输出的前三个项目排序 
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n-i;j++){
				if(quety_num[j]->womanItem[flag].score<quety_num[j+1]->womanItem[flag].score){
					ItemNode temp = quety_num[j];
					quety_num[j] = quety_num[j+1];
					quety_num[j+1] = temp;				
				}
			}
		}
		if(flag){
			printf("学校编号\t\t学校名字\t\t项目编号\t\t项目名次\t\t项目分数\n");
			if(n<3){
				for(int i=1;i<=n;i++){
					printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->womanItem[flag].num,quety_num[i]->womanItem[flag].rank,quety_num[i]->womanItem[flag].score);
				} 
				printf("\n-----------------------------------------------------------------------\n");		
			} else {
				for(int i=1;i<=3;i++){
					printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->womanItem[flag].num,quety_num[i]->womanItem[flag].rank,quety_num[i]->womanItem[flag].score);
				} 
				printf("\n-----------------------------------------------------------------------\n");
			}		
			
		} else {
			printf("对不起,查无此项目!!!\n");
		}
		
	} else{
		printf("请选着正确的操作\n");
		
	}
	
	
}

void menu_quety(){
	//system("color 30");
	printf("\n\n\n");
	printf("\t\t\t\t【运动会查询】\n");
	printf("\n");
	printf("\t\t\t[1]查询项目详情\n");
	printf("\t\t\t[2]查询前三学校\n");
	printf("\t\t\t[3退出\n");
	
}
void menu_rank(){
//	system("color 30");
	printf("\n\n\n");
	printf("\t\t\t\t【运动会排名】\n");
	printf("\n");
	printf("\t\t\t[1]学校排名\n");
	printf("\t\t\t[2]男子团体排名\n");
	printf("\t\t\t[3]女子团体排名\n");
	printf("\t\t\t[4]退出\n");
	printf("\t\t\t请选择你要进行的操作1/2/3/4.....\n"); 	
}
void menu(){
	//system("color 30");
	printf("\n\n\n");
	printf("\t\t\t\t欢迎使用运动会分数统计系统\n");
	printf("\n");
	printf("\t\t\t[1]运动会信息录入\n");
	printf("\t\t\t[2]运动会排名\n");
	printf("\t\t\t[3]参赛学校信息查询\n");
	printf("\t\t\t[4]退出\n");
	printf("\t\t\t请选择你要进行的操作1/2/3/4.....\n"); 
}
int main(){	
	ItemNode I;
	menu();
	int handle;
	scanf("%d",&handle);
	while(handle!=4){
		switch(handle){
			case 1:
				I = creat_head();   //创建头指针 
				ListCreat(I);     //创建链表
				calculate(I);      //对于最后分数的计算
				system("pause");
				system("cls");
				menu();
				//printf("\n\t\t\t信息录入成功\n");
				break;
			case 2:
				int rank;
				system("cls"); 
				menu_rank();
				scanf("%d",&rank);
				while(rank!=4){
					system("cls");
					switch(rank){
						case 1:
							//学校排名
							school_rank(I);
							getchar();
							getchar();
							system("pause");
							system("cls");
							menu_rank();
							break;
						case 2:
							//给男子团体排序
							m_rank(I);
							getchar();
							getchar();
							system("pause");
							system("cls");
							menu_rank();
							break;
						case 3:
							//给女子团体排序  
							w_rank(I);
							getchar();
							getchar();
							system("pause");
							system("cls");
							menu_rank();
							break;																																																									
					}
					scanf("%d",&rank);					
				}
				system("cls");
				menu();
				break;
			case 3:
				int quety;
				system("cls");
				menu_quety();
				scanf("%d",&quety);
				while(quety!=3){
					switch(quety){
						case 1:
							//按照学校编号查询某个项目的具体情况
							quety_item(I);
							getchar();
							getchar();
							system("pause");
							system("cls");
							menu_quety();
							break;			
						case 2:	
						 //按照编号查询前三名的学校
							quety_num(I);
							getchar();
							getchar();
							system("pause");
							system("cls");
							menu_quety();
							break;							
					}
					scanf("%d",&quety);
				}
				system("cls");				
				menu();
				break;
			default:
				system("cls");
				menu();
				printf("\n\t\t\t请输入正确操作!!!\n");
				break; 								
		}
		scanf("%d",&handle);
	}

	return 0;
	
}                                        
	
	
	
							   

猜你喜欢

转载自blog.csdn.net/qq_43238599/article/details/86476999