C大作业学生信息管理系统

包含功能

1、账号的登录和注册,密码加密。

2、登录退出的日志记录。

3、创建学生信息。可通过键盘输入或文件导入来创建初始学生信息。

4、增加学生信息。可通过键盘输入或文件导入将学生信息按学号升序插入学生信息。

5、浏览学生信息,将磁盘内所有学生信息打印在屏幕上。

6、修改学生信息。1)根据提供的学号查找并修改学生信息,可以只修改部分信息,由运行界面的交互信息来进行提示;2)找不到时给出提示;

7、查找学生信息,1)通过学号或姓名来查找学生信息可多次查找;2)找不到时给出提示;

8、删除学生信息。1)通过学号查找要删除的学生信息,且可删除多个学生信息,并将信息保留在另一文件里;2)找不到时给出提示,并可进行增加学生信息;

9、保存信息并退出。

编写过程中我遇到的问题在之前博客里有讲。

所用到的文件 文件要代与码文件放在一个目录下

储存账信号息的文件:User Information.txt
储存登录日志的文件:journal.txt
储存学生信息的文件:Student Information.txt
储存被删掉的数据的文件:Deleted Information.txt
创建学生信息的文件://数据格式如①,具体文件自己创建
增加学生信息的文件://数据格式如①,具体文件自己创建


学生信息在文件中的存放格式:数据以空格隔开,按学号升序换行存放。
②键盘输入学生信息格式要求:数据以空格隔开,与文件数据格式一样,按学号升序输入

学号 姓名 性别 出生日期 语文 数学 英语
1005  tom  M  2000-1-1  87  80  90

关于中文文字乱码处理
其他人在CSDN上有解答

账号 密码以空格隔开,密码已被加密,密钥在代码中。
在这里插入图片描述

.cpp代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define key 0x86 //定义密钥 
struct data
  {
    
     int  year;  //年
    int  month; //月
    int  day; //日
   };  
struct  student
{
    
      int snum;  //学号
   char name[10]; //姓名
   char sex;  //性别
   struct data birthday;  //出生日期
   int  score[3] ; //课程成绩
   };
typedef struct node
{
    
      struct  student  data;  //结点数据域
   struct node * next;   //结点指针域
 }Node;
 
 typedef struct user//记录用户信息 
{
    
    
	char name[20];
	char password[20];
	struct user *next;
 }User; 

void PageInitilalization();//功能界面 

int sign();//用户登录 注册 
int ExamInformation(char input_username[], char input_password[]);//登录账号 
int Examing(char input_username [], char input_password[], char file_username[], char file_password[]); //账号验证 当返回值为2时,账号密码均正确;为1时,仅账号正确;为0时,账号密码均错误 

void CreatInformation();//1创建信息 

void AddInformation();//2增加学生信息 

void PrintInformation();//3浏览信息

void changeInformation();//4修改信息
void change_snum(Node *stu1,Node *stu2,Node *stu_first);//修改学号 
void change_name(Node *stu2,Node *stu_first);//修改姓名 
void change_sex(Node *stu2,Node *stu_first);//修改性别 
void change_data(Node *stu2,Node *stu_first);//修改出生日期 
void change_grade(Node *stu2,Node *stu_first);//修改成绩 
void change_all(Node *stu1,Node *stu2,Node *stu_first); //全部修改 

 

void FindInformation();//5查找信息 

void DeleteInfortmation();//6删除信息 

Node *GetFileInformation(char s[]);//从文件中获取信息 
void InformationToFile(Node *s1,Node *s2);//将链表中信息打印到文件中 

int main()
{
    
    
	PageInitilalization(); 
}
void PageInitilalization()//初始界面 
{
    
    
	int choose = -1;
	FILE *f1 ;
	f1 = fopen("journal.txt","a") ;
	if(sign())//登录成功 
	{
    
    
		printf("登录成功\n");
		system("pause"); 
		system("cls");
		int i = 1;
	while(i)
	{
    
    
	printf("==================学生信息管理系统==================\n");
	
	printf("===================================================\n");
	printf("             0---保存信息并退出                    \n");
	printf("             1---创建学生信息                      \n");
	printf("             2---增加学生信息                      \n");
	printf("             3---浏览学生信息                      \n");
	printf("             4---修改学生信息                      \n");
	printf("             5---查找学生信息                      \n");
	printf("             6---删除学生信息                      \n");
	printf("===================================================\n");
	printf("\n请输入选项0--6:");
	
	while(!scanf("%d",&choose) || choose > 6 || choose < 0)//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入选项(1--2):\n");
	}
	system("cls");
	i = choose;//当choose == 0 时,不进行下一次循环 
	switch(choose)
	{
    
    
		case 0:goto exit;break;//保存并退出 
		case 1:CreatInformation();break;//1创建文件信息 
		case 2:AddInformation();break;//2增加学生信息
		case 3:PrintInformation();break;//4浏览信息
		case 4:changeInformation();break;//修改信息 
		case 5:FindInformation();break;//5查找信息 
		case 6:DeleteInfortmation();//6删除信息 	
	}
	
	}
	
	}
	else printf("程序结束"); //登录不成功时,选择退出 
	
	while(0)//退出并保留信息 
	{
    
    
		exit://goto语句 
		SYSTEMTIME sys;//获取系统时间 
        GetLocalTime( &sys ); 
		printf("信息已保存,退出登录成功");
		//记录退出时间 ,并打印在日志文件里 
		fprintf(f1," 退出时间:%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
		fclose(f1) ;
		} 

}
int sign()//用户登录 注册 
{
    
    
	int i = 1,choose = 0;
	char input_username[20] = {
    
    0},input_password[20] = {
    
    0}; 
	printf("==================学生信息管理系统==================\n");
	printf("----------------------------------------------------\n");
	printf("                      1---登录                      \n");
	printf("                      2---注册                      \n");
	printf("----------------------------------------------------");
	printf("\n请输入选项(1--2):"); 
	
	while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入选项(1--2):\n");
	}
	system("cls");
	if(choose == 1)//登录账号 
	{
    
    
		login://goto语句 
		printf("*******************用户登录*******************\n"); 
		while(i)
		{
    
    
			printf("请输入用户名:");
			while(!scanf("%s",input_username))
			{
    
    
				printf("输入错误,请重新输入\n");
				fflush(stdin);
			}
			printf("请输入密码:");
			while(!	scanf("%s",input_password))
			{
    
    
				printf("输入错误,请重新输入\n");
				fflush(stdin);
			}
			i = ExamInformation(input_username,input_password);//判断账号密码是否正确 ,如果正确i=1,错误为 0; 
	        if(i) break;
			else if(!i)//账号密码 错误时 
			{
    
    
				printf("----------------------------------------------------\n");
				printf("0---退出\n");
				printf("1---重试\n");
				printf("2---注册\n"); 
				printf("----------------------------------------------------\n");
				while(!scanf("%d",&i) || i < 0 || i >2 )
				{
    
    
				printf("输入错误,重新输入\n");
				fflush(stdin);
				}
				system("cls");
				if(i == 2)
	   	     {
    
    
	   	     	i = 1;
	   	     	goto Register;//注册 
	   	     	break;
	   	     	
				}
			}
	   	     
		}
	
		return i;
	 } 
	else if(choose == 2)//注册账号 
	{
    
    
		Register://由登录转注册 
		FILE*f1;
		f1 = fopen("User Information.txt","a");
		printf("*******************账号注册*******************\n"); 
		printf("请输入用户名(以英文输入模式,输入小于20个字符,不支持空格符、制表符、换行符):\n");
		while(!scanf("%s",input_username))
		{
    
    
			printf("输入错误,请重新输入\n");
			fflush(stdin);
		}
		printf("请输入密码(以英文输入模式,输入小于20个字符,不支持空格符、制表符、换行符):\n");
		while(!	scanf("%s",input_password))
		{
    
    
			printf("输入错误,请重新输入\n");
			fflush(stdin);
		}
		for(int i = 0;i < strlen(input_password);i++)//对密码进行异或加密 
		{
    
    
			input_password[i] = input_password[i] ^ key;
		}
		fprintf(f1,"%s %s\n",input_username,input_password);//打印到用户信息文件里 
		fclose(f1);
		
		printf("账号注册成功, \n按回车键继续.......返回登录界面\n");
		
		system("pause");
		system("cls");
		goto login;//返回登录页面 
	}
	

}
int ExamInformation(char input_username[],char input_password[])//登录验证 
{
    
    
	FILE *f2,*f3; 
	User s ;
	int i = 0;
	f2 = fopen("User Information.txt","r");
	f3 = fopen("journal.txt","a");
	int error = 0;
    while(!feof(f2))//获取文件信息 
		 {
    
    
		 	SYSTEMTIME sys; //获取系统时间 
            GetLocalTime( &sys ); 
		 
		 	
		 	if(fscanf(f2,"%s %s",s.name,s.password) == 2) //判断是否获取到正确数据 
	        {
    
    
			  if(Examing(input_username,input_password,s.name,s.password) == 2)//账号密码  均正确 
			  {
    
    
			  	printf("账号密码正确,登录成功\n"); 
			  	i = 1;
			  	//记录用户名和登录时间 精确到毫秒 
			  	fprintf(f3,"%s 登录时间: %4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d",s.name,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
			  	
			  	break;
			  }
			  else if(Examing(input_username,input_password,s.name,s.password) == 1)//仅账号正确 
			  {
    
    
			  	printf("密码错误\n"); 
			  	break;
			  } 
			
	        } 
	        
	        else //文件账号密码存放格式错误提示 
	        {
    
    
	        	if(error == 1)//至少会出现一次为EOF 
	        	{
    
    
	        		printf("文件信息格式错误"); 
				}
	            error++;	
	  	    
	        }
	       
		} 
		if(feof(f2))//无匹配账号时 
			  {
    
    
			  	printf("账号密码错误\n"); 
			  }
		 
		  fclose(f2);
		  fclose(f3);
		 
		  return i;
}
int Examing(char input_username[],char input_password[],char file_username[],char file_password[])//账号密码检验 
{
    
    
	int i = 0;
	char *s = input_password;
	 if(strcmp(input_username,file_username) == 0)//验证账号 
	 {
    
    
	 	i++;
	    while(*s != '\0')//密码加密 
	    {
    
    
	    	*s = *s ^ key;
	    	s++;
		} 
		if(strcmp(input_password,file_password) == 0)//验证密码 
		{
    
    
			i++;
		}
		
	 }
	 return i;
	  
}
void CreatInformation()//1---创建信息 
{
    
    
	int choose = 0;
	
	printf("*****************学生信息的创建******************\n");
	printf("-------------------------------------------------");
	printf("\n           1---从键盘输入数据信息                       ");
	printf("\n           2---从文件读取数据信息                       \n");
	printf("-------------------------------------------------");
	printf("\n请输入选项(1--2):"); 
	
	while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入选项(1--2):\n");
	}
	 
	if(choose == 1) //从键盘输入学生信息 
	{
    
    
		FILE *f1;
	    f1 = fopen("Student Information.txt","w");
		Node *p = NULL,*fp = NULL;
		int number = 0;
		printf("你选择了从键盘输入数据,请继续......");
		printf("请输入学生人数:\n");
		
		while(!scanf("%d",&number))//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入学生人数:\n");
	}
	 
	printf("请按照 学号  姓名   性别  出生日期  语文  数学  英语的顺序输入每个学生的信息(按学号升序输入)如:\n");
	printf("1005  tom  M  2000-1-1  87  80  90\n");
	
	p = (Node *)malloc(sizeof(Node ) * number);//申请长度为number  

	for(int i = 0;i < number;i ++)//从键盘获取信息 
	while(scanf("%d %s %c %d-%d-%d %d %d %d",&(p+i) -> data.snum, (p+i) -> data.name, &(p+i)->data.sex, &(p+i) -> data.birthday.year,
	&(p+i) -> data.birthday. month, &(p+i) -> data.birthday.day, &(p+i) -> data.score[0], &(p+i) -> data.score[1], &(p+i) -> data.score[2])!=9)//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("本次输入错误,请重新输入:\n");
	}//数据输入异常分析 
	
	for(int i = 0;i < number;i ++)// 将信息从链表储存到文件Student Information.txt 
	fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",(p+i) -> data.snum, (p+i) -> data.name, (p+i)->data.sex, (p+i) -> data.birthday.year,
	(p+i) -> data.birthday. month, (p+i) -> data.birthday.day, (p+i) -> data.score[0], (p+i) -> data.score[1], (p+i) -> data.score[2]);
	
	free(p);  
	fclose(f1);
	}
	
	else //从文件获取学生信息 
	{
    
    
		FILE *f2; 
		char filename[20] = {
    
    0};
		Node *s = NULL,*p = NULL;
		
		printf("你选择了从文件输入数据,请继续......\n");
		printf("文件信息需按照“学号  姓名   性别  出生日期  语文  数学  英语”格式(按学号升序换行存放)");
		printf("请输入文件名称:");
		
		while(!scanf("%s",filename))//获取文件名
		{
    
    
			printf("文件名输入错误\n");
			fflush(stdin); 
		 }
		 s = GetFileInformation(filename)->next; //将文件信息存在链表,并返回表头,头不存值 
		 InformationToFile(s,p);//用已有函数,文件链表与空的链表比较信息,将文件链表打印到学生信息文件里 
	}

	printf("创建成功!\n按回车键继续.......返回主界面");
	system("pause");
	system("cls");
}
void AddInformation()//2---增加信息 
{
    
    
	
	int choose = 0;
	char filename1[30] = "Student Information.txt";
	
	printf("*******************学生信增加*******************\n");
	printf("-------------------------------------------------");
	printf("\n           1---从键盘输入数据信息                       ");
	printf("\n           2---从文件读取数据信息                       \n");
	printf("-------------------------------------------------");
	printf("\n请输入选项(1--2):"); 
	
	
	while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入选项(1--2):\n");
	}
	 
	 
	if(choose == 1) //从键盘输入学生信息 
	{
    
    
		Node *p = NULL,*s1 = NULL,*s = NULL,*s2 = NULL;
		//Node *first = NULL,*add = NULL,*last = NULL;
		FILE *f1;
		
		int number = 0;
		
		printf("你选择了从键盘输入数据,请继续......");
		printf("请输入学生人数:\n");
		
		while(!scanf("%d",&number))//数据输入错误处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入学生人数:\n");
	}
	  
	   printf("请按照 学号  姓名   性别  出生日期  语文  数学  英语的顺序输入每个学生的信息如:\n");
	   printf("1005 tom M 2000-1-1 87 80 90\n");
	   
	s1 = (Node*)malloc(sizeof(Node));//表头 
	s1->next = NULL;
	s = s1;
	
	for(int i = 0;i < number;i++)//动态申请 
	{
    
    
		p = (Node *)malloc(sizeof(Node));
		p->next = NULL;
		
		while(scanf("%d %s %c %d-%d-%d %d %d %d",&p -> data.snum, p -> data.name, &p->data.sex, &p -> data.birthday.year,
	&p -> data.birthday. month, &p -> data.birthday.day, &p -> data.score[0], &p -> data.score[1], &p -> data.score[2])!=9)//数据输入异常处理 
	{
    
    
		 
		fflush(stdin);
		printf("本次输入错误,请重新输入:\n");
	}//数据输入异常处理 
	
	s->next = p;
	s = s->next;	
	
	}
	
	s1 =s1->next;
	
	s2 = GetFileInformation(filename1)->next;//获取文件信息 
	InformationToFile(s1,s2) ;//s2为Student Information.txt,
	
	}
	
	else //从文件获取学生信息 
	{
    
    
		
		char filename2[20] = {
    
    0};
		Node *s1 = NULL,*s2 = NULL;
	
		printf("你选择了从文件输入数据,请继续......\n");
		printf("请输入文件名称:");
		
		while(!scanf("%s",filename2))//获取文件名 
		{
    
    
			fflush(stdin);
			printf("文件名输入错误"); 
		}
		s1 = GetFileInformation(filename2)->next;//函数返回表头为空 
		s2 = GetFileInformation(filename1)->next;
		 
		InformationToFile(s1,s2) ;//s2为Student Information.txt,s1为增加信息的文件 
		 
		  
	}
	
	printf("学生信息增加成功\n按回车键继续.......返回主界面");
	system("pause");
	system("cls");
}
void PrintInformation()//3---浏览信息 
{
    
    
	FILE *f1 ;
	Node p;
	int i = 0;
	f1 = fopen("Student Information.txt","r");
	printf("               所有学生信息如下\n");
	printf("学号  姓名   性别  出生日期  语文  数学  英语\n");
	while(!feof(f1))//将信息打印在屏幕上 
	{
    
    
		if(fscanf(f1,"%d %s %c %d-%d-%d %d %d %d",&p.data.snum,p.data.name,&p.data.sex,&p.data.birthday.year,&p.data.birthday.month,
	    &p.data.birthday.day,&p.data.score[0],&p.data.score[1],&p.data.score[2]) == 9)
	    
		printf("%d   %d %s %c %d-%d-%d %d %d %d\n",i,p.data.snum,p.data.name,p.data.sex,p.data.birthday.year,p.data.birthday.month,
	    p.data.birthday.day,p.data.score[0],p.data.score[1],p.data.score[2]) ;
	    
		i++;
	} 
	fclose(f1);
	printf("学生信息打印完毕!\n按回车键继续.......返回主界面"); 
	system("pause");
	system("cls");
}
void changeInformation()//4---修改信息 
{
    
    
	char filename[30] = "Student Information.txt";
	Node *first = NULL;
	int choose1 = 0;
	int time = 1;
	while(time)
	{
    
    
		first = GetFileInformation(filename)->next;
	printf("*****************修改学生信息******************\n");
	printf("-----------------------------------------------\n");
	printf("             1---输入要修改的学生的学号\n");
	printf("             2---返回上已界面\n"); 
	printf("-------------------------------------------------");
	printf("\n请输入选项(1--2):"); 
	while(!scanf("%d",&choose1) || choose1 < 1 || choose1 > 2)//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入选项(1--2):\n");
	}
	if(choose1 == 1)//修改信息 
	{
    
    
		int sunm1 = 0;
		Node *stu_first = NULL,*stu1 = NULL,*stu2 = NULL;
		printf("请输入学生学号:");
		while(!scanf("%d",&sunm1))
		{
    
    
			printf("输入错误,请输入学号");
			fflush(stdin); 
		}
		
		stu_first = GetFileInformation(filename);
		
		stu1 = stu_first;
		stu2 = stu_first->next;
		
		while(stu2 && stu2->data.snum != sunm1)//检索信息 
		{
    
    
		
			stu1 = stu1->next;
			stu2 = stu2->next;
		}
		if(!stu2)
		{
    
    
			printf("无该学生信息\n"); 
			system("pause");
			printf("-----------------------------------------------\n");
		    printf("\n0---停止查找\n1---继续查找其他学生信息\n2---增加该学生信息\n");
		    printf("-----------------------------------------------\n");
	        printf("请输入:");
            while(!scanf("%d",&time) || time > 2 || time < 0)
	      {
    
    
		    printf("输入错误,请重新输入");
		    fflush(stdin); 
	      }	
	      if(time == 2 || time == 0)
	      {
    
    
	      	
	      	if(time == 2)  //增加文件信息 
	      	{
    
    
	      		 AddInformation();
	      		 system("cls"); 
			  }
			
	      	break;
		  }
	      system("cls");
		}
		else//有该学号的学生信息 
		{
    
    
			int choose2 = 0;
			printf("该学生生信息为:学号  姓名   性别  出生日期  语文  数学  英语\n%d %s %c %d-%d-%d %d %d %d\n",stu2->data.snum,stu2->data.name,stu2->data.sex,stu2->data.birthday.year,stu2->data.birthday.month,stu2->data.birthday.day,
			stu2->data.score[0],stu2->data.score[1],stu2->data.score[2]);
			printf("-------------------------------------------------\n");
			printf("             0---不修改\n");
	        printf("             1---只修改学生学号\n");
	        printf("             2---只修改学生的姓名\n"); 
	        printf("             3---只修改学生性别\n");
			printf("             4---只修改学生出生日期\n");
			printf("             5---只修改学生成绩\n");
			printf("             6---修改学生所有信息\n"); 			 
	        printf("-------------------------------------------------\n");
	        printf("请输入0--6:"); 
	        while(!scanf("%d",&choose2) || choose2 < 0 || choose2 >6)//数据输入异常处理 
	       {
    
    
		     fflush(stdin);
		     printf("输入错误,请输入选项(1--2):\n");
	       }
	       system("cls");
	       printf("该学生信息为:学号  姓名   性别  出生日期  语文  数学  英语\n%d %s %c %d-%d-%d %d %d %d\n",stu2->data.snum,stu2->data.name,stu2->data.sex,stu2->data.birthday.year,stu2->data.birthday.month,stu2->data.birthday.day,
			stu2->data.score[0],stu2->data.score[1],stu2->data.score[2]);
			
	       switch(choose2)//修改选择 
	       {
    
    
	       	case 0:break;
	       	case 1:change_snum(stu1,stu2,stu_first); break;//修改学号 
	       	case 2:change_name(stu2,stu_first); break;//姓名 
	       	case 3:change_sex(stu2,stu_first); break;//性别 
	       	case 4:change_data(stu2,stu_first); break;//出生日期 
	       	case 5:change_grade(stu2,stu_first); break;//成绩 
	       	case 6:change_all(stu1,stu2,stu_first);//所有 
		   }
		   if(choose2)//修改时 
		   printf("学生信息修改成功!\n按回车键继续"); 
		   system("pause");
		   printf("\n输入0停止查找,输入其他继续查找\n");
	       printf("请输入:");
           while(!scanf("%d",&time))
	      {
    
    
		    printf("输入错误,请重新输入");
		    fflush(stdin); 
	      }
	      system("cls");
		}
		 
	}
	else//不修改 
	{
    
    
		time = 0;
	
	}
	}
   
	system("pause");	
	system("cls");
}
void change_snum(Node *stu1,Node *stu2,Node *stu_first)//1修改学号 
{
    
    
	
	printf("请输入要改成的学号:");
	scanf("%d",&stu2->data.snum);
	stu1->next = stu2->next;
	stu2->next = NULL;
	
	InformationToFile(stu2,stu_first->next);
	
}
void change_name(Node *stu2,Node *stu_first)//2修改姓名 
{
    
    
	Node *p = NULL;
	printf("请输入要改成的姓名:");
	scanf("%s",stu2->data.name);
	InformationToFile(p,stu_first->next);
	 
}
void change_sex(Node *stu2,Node *stu_first)//3修改性别 
{
    
    
	Node *p = NULL;
	
	printf("请输入要改成的性别:");
	fflush(stdin);
	scanf("%c",&stu2->data.sex);
	InformationToFile(p,stu_first->next);
	 
}
void change_data(Node *stu2,Node *stu_first)//4修改出生日期 
{
    
    
	Node *p = NULL;
	printf("请输入要改成的出生日期,格式如:\n2000-3-3\n");
	scanf("%d-%d-%d",&stu2->data.birthday.year,&stu2->data.birthday.month,&stu2->data.birthday.day);
	InformationToFile(p,stu_first->next);
	 
}
void change_grade(Node *stu2,Node *stu_first)//5修改成绩 
{
    
    
	Node *p = NULL;
	printf("请输入要改成的成绩格式如:\n88 88 88\n");
	scanf("%d %d %d",&stu2->data.score[0],&stu2->data.score[1],&stu2->data.score[2]);
	InformationToFile(p,stu_first->next);
	 
}
void change_all(Node *stu1,Node *stu2,Node *stu_first)//6修改全部信息 
{
    
    
	printf("请按照 学号  姓名   性别  出生日期  语文  数学  英语的顺序输入每个学生的信息如:\n");
	printf("1005  tom  M  2000-1-1  87  80  90\n");
	scanf("%d %s %c %d-%d-%d %d %d %d",&stu2->data.snum,stu2->data.name,&stu2->data.sex,&stu2->data.birthday.year,&stu2->data.birthday.month,&stu2->data.birthday.day,
			&stu2->data.score[0],&stu2->data.score[1],&stu2->data.score[2]);
	stu1->next = stu2->next;
	stu2->next = NULL;
	InformationToFile(stu2,stu_first->next);
	
}

void FindInformation()//5---查找信息 
{
    
    
	Node *first = NULL; 
	int choose = 0;
	char s[30] = "Student Information.txt";
	int time = 1;
	while(time)//设置重复查找 
	{
    
    
		first = GetFileInformation(s)->next;
	printf("*******************学生信息查找*******************\n");
	printf("-------------------------------------------------\n");
	printf("                   1---学号查找\n");
	printf("                   2---姓名查找\n"); 
	printf("-------------------------------------------------\n"); 
	printf("\n请输入选项(1--2):");
	while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入选项(1--2):\n");
	} 
	if(choose == 1)//学号查找 
	{
    
    
		int snum1 = 0;
		printf("请输入学号:");
	    while(!scanf("%d",&snum1))
	    {
    
    
	    	fflush(stdin);
	    	printf("输入错误,请输入选项");
		}
		while(first && first->data.snum != snum1)//遍历链表 
		{
    
    
			first = first->next;
		}
		if(!first)//无 
		{
    
    
			printf("无该学生信息"); 
		}
		else//有该生信息 
		{
    
    
			printf("该学生信息为:学号  姓名   性别  出生日期  语文  数学  英语\n%d %s %c %d-%d-%d %d %d %d",first->data.snum,first->data.name,first->data.sex,first->data.birthday.year,
			first->data.birthday.month,first->data.birthday.day,first->data.score[0],first->data.score[1],first->data.score[2]);
		}
		
	}
	else//姓名查找 
	{
    
    
		char name[20] = {
    
    0};
		printf("请输入学生姓名:"); 
		scanf("%s",name);
		while(first && strcmp(first->data.name,name) != 0)//从左到右比较ASCII,小于为负,相等为0,大于为正 
		{
    
    
			first = first->next;
		}
		if(!first)
		{
    
    
			printf("无该学生信息"); 
		}
		else//有该生信息 
		{
    
    
			printf("该学生信息为:学号  姓名   性别  出生日期  语文  数学  英语\n%d %s %c %d-%d-%d %d %d %d",first->data.snum,first->data.name,first->data.sex,first->data.birthday.year,
			first->data.birthday.month,first->data.birthday.day,first->data.score[0],first->data.score[1],first->data.score[2]);
		}
		
	}
	system("pause"); 
	printf("\n输入0停止查找,输入其他继续查找\n") ;
	printf("请输入:");
	while(!scanf("%d",&time))
	{
    
    
		printf("输入错误,请重新输入");
		fflush(stdin); 
	}
	 if(time)
	 system("cls");
	}
	
	printf("学生信息查找结束,\n按回车键继续.......返回主界面");
	system("pause");
	system("cls");
}
void DeleteInfortmation()//6---删除信息 
{
    
    
	int choose = 0;
	printf("*****************学生信息的删除******************\n");
	printf("-------------------------------------------------\n");
	printf("             1---输入学号删除信息\n");
	printf("             2---返回上一层\n");
	printf("-------------------------------------------------\n");
	printf("\n请输入选项(1--2):"); 
	while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理 
	{
    
    
		fflush(stdin);
		printf("输入错误,请输入选项(1--2):\n");
	}
	
	if(choose == 1)//学号删除 
	{
    
    
		int number = 0,snum1 = 0;
		FILE *f1;
		Node *first = NULL, *first1 = NULL,*first2 = NULL,*last = NULL;
		char filename[30] = "Student Information.txt";
		f1 = fopen("Deleted Information.txt","w") ;
		
		first = GetFileInformation(filename);
		
		printf("请输入要删除的学生信息人数:");
		scanf("%d",&number);
	
        for(int i = 0;i < number;i++)//删除学号 
        {
    
    
        	printf("请输入要删除的学生信息的学生学号:\n");
			scanf("%d",&snum1);
			
			first1 = first;
			first2 = first->next; 
        	while(first2 && first2->data.snum != snum1)//判断是否有该生信息 
        	{
    
    
        		first1 = first1->next;
        		first2 = first2->next; 
			}
			if(!first2)//无 
			{
    
    
				printf("\n无学号为%d的学生的信息\n",snum1);
			}
			else//有该生信息 
			{
    
    
				first1->next = first2->next;
				first2->next = NULL;
				fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",first2->data.snum, first2->data.name, first2->data.sex,first2->data.birthday.year,
	        first2->data.birthday.month, first2->data.birthday.day, first2->data .score[0],first2->data.score[1], first2-> data.score[2]);
			}
		}
		
		InformationToFile(last,first->next);
		
		fclose(f1);
		
		printf("学生信息删除成功");
		printf("按回车件返回上一界面\n按回车键继续.......返回主界面");
		system("pause");
		system("cls"); 
	}
	else
	{
    
    
		printf("按回车键返回上一界面\n");
		system("pause");
		system("cls");
	}
	
}
Node *GetFileInformation(char filename[])//获取文件信息,以链表方式储存,返回表头 
{
    
    
	
	FILE *f2; 
	Node *first = NULL,*last = NULL,*s = NULL;
		 f2 = fopen(filename,"r");
	 	
		 first = (Node *)malloc(sizeof(Node));//表头 
		 first->next = NULL;//当文件为空时 ,return 的first->next 为随机值 会导致出错 
		 last = first;
		 int error = 0;
		 while(!feof(f2))//获取文件信息 
		 {
    
    
		 	
		 	
		 	s = (Node *)malloc(sizeof(Node));
		 	
		 	
		 	if(s == NULL)//申请失败提示 
			 {
    
    
		     printf("Not able to allocate memory. \n");
		     exit(1);
         	}
         	 s->next = NULL;
		 	if(fscanf(f2,"%d %s %c %d-%d-%d %d %d %d",&s -> data.snum, s -> data.name, &s->data.sex, &s-> data.birthday.year,
	           &s -> data.birthday.month, &s -> data.birthday.day, &s -> data .score[0], &s -> data.score[1], &s -> data.score[2]) == 9) //确定链表是否获取到正确的数据 
	        {
    
    
			
	 	    last -> next = s;//first为空 
	        last = s;
	        } 
	        else //文件格式错误提示 
	        {
    
    
	        	if(error == 1)//至少会出现一次为EOF 
	        	{
    
    
	        		printf("文件信息格式错误");
					free(s); //如果数据错误,释放空间 
	        		break; //停止读取数据 
				}
	            error++;	
	  	    
	        }
	       
		} 
		  fclose(f2);
		  return first;
		 
}
void InformationToFile(Node *s1,Node *s2)//将两个链表中数据按学号升序打印在文件 Student Information.txt 
{
    
    
	Node *p1 = NULL,*p2 = NULL,*p3 = NULL;
	p1 = s1;
	p2 = s2;

	FILE *f1;
	f1 = fopen("Student Information.txt","w");
    printf("打印到Student Information.txt的信息:\n");
	while(p1&&p2)//非空时比较 
	{
    
    
		
		if(p1->data.snum < p2->data.snum)//学号小于 
		{
    
    
			
			fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p1 -> data.snum, p1 -> data.name, p1->data.sex,p1 -> data.birthday.year,
	        p1 -> data.birthday.month, p1 -> data.birthday.day, p1 -> data .score[0],p1 -> data.score[1], p1 -> data.score[2]); 
	       printf("%d %s %c %d-%d-%d %d %d %d\n",p1 -> data.snum, p1 -> data.name, p1->data.sex,p1 -> data.birthday.year,
	        p1 -> data.birthday.month, p1 -> data.birthday.day, p1 -> data .score[0],p1 -> data.score[1], p1 -> data.score[2]);
	        p3 = p1;
	        p1 = p1->next;
	        free(p3);
		}
		else if(p1->data.snum > p2->data.snum)//学号大于 
		{
    
    
			
			fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
	        p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]); 
	        printf("%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
	        p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]);
	        p3 = p2;
	        p2 = p2->next;
	        free(p3);
		}
		else//学号相同 打印Student Information.txt,内信息 
		{
    
    
			fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
	        p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]); 
	        printf("%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
	        p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]);
	        
			p3 = p1;
			p1 = p1->next;
			free(p3);
			p3 = p2;
			p2 = p2->next; 
			free(p3);
		}
	}
	
	if(p1)
	p3 = p1;
	else
	p3 = p2; 
	
	while(p3)//继续将非空的链表打印到文件里 
	{
    
    
		
		fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p3 -> data.snum, p3 -> data.name, p3->data.sex,p3 -> data.birthday.year,
	    p3 -> data.birthday.month, p3 -> data.birthday.day, p3 -> data .score[0],p3 -> data.score[1], p3 -> data.score[2]); 
	    printf("%d %s %c %d-%d-%d %d %d %d\n",p3 -> data.snum, p3 -> data.name, p3->data.sex,p3 -> data.birthday.year,
	    p3 -> data.birthday.month, p3 -> data.birthday.day, p3 -> data .score[0],p3 -> data.score[1], p3 -> data.score[2]);
	    p1 = p3;
	    p3 = p3->next;
	    free(p1);
	}
	fclose(f1);
}

菜鸟一枚,如有错误,还请指正

猜你喜欢

转载自blog.csdn.net/RunningBeef/article/details/106782366