C语言实现数据结构之运动会分数统计

任务

参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(n<=20 , m<=20)

分析

构造一个二维数组,一列用来存放项目编号、一行放学校编号、m0行放男子各项目成绩、w0行放女子各项目成绩,一行放男子各项目总成绩、一行放女子各项目总成绩、一行放学校各项目总成绩、一列放学校按总分排序的名次。排序时采用直接插入排序。

存储结构设计
typedef struct itemnode {
	int item[m0+w0+5][n0+1];
//item[1][0]-item[m0+w0][0]  存放项目编号
//item[0][1]-item[0][n]  存放学校编号
//item[1][]-item[m0][]  存放男子各项目成绩
//item[m0+1][]-item[m0+w0][]存放女子各项目成绩
//item[m0+w0+1][]存放男子各项目总成绩
//item[m0+w0+2][]存放女子各项目总成绩
//item[m0+w0+3][]存放学校各项目总成绩
//item[m0+w0+4][]存放学校按总分排序的名次
} itemnode;            /*存放信息*/

struct itemnode a;
int n,m,w;
源代码
#include <stdio.h>
#include <stdlib.h>
#define n0 20          /*学校最大数目*/
#define m0 20          /*男子项目最大数目*/
#define w0 20          /*女子项目最大数目*/
typedef struct itemnode {
	int item[m0+w0+5][n0+1];
//item[1][0]-item[m0+w0][0]  存放项目编号
//item[0][1]-item[0][n]  存放学校编号
//item[1][]-item[m0][]  存放男子各项目成绩
//item[m0+1][]-item[m0+w0][]存放女子各项目成绩
//item[m0+w0+1][]存放男子各项目总成绩
//item[m0+w0+2][]存放女子各项目总成绩
//item[m0+w0+3][]存放学校各项目总成绩
//item[m0+w0+4][]存放学校按总分排序的名次
} itemnode;            /*存放信息*/

struct itemnode a;
int n,m,w;

void statistic(){
	printf("请输入运动会主要信息\n");                 /*设计运动会主要数据个数*/
	printf("输入学校个数:");
	scanf("%d",&n);
	printf("输入男子项目个数:");
	scanf("%d",&m);
	printf("输入女子项目个数:");
	scanf("%d",&w);
	printf("\n");
	int c;
	int i,j;
	
	for(i=1; i<n+1; i++) {
		printf("请输入第%d个学校编号:",i);
		scanf("%d",&a.item[0][i]);
	}
	printf("\n");
	for(j=1; j<m+1; j++) {
		printf("请输入第%d个男子项目编号:",j);
		scanf("%d",&a.item[j][0]);
	}
	printf("\n");
	for(j=m+1; j<m+w+1; j++) {
		printf("请输入第%d个女子项目编号:",j-m);
		scanf("%d",&a.item[j][0]);
	}
	printf("\n");
	for(i=1; i<n+1; i++) {
		for(j=1; j<m+1; j++) {
			printf("请输入第%d个学校第%d个男子项目成绩:",i,j);
			scanf("%d",&a.item[j][i]);
		}
		printf("\n");
		for(j=m+1; j<m+w+1; j++) {
			printf("请输入第%d个学校第%d个女子项目成绩:",i,j-m);
			scanf("%d",&a.item[j][i]);
		}
		printf("\n");
	}


	for(i=1; i<n+1; i++) {
		a.item[m+w+1][i]=0;
		a.item[m+w+2][i]=0;
		a.item[m+w+3][i]=0;
		a.item[m+w+4][i]=0;
	}
	//下面计算各学校、各学校男子、女子项目总分
	for(i=1; i<n+1; i++) {
		for(j=1; j<m+w+1; j++) {
			a.item[m+w+3][i]+=a.item[j][i];//学校项目总分
		}
	}
	for(i=1; i<n+1; i++) {
		for(j=1; j<m+1; j++) {
			a.item[m+w+1][i]+=a.item[j][i];//男子项目总分
		}
	}
	for(i=1; i<n+1; i++) {
		for(j=m+1; j<m+w+1; j++) {
			a.item[m+w+2][i]+=a.item[j][i];//女子项目总分
		}
	}
}

void sort(){		//按学校总分排序
	int i,j;
	int temp,temp1;
	int xu;
	for(i=2; i<n+1; i++) {
		temp=a.item[m+w+3][i];
		for(j=i-1; j>=1&&temp>a.item[m+w+3][j]; j--) { //寻找插入位置
			a.item[m+w+3][j+1]=a.item[m+w+3][j];//交换总分列
			for(xu=0; xu<m+w+4; xu++) {
				if(xu!=m+w+3) { //除了总分那一列不交换 其他的都交换  因为总分的那一列在上面交换
					temp1=a.item[xu][j+1];
					a.item[xu][j+1]=a.item[xu][j];
					a.item[xu][j]=temp1;
				}
			}
		}
		a.item[m+w+3][j+1]=temp;//小于当前值的,插到当前值后面
	}
	//赋值名次
	for(i=1; i<n+1; i++) {
		a.item[m+w+4][i]=i;
	}
	//按列输出
	for(i=0; i<n+1; i++) {
		for(j=0; j<w+m+5; j++) {
			if(i==0) {
				if(j==0) {
					printf("\t");
				} else if(j>=1&&j<m+1) {
					printf("男子项目%d\t",a.item[j][i]);
				} else if(j>=m+1&&j<m+w+1) {
					printf("女子项目%d\t",a.item[j][i]);
				} else if(j==m+w+1) {
					printf("男子项目总成绩\t");
				} else if(j==m+w+2) {
					printf("女子项目总成绩\t");
				} else if(j==m+w+3) {
					printf("学校总成绩\t");
				} else if(j==m+w+4) {
					printf(" 名次\t");
				}
			} else if(j==0) {
				if(i!=0) {
					printf("学校%d\t",a.item[j][i]);
				}
			} else {
				printf("  %d\t\t",a.item[j][i]);
			}


		}
		printf("\n");
	}
}

void printTitle(){
	int i, j;
	for(i=0; i<n+1; i++) {
				for(j=0; j<w+m+5; j++) {
					if(i==0) {
						if(j==0) {
							printf("\t");
						} else if(j>=1&&j<m+1) {
							printf("男子项目%d\t",a.item[j][i]);
						} else if(j>=m+1&&j<m+w+1) {
							printf("女子项目%d\t",a.item[j][i]);
						} else if(j==m+w+1) {
							printf("男子项目总成绩\t");
						} else if(j==m+w+2) {
							printf("女子项目总成绩\t");
						} else if(j==m+w+3) {
							printf("学校总成绩\t");
						} else if(j==m+w+4) {
							printf(" 名次\t");
						}
					} else if(j==0) {
						if(i!=0) {
							printf("学校%d\t",a.item[j][i]);
						}
					} else {
						printf("  %d\t\t",a.item[j][i]);
					}
				}
				printf("\n");
			}
}

	printf("------------------------------------------------\n");
	printf("                 运动会信息系统\n");
	printf("------------------------------------------------\n");
	printf(" 1.输入各个项目的前三名或前五名的成绩;\n");
	printf(" 2.统计各学校总分;\n");
	printf(" 3.按学校编号、学校总分、男女团体总分排序输出;\n");
	printf(" 4.按学校编号查询学校某个项目的情况\n");
	printf(" 5.按学校编号查询取得前三或者前五名的学校。\n");
	printf("------------------------------------------------\n");
	
	int i,j;
	int temp,temp1;
	int xu;
	statistic();
	
	printf("--------------------排序模块--------------------\n");
	sort();
	
	int s;
	printf("-------------------------\n");
	printf("| 1.按学校总分排序输出  |\n");
	printf("-------------------------\n");
	printf("| 2.按学校编号输出      |\n");
	printf("-------------------------\n");
	printf("| 3.按男团总分排序输出  |\n");
	printf("-------------------------\n");
	printf("| 4.按女团总分排序输出  |\n");
	printf("-------------------------\n");
	printf("\n\n");
	printf("请选择要实现输出功能的编号(1——4):");
	scanf("%d",&s);
	switch(s) {
		case 1:	printTitle();
				break;
		case 2: {
			//学校编号排序
			for(i=2; i<n+1; i++) {
				temp=a.item[0][i];
				for(j=i-1; j>=1&&temp<a.item[0][j]; j--) { //寻找插入位置
					a.item[0][j+1]=a.item[0][j];//交换学校列
					for(xu=0; xu<m+w+5; xu++) {
						if(xu!=0) { //除了学校那一列不交换 其他的都交换  因为学校的那一列在上面交换
							temp1=a.item[xu][j+1];
							a.item[xu][j+1]=a.item[xu][j];
							a.item[xu][j]=temp1;
						}
					}
				}
				a.item[0][j+1]=temp;//小于当前值的,插到当前值后面
			}
			printTitle();
		};
			break;
		case 3: {
			for(i=2; i<n+1; i++) {
				temp=a.item[m+w+1][i];
				for(j=i-1; j>=1&&temp>a.item[m+w+1][j]; j--) { //寻找插入位置
					a.item[m+w+1][j+1]=a.item[m+w+1][j];//交换男子总分列
					for(xu=0; xu<m+w+5; xu++) {
						if(xu!=m+w+1) { //除了男子总分那一列不交换 其他的都交换  因为男子总分的那一列在上面交换
							temp1=a.item[xu][j+1];
							a.item[xu][j+1]=a.item[xu][j];
							a.item[xu][j]=temp1;
						}
					}
				}
				a.item[m+w+1][j+1]=temp;//小于当前值的,插到当前值后面
			}
			printTitle();
		}
		break;
		case 4: {
			for(i=2; i<n+1; i++) {
				temp=a.item[m+w+2][i];
				for(j=i-1; j>=1&&temp>a.item[m+w+2][j]; j--) { //寻找插入位置
					a.item[m+w+2][j+1]=a.item[m+w+2][j];//交换女子总分列
					for(xu=0; xu<m+w+5; xu++) {
						if(xu!=m+w+2) { //除了女子总分那一列不交换 其他的都交换  因为女子总分的那一列在上面交换
							temp1=a.item[xu][j+1];
							a.item[xu][j+1]=a.item[xu][j];
							a.item[xu][j]=temp1;
						}
					}
				}
				a.item[m+w+2][j+1]=temp;
			}
			printTitle();
		}
		break;
	}
	//下面为查询模块
	printf("----------------------查询模块----------------------\n");
	int bianhao;
	printf("请输入要查询的学校编号:");
	scanf("%d",&bianhao);
	printf("\n");
	for(i=1; i<n+1; i++) {
		if(a.item[0][i]==bianhao) {
			printf("该学校的各项成绩及各项总分和名次如下:\n");
			for(j=0; j<m+w+5; j++) {
				if(j==0) {
					printf("\t");
				} else if(j>=1&&j<m+1) {
					printf("男子项目%d\t",a.item[j][0]);
				} else if(j>=m+1&&j<m+w+1) {
					printf("女子项目%d\t",a.item[j][0]);
				} else if(j==m+w+1) {
					printf("男子项目总成绩\t");
				} else if(j==m+w+2) {
					printf("女子项目总成绩\t");
				} else if(j==m+w+3) {
					printf("学校总成绩\t");
				} else if(j==m+w+4) {
					printf(" 名次\t");
				}
			}
			printf("\n");
			for(j=0; j<w+m+5; j++) {
				if(j==0) {
					printf("学校%d\t",a.item[0][i]);
				} else {
					printf("  %d\t\t",a.item[j][i]);
				}
			}
		}
	}
	printf("\n");
	int bianhao1;
	printf("请输入要查询的项目编号:");
	scanf("%d",&bianhao1);
	printf("\n");


	for(i=2; i<n+1; i++) {
		temp=a.item[m+w+3][i];
		for(j=i-1; j>=1&&temp>a.item[m+w+3][j]; j--) { //寻找插入位置
			a.item[m+w+3][j+1]=a.item[m+w+3][j];//交换总分列
			for(xu=0; xu<m+w+5; xu++) {
				if(xu!=m+w+3) { //除了总分那一列不交换 其他的都交换  因为总分的那一列在上面交换
					temp1=a.item[xu][j+1];
					a.item[xu][j+1]=a.item[xu][j];
					a.item[xu][j]=temp1;
				}
			}
		}
		a.item[m+w+3][j+1]=temp;//小于当前值的,插到当前值后面
	 }                          鱼
	nt s2;
	printf("请输入要查询该项目名次的个数(3或5):");
	scanf("%d",&s2);
	switch(s2) {
		case 3: {
			
		}for(j=1; j<m+w+1; j++) {
				if(a.item[j][0]==bianhao1) {
					for(i=1; i<4; i++) {
						printf("学校%d\t",a.item[0][i]);
						printf("项目%d  成绩:%d\t",a.item[j][0],a.item[j][i]);
						printf("\n");
					}
				}
			}
		break; 
		case 5 {
			for(j=1; j<m+w+1; j++) {
				if(a.item[j][0]==bianhao1) {
					for(i=1; i<6; i++) {
						printf("学校%d\t",a.item[0][i]);
						printf("项目%d  成绩:%d\t",a.item[j][0],a.item[j][i]);
						printf("\n");
					}
				}
			}
		}
		break;
	}
	return 0;
}
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值