#ifndef STUDENTS_MANAGE_SYSTEMS_H
#define STUDENTS_MANAGE_SYSTEMS_H
#include<stdio.h>
#include<stdlib.h>
//数据类型重定义
//管理员结构体定义 管理员账号名 密码 指针域
typedef struct Administrator_t
{
char number[100];
char password[100];
struct Administrator_t* next;
}adm;
//教师信息结构体定义 姓名 密码 工号 性别 出生日期 指针域
typedef struct Teachers_t
{
char name[100];
char password[100];
int number;
int sex;
char birthday[100];
struct Teachers_t* next;
}tea;
//学生信息结构体定义 姓名、密码、学号、性别、出生日期、数学、语文、英语三门功课成绩 指针域
typedef struct Students_t
{
char name[100];
char password[100];
int number;
int sex;
char birthday[100];
double chinese;
double maths;
double english;
struct Students_t* next;
}stu;
//选择身份界面函数
void Choose_Identity_Interface();
//创建管理员空白单向链表
adm* Creat_Adm_Ep_Link_List();
//创建教师空白单向链表
tea* Create_Ep_Teacher_Link_List();
//创建学生空白单向链表
stu* Create_Ep_Student_Link_List();
//管理员页面
//修改管理员密码
void Modify_Adm_Password(adm* p);
//添加新教师
int Add_New_teachers(tea* p);
//查看所有教师信息
void View_All_Teachers(tea* p);
//删除教师
int Delete_Teacher(tea* p);
// 修改教师信息函数
int Modify_Teacher_Information(tea* p);
//创建管理员页面
void Creat_Adm_Page(adm* padm, tea* ptea);
//教师页面
//更改教师登录密码
void Modify_Teacher_Password(tea* p);
//查看教师自身信息
void View_Teacher_Information(tea* p);
//添加新学生
int Add_New_Student(stu* p);
//删除学生
int Delete_Student(stu* p);
//查阅学生信息
int View_Student_Information(stu* p);
// 修改学生信息(姓名、性别、出生日期、三门功课成绩)
int Modify_Student_Information(stu* p);
// 按学号从低到高查看所有学生信息
void View_Student_Num_Information(stu* p);
// 按总分从高到低查看所有学生信息
void View_Student_Total_Information(stu* p);
//记录教师的位置
//int Search_Teacher_Position(tea* p, char name[]);
// 教师登录界面
void Creat_Tea_Page(tea* p, stu* p1);
// 修改学生登录密码
void Modify_Student_Password(stu* p);
// 学生查看自身信息
void View_Studentself_Information(stu* p);
//记录学生位置
//int Search_Student_Position(stu* p, char name[]);
//学生登录界面
void Creat_Student_page(stu* p);
#endif
#define _CRT_SECURE_NO_WARNINGS
#include "students_manage_systems.h"
//选择身份界面函数
void Choose_Identity_Interface()
{
printf("---------欢迎登录学生管理系统---------\n");
printf("\n");
printf("---------1.管理员登录---------\n");
printf("\n");
printf("---------2.教师登录---------\n");
printf("\n");
printf("--------- 3.学生登陆---------\n");
printf("\n");
printf("--------- 4.退出登录--------- \n");
printf("\n");
}
//创建管理员空白单向链表 并将初始账号密码储存到管理员数组中
//strncpy复制函数计算数组要减1 且手动删除空格
adm* Creat_Adm_Ep_Link_List()
{
adm* p;
p = (adm*)malloc(sizeof(adm));
// 内存检查
if (p == NULL)
{
printf(" CreatEpLinkList error\n");
return NULL;
}
strncpy(p->number, "admin", sizeof(p->number) - 1);
p->number[sizeof(p->number) - 1] = '\0';
strncpy(p->password, "admin123", sizeof(p->password) - 1);
p->password[sizeof(p->password) - 1] = '\0';
p->next = NULL;
return p;
}
//创建教师空白单向链表
tea* Create_Ep_Teacher_Link_List()
{
tea* p = (tea*)malloc(sizeof(tea));
// 内存检查
if (p == NULL) {
printf("Create_Ep_Teacher_Link_List error\n");
return NULL;
}
// 设置空链表
p->next = NULL;
// 返回指针
return p;
}
//创建一个空的学生头节点
stu* Create_Ep_Student_Link_List()
{
stu* p = (stu*)malloc(sizeof(stu));
if (p == NULL) {
printf(" Create_Ep_Student_Link_List error\n");
return NULL;
}
p->next = NULL;
return p;
}
//修改管理员密码 while循环清除输入缓冲区中未被处理的字符
void Modify_Adm_Password(adm* p)
{
printf("请输入新的登录密码:\n");
char newpassword[20];
scanf("%s", newpassword); // 防止溢出
while (getchar() != '\n'); // 清空缓冲区
strncpy(p->password, newpassword, sizeof(p->password) - 1);
p->password[sizeof(p->password) - 1] = '\0';
printf("您的密码已经修改成功!\n");
}
//添加新教师
int Add_New_teachers(tea* p)
{
//空指针检查
if (p == NULL) {
printf("Add_New_teachers error\n");
return -1;
}
//开辟内存
tea* pnew = (tea*)malloc(sizeof(tea));
if (pnew == NULL) {
printf("Add_New_teachers error\n");
return -1;
}
//定义变量,数组
char name[20];
char password[21];
int sex;
int number;
char birthday[20];
//新数据读取
printf("请新教师的姓名\n");
scanf("%s", name);
while (getchar() != '\n');
printf("请新教师的密码 最多20位\n");
scanf("%s", password);
while (getchar() != '\n');
printf("请输入新教师的工号\n");
scanf("%d", &number);
while (getchar() != '\n');
printf("请输入新教师的性别 1代表男 0代表女\n");
scanf("%d", &sex);
while (getchar() != '\n');
printf("请输入新教师的出生年月日,例如(1997-6-25)\n");
scanf("%s", birthday);
while (getchar() != '\n');
strncpy(pnew->name, name, sizeof(pnew->name) - 1);
pnew->name[sizeof(pnew->name) - 1] = '\0';
strncpy(pnew->password, password, sizeof(pnew->password) - 1);
pnew->password[sizeof(pnew->password) - 1] = '\0';
pnew->number = number;
pnew->sex = sex;
strncpy(pnew->birthday, birthday, sizeof(pnew->birthday) - 1);
pnew->birthday[sizeof(pnew->birthday) - 1] = '\0';
pnew->next = NULL;
//插入新节点,先连接后结点,再连接前结点
pnew->next = p->next;
p->next = pnew;
//安全退出
return 0;
}
//查看所有教师信息
void View_All_Teachers(tea* p)
{
//移动链表
while (p->next != NULL) {
p = p->next;
// 打印当前节点的教师信息
printf("\n");
printf("教师姓名:%s\n", p->name);
printf("教师密码:%s\n", p->password);
printf("教师工号:%d\n", p->number);
printf("教师性别 1代表男 0代表女:%d\n", p->sex);
printf("教师的出生日期:%s\n", p->birthday);
printf("\n");
}
}
//删除教师
int Delete_Teacher(tea* p)
{
printf("请输入您要删除的教师名称\n");
char a[20];
scanf("%s", a);
// 清除输入缓冲区中的多余字符
while (getchar() != '\n');
// 从第一个有效节点开始查找
tea* pdel = p->next;
// 遍历链表并找到合适的教师名字
while (pdel != NULL) {
if (strcmp(pdel->name, a) == 0) {
printf("%s教师已删除\n", pdel->name);
printf("\n");
// 修改前驱节点的next指针,跳过当前节点
p->next = pdel->next;
// 释放内存并制空指针
free(pdel);
pdel = NULL;
return 0;
}
else {
p = p->next;
pdel = pdel->next;
}
}
printf("查无此人\n");
printf("\n");
return -1;
}
// 修改教师信息函数
int Modify_Teacher_Information(tea* p)
{
//
int n = 0;
char name[20]; // 存储用户输入的姓名
tea* l = NULL; // 用于遍历链表的指针
int found = 0; // 是否找到教师标志
int exit_flag = 0; // 是否退出主循环标志
// 主循环:允许用户多次输入姓名查找
while (!exit_flag)
{
printf("请输入您想要修改的教师姓名(输入 q 退出):\n");
scanf("%s", name);
while (getchar() != '\n'); // 清空输入缓冲区
// 如果用户输入 q,退出整个函数
if (strcmp(name, "q") == 0)
{
printf("已退出修改功能。\n");
return 0;
}
// 从链表第一个有效节点开始查找
l = p->next;
found = 0;
// 遍历链表查找匹配的教师
while (l != NULL)
{
if (strcmp(l->name, name) == 0)
{
found = 1;
printf("找到教师:%s\n", l->name);
// 进入修改菜单循环
while (1)
{
printf("\n");
printf("请选择您要修改的信息\n");
printf("1.姓名 2.密码 3.工号 4.性别 5.出生日期 0.返回上一层\n");
scanf("%d", &n);
while (getchar() != '\n'); // 清空缓冲区
switch (n)
{
case 1:
{
char new_name[20];
printf("请输入您想要修改的新名字:\n");
scanf("%s", new_name);
while (getchar() != '\n');
strcpy(l->name, new_name); // 修改姓名
printf("姓名修改成功。\n");
break;
}
case 2:
{
char new_password[50];
printf("请输入您想要修改的新密码:\n");
scanf("%s", new_password);
while (getchar() != '\n');
strcpy(l->password, new_password); // 修改密码
printf("密码修改成功。\n");
break;
}
case 3:
{
int new_number;
printf("请输入您想要修改的新工号:\n");
scanf("%d", &new_number);
l->number = new_number; // 修改工号
printf("工号修改成功。\n");
break;
}
case 4:
{
int new_sex;
printf("请输入您想要修改的新性别:\n");
scanf("%d", &new_sex);
while (getchar() != '\n');
l->sex= new_sex; // 修改性别
printf("性别修改成功。\n");
break;
}
case 5:
{
char new_birthday[20];
printf("请输入您想要修改的新出生日期(例如:1997-6-25):\n");
scanf("%s", new_birthday);
strcpy(l->birthday, new_birthday);
printf("出生日期修改成功。\n");
break;
}
case 0:
printf("返回上一层。\n");
exit_flag = 1; // 设置退出标志
break;
default:
printf("错误选择,请重新选择。\n");
break;
}
// 跳出修改菜单循环
if (n == 0)
break;
}
}
l = l->next;
}
// 如果未找到匹配的教师,提示重新输入
if (!found) {
printf("查无此人,请重新输入(输入 q 退出):\n");
}
}
return 0; // 正常退出
}
//创建管理员页面
void Creat_Adm_Page(adm* p, tea* p1)
{
int flag = 1, count = 0;
int sel = 0;
char name[20];
char password[20];
while (flag)
{
printf("请输入您的账户\n");
scanf("%s", name);
while (getchar() != '\n');
printf("请输入密码\n");
scanf("%s", password);
while (getchar() != '\n');
if (strcmp(name, p->number) == 0 && strcmp(password, p->password) == 0)
{
int pflag = 1;
printf("\n");
printf("您好\n");
while (pflag)
{
printf("\n");
printf("1. 修改自身登录密码\n");
printf("2. 添加新教师\n");
printf("3. 查看所有教师\n");
printf("4. 删除教师\n");
printf("5. 修改教师信息\n");
printf("0. 返回上一层\n");
printf("\n");
scanf("%d", &sel);
switch (sel)
{
case 1:Modify_Adm_Password(p);
break;
case 2:Add_New_teachers(p1);
break;
case 3:View_All_Teachers(p1);
break;
case 4:Delete_Teacher(p1);
break;
case 5:Modify_Teacher_Information(p1);
break;
case 0:
pflag = 0;
flag = 0;
break;
default:printf("错误选择,请重新选择\n");
break;
}
}
}
else {
printf("输入错误请重新输入!\n");
count++;
if (count == 3) {
flag = 0;
printf("输入错误3次,自动退出!\n");
}
}
}
}
//更改教师登录密码
void Modify_Teacher_Password(tea* p)
{
printf("请输入新的登录密码:\n");
char newpassword[20];
scanf("%s", newpassword);
while (getchar() != '\n');
strncpy(p->password, newpassword, sizeof(p->password) - 1);
p->password[sizeof(p->password) - 1] = '\0';
}
//查看教师自身信息
void View_Teacher_Information(tea* p)
{
// 检查指针是否为空,防止程序崩溃
if (p == NULL) {
printf("错误:教师信息为空,无法查看!\n");
return;
}
// 输出教师信息
printf("姓名:%s\n", p->name);
printf("密码:%s\n", p->password);
printf("工号:%d\n", p->number);
printf("性别:%d\n", p->sex);
printf("出生日期:%s\n", p->birthday);
printf("\n");
}
//添加新学生
int Add_New_Student(stu* p)
{
// 检查传入指针是否为空,防止访问非法内存
if (p == NULL) {
printf("当前节点为空,无法添加新学生!\n");
return -1;
}
// 动态分配内存,创建新学生节点
stu* pnew = (stu*)malloc(sizeof(stu));
if (pnew == NULL) {
printf("内存分配失败\n");
return -1;
}
// 临时变量用于存储输入信息
char name[20];
char password[20];
int number;
int sex;
char birthday[100];
double chinese;
double maths;
double english;
// 输入学生姓名
printf("请输入新学生姓名\n");
scanf("%s", name);
while (getchar() != '\n'); // 清空输入缓冲区
// 输入学生密码
printf("请输入新学生密码\n");
scanf("%s", password);
while (getchar() != '\n');
// 输入学生学号
printf("请输入新学生学号\n");
scanf("%d", &number);
while (getchar() != '\n');
// 输入学生性别
printf("请输入新学生性别\n");
scanf("%d", &sex);
while (getchar() != '\n');
// 输入学生出生日期
printf("请输入新学生生日 例如:1997-6-25\n");
scanf("%s", birthday);
while (getchar() != '\n');
// 输入语文成绩
printf("请输入新学生语文成绩\n");
scanf("%lf", &chinese);
while (getchar() != '\n');
// 输入数学成绩
printf("请输入新学生数学成绩\n");
scanf("%lf", &maths);
while (getchar() != '\n');
// 输入英语成绩
printf("请输入新学生英语成绩\n");
scanf("%lf", &english);
while (getchar() != '\n');
// 初始化新节点的数据
strcpy(pnew->name, name);
strcpy(pnew->password, password);
pnew->number = number;
pnew->sex = sex;;
strcpy(pnew->birthday, birthday);
pnew->chinese = chinese;
pnew->maths = maths;
pnew->english = english;
pnew->next = NULL; // 新节点的 next 初始化为 NULL
// 将新节点插入到当前节点的后面
pnew->next = p->next; // 新节点指向当前节点的下一个节点
p->next = pnew; // 当前节点指向新节点
printf("新学生添加成功!\n");
return 0; // 成功返回 0
}
//删除学生
int Delete_Student(stu* p)
{
printf("请输入您要删除的学生姓名\n");
char name[20];
scanf("%s", name); // 防止缓冲区溢出
while (getchar() != '\n'); // 清空缓冲区
stu* pdel = p->next;
while (pdel != NULL) {
if (strcmp(pdel->name, name) == 0) {
printf("%s学生已删除\n", pdel->name);
printf("\n");
// 删除节点
p->next = pdel->next;
// 如果结构体中有动态分配字段,需先释放
// free(pstu_del->name);
// free(pstu_del->passwd);
free(pdel);
pdel = NULL;
return 0;
}
else {
p = p->next;
pdel = pdel->next;
}
}
printf("查无此人\n");
printf("\n");
return -1;
}
//查阅学生信息
int View_Student_Information(stu* p)
{
// 判断传入的链表指针是否为 NULL
if (p == NULL) {
printf("链表为空,无法查找\n");
return -1;
}
printf("请输入您要查阅的学生姓名\n");
char name[20]; // 用于存储输入的学生姓名
scanf("%s", name); // 读取用户输入的姓名(不处理溢出)
while (getchar() != '\n'); // 清空输入缓冲区中的多余字符
p = p->next; // 移动到第一个有效节点(跳过哨兵节点)
// 如果此时 pstu 为 NULL,说明链表中没有有效节点
if (p == NULL) {
printf("链表中无学生信息\n");
return -1;
}
// 遍历链表查找匹配的学生
while (p != NULL) {
// 判断当前节点的 name 是否非空,并且与输入的 name 匹配
if (p->name != NULL && strcmp(p->name, name) == 0) {
// 打印学生信息
printf("学生姓名:%s\n", p->name);
printf("学生密码:%s\n", p->password);
printf("学生学号:%d\n", p->number);
printf("学生性别:%d\n", p->sex);
printf("学生出生日期:%s\n", p->birthday);
printf("学生语文成绩:%lf\n", p->chinese);
printf("学生数学成绩:%lf\n", p->maths);
printf("学生英语成绩:%lf\n", p->english);
printf("\n");
return 0; // 成功找到并打印,返回 0
}
else {
p = p->next; // 没有找到,继续下一个节点
}
}
// 遍历完整个链表仍未找到目标学生
printf("查无此人\n");
return -1; // 返回 -1 表示查找失败
}
// 修改学生信息(姓名、性别、出生日期、三门功课成绩)
int Modify_Student_Information(stu* p)
{
int choice = 0;
char name[20];
int running = 1;
while (running)
{
printf("请输入您想要修改的学生姓名\n");
scanf("%s", name); // 读取要修改的学生姓名
while (getchar() != '\n'); // 清空输入缓冲区
stu* current = p->next; // 从第一个有效节点开始查找
stu* found = NULL;
while (current != NULL)
{
if (strcmp(current->name, name) == 0)
{
found = current; // 找到学生
break;
}
current = current->next;
}
if (found == NULL)
{
printf("查无此人\n");
continue;
}
// 进入修改菜单
int modifying = 1;
while (modifying)
{
printf("*******************************************************\n");
printf("请选择您要修改的信息\n");
printf("1.姓名 2.性别 3.出生日期 4.数学成绩 5.语文成绩 6.英语成绩 0.返回上一层\n");
if (scanf("%d", &choice) != 1) // 输入失败
{
printf("输入错误,请输入数字\n");
while (getchar() != '\n'); // 清空无效输入
continue;
}
switch (choice)
{
case 1:
{
char new_name[20];
printf("请输入您想要修改的新名字\n");
scanf("%s", new_name);
while (getchar() != '\n');
strcpy(found->name, new_name);
printf("修改成功\n");
break;
}
case 2:
{
int new_sex;
printf("请输入您想要修改的新性别\n");
scanf("%d",&new_sex);
while (getchar() != '\n');
found->sex = new_sex;
printf("修改成功\n");
break;
}
case 3:
{
char new_birthday[20];
printf("请输入您想要修改的新出生日期,如 1998-4-19\n");
scanf("%s", new_birthday);
strcpy(found->birthday, new_birthday);
while (getchar() != '\n');
printf("修改成功\n");
break;
}
case 4:
{
double new_chinese = 0;
printf("请输入您想要修改的新语文成绩\n");
scanf("%lf", &new_chinese);
while (getchar() != '\n');
found->chinese = new_chinese;
printf("修改成功\n");
break;
}
case 5:
{
double new_maths = 0;
printf("请输入您想要修改的新数学成绩\n");
scanf("%lf", &new_maths);
while (getchar() != '\n');
found->maths = new_maths;
printf("修改成功\n");
break;
}
case 6:
{
double new_english = 0;
printf("请输入您想要修改的新英语成绩\n");
scanf("%lf", &new_english);
while (getchar() != '\n');
found->english = new_english;
printf("修改成功\n");
break;
}
case 0:
modifying = 0; // 退出修改菜单
running = 0; // 退出主循环
break;
default:
printf("错误选择,请重新选择\n");
break;
}
}
}
return 0;
}
// 7. 按学号从低到高查看所有学生信息
void View_Student_Num_Information(stu* p)
{
// 如果链表为空或只有一个节点,直接返回
if (p == NULL || p->next == NULL) {
printf("链表为空,无法排序查看信息\n");
return;
}
stu* i = NULL;
stu* j = NULL;
stu*temp = NULL;
int len = 0;
// 计算链表长度
temp = p->next;
while (temp != NULL) {
len++;
temp = temp->next;
}
// 冒泡排序:按学号从低到高排序
for (i = p->next; i != NULL; i = i->next) {
for (j = p->next; j != NULL && j->next != NULL; j = j->next) {
if (j->number > j->next->number) { // 比较学号
// 交换节点 j 和 j->next 的数据域(不交换指针)
// 这种方式更简单安全,适合展示排序效果
stu temp = { 0 };
temp = *j; // 保存 j 的内容
*j = *(j->next); // 将 j->next 的内容复制给 j
*(j->next) = temp; // 将临时保存的内容复制给 j->next
// 重置指针,因为交换后 j->next 已改变
j->next->next = temp.next;
}
}
}
// 排序完成后,遍历输出学生信息
temp = p->next;
while (temp != NULL)
{
printf("姓名:%s ", temp->name);
printf("密码:%s ", temp->password);
printf("学号:%d ", temp->number);
printf("性别:%d ", temp->sex); // 性别改为 int 类型
printf("出生日期:%s ", temp->birthday); // 生日改为 char[12]
printf("语文成绩:%lf ", temp->chinese); // 语文成绩放在前面
printf("数学成绩:%lf ", temp->maths); // 数学成绩放在后面
printf("英语成绩:%lf \n", temp->english);
printf("\n");
temp = temp->next;
}
}
// 8. 按总分从高到低查看所有学生信息
void View_Student_Total_Information(stu* p)
{
// 如果链表为空或只有一个节点,直接返回
if (p == NULL || p->next == NULL) {
printf("链表为空,无法排序查看信息\n");
return;
}
stu* i = NULL;
stu* j = NULL;
// 冒泡排序:按总分从高到低排序
for (i = p->next; i != NULL; i = i->next) {
for (j = p->next; j != NULL && j->next != NULL; j = j->next) {
int total_j = j->chinese + j->maths + j->english;
int total_j_next = j->next->chinese + j->next->maths + j->next->english;
if (total_j < total_j_next) { // 总分降序排序
// 交换节点 j 和 j->next 的数据域
stu temp = { 0 };
temp = *j;
*j = *(j->next);
*(j->next) = temp;
// 保持链表指针连续性
stu* tmp_next = j->next->next;
j->next->next = temp.next;
j->next = tmp_next;
}
}
}
// 排序完成后,遍历输出学生信息
stu* current = p->next;
while (current != NULL)
{
int total = current->maths + current->chinese + current->english;
printf("姓名:%s ", current->name);
printf("密码:%s ", current->password);
printf("学号:%d ", current->number);
printf("性别:%d ", current->sex); // 性别为 int
printf("出生日期:%s ", current->birthday); // 生日为 char[12]
printf("语文成绩:%lf ", current->chinese); // 语文成绩
printf("数学成绩:%lf ", current->maths); // 数学成绩
printf("英语成绩:%lf ", current->english); // 英语成绩
printf("总分:%d \n", total); // 输出总分
printf("\n");
current = current->next;
}
}
//查找老师的位置
/*
int Search_Teacher_Position(tea* p, char name[])
{
//记录查找位置
int post = 0;
while (p->next != NULL) {
p = p->next;
if (strcmp(p->name, name) == 0) {
return post;
}
post++;
}
return -1;
}
*/
// 教师登录界面
void Creat_Tea_Page(tea* p, stu* p1)
{
int flag = 1, count = 0;
int sel = 0;
char name[20];
char password[20];
while (flag)
{
printf("请输入姓名:\n");
scanf("%s", name);
while (getchar() != '\n'); // 清空缓冲区
printf("请输入密码:\n");
scanf("%s", password);
while (getchar() != '\n');
// 使用临时指针查找教师
tea* current_teacher = p->next; // 跳过头节点
int found = 0;
while (current_teacher != NULL)
{
if (strcmp(current_teacher->name, name) == 0 &&
strcmp(current_teacher->password, password) == 0)
{
found = 1;
break;
}
current_teacher = current_teacher->next;
}
// 判断登录是否成功
if (found && current_teacher != NULL)
{
int pflag = 1;
printf("\n");
printf("欢迎 %s 老师登录\n", current_teacher->name);
printf("\n");
while (pflag)
{
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("\n");
scanf("%d", &sel);
switch (sel)
{
case 1: Modify_Teacher_Information(current_teacher);
break;
case 2: View_Teacher_Information(current_teacher);
break;
case 3: Add_New_Student(p1);
break;
case 4: Delete_Student(p1);
break;
case 5: View_Student_Information( p1);
break;
case 6: Modify_Student_Information(p1);
break;
case 7: View_Student_Num_Information(p1);
break;
case 8: View_Student_Total_Information(p1);
break;
case 0:
pflag = 0;
flag = 0;
break;
default:
printf("错误选择,请重新选择\n");
break;
}
}
}
else
{
printf("登录失败,请重新输入\n");
count++;
if (count == 3) {
flag = 0;
printf("输入错误3次,自动退出!\n");
}
}
}
}
// 修改学生登录密码
void Modify_Student_Password(stu* p)
{
char new_password[20];
char confirm_password[20];
printf("请输入新的登录密码:\n");
scanf("%s", new_password);
while (getchar() != '\n');
printf("请再次输入以确认密码:\n");
scanf("%s", confirm_password);
while (getchar() != '\n');
if (strcmp(new_password, confirm_password) == 0)
{
strcpy(p->password, new_password);
printf("密码修改成功!\n");
}
else
{
printf("两次输入的密码不一致,修改失败。\n");
}
}
// 学生查看自身信息
void View_Studentself_Information(stu* p)
{
if (p == NULL) {
printf("当前学生信息为空,无法查看。\n");
return;
}
printf("\n");
printf("姓名:%s\n", p->name);
printf("密码:%s\n", p->password);
printf("学号:%d\n", p->number);
printf("性别:%d\n", p->sex);
printf("出生日期:%s\n", p->birthday);
printf("语文成绩:%lf\n", p->chinese);
printf("数学成绩:%lf\n", p->maths);
printf("英语成绩:%lf\n", p->english);
printf("\n");
}
//记录学生位置
/*
int Search_Student_Position(stu* p, char name[])
{
//记录查找位置
int post = 0;
while (p->next != NULL) {
p = p->next;
if (strcmp(p->name, name) == 0) {
return post;
}
post++;
}
return -1;
}
*/
//学生登录界面
void Creat_Student_page(stu* p)
{
int flag = 1, count = 0;
int sel = 0;
char name[20];
char password[20];
while (flag)
{
printf("请输入姓名:\n");
scanf("%s", name);
while (getchar() != '\n'); // 清空缓冲区
printf("请输入密码:\n");
scanf("%s", password);
while (getchar() != '\n');
// 使用临时指针查找学生
stu* current = p->next; // 假设 pstu 是头节点
int found = 0;
while (current != NULL)
{
if (strcmp(current->name, name) == 0 && strcmp(current->password, password) == 0)
{
found = 1;
break;
}
current = current->next;
}
if (found)
{
int pflag = 1;
printf("\n");
printf("欢迎 %s 同学登录\n", current->name);
printf("\n");
while (pflag)
{
printf("1. 修改自身登录密码\n");
printf("2. 查阅自身信息\n");
printf("0. 返回上一层\n");
printf("\n");
scanf("%d", &sel);
switch (sel)
{
case 1:
Modify_Student_Password(current);
break;
case 2:
View_Student_Information(current);
break;
case 0:
pflag = 0;
flag = 0;
break;
default:
printf("错误选择,请重新选择\n");
break;
}
}
}
else
{
printf("输入错误,请重新输入,您还有 %d 次机会\n", 3 - count);
count++;
if (count == 3) {
flag = 0;
printf("输入错误3次,自动退出!\n");
}
}
}
}还有问题吗