程序设计要求:
1,功能要求:增加,删除,查找,修改,排序。
2,要求有管理员和普通用户两个管理系统,且二者都要有登录界面。
3,对于登录界面有要有用户名和密码,且用户名要为正常人名。
4,要有后台能够记录登录信息(eg:什么时候、什么人登录)。
5,要有新用户注册功能;对于新用户注册要有手机号(11位)、邮箱(注意有@)、用户名和密码同上述要求。
6,CodeBlocks上实现(C语言)。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<setjmp.h>
#include<time.h>
//必要
typedef struct Username1
{
char user1[20]; //管理员用户名
char password1[20]; //管理员密码
char email1[20]; //管理员邮箱
char phone1[20]; //管理员手机号
}Username1;
typedef struct _Node1
{
Username1 user1; //管理员用户
struct _Node1* p1Next; //指向下一个结点的指针(指针域)
}Node1;
//链表;结构体
typedef struct Username2
{
char user2[20]; //学生用户名
char password2[20]; //学生密码
char email2[20]; //学生邮箱
char phone2[20]; //学生手机号
}Username2;
typedef struct _Node2
{
Username2 user2; //学生用户
struct _Node2* p2Next; //指向下一个结点的指针(指针域)
}Node2;
//链表;结构体
typedef struct _student
{
char name[20]; //姓名
char sex[20]; //性别
int age; //年龄
char profession[20];//专业
int Class; //班级
long long int stuNum; //学号
int score1; //数学成绩
int score2; //英语成绩
int score3; //政治理论成绩
}student;
//定义一个学生
typedef struct _Node3
{
student stu; //学生
struct _Node3* p3Next; //指向下一个结点的指针(指针域)
}Node3;
//链表;结构体
typedef struct _LoginInformation
{
char user3[20]; //用户名
char email3[20]; //用户邮箱
char phone3[20]; //用户手机号
int Year;
int Mon;
int Day;
int Hour;
int Min;
int Sec; //登录时间
}LoginInfor;
typedef struct _Node4
{
LoginInfor LNInfor ;
struct _Node4* p4Next; //指向下一个结点的指针(指针域)
}Node4;
//链表;结构体
Node1* U_pHead = NULL;
Node2* Q_pHead = NULL;
//用户注册专用
Node3* g_pHead = NULL;
//学生信息专用
Node4* m_pHead = NULL;
//登录时间专用
void denglu1();//管理员登录界面
void denglu2();//学生登录界面
//用户登录界面
void welcome1();//管理员界面
void welcome2();//学生界面
//主页
void InputUser1();//管理员注册
void InputUser2();//学生注册
//注册用户
void Inputstudent();
//录入学生信息
void SaveStudent();
//保存学生信息
void ReadStudent();
//读取学生信息
void SortStudent1();
//按学号排序学生信息
void SortStudent2();
//按成绩排序学生信息
int CountStudent();
//统计学生人数
void PrintStudent();
//查找学生信息
void PrintStudentAll();
//打印全部学生信息
void PrintStudentPro();
//按专业查找学生信息
void PrintStudentSex();
//按性别查找学生信息
void PrintStudentNum();
//按学号查找学生信息
void PrintStudentName();
//按姓名查找学生信息
void PrintStudentAge();
//按年龄查找学生信息
void PrintStudentPoint();
//按分数查找学生信息
void ModifyStudent();
//修改学生信息
void DeleteStudent();
//删除学生信息
Node1* FindUser1();//查找管理员用户信息
Node2* FindUser2();//查找学生用户信息
//查找登录用户
void SaveUser1();//保存管理员用户信息
void SaveUser2();//保存学生用户信息
//保存用户
void ReadUser1();//加载管理员用户信息
void ReadUser2();//加载学生用户信息
//加载用户
int identify(char *str);//用户姓名非法格式判断
int identifyMailbox(char *str);//邮箱非法格式判断
//用户信息非法格式判断
void PrintLoginInfor();//输出登录信息
void SaveLogin();//保存登录信息
void ReadLogin();//读取登录信息
//登录信息
//管理员登录界面
void denglu1()
{
int a,b;
int secretkey=888999 ;//注册密钥
printf("\n");
printf("欢迎进入程序,请选择:1.登录 2.注册 3.退出系统 \n");
scanf("%d", &a);
if (a == 1)
{
Node1* p = FindUser1();
if (p != NULL)
{
printf(" 登录成功!\n");
ReadStudent();
while (1)
{
//死循环 除非使用退出系统,不然程序一直运行
welcome1();
char ch = getch();
//键盘输入指令
//例如:scanf_s;_getch;getchar;如果是DEV或者vs2010则不需要加_
switch (ch)
{
case'1':
PrintStudent();
break;
//查看学生信息
case'2':
Inputstudent();
break;
//增加学生信息
case'3':
ModifyStudent();
break;
//修改学生信息
case'4':
DeleteStudent();
break;
//删除学生信息
case'5':
printf("学生总数为:%d\n", CountStudent());
system("pause");//暂停
system("cls"); //清屏
break;
//统计学生人数
case'6':
printf("已加载完毕学生的信息!\n");
printf("请选择排序方式:1.按学号排序 2.按成绩排序\n");
scanf("%d", &a);
if (a == 1)
{
SortStudent1();
printf("排序成功!\n");
printf("是否查看排序结果?(y/n)\n");
getchar();
if (getchar()=='y'){
PrintStudentAll();
}
break;
}
else if (a == 2)
{
SortStudent2();
printf("排序成功!\n");
printf("是否查看排序结果?(y/n)\n");
getchar();
if (getchar()=='y'){
PrintStudentAll();
}
break;
}
else
{
printf("输入错误!");
system("pause");
system("cls");
//清屏
break;
}
break;
//学生信息排序
case'7':
PrintLoginInfor();
break;
//查看登录信息
case'0':
printf("系统已经关闭\n");
exit(0);
//退出管理系统
default:
printf("输入有误,请重新输入\n");
system("pause");
system("cls"); //清屏
break;
}
}
}
else
{
printf("该用户尚未注册!!!\n");
system("pause");
system("cls");
denglu1();
}
}
//登录选项结束
else if (a == 2)
{
int number;
printf("请输入注册密钥:");
scanf("%d",&number);
if(number==secretkey)
{
printf("密钥正确!\n");
system("pause");
system("cls");
InputUser1(); //注册
printf("用户注册成功,返回登录界面!");
denglu1();
}
else
printf("密钥错误!!!无法注册!!!\n");
denglu1();
}
//注册选项结束
else if (a == 3)
{
printf("系统已经关闭\n");
exit(0);
}
//退出管理系统
else
{
printf("输入错误!");
system("pause");
system("cls");//清屏
denglu1();
}
}
//学生登录界面
void denglu2()
{
int a,b;
printf("\n");
printf("欢迎进入程序,请选择:1.登录 2.注册 3.退出系统 \n");
scanf("%d", &a);
if (a == 1)
{
Node2* p = FindUser2();
if (p != NULL)
{
printf("登录成功!\n");
ReadStudent();
while (1)
{
//死循环 除非使用退出系统,不然程序一直运行
welcome2();
char ch = getch();
//键盘输入指令
//例如:scanf_s;_getch;getchar;如果是DEV或者vs2010则不需要加_
switch (ch)
{
case'1':
{
flag5:
printf("已加载完毕学生的信息....\n");
printf("请选择查找方式:1.按学号查找 2.按姓名查找\n");
scanf("%d", &b);
if (b == 1)
{
PrintStudentNum();
break;
//按学号查找学生信息
}
else if (b == 2)
{
PrintStudentName();
break;
//按姓名查找学生信息
}
else
{
printf("输入错误!");
system("pause");
system("cls");
//清屏
goto flag5;
}
}
//查找学生信息(花括号表示是个复合语句)
case'0':
printf("系统已经关闭\n");
exit(0);
//退出管理系统
default:
printf("输入有误,请重新输入\n");
system("pause");
system("cls"); //清屏
break;
}
}
}
else
{
printf("该用户尚未注册!!!\n");
system("pause");
system("cls");
denglu2();
}
}
else if (a == 2)
{
system("pause");
system("cls");
InputUser2();
printf("用户注册成功,返回登录界面!");
denglu2(); //注册
}
//注册选项结束
else if (a == 3)
{
printf("系统已经关闭\n");
exit(0);
//退出管理系统
}
else
{
printf("输入错误!");
system("pause");
system("cls");
}
//清屏
}
//登录注册
int main(void)
{
int k;
while (1)
{
printf("身份验证中:\n");
printf("你的身份是: 1.管理员 2.学生 ?(请选择)\n");
scanf("%d",&k);
system("pause");
system("cls");
if(k==1)
{
denglu1();
//管理员登录界面
}
else
{
denglu2();
//学生登录界面
}
}
}
//管理员主页
void welcome1()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t\t| 学生成绩管理系统\n");
printf("\t\t|———————————————————————————\n");
printf("\t\t| 管理员功能选项\n");
printf("\t\t| 1.查看学生信息 \n");
printf("\t\t| 2.增加学生信息 \n");
printf("\t\t| 3.修改学生信息 \n");
printf("\t\t| 4.删除学生信息 \n");
printf("\t\t| 5.统计学生人数 \n");
printf("\t\t| 6.学生信息排序 \n");
printf("\t\t| 7.查看登录信息 \n");
printf("\t\t| 0.退出学生成绩管理系统 \n");
}
//学生主页
void welcome2()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t\t| 学生成绩管理系统\n");
printf("\t\t|———————————————————————————\n");
printf("\t\t| 学生功能选项\n");
printf("\t\t| 1.查找学生信息 \n");
printf("\t\t| 0.退出学生成绩管理系统 \n");
}
//录入学生信息
void Inputstudent()
{
//创建一个新结点
Node3* pNewNode = (Node3*)malloc(sizeof(Node3));
pNewNode->p3Next = NULL;
//头插法
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->p3Next = g_pHead;
g_pHead = pNewNode;
}
printf("请输入学生姓名:\n");
scanf("%s", &pNewNode->stu.name);
printf("请输入学生的性别:\n");
scanf("%s", &pNewNode->stu.sex);
printf("请输入学生的年龄:\n");
scanf("%d", &pNewNode->stu.age);
printf("请输入学生的专业:\n");
scanf("%s", &pNewNode->stu.profession);
printf("请输入学生的班级:\n");
scanf("%d", &pNewNode->stu.Class);
//键盘输入指令 &取地址运算符
printf("请输入学生的学号:\n");
scanf("%lld", &pNewNode->stu.stuNum);
//键盘输入指令 &取地址运算符
printf("请输入学生的数学成绩:\n");
scanf("%d", &pNewNode->stu.score1);
printf("请输入学生的英语成绩:\n");
scanf("%d", &pNewNode->stu.score2);
printf("请输入学生的政治成绩:\n");
scanf("%d", &pNewNode->stu.score3);
SaveStudent();
//保存学生信息
printf("学生信息录入成功:\n");
system("pause");
system("cls");
//清屏
}
//录入管理员用户信息
void InputUser1()
{
//创建一个新结点
ReadUser1();
//读取管理员用户信息
int n,i=0;
Node1* pNewNode = (Node1*)malloc(sizeof(Node1));
pNewNode->p1Next = NULL;
//头插法
if (U_pHead == NULL)
{
U_pHead = pNewNode;
}
else
{
pNewNode->p1Next = U_pHead;
U_pHead= pNewNode;
}
flag3:
//输入新结点的相关信息
printf("注册中:\n");
printf("请输入手机号:\n");
scanf("%s", pNewNode->user1.phone1);
char* m=pNewNode->user1.phone1;
while(*(m+i)!='\0')
{
char n=*(m+i);
if('0'<=n&&n<='9')
{
if(strlen(pNewNode->user1.phone1)==11)
{
int temp;
flag1://注意冒号
printf("请输如邮箱号:\n");
scanf("%s", pNewNode->user1.email1);
temp=identifyMailbox(pNewNode->user1.email1);
//邮箱非法格式判断
if(temp==1)
{
flag2:
printf("请输入用户名(中文、英文、数字):\n");
scanf("%s", pNewNode->user1.user1);
n=identify(pNewNode->user1.user1);
//用户名非法格式判断
if(n==1)
{
printf("请输入登录密码:\n");
scanf("%s", pNewNode->user1.password1);
SaveUser1();
printf("用户注册成功,返回登录界面!\n");
system("pause");
system("cls");
denglu1();//返回登录界面
}
else
printf("存在非法字符!!!\n");
goto flag2;
//goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。
// 这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。
}
else
goto flag1;
}
else
printf("手机号错误!!!\n");
InputUser1();
}
else
printf("存在非法字符!!!\n");
goto flag3;
}
}
//录入学生用户信息
void InputUser2()
{
ReadUser2();
//读取学生用户信息
int n,i=0;
//创建一个新结点
Node2* pNewNode = (Node2*)malloc(sizeof(Node2));
pNewNode->p2Next = NULL;
//头插法
if (Q_pHead == NULL)
{
Q_pHead = pNewNode;
}
else
{
pNewNode->p2Next = Q_pHead;
Q_pHead = pNewNode;
}
flag3:
//输入新结点的相关信息
printf("注册中:\n");
printf("请输入手机号:\n");
scanf("%s", pNewNode->user2.phone2);
char* m=pNewNode->user2.phone2;
while(*(m+i)!='\0')
{
char n=*(m+i);
if('0'<=n&&n<='9')
{
if(strlen(pNewNode->user2.phone2)==11)
{
int temp;
flag1://注意冒号
printf("请输如邮箱号:\n");
scanf("%s", pNewNode->user2.email2);
temp=identifyMailbox(pNewNode->user2.email2);
//邮箱非法格式判断
if(temp==1)
{
flag2:
printf("请输入用户名(中文、英文、数字):\n");
scanf("%s", pNewNode->user2.user2);
n=identify(pNewNode->user2.user2);
//用户名非法格式判断
if(n==1)
{
printf("请输入登录密码:\n");
scanf("%s", pNewNode->user2.password2);
SaveUser2();
printf("用户注册成功,返回登录界面!\n");
system("pause");
system("cls");
denglu2();
}
else
printf("存在非法字符!!!\n");
goto flag2;
//goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。
// 这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。
}
else
goto flag1;
}
else
printf("手机号错误!!!\n");
InputUser2();
}
else
printf("存在非法字符!!!\n");
goto flag3;
}
}
//查找管理员用户信息
Node1* FindUser1()
{
ReadUser1();
ReadLogin();
char nStuNum[20];
char szName[20];
printf("请输入用户名: ");
scanf("%s", &szName);
printf("请输入登录密码: ");
scanf("%s", &nStuNum);
//遍历循环
Node1* p = U_pHead;
//头结点
while (p != NULL)
{
if (strcmp(p->user1.password1,nStuNum) == 0 && strcmp(p->user1.user1, szName)==0)
{
time_t tt;
struct tm *t;
tt = time(NULL);
t = localtime(&tt);
//time_t 其实就是long数据类型。
//tm是一个结构体。主要的成员变量是年(相对于1900年的差值),月,日,时,分,秒。
Node4* pNewNode = (Node4*)malloc(sizeof(Node4));
pNewNode->p4Next = NULL;
//头插法
if (m_pHead == NULL)
{
m_pHead = pNewNode;
}
else
{
pNewNode->p4Next = m_pHead;
m_pHead = pNewNode;
}
strcpy(pNewNode->LNInfor.user3,p->user1.user1);
strcpy(pNewNode->LNInfor.phone3,p->user1.phone1);
strcpy(pNewNode->LNInfor.email3,p->user1.email1);
pNewNode->LNInfor.Year=t->tm_year + 1900;//以公元1900年为起始年
pNewNode->LNInfor.Mon=t->tm_mon+1;
pNewNode->LNInfor.Day=t->tm_mday;
pNewNode->LNInfor.Hour=t->tm_hour;
pNewNode->LNInfor.Min=t->tm_min;
pNewNode->LNInfor.Sec=t->tm_sec;
SaveLogin();
return p;
}
p = p->p1Next;
}
//strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。
//基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
return NULL;
}
//查找学生用户信息
Node2* FindUser2()
{
ReadUser2();
ReadLogin();
char nStuNum[20];
char szName[20];
printf("请输入用户名: ");
scanf("%s", &szName);
printf("请输入登录密码: ");
scanf("%s", &nStuNum);
//遍历循环
Node2* p = Q_pHead;
//头结点
while (p != NULL)
{
if (strcmp(p->user2.password2,nStuNum)== 0 && strcmp(p->user2.user2, szName)==0)
{
time_t tt;
struct tm *t;
tt = time(NULL);
t = localtime(&tt);
//time_t 其实就是long数据类型。
//tm是一个结构体。主要的成员变量是年(相对于1900年的差值),月,日,时,分,秒。
Node4* pNewNode = (Node4*)malloc(sizeof(Node4));
pNewNode->p4Next = NULL;
//头插法
if (m_pHead == NULL)
{
m_pHead = pNewNode;
}
else
{
pNewNode->p4Next = m_pHead;
m_pHead = pNewNode;
}
strcpy(pNewNode->LNInfor.user3,p->user2.user2);
strcpy(pNewNode->LNInfor.phone3,p->user2.phone2);
strcpy(pNewNode->LNInfor.email3,p->user2.email2);
pNewNode->LNInfor.Year=t->tm_year + 1900;//以公元1900年为起始年
pNewNode->LNInfor.Mon=t->tm_mon+1;
pNewNode->LNInfor.Day=t->tm_mday;
pNewNode->LNInfor.Hour=t->tm_hour;
pNewNode->LNInfor.Min=t->tm_min;
pNewNode->LNInfor.Sec=t->tm_sec;
SaveLogin();
return p;
}
p = p->p2Next;
}
//strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。
//基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
return NULL;
}
//查找学生信息
void PrintStudent()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t查看学生信息功能\t\t\n");
printf("\t\t| 1.查看全部学生信息 \n");
printf("\t\t| 2.查看指定专业学生信息 \n");
printf("\t\t| 3.查看指定性别学生信息 \n");
printf("\t\t| 4.查看指定学号学生信息 \n");
printf("\t\t| 5.查看指定姓名学生信息 \n");
printf("\t\t| 6.查看指定年龄学生信息 \n");
printf("\t\t| 7.查看指定成绩学生信息 \n");
printf("\t\t| 8.返回管理员界面 \n");
printf("———————————————————————————————————————\n");
int num;
printf("请选择:");
scanf("%d",&num);
if(num==1)
{
PrintStudentAll();
PrintStudent();
//打印全部学生信息
}
else if(num==2)
{
PrintStudentPro();
PrintStudent();
//按专业查找学生信息
}
else if(num==3)
{
PrintStudentSex();
PrintStudent();
//按性别查找学生信息
}
else if(num==4)
{
PrintStudentNum();
PrintStudent();
//按学号查找学生信息
}
else if(num==5)
{
PrintStudentName();
PrintStudent();
//按姓名查找学生信息
}
else if(num==6)
{
PrintStudentAge();
PrintStudent();
//按年龄查找学生信息
}
else if(num==7)
{
PrintStudentPoint();
PrintStudent();
//按成绩查找学生信息
}
else
{
welcome1();
//返回管理员主页
}
}
//打印全部学生信息
void PrintStudentAll()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
Node3* p = g_pHead;
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历链表
while (p != NULL)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
printf("———————————————————————————————————————\n");
system("pause");
system("cls");
//清屏
}
//按专业查找学生信息
void PrintStudentPro()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
char ProInput[20];
printf("请输入指定专业:");
scanf("%s",ProInput);
Node3* p = g_pHead;
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历链表
while (p != NULL)
{
if(p->stu.profession==ProInput||strcmp(p->stu.profession,ProInput)==0)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,
p->stu.score2,p->stu.score3);
p = p->p3Next;
}
else
p = p->p3Next;
}
printf("———————————————————————————————————————\n");
system("pause");
system("cls");
//清屏
}
//按性别查找学生信息
void PrintStudentSex()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
char SexInput[20];
printf("请输入指定性别:");
scanf("%s",&SexInput);
Node3* p = g_pHead;
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历链表
while (p != NULL)
{
if(p->stu.sex==SexInput||strcmp(p->stu.sex,SexInput)==0)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
else
p = p->p3Next;
}
printf("———————————————————————————————————————\n");
system("pause");
system("cls");
//清屏
}
//按学号查找学生信息
void PrintStudentNum()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
int nStuNum;
char szName[20];
printf("请输入要查找的学生的学号:\n");
scanf("%d", &nStuNum);
Node3* p = g_pHead;
//头结点
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历循环
while (p != NULL)
{
if (p->stu.stuNum == nStuNum)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
p = p->p3Next;
}
printf("———————————————————————————————————————\n");
system("pause");
system("cls");
//清屏
}
//按姓名查找学生信息
void PrintStudentName()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
char szName[20];
printf("请输入要查找的学生的姓名:\n");
scanf("%s", szName);
Node3* p = g_pHead;
//头结点
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历循环
while (p != NULL)
{
if (p->stu.name == szName|| 0 ==strcmp (p->stu.name,szName))
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
p = p->p3Next;
}
printf("———————————————————————————————————————\n");
system("pause");
system("cls");
//清屏
}
//按年龄查找学生信息
void PrintStudentAge()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
int AgeInput;
printf("请输入指定年龄:");
scanf("%d",&AgeInput);
Node3* p = g_pHead;
//头结点
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历链表
while (p != NULL)
{
if(p->stu.age==AgeInput)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
else
p = p->p3Next;
}
printf("———————————————————————————————————————\n");
system("pause");
system("cls");
//清屏
}
//按分数查找学生信息
void PrintStudentPoint()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
printf("请输入科目选项: 1.数学 2.英语 3.政治\n ");
int num;
int PointMin1,PointMax1,PointMin2,PointMax2,PointMin3,PointMax3;
//最低分和最高分
Node3* p = g_pHead;
//头结点
scanf("%d",&num);
//数学科目筛选
if(num==1)
{
printf("请输入分值范围:\n");
printf("请输入最低分:");
scanf("%d",&PointMin1);
printf("请输入最高分:");
scanf("%d",&PointMax1);
system("pause");
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历链表
while(p != NULL)
{
if(p->stu.score1>=PointMin1&&p->stu.score1<=PointMax1)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
else
p = p->p3Next;
}
}
//英语科目筛选
else if(num==2)
{
printf("请输入分值范围:\n");
printf("请输入最低分:");
scanf("%d",&PointMin2);
printf("请输入最高分:");
scanf("%d",&PointMax2);
system("pause");
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历链表
while(p != NULL)
{
if(p->stu.score2>=PointMin2&&p->stu.score2<=PointMax2)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
else
p = p->p3Next;
}
}
//政治科目筛选
else if(num==3)
{
printf("请输入分值范围:\n");
printf("请输入最低分:");
scanf("%d",&PointMin3);
printf("请输入最高分:");
scanf("%d",&PointMax3);
system("pause");
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
printf(" 专业 班级 学号 姓名 性别 年龄 数学成绩 英语成绩 政治成绩 \n");
//遍历链表
while(p != NULL)
{
if(p->stu.score3>=PointMin3&&p->stu.score3<=PointMax3)
{
printf(" %s %d %lld %s %s %d %d %d %d \n",
p->stu.profession,p->stu.Class,p->stu.stuNum,p->stu.name,p->stu.sex,p->stu.age,p->stu.score1,p->stu.score2,p->stu.score3);
p = p->p3Next;
}
else
p = p->p3Next;
}
}
else
printf("输入有误!!!");
system("pause");
system("cls");
PrintStudentPoint();
}
//修改学生信息
void ModifyStudent()
{
int nStuNum;
printf("请输入需要修改的学生的学号:\n");
scanf("%d", &nStuNum);
//头结点
Node3* p = g_pHead;
//遍历链表
while (p != NULL)
{
if (p->stu.stuNum == nStuNum)
{
printf("已找到该学生的信息!\n");
printf("请输入修改后的姓名:\n");
scanf("%s", &p->stu.name);
printf("请输入修改后的的学号:\n");
scanf("%d", &p->stu.stuNum);
printf("请输入修改后的数学成绩:\n");
scanf("%d",&p->stu.score1);
printf("请输入修改后的英语成绩:\n");
scanf("%d",&p->stu.score2);
printf("请输入修改后的政治成绩:\n");
scanf("%d",&p->stu.score3);
SaveStudent();
printf("修改成功\n");
break;
}
p = p->p3Next;
}
if (p == NULL)
{
printf("没有找到该学生信息");
}
system("pause");//暂停
system("cls"); //清屏
}
//删除学生信息
void DeleteStudent()
{
int nStuNum;
printf("已加载学生的信息!\n");
printf("请输入要删除的学生的学号:\n");
scanf("%d", &nStuNum);
Node3* p=g_pHead,*t=p->p3Next;
Node3* p1;
//判断是不是头结点
if (g_pHead->stu.stuNum == nStuNum)
{
printf("学生信息删除成功!!!");
p1 = g_pHead;
g_pHead = g_pHead->p3Next; //头结点被删掉了,头结点的后继结点做头;
free(p1);//释放内存
SaveStudent();
return;
}
while(t!=NULL)
{
if(t->stu.stuNum!=nStuNum)
{
t=t->p3Next;
p=p->p3Next;
}
else
{
p->p3Next=t->p3Next;//p的后继指向t的后继
free(t);//释放内存
SaveStudent();
printf("学生信息删除成功!!!\n");
return;
}
}
system("pause");//暂停
system("cls"); //清屏
}
//按学号排序学生信息
void SortStudent1(){
Node3* p = g_pHead;
Node3* p1,*p2,temp;
int Num;
flag8:
printf("请选择排序方式: 1.从小到大 2.从大到小\n ");
scanf("%d",&Num);
if(Num>2){
printf("输入有误!!!");
goto flag8;
}
if(p==NULL)
{
printf("无数据,无法排序");
}
if(p->p3Next==NULL)
{
printf("只有一个数据,无法排序");
}
if(Num==1)
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.stuNum>p1->stu.stuNum)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
else if(Num==2)
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.stuNum<p1->stu.stuNum)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
else
printf("输入有误!!!");
system("pause");
system("cls");
goto flag8;
}
//按成绩排序学生信息
void SortStudent2(){
Node3* p = g_pHead;
Node3* p1,*p2,temp;
int Num1,Num2;
flag3:
printf("请选择科目: 1.数学 2.英语 3.政治\n");
scanf("%d",&Num1);
if(Num1>3){
printf("输入有误!!!");
goto flag3;
//goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。
// 这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。
}
flag4:
printf("请选择排序方式: 1.从小到大 2.从大到小\n ");
scanf("%d",&Num2);
if(Num2>2){
printf("输入有误!!!");
goto flag4;
}
if(p==NULL)
{
printf("无数据,无法排序!!!");
system("pause");
system("cls");
welcome1();
}
if(p->p3Next==NULL)
{
printf("只有一个数据,无法排序!!!");
system("pause");
system("cls");
welcome1();
}
if(Num1==1)
{
if(Num2==1)
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.score1>p1->stu.score1)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
else
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.score1<p1->stu.score1)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
}
else if(Num1==2)
{
if(Num2==1)
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.score2>p1->stu.score2)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
else
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.score2<p1->stu.score2)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
}
else if(Num1==3)
{
if(Num2==1)
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.score3>p1->stu.score3)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
else
{
while(p->p3Next!=NULL)
{
p1=p->p3Next;
while(p1!=NULL)
{
if(p->stu.score3<p1->stu.score3)
{
temp=*p;
*p=*p1;
*p1=temp;
temp.p3Next=p->p3Next;
p->p3Next=p1->p3Next;
p1->p3Next=temp.p3Next;
}
p1=p1->p3Next;
}
p=p->p3Next;
}
return;
}
}
}
//统计学生人数
int CountStudent()
{
int nCount = 0;
//学生数
Node3* p = g_pHead;
//遍历
while (p != NULL)
{
nCount++;
//每偏移一个Count数加一
p = p->p3Next;
}
return nCount;
}
//输出登录信息
void PrintLoginInfor()
{
system("cls");
printf("———————————————————————————————————————\n");
printf("*\t\t\t\t学生成绩管理系统\t\t\n");
printf("———————————————————————————————————————\n");
printf("登录记录:\n");
//头结点
Node4* a = m_pHead;
//遍历链表
while (a != NULL)
{
printf("%s %s %s\n",a->LNInfor.user3,a->LNInfor.phone3,a->LNInfor.email3);
printf("time:%d:%d:%d %d:%d:%d\n",a->LNInfor.Year, a->LNInfor.Mon,a->LNInfor.Day,
a->LNInfor.Hour,a->LNInfor.Min,a->LNInfor.Sec);
a = a->p4Next;
}
printf("———————————————————————————————————————\n");
system("pause");
system("cls");
welcome1();
}
//用户名非法格式判断
int identify(char *str)
{
char *p=str;
int temp;
while(*str)
{
if(*str=='`'||*str=='-'||*str=='='||*str==' '||*str=='['||*str==']'||*str==';'||
*str==','||*str=='.'||*str=='/'||*str=='`'||*str=='!'||*str=='@'||*str=='#'||
*str=='$'||*str=='%'||*str=='^'||*str=='&'||*str=='*'||*str=='('||*str==')'||*str=='+'||
*str=='{'||*str=='}'||*str==':'||*str=='"'||*str=='|'||*str=='<'||*str=='>'||*str=='?'||
*str=='~')
{
temp=0;
break;
}
else
temp=1;
str++;
}
return temp;
}
//邮箱非法格式判断
//可以对几个流行服务商的邮箱地址进行判断
//网易163(用户名只能包含_,英文字母,数字);
//腾讯邮箱(由英文、数字、点、减号、下划线组成);
//gmail(只能使用字母 (a-z)、数字 (0-9) 和数点 (.));
//yahoo邮箱(4至32个字符(包括字母、数字、下划线),且必须以英文字母开始)
int identifyMailbox(char *str)
{
if(str==NULL)
{
printf("邮箱格式错误!!!\n");
return 0;
}
int iAtPos=0,iLastDotPos=0,i=0,iAtTimes=0;
while(*(str+i)!='\0')
{
char ch=*(str+i);
if(!isprint(ch)||isspace(ch)) //空格和控制字符是非法的
{
iAtTimes=0;
break;
}
if(ch=='@')
{
iAtPos=i;
iAtTimes+=1;
}
else if(ch=='.')
{
iLastDotPos=i;
}
i++;
}
//对@以及域名依靠位置来判断,限制长度为64
if(i>64||iAtPos<1||(iLastDotPos-2)<iAtPos||(i-iLastDotPos)<3||(i-iLastDotPos)>5||iAtTimes>1||iAtTimes==0)
{
printf("邮箱格式错误!!!\n");
return 0;
}
return 1 ;
}
以下为文件操作
//保存学生信息
void SaveStudent()
{
//打开文件
FILE* fp = fopen("stuinfo.txt", "w");
if (fp == NULL)
{
printf("打开文件失败.\n");
return;
}
//遍历链表
Node3* p = g_pHead;
while (p != NULL)
{
fwrite(&p->stu, 1, sizeof(student), fp);
//student stu;结构体
p = p->p3Next;
}
//关闭文件
fclose(fp);
}
//读取学生信息
void ReadStudent()
{
FILE* fp = fopen("stuinfo.txt", "r");
if (fp == NULL)
{
printf("打开文件失败\n");
return;
}
//读取文件
student stu;
while (fread(&stu, 1, sizeof(student), fp))
{
Node3* pNewNode = (Node3*)malloc(sizeof(Node3));
pNewNode->p3Next = NULL;
memcpy(pNewNode, &stu, sizeof(student));
//头插法
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->p3Next = g_pHead;
g_pHead = pNewNode;
}
}
//关闭文件
fclose(fp);
}
//保存管理员用户信息
void SaveUser1()
{
//打开文件
FILE* fp1 = fopen("User1.txt", "w");
if (fp1 == NULL)
{
printf("保存用户失败.\n");
return;
}
//遍历链表
Node1* p = U_pHead;
while (p != NULL)
{
fwrite(&p->user1, 1, sizeof(Username1), fp1);
//Username1 user1;结构体
p = p->p1Next;
}
//关闭文件
fclose(fp1);
printf("保存用户成功\n");
}
//保存学生用户信息
void SaveUser2()
{
//打开文件
FILE* fp2 = fopen("User2.txt", "w");
if (fp2 == NULL)
{
printf("保存用户失败.\n");
return;
}
//遍历链表
Node2* p = Q_pHead;
while (p != NULL)
{
fwrite(&p->user2, 1, sizeof(Username2), fp2);
//Username2 user2;结构体
p = p->p2Next;
}
//关闭文件
fclose(fp2);
printf("保存用户成功\n");
}
//读取管理员用户信息
void ReadUser1()
{
FILE* fp1 = fopen("User1.txt", "r");
if (fp1 == NULL)
{
printf("加载用户失败\n");
return;
}
//读取文件
Username1 user1;
while (fread(&user1, 1, sizeof(Username1), fp1))
{
Node1* pNewNode = (Node1*)malloc(sizeof(Node1));
pNewNode->p1Next = NULL;
memcpy(pNewNode, &user1, sizeof(Username1));
//头插法
if (U_pHead == NULL)
{
U_pHead = pNewNode;
}
else
{
pNewNode->p1Next = U_pHead;
U_pHead = pNewNode;
}
}
//关闭文件
fclose(fp1);
//清屏
}
//读取学生用户信息
void ReadUser2()
{
FILE* fp2 = fopen("User2.txt", "r");
if (fp2 == NULL)
{
printf("加载用户失败\n");
return;
}
//读取文件
Username2 user2;
while (fread(&user2, 1, sizeof(Username2), fp2))
{
Node2* pNewNode = (Node2*)malloc(sizeof(Node2));
pNewNode->p2Next = NULL;
memcpy(pNewNode, &user2, sizeof(Username2));
//头插法
if (Q_pHead == NULL)
{
Q_pHead = pNewNode;
}
else
{
pNewNode->p2Next = Q_pHead;
Q_pHead = pNewNode;
}
}
//关闭文件
fclose(fp2);
//清屏
}
//保存登录信息
void SaveLogin()
{
//打开文件
FILE* fp3 = fopen("LoginInfor.txt", "w");
if (fp3 == NULL)
{
printf("保存信息失败.\n");
return;
}
//遍历链表
Node4* a = m_pHead;
while (a != NULL)
{
fwrite(&a->LNInfor, 1, sizeof(LoginInfor), fp3);
//LoginInfor LNInfor;结构体
a = a->p4Next;
}
//关闭文件
fclose(fp3);
}
//读取登录信息
void ReadLogin()
{
FILE* fp4 = fopen("LoginInfor.txt", "r");
if (fp4 == NULL)
{
printf("加载信息失败\n");
return;
}
//读取文件
LoginInfor LNInfor;
while (fread(&LNInfor, 1, sizeof(LoginInfor), fp4))
{
Node4* pNewNode = (Node4*)malloc(sizeof(Node4));
pNewNode->p4Next = NULL;
memcpy(pNewNode, &LNInfor, sizeof(LoginInfor));
//头插法
if (m_pHead == NULL)
{
m_pHead = pNewNode;
}
else
{
pNewNode->p4Next = m_pHead;
m_pHead = pNewNode;
}
}
//关闭文件
fclose(fp4);
}