Bootstrap

运动会分数统计(数据结构课设)(C语言版)

        本文为数据结构与算法的课程设计《运动会分数统计》的一个分享,使用了顺序表的数据结构。并且将信息以表格的方式打印输出和在txt文件中导入导出。

目录

1.设计内容和要求

2.代码实现

1.结构体定义

2.全局变量和变量定义

3.键盘输入信息

4.信息显示

5.文件导入导出信息

6.信息查询

7.信息排序

8.菜单函数和主函数

9.学校得分信息计算

*10.完整代码


1.设计内容和要求

设计内容:

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

具体功能有:

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

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

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

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

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

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

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

设计要求:

    1.符合课题要求,实现相应功能;

    2.要求界面友好美观,操作方便易行;

    3. 注意程序的实用性、安全性;

2.代码实现

1.结构体定义

typedef struct eve {
	int score = 0;  //项目成绩
	int point = 0;  //项目得分
}event;

typedef struct school {
	int id = 0;          //学校编号
	char name[length_2];   //学校名称

	event Man_event_point[m];      //男子项目得分
	event Woman_event_point[w];    //女子项目得分
	int Man_total_point = 0;    //男子项目总得分
	int Woman_total_point = 0;  //女子项目总得分
	int Points = 0;     //学校总得分

}School[n], school;

        结构体涵盖了课题中的信息,对于男子项目和女子项目另外设置了一个event的结构体。


2.全局变量和变量定义

#define n  8   //学校数量        
#define m  5   //男子项目数量
#define w  5   //女子项目数量

#define MAX_FILENAME_LENGTH 50
#define MAX_NAME_LENGTH 100

#define length_1 15
#define length_2 20
#define length_3 21
#define length_4 21
#define length_5 10

School S; //全局变量

int rank_Man[m][3]; //用于存储每个项目前三名的学校编号
int rank_Woman[w][3];

        将存储数据的数组S定义为全局变量,主要目的是为了避免后续函数使用时进行传参。rank这是两个二维数组是为了实现可以按项目编号查询取得前三名的学校。以rank_Man为例,每一行表示一个项目,后三列每一列都存储一个编号来表示第一,二,三名。例如:rank_Man[1][2]表示男子第二个项目的第一名。length 1-5是设定的打印表格的宽度。


3.键盘输入信息

void Add_school() {

	printf("开始输入学校信息,共%d所学校\n", n);
	for (int i = 0; i < n; i++) {
		printf("*****************\n");
		printf("第%d所学校\n", i+1);
		printf("请输入学校编号\n"); 
		scanf("%d", & S[i].id); 
		printf("请输入学校名称\n");
		scanf("%s", (S[i].name));
		printf("下面开始输入男子项目得分,共%d项\n", m);
		for (int j = 0; j < m; j++) {
			printf("男子第%d个项目得分:", j+1);
			scanf("%d", &((S[i].Man_event_point[j]).score));

		}
		printf("\n");
		printf("下面开始输入女子项目得分,共%d项\n", w);
		for (int j = 0; j < w; j++) {
			printf("女子第%d个项目得分:", j+1);
			scanf("%d", &((S[i].Woman_event_point[j]).score));
		}
	}
	printf("信息已全部输入完成\n\n");
}

        信息输入部分很常规,学校数量n,男子项目数量m,女子项目数量w都已经提供,for循环键入即可。


4.信息显示

void P_total() {
	
	printf("┌───────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┐\n");
	printf("│      编号     │        学校        │     男子项目总分    │     女子项目总分    │       学校总分      │\n");
	printf("├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
	
	for (int i = 0; i < n; i++) {
 
		printf("│");
		int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; }}
		printf("%d",S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐
	    
		printf("│");
		int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); } 
		printf("%s",S[i].name); for (int j = 0; j < (length_2 - padd -strlen(S[i].name));j++) { printf(" "); }

		printf("│");
		padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Man_total_point > 9) { padding++; if (S[i].Man_total_point > 99) { padding++; }}
		printf("%d",S[i].Man_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

		printf("│");
		padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Woman_total_point > 9) { padding++; if (S[i].Woman_total_point > 99) { padding++; }}
		printf("%d",S[i].Woman_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

		printf("│");
		padding = (length_4 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Points > 9) { padding++; if (S[i].Points > 99) { padding++; }}
		printf("%d",S[i].Points); for (int i = 0; i < length_4 - 1 - padding; i++) { printf(" "); }printf("│");

		printf("\n");

		if (i + 1 < n) {
			printf("├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
		}
		else {
			printf("└───────────────┴────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘\n");
			
		}

	}
}
void P_event() {
	int length_M = length_5 * m;
	int length_W = length_5 * w;
	printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m-1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w-1); i++) { printf("─"); } printf("┐\n");
	
	
	printf("│               │                    │");int padding = (length_M+1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M+1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W+1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W+1 - 8 - padding; i++) { printf(" "); } printf("│\n");
		printf("│      编号     │        学校        ├");  //汉字占用两个字节
		for (int i = 0; i < m + w; i++) {
			for (int i = 0; i < length_5; i++) { printf("─"); } 
			if (i == w + m - 1) { printf("┤\n"); }
			else if (i == m - 1) { printf("┼"); }
			else { printf("┬"); }
		}
		
	printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i+1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
		printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
		printf("%d", i+1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }}printf("│\n");//首先尝试默认一位后续补齐 }
		printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");
    
		for (int i = 0; i < n; i++) {

			printf("│");
			int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
			printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

			printf("│");
			int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
			printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

			for (int j = 0; j < m; j++) { printf("│"); 
			padding = (length_5 - 1) / 2;
			for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }
			
			printf("%d", S[i].Man_event_point[j].score);
			
			for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }}
			
			for (int j = 0; j < w; j++) { printf("│"); 
			padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }
				
			printf("%d", S[i].Woman_event_point[j].score); 
			
			for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }}

		    printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
			if(i+1<n){ printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n"); }
			else     { printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n"); }
		}

}

        这里设置了两种数组显示模式,一种是P_total,按照团队总分和总得分进行输出,另一种是P_event,按照每一项项目的成绩进行输出。

        为了能以表格的形式输出数据,我使用了“┌”,“─”,“┬”,“┐”,“├”,“┼” ,“┤”,“└”,“┴”,“┘”等制表符和空格来绘制,为了使数据能居中输出,使用padding变量来计算:字符型可以直接使用strlen来计算控制长度,对于整形,我加入了一个判断条件,如果大于9,数据后的空格减一,如果大于99,数据后的空格再减一。(不会计算int型的长度,只能出此下计)。另外,至于表头中需要打印汉字,特意计算了一下,一个汉字是占用两个字节的。这样,再配合printf固定输入的表头表尾,就能绘制出一个美观的表格了。(实际代码写的很冗长,好多循环变量重复使用,代码阅读很不方便,应当优化。)


5.文件导入导出信息

        这是保存到文件中的样子。

void Writefile() {

	getchar();
	char filename[50];
	printf("请输入导出文件的名称(不含扩展名): ");
	// 使用 fgets 代替 scanf_s 以避免缓冲区溢出,并允许空格  
	if (fgets(filename, sizeof(filename), stdin) != NULL) {
		// 移除 fgets 读取的换行符(如果有)  
		size_t len = strlen(filename);
		if (len > 0 && filename[len - 1] == '\n') {
			filename[len - 1] = '\0';
		}

		// 确保有足够的空间添加扩展名  
		if (strlen(filename) + 4 < sizeof(filename)) { // 4 是 ".txt" 的长度加上空字符  
			strcat(filename, ".txt"); // 自动添加扩展名  

			FILE* file = fopen(filename, "w");
			if (file == NULL) {
				printf("无法打开文件 %s !\a\n", filename);
				return;
			}
			
			// 写入数据  
			int length_M = length_5 * m;
			int length_W = length_5 * w;
			fprintf(file, "┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { fprintf(file, "─"); }fprintf(file, "┬"); for (int i = 0; i < (length_W + w - 1); i++) { fprintf(file, "─"); } fprintf(file, "┐\n");


			fprintf(file, "│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }fprintf(file, "男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { fprintf(file, " "); } fprintf(file, "│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }fprintf(file, "女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { fprintf(file, " "); } fprintf(file, "│\n");
			fprintf(file, "│      编号     │        学校        ├");  //汉字占用两个字节
			for (int i = 0; i < m + w; i++) {
				for (int i = 0; i < length_5; i++) { fprintf(file, "─"); }
				if (i == w + m - 1) { fprintf(file, "┤\n"); }
				else if (i == m - 1) { fprintf(file, "┼"); }
				else { fprintf(file, "┬"); }
			}

			fprintf(file, "│               │                    "); for (int i = 0; i < m; i++) { fprintf(file, "│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } fprintf(file, "%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); } }for (int i = 0; i < w; i++) {
				fprintf(file, "│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
				fprintf(file, "%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); }
			}fprintf(file, "│\n");//首先尝试默认一位后续补齐 }
			fprintf(file, "├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { fprintf(file, "┼"); for (int i = 0; i < length_5; i++) { fprintf(file, "─"); } }fprintf(file, "┤\n");

			for (int i = 0; i < n; i++) {

				fprintf(file, "│");
				int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
				fprintf(file, "%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { fprintf(file, " "); } //首先尝试默认一位后续补齐

				fprintf(file, "│");
				int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { fprintf(file, " "); }
				fprintf(file, "%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { fprintf(file, " "); }

				for (int j = 0; j < m; j++) {
					fprintf(file, "│");
					padding = (length_5 - 1) / 2;
					for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					fprintf(file, "%d", S[i].Man_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); }
				}

				for (int j = 0; j < w; j++) {
					fprintf(file, "│");
					padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					fprintf(file, "%d", S[i].Woman_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); }
				}

				fprintf(file, "│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
				if (i + 1 < n) { fprintf(file, "├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { fprintf(file, "┼"); for (int i = 0; i < length_5; i++) { fprintf(file, "─"); } }fprintf(file, "┤\n"); }
				else { fprintf(file, "└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { fprintf(file, "┴"); for (int i = 0; i < length_5; i++) { fprintf(file, "─"); } }fprintf(file, "┘\n"); }

				fprintf(file,"\n\n");

				fprintf(file, "┌───────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┐\n");
				fprintf(file, "│      编号     │        学校        │     男子项目总分    │     女子项目总分    │       学校总分      │\n");
				fprintf(file, "├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");

				for (int i = 0; i < n; i++) {

					fprintf(file, "│");
					int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
					fprintf(file, "%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { fprintf(file, " "); } //首先尝试默认一位后续补齐

					fprintf(file, "│");
					int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { fprintf(file, " "); }
					fprintf(file, "%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { fprintf(file, " "); }

					fprintf(file, "│");
					padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); } if (S[i].Man_total_point > 9) { padding++; if (S[i].Man_total_point > 99) { padding++; } }
					fprintf(file, "%d", S[i].Man_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { fprintf(file, " "); }

					fprintf(file, "│");
					padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); } if (S[i].Woman_total_point > 9) { padding++; if (S[i].Woman_total_point > 99) { padding++; } }
					fprintf(file, "%d", S[i].Woman_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { fprintf(file, " "); }

					fprintf(file, "│");
					padding = (length_4 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); } if (S[i].Points > 9) { padding++; if (S[i].Points > 99) { padding++; } }
					fprintf(file, "%d", S[i].Points); for (int i = 0; i < length_4 - 1 - padding; i++) { fprintf(file, " "); }fprintf(file, "│");

					fprintf(file, "\n");

					if (i + 1 < n) {
						fprintf(file, "├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
					}
					else {
						fprintf(file, "└───────────────┴────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘\n");

					}
				}
	}
			fclose(file);
			printf("已成功写入文件\n");
		}
		else {
			printf("文件名过长,无法添加扩展名。\n");
		}
	}
	else {
		printf("读取文件名时发生错误。\n");
	}
}
void Infile() {
	getchar();   
	char filename[50];
	printf("请输入要导入的文件名(不含扩展名): ");
	fgets(filename, sizeof(filename), stdin);
	// 移除 fgets 读取的换行符(如果有)  
	size_t len = strlen(filename);
	if (len > 0 && filename[len - 1] == '\n') {
		filename[len - 1] = '\0';
	}
	strcat(filename, ".txt");

	FILE* file = fopen(filename, "r");
	if (file == NULL) {
		printf("无法打开文件 %s !\a\n", filename);
	}

	// 跳过文件头五行  
	char buffer[273];
	for (int i = 0; i < 5; i++) {
		fgets(buffer, sizeof(buffer), file);
	}

	int i = 0;
	char line[256];
	while (fgets(line, sizeof(line), file)) {
		// 去除行尾的换行符  
		line[strcspn(line, "\n")] = 0;

		// 使用 strtok() 分割每一行数据  
		char* token = strtok(line, "│");
		if (token == NULL) continue; // 如果第一分割失败,跳过这一行  

		sscanf(token, "%d", &S[i].id);
		token = strtok(NULL, "│");
		if (token) sscanf(token, "%20s", S[i].name);

		int j = 0;
		while (token && j < m) {
			token = strtok(NULL, "│");
			if (token) sscanf(token, "%d", &S[i].Man_event_point[j++]);
		}

		j = 0;
		while (token && j < w) {
			token = strtok(NULL, "│");
			if (token) sscanf(token, "%d", &S[i].Woman_event_point[j++]);
		}
		fgets(buffer, sizeof(buffer), file);
		if (i + 1 < n) { i++;}
		else { break; }
	}

	fclose(file);
	printf("成功从文件 %s 导入数据!\n", filename);
}

        实际对于文件的导入导出这部分,工作量不大,耗时确最长。出现过两个问题:1.[引发的异常: 0xC0000005: 写入位置 0xCDCDCDCD 时发生访问冲突。],这个问题一般出现是访问到空指针或者数组越界。但是,我在调试过程中运行到输入文件名称部分系统就会崩溃,并不存在上述两种 问题。后续检查了良久,最后发现是前面使用scanf来进行菜单选择时,缓存区里还会有剩余的换行符,这个换行符会通过fgts输入到文件名中导致错误,所以这也才有了两个文件函数开头的getchar来解决这个问题。2.分割符的问题,最开始进行读取时,是使用if判断,当gfgts到line中的数组读取到"│",就跳过空格开始读入,不仅循环次数多,效率差,很繁琐。所以后面采用了strtok来分割读取,并将表头和每行数据之间的分割行都用buffer读取掉,就可以避免开无关信息读取。


6.信息查询

void Search_id() {
	Sortbyid(); //排序

	while (1) {
		int i,choice;

		printf("******************************\n");
		printf("\033[5m ");
		printf("*       请选择要显示信息     *\n");
		printf("\033[0m ");
		printf("*                            *\n");
		printf("*    1: 总分    2:项目       *\n");
		printf("*     0:退出信息查询        *\n");
		printf("******************************\n");printf("\n");

		scanf("%d",&choice);
	   
		if (choice == 1) {
			printf("请输入查询的学校编号:");
			scanf("%d", &i); i--;
			printf("┌───────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┐\n");
			printf("│      编号     │        学校        │     男子项目总分    │     女子项目总分    │       学校总分      │\n");
			printf("├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
			printf("│");
			int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
			printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

			printf("│");
			int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
			printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

			printf("│");
			padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Man_total_point > 9) { padding++; if (S[i].Man_total_point > 99) { padding++; } }
			printf("%d", S[i].Man_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

			printf("│");
			padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Woman_total_point > 9) { padding++; if (S[i].Woman_total_point > 99) { padding++; } }
			printf("%d", S[i].Woman_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

			printf("│");
			padding = (length_4 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Points > 9) { padding++; if (S[i].Points > 99) { padding++; } }
			printf("%d", S[i].Points); for (int i = 0; i < length_4 - 1 - padding; i++) { printf(" "); }printf("│");

			printf("\n");
			printf("└───────────────┴────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘\n");
		}
		else if (choice == 2) {
			printf("请输入查询的学校编号:");
			scanf("%d", &i); i--;
			int length_M = length_5 * m;
			int length_W = length_5 * w;
			printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w - 1); i++) { printf("─"); } printf("┐\n");


			printf("│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { printf(" "); } printf("│\n");
			printf("│      编号     │        学校        ├");  //汉字占用两个字节
			for (int i = 0; i < m + w; i++) {
				for (int i = 0; i < length_5; i++) { printf("─"); }
				if (i == w + m - 1) { printf("┤\n"); }
				else if (i == m - 1) { printf("┼"); }
				else { printf("┬"); }
			}

			printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
				printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
				printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
			}printf("│\n");//首先尝试默认一位后续补齐 }
			printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");


				printf("│");
				padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
				printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

				printf("│");
				int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
				printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

				for (int j = 0; j < m; j++) {
					printf("│");
					padding = (length_5 - 1) / 2;
					for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Man_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				for (int j = 0; j < w; j++) {
					printf("│");
					padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Woman_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
				 printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n");
			}
		   
		else { printf("学校信息查询已退出\n"); break; }

		}
}

         这是查询输出每个项目的前三名。

void Search_Man_event() {
		Sortbyid(); //排序

		int length_M = length_5 * m;
		int length_W = length_5 * w;

		int input, choice;
		while (1) {
			printf("请输入查询的项目编号:");
			scanf("%d", &input);
			if (input > w || input < 0) { printf("项目编号输入错误,请重新输入\n"); }
			else { break; }
		}

		printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w - 1); i++) { printf("─"); } printf("┐\n");


		printf("│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { printf(" "); } printf("│\n");
		printf("│      编号     │        学校        ├");  //汉字占用两个字节
		for (int i = 0; i < m + w; i++) {
			for (int i = 0; i < length_5; i++) { printf("─"); }
			if (i == w + m - 1) { printf("┤\n"); }
			else if (i == m - 1) { printf("┼"); }
			else { printf("┬"); }
		}

		printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
			printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
			printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
		   }printf("│\n");//首先尝试默认一位后续补齐 }
		   printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");

		   for (int k = 0; k < 3; k++) {
			   int id = rank_Man[input - 1][k];
			   for (int i = 0; i < n; i++) {

				   if (S[i].id == id) {

					   printf("│");
					   padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
					   printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

					   printf("│");
					   int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
					   printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

					   for (int j = 0; j < m; j++) {
						   printf("│");
						   padding = (length_5 - 1) / 2;
						   for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

						   printf("%d", S[i].Man_event_point[j].score);

						   for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
					   }

					   for (int j = 0; j < w; j++) {
						   printf("│");
						   padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

						   printf("%d", S[i].Woman_event_point[j].score);

						   for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
					   }

					   printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
					   if ( k < 2) { printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n"); }
					   else { printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n"); }
				   }
			   }
		   }
	}
void Search_Woman_event() {
	Sortbyid(); //排序
	int length_M = length_5 * m;
	int length_W = length_5 * w;

	int input, choice;
	while(1){
	   printf("请输入查询的项目编号:");
	   scanf("%d", &input); 
	   if (input > w||input<0) { printf("项目编号输入错误,请重新输入\n"); }
	   else {break;}
	}

	printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w - 1); i++) { printf("─"); } printf("┐\n");


	printf("│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { printf(" "); } printf("│\n");
	printf("│      编号     │        学校        ├");  //汉字占用两个字节
	for (int i = 0; i < m + w; i++) {
		for (int i = 0; i < length_5; i++) { printf("─"); }
		if (i == w + m - 1) { printf("┤\n"); }
		else if (i == m - 1) { printf("┼"); }
		else { printf("┬"); }
	}

	printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
		printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
		printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
	}printf("│\n");//首先尝试默认一位后续补齐 }
	printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");

	for (int k = 0; k < 3; k++) {
		int id = rank_Woman[input - 1][k];
		for (int i = 0; i < n; i++) {

			if (S[i].id == id) {

				printf("│");
				padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
				printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

				printf("│");
				int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
				printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

				for (int j = 0; j < m; j++) {
					printf("│");
					padding = (length_5 - 1) / 2;
					for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Man_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				for (int j = 0; j < w; j++) {
					printf("│");
					padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Woman_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
				if (k < 2) { printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n"); }
				else { printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n"); }
			}
		}
	}
}

 

         查询有两种模式查询,一种是按照学校编号查询,由于编号是按照从1-n分布的,所以先按照编号排序一下,要查询的学校编号为i,其信息就存储在S[i-1]中。然后打印输出即可。第二种是按照项目查询,选择好是男子还是女子项目的查询(其实本质是选择从rank_Man还是从rank_Woman中获取数据,rank数组的数据填充在count函数中),然后开始遍历数组,匹配到和rank数组存储的编号一致,就输出信息,这样就能输出每个项目的前三名。

         (全部代码最繁琐的部分就是控制表格输出,不仅要控制循环变量还有每一次输出时要判断是否要输出表格的结尾行,每一次输出的判断条件都不大一致)


7.信息排序

void Sortbyid() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].id >S[j].id) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
}
void SortbyMan() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].Man_total_point < S[j].Man_total_point) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
	P_total();
}
void SortbyWoman() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].Woman_total_point < S[j].Woman_total_point) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
	P_total();
}

void Sortbypoint() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].Points < S[j].Points) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
	P_total();
}

         排序后信息输出分四类:按照编号(从小到大),按照男子团队总分,按照女子团队总分,按照总分(后三个都是从大到小)。选择的排序算法都是最简单的冒泡排序,因为使用的数组而且数据量并不大。这一部分也比较常规,没有遇到什么问题。


8.菜单函数和主函数

void Menu() {
	system("cls");
	printf("******************************\n");
	printf("\033[5m ");
	printf("*      运动会分数统计        *\n");
	printf("\033[0m ");
	printf("*                            *\n");
	printf("*     1. 输入学校信息        *\n");
	printf("*     2.   信息显示          *\n");
	printf("*     3.导入信息到文件       *\n");
	printf("*     4. 文件导入信息        *\n");
	printf("*     5. 查询分数信息        *\n");
	printf("*     6. 显示排序信息        *\n");
	printf("*       0. 退出系统          *\n");
	printf("******************************\n");
}

void Menu2() {
	printf("******************************\n");
	printf("\033[5m ");
	printf("*        显示类型选择        *\n");
	printf("\033[0m ");
	printf("*                            *\n");
	printf("*     1. 显示学校总分        *\n");
	printf("*     2. 显示学校项目        *\n");
	printf("*       0. 退出显示          *\n");
	printf("******************************\n");
}

void Menu3() {
	printf("******************************\n");
	printf("\033[5m] ");
	printf("*        信息查询选择        *\n");
	printf("\033[0m]");
	printf("*                            *\n");
	printf("*     1. 查询学校信息        *\n");
	printf("*     2. 查询项目信息        *\n");
	printf("*       0. 退出查询          *\n");
	printf("******************************\n");
}

void Menu4() {
	printf("******************************\n");
	printf("\033[5m ");
	printf("*       显示排序信息         *\n");
	printf("\033[0m ");
	printf("*                            *\n");
	printf("*        1. 编号             *\n");
	printf("*     2. 男子团队总分        *\n");
	printf("*     3. 女子团队总分        *\n");
	printf("*        4. 总积分           *\n");
	printf("*       0. 退出查询          *\n");
	printf("******************************\n");
}

        这次在主菜单下还分设了四个子菜单(其实还有三处进行了菜单选择,只是没有另外再写一个菜单)。

void Menuport() {
	int input;
	while (1) {
		printf("请选择你的操作\n");
		scanf("%d", &input);
		switch (input) {
		case 1:Menu(); Add_school(); count(); break;
		case 2: {
			Menu();Menu2();
			while (1) {
				printf("请选择你的显示操作:");
				int in;
				scanf("%d", &in);

				if (in == 1) { P_total(); }
				else if (in == 2) { P_event();  }
				else if (in == 0) { printf("已退出显示\n"); break; }
				else { printf("选择无效 已经退出选择\n"); break; }
			}
			break;
		}
		case 3:Menu(); Writefile(); break;
		case 4: Menu(); Infile(); count(); break;
		case 5: {
			Menu(); Menu3();
			while (1) {
				printf("请选择你的查询操作:");
				int in;
				scanf("%d", &in);

				if (in == 1) { Search_id(); }
				else if (in == 2) {
					int choice;

					printf("*****************************\n");
					printf("*     请选择要查询的信息    *\n");
					printf("*                           *\n");
					printf("*  1:男子项目  2:女子项目  *\n");
					printf("*      0:退出项目查询       *\n");
					printf("******************************\n");
					printf("\n");

					scanf("%d", &choice);
					if (choice == 1) { Search_Man_event(); }
					else if (choice == 2) { Search_Woman_event(); }
					else break;
				}
					else if (in == 0) { printf("已退出查询\n"); break; }
					else { printf("选择无效 已经退出查询\n"); break; }
				}
			
			break;
		}
		case 6: {
			Menu(); Menu4();
			while (1) {
			printf("请选择你的排序操作:");
			int in;
			scanf("%d", &in);

			if (in == 1) { Sortbyid();P_total();}
			else if (in == 2) { SortbyMan(); }
			else if (in == 3) { SortbyWoman(); }
			else if (in == 4) { Sortbypoint(); }
			else if (in == 0) { printf("已退出排序\n"); break; }
			else { printf("选择无效 已经退出选择\n"); break; }
		    }
			  break; 
		}
		case 0: exit(-339);
		default: printf("输入错误 请重新输入\n"); break;
		}
	}
}

int main() {
	Menu();
	Menuport();
	return 0;
}

         然后通过主菜单进菜单操作(Menuport),还是熟悉的while(1)持续执行直到退出。


9.学校得分信息计算

void count() {
	for (int k = 0; k < m; k++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (S[i].Man_event_point[k].score <= S[j].Man_event_point[k].score) {
					school temp = S[j];
					S[j] = S[i];
					S[i] = temp;
				}
			}
		}
		S[0].Man_event_point[k].point = 5; S[0].Man_total_point = S[0].Man_total_point + S[0].Man_event_point[k].point; rank_Man[k][0] = S[0].id;
		S[1].Man_event_point[k].point = 3; S[1].Man_total_point = S[1].Man_total_point + S[1].Man_event_point[k].point; rank_Man[k][1] = S[1].id;
		S[2].Man_event_point[k].point = 2; S[2].Man_total_point = S[2].Man_total_point + S[2].Man_event_point[k].point; rank_Man[k][2] = S[2].id;
		for (int i = 3; i < n; i++) {
			S[i].Man_total_point = S[i].Man_total_point + S[i].Man_event_point[k].point;
		}

	}

	for (int k = 0; k < w; k++) {
		for (int in = 0; in < n; in++) {
			for (int j = 0; j < n; j++) {
				if (S[in].Woman_event_point[k].score <= S[j].Woman_event_point[k].score) {
					school temp = S[j];
					S[j] = S[in];
					S[in] = temp;
				}
			}
		}
		S[0].Woman_event_point[k].point = 5; S[0].Woman_total_point = S[0].Woman_total_point + S[0].Woman_event_point[k].point; rank_Woman[k][0] = S[0].id;
		S[1].Woman_event_point[k].point = 3; S[1].Woman_total_point = S[1].Woman_total_point + S[1].Woman_event_point[k].point; rank_Woman[k][1] = S[1].id;
		S[2].Woman_event_point[k].point = 2; S[2].Woman_total_point = S[2].Woman_total_point + S[2].Woman_event_point[k].point; rank_Woman[k][2] = S[2].id;
		for (int io = 3; io < n; io++) {
			S[io].Woman_total_point = S[io].Woman_total_point + S[io].Woman_event_point[k].point;
		}
	}
	for (int i = 0; i < n; i++) { S[i].Points = S[i].Man_total_point + S[i].Woman_total_point; }
}

        count函数通过输入或者导入的学校各项目成绩来进行得分计算。首先, 先按照项目成绩从大到小对数组进行排序。然后,将数组S前三位对于该项目的得分分别计入5,3,2。其他位置不变还是初始化的0,将这前三位的编号存储到rank数组中,再将该项目的得分计入该团队总得分。男子项目和女子项目计算过程一致。最后将两个项目的得分都进入该学校总得分。


*10.完整代码

#define  _CRT_SECURE_NO_WARNINGS  1

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <windows.h>
#include <stdlib.h>

#define n  8   //学校数量        
#define m  2   //男子项目数量
#define w  2   //女子项目数量

#define MAX_FILENAME_LENGTH 50
#define MAX_NAME_LENGTH 100

#define length_1 15
#define length_2 20
#define length_3 21
#define length_4 21
#define length_5 10
typedef struct eve {
	int score = 0;  //项目成绩
	int point = 0;  //项目得分
}event;

typedef struct school {
	int id = 0;          //学校编号
	char name[length_2];   //学校名称

	event Man_event_point[m];      //男子项目得分
	event Woman_event_point[w];    //女子项目得分
	int Man_total_point = 0;    //男子项目总得分
	int Woman_total_point = 0;  //女子项目总得分
	int Points = 0;     //学校总得分

}School[n], school;

School S; //全局变量
int rank_Man[m][3]; //用于存储每个项目前三名的学校编号
int rank_Woman[w][3];

void Add_school(); //键盘键入学校信息
void Search_id();  void Search_Man_event(); void Search_Woman_event();

void count();      //计算学校各项目得分和各个项目对应位次(用数组存储),以及总分
void Sortbyid();
void SorbyMan();
void SortbyWoman();
void Sortbypoint();
void P_total(); void P_event();
void Infile();
void Writefile();
void Menu();
void Menuport();

void Add_school() {

	printf("开始输入学校信息,共%d所学校\n", n);
	for (int i = 0; i < n; i++) {
		printf("*****************\n");
		printf("第%d所学校\n", i+1);
		printf("学校编号:%d\n",i+1); 
		S[i].id = i + 1;
		printf("请输入学校名称\n");
		scanf("%s",S[i].name);
		printf("下面开始输入男子项目得分,共%d项\n", m);
		for (int j = 0; j < m; j++) {
			printf("男子第%d个项目得分:", j+1);
			scanf("%d", &((S[i].Man_event_point[j]).score));

		}
		printf("\n");
		printf("下面开始输入女子项目得分,共%d项\n", w);
		for (int j = 0; j < w; j++) {
			printf("女子第%d个项目得分:", j+1);
			scanf("%d", &((S[i].Woman_event_point[j]).score));
		}
	}
	printf("信息已全部输入完成\n\n");
}

void P_total() {
	
	printf("┌───────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┐\n");
	printf("│      编号     │        学校        │     男子项目总分    │     女子项目总分    │       学校总分      │\n");
	printf("├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
	
	for (int i = 0; i < n; i++) {
 
		printf("│");
		int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; }}
		printf("%d",S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐
	    
		printf("│");
		int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); } 
		printf("%s",S[i].name); for (int j = 0; j < (length_2 - padd -strlen(S[i].name));j++) { printf(" "); }

		printf("│");
		padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Man_total_point > 9) { padding++; if (S[i].Man_total_point > 99) { padding++; }}
		printf("%d",S[i].Man_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

		printf("│");
		padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Woman_total_point > 9) { padding++; if (S[i].Woman_total_point > 99) { padding++; }}
		printf("%d",S[i].Woman_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

		printf("│");
		padding = (length_4 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Points > 9) { padding++; if (S[i].Points > 99) { padding++; }}
		printf("%d",S[i].Points); for (int i = 0; i < length_4 - 1 - padding; i++) { printf(" "); }printf("│");

		printf("\n");

		if (i + 1 < n) {
			printf("├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
		}
		else {
			printf("└───────────────┴────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘\n");
			
		}

	}
}

void P_event() {
	int length_M = length_5 * m;
	int length_W = length_5 * w;
	printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m-1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w-1); i++) { printf("─"); } printf("┐\n");
	
	
	printf("│               │                    │");int padding = (length_M+1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M+1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W+1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W+1 - 8 - padding; i++) { printf(" "); } printf("│\n");
		printf("│      编号     │        学校        ├");  //汉字占用两个字节
		for (int i = 0; i < m + w; i++) {
			for (int i = 0; i < length_5; i++) { printf("─"); } 
			if (i == w + m - 1) { printf("┤\n"); }
			else if (i == m - 1) { printf("┼"); }
			else { printf("┬"); }
		}
		
	printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i+1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
		printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
		printf("%d", i+1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }}printf("│\n");//首先尝试默认一位后续补齐 }
		printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");
    
		for (int i = 0; i < n; i++) {

			printf("│");
			int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
			printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

			printf("│");
			int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
			printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

			for (int j = 0; j < m; j++) { printf("│"); 
			padding = (length_5 - 1) / 2;
			for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }
			
			printf("%d", S[i].Man_event_point[j].score);
			
			for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }}
			
			for (int j = 0; j < w; j++) { printf("│"); 
			padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }
				
			printf("%d", S[i].Woman_event_point[j].score); 
			
			for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }}

		    printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
			if(i+1<n){ printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n"); }
			else     { printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n"); }
		}

}
      
void count() {
	for (int k = 0; k < m; k++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (S[i].Man_event_point[k].score <= S[j].Man_event_point[k].score) {
					school temp = S[j];
					S[j] = S[i];
					S[i] = temp;
				}
			}
		}
		S[0].Man_event_point[k].point = 5; S[0].Man_total_point = S[0].Man_total_point + S[0].Man_event_point[k].point; rank_Man[k][0] = S[0].id;
		S[1].Man_event_point[k].point = 3; S[1].Man_total_point = S[1].Man_total_point + S[1].Man_event_point[k].point; rank_Man[k][1] = S[1].id;
		S[2].Man_event_point[k].point = 2; S[2].Man_total_point = S[2].Man_total_point + S[2].Man_event_point[k].point; rank_Man[k][2] = S[2].id;
		for (int i = 3; i < n; i++) {
			S[i].Man_total_point = S[i].Man_total_point + S[i].Man_event_point[k].point;
		}

	}

	for (int k = 0; k < w; k++) {
		for (int in = 0; in < n; in++) {
			for (int j = 0; j < n; j++) {
				if (S[in].Woman_event_point[k].score <= S[j].Woman_event_point[k].score) {
					school temp = S[j];
					S[j] = S[in];
					S[in] = temp;
				}
			}
		}
		S[0].Woman_event_point[k].point = 5; S[0].Woman_total_point = S[0].Woman_total_point + S[0].Woman_event_point[k].point; rank_Woman[k][0] = S[0].id;
		S[1].Woman_event_point[k].point = 3; S[1].Woman_total_point = S[1].Woman_total_point + S[1].Woman_event_point[k].point; rank_Woman[k][1] = S[1].id;
		S[2].Woman_event_point[k].point = 2; S[2].Woman_total_point = S[2].Woman_total_point + S[2].Woman_event_point[k].point; rank_Woman[k][2] = S[2].id;
		for (int io = 3; io < n; io++) {
			S[io].Woman_total_point = S[io].Woman_total_point + S[io].Woman_event_point[k].point;
		}
	}
	for (int i = 0; i < n; i++) { S[i].Points = S[i].Man_total_point + S[i].Woman_total_point; }
}

void Sortbyid() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].id >S[j].id) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
}

void SortbyMan() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].Man_total_point < S[j].Man_total_point) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
	P_total();
}

void SortbyWoman() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].Woman_total_point < S[j].Woman_total_point) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
	P_total();
}

void Sortbypoint() {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (S[i].Points < S[j].Points) {
				school temp = S[j];
				S[j] = S[i];
				S[i] = temp;
			}
		}
	}
	P_total();
}

void Writefile() {

	getchar();
	char filename[50];
	printf("请输入导出文件的名称(不含扩展名): ");
	// 使用 fgets 代替 scanf_s 以避免缓冲区溢出,并允许空格  
	if (fgets(filename, sizeof(filename), stdin) != NULL) {
		// 移除 fgets 读取的换行符(如果有)  
		size_t len = strlen(filename);
		if (len > 0 && filename[len - 1] == '\n') {
			filename[len - 1] = '\0';
		}

		// 确保有足够的空间添加扩展名  
		if (strlen(filename) + 4 < sizeof(filename)) { // 4 是 ".txt" 的长度加上空字符  
			strcat(filename, ".txt"); // 自动添加扩展名  

			FILE* file = fopen(filename, "w");
			if (file == NULL) {
				printf("无法打开文件 %s !\a\n", filename);
				return;
			}

			// 写入数据  
			int length_M = length_5 * m;
			int length_W = length_5 * w;
			fprintf(file, "┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { fprintf(file, "─"); }fprintf(file, "┬"); for (int i = 0; i < (length_W + w - 1); i++) { fprintf(file, "─"); } fprintf(file, "┐\n");


			fprintf(file, "│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }fprintf(file, "男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { fprintf(file, " "); } fprintf(file, "│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }fprintf(file, "女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { fprintf(file, " "); } fprintf(file, "│\n");
			fprintf(file, "│      编号     │        学校        ├");  //汉字占用两个字节
			for (int i = 0; i < m + w; i++) {
				for (int i = 0; i < length_5; i++) { fprintf(file, "─"); }
				if (i == w + m - 1) { fprintf(file, "┤\n"); }
				else if (i == m - 1) { fprintf(file, "┼"); }
				else { fprintf(file, "┬"); }
			}

			fprintf(file, "│               │                    "); for (int i = 0; i < m; i++) { fprintf(file, "│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } fprintf(file, "%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); } }for (int i = 0; i < w; i++) {
				fprintf(file, "│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
				fprintf(file, "%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); }
			}fprintf(file, "│\n");//首先尝试默认一位后续补齐 }
			fprintf(file, "├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { fprintf(file, "┼"); for (int i = 0; i < length_5; i++) { fprintf(file, "─"); } }fprintf(file, "┤\n");

			for (int i = 0; i < n; i++) {

				fprintf(file, "│");
				int padding = (length_1 - 1) / 2;
				for (int i = 0; i < padding; i++) { fprintf(file, " "); }
				if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
				fprintf(file, "%d", S[i].id);
				for (int i = 0; i < length_1 - 1 - padding; i++) { fprintf(file, " "); } //首先尝试默认一位后续补齐

				fprintf(file, "│");
				int padd = (length_2 + 1 - strlen(S[i].name)) / 2;
				for (int k = 0; k < padd; k++) { fprintf(file, " "); }
				fprintf(file, "%s", S[i].name);
				for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { fprintf(file, " "); }

				for (int j = 0; j < m; j++) {

					fprintf(file, "│");
					padding = (length_5 - 1) / 2;
					for (int i = 0; i < padding; i++) { fprintf(file, " "); }
					if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }
					fprintf(file, "%d", S[i].Man_event_point[j].score);
					for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); }
				}


				for (int j = 0; j < w; j++) {

					fprintf(file, "│");
					padding = (length_5 - 1) / 2;
					for (int i = 0; i < padding; i++) { fprintf(file, " "); }
					if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }
					fprintf(file, "%d", S[i].Woman_event_point[j].score);
					for (int i = 0; i < length_5 - 1 - padding; i++) { fprintf(file, " "); }
				}

				fprintf(file, "│\n");//首先尝试默认一位后续补齐 最多去比较到三位数

				if (i + 1 < n)
				{
					fprintf(file, "├───────────────┼────────────────────");
					for (int i = 0; i < m + w; i++) {
						fprintf(file, "┼");
						for (int i = 0; i < length_5; i++) { fprintf(file, "─"); }
					}
					fprintf(file, "┤\n");
				}

				else
				{
					fprintf(file, "└───────────────┴────────────────────");
					for (int i = 0; i < m + w; i++) {
						fprintf(file, "┴");
						for (int i = 0; i < length_5; i++) { fprintf(file, "─"); }
					}
					fprintf(file, "┘\n");
				}
			}

			fprintf(file, "\n\n");

			fprintf(file, "┌───────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┐\n");
			fprintf(file, "│      编号     │        学校        │     男子项目总分    │     女子项目总分    │       学校总分      │\n");
			fprintf(file, "├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");

			for (int i = 0; i < n; i++) {

				fprintf(file, "│");
				int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
				fprintf(file, "%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { fprintf(file, " "); } //首先尝试默认一位后续补齐

				fprintf(file, "│");
				int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { fprintf(file, " "); }
				fprintf(file, "%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { fprintf(file, " "); }

				fprintf(file, "│");
				padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); } if (S[i].Man_total_point > 9) { padding++; if (S[i].Man_total_point > 99) { padding++; } }
				fprintf(file, "%d", S[i].Man_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { fprintf(file, " "); }

				fprintf(file, "│");
				padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); } if (S[i].Woman_total_point > 9) { padding++; if (S[i].Woman_total_point > 99) { padding++; } }
				fprintf(file, "%d", S[i].Woman_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { fprintf(file, " "); }

				fprintf(file, "│");
				padding = (length_4 - 1) / 2; for (int i = 0; i < padding; i++) { fprintf(file, " "); } if (S[i].Points > 9) { padding++; if (S[i].Points > 99) { padding++; } }
				fprintf(file, "%d", S[i].Points); for (int i = 0; i < length_4 - 1 - padding; i++) { fprintf(file, " "); }fprintf(file, "│");

				fprintf(file, "\n");

				if (i + 1 < n) {
					fprintf(file, "├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
				}
				else {
					fprintf(file, "└───────────────┴────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘\n");
				}
			}

			fclose(file);
			printf("已成功写入文件\n");
		}

		else { printf("文件名过长,无法添加扩展名。\n"); }
	}
	else {printf("读取文件名时发生错误。\n");}
	
}

void Infile() {
	getchar();   
	char filename[50];
	printf("请输入要导入的文件名(不含扩展名): ");
	fgets(filename, sizeof(filename), stdin);
	// 移除 fgets 读取的换行符(如果有)  
	size_t len = strlen(filename);
	if (len > 0 && filename[len - 1] == '\n') {
		filename[len - 1] = '\0';
	}
	strcat(filename, ".txt");

	FILE* file = fopen(filename, "r");
	if (file == NULL) {
		printf("无法打开文件 %s !\a\n", filename);
	}

	// 跳过文件头五行  
	char buffer[273];
	for (int i = 0; i < 5; i++) {
		fgets(buffer, sizeof(buffer), file);
	}

	int i = 0;
	char line[256];
	while (fgets(line, sizeof(line), file)) {
		// 去除行尾的换行符  
		line[strcspn(line, "\n")] = 0;

		// 使用 strtok() 分割每一行数据  
		char* token = strtok(line, "│");
		if (token == NULL) continue; // 如果第一分割失败,跳过这一行  

		sscanf(token, "%d", &S[i].id);
		token = strtok(NULL, "│");
		if (token) sscanf(token, "%s", S[i].name);

		int j = 0;
		while (token && j < m) {
			token = strtok(NULL, "│");
			if (token) sscanf(token, "%d", &S[i].Man_event_point[j++]);
		}

		j = 0;
		while (token && j < w) {
			token = strtok(NULL, "│");
			if (token) sscanf(token, "%d", &S[i].Woman_event_point[j++]);
		}
		fgets(buffer, sizeof(buffer), file);
		if (i + 1 < n) { i++;}
		else { break; }
	}

	fclose(file);
	printf("成功从文件 %s 导入数据!\n", filename);
}

void Search_id() {
	Sortbyid(); //排序

	while (1) {
		int i,choice;

		printf("******************************\n");
		printf("\033[5m ");
		printf("*       请选择要显示信息     *\n");
		printf("\033[0m ");
		printf("*                            *\n");
		printf("*    1: 总分    2:项目       *\n");
		printf("*     0:退出信息查询        *\n");
		printf("******************************\n");printf("\n");

		scanf("%d",&choice);
	   
		if (choice == 1) {
			printf("请输入查询的学校编号:");
			scanf("%d", &i);
			printf("┌───────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┐\n");
			printf("│      编号     │        学校        │     男子项目总分    │     女子项目总分    │       学校总分      │\n");
			printf("├───────────────┼────────────────────┼─────────────────────┼─────────────────────┼─────────────────────┤\n");
			printf("│");
			int padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
			printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

			printf("│");
			int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
			printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

			printf("│");
			padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Man_total_point > 9) { padding++; if (S[i].Man_total_point > 99) { padding++; } }
			printf("%d", S[i].Man_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

			printf("│");
			padding = (length_3 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Woman_total_point > 9) { padding++; if (S[i].Woman_total_point > 99) { padding++; } }
			printf("%d", S[i].Woman_total_point); for (int i = 0; i < length_3 - 1 - padding; i++) { printf(" "); }

			printf("│");
			padding = (length_4 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); } if (S[i].Points > 9) { padding++; if (S[i].Points > 99) { padding++; } }
			printf("%d", S[i].Points); for (int i = 0; i < length_4 - 1 - padding; i++) { printf(" "); }printf("│");

			printf("\n");
			printf("└───────────────┴────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘\n");
		}
		else if (choice == 2) {
			printf("请输入查询的学校编号:");
			scanf("%d", &i); 
			int length_M = length_5 * m;
			int length_W = length_5 * w;
			printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w - 1); i++) { printf("─"); } printf("┐\n");


			printf("│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { printf(" "); } printf("│\n");
			printf("│      编号     │        学校        ├");  //汉字占用两个字节
			for (int i = 0; i < m + w; i++) {
				for (int i = 0; i < length_5; i++) { printf("─"); }
				if (i == w + m - 1) { printf("┤\n"); }
				else if (i == m - 1) { printf("┼"); }
				else { printf("┬"); }
			}

			printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
				printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
				printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
			}printf("│\n");//首先尝试默认一位后续补齐 }
			printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");


				printf("│");
				padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
				printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

				printf("│");
				int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
				printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

				for (int j = 0; j < m; j++) {
					printf("│");
					padding = (length_5 - 1) / 2;
					for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Man_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				for (int j = 0; j < w; j++) {
					printf("│");
					padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Woman_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
				 printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n");
			}
		   
		else { printf("学校信息查询已退出\n"); break; }

		}
}

void Search_Man_event() {
		Sortbyid(); //排序

		int length_M = length_5 * m;
		int length_W = length_5 * w;

		int input, choice;
		while (1) {
			printf("请输入查询的项目编号:");
			scanf("%d", &input);
			if (input > w || input < 0) { printf("项目编号输入错误,请重新输入\n"); }
			else { break; }
		}

		printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w - 1); i++) { printf("─"); } printf("┐\n");


		printf("│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { printf(" "); } printf("│\n");
		printf("│      编号     │        学校        ├");  //汉字占用两个字节
		for (int i = 0; i < m + w; i++) {
			for (int i = 0; i < length_5; i++) { printf("─"); }
			if (i == w + m - 1) { printf("┤\n"); }
			else if (i == m - 1) { printf("┼"); }
			else { printf("┬"); }
		}

		printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
			printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
			printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
		   }printf("│\n");//首先尝试默认一位后续补齐 }
		   printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");

		   for (int k = 0; k < 3; k++) {
			   int id = rank_Man[input - 1][k];
			   for (int i = 0; i < n; i++) {

				   if (S[i].id == id) {

					   printf("│");
					   padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
					   printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

					   printf("│");
					   int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
					   printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

					   for (int j = 0; j < m; j++) {
						   printf("│");
						   padding = (length_5 - 1) / 2;
						   for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

						   printf("%d", S[i].Man_event_point[j].score);

						   for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
					   }

					   for (int j = 0; j < w; j++) {
						   printf("│");
						   padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

						   printf("%d", S[i].Woman_event_point[j].score);

						   for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
					   }

					   printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
					   if ( k < 2) { printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n"); }
					   else { printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n"); }
				   }
			   }
		   }
	}

void Search_Woman_event() {
	Sortbyid(); //排序
	int length_M = length_5 * m;
	int length_W = length_5 * w;

	int input, choice;
	while(1){
	   printf("请输入查询的项目编号:");
	   scanf("%d", &input); 
	   if (input > w||input<0) { printf("项目编号输入错误,请重新输入\n"); }
	   else {break;}
	}

	printf("┌───────────────┬────────────────────┬"); for (int i = 0; i < (length_M + m - 1); i++) { printf("─"); }printf("┬"); for (int i = 0; i < (length_W + w - 1); i++) { printf("─"); } printf("┐\n");


	printf("│               │                    │"); int padding = (length_M + 1 - 7) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("男子项目"); for (int i = 0; i < length_M + 1 - 8 - padding; i++) { printf(" "); } printf("│"); padding = (length_W + 1 - 8) / 2; for (int i = 0; i < padding; i++) { printf(" "); }printf("女子项目"); for (int i = 0; i < length_W + 1 - 8 - padding; i++) { printf(" "); } printf("│\n");
	printf("│      编号     │        学校        ├");  //汉字占用两个字节
	for (int i = 0; i < m + w; i++) {
		for (int i = 0; i < length_5; i++) { printf("─"); }
		if (i == w + m - 1) { printf("┤\n"); }
		else if (i == m - 1) { printf("┼"); }
		else { printf("┬"); }
	}

	printf("│               │                    "); for (int i = 0; i < m; i++) { printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } } printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); } }for (int i = 0; i < w; i++) {
		printf("│"); padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (i > 9) { padding++; if (i > 99) { padding++; } }
		printf("%d", i + 1); for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
	}printf("│\n");//首先尝试默认一位后续补齐 }
	printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n");

	for (int k = 0; k < 3; k++) {
		int id = rank_Woman[input - 1][k];
		for (int i = 0; i < n; i++) {

			if (S[i].id == id) {

				printf("│");
				padding = (length_1 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].id > 9) { padding++; if (S[i].id > 99) { padding++; } }
				printf("%d", S[i].id); for (int i = 0; i < length_1 - 1 - padding; i++) { printf(" "); } //首先尝试默认一位后续补齐

				printf("│");
				int padd = (length_2 + 1 - strlen(S[i].name)) / 2; for (int k = 0; k < padd; k++) { printf(" "); }
				printf("%s", S[i].name); for (int j = 0; j < (length_2 - padd - strlen(S[i].name)); j++) { printf(" "); }

				for (int j = 0; j < m; j++) {
					printf("│");
					padding = (length_5 - 1) / 2;
					for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Man_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Man_event_point[j].score);

					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				for (int j = 0; j < w; j++) {
					printf("│");
					padding = (length_5 - 1) / 2; for (int i = 0; i < padding; i++) { printf(" "); }  if (S[i].Woman_event_point[j].score > 9) { padding++; if (i > 99) { padding++; } }

					printf("%d", S[i].Woman_event_point[j].score);
					a
					for (int i = 0; i < length_5 - 1 - padding; i++) { printf(" "); }
				}

				printf("│\n");//首先尝试默认一位后续补齐 最多去比较到三位数
				if (k < 2) { printf("├───────────────┼────────────────────"); for (int i = 0; i < m + w; i++) { printf("┼"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┤\n"); }
				else { printf("└───────────────┴────────────────────"); for (int i = 0; i < m + w; i++) { printf("┴"); for (int i = 0; i < length_5; i++) { printf("─"); } }printf("┘\n"); }
			}
		}
	}
}

void Menu() {
	system("cls");
	printf("******************************\n");
	printf("\033[5m ");
	printf("*      运动会分数统计        *\n");
	printf("\033[0m ");
	printf("*                            *\n");
	printf("*     1. 输入学校信息        *\n");
	printf("*     2.   信息显示          *\n");
	printf("*     3.导入信息到文件       *\n");
	printf("*     4. 文件导入信息        *\n");
	printf("*     5. 查询分数信息        *\n");
	printf("*     6. 显示排序信息        *\n");
	printf("*       0. 退出系统          *\n");
	printf("******************************\n");
}

void Menu2() {
	printf("******************************\n");
	printf("\033[5m ");
	printf("*        显示类型选择        *\n");
	printf("\033[0m ");
	printf("*                            *\n");
	printf("*     1. 显示学校总分        *\n");
	printf("*     2. 显示学校项目        *\n");
	printf("*       0. 退出显示          *\n");
	printf("******************************\n");
}

void Menu3() {
	printf("******************************\n");
	printf("\033[5m] ");
	printf("*        信息查询选择        *\n");
	printf("\033[0m]");
	printf("*                            *\n");
	printf("*     1. 查询学校信息        *\n");
	printf("*     2. 查询项目信息        *\n");
	printf("*       0. 退出查询          *\n");
	printf("******************************\n");
}

void Menu4() {
	printf("******************************\n");
	printf("\033[5m ");
	printf("*       显示排序信息         *\n");
	printf("\033[0m ");
	printf("*                            *\n");
	printf("*        1. 编号             *\n");
	printf("*     2. 男子团队总分        *\n");
	printf("*     3. 女子团队总分        *\n");
	printf("*        4. 总积分           *\n");
	printf("*       0. 退出查询          *\n");
	printf("******************************\n");
}

void Menuport() {
	int input;
	while (1) {
		printf("请选择你的操作\n");
		scanf("%d", &input);
		switch (input) {
		case 1:Menu(); Add_school(); count(); break;
		case 2: {
			Menu();Menu2();
			while (1) {
				printf("请选择你的显示操作:");
				int in;
scanf("%d", &in);

				if (in == 1) { P_total(); }
				else if (in == 2) { P_event();  }
				else if (in == 0) { printf("已退出显示\n"); break; }
				else { printf("选择无效 已经退出选择\n"); break; }
			}
			break;
		}
		case 3:Menu(); Writefile(); break;
		case 4: Menu(); Infile(); count(); break;
		case 5: {
			Menu(); Menu3();
			while (1) {
				printf("请选择你的查询操作:");
				int in;
				scanf("%d", &in);

				if (in == 1) { Search_id(); }
				else if (in == 2) {
					int choice;

					printf("*****************************\n");
					printf("*     请选择要查询的信息    *\n");
					printf("*                           *\n");
					printf("*  1:男子项目  2:女子项目  *\n");
					printf("*      0:退出项目查询       *\n");
					printf("******************************\n");
					printf("\n");

					scanf("%d", &choice);
					if (choice == 1) { Search_Man_event(); }
					else if (choice == 2) { Search_Woman_event(); }
					else break;
				}
					else if (in == 0) { printf("已退出查询\n"); break; }
					else { printf("选择无效 已经退出查询\n"); break; }
				}
			
			break;
		}
		case 6: {
			Menu(); Menu4();
			while (1) {
			printf("请选择你的排序操作:");
			int in;
			scanf("%d", &in);

			if (in == 1) { Sortbyid();P_total();}
			else if (in == 2) { printf("男子团队总分排行\n\n"); SortbyMan(); }
			else if (in == 3) { printf("女子团队总分排行\n\n"); SortbyWoman(); }
			else if (in == 4) { Sortbypoint(); }
			else if (in == 0) { printf("已退出排序\n"); break; }
			else { printf("选择无效 已经退出选择\n"); break; }
		    }
			  break; 
		}
		case 0: exit(-339);
		default: printf("输入错误 请重新输入\n"); break;
		}
	}
}

int main() {
	Menu();
	Menuport();
	return 0;
}

        完整代码与前文有一些细小的出入和改动,主要是优化了一些数组越界的Bug。


3.问题反思与总结

      这个课题完成大概耗时6个小时,大部分时间是在改Bug,主要的问题有两类:1.使用顺序表,存数据时产生数据组越界,会导致数据丢失还会导致结构体内其他数据也发生改变。这个问题出现过多次,对于内存分配需要多加注意。2:对于循环变量,还是只会使用 i,j,k等通用变量,在比较复杂的循环中,代码的阅读和纠错属实眼花缭乱。其实该课题可以完善的小细节还有许多,可以装饰性的添加开场欢迎和结尾展示。菜单的优化,主菜单进入子菜单的提示与引导。实际我在代码中的引导语并不够清晰。如果还有你什么问题和建议,欢迎评论和私信。

;