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