编辑代码

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

#define MAX_STUDENT 100
#define FILENAME "student.dat"
#define SUBJECT_COUNT 5

typedef struct {
    char id[12];        // 学号(11位数字+结束符)
    char name[20];      // 姓名
    char gender[4];     // 性别
    int age;            // 年龄
    float scores[SUBJECT_COUNT];  // 五科成绩
    float total;        // 总分
    float avg;          // 平均分
} Student;

Student students[MAX_STUDENT];
int count = 0;
const char *subjects[] = {"语文", "数学", "英语", "物理", "化学"};

// 函数声明
void save_data();
void load_data();
void add_student();
void input_score();
void query_student();
void sort_students();
void show_failed();
void show_statistics();
void modify_student();
void delete_student();
void display_menu();
void clear_input();
void print_student(int index);
int find_student_by_id(const char *id);
int find_student_by_name(const char *name);
void swap_students(Student *a, Student *b);

int main() {
    load_data();
    int choice;
    while(1) {
        display_menu();
        printf("请输入选项:");
        while(scanf("%d", &choice) != 1) {
            clear_input();
            printf("输入错误,请重新输入:");
        }
        
        switch(choice) {
            case 1: add_student(); break;
            case 2: input_score(); break;
            case 3: query_student(); break;
            case 4: sort_students(); break;
            case 5: show_failed(); break;
            case 6: show_statistics(); break;
            case 7: modify_student(); break;
            case 8: delete_student(); break;
            case 0: save_data(); exit(0);
            default: printf("无效选项!\n");
        }
    }
    return 0;
}

void clear_input() {
    while(getchar() != '\n');
}

void save_data() {
    FILE *fp = fopen(FILENAME, "wb");
    if(fp) {
        fwrite(&count, sizeof(int), 1, fp);
        fwrite(students, sizeof(Student), count, fp);
        fclose(fp);
        printf("\n数据已保存!\n");
    } else {
        printf("文件保存失败!\n");
    }
}

void load_data() {
    FILE *fp = fopen(FILENAME, "rb");
    if(fp) {
        fread(&count, sizeof(int), 1, fp);
        fread(students, sizeof(Student), count, fp);
        fclose(fp);
        printf("数据加载成功!\n");
    }
}

void add_student() {
    if(count >= MAX_STUDENT) {
        printf("学生数量已达上限!\n");
        return;
    }
    
    Student s;
    printf("\n--- 添加学生信息 ---\n");
    
    // 学号校验
    while(1) {
        printf("学号(11位数字):");
        scanf("%11s", s.id);
        clear_input();
        
        int valid = 1;
        for(int i=0; i<strlen(s.id); i++) {
            if(!isdigit(s.id[i])) {
                valid = 0;
                break;
            }
        }
        
        if(strlen(s.id)!=11 || !valid) {
            printf("学号格式错误!\n");
            continue;
        }
        
        if(find_student_by_id(s.id) != -1) {
            printf("该学号已存在!\n");
        } else {
            break;
        }
    }
    
    printf("姓名:");
    scanf("%19s", s.name);
    clear_input();
    
    while(1) {
        printf("性别(男/女):");
        scanf("%3s", s.gender);
        clear_input();
        if(strcmp(s.gender, "男")==0 || strcmp(s.gender, "女")==0) break;
        printf("输入错误!\n");
    }
    
    while(1) {
        printf("年龄:");
        if(scanf("%d", &s.age) == 1 && s.age>0 && s.age<150) break;
        clear_input();
        printf("年龄无效!\n");
    }
    
    memset(s.scores, 0, sizeof(s.scores));
    s.total = 0;
    s.avg = 0;
    
    students[count++] = s;
    printf("添加成功!\n");
}

void input_score() {
    char id[12];
    printf("\n--- 录入成绩 ---\n");
    printf("请输入学号:");
    scanf("%11s", id);
    clear_input();
    
    int index = find_student_by_id(id);
    if(index == -1) {
        printf("未找到该学生!\n");
        return;
    }
    
    printf("正在为 %s 录入成绩:\n", students[index].name);
    
    students[index].total = 0;
    for(int j=0; j<SUBJECT_COUNT; j++) {
        while(1) {
            printf("%s成绩:", subjects[j]);
            if(scanf("%f", &students[index].scores[j]) == 1 &&
               students[index].scores[j] >=0 && students[index].scores[j] <=100) {
                break;
            }
            clear_input();
            printf("成绩应在0-100之间!\n");
        }
        students[index].total += students[index].scores[j];
    }
    students[index].avg = students[index].total / SUBJECT_COUNT;
    printf("成绩录入成功!\n");
}

void query_student() {
    if(count == 0) {
        printf("当前没有学生记录!\n");
        return;
    }
    
    int choice;
    printf("\n--- 查询学生 ---\n");
    printf("1. 按学号查询\n");
    printf("2. 按姓名查询\n");
    printf("请选择查询方式:");
    scanf("%d", &choice);
    clear_input();
    
    if(choice == 1) {
        char id[12];
        printf("请输入学号:");
        scanf("%11s", id);
        clear_input();
        
        int index = find_student_by_id(id);
        if(index != -1) {
            print_student(index);
        } else {
            printf("未找到该学生!\n");
        }
    } else if(choice == 2) {
        char name[20];
        printf("请输入姓名:");
        scanf("%19s", name);
        clear_input();
        
        int found = 0;
        for(int i=0; i<count; i++) {
            if(strstr(students[i].name, name) != NULL) {
                print_student(i);
                found = 1;
            }
        }
        if(!found) {
            printf("未找到匹配的学生!\n");
        }
    } else {
        printf("无效选择!\n");
    }
}

void sort_students() {
    if(count == 0) {
        printf("当前没有学生记录!\n");
        return;
    }
    
    // 使用冒泡排序按总分降序排列
    for(int i=0; i<count-1; i++) {
        for(int j=0; j<count-i-1; j++) {
            if(students[j].total < students[j+1].total) {
                swap_students(&students[j], &students[j+1]);
            }
        }
    }
    
    printf("\n--- 成绩排序结果 ---\n");
    for(int i=0; i<count; i++) {
        printf("%2d. %s(学号:%s) 总分:%.1f\n", 
              i+1, students[i].name, students[i].id, students[i].total);
    }
}

void show_failed() {
    if(count == 0) {
        printf("当前没有学生记录!\n");
        return;
    }
    
    printf("\n--- 不及格学生列表 ---\n");
    int found = 0;
    for(int i=0; i<count; i++) {
        if(students[i].total < 60) {
            print_student(i);
            found = 1;
        }
    }
    if(!found) {
        printf("没有不及格的学生!\n");
    }
}

void show_statistics() {
    if(count == 0) {
        printf("当前没有学生记录!\n");
        return;
    }
    
    float total_sum = 0;
    float max_total = students[0].total;
    float min_total = students[0].total;
    
    for(int i=0; i<count; i++) {
        total_sum += students[i].total;
        if(students[i].total > max_total) max_total = students[i].total;
        if(students[i].total < min_total) min_total = students[i].total;
    }
    
    printf("\n--- 班级成绩统计 ---\n");
    printf("总人数:%d人\n", count);
    printf("平均分:%.2f\n", total_sum / count);
    printf("最高分:%.2f\n", max_total);
    printf("最低分:%.2f\n", min_total);
}

void modify_student() {
    char id[12];
    printf("\n--- 修改学生信息 ---\n");
    printf("请输入要修改的学号:");
    scanf("%11s", id);
    clear_input();
    
    int index = find_student_by_id(id);
    if(index == -1) {
        printf("未找到该学生!\n");
        return;
    }
    
    printf("原姓名:%s,新姓名:", students[index].name);
    scanf("%19s", students[index].name);
    clear_input();
    
    while(1) {
        printf("原性别:%s,新性别(男/女):", students[index].gender);
        scanf("%3s", students[index].gender);
        clear_input();
        if(strcmp(students[index].gender, "男")==0 || strcmp(students[index].gender, "女")==0) break;
        printf("输入错误!\n");
    }
    
    while(1) {
        printf("原年龄:%d,新年龄:", students[index].age);
        if(scanf("%d", &students[index].age) == 1 && students[index].age>0 && students[index].age<150) break;
        clear_input();
        printf("年龄无效!\n");
    }
    
    printf("修改成功!\n");
}

void delete_student() {
    char id[12];
    printf("\n--- 删除学生信息 ---\n");
    printf("请输入要删除的学号:");
    scanf("%11s", id);
    clear_input();
    
    int index = find_student_by_id(id);
    if(index == -1) {
        printf("未找到该学生!\n");
        return;
    }
    
    for(int i=index; i<count-1; i++) {
        students[i] = students[i+1];
    }
    count--;
    printf("删除成功!\n");
}

void display_menu() {
    printf("\n========= 学生成绩管理系统 =========\n");
    printf("1. 添加学生信息\n");
    printf("2. 录入学生成绩\n");
    printf("3. 查询学生成绩\n");
    printf("4. 成绩排序\n");
    printf("5. 不及格学生\n");
    printf("6. 成绩统计\n");
    printf("7. 修改学生信息\n");
    printf("8. 删除学生信息\n");
    printf("0. 退出系统\n");
    printf("====================================\n");
}

void print_student(int index) {
    printf("\n=== 学生详细信息 ===\n");
    printf("学号:%s\n", students[index].id);
    printf("姓名:%s\n", students[index].name);
    printf("性别:%s\n", students[index].gender);
    printf("年龄:%d\n", students[index].age);
    for(int i=0; i<SUBJECT_COUNT; i++) {
        printf("%s:%.1f\t", subjects[i], students[index].scores[i]);
    }
    printf("\n总分:%.1f\t平均分:%.1f\n", students[index].total, students[index].avg);
}

int find_student_by_id(const char *id) {
    for(int i=0; i<count; i++) {
        if(strcmp(students[i].id, id) == 0) {
            return i;
        }
    }
    return -1;
}

void swap_students(Student *a, Student *b) {
    Student temp = *a;
    *a = *b;
    *b = temp;
}