C语言实现学生管理系统小demo

这是一个 学生管理系统,它使用 C 语言 实现了基本的管理员登录和学生信息管理功能,包括增、删、改、查等操作。适合基础入门。免费下载链接(普通版)免费下载链接(进阶版)

主要功能

  1. 管理员登录

    • 存储多个管理员信息(账号+密码)。
    • 用户输入账号和密码进行匹配,成功则进入系统。
  2. 菜单功能

    • 显示可选操作:查询所有学生、查询单个学生、添加、修改、删除学生等。
    • 用户输入对应编号来执行操作。
  3. 学生管理

    • :手动输入学号、姓名、性别、地址等信息,添加到学生数组。
    • :根据 ID 删除学生,并调整数组数据。
    • :输入 ID 先查询是否存在,然后修改信息。
      • 全部查询:输出所有学生信息。
      • 单个查询:输入 ID 查询对应学生。
#include <stdio.h>
#include <stdbool.h>//bool  类型库,true/false
#include <string.h>//字符串操作  库
#include <stdlib.h>//工具库
//宏 计算数组长度的表达式
#define LENGTH(array) (sizeof(array)/sizeof(array[0]))
//定义学员数组的元素个数
#define STUDENT_SIZE 7

//初始化管理员
//1.管理员的结构体
struct admin
{
    //id 唯一标识符
    int id;
    //名字  字符串
    char *username;
    //密码  字符串
    char *password;
};

//2.定义一个全局变量,保存管理员数组,因为下面有多个函数需要用到管理员数组
struct admin admin_array[3];

//7.定义学员的结构体
struct student
{
    //id 唯一标识符
    int id;
    //学号
    char *sno;
    //姓名
    char *sname;
    //性别
    int gender;
    //住址
    char *address;
};
//8.学员数组
struct student student_array[STUDENT_SIZE];
//9.数组中学员的实际个数
int size=0;


//3.声明函数:初始化管理员数组,给管理员数组赋值
void init_admin_array();

//4.声明函数:打印管理员数组
void print_admin_array();

//5.登录函数声明,返回bool类型,true登录成功,false登录失败
bool admin_login();

//6.菜单展示,管理员操作的提示界面
void show_menu();

//10.初始化学员数组
void init_student_array();

//11.查询所有学员
void show_student_array();

//12.查询单个学员
void show_student_array_id();

//13.通过id找到学员 的对应index索引
int get_student_index(int id);

//14.修改学员信息
void update_student();

//15.删除学员信息
void delete_student();

//16.新增学员
void add_student();

int main(int argc, char const *argv[])
{
    //调用初始化管理员数组的函数,程序一致性就有管理数组,并且数组中有数据
    init_admin_array();
    //初始化学员数组
    init_student_array();
    //打印
    print_admin_array();
    //登录
    bool login_state=admin_login();
    if (login_state)
    {
        printf("登录成功\n");
        //显示菜单
        show_menu();
    }else
    {
        printf("账号或者密码错误\n");
    }
    
    return 0;
}

//3.定义函数:初始化管理员数组,给管理员数组赋值
void init_admin_array(){
    //将管理员的信息存储到管理员数组中
    struct admin a1={1,"admin1","123"};
    struct admin a2={2,"admin2","123"};
    struct admin a3={3,"admin3","123"};

    //存储到数组中
    admin_array[0]=a1;
    admin_array[1]=a2;
    admin_array[2]=a3;

}

//4.定义函数:打印管理员数组
void print_admin_array(){
    //表头
    printf("ID\t姓名\t密码\t\n");
    //遍历管理员数组
    for (int i = 0; i < LENGTH(admin_array); i++)
    {
        struct admin a=admin_array[i];
        printf("%d\t%s\t%s\t\n",a.id,a.username,a.password);
    }    
}

//5.登录函数声明,返回bool类型,true登录成功,false登录失败
bool admin_login(){
    printf("欢迎使用学员管理系统\n");
    printf("登录\n");
    printf("请输入用户名和密码(用空格隔开):\n");
    char username[20];
    char password[10];
    scanf("%s %s",username,password);//数组名具有数组指针的作用
    //判断管理员账号和密码是否正确
    for (int i = 0; i < LENGTH(admin_array); i++)
    {
        struct admin a=admin_array[i];
        //判断账号和密码都要匹配
        if (
            !strcmp(a.username,username)
            &&
            !strcmp(a.password,password)
        )
        {   
            printf("欢迎%s",a.username);
            return true;//登录成功
        } 
    }
    //循环结束  都没有return true;说明用户输入的账号和密码不匹配
    return false;//登录失败
}

//6.菜单展示,管理员操作的提示界面
void show_menu(){
    //输出菜单提示
    printf("1 查询所有学生信息\n");
    printf("2 查询单个学生信息\n");
    printf("3 添加学生信息\n");
    printf("4 修改学生信息\n");
    printf("5 删除单个学员信息\n");
    printf("-1 退出系统\n");
    printf("输入选择的编号:\n");

    //接收用户输入
    int opr_no=0;
    scanf("%d",&opr_no);
    //根据用户数输入来操作
    switch (opr_no)
    {
    case 1:
        //1 查询所有学生信息
        show_student_array();
        break;
    case 2:
        //2 查询单个学生信息
        show_student_array_id();
        break;
    case 3:
        //3 添加学生信息
        add_student();
        break;
    case 4:
        //4 修改学生信息
        update_student();
        break;
    case 5:
        //5 删除单个学员信息
        delete_student();
        break;
    case -1:
        //-1 退出系统
        //正常退出
        printf("欢迎下次使用\n");
        exit(EXIT_SUCCESS);//程序结束
        break;
    default:
        printf("功能开发中,尽请期待......\n");
        //异常退出
        exit(EXIT_FAILURE);//程序结束
        break;
    }
}


//10.初始化学员数组
void init_student_array(){
    struct student s1={1,"s001","河北的老师",0,"东京银座"};
    struct student s2={2,"s002","san上的老师",0,"东京不太冷"};
    struct student s3={3,"s003","天上的老师",0,"斯国一"};
    struct student s4={4,"s004","春天桃花开",0,"本州岛"};
    struct student s5={5,"s005","松下的老师",0,"东京"};
    student_array[0]=s1;
    student_array[1]=s2;
    student_array[2]=s3;
    student_array[3]=s4;
    student_array[4]=s5;
    //初始化 学员实际个数为5
    size=5;
}

//11.查询所有学员
void show_student_array(){
    //表头
    printf("ID\t学号\t姓名\t性别\t地址\t\n");
    //遍历展示所有学员信息,遍历真实的学员信息
    for (int i = 0; i < size; i++)
    {
        struct student s=student_array[i];
        char *gender_string=s.gender?"男":"女";
        printf("%d\t%s\t%s\t%s\t%s\t\n",s.id,s.sno,s.sname,gender_string,s.address);
    }
    //继续展示菜单,让用户能够继续操作其他选项
    show_menu();
}

//12.查询单个学员
void show_student_array_id(){
    //请输入学员的ID
    printf("请输入学员的ID:\n");
    int id=0;
    scanf("%d",&id);
    //遍历学员数组,查询是否存在该ID的学员
    struct student s_temp={0};
    for (int i = 0; i < size; i++)
    {
        struct student s=student_array[i];
        //根据id判断
        if (id==s.id)
        {
            s_temp=s;
            break;//找到了学员,结束循环
        }
    }
    //判断是否找到学员
    if (s_temp.id!=0)
    {
        //找打了学员,展示管理员看
        printf("ID\t学号\t姓名\t性别\t地址\t\n");
        char *gender_string=s_temp.gender?"男":"女";
        printf("%d\t%s\t%s\t%s\t%s\t\n",s_temp.id,s_temp.sno,s_temp.sname,gender_string,s_temp.address);
    }else
    {
        //没有找到学员
        printf("不存在ID=%d的学员\n",id);
    }
    //调用菜单
    show_menu();
}

//13.通过id找到学员 的对应index索引
int get_student_index(int id){
    for (int i = 0; i < size; i++)
    {
        struct student s=student_array[i];
        //根据id判断
        if (id==s.id)
        {
            return i;
        }
    }
    //不存在 返回-1,索引是从0开始
    return -1;
}

//14.修改学员信息
/*
两种修改方案:
第一种:管理员一次输入 修改后的学员的id、姓名等学员信息,好处用户只需要输入一次,坏处用户如果输入的id不存在,那么姓名等内容就是无效输入
第二种:管理员输入2次,第一次输入学员id,判断学员是否存在,第二次 学员id存在才输入修改后的姓名等信息,坏处管理员输入两次,好处不会产生无效输入,管理员是确认学员存在才修改的
*/
//采用第二种方案
void update_student(){
    //管理员输入学员ID
    printf("请输入学员ID:\n");
    int id=0;
    scanf("%d",&id);
    //根据id获取学员对应的index
    int index=get_student_index(id);
    //判断学员是否存在
    if (index==-1)
    {
        //不存在该id的学员
        printf("学员ID=%d的学员不存在\n",id);
        //重新展示菜单
        show_menu();
    }else
    {
        //存在
        printf("请输入修改后的学号 姓名 性别 地址(用空格隔开):\n");
        char sno[10];
        char sname[50];
        int gender;
        char address[100];
        scanf("%s %s %d %s",sno,sname,&gender,address);
        //构建一个新学员,把数组对应的index索引内容进行替换
        struct student new_student={id,sno,sname,gender,address};
        student_array[index]=new_student;
        //做完增删改  让管理员看到修改后的数据,查询所有学员
        show_student_array();
    } 
}

//15.删除学员信息
/*C语言静态数组,不可以动态改变数组的大小,
在数组中删除一个学员后,需要改变实际学员的个数,删除后 从被删除元素的下标开始 所有元素向前移动一位,
要把移动后的  实际的最后一个元素赋值空。
*/
void delete_student(){
    //管理员输入需要删除的学员ID
    int id=0;
    printf("请输入学员ID:\n");
    scanf("%d",&id);
    //根据学员id查询学员对应的index
    int stu_index=get_student_index(id);
    if (stu_index==-1)
    {
        //不存在
        printf("ID=%d的学员不存在\n",id);
        //重新展示菜单
        show_menu();
    }else
    {
        //删除后,从被删除的数据 index开始,所有元素向前移动一位
        for (int i = stu_index; i < size; i++)
        {
            //处理最后一条数据
            if (i==(size-1))
            {
                //最后一条数据抹除
                struct student stu_temp={0};
                student_array[i]=stu_temp;
                //实际学员个数--1
                size--;
                //从新展示学员列表
                show_student_array();
                return;
            }
            //不是最后一条,元素向前移动一位
            student_array[i]=student_array[i+1];
        }
    }
}

//16.新增学员
void add_student(){
    //目前数据是保存在数组中的,数组长度是固定的,我们最多保存7条数据
    if (size>=STUDENT_SIZE)
    {
        printf("存储空间已满,系统后续扩容,【新增学员】失败 \n");
        //调用菜单
        show_menu();
        return;
    }
    //空间足够使用,输入新增的学员信息
    printf("请输入新增的学号 姓名 性别 地址(用空格隔开):\n");
    char sno[10];
    char sname[50];
    int gender;
    char address[100];
    scanf("%s %s %d %s",sno,sname,&gender,address);
    //id设置增大,如果没有学员,id为1
    int new_id=1;
    if (size!=0)
    {
        //id处理,获取最后一条学员信息的id,新学员在该id基础上+1
        new_id=student_array[size-1].id+1;
    }
    //构建一个新学员,把数组对应的index索引内容进行替换
    struct student new_student={new_id,sno,sname,gender,address};
    //新的学员默认放在数组的最后一个位置上
    student_array[size]=new_student;
    //新增后学员个数+1;
    size++;
    //展示新增后的列表
    show_student_array();
}
posted @ 2025-03-03 19:40  freshman_xy  阅读(112)  评论(0)    收藏  举报  来源