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学习内容
通过前序遍历和后序遍历求可能的二叉树的种数(AI生成): #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h>struct TreeNode {char val;struct TreeNode *left;struct TreeNode *right; };…...
python算法和数据结构刷题[5]:动态规划
动态规划(Dynamic Programming, DP)是一种算法思想,用于解决具有最优子结构的问题。它通过将大问题分解为小问题,并找到这些小问题的最优解,从而得到整个问题的最优解。动态规划与分治法相似,但区别在于动态…...
Compose笔记(二)--LaunchedEffect
这一节了解一下LaunchedEffect,在 Jetpack Compose 里,LaunchedEffect是一种用于启动协程的可组合函数,其主要用途是在协程里执行异步操作。LaunchedEffect函数能够接收一个或多个key参数。 1 key的含义: LaunchedEffect函数的key参数指的是…...
QT知识点复习
1.qt核心机制 对象树、信号和槽、事件机制 2.对象树的作用 优化了内存回收机制。子对象实例化的时候,被父对象放对象树上,父对象释放内存,子对象也释放内存 3.信号和槽的作用 实现多个组件之间的通讯 4.信号和槽的几种连接方式 1.UI界面提…...
【Rust自学】16.2. 使用消息传递来跨线程传递数据
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 16.2.1. 消息传递 有一种很流行而且能保证安全并发的技术(或者叫机制)叫做消息传递。在这种机制里,线…...
Python 合并 Excel 单元格
合并 Excel 单元格是 Excel 数据处理和表格设计中的一项常用操作。例如,在制作表格标题时,经常会将多个单元格合并,使标题能够跨列显示,更加醒目和美观。此外,当对数据进行分类时,为了使同一类别的数据在视…...
解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智…...
利用腾讯云cloud studio云端免费部署deepseek-R1
1. cloud studio 1.1 cloud studio介绍 Cloud Studio(云端 IDE)是基于浏览器的集成式开发环境,为开发者提供了一个稳定的云端工作站。支持CPU与GPU的访问。用户在使用 Cloud Studio 时无需安装,随时随地打开浏览器即可使用。Clo…...
2025年Android开发趋势全景解读
文章目录 一、界面开发:从"手写代码"到"智能拼装"二、AI融合开发:无需炼丹的普惠智能三、车机开发:手机开发者的新蓝海(车企需求拆解)四、生存技能升级:开发者转型路线图五、避坑指南&…...
PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序
设计一个基于多个带标签SparkSQL模板作为配置文件和多组参数的PySPARK代码程序,实现根据不同的输入参数自动批量地将数据导出为Parquet、CSV和Excel文件到S3上,标签和多个参数(以“_”分割)为组成导出数据文件名,文件已…...
DeepSeek r1本地安装全指南
环境基本要求 硬件配置 需要本地跑模型,兼顾质量、性能、速度以及满足日常开发需要,我们需要准备以下硬件: CPU:I9内存:128GB硬盘:3-4TB 最新SSD,C盘确保有400GB,其它都可划成D盘…...
《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!
摘要 本博客全面解析了 C 中指针与空值的相关知识,从基础概念到现代 C 的改进展开,涵盖了空指针的定义、表示方式、使用场景以及常见注意事项。同时,深入探讨了 nullptr 的引入及智能指针在提升代码安全性和简化内存管理方面的优势。通过实际…...
陆游的《诗人苦学说》:从藻绘到“功夫在诗外”(中英双语)mastery lies beyond poetry
陆游的《诗人苦学说》:从藻绘到“功夫在诗外” 今天看万维钢的《万万没想到》一书,看到陆游的功夫在诗外的句子,特意去查找这首诗的原文。故而有此文。 我国学人还往往过分强调“功夫在诗外”这句陆游的名言,认为提升综合素质是一…...
shell编程(1)——shell介绍
1、shell编程 shell是操作系统的终端命令行,可以理解为人机交互的一种方式,软件系统提供给用户操作的命令行界面,解释执行用户输入的命令或程序。程序员常见的就是命令行终端,通过命令来和操作系统交互。shell脚本:是…...
基于VMware的ubuntu与vscode建立ssh连接
1.首先安装openssh服务 sudo apt update sudo apt install openssh-server -y 2.启动并检查ssh服务状态 到这里可以按q退出 之后输入命令 : ip a 红色挡住的部分就是我们要的地址,这里就不展示了哈 3.配置vscode 打开vscode 搜索并安装:…...
【LLM-agent】(task2)用llama-index搭建AI Agent
note LlamaIndex 实现 Agent 需要导入 ReActAgent 和 Function Tool,循环执行:推理、行动、观察、优化推理、重复进行。可以在 arize_phoenix 中看到 agent 的具体提示词,工具被装换成了提示词ReActAgent 使得业务自动向代码转换成为可能&am…...
【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用
Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列、排行榜等场景。在面试中,Redis 是一个高频话题,尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么?它的主要特点是什么? 答案&a…...
FastExcel使用详解
文章目录 FastExcel使用详解一、引言二、环境准备与依赖引入1、Maven 依赖引入2、实体类定义 三、核心操作:读写 Excel1、读取 Excel1.1 自定义监听器1.2 读取文件 2、写入 Excel2.1 简单写入2.2 模板写入 四、Spring Boot 集成示例1、文件上传(导入&…...
图漾相机——C++语言属性设置
文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置(TY_TRIGGER_PARAM_EX)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 系统中如何开启“任何来源”以解决安装报错问题? 大家好!今天我们来聊聊在使用 macOS 系统 时,遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时,因为 macOS 会默认阻止不明开发者的…...
网站快速收录:利用网站评论系统增加曝光
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/40.html 利用网站评论系统增加曝光,是提升网站快速收录的有效途径之一。以下是一些详细策略,旨在通过优化和利用评论系统来增强网站的可见性和互动性: 一…...
实验十 Servlet(一)
实验十 Servlet(一) 【实验目的】 1.了解Servlet运行原理 2.掌握Servlet实现方式 【实验内容】 1、参考课堂例子,客户端通过login.jsp发出登录请求,请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功,…...
MyBatis-Plus笔记-快速入门
大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...
Node.js MySQL:深度解析与最佳实践
Node.js MySQL:深度解析与最佳实践 引言 Node.js作为一种流行的JavaScript运行时环境,以其轻量级、高性能和事件驱动模型受到开发者的青睐。MySQL则是一款功能强大的关系型数据库管理系统,广泛应用于各种规模的应用程序中。本文将深入探讨Node.js与MySQL的集成,分析其优势…...
《超自然》:科学与灵性融合的自我转变之路
在现代社会中,许多人开始探寻自我成长、身心疗愈与灵性提升的可能性。Bestselling author Dr. Joe Dispenza 的《超自然:普通人如何创造非凡人生》正是在这样的大背景下问世的。书中既融合了量子物理、神经科学和表观遗传学的前沿理论,又吸收…...
JAVA内置类使用方法记录
Array数组 普通数组是基本类型,例如int[] 就像是;一个装着元素排列整齐的盒子,他没有size(),length()等方法,但是存在length属性。 Array.sort() 这是专门排序数组的方法,但是前提是你必须给数组存储的元素…...
《Origin画百图》之脊线图
1.数据准备:将数据设置为y 2.选择绘图>统计图>脊线图 3.生成基础图形,并不好看,接下来对图形属性进行设置 4.双击图形>选择图案>颜色选择按点>Y值 5.这里发现颜色有色阶,过度并不平滑,需要对色阶进行更…...
w189电商平台的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
c++ string类 +底层模拟实现
提醒: 本片博客只是小编的听课笔记,介意勿看。 基础 包含在头文件<string>,才能使用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…...
