通过前序遍历和后序遍历求可能的二叉树的种数(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;
}