学生信息管理系统

学生信息管理系统,第1张

学生信息管理系统 程序设计要求:

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,则返回零;若str1str2,则返回正数。
	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,则返回零;若str1str2,则返回正数。
	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.stuNumstu.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.score1stu.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.score2stu.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.score3stu.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);

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5713846.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存