当前位置: 首页 > 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;
}

相关文章:

25.2.2学习内容

通过前序遍历和后序遍历求可能的二叉树的种数&#xff08;AI生成&#xff09;&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h>struct TreeNode {char val;struct TreeNode *left;struct TreeNode *right; };…...

python算法和数据结构刷题[5]:动态规划

动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种算法思想&#xff0c;用于解决具有最优子结构的问题。它通过将大问题分解为小问题&#xff0c;并找到这些小问题的最优解&#xff0c;从而得到整个问题的最优解。动态规划与分治法相似&#xff0c;但区别在于动态…...

Compose笔记(二)--LaunchedEffect

这一节了解一下LaunchedEffect&#xff0c;在 Jetpack Compose 里&#xff0c;LaunchedEffect是一种用于启动协程的可组合函数&#xff0c;其主要用途是在协程里执行异步操作。LaunchedEffect函数能够接收一个或多个key参数。 1 key的含义: LaunchedEffect函数的key参数指的是…...

QT知识点复习

1.qt核心机制 对象树、信号和槽、事件机制 2.对象树的作用 优化了内存回收机制。子对象实例化的时候&#xff0c;被父对象放对象树上&#xff0c;父对象释放内存&#xff0c;子对象也释放内存 3.信号和槽的作用 实现多个组件之间的通讯 4.信号和槽的几种连接方式 1.UI界面提…...

【Rust自学】16.2. 使用消息传递来跨线程传递数据

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 16.2.1. 消息传递 有一种很流行而且能保证安全并发的技术&#xff08;或者叫机制&#xff09;叫做消息传递。在这种机制里&#xff0c;线…...

Python 合并 Excel 单元格

合并 Excel 单元格是 Excel 数据处理和表格设计中的一项常用操作。例如&#xff0c;在制作表格标题时&#xff0c;经常会将多个单元格合并&#xff0c;使标题能够跨列显示&#xff0c;更加醒目和美观。此外&#xff0c;当对数据进行分类时&#xff0c;为了使同一类别的数据在视…...

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后&#xff0c;本文将介绍如何使用 OpenCV 对这些海报进行智…...

利用腾讯云cloud studio云端免费部署deepseek-R1

1. cloud studio 1.1 cloud studio介绍 Cloud Studio&#xff08;云端 IDE&#xff09;是基于浏览器的集成式开发环境&#xff0c;为开发者提供了一个稳定的云端工作站。支持CPU与GPU的访问。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器即可使用。Clo…...

2025年Android开发趋势全景解读

文章目录 一、界面开发&#xff1a;从"手写代码"到"智能拼装"二、AI融合开发&#xff1a;无需炼丹的普惠智能三、车机开发&#xff1a;手机开发者的新蓝海&#xff08;车企需求拆解&#xff09;四、生存技能升级&#xff1a;开发者转型路线图五、避坑指南&…...

PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序

设计一个基于多个带标签SparkSQL模板作为配置文件和多组参数的PySPARK代码程序&#xff0c;实现根据不同的输入参数自动批量地将数据导出为Parquet、CSV和Excel文件到S3上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出数据文件名&#xff0c;文件已…...

DeepSeek r1本地安装全指南

环境基本要求 硬件配置 需要本地跑模型&#xff0c;兼顾质量、性能、速度以及满足日常开发需要&#xff0c;我们需要准备以下硬件&#xff1a; CPU&#xff1a;I9内存&#xff1a;128GB硬盘&#xff1a;3-4TB 最新SSD&#xff0c;C盘确保有400GB&#xff0c;其它都可划成D盘…...

《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!

摘要 本博客全面解析了 C 中指针与空值的相关知识&#xff0c;从基础概念到现代 C 的改进展开&#xff0c;涵盖了空指针的定义、表示方式、使用场景以及常见注意事项。同时&#xff0c;深入探讨了 nullptr 的引入及智能指针在提升代码安全性和简化内存管理方面的优势。通过实际…...

陆游的《诗人苦学说》:从藻绘到“功夫在诗外”(中英双语)mastery lies beyond poetry

陆游的《诗人苦学说》&#xff1a;从藻绘到“功夫在诗外” 今天看万维钢的《万万没想到》一书&#xff0c;看到陆游的功夫在诗外的句子&#xff0c;特意去查找这首诗的原文。故而有此文。 我国学人还往往过分强调“功夫在诗外”这句陆游的名言&#xff0c;认为提升综合素质是一…...

shell编程(1)——shell介绍

1、shell编程 shell是操作系统的终端命令行&#xff0c;可以理解为人机交互的一种方式&#xff0c;软件系统提供给用户操作的命令行界面&#xff0c;解释执行用户输入的命令或程序。程序员常见的就是命令行终端&#xff0c;通过命令来和操作系统交互。shell脚本&#xff1a;是…...

基于VMware的ubuntu与vscode建立ssh连接

1.首先安装openssh服务 sudo apt update sudo apt install openssh-server -y 2.启动并检查ssh服务状态 到这里可以按q退出 之后输入命令 &#xff1a; ip a 红色挡住的部分就是我们要的地址&#xff0c;这里就不展示了哈 3.配置vscode 打开vscode 搜索并安装&#xff1a;…...

【LLM-agent】(task2)用llama-index搭建AI Agent

note LlamaIndex 实现 Agent 需要导入 ReActAgent 和 Function Tool&#xff0c;循环执行&#xff1a;推理、行动、观察、优化推理、重复进行。可以在 arize_phoenix 中看到 agent 的具体提示词&#xff0c;工具被装换成了提示词ReActAgent 使得业务自动向代码转换成为可能&am…...

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

Redis 是一个高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。在面试中&#xff0c;Redis 是一个高频话题&#xff0c;尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f; 答案&a…...

FastExcel使用详解

文章目录 FastExcel使用详解一、引言二、环境准备与依赖引入1、Maven 依赖引入2、实体类定义 三、核心操作&#xff1a;读写 Excel1、读取 Excel1.1 自定义监听器1.2 读取文件 2、写入 Excel2.1 简单写入2.2 模板写入 四、Spring Boot 集成示例1、文件上传&#xff08;导入&…...

图漾相机——C++语言属性设置

文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置&#xff08;TY_TRIGGER_PARAM_EX&#xff09;1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…...

解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题

macOS 系统中如何开启“任何来源”以解决安装报错问题&#xff1f; 大家好&#xff01;今天我们来聊聊在使用 macOS 系统 时&#xff0c;遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时&#xff0c;因为 macOS 会默认阻止不明开发者的…...

网站快速收录:利用网站评论系统增加曝光

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/40.html 利用网站评论系统增加曝光&#xff0c;是提升网站快速收录的有效途径之一。以下是一些详细策略&#xff0c;旨在通过优化和利用评论系统来增强网站的可见性和互动性&#xff1a; 一…...

实验十 Servlet(一)

实验十 Servlet(一) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 1、参考课堂例子&#xff0c;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功&#xff0c…...

MyBatis-Plus笔记-快速入门

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...

Node.js MySQL:深度解析与最佳实践

Node.js MySQL:深度解析与最佳实践 引言 Node.js作为一种流行的JavaScript运行时环境,以其轻量级、高性能和事件驱动模型受到开发者的青睐。MySQL则是一款功能强大的关系型数据库管理系统,广泛应用于各种规模的应用程序中。本文将深入探讨Node.js与MySQL的集成,分析其优势…...

《超自然》:科学与灵性融合的自我转变之路

在现代社会中&#xff0c;许多人开始探寻自我成长、身心疗愈与灵性提升的可能性。Bestselling author Dr. Joe Dispenza 的《超自然&#xff1a;普通人如何创造非凡人生》正是在这样的大背景下问世的。书中既融合了量子物理、神经科学和表观遗传学的前沿理论&#xff0c;又吸收…...

JAVA内置类使用方法记录

Array数组 普通数组是基本类型&#xff0c;例如int[] 就像是&#xff1b;一个装着元素排列整齐的盒子&#xff0c;他没有size()&#xff0c;length()等方法&#xff0c;但是存在length属性。 Array.sort() 这是专门排序数组的方法&#xff0c;但是前提是你必须给数组存储的元素…...

《Origin画百图》之脊线图

1.数据准备&#xff1a;将数据设置为y 2.选择绘图>统计图>脊线图 3.生成基础图形&#xff0c;并不好看&#xff0c;接下来对图形属性进行设置 4.双击图形>选择图案>颜色选择按点>Y值 5.这里发现颜色有色阶&#xff0c;过度并不平滑&#xff0c;需要对色阶进行更…...

w189电商平台的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

c++ string类 +底层模拟实现

提醒: 本片博客只是小编的听课笔记&#xff0c;介意勿看。 基础 包含在头文件<string>&#xff0c;才能使用string类似函数接口。 string常见构造类 string s1; cin>>s1;//无参构造 string s2(s1);//拷贝构造 string s1("jfksa");//传参构造 三种…...

让banner.txt可以自动读取项目版本

文章目录 1.sunrays-dependencies1.配置插件2.pluginManagement统一指定版本 2.common-log4j2-starter1.banner.txt使用$ 符号取出2.查看效果 1.sunrays-dependencies 1.配置插件 <!-- 为了让banner.txt自动获取版本号 --><plugin><groupId>org.apache.mave…...