学生管理系统

#include <stdio.h>
#include <string.h> 
#define MAXSIZE 100  // 最大存储100人
#define _CRT_SECURE_NO_WARNINGS

struct Student {
    char name[20];  // 姓名
    int age;        // 年龄
    int score;      // 分数
    int num;        // 序号
} stu[MAXSIZE];

static int I = 0; // 当前学生数量

void menu();
void input();
void ddelete();
void modify();
void find();
void findall();
int add();

int main() {
    int choice1 = 0;
    while (1) {
        menu();
        scanf_s("%d", &choice1);
        switch (choice1) {
        case 1:
            input();
            break;
        case 2:
            ddelete();
            break;
        case 3:
            modify();
            break;
        case 4:
            find();
            break;
        case 5:
            if (!add()) {
                printf("插入失败,请检查插入位置。\n");
            }
            break;
        case 6:
            findall();
            break;
        case 7:
            printf("退出系统\n");
            return 0;
        default:
            printf("不存在该选项\n");
        }
    }
    return 0;
}

// 主菜单
void menu() {
    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");
    printf("  *************************\n");
}

// 输入学生信息
void input() {
    if (I < MAXSIZE) {
        printf("输入学生姓名:\n");
        scanf_s("%19s", stu[I].name, sizeof(stu[I].name)); // 使用 sizeof 计算数组大小

        printf("输入序号:\n");
        scanf_s("%d", &stu[I].num);

        printf("输入年龄:\n");
        scanf_s("%d", &stu[I].age);

        printf("输入成绩:\n");
        scanf_s("%d", &stu[I].score);
        I++;
    }
    else {
        printf("已满,无法输入\n");
    }
}

// 删除学生信息
void ddelete() {
    printf("输入序号:\n");
    int num1 = 0;
    scanf_s("%d", &num1);
    int flag = -1; // 初始化为-1以表示未找到
    for (int j = 0; j < I; j++) {
        if (stu[j].num == num1) {
            flag = j;
            break; // 找到后退出循环
        }
    }
    if (flag != -1) { // 如果找到
        for (int n = flag; n < I - 1; n++) {
            stu[n] = stu[n + 1]; // 向前移动元素
        }
        --I; // 学生数量减一

        // 更新序号
        for (int j = 0; j < I; j++) {
            stu[j].num = j + 1; // 假设序号从1开始,序号数比数组序数大1。
        }
        printf("删除成功\n");
    }
    else {
        printf("未找到该序号的学生\n");
    }
}

// 修改学生信息
void modify() {
    printf("输入序号:\n");
    int num1 = 0;
    scanf_s("%d", &num1);
    for (int j = 0; j < I; j++) {
        if (stu[j].num == num1) {
            printf("选择要修改的信息:\n1、姓名\n2、序号\n3、年龄\n4、成绩\n");
            int choice = 0;
            scanf_s("%d", &choice);
            switch (choice) {
            case 1:
                printf("输入修改后的姓名:\n");
                scanf_s("%19s", stu[j].name, sizeof(stu[j].name)); // 使用 sizeof 计算数组大小
                break;
            case 2:
                printf("输入修改后的序号:\n");
                scanf_s("%d", &stu[j].num);
                break;
            case 3:
                printf("输入修改后的年龄:\n");
                scanf_s("%d", &stu[j].age);
                break;
            case 4:
                printf("输入修改后的成绩:\n");
                scanf_s("%d", &stu[j].score);
                break;
            default:
                printf("不存在该操作,请重新选择\n");
            }
            return; // 找到并修改后直接返回
        }
    }
    printf("未找到该序号的学生\n");
}

// 查看信息
void find() {
    printf("输入序号:\n");
    int num1 = 0;
    scanf_s("%d", &num1);
    for (int i = 0; i < I; i++) {
        if (stu[i].num == num1) {
            printf("学生姓名:%s\t 学生年龄:%d\t 学生序号:%d\t 学生成绩:%d\t\n", stu[i].name, stu[i].age, stu[i].num, stu[i].score);
            return; // 找到后直接返回
        }
    }
    printf("未找到该序号的学生\n");
}

//查看总体学生信息
void findall() {
    for (int i = 0; i < I; i++) {
        printf("学生姓名:%s\t 学生年龄:%d\t 学生序号:%d\t 学生成绩:%d\t\n", stu[i].name, stu[i].age, stu[i].num, stu[i].score);
    }
}

// 插入学生信息
int add() {
    printf("输入插入的位置 (1 到 %d):\n", I + 1); // 提示用户输入的范围
    int N = 0;
    scanf_s("%d", &N);
    if (N > 0 && N <= I + 1 && I < MAXSIZE) { // 允许插入在I+1位置
        for (int j = I; j >= N; j--) {
            stu[j] = stu[j - 1]; // 向后移动元素
        }

        printf("输入学生姓名:\n");
        scanf_s("%19s", stu[N - 1].name, sizeof(stu[N - 1].name)); // 使用 sizeof 计算数组大小

        printf("输入序号(与插入位置相同):\n");
        scanf_s("%d", &stu[N - 1].num);

        printf("输入年龄:\n");
        scanf_s("%d", &stu[N - 1].age);

        printf("输入成绩:\n");
        scanf_s("%d", &stu[N - 1].score);
        I++;

        // 更新序号
        for (int j = N - 1; j < I; j++) {   //N是插入是序号数,N-1是该插入数的数组序数
            stu[j].num = j + 1; // 序号从1开始
        }
        return 1; // 插入成功
    }
    return 0; // 插入失败
}

与以往不同的是这一次用c语言写系统类题目,与c++和java不同的是c语言没有类,所以将函数定义写在最前面。

在删除和插入功能中,要分清序号数分数组序数,数组序数要比序号数小1。

scanf_s("%19s", stu[N - 1].name, sizeof(stu[N - 1].name))中:
sizeof(stu[N - 1].name)是scanf_s的第三个参数,作用是 获取 stu[N - 1].name 的大小,以字节为单位。scanf_s 要求用户在读取字符串时提供目标缓冲区的大小,以增强安全性。scanf_s 的第三个参数是必须的,用于告诉函数可写入的最大字符数,以防止溢出。

posted @ 2024-10-02 00:26  呓语-MSHK  阅读(22)  评论(0)    收藏  举报