include<stdio.h>
include<stdlib.h>
include<windows.h>
include<conio.h>
include<string.h>
typedef enum {MAN, WOMAN} SEX;
typedef struct Student {
int StuId; //学生的编号
char StuName[20]; //学生的姓名
SEX sex; //学生的性别
int age; //学生的年龄
float score; //学生的成绩
char census[20]; //学生的户籍地
struct Student next; //下一个节点的指针
} STUDENT, NEWSTUDENT;
STUDENT top; //头节点
void HomePage();
void intlogin();
void student_login();
void teacher_login();
void StudentMenu();
void TeacherMenu();
NEWSTUDENT CreateStu();//创建一个节点,返回一个新创建的学生信息节点的指针
NEWSTUDENT GetPrev(int num);//返回指定编号学生节点的上一个节点的指针
int AddStu(NEWSTUDENT pstu);//把学生信息节点加入到链表中
void ShowAll();
void DeleteStu(int StuId);
void ReviseStu(int StuId);
void SearchStu(int StuId);
int getStuId();
int Question(const char *pstr);
int main() {
system("color a4"); //设置DOS窗口的背景颜色和字体颜色
HomePage();//打开首页
}
void HomePage() {//首页
system("cls");
int i;
printf("\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t 物联网学生信息管理系统 \t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t 请输入数字进入相应的管理系统 \t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t 1、学生管理系统 \t\t\t☆★\n");
printf(" ★☆\t\t 2、教师管理系统 \t\t\t☆★\n");
printf(" ★☆\t\t 3、退出管理系统 \t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t 输入数字按回车键确定选择\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
scanf("%d",&i);
switch(i) {
case 1:
intlogin();
student_login();
break;
case 2:
intlogin();
teacher_login();
break;
case 3:
system("exit");
exit(0);
default:
system("cls");
HomePage();
}
}
void intlogin() {
if(getchar()=='\n');
printf("\t\t 系统正在初始化,马上进入登录界面,请稍后......\n");
Sleep(3000);
system("cls");
}
void student_login() {//学生登录界面,并且做密码验证,成功即转到学生菜单
int tpwd=0;
char ch=' ';
int count=0;
char stu_key[20]="1";
char pwd_key[10]="111111";
char stu[20];
char pwd[10];
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ★☆\t\t\t正在登录学生管理系统 \t\t☆★\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf("\n\n\n");
printf(" \t\t\t 请输入您的用户名和密码!\n");
printf(" \t\t (友情提示:用户名1,密码111111)\n\n\n");
printf(" \t\t 用户名:");
fflush(stdin);
gets(stu);
printf(" \t\t 密 码:");
fflush(stdin);
//gets(pwd);
//改成*号状态代替密码
{
for(int i=0; i<6; i++) {
fflush(stdin);
ch=getch();
if(ch=='\n')
break;
putchar('*');
if(ch==pwd_key[i]) {
count++;
if(count==6) {
tpwd=1; //表明密码正确
break;
}
} else if(count==6)
tpwd=0;
}
}
if(getchar()=='\n');
if((strcmp(stu_key,stu)==0)&&tpwd) {
printf("\n\n\n\n\n");
printf("\n\t\t\t\t恭喜您登录成功^_^\n");
printf("\n\t\t\t 正在进入系统,请稍后... ...");
Sleep(1000);
for(int j=5; j>0; j--) {
system("cls");
printf("\n\n\n\n\n\n\n\n");
printf("\n\t\t\t\t还有%d秒进入系统...",j);
Sleep(1000);
}
StudentMenu();
} else {
Sleep(1000);
for(int j=5; j>0; j--) {
system("cls");
printf("\n\n\n\n\n\n\n\n");
printf("\n\t\t\t\t用户名和密码不对,请重新输入!\n");
printf("\n\t\t\t\t还有%d秒返回系统首页...",j);
Sleep(1000);
}
HomePage();
}
}
void teacher_login() {//教师登录界面,并且做密码验证,成功即转到教师菜单
int tpwd=0;
char ch=' ';
int count=0;
char stu_key[20]="2";
char pwd_key[10]="222222";
char stu[20];
char pwd[10];
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ★☆\t\t\t正在登录教师管理系统 \t\t☆★\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf("\n\n\n");
printf(" \t\t\t 请输入您的用户名和密码!\n");
printf(" \t\t (友情提示:用户名2,密码222222)\n\n\n");
printf(" \t\t 用户名:");
fflush(stdin);
gets(stu);
printf(" \t\t 密 码:");
fflush(stdin);
//gets(pwd);
//改成*号状态代替密码
{
for(int i=0; i<6; i++) {
fflush(stdin);
ch=getch();
if(ch=='\n')
break;
putchar('*');
if(ch==pwd_key[i]) {
count++;
if(count==6) {
tpwd=1; //表明密码正确
break;
}
} else if(count==6)
tpwd=0;
}
}
if(getchar()=='\n');
if((strcmp(stu_key,stu)==0)&&tpwd) {
printf("\n\n\n\n\n");
printf("\n\t\t\t\t恭喜您登录成功^_^\n");
printf("\n\t\t\t 正在进入系统,请稍后... ...");
Sleep(1000);
for(int j=5; j>0; j--) {
system("cls");
printf("\n\n\n\n\n\n\n\n");
printf("\n\t\t\t\t还有%d秒进入系统...",j);
Sleep(1000);
}
TeacherMenu();
} else {
Sleep(1000);
for(int j=5; j>0; j--) {
system("cls");
printf("\n\n\n\n\n\n\n\n");
printf("\n\t\t\t\t用户名和密码不对,请重新输入!\n");
printf("\n\t\t\t\t还有%d秒返回系统首页...",j);
Sleep(1000);
}
HomePage();
}
}
void StudentMenu() {//学生功能菜单
system("cls");
printf("\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t 学生管理系统 \t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t1.查找某个学生信息 2.显示所有学生信息\t\t☆★\n");
printf(" ★☆\t3.退出学生管理系统 4.返回管理系统首页\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t 输入数字按回车键确定选择\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
int num;
printf("\n 请选择菜单(1 ~ 4):");
scanf("%d", &num);
switch(num) {
case 1:
printf("你选择了菜单1\n");
break;
case 2:
char ch;
do {
ShowAll();
printf("\n\t\t\t 执行完毕,按任意键继续...");
ch=getch();
} while(!ch);
StudentMenu();
break;
case 3:
system("exit");
exit(0);
case 4:
HomePage();
break;
default:
printf("\n");
printf(" 选择菜单错误,请重新选择(1 ~ 4):\n");
for(int j=5; j>0; j--) {
printf("\n\t\t\t 等待%d秒刷新本界面...",j);
Sleep(1000);
}
fflush(stdin);//清空输入缓冲区
StudentMenu();
}
}
void TeacherMenu() { //教师功能菜单
system("cls");
printf("\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t 教师管理系统 \t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t1.查找某个学生信息 2.显示所有学生信息\t\t☆★\n");
printf(" ★☆\t3.添加一个学生信息 4.删除某个学生信息\t\t☆★\n");
printf(" ★☆\t5.修改某个学生信息 6.退出教师管理系统\t\t☆★\n");
printf(" ★☆\t7.返回管理系统首页\t\t\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆\t\t 输入数字按回车键确定选择\t\t\t☆★\n");
printf(" ★☆\t\t\t\t\t\t\t\t☆★\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
int num;
printf("\n 请选择菜单(1 ~ 7):");
scanf("%d", &num);
switch(num) {
case 1:
char chs;
do {
SearchStu(getStuId());
printf("\n\t\t\t 执行完毕,按任意键继续...");
chs=getch();
} while(!chs);
TeacherMenu();
break;
case 2:
char ch;
do {
ShowAll();
printf("\n\t\t\t 执行完毕,按任意键继续...");
ch=getch();
} while(!ch);
TeacherMenu();
break;
case 3:
AddStu(CreateStu());
printf("\n\t\t\t 执行完毕,等待刷新界面...");
Sleep(2000);
TeacherMenu();
break;
case 4:
DeleteStu(getStuId());
printf("\n\t\t\t 执行完毕,等待刷新界面...");
Sleep(2000);
TeacherMenu();
break;
case 5:
ReviseStu(getStuId());
printf("\n\t\t\t 执行完毕,等待刷新界面...");
Sleep(2000);
TeacherMenu();
break;
case 6:
system("exit");
exit(0);
case 7:
system("exit");
exit(0);
default:
printf("\n");
printf(" 选择菜单错误,请重新选择(1 ~ 7):\n");
for(int j=5; j>0; j--) {
printf("\n\t\t\t 等待%d秒刷新本界面...",j);
Sleep(1000);
}
fflush(stdin);//清空输入缓冲区
TeacherMenu();
}
}
NEWSTUDENT CreateStu() {//创建新学生并做相关校验
int sex;
NEWSTUDENT pstu = (NEWSTUDENT)malloc(sizeof(STUDENT));//在堆内存申请空间,存储学生信息
if(!pstu)
{
printf(" 申请内存空间失败!\n");
return NULL;
}
printf(" 请输入学生的学号(10位学号):");
while(1 != scanf("%d", &pstu->StuId) || GetPrev(pstu->StuId))
{
printf(" 学生的学号输入错误或已经存在,请重新输入学生的学号(10位学号):");
fflush(stdin);
}
printf(" 请输入学生的姓名(小于20字符):");
scanf("%20s", pstu->StuName);//(*pstu).name
printf(" 请选择学生的性别(1.男 2.女):");
while(1 != scanf("%d", &sex) || sex < 1 || sex > 2)
{
printf(" 性别选择错误,请重新选择学生的性别(1.男 2.女):");
fflush(stdin);
}
if(1 == sex)
pstu->sex = MAN;
else
pstu->sex = WOMAN;
printf(" 请输入学生的年龄(10 ~ 40):");
while(1 != scanf("%d", &pstu->age) || pstu->age < 10 || pstu->age > 40)
{
printf(" 年龄输入错误!请重新输入学生的年龄(10 ~ 40):");
fflush(stdin);
}
printf(" 请输入学生的成绩(0 ~ 100):");
while(1 != scanf("%f", &pstu->score) || pstu->score < 0 || pstu->score > 100)
{
printf(" 成绩输入错误!请重新输入学生的成绩(0 ~ 100):");
fflush(stdin);
}
printf(" 请输入学生的户籍地(某某省某某市):");
scanf("%20s", pstu->census);
pstu->next = NULL;
return pstu;
}
NEWSTUDENT GetPrev(int StuId){//获取上一个节点
NEWSTUDENT pstu = ⊤
while(pstu->next)
{
if(pstu->next->StuId == StuId)
return pstu;
pstu = pstu->next;
}
return NULL;
}
int AddStu(NEWSTUDENT pstu){//添加学生
NEWSTUDENT ps = ⊤
if(!pstu)
{
return 0;
}
//判断一下该学生信息是不是已经存在
if(GetPrev(pstu->StuId))
{
printf(" 学号为%d的学生信息已经存在!\n", pstu->StuId);
free(pstu);//释放该节点内存空间
return 0;
}
//while循环的作用是找到当前链表的最后一个节点
while(ps->next)
ps = ps->next;
//把新节点加入到最后那个节点的后面
ps->next = pstu;
pstu->next = NULL;
return 1;
}
void ShowAll(){//显示所有学生的信息
NEWSTUDENT pstu = ⊤
printf(" ★☆\t\t\t所有学生的信息 \t\t☆★\n");
printf(" ╔══════╦════╦═══╦═══╦════╦═════════╗\n");
printf(" ║ 学号 ║ 姓名 ║ 性别 ║ 年龄 ║ 成绩 ║ 户籍地 ║\n");
printf(" ╠══════╬════╬═══╬═══╬════╬═════════╣\n");
printf(" ║1662030108 ║ 林某帅 ║ 男 ║ 20 ║ 50.0 ║ 广东省中山市 ║\n");
printf(" ╠══════╬════╬═══╬═══╬════╬═════════╣\n");
while(pstu->next)
{
printf(" ║%d", pstu->next->StuId);
printf(" ║ %s", pstu->next->StuName);
printf(" ║ %s", pstu->next->sex == MAN ? "男" : "女");
printf(" ║ %d", pstu->next->age);
printf(" ║ %.1f", pstu->next->score);
printf(" ║ %s ║\n", pstu->next->census);
pstu = pstu->next;//让指针指向下一个节点
}
printf(" ╚══════╩════╩═══╩═══╩════╩═════════╝\n");
}
void DeleteStu(int StuId){//用学号删除某个学生
NEWSTUDENT pstu, ptmp;
if(pstu = GetPrev(StuId))
{
if(!Question(" 确定要删除该学生信息吗?"))
{
return;
}
ptmp = pstu->next;
pstu->next = ptmp->next;
free(ptmp);
printf(" 删除了学号为%d的学生信息。\n", StuId);
}
else
{
printf(" 没有找到学号为%d的学生信息。\n", StuId);
}
}
int getStuId(){//获取用户输入的学生的学号
int StuId;
printf(" 请输入学生的学号(10位学号):");
while(1 != scanf("%d", &StuId))
{
printf(" 学号输入错误!请重新输入学生的学号(10位学号):");
fflush(stdin);
}
return StuId;
}
void ReviseStu(int StuId){//修改某个学生的信息
NEWSTUDENT pstu = GetPrev(StuId);//获取要修改的学生节点的上一个节点
int choose;
if(!pstu)
{
printf(" 没有学号为%d的学生信息。\n", StuId);
return;
}
pstu = pstu->next;//将要修改的学员节点的指针改为指向自己的
printf(" 当前学生的姓名为%s,", pstu->StuName);
if(Question(" 确定要修改吗?"))
{
printf(" 请输入学生的姓名(小于20字符):");
scanf("%20s", pstu->StuName);
}
printf(" 当前学生的性别为%s,", pstu->sex == MAN ? "男" : "女");
if(Question(" 确定要修改吗?"))
{
printf(" 请输入学生的性别(1.男 2.女):");
while(1 != scanf("%d", &choose) || choose < 1 || choose > 2)
{
printf(" 输入错误,请重新输入学生的性别(1.男 2.女):");
fflush(stdin);
}
if(1 == choose)
pstu->sex = MAN;
else
pstu->sex = WOMAN;
}
printf(" 当前学生的年龄为%d,", pstu->age);
if(Question(" 确定要修改吗?"))
{
printf(" 请输入学生的年龄(10 ~ 40):");
while(1 != scanf("%d", &pstu->age) || pstu->age < 10 || pstu->age > 40)
{
printf(" 年龄输入错误!请重新输入学生的年龄(10 ~ 40):");
fflush(stdin);
}
}
printf(" 当前学生的成绩为%.1f,", pstu->score);
if(Question(" 确定要修改吗?"))
{
printf(" 请输入学生的成绩(0 ~ 100):");
while(1 != scanf("%f", &pstu->score) || pstu->score < 10 || pstu->score > 40)
{
printf(" 成绩输入错误!请重新输入学生的成绩(0 ~ 100):");
fflush(stdin);
}
}
printf(" 当前学生的户籍地为%s,", pstu->census);
if(Question(" 确定要修改吗?"))
{
printf(" 请输入学生的户籍地(某某省某某市:");
scanf("%20s", pstu->census);
}
printf(" 修改完毕!\n");
}
void SearchStu(int StuId) {//查询某个学生的信息
NEWSTUDENT pstu = GetPrev(StuId);
pstu = pstu->next;
printf(" ★☆\t\t\t当前学生的信息 \t\t☆★\n");
printf(" ╔══════╦════╦═══╦═══╦════╦═════════╗\n");
printf(" ║ 学号 ║ 姓名 ║ 性别 ║ 年龄 ║ 成绩 ║ 户籍地 ║\n");
printf(" ╠══════╬════╬═══╬═══╬════╬═════════╣\n");
printf(" ║%d", pstu->next->StuId);
printf(" ║%d", pstu->StuName);
printf(" ║ %s", pstu->sex == MAN ? "男" : "女");
printf(" ║ %d", pstu->age);
printf(" ║ %.1f", pstu->score);
printf(" ║ %s ║\n", pstu->census);
printf(" ╚══════╩════╩═══╩═══╩════╩═════════╝\n");
}
int Question(const char *pstr){//请求用户是否进行下一步的操作
char answer;
printf("%s请选择(y or n):", pstr);
while(1 != scanf(" %c", &answer) || (answer != 'y' && answer != 'n'))
{
printf(" 输入错误!%s请重新选择(y or n):", pstr);
fflush(stdin);//清空输入缓冲区,C库函数
}
if('y' == answer)
return 1;
else
return 0;
}