当前位置: 首页 > article >正文

25.2.2学习内容

通过前序遍历和后序遍历求可能的二叉树的种数(AI生成):

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

struct TreeNode {
	char val;
	struct TreeNode *left;
	struct TreeNode *right;
};

int findIndex(char* arr, int start, int end, int target) {
	for (int i = start; i <= end; i++) {
		if (arr[i] == target) {
			return i;
		}
	}
	return -1;
}

struct TreeNode* buildHelper(char* pre, int preStart, int preEnd, char* post, int postStart, int postEnd) {
	if (preStart > preEnd) {
		return NULL;
	}
	struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	root->val = pre[preStart];
	root->left = NULL;
	root->right = NULL;
	
	if (preStart == preEnd) {
		return root;
	}
	
	int leftRootVal = pre[preStart + 1];
	int index = findIndex(post, postStart, postEnd, leftRootVal);
	if (index == -1) { 
		free(root);
		return NULL;
	}
	int leftSize = index - postStart + 1;
	
	root->left = buildHelper(pre, preStart + 1, preStart + leftSize, post, postStart, index);
	root->right = buildHelper(pre, preStart + leftSize + 1, preEnd, post, index + 1, postEnd - 1);
	
	return root;
}

struct TreeNode* constructFromPrePost(char* pre, int preSize, char* post, int postSize) {
	if (preSize == 0 || postSize == 0 || preSize != postSize) {
		return NULL;
	}
	return buildHelper(pre, 0, preSize - 1, post, 0, postSize - 1);
}
void check(struct TreeNode *L,long long int *num){
	if(L==NULL||(L->left==NULL&&L->right==NULL))return ;
	if(L->left==NULL||L->right==NULL)(*num)++;
	if(L->left!=NULL)check(L->left,num);
	if(L->right!=NULL)check(L->right,num);
}
void freeTree(struct TreeNode* root) {
	if (root == NULL) return;
	freeTree(root->left);
	freeTree(root->right);
	free(root);
}
int main(){
	int prelength,postlength;
	char pre[101],post[101];
	scanf("%100s %100s",pre,post);
	prelength=strlen(pre),postlength=strlen(post);
	struct TreeNode *L=constructFromPrePost(pre,prelength,post,postlength);
	if(L!=NULL){
		long long int num=0;
		check(L,&num);
		printf("可能的二叉树有%lld种。",(long long int)pow(2,num));
	}
	freeTree(L);
	return 0;
}

就课设的缺点的修改和升级:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Class {
	struct Student {
		char Name[50];
		char Num[20];
		int grade[10];
	} student[100], student0;
} class[10];
void print_main() {
	printf("\n         请选择需要的服务:\n");
	printf("         A.分数操作      B.查阅操作\n");
	printf("         C.信息操作      D.统计操作\n");
	printf("         注意:输入“0”将结束程序!\n         输入“help”将打开帮助指南!\n\n");
}
void help_main() {
	printf("\n                帮助指南\n");
	printf("A.分数操作\n");
	printf("通过姓名或学号增加某同学的某些平时成绩。\n");
	printf("B.查阅操作\n");
	printf("通过学号或班级序号查询某同学的一些成绩或某班的成绩。\n");
	printf("C.信息操作\n");
	printf("通过学号或姓名来增加或删除信息。\n");
	printf("D.统计操作\n");
	printf("通过一些操作来实现排序、找最大值、找最小值、求平均值、求通过率这些统计功能。\n");
}
void save_data(){
	FILE *a;
	a=fopen("file.txt","w");
	for(int i=0;i<10;i++){
		for(int j=0;j<100;j++){
			if(strlen(class[i].student[j].Name)!=0){
				fprintf(a,"%d <%s> %s %d %d %d %d %d %d %d %d %d %d\n",i+1,class[i].student[j].Name,class[i].student[j].Num,class[i].student[j].grade[0],
					class[i].student[j].grade[1],class[i].student[j].grade[2],class[i].student[j].grade[3],
					class[i].student[j].grade[4],class[i].student[j].grade[5],class[i].student[j].grade[6],
					class[i].student[j].grade[7],class[i].student[j].grade[8],class[i].student[j].grade[9]);
			}
		}
	}
	fclose(a);
}
int input_num(int *class_num) {
	char a[100];
	scanf("%s", a);
	int length = strlen(a);
	if (length > 2)return 1;
	if (length == 1 && a[0] <= '9' && a[0] >= '0') {
		*class_num = a[0] - '0';
		return *class_num;
	} else if (length == 2 && a[0] <= '9' && a[0] > '0' && a[1] <= '9' && a[1] >= '0') {
		*class_num = (a[0] - '0') * 10 + (a[1] - '0');
		return *class_num;
	} else if (length == 3 && a[0] == '1' && a[1] == '0' && a[2] == '0')return 100;
	return 1;
}
void input_num_1(int *a, int *b) {
	*a = 0,*b = 0;
	input_num(a);
	input_num(b);
}
int inquire_main(char a[], int *x, int *y) {
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 100; j++) {
			if (strcmp(class[i].student[j].Num, a) == 0 || strcmp(class[i].student[j].Name, a) == 0) {
				*x = i,*y = j;
				return 1;
			}
		}
	}
	return 0;
}
int inquire_grade(int class1, int student1, int num0) {
	if (class[class1].student[student1].grade[num0] != -1)return 1;
	else return 0;
}
int inquire_name(int class1, int *student1, char a[]) {
	for (int j = 0; j < 100; j++) {
		if (strcmp(class[class1].student[j].Num, a) == 0 || strcmp(class[class1].student[j].Name, a) == 0) {
			*student1 = j;
			return 1;
		}
	}
	return 0;
}
int inquire_class(int *class1) {
	while (1) {
		int i;
		while (1) {
			printf("请输入班级:");
			input_num(class1);
			if (*class1 > 0 && *class1 < 11)break;
			else printf("数据不合理,请重新输入!\n");
		}
		for (i = 0; i < 100; i++) {
			if (class[(*class1) -1].student[i].Name[0] != '\0')break;
		}
		if (i != 100)break;
		else {
			printf("%d班没有数据!无法查阅!\n", *class1);
			printf("是否重新输入?\nA.重新输入       B.不重新输入\n");
			while (1) {
				char d[100];
				printf("请输入:");
				scanf("%s", d);
				if ((d[0] == 'A' || d[0] == 'a') && (strlen(d) == 1))break;
				else if ((d[0] == 'B' || d[0] == 'b') && (strlen(d) == 1))return 0;
				else printf("数据不合理,请重新输入!\n");
			}
		}
	}
	return 1;
}
int inquire_number(int class1) {
	for (int i = 0; i < 100; i++) {
		if (strlen(class[class1].student[i].Name) == 0) {
			return i;
		}
	}
	return -1;
}
int input_1(int *class1, int *student1) {
	char b[21];
	while (1) {
		printf("请输入班级序号或学生学号:");
		scanf("%s", b);
		int c = strlen(b);
		if (c == 1) {
			if (b[0] > '0' && b[0] <= '9') {
				*class1 = b[0] - '0',*student1 = 0;
				return 0;
			} else if (b[0] == '0')return 1;
			else printf("数据不合理,请重新输入!\n");
		} else if (c == 2) {
			if (b[0] == '1' && b[1] == '0') {
				*class1 = 10,*student1 = 0;
				return 0;
			} else printf("数据不合理,请重新输入!\n");
		} else {
			if (inquire_main(b, class1, student1))return -1;
			else printf("该学号不存在!请重新输入!\n");
		}
	}
}
void input_2(int *class1, int *student1) {
	char c[51];
	while (1) {
		printf("请输入学生姓名或学生学号:");
		getchar();
		fgets(c, sizeof(c), stdin);
		c[strcspn(c, "\n")] = '\0';
		if (!inquire_main(c, class1, student1))printf("该学号或姓名不存在!请重新输入!\n");
		else break;
	}
}
void input_choose(int *a, int *b, int *c) {
	while (1) {
		printf("请选择输入成绩方式:\n");
		printf("A.单次输入              B.区间输入\n");
		printf("请输入:");
		char a1[100];
		scanf("%s", a1);
		if ((a1[0] == 'A' || a1[0] == 'a') && (strlen(a1) == 1)) {
			int a2 = 0;
			while (1) {
				printf("请输入次数:");
				input_num(&a2);
				if (a2 < 11 && a2 > 0)break;
				else printf("数据不合理,请重新输入!\n");
			}
			*a = a2,*b = 0,*c = 0;
			break;
		} else if ((a1[0] == 'B' || a1[0] == 'b') && (strlen(a1) == 1)) {
			int a2 = 0, a3 = 0, x = 0, y = 0;
			while (1) {
				if (!x && !y) {
					printf("请输入起始次数和终止次数(用空格隔开):");
					input_num_1(&a2, &a3);
				}
				if (x && !y) {
					printf("请重新输入终止次数:");
					input_num(&a3);
				}
				if (!x && y) {
					printf("请重新输入起始次数:");
					input_num(&a2);
				}
				if (a2 < 11 && a2 > 0)x = 1;
				if (a3 < 11 && a3 > 0)y = 1;
				if (a2 > a3)x = 0, y = 0;
				if (x && y)break;
				printf("存在数据不合理,请重新输入!\n");
			}
			*a = 0,*b = a2,*c = a3;
			break;
		} else printf("数据不合理,请重新输入!\n");
	}
}
int input_main_choose() {
	printf("是否需要多组输入?\nA.不需要      B.需要\n");
	char a[100];
	while (1) {
		printf("请输入:");
		scanf("%s", a);
		if ((a[0] == 'A' || a[0] == 'a') && (strlen(a) == 1)) {
			printf("注意:输入单个“0”将退出该操作!\n");
			return 0;
		} else if ((a[0] == 'B' || a[0] == 'b') && (strlen(a) == 1)) {
			printf("注意:输入单个“0”将停止多组输入!\n");
			return 1;
		} else printf("数据不合理,请重新输入!\n");
	}
}
void input_main_grade(int class1, int student1, int c, int *b) {
	char a[100];
	if (inquire_grade(class1, student1, c - 1)) {
		printf("第%d次成绩已存在,是否覆盖?\nA.覆盖     B.不覆盖     C.显示成绩\n", c);
		while (1) {
			printf("请输入:");
			scanf("%s", a);
			if ((a[0] == 'A' || a[0] == 'a') && (strlen(a) == 1)) {
				*b = 1;
				break;
			} else if ((a[0] == 'B' || a[0] == 'b') && (strlen(a) == 1))break;
			else if ((a[0] == 'C' || a[0] == 'c') && (strlen(a) == 1))printf("第%d次原成绩为:%d。\n请选择是否覆盖?\nA.覆盖     B.不覆盖\n", c, class[class1].student[student1].grade[c - 1]);
			else printf("数据不合理,请重新输入!\n");
		}
	} else *b = 1;
}
void input_main() {
	printf("分数操作:\n");
	int y = 0;
	y = input_main_choose();
	while (1) {
		int x, class1, student1, num1, num2, num3;
		x = input_1(&class1, &student1);
		if (x == 1)break;
		if (x != -1)input_2(&class1, &student1);
		input_choose(&num1, &num2, &num3);
		if (!num1) {
			for (int i = num2; i <= num3; i++) {
				int b = 0, temp = 0;
				long long a1;
				input_main_grade(class1, student1, i, &b);
				if (!b)continue;
				printf("请输入第%d次成绩:", i);
				a1=(long long)input_num(&temp);
				if (a1 <= 100 && a1 >= 0)class[class1].student[student1].grade[i - 1] = a1;
				else {
					printf("成绩不合理!请重新输入!\n");
					i--;
				}
			}
		} else {
			int b = 0, temp = 0;
			long long a1;
			input_main_grade(class1, student1, num1, &b);
			if (b) {
				while (1) {
					printf("请输入第%d次成绩:", num1);
					a1 = (long long)input_num(&temp);
					if (a1 <= 100 && a1 >= 0) {
						class[class1].student[student1].grade[num1 - 1] = a1;
						break;
					} else printf("成绩不合理!请重新输入!\n");
				}
			}
		}
		printf("成功!\n");
		if (y == 0)break;
	}
}
int information_input() {
	while (1) {
		int class0, n = 0, m, x;
		while (1) {
			printf("请输入班级序号:");
			input_num(&class0);
			if (class0 > 0 && class0 < 10)break;
			else printf("数据不合理!请重新输入!\n");
		}
		for (int i = 0; i < 100; i++) {
			if (class[class0 - 1].student[i].Name[0] == '\0') {
				n = 1;
				char a[50];
				printf("请输入学生姓名:");
				getchar();
				fgets(a, sizeof(a), stdin);
				a[strcspn(a, "\n")] = '\0';
				if (!inquire_name(class0 - 1, &m, a)) {
					strcpy(class[class0 - 1].student[i].Name, a);
				} else {
					inquire_name(class0 - 1, &m, a);
					printf("该班已存在同名,其信息为:\n");
					printf("姓名:%s      学号:%s\n", a, class[class0 - 1].student[m].Num);
					printf("是否新增?\nA.是     B.否\n");
					char b[101];
					while (1) {
						printf("请输入:");
						scanf("%100s", b);
						if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1))break;
						else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1)) {
							printf("新增失败!\n");
							return 0;
						} else printf("数据不合理,请重新输入!\n");
					}
				}
				while (1) {
					char c[21];
					x = class0 - 1;
					printf("请输入学生学号:");
					scanf("%20s", c);
					int s = strlen(c), s0 = 0;
					for (int i = 0; i < s; i++) {
						if (c[i] >= '0' && c[i] <= '9')s0 = 0;
						else {
							s0 = 1;
							break;
						}
					}
					if (s0) {
						printf("学号数据不合理,请重新输入!\n");
						continue;
					}
					if (!inquire_main(c, &x, &m)) {
						strcpy(class[class0 - 1].student[i].Num, c);
						break;
					} else printf("该学号已存在!请重新输入!\n");
				}
				break;
			}
		}
		if (!n)printf("%d班已经满了!\n", class0);
		else break;
	}
	save_data();
	printf("新增成功!\n");
	return 1;
}
void information_remove() {
	int x, y;
	char a[18];
	while (1) {
		printf("请输入需要删除的学生的学号:");
		scanf("%s", a);
		if (inquire_main(a, &x, &y))break;
		else printf("该学号不存在!请重新输入!\n");
	}
	class[x].student[y] = class[x].student0;
	save_data();
	printf("成功!\n");
}
void information_main() {
	printf("信息操作:\n");
	printf("请选择操作:\nA.增加信息       B.删除信息\n");
	char a[100];
	while (1) {
		printf("请输入:");
		scanf("%s", a);
		if ((a[0] == 'A' || a[0] == 'a') && (strlen(a) == 1)) {
			information_input();
			break;
		} else if ((a[0] == 'B' || a[0] == 'b') && (strlen(a) == 1)) {
			information_remove();
			break;
		} else printf("数据不合理,请重新输入!\n");
	}
}
int consult_choose() {
	printf("请选择需要的操作:\nA.查阅单人部分成绩          B.查阅单人成绩          C.查阅单班成绩\n");
	char a[100];
	while (1) {
		printf("请输入:");
		scanf("%s", a);
		if ((a[0] == 'A' || a[0] == 'a') && (strlen(a) == 1))return 1;
		else if ((a[0] == 'B' || a[0] == 'b') && (strlen(a) == 1))return 2;
		else if ((a[0] == 'C' || a[0] == 'c') && (strlen(a) == 1))return 3;
		else printf("数据不合理,请重新输入!\n");
	}
	return 0;
}
void consult_1_choose(int *a, int *b, int *c) {
	printf("请选择查询范围:\nA.单次查询       B.区间查询\n");
	int x = 0;
	char d[100];
	while (1) {
		printf("请输入:");
		scanf("%s", d);
		if ((d[0] == 'A' || d[0] == 'a') && (strlen(d) == 1)) {
			x = 1;
			break;
		} else if ((d[0] == 'B' || d[0] == 'b') && (strlen(d) == 1)) {
			x = 2;
			break;
		} else printf("数据不合理,请重新输入!\n");
	}
	if (x == 1) {
		int a2;
		while (1) {
			printf("请输入次数:");
			input_num(&a2);
			if (a2 < 11 && a2 > 0)break;
			else printf("数据不合理,请重新输入!\n");
		}
		*a = a2,*b = 0,*c = 0;
	} else {
		int a2, a3, x = 0, y = 0;
		while (1) {
			if (!x && !y) {
				printf("请输入起始次数和终止次数(用空格隔开):");
				input_num_1(&a2, &a3);
			}
			if (x && !y) {
				printf("请重新输入终止次数:");
				input_num(&a3);
			}
			if (!x && y) {
				printf("请重新输入起始次数:");
				input_num(&a2);
			}
			if (a2 < 11 && a2 > 0)x = 1;
			if (a3 < 11 && a3 > 0)y = 1;
			if (a2 > a3)x = 0, y = 0;
			if (x && y)break;
			printf("存在数据不合理,请重新输入!\n");
		}
		*a = 0,*b = a2,*c = a3;
	}
}
int consult_1() {
	int class1, student1, x = -1, y, z;
	if (!inquire_class(&class1))return 0;
	while (1) {
		printf("请输入学生姓名或学号:");
		char a[20];
		getchar();
		fgets(a, sizeof(a), stdin);
		a[strcspn(a, "\n")] = '\0';
		if (inquire_name(class1 - 1, &student1, a))break;
		else printf("该姓名或学号在该班不存在,请重新输入!\n");
	}
	consult_1_choose(&x, &y, &z);
	if (x != 0 && y == 0)printf("%s的第%d次成绩是%d。\n", class[class1 - 1].student[student1].Name, x, class[class1 - 1].student[student1].grade[x - 1]);
	else {
		printf("%s的第%d次到第%d次成绩是:", class[class1 - 1].student[student1].Name, y, z);
		for (int i = y; i <= z; i++) {
			printf("%d ", class[class1 - 1].student[student1].grade[i - 1]);
		}
	}
	printf("\n");
	return 0;
}
int consult_2() {
	int class1, student1;
	if (!inquire_class(&class1))return 0;
	while (1) {
		printf("请输入学生姓名或学号:");
		char a[20];
		getchar();
		fgets(a, sizeof(a), stdin);
		a[strcspn(a, "\n")] = '\0';
		if (inquire_name(class1 - 1, &student1, a))break;
		else printf("该姓名或学号在该班不存在,请重新输入!\n");
	}
	printf("%s的成绩是:", class[class1 - 1].student[student1].Name);
	for (int i = 0; i < 10; i++) {
		printf("%d ", class[class1 - 1].student[student1].grade[i]);
	}
	printf("\n");
	return 0;
}
int consult_3() {
	int class1;
	if (!inquire_class(&class1))return 0;
	printf("%d班的成绩为:\n", class1);
	printf("姓名                     学号                               成绩\n");
	for (int i = 0; i < 100; i++) {
		if (class[class1 - 1].student[i].Name[0] == '\0')continue;
		printf("%s", class[class1 - 1].student[i].Name);
		for (int j = 0; j < 20 - (int)strlen(class[class1 - 1].student[i].Name) && j < 14; j++) {
			printf(" ");
		}
		printf("%s", class[class1 - 1].student[i].Num);
		for (int j = 0; j < 16 - (int)strlen(class[class1 - 1].student[i].Num) && j < 14; j++) {
			printf(" ");
		}
		for (int j = 0; j < 10; j++) {
			printf("% 4d ", class[class1 - 1].student[i].grade[j]);
		}
		printf("\n");
	}
	return 0;
}
void consult_main() {
	printf("查阅操作:\n");
	int a = consult_choose();
	if (a == 1)consult_1();
	if (a == 2)consult_2();
	if (a == 3)consult_3();
}
void statistics_average_class_choose(double (*p)[2]) {
	printf("请选择查询班级的方式:A.单班查询        B.区间查询\n");
	char b[100];
	while (1) {
		printf("请输入:");
		scanf("%s", b);
		if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1)) {
			int a2;
			while (1) {
				printf("请输入班级序号:");
				input_num(&a2);
				if (a2 < 11 && a2 > 0)break;
				else printf("数据不合理,请重新输入!\n");
			}
			printf("%d班的平均值是%.2lf。\n", a2, *(*(p + (a2 - 1)) + 1));
			break;
		} else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1)) {
			int a2, a3, x = 0, y = 0;
			while (1) {
				if (!x && !y) {
					printf("请输入起始次数和终止次数(用空格隔开):");
					input_num_1(&a2, &a3);
				}
				if (x && !y) {
					printf("请重新输入终止次数:");
					input_num(&a2);
				}
				if (!x && y) {
					printf("请重新输入起始次数:");
					input_num(&a2);
				}
				if (a2 < 11 && a2 > 0)x = 1;
				if (a3 < 11 && a3 > 0)y = 1;
				if (a2 > a3)x = 0, y = 0;
				if (x && y)break;
				printf("存在数据不合理,请重新输入!\n");
			}
			for (int i = a2; i <= a3; i++) {
				printf("%d班的平均值是%.2lf。\n", i, *(*(p + (i - 1)) + 1));
			}
			break;
		} else printf("\n数据不合理,请重新输入!\n");
	}
}
void statistics_average_class_main(int a, double (*p)[2]) {
	for (int i = 0; i < 10; i++) {
		int b = 0, n = 0;
		for (int j = 0; j < 100; j++) {
			if (class[i].student[j].Name[0] == '\0')continue;
			else n++;
			for (int k = 0; k < 10; k++) {
				b += class[i].student[j].grade[k];
			}
		}
		if (n != 0) * (*(p + i) +0) = (double)(i + 1),*(*(p + i) +1) = b / (double)n;
		else *(*(p + i) +0) = (double)(i + 1),*(*(p + i) +1) = 0.0;
	}
	if (a == 1)statistics_average_class_choose(p);
}
int statistics_average_personage_choose_1(int class1, double (*p)[2]) {
	int student1, a = class1, b = 0;
	char c[100];
	while (1) {
		printf("请输入学生姓名或学生学号:");
		getchar();
		fgets(c, sizeof(c), stdin);
		c[strcspn(c, "\n")] = '\0';
		if (strlen(c) == 1) {
			if (c[0] == '0')return 0;
		}
		b = inquire_main(c, &a, &student1);
		if (!b)printf("该学号或姓名不存在!请重新输入!\n");
		else {
			if (a != class1) {
				printf("该学号或姓名存在,但不是%d班的!\n", class1 + 1);
				a = class1;
			} else break;
		}
	}
	printf("%s的平均值是%.2lf。\n", class[class1].student[student1].Name, *(*(p + student1) +1));
	return 1;
}
void statistics_average_personage_choose(int class1, double (*p)[2]) {
	printf("是否需要多组输入?\nA.不需要      B.需要\n");
	char a[100];
	while (1) {
		printf("请输入:");
		scanf("%s", a);
		if ((a[0] == 'A' || a[0] == 'a') && (strlen(a) == 1)) {
			statistics_average_personage_choose_1(class1, p);
			break;
		} else if ((a[0] == 'B' || a[0] == 'b') && (strlen(a) == 1)) {
			while (1) {
				int n = 1;
				n = statistics_average_personage_choose_1(class1, p);
				if (!n)break;
			}
			break;
		} else printf("\n数据不合理,请重新输入!\n");
	}

}
void statistics_average_personage_main(int a, int class1, double (*p)[2]) {
	for (int i = 0; i < 100; i++) {
		double b = 0;
		if (class[class1 - 1].student[i].Name[0] == '\0')continue;
		else {
			for (int j = 0; j < 10; j++) {
				b += class[class1 - 1].student[i].grade[j];
			}
			*(*(p + i) +0) = (double)(i),*(*(p + i) +1) = b / 10.0;
		}
	}
	if (a == 1)statistics_average_personage_choose(class1 - 1, p);
}
void statistics_average_main() {
	double a[10][2], c[100][2];
	printf("请选择需要求平均值的对象:\nA.班级      B.个人\n");
	char b[100];
	while (1) {
		printf("请输入:");
		scanf("%s", b);
		if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1)) {
			statistics_average_class_main(1, a);
			break;
		} else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1)) {
			int d;
			while (1) {
				printf("请输入需要求平均值的班级:");
				input_num(&d);
				if (d > 0 && d < 11)break;
				else printf("数据不合理,请重新输入!\n");
			}
			statistics_average_personage_main(1, d, c);
			break;
		} else printf("\n数据不合理,请重新输入!\n");
	}

}
void statistics_sort_class() {
	printf("注意:成绩将以每班平均分数进行排序!\n");
	double a[10][2], c = 0;
	printf("请选择排序结果形式:\nA.升序     B.降序\n");
	char b[100];
	while (1) {
		printf("请输入:");
		scanf("%s", b);
		if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1)) {
			c = 1;
			break;
		} else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1))break;
		else printf("\n数据不合理,请重新输入!\n");
	}
	statistics_average_class_main(0, a);
	for (int i = 0; i < 9; i++) {
		int k = i;
		for (int j = i + 1; j < 10; j++) {
			if (c) {
				if (a[j][1] < a[k][1])k = j;
			} else {
				if (a[j][1] > a[k][1])k = j;
			}
		}
		double t = a[k][1];
		a[k][1] = a[i][1], a[i][1] = t;
		t = a[k][0], a[k][0] = a[i][0], a[i][0] = t;
	}
	printf("班级  平均分\n");
	for (int i = 0; i < 10; i++) {
		printf("%.0lf", a[i][0]);
		for (int j = 0; j < (a[i][0] == 10 ? 4 : 5); j++) {
			printf(" ");
		}
		printf("%.2lf\n", a[i][1]);
	}
}
void statistics_sort_personage() {
	int d, c = 0;
	double a[100][2];
	for (int i = 0; i < 100; i++)a[i][0] = i;
	while (1) {
		printf("请输入需要排序的班级:");
		input_num(&d);
		if (d > 0 && d < 11)break;
		else printf("数据不合理,请重新输入!\n");
	}
	statistics_average_personage_main(0, d, a);
	printf("注意:成绩将以个人平均分数进行排序!\n");
	printf("请选择排序结果形式:\nA.升序     B.降序\n");
	char b[100];
	while (1) {
		printf("请输入:");
		scanf("%s", b);
		if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1)) {
			c = 1;
			break;
		} else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1))break;
		else printf("数据不合理,请重新输入!\n");
	}
	for (int i = 0; i < 99; i++) {
		int k = i;
		for (int j = i + 1; j < 100; j++) {
			if (c) {
				if (a[j][1] < a[k][1])k = j;
			} else {
				if (a[j][1] > a[k][1])k = j;
			}
		}
		double t = a[k][1];
		a[k][1] = a[i][1], a[i][1] = t;
		t = a[k][0], a[k][0] = a[i][0], a[i][0] = t;
	}
	printf("姓名                     学号       平均值\n");
	for (int i = 0; i < 100; i++) {
		if (class[d - 1].student[(int)(a[i][0])].Name[0] == '\0')continue;
		printf("%s", class[d - 1].student[(int)(a[i][0])].Name);
		for (int j = 0; j < 20 - (int)strlen(class[d - 1].student[(int)(a[i][0])].Name) && j < 14; j++) {
			printf(" ");
		}
		printf("%s", class[d - 1].student[(int)(a[i][0])].Num);
		for (int j = 0; j < 16 - (int)strlen(class[d - 1].student[(int)(a[i][0])].Num) && j < 14; j++) {
			printf(" ");
		}
		printf("%.2lf\n", a[i][1]);
	}
}
void statistics_sort_main() {
	printf("请选择排序对象:\nA.班级      B.个人\n");
	char b[100];
	while (1) {
		printf("请输入:");
		scanf("%s", b);
		if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1)) {
			statistics_sort_class();
			break;
		} else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1)) {
			statistics_sort_personage();
			break;
		} else printf("\n数据不合理,请重新输入!\n");
	}
}
void statistics_max_min_class(int a) {
	if (a)printf("注意:成绩最大值将以每班平均分数进行判断!\n");
	else printf("注意:成绩最小值将以每班平均分数进行判断!\n");
	double b[10][2];
	double d;
	statistics_average_class_main(0, b);
	d = b[0][1];
	if (a) {
		for (int i = 1; i < 10; i++) {
			if (b[i][1] == 0)continue;
			if (d < b[i][1])d = b[i][1];
		}
	} else {
		for (int i = 1; i < 10; i++) {
			if (b[i][1] == 0)continue;
			if (d > b[i][1])d = b[i][1];
		}
	}
	if (a)printf("最大值是%.2lf。\n", d);
	else printf("最小值是%.2lf。\n", d);
}
int statistics_max_min_personage(int a) {
	if (a)printf("注意:成绩最大值将以每个学生的平均分数进行判断!\n");
	else printf("注意:成绩最小值将以每个学生的平均分数进行判断!\n");
	double b[100][2];
	double d;
	int class1;
	if (!inquire_class(&class1))return 0;
	statistics_average_personage_main(0, class1, b);
	d = b[0][1];
	if (a)for (int i = 1; i < 100; i++) {
			if (class[class1 - 1].student[i].Name[0] == '\0')continue;
			if (d < b[i][1])d = b[i][1];
		} else {
		for (int i = 1; i < 100; i++) {
			if (class[class1 - 1].student[i].Name[0] == '\0')continue;
			if (d > b[i][1])d = b[i][1];
		}
	}
	if (a)printf("最大值是%.2lf。\n", d);
	else printf("最小值是%.2lf。\n", d);
	return 1;
}
void statistics_max_min_main(int a) {
	if (a)printf("请选择求最大值的对象:\n");
	else printf("请选择求最小值的对象:\n");
	printf("A.班级      B.个人\n");
	char b[100];
	while (1) {
		printf("请输入:");
		scanf("%s", b);
		if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1)) {
			if (a)statistics_max_min_class(1);
			else statistics_max_min_class(0);
			break;
		} else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1)) {
			if (a)statistics_max_min_personage(1);
			else statistics_max_min_personage(0);
			break;
		} else printf("数据不合理,请重新输入!\n");
	}
}
int statistics_pass_main() {
	int a = 0, class1, c = 0;
	double b[100][2], e;
	if (!inquire_class(&class1))return 0;
	statistics_average_personage_main(0, class1, b);
	for (int i = 0; i < 100; i++) {
		if (b[i][1] >= 60)a++;
		if (class[class1 - 1].student[i].Name[0] != '\0')c++;
	}
	if (c != 0)e = (a / (double)c) * 100;
	else e = 0;
	printf("%d的通过率为%.2lf%%。", class1, e);
	return 1;
}
void statistics_main() {
	printf("统计操作:\n");
	printf("请选择统计功能:\nA.排序   B.最大值   C.最少值   D.平均值   E.通过率\n");
	char b[100];
	while (1) {
		printf("请输入:");
		scanf("%s", b);
		if ((b[0] == 'A' || b[0] == 'a') && (strlen(b) == 1)) {
			statistics_sort_main();
			break;
		} else if ((b[0] == 'B' || b[0] == 'b') && (strlen(b) == 1)) {
			statistics_max_min_main(1);
			break;
		} else if ((b[0] == 'C' || b[0] == 'c') && (strlen(b) == 1)) {
			statistics_max_min_main(0);
			break;
		} else if ((b[0] == 'D' || b[0] == 'd') && (strlen(b) == 1)) {
			statistics_average_main();
			break;
		} else if ((b[0] == 'E' || b[0] == 'e') && (strlen(b) == 1)) {
			statistics_pass_main();
			break;
		} else printf("\n数据不合理,请重新输入!\n");
	}
}
int initialize() {
	FILE *a;
	a = fopen("file.txt", "r");
	if (a == NULL) {
		perror("Initialization failed\nError opening file file.txt");
		return 1;
	}
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 100; j++) {
			class[i].student0.Name[0] = '\0';
			class[i].student0.Num[0] = '\0';
			class[i].student[j].Name[0] = '\0';
			class[i].student[j].Num[0] = '\0';
			for (int k = 0; k < 10; k++) {
				class[i].student0.grade[k] = -1;
				class[i].student[j].grade[k] = -1;
			}
		}
	}
	char line[1000] = {'\0'};
	while (fgets(line, sizeof(line), a)) {
		int temp = 1, index = 0, junk = 0;
		temp = atoi(line);
		index = inquire_number(temp - 1);
		sscanf(line, "%d <%49[^>]> %s %d %d %d %d %d %d %d %d %d %d",
		       &junk, class[temp - 1].student[index].Name, class[temp - 1].student[index].Num,
		       &class[temp - 1].student[index].grade[0], &class[temp - 1].student[index].grade[1],
		       &class[temp - 1].student[index].grade[2], &class[temp - 1].student[index].grade[3],
		       &class[temp - 1].student[index].grade[4], &class[temp - 1].student[index].grade[5],
		       &class[temp - 1].student[index].grade[6], &class[temp - 1].student[index].grade[7],
		       &class[temp - 1].student[index].grade[8], &class[temp - 1].student[index].grade[9]);
		memset(line, '\0', sizeof(line));
	}
	fclose(a);
	return 0;
}
int main() {
	printf("##########学生作业完成情况管理系统##########\n");
	if (initialize())return 1;
	char a[10];
	while (1) {
		print_main();
		while (1) {
			printf("请输入:");
			scanf("%s", a);
			if (!((strlen(a) == 4) || (strlen(a) == 1))) {
				printf("数据不合理,请重新输入!\n");
				continue;
			}
			if (strlen(a) == 1) {
				if (a[0] == 'A' || a[0] == 'a') {
					input_main();
					break;
				} else if (a[0] == 'B' || a[0] == 'b') {
					consult_main();
					break;
				} else if (a[0] == 'C' || a[0] == 'c') {
					information_main();
					break;
				} else if (a[0] == 'D' || a[0] == 'd') {
					statistics_main();
					break;
				} else if (a[0] == '0')return 0;
				else printf("数据不合理,请重新输入!\n");
			} else {
				for (int i = 0; a[i] != '\0'; i++) {
					if (a[i] >= 'A' && a[i] <= 'Z')a[i] += 32;
				}
				if (strcmp(a, "help") == 0) {
					help_main();
					break;
				} else printf("数据不合理,请重新输入!\n");
			}
		}
	}
	return 0;
}

初始文件的生成:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int main() {
	FILE *a;
	a = fopen("file.txt", "w");
	if (a == NULL) {
		perror("Failed to open file");
		return 1;
	}

	srand(time(NULL));

	char surname[30][20] = {
		"Smith", "Johnson", "Williams", "Brown", "Jones", "Miller", "Davis", "Garcia", "Rodriguez", "Martinez",
		"Hernandez", "Lopez", "Gonzalez", "Wilson", "Anderson", "Thomas", "Taylor", "Moore", "Jackson", "Martin",
		"Lee", "Perez", "Thompson", "White", "Harris", "Sanchez", "Clark", "Ramirez", "Lewis", "Robinson"
	};

	char name[30][20] = {
		"James", "Mary", "John", "Patricia", "Robert", "Jennifer", "Michael", "Linda", "William", "Elizabeth",
		"David", "Barbara", "Richard", "Susan", "Joseph", "Jessica", "Charles", "Sarah", "Thomas", "Karen",
		"Christopher", "Nancy", "Daniel", "Lisa", "Matthew", "Margaret", "Anthony", "Betty", "Mark", "Dorothy"
	};
	int mark[10000] = {0};
	for (int i = 0; i < 10; i++) {
		int num_person = rand() % 6 + 48;
		for (int j = 0; j < num_person; j++) {
			char name_temp[40] = {'\0'};
			char num_temp[20] = "9832892024";
			int grade[10];
			int surname_index = rand() % 30, name_index = rand() % 30;
			strcpy(name_temp, surname[surname_index]);
			int temp = strlen(name_temp), temp_num = rand() % 9000 + 1000;
			name_temp[temp] = ' ';
			while (mark[temp_num]) {
				temp_num = rand() % 9000 + 1000;
			}
			mark[temp_num] = 1;
			for (int k = 0; k < 4; k++) {
				num_temp[9 + 4 - k] = (char)(temp_num % 10 + '0');
				temp_num /= 10;
			}
			strcat(name_temp, name[name_index]);
			int text_yes = rand() % 6 + 5, text_temp = 0;
			for (int k = 0; k < 10; k++) {
				int q = 0;
				if (text_temp < text_yes) q = 1;
				if (q) {
					if (rand() % 2) {
						grade[k] = rand() % 41 + 60;
						text_temp++;
					} else grade[k] = rand() % 50 + 10;
				} else grade[k] = rand() % 50 + 10;
			}
			fprintf(a, "%d <%s> %s %d %d %d %d %d %d %d %d %d %d\n", i + 1, name_temp, num_temp, grade[0], grade[1], grade[2], grade[3], grade[4], grade[5], grade[6], grade[7], grade[8], grade[9]);
		}
	}
	fclose(a);
	return 0;
}


http://www.kler.cn/a/530044.html

相关文章:

  • 使用Avalonia UI实现DataGrid
  • VSCode插件Live Server
  • 游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目
  • 人工智能学习(四)之机器学习基本概念
  • UE求职Demo开发日志#19 给物品找图标,实现装备增加属性,背包栏UI显示装备
  • 想品客老师的第天:类
  • C++11新特性之范围for循环
  • 使用 HTTP::Server::Simple 实现轻量级 HTTP 服务器
  • kamailio-kamctl monitor解释
  • 面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述
  • Pluto固件编译笔记
  • C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)
  • Rust 函数使用详解
  • solidity高阶 -- Eth支付
  • 快速提升网站收录:利用网站用户反馈机制
  • Python函数基础
  • 系统思考—决策
  • Python 深拷贝与浅拷贝:数据复制的奥秘及回溯算法中的应用
  • deepseek+vscode自动化测试脚本生成
  • Error: Expected a mutable image
  • C++:抽象类习题
  • 用Python替代OpenMV IDE显示openmv USB 图像
  • vscode+vue3+高得地图开发过过程中本地视频及地图json文件的发布问题
  • 算法题(55):用最少数量的箭引爆气球
  • 【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(二)
  • DeepSeek R1 简易指南:架构、本地部署和硬件要求