大一学生c语言,头都秃了


这是一个高考录取系统,假定当年该省的招生计划是:一类本科招生计划为10%;二类本科招生计划为15%;三类本科招生计划为20%;四类高职高专招生计划为25%。

img

请问为什么输出时只有总分排名中间部分的学生录取了,高分和低分的都没被录取呢 

img

 以下是代码,是不是计算招生计划的void calculate_admission_plan()这块有问题?

我想先按成绩高到低排,然后再按比例录用,请问有更好的办法吗

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

#define MAX_STUDENTS 1000 // 最大考生数量
#define MAX_PLANS 4 // 最大招生计划数量

// 考生结构体
typedef struct {
    char id[11]; // 考号
    char name[21]; // 姓名
    char gender[3]; // 性别
    char school[51]; // 学校名
    int score[7]; // 单科成绩
    int total; // 考试总分
    int admission_plan; // 录取类型,0-未录取,1-一类本科,2-二类本科,3-三类本科,4-高职高专
} Student;

// 招生计划结构体
typedef struct {
    char name[10];          // 批次名称
    double ratio;           // 招生计划比例
    int num;                // 招生计划人数
    int min_score;          // 录取最低分数线
} AdmissionPlan;

Student students[MAX_STUDENTS];
int num_students = 0;
AdmissionPlan plans[] = {{"一类", 0.1, 0, 0},{"二类", 0.15, 0, 0},{"三类", 0.2, 0, 0},{"四类高职高专", 0.25, 0, 0}};
int num_plans = sizeof(plans) / sizeof(plans[0]);

// 录入考生信息
void add_student(Student students[], int *num_students, AdmissionPlan plans[], int num_plans) {
    printf("请输入考生信息(考号 姓名 性别 学校 语文 数学 英语 物理 化学 生物):\n");
    printf("按回车键录入下一个考生,或输入0结束录入。\n");
    while (*num_students < MAX_STUDENTS) {
        scanf("%s", students[*num_students].id);
        if (strcmp(students[*num_students].id, "0") == 0) {
            break;
        }
        scanf("%s", students[*num_students].name);
        scanf("%s", students[*num_students].gender);
        scanf("%s", students[*num_students].school);
        for (int i = 0; i < 6; i++) {
            scanf("%d", &students[*num_students].score[i]);
            students[*num_students].total += students[*num_students].score[i];
        }
        (*num_students)++;
    }
}

// 按总分由高到低排序考生
void sort_students(Student students[], int num_students) {
    int i, j;
    Student temp;
    for (i = 0; i < num_students - 1; i++) {
        for (j = i + 1; j < num_students; j++) {
            if (students[i].total < students[j].total) {
                 temp = students[i];
                 students[i] = students[j];
                 students[j] = temp;
            }
       }
    }
}

// 计算招生计划
void calculate_admission_plan(AdmissionPlan plans[], int num_plans,Student students[], int num_students) {
    // 首先按总分排序
    sort_students(students, num_students);

    int i, j;
    int total_num = 0;

    for (i = 0; i < num_plans; i++) {
        total_num += plans[i].ratio * num_students;
    }

    for (i = 0; i < num_plans; i++) {
        plans[i].num = plans[i].ratio * num_students;
       if (i == num_plans - 1) {
           plans[i].num = total_num - plans[i - 1].num;
       }
    }

   int count = 0;
    for (i = 0; i < num_plans; i++) {
        int num = plans[i].num;
        while(count < num){
           students[count].admission_plan = i;
           count++;
       }
       plans[i].min_score = students[count-1].total;
    }
}


// 输出招生计划
void print_admission_plan(AdmissionPlan plans[], int num_plans) {
    int i;
    printf("招生计划如下:\n");
    for (i = 0; i < num_plans; i++) {
        printf("%s本科录取人数:%d,录取最低分数线:%d\n", plans[i].name, plans[i].num, plans[i].min_score);
    }
}

// 输出录取结果
void print_admission_result(AdmissionPlan plans[], int num_plans, Student students[], int num_students) {
    int i, j, k;
    printf("录取结果如下:\n");
    for (i = 0; i < num_plans; i++) {
        printf("%s本科录取名单:\n", plans[i].name);
        for (j = 0; j < num_students && plans[i].num > 0; j++) {
            if (students[j].admission_plan == i) {
                printf("%s %s %s %s ", students[j].id, students[j].name, students[j].gender, students[j].school);
                for (k = 0; k < 6; k++) {
                    printf("%d ", students[j].score[k]);
                }
                printf("%d\n", students[j].total);
                plans[i].num--;
            }
        }
    }
}
// 将考生信息保存到文件
void save_students(Student students[], int num_students) {
    FILE *fp;
    fp = fopen("students.txt", "w");
    if (fp == NULL) {
        printf("保存文件失败!\n");
        exit(1);
    }
    for (int i = 0; i < num_students; i++) {
        fprintf(fp, "%s %s %s %s %d %d %d %d %d %d %d %d\n",
            students[i].id, students[i].name, students[i].gender, students[i].school,
            students[i].score[0], students[i].score[1], students[i].score[2],
            students[i].score[3], students[i].score[4], students[i].score[5],
            students[i].total, students[i].admission_plan);
    }
    printf("保存文件成功!\n");
    fclose(fp);
}

// 从文件中读取考生信息
void load_students(Student students[], int *num_students) {
    FILE *fp;
    fp = fopen("students.txt", "r");
    if (fp == NULL) {
        printf("读取文件失败!\n");
        exit(1);
    }
    while (*num_students < MAX_STUDENTS && fscanf(fp, "%s %s %s %s %d %d %d %d %d %d %d %d\n",
        students[*num_students].id, students[*num_students].name, students[*num_students].gender,
        students[*num_students].school, &students[*num_students].score[0], &students[*num_students].score[1],
        &students[*num_students].score[2], &students[*num_students].score[3], &students[*num_students].score[4],
        &students[*num_students].score[5], &students[*num_students].total, &students[*num_students].admission_plan) != EOF) {
        (*num_students)++;
    }
    printf("读取文件成功!\n");
    fclose(fp);
}

// 根据考号或姓名查询考生信息
void search_student(Student students[], int num_students) {
    char keyword[21];
    printf("请输入要查询的关键字(考号或姓名):\n");
    scanf("%s", keyword);
    printf("查询结果如下:\n");
    printf("考号\t姓名\t性别\t学校\t语文\t数学\t英语\t物理\t化学\t生物\t总分\t录取类型\n");
    for (int i = 0; i < num_students; i++) {
        if (strcmp(students[i].id, keyword) == 0 || strcmp(students[i].name, keyword) == 0) {
            printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t",
                students[i].id, students[i].name, students[i].gender, students[i].school,
                students[i].score[0], students[i].score[1], students[i].score[2],
                students[i].score[3], students[i].score[4], students[i].score[5],
                students[i].total);
            switch (students[i].admission_plan) {
                case 1:
                    printf("一类本科\n");
                    break;
                case 2:
                    printf("二类本科\n");
                    break;
                case 3:
                    printf("三类本科\n");
                    break;
                case 4:
                    printf("高职高专\n");
                    break;
                default:
                    printf("未录取\n");
                    break;
            }
        }
    }
}


// 打印所有考生的信息
void print_students(Student students[], int num_students) {
    printf("考号\t姓名\t性别\t学校\t语文\t数学\t英语\t物理\t化学\t生物\t总分\t录取类型\n");
    for (int i = 0; i < num_students; i++) {
        printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t",
            students[i].id, students[i].name, students[i].gender, students[i].school,
            students[i].score[0], students[i].score[1], students[i].score[2],
            students[i].score[3], students[i].score[4], students[i].score[5],
            students[i].total);
        switch (students[i].admission_plan) {
            case 1:
                printf("一类本科\n");
                break;
            case 2:
                printf("二类本科\n");
                break;
            case 3:
                printf("三类本科\n");
                break;
            case 4:
                printf("高职高专\n");
                break;
            default:
                printf("未录取\n");
                break;
        }
    }
}

int main() {
    int choice;
    while (1) {
        printf("\n");
        printf("请选择操作:\n");
        printf("1. 录入考生信息并自动划分分数线\n");
        printf("2. 将考生信息保存到文件\n");
        printf("3. 从文件中读取考生信息\n");
        printf("4. 根据考号或姓名查询考生信息\n");
        printf("5. 对考生信息按照总分降序排序\n");
        printf("6. 打印所有考生的信息\n");
        printf("7. 退出程序\n");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                add_student(students, &num_students, plans, num_plans);
                calculate_admission_plan(plans, num_plans, students, num_students);
                sort_students(students, num_students);
                print_admission_plan(plans, num_plans);
                print_admission_result(plans, num_plans, students, num_students);
                break;
            case 2:
                save_students(students, num_students);
                break;
            case 3:
                load_students(students, &num_students);
                break;
            case 4:
                search_student(students, num_students);
                break;
            case 5:
                sort_students(students, num_students);
                printf("排序完成!\n");
                break;
            case 6:
                print_students(students, num_students);
                break;
            case 7:
                return 0;
            default:
                printf("输入错误,请重新输入!\n");
                break;
        }
    }
    return 0;
}


附成绩示例: 

 0001 谈伟杰 男 南京八中 89 81 65 94 68 73
0002 王磊磊 女 杭州十中 85 108 106 79 90 67
0003 庞柳柳 男 衡水三中 83 109 104 75 78 84
0004 钱小蓉 女 长沙九中 53 86 84 81 73 92
0005 熊莎莎 男 上海一中 109 67 72 74 85 75
0006 赵小华 女 长沙二中 98 86 63 75 73 79
0007 董小英 男 长沙二中 73 60 99 90 75 78
0008 伏晨涛 女 长沙七中 60 73 104 86 74 89
0009 王娇娇 男 深圳二中 78 105 77 77 93 85
0010 祝鹏程 女 广州二中 78 80 66 74 68 65
0011 舒晨涛 男 衡水十中 72 92 97 92 91 76
0012 庞小莉 女 衡水六中 70 108 95 88 69 93
0013 梁天泽 男 广州五中 79 76 58 94 76 88
0014 成小梅 女 长沙九中 107 83 102 84 68 66
0015 孙晨宇 男 武汉一中 89 55 92 94 85 89
0016 屈炯浩 女 杭州四中 72 53 80 67 93 70
0017 祝宇翔 男 广州八中 68 90 99 72 76 77
0018 舒一凡 女 杭州二中 86 55 85 71 83 75
0019 项炜哲 男 辽宁七中 65 95 85 83 66 67
0020 钱涵昊 女 武汉五中 85 77 66 80 80 93

TechWhizKid参考GPT回答:

img

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_STUDENTS 1000 // 最大考生数量
#define MAX_PLANS 4 // 最大招生计划数量
 
// 考生结构体
typedef struct {
    char id[20]; // 考号
    char name[50]; // 姓名
    char gender[3]; // 性别
    char school[100]; // 学校名
    int score[7]; // 单科成绩
    int total; // 考试总分
    int admission_plan; // 录取类型,0-未录取,1-一类本科,2-二类本科,3-三类本科,4-高职高专
} Student;
 
// 招生计划结构体
typedef struct {
    char name[20];          // 批次名称
    double ratio;           // 招生计划比例
    int num;                // 招生计划人数
    int min_score;          // 录取最低分数线
} AdmissionPlan;
 
Student students[MAX_STUDENTS];
int num_students = 0;
AdmissionPlan plans[] = {{"一类", 0.1, 0, 0},{"二类", 0.15, 0, 0},{"三类", 0.2, 0, 0},{"四类高职高专", 0.25, 0, 0}};
int num_plans = sizeof(plans) / sizeof(plans[0]);
 
// 录入考生信息
void add_student(Student students[], int *num_students, AdmissionPlan plans[], int num_plans) {
    printf("请输入考生信息(考号 姓名 性别 学校 语文 数学 英语 物理 化学 生物):\n");
    printf("按回车键录入下一个考生,或输入0结束录入。\n");
    while (*num_students < MAX_STUDENTS) {
        scanf("%s", students[*num_students].id);
        if (strcmp(students[*num_students].id, "0") == 0) {
            break;
        }
        scanf("%s", students[*num_students].name);
        scanf("%s", students[*num_students].gender);
        scanf("%s", students[*num_students].school);
        for (int i = 0; i < 6; i++) {
            scanf("%d", &students[*num_students].score[i]);
            students[*num_students].total += students[*num_students].score[i];
        }
        (*num_students)++;
    }
}
 
// 按总分由高到低排序考生
void sort_students(Student students[], int num_students) {
    int i, j;
    Student temp;
    for (i = 0; i < num_students - 1; i++) {
        for (j = i + 1; j < num_students; j++) {
            if (students[i].total < students[j].total) {
                 temp = students[i];
                 students[i] = students[j];
                 students[j] = temp;
            }
       }
    }
}
 
// 计算招生计划
void calculate_admission_plan(AdmissionPlan plans[], int num_plans,Student students[], int num_students) {
    // 首先按总分排序
    sort_students(students, num_students);
 
    int i, count = 0;
 
    // 对于每个招生计划
    for (i = 0; i < num_plans; i++) {
        // 计算此招生计划应该录取的人数
        plans[i].num = plans[i].ratio * num_students;
        
        // 对于此招生计划应录取的人数
        for (int j = 0; j < plans[i].num; j++) {
            // 如果已经分配完所有考生,则跳出循环
            if (count >= num_students) {
                break;
            }
            // 设置此考生的录取类型
            students[count].admission_plan = i + 1;  // 录取类型应从1开始,因为0表示未录取
            // 计数器加一
            count++;
        }
        // 设置此招生计划的最低录取分数线
        if (count > 0) {
            plans[i].min_score = students[count-1].total;
        }
    }
    // 未被录取的考生
    for (i = count; i < num_students; i++) {
        students[i].admission_plan = 0;
    }
}
 
 
 
// 输出招生计划
void print_admission_plan(AdmissionPlan plans[], int num_plans) {
    int i;
    printf("招生计划如下:\n");
    for (i = 0; i < num_plans; i++) {
        printf("%s本科录取人数:%d,录取最低分数线:%d\n", plans[i].name, plans[i].num, plans[i].min_score);
    }
}
 
// 输出录取结果
void print_admission_result(AdmissionPlan plans[], int num_plans, Student students[], int num_students) {
    int j, k;
    printf("录取结果如下:\n");
    for (int i = 0; i < num_plans; i++) {
        printf("%s本科录取名单:\n", plans[i].name);
        for (j = 0; j < num_students; j++) {
            if (students[j].admission_plan == i + 1) {
                printf("%s %s %s %s ", students[j].id, students[j].name, students[j].gender, students[j].school);
                for (k = 0; k < 6; k++) {
                    printf("%d ", students[j].score[k]);
                }
                printf("%d\n", students[j].total);
            }
        }
    }
}

// 将考生信息保存到文件
void save_students(Student students[], int num_students) {
    FILE *fp;
    fp = fopen("students.txt", "w");
    if (fp == NULL) {
        printf("保存文件失败!\n");
        exit(1);
    }
    for (int i = 0; i < num_students; i++) {
        fprintf(fp, "%s %s %s %s %d %d %d %d %d %d %d %d\n",
            students[i].id, students[i].name, students[i].gender, students[i].school,
            students[i].score[0], students[i].score[1], students[i].score[2],
            students[i].score[3], students[i].score[4], students[i].score[5],
            students[i].total, students[i].admission_plan);
    }
    printf("保存文件成功!\n");
    fclose(fp);
}
 
// 从文件中读取考生信息
void load_students(Student students[], int *num_students) {
    FILE *fp;
    fp = fopen("students.txt", "r");
    if (fp == NULL) {
        printf("读取文件失败!\n");
        exit(1);
    }
    while (*num_students < MAX_STUDENTS && fscanf(fp, "%s %s %s %s %d %d %d %d %d %d %d %d\n",
        students[*num_students].id, students[*num_students].name, students[*num_students].gender,
        students[*num_students].school, &students[*num_students].score[0], &students[*num_students].score[1],
        &students[*num_students].score[2], &students[*num_students].score[3], &students[*num_students].score[4],
        &students[*num_students].score[5], &students[*num_students].total, &students[*num_students].admission_plan) != EOF) {
        (*num_students)++;
    }
    printf("读取文件成功!\n");
    fclose(fp);
}
 
// 根据考号或姓名查询考生信息
void search_student(Student students[], int num_students) {
    char keyword[21];
    printf("请输入要查询的关键字(考号或姓名):\n");
    scanf("%s", keyword);
    printf("查询结果如下:\n");
    printf("考号\t姓名\t性别\t学校\t语文\t数学\t英语\t物理\t化学\t生物\t总分\t录取类型\n");
    for (int i = 0; i < num_students; i++) {
        if (strcmp(students[i].id, keyword) == 0 || strcmp(students[i].name, keyword) == 0) {
            printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t",
                students[i].id, students[i].name, students[i].gender, students[i].school,
                students[i].score[0], students[i].score[1], students[i].score[2],
                students[i].score[3], students[i].score[4], students[i].score[5],
                students[i].total);
            switch (students[i].admission_plan) {
                case 1:
                    printf("一类本科\n");
                    break;
                case 2:
                    printf("二类本科\n");
                    break;
                case 3:
                    printf("三类本科\n");
                    break;
                case 4:
                    printf("高职高专\n");
                    break;
                default:
                    printf("未录取\n");
                    break;
            }
        }
    }
}
 
 
// 打印所有考生的信息
void print_students(Student students[], int num_students) {
    printf("考号\t姓名\t性别\t学校\t语文\t数学\t英语\t物理\t化学\t生物\t总分\t录取类型\n");
    for (int i = 0; i < num_students; i++) {
        printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t",
            students[i].id, students[i].name, students[i].gender, students[i].school,
            students[i].score[0], students[i].score[1], students[i].score[2],
            students[i].score[3], students[i].score[4], students[i].score[5],
            students[i].total);
        switch (students[i].admission_plan) {
            case 1:
                printf("一类本科\n");
                break;
            case 2:
                printf("二类本科\n");
                break;
            case 3:
                printf("三类本科\n");
                break;
            case 4:
                printf("高职高专\n");
                break;
            default:
                printf("未录取\n");
                break;
        }
    }
}
 
int main() {
    int choice;
    while (1) {
        printf("\n");
        printf("请选择操作:\n");
        printf("1. 录入考生信息并自动划分分数线\n");
        printf("2. 将考生信息保存到文件\n");
        printf("3. 从文件中读取考生信息\n");
        printf("4. 根据考号或姓名查询考生信息\n");
        printf("5. 对考生信息按照总分降序排序\n");
        printf("6. 打印所有考生的信息\n");
        printf("7. 退出程序\n");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                add_student(students, &num_students, plans, num_plans);
                calculate_admission_plan(plans, num_plans, students, num_students);
                sort_students(students, num_students);
                print_admission_plan(plans, num_plans);
                print_admission_result(plans, num_plans, students, num_students);
                break;
            case 2:
                save_students(students, num_students);
                break;
            case 3:
                load_students(students, &num_students);
                break;
            case 4:
                search_student(students, num_students);
                break;
            case 5:
                sort_students(students, num_students);
                printf("排序完成!\n");
                break;
            case 6:
                print_students(students, num_students);
                break;
            case 7:
                return 0;
            default:
                printf("输入错误,请重新输入!\n");
                break;
        }
    }
    return 0;
}
 

录取结果没问题

img

C语言 高考录取系统

void Admission()                                                 //学生录取处理 
{
    int i,j,n;
    int Num[4];
    char temp[30]={""}; 
    Empty(); 
    read_file(FileName,STU);
    for(i=0;i<4;i++) {Num[i]=0;}                  //这里共设置了四个班级,Num中的数组就分别对应这四个班级的数目
    for(i=0;i<4;i++)                                //先对第一志愿进行排序  <strong><span style="color:#33ccff;">在进行该函数前学生的信息已经按高考分数从高到低排好</span></strong>
    {
        for(j=0;j<N;j++)
        {
            if(strcmp(voluteer[i],STU[j].NO_1)==0 && strcmp(STU[j].professional,temp)==0)//如何第一志愿是这个以及尚未被录取
            {
                strcpy(STU[j].professional,voluteer[i]);//<span style="font-family: Arial, Helvetica, sans-serif;">则将该志愿写入该生专业中</span>
                Num[i]++; //并且该专业已有人数自增1
            }
            if(Num[i]>11) break;//表示录满12人之后终止第一专业的录取
        } 
    }
    for(i=0;i<4;i++)               //<span style="font-family: Arial, Helvetica, sans-serif;">第二志愿的录取,同上</span>
    {
        n=0;
        for(j=0;j<N;j++)
        {
            if(strcmp(voluteer[i],STU[j].NO_2)==0 && strcmp(STU[j].professional,temp)==0 && Num[i]<=11)
            {
                strcpy(STU[j].professional,voluteer[i]);
                Num[i]++; 
            }
            if(Num[i]>11) break;
        } 
    }
    for(i=0;i<4;i++)          //<span style="font-family: Arial, Helvetica, sans-serif;">第三志愿的录取,同上</span>
    {
        n=0;
        for(j=0;j<N;j++)
        {
            if(strcmp(voluteer[i],STU[j].NO_3)==0 && strcmp(STU[j].professional,temp)==0 && Num[i]<=11)
            {
                strcpy(STU[j].professional,voluteer[i]);
                Num[i]++; 
            }
            if(Num[i]>11) break;
        } 
    }
    write_file(FileName,STU,N);        
} 

存在以下问题:
函数calculate_admission_plan中的变量ini没有定义,应该删去;变量total_num没有初始化,应该赋初值0;招生计划人数计算公式有误,应该是 plans[i].num = plans[i].ratio * num_students;。;招生计划人数计算有误,最后一个招生计划的人数应该是 plans[i].num = total_num - plans[i - 1].num;计算招生计划最低分数线的方法有误,应该在分配录取名单时记录最后一个被录取的考生的总分,将其作为该招生计划的最低分数线。
函数load_students中的fscanf语句的格式字符串中缺少一个%d,应该为"%s %s %s %s %d %d %d %d %d %d %d %d\n"。
函数search_student中没有考虑到当查询关键字不存在时的情况,应该加入相应的提示。
函数print_students中的switch语句缺少break语句,应该在每个case语句块的末尾添加break语句。修改后的代码如下:


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

#define MAX_STUDENTS 1000 // 最大考生数量
#define MAX_PLANS 4 // 最大招生计划数量

// 考生结构体
typedef struct {
    char id[11]; // 考号
    char name[21]; // 姓名
    char gender[3]; // 性别
    char school[51]; // 学校名
    int score[7]; // 单科成绩
    int total; // 考试总分
    int admission_plan; // 录取类型,0-未录取,1-一类本科,2-二类本科,3-三类本科,4-高职高专
} Student;

// 招生计划结构体
typedef struct {
    char name[10]; // 批次名称
    double ratio; // 招生计划比例
    int num; // 招生计划人数
    int min_score; // 录取最低分数线
} AdmissionPlan;

Student students[MAX_STUDENTS];
int num_students = 0;
AdmissionPlan plans[] = {{"一类", 0.1, 0, 0},{"二类", 0.15, 0, 0},{"三类", 0.2, 0, 0},{"四类高职高专", 0.25, 0, 0}};
int num_plans = sizeof(plans) / sizeof(plans[0]);

// 录入考生信息
void add_student(Student students[], int *num_students, AdmissionPlan plans[], int num_plans) {
    printf("请输入考生信息(考号 姓名 性别 学校 语文 数学 英语 物理 化学 生物):\n");
    printf("按回车键录入下一个考生,或输入0结束录入。\n");
    while (*num_students < MAX_STUDENTS) {
        scanf("%s", students[*num_students].id);
        if (strcmp(students[*num_students].id, "0") == 0) {
            break;
        }
        scanf("%s", students[*num_students].name);
        scanf("%s", students[*num_students].gender);
        scanf("%s", students[*num_students].school);
        for (int i = 0; i < 6; i++) {
            scanf("%d", &students[*num_students].score[i]);
            students[*num_students].total += students[*num_students].score[i];
        }
        (*num_students)++;
    }
}

// 按总分由高到低排序考生
void sort_students(Student students[], int num_students) {
    int i, j;
    Student temp;
    for (void sort_students(Student students[], int num_students) {
    int i, j;
    Student temp;
    for (i = 0; i < num_students - 1; i++) {
        for (j = i + 1; j < num_students; j++) {
            if (students[i].total < students[j].total) {
                temp = students[i];
                students[i] = students[j];
                students[j] = temp;
            }
        }
    }
}

// 计算招生计划人数和最低分数线
void calculate_admission_plan(AdmissionPlan plans[], int num_plans, Student students[], int num_students) {
    int i, j, total_num = 0;
    double ini = 1.0;
    for (i = 0; i < num_plans; i++) {
        total_num += plans[i].num = plans[i].ratio * num_students;
        plans[i].min_score = 0;
    }
    plans[num_plans - 1].num = total_num - plans[num_plans - 2].num;
    for (i = 0; i < num_plans; i++) {
        printf("计算%s招生计划最低分数线...\n", plans[i].name);
        int last_total = 0, count = 0;
        for (j = 0; j < num_students && count < plans[i].num; j++) {
            if (students[j].admission_plan == 0 && students[j].total > last_total) {
                last_total = students[j].total;
                count++;
            }
        }
        plans[i].min_score = last_total;
        printf("%s招生计划最低分数线为%d分。\n", plans[i].name, plans[i].min_score);
    }
}

// 分配录取名单
void allocate_admission_list(Student students[], int num_students, AdmissionPlan plans[], int num_plans) {
    int i, j;
    for (i = 0; i < num_plans; i++) {
        printf("开始分配%s招生计划录取名单...\n", plans[i].name);
        int count = 0;
        for (j = 0; j < num_students && count < plans[i].num; j++) {
            if (students[j].admission_plan == 0 && students[j].total >= plans[i].min_score) {
                students[j].admission_plan = i + 1;
                count++;
            }
        }
        printf("%s招生计划录取名单已分配完成。\n", plans[i].name);
    }
}

// 查询考生信息
void search_student(Student students[], int num_students) {
    char keyword[11];
    printf("请输入查询关键字(考号或姓名):");
    scanf("%s", keyword);
    for (int i = 0; i < num_students; i++) {
        if (strcmp(students[i].id, keyword) == 0 || strcmp(students[i].name, keyword) == 0) {
            printf("%s %s %s %s %d %d %d %d %d %d %d %d\n", students[i].id, students[i].name, students[i].gender, students[i].school,
                   students[i].score[0], students[i].score[1], students[i].score[2], students[i].score[3], students[i].score[4],
                   students[i].score[5], students[i].total, students[i].admission_plan);
            return;
        }
    }
    printf("没有找到与查询关键字匹配的考生信息。\n");
}

// 打印考生信息
void print_students(Student students[], int num_students) {
    int i;
    printf("考号\t姓名\t性别\t学校\t语文\t数学\t英语\t物理\t化学\t生物\t总分\t录取类型\n");
    for (i = 0; i < num_students; i++) {
        printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].gender, students[i].school,
               students[i].score[0], students[i].score[1], students[i].score[2], students[i].score[3], students[i].score[4],
               students[i].score[5], students[i].total, students[i].admission_plan);
    }
}

// 主函数
int main() {
    int choice;
    do {
        printf("请选择要执行的操作:\n");
        printf("1. 录入考生信息\n");
        printf("2. 按总分排序考生信息\n");
        printf("3. 计算招生计划人数和最低分数线\n");
        printf("4. 分配录取名单\n");
        printf("5. 查询考生信息\n");
        printf("6. 打印考生信息\n");
        printf("0. 退出程序\n");
        scanf("%d", &choice);
        switch (choice) {
        case 1:
                add_student(students, &num_students, plans, num_plans);
                break;
        case 2:
                sort_students(students, num_students);
                printf("考生信息已按总分由高到低排序。\n");
                break;
        case 3:
                calculate_admission_plan(plans, num_plans, students, num_students);
                break;
        case 4:
                allocate_admission_list(students, num_students, plans, num_plans);
                printf("录取名单已分配完成。\n");
                break;
        case 5:
                search_student(students, num_students);
                break;
        case 6:
                print_students(students, num_students);
                break;
        case 0:
                printf("程序已退出。\n");
                break;
        default:
                printf("输入有误,请重新输入。\n");
                break;
        }
} while (choice != 0);
return 0;
}