1,功能要求:增加,删除,查找,修改,排序。
2,要求有管理员和普通用户两个管理系统,且二者都要有登录界面。
3,对于登录界面有要有用户名和密码,且用户名要为正常人名。
4,要有后台能够记录登录信息(eg:什么时候、什么人登录)。
5,要有新用户注册功能;对于新用户注册要有手机号(11位)、邮箱(注意有@)、用户名和密码同上述要求。
6,CodeBlocks上实现(C语言)。
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include #include #include #include //必要 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("学生总数为:%dn", 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("nnnnn"); printf("tt| 学生成绩管理系统n"); printf("tt|———————————————————————————n"); printf("tt| 管理员功能选项n"); printf("tt| 1.查看学生信息 n"); printf("tt| 2.增加学生信息 n"); printf("tt| 3.修改学生信息 n"); printf("tt| 4.删除学生信息 n"); printf("tt| 5.统计学生人数 n"); printf("tt| 6.学生信息排序 n"); printf("tt| 7.查看登录信息 n"); printf("tt| 0.退出学生成绩管理系统 n"); } //学生主页 void welcome2() { system("cls"); printf("nnnnn"); printf("tt| 学生成绩管理系统n"); printf("tt|———————————————————————————n"); printf("tt| 学生功能选项n"); printf("tt| 1.查找学生信息 n"); printf("tt| 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)!='') { 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)!='') { 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,则返回正数。 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,则返回正数。 return NULL; } //查找学生信息 void PrintStudent() { system("cls"); printf("———————————————————————————————————————n"); printf("*tttt学生成绩管理系统ttn"); printf("———————————————————————————————————————n"); printf("*tttt查看学生信息功能ttn"); printf("tt| 1.查看全部学生信息 n"); printf("tt| 2.查看指定专业学生信息 n"); printf("tt| 3.查看指定性别学生信息 n"); printf("tt| 4.查看指定学号学生信息 n"); printf("tt| 5.查看指定姓名学生信息 n"); printf("tt| 6.查看指定年龄学生信息 n"); printf("tt| 7.查看指定成绩学生信息 n"); printf("tt| 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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("*tttt学生成绩管理系统ttn"); 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 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 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 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 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("*tttt学生成绩管理系统ttn"); printf("———————————————————————————————————————n"); printf("登录记录:n"); //头结点 Node4* a = m_pHead; //遍历链表 while (a != NULL) { printf("%s %s %sn",a->LNInfor.user3,a->LNInfor.phone3,a->LNInfor.email3); printf("time:%d:%d:%d %d:%d:%dn",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)!='') { 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) 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); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)