项目需求
使用者身份及权限
项目使用者分为 普通学生 和 教职工;不同的身份决定了不同的权限
普通学生
普通学生在此系统中只能进行 “读” 的操作,即只能查看不能修改,具体权限如下:
1.查看学生信息(不完全)
2.搜索指定学生
3.退出当前操作
教职工
教职工在此系统中可 “读” 亦可 “写”,即可以查看与修改,具体权限如下:
1.查看学生信息(完全)
2.搜索指定学生
3.添加学生档案
4.删除学生档案
5.修改学生信息
6.退出当前操作
学生信息要求
学生信息要求包含如下内容:
1.学生姓名
2.学生学号
3.学生电话号码
(学生查看时,号码中间四位数字用****替代,如“12345678900” -> “123****8900”;老师正常查看)
具体操作要求
1. 查看学生信息
选择此项,终端窗口整齐显示所有学生信息
2. 搜索指定学生
选择此项,程序输出 “请输入学生学号” ->
若存在该学号,则正常显示;若不存在,则提示“不存在该学生!”
3. 添加学生档案
选择此项,要求用户依次学生 学号,姓名,电话号码;
注意 学生学号不可重复,否则提示“学号不可重复!”
4. 删除学生档案
选择此项,要求用户输入学生学号 ->
若存在,系统再次询问是否删除;不存在,则提示“不存在该学生!”
5. 修改学生信息
选择此项,要求用户输入学生学号 ->
若存在,用户依次输出修改后的学生信息;不存在,则提示“不存在该学生!”
6. 退出当前操作
选择此项,输出“欢迎使用,再见!”,最后返回主菜单;
根据需求逐步实现
初始化操作
学生信息
学生信息的组成部分是姓名、学号和电话号码;而我们要实现一个存储学生信息的功能;
就不得不使用 结构体数组 ;那么,第一步初始化操作便是 定义结构体
struct Student
{
// 学生姓名
char name[10];
// 学生学号
char number[13];
// 电话号码
char phone[11];
};
管理容器
由于还没有学习链表,我们先通过数组实现该系统 —— 初始化一个足够大的结构体数组,用于存储未来所有学生信息
为了使代码中所有函数可以访问该数组 需要全局定义
// 初始化结构体数组
Student allStudents[10000];
学生总人数
// 初始化学生总人数
int students = 0;
第一步 选择身份
想要区分不同的用户类型
需要通过初始菜单供用户选择
void Users()
{
while (1)
{
printf("请问您的身份是:\n");
printf("1.普通学生\n");
printf("2.教职工\n");
printf("0.退出系统\n");
// 选择变量
int choice_1;
// 输入用户的选择
scanf("%d", &choice_1);
switch (choice_1)
{
case 1:
studentMenu();
break;
case 2:
staffMenu();
break;
case 0:
printf("欢迎下次使用!\n");
return;
default:
printf("请输入有效选项!\n");
break;
}
}
}
第二步 根据身份显示不同界面
思考一下为什么查看学生信息和搜索制定学生需要传参呢?
// 普通学生界面
void studentMenu()
{
// 为了多次选择 需要使用while循环
while (1)
{
// 显示学生可执行的操作
// 1.查看学生信息(不完全)
// 2.搜索指定学生
// 3.退出当前操作
printf("1.查看学生信息\n");
printf("2.搜索指定学生\n");
printf("3.退出当前操作\n");
// 选择变量
int choice_2;
scanf("%d", &choice_2);
// switch 进行选项分析
switch (choice_2)
{
case 1:
// 查看学生信息
Information(1);
break;
case 2:
// 搜索指定学生
Search(1);
break;
case 3:
// 退出系统
printf("再见!\n");
return;
default:
// 输入有误
printf("请输入有效选项!\n");
break;
}
}
}
// 教职工界面
void staffMenu()
{
// 为了多次选择 需要使用while循环
while (1)
{
// 显示教职工可执行的操作
// 1.查看学生信息(完全)
// 2.搜索指定学生
// 3.添加学生档案
// 4.删除学生档案
// 5.修改学生信息
// 6.退出当前操作
printf("1.查看学生信息\n");
printf("2.搜索指定学生\n");
printf("3.添加学生档案\n");
printf("4.删除学生档案\n");
printf("5.修改学生信息\n");
printf("6.退出当前操作\n");
// 选择变量
int choice_3;
scanf("%d", &choice_3);
// switch 进行选项分析
switch (choice_3)
{
case 1:
// 查看学生信息
Information(2);
break;
case 2:
// 搜索指定学生
Search(2);
break;
case 3:
// 添加学生档案
addInfo();
break;
case 4:
// 删除学生档案
deleteInfo();
break;
case 5:
// 修改学生信息
modifyInfo();
break;
case 6:
// 退出系统
printf("再见!\n");
return;
default:
// 输入有误
printf("请输入有效选项!\n");
break;
}
}
}
第三步 书写详细函数
查看学生信息
// 查看学生信息
void Information(int identity)
{
printf("学生信信息如下:\n");
printf("姓名\t学号\t\t电话号码\t\n");
// 学生的电话号码根据身份有不同的显示格式
// 此时适合通过参数分辨
if (identity == 1)
{
// 学生操作中
for (int i = 0; i < students; i++)
{
Student stu = allStudents[i];
printf("%s\t", stu.name);
printf("%s\t", stu.number);
printf("%c%c%c****%c%c%c%c\t", stu.phone[0], stu.phone[1], stu.phone[2], stu.phone[7], stu.phone[8], stu.phone[9], stu.phone[10]);
printf("\n");
}
}
else
{
// 老师操作中
for (int i = 0; i < students; i++)
{
Student stu = allStudents[i];
printf("%s\t", stu.name);
printf("%s\t", stu.number);
printf("%s\t", stu.phone);
printf("\n");
}
}
printf("\n");
}
搜索指定学生
// 搜索指定学生
void Search(int identity)
{
printf("请输入该学生学号:\n");
char searchNumber[13];
scanf("%s", &searchNumber);
// 查找ing
// 存在标志
int flag = 0;
Student stu;
for (int i = 0; i < students; i++)
{
stu = allStudents[i];
// 判断学号是否符合
if (strcmp(stu.number, searchNumber) == 0)
{
flag = 1;
break;
}
}
if (!flag)
{
printf("不存在该学生!\n");
return;
}
// 显示该学生信息
printf("学生姓名\t学生学号\t学生电话号码\t\n");
if (identity == 1)
{
printf("%s\t", stu.name);
printf("%c%c%c****%c%c%c%c\t", stu.number[0], stu.number[1], stu.number[2], stu.number[7], stu.number[8], stu.number[9], stu.number[10]);
printf("%s\t", stu.phone);
printf("\n");
}
else
{
printf("%s\t", stu.name);
printf("%s\t", stu.number);
printf("%s\t", stu.phone);
printf("\n");
}
}
添加学生档案
// 添加学生档案
void addInfo()
{
// 初始化待添加学生的信息
Student newStudent;
printf("请输入学生姓名:\n");
scanf("%s", &newStudent.name);
printf("请输入学生学号:\n");
scanf("%s", &newStudent.number);
printf("请输入学生电话号码:\n");
scanf("%s", &newStudent.phone);
// 判断学号是否重复
for (int i = 0; i < students; i++)
{
Student stu = allStudents[i];
if (strcmp(stu.number, newStudent.number) == 0)
{
printf("学号不可重复!\n");
return;
}
}
// 添加
allStudents[students++] = newStudent;
printf("添加成功!\n");
return;
}
删除学生档案
// 删除学生档函
void deleteInfo()
{
if (students == 0)
{
printf("暂无可删除的学生\n");
return;
}
printf("请输入该学生学号:\n");
char searchNumber[13];
scanf("%s", &searchNumber);
// 查找ing
// 存在标志
int flag = 0;
Student stu;
for (int i = 0; i < students; i++)
{
stu = allStudents[i];
// 判断学号是否符合
if (strcmp(stu.number, searchNumber) == 0)
{
flag = 1;
// 再次确认是否删除
printf("是否确认删除该学生?(y/n)\n");
char answer;
scanf(" %c", &answer);
if (answer == 'n')
{
return;
}
// 删除 数组就很麻烦
for (int j = i; i < students - 1; i++)
{
allStudents[j] = allStudents[+1];
}
// 人数变化
--students;
printf("该学生已删除\n");
}
}
if (!flag)
{
printf("不存在该学生!\n");
return;
}
}
修改学生信息
// 修改学生信息
void modifyInfo()
{
printf("请输入该学生学号:\n");
char searchNumber[13];
scanf(" %s", &searchNumber);
// 查找ing
// 存在标志
int flag = 0;
Student stu;
for (int i = 0; i < students; i++)
{
stu = allStudents[i];
// 判断学号是否符合
if (strcmp(stu.number, searchNumber) == 0)
{
flag = 1;
// 修改
Student stu;
printf("请输入修改后的学生姓名:\n");
scanf("%s", &stu.name);
printf("请输入修改后的学生学号:\n");
scanf("%s", &stu.number);
printf("请输入修改后的学生电话号码:\n");
scanf("%s", &stu.phone);
allStudents[i] = stu;
printf("修改完成!\n");
break;
}
}
if (!flag)
{
printf("不存在该学生!\n");
}
}
效果演示
教职工添加学生档案
教职工查看学生信息+教职工修改学生信息
教职工删除学生档案
切换用户身份