C语言实现学生管理系统小demo
这是一个 学生管理系统,它使用 C 语言 实现了基本的管理员登录和学生信息管理功能,包括增、删、改、查等操作。适合基础入门。免费下载链接(普通版)免费下载链接(进阶版)
主要功能
-
管理员登录
- 存储多个管理员信息(账号+密码)。
- 用户输入账号和密码进行匹配,成功则进入系统。
-
菜单功能
- 显示可选操作:查询所有学生、查询单个学生、添加、修改、删除学生等。
- 用户输入对应编号来执行操作。
-
学生管理
- 增:手动输入学号、姓名、性别、地址等信息,添加到学生数组。
- 删:根据 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();
}

浙公网安备 33010602011771号