You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.8 KiB

Simple-Information-Management-System

#include "student.h" #include <stdio.h> #include <string.h> // 用于清空输入缓冲区

int main() { SqList L = {0}; // 初始化空表 printf("简易学生信息管理系统 - 姓名:你的姓名\n");

while (1) {
    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("请选择功能:");

    int choice;
    if (scanf("%d", &choice) != 1) { // 输入非数字处理
        printf("输入错误!请输入数字选项\n");
        while (getchar() != '\n'); // 清空输入缓冲区
        continue;
    }

    switch (choice) {
        case 1: { // 功能1输入学生信息
            int n;
            printf("请输入学生个数(不超过%d", 100 - L.length);
            if (scanf("%d", &n) != 1) {
                printf("输入错误!请输入有效数字\n");
                while (getchar() != '\n');
                break;
            }
            if (n <= 0) {
                printf("人数必须为正整数!\n");
                break;
            }
            InputStudents(&L, n); // 调用输入函数
            break;
        }

        case 2: { // 功能2显示所有学生信息
            if (L.length == 0) {
                printf("当前没有学生信息!\n");
                break;
            }
            PrintStudents(L); // 调用显示函数
            break;
        }

        case 3: { // 功能3插入学生信息
            int pos;
            Student s;

            // 输入位置
            printf("请输入插入位置1~%d", L.length + 1);
            if (scanf("%d", &pos) != 1) {
                printf("位置输入错误!\n");
                while (getchar() != '\n');
                break;
            }
            if (pos < 1 || pos > L.length + 1) {
                printf("位置非法有效范围1~%d\n", L.length + 1);
                break;
            }

            // 输入学生信息
            printf("请输入要插入的学生信息(学号 姓名 成绩):");
            if (scanf("%d %s %f", &s.sid, s.name, &s.score) != 3) {
                printf("信息格式错误!\n");
                while (getchar() != '\n');
                break;
            }

            // 执行插入
            if (InsertStudent(&L, pos, s)) {
                printf("插入成功!\n");
            } else {
                printf("插入失败!顺序表已满或位置非法\n");
            }
            break;
        }

        case 4: { // 功能4删除指定位置学生
            int pos;
            printf("请输入删除位置1~%d", L.length);
            if (scanf("%d", &pos) != 1) {
                printf("位置输入错误!\n");
                while (getchar() != '\n');
                break;
            }
            if (pos < 1 || pos > L.length) {
                printf("位置非法有效范围1~%d\n", L.length);
                break;
            }
            if (DeleteStudent(&L, pos)) {
                printf("删除成功!\n");
            } else {
                printf("删除失败!\n");
            }
            break;
        }

        case 5: { // 功能5统计学生个数
            int count = GetStudentCount(L);
            printf("当前学生人数:%d\n", count);
            break;
        }

        case 6: { // 功能6按姓名排序直接插入排序
            if (L.length <= 1) {
                printf("无需排序学生数≤1\n");
                break;
            }
            InsertSortByName(&L);
            printf("按姓名排序完成!\n");
            break;
        }

        case 7: { // 功能7按学号排序快速排序
            if (L.length <= 1) {
                printf("无需排序学生数≤1\n");
                break;
            }
            QuickSortBySid(&L);
            printf("按学号排序完成!\n");
            break;
        }
        case 8: { // 功能8按学号查找折半查找
            if (L.length == 0) {
                printf("无学生信息!\n");
                break;
            }
            // 查找前必须先按学号排序(折半查找要求有序)
            QuickSortBySid(&L); // 先排序确保有序
            int target_sid;
            printf("请输入要查找的学号:");
            if (scanf("%d", &target_sid) != 1) {
                printf("学号输入错误!\n");
                while (getchar() != '\n');
                break;
            }
            Student *s = BinarySearch(L, target_sid);
            if (s != NULL) {
                printf("查找成功!姓名:%s成绩%.1f\n", s->name, s->score);
            } else {
                printf("未找到该学号的学生!\n");
            }
            break;
        }

        case 0: { // 退出系统
            printf("系统已退出,再见!\n");
            return 0;
        }

        default:
            printf("无效选项!请重新输入\n");
    }
}

}