宿舍管理查询软件

一、项目概述

本项目是博主之前用纯C语言写的一个软件,目的是为了给宿舍管理人员编写一个宿舍管理查询软件,该软件具有以下功能:

  1. 建立数据文件,文件中保存着宿舍入住人员的信息,包括姓名、学号、房号、
    联系电话、家庭联系电话等;
  2. 软件中可按关键字(姓名、学号、房号)对人员信息进行排序;
  3. 软件提供查询功能(用二分查找实现以下操作)可分别按姓名、学号、房号等
    进行查询
  4. 可在软件中增加和删除入住人员。
    说完概述,话不多说,上图!给大家看最终成品。
    未登陆时
    在这里插入图片描述
    登录成功时
    在这里插入图片描述
    登陆失败时
    在这里插入图片描述
    增加学生页面
    在这里插入图片描述
    修改学生页面
    在这里插入图片描述
    关键字排序
    在这里插入图片描述

按学号排序结果
在这里插入图片描述
按学号查找
在这里插入图片描述
按学号删除
在这里插入图片描述
显示所有学生信息
在这里插入图片描述
功能大概就是以上,接下来对每个功能进行详细解析。

二、程序解析

  1. 首先看主函数,主函数结构非常清晰,首先是进入登陆界面,登入成功的话进入主菜单,进入主菜单后对按键按下的值进行判断,进而执行相应的功能函数。
int main()  													//主函数 
{
	Student Stu;										//建立学生信息表结构体 
	int flag=0;
	flag=Sign_in();										//登陆界面 
	if(flag<0)											//登陆失败 
	{
		printf("登陆失败!!!\n");
		return 0;
	}
	else												//登陆成功 
	{
		printf("登陆成功\n");
		Sleep(1500);									//延时1.5s	
		system("cls");
		Menu();											//进入主菜单 
		while(choice>0&&choice <=8)						//判断所要选择的功能 
		{	
			switch(choice)
			{
				case 1:
						Read_Stu(Stu);					//读入学生信息 
						Allprint(Stu);					
						Again();
						break;	
				case 2:
						AddStu(Stu);					//增加学生信息 
						Allprint(Stu);
						Again();
						break;	
				case 3:
						ChangeStu(Stu);					//修改学生信息 
						Allprint(Stu);
						Again();
						break;
				case 4: 
				 		Sort_Menu(Stu,Stu.stunum);		//对学生信息进行排序			 		
						break;
				case 5:
					    Serch_Menu(Stu,Stu.stunum);		//查找学生信息 
						break;
				
				case 6:	
						DeleteStu(Stu);					//删除学生信息 
						Sleep(1000);
						Allprint(Stu);
				 		Again();
				 		break; 
				case 7:	
						Sleep(500);									//延时0.5s	
						system("cls");
						Allprint(Stu);
				 		Again();
				 		break;
				case 8:	
						Sleep(500);									//延时0.5s	
						system("cls");
						Add_god(); 
				 		Again();
				 		break;
				case 0:					
						break;						
			}
		}
		printf("感谢您的使用,再见!\n");
	}	
	return 0; 
}

以下是结构体定义和一些全局变量

int choice ; 				//主菜单选择功能变量 
int sort_flag,serch_flag;	//排序和查找选择功能变量 
int Stu_num_BinarySearch_flag[20];
int Stu_num_BinarySearch_flag1=0;
int House_BinarySearch_flag[20];
int House_BinarySearch_flag1=0;
int Name_BinarySearch_flag[20];
int Name_BinarySearch_flag1=0;

char mpassword [10]={0};
typedef struct
{
    char stu_num[20];	//学生学号 
    char name[20];		//学生姓名
    char house[20];		//学生宿舍号 
    char tel_num[20];	//学生联系电话
    char home_num[20];	//学生家庭电话 
}StuType;				// 学生信息结构体

typedef struct
{
    StuType S[stu_range];	//学生结构体数组15
    int stunum;		//学生人数
}Student;			//学生整体信息储存 
  1. 登陆界面
int Sign_in()   												//登陆界面 
{
	char password[]={"123"},password1[]={"000"};			//默认密码 
	char input[16]={0};
	int i_flag=3;						//每日可输入错密码的次数 
	printf("*******************宿舍管理查询软件**********************\n");
	printf("请输入您的登陆密码:");

	while(i_flag)
	{		
		scanf("%s",input) ;		 
		if (!strcmp(password, input)||!strcmp(password1, input))//输入密码与默认密码相等时 返回0 
			return 0;
		else						//输入密码与默认密码不相等时 返提示重新输入,次数减少 
		{
			i_flag--;
			printf("密码错误,今日剩余输入次数为%d次\n",i_flag); 
			if(i_flag!=0) 
				printf("请重新输入您的登陆密码:");
		}
	}
	return -1;						//输入错误密码次数用完,返回-1,进入系统失败 
	
 } 
  1. 读入学生信息
void Read_Stu(Student &Stu)   									//从文件中读入信息到结构体
{
	system("cls"); 
	printf("*******************欢迎进入创建学生信息学生界面**********************\n");
    FILE *fp=fopen("D:\\sys.txt","rt");//只读打开一个文本文件,只允许读数据    rb
    if(fp==NULL)					//判断文件是否可以打开
	{
        printf("文件打开失败\n");
        exit(0);
    }
    for(int i=1;;i++)
	{
        int n; 
		n=fscanf(fp,"%s%s%s%s%s",Stu.S[i].stu_num,Stu.S[i].name,Stu.S[i].house,Stu.S[i].tel_num,Stu.S[i].home_num);
        if(n==-1)					//文件读入结束
		{
            Stu.stunum=i-1;			//记录学生总人数 
            fclose(fp);
            break;
        }
    }
    fclose(fp);//关闭文件
    printf("成功创建学生信息!\n");
}
  1. 增加学生信息
void AddStu(Student &Stu)										//增加学生信息 
{
	system("cls"); 
	printf("*******************欢迎进入增加学生界面**********************\n");
	FILE *fp;
	fp = fopen("D:\\sys.txt", "a+");//打开或创建一个文件增补 
    printf("请依次输入该学生的学号、姓名、房号、联系电话、家庭联系电话:\n");
    char stu_num[20];
    char name[20];
    char house[20];
    char tel_num[20];
    char home_num[20];
    scanf("%s%s%s%s%s",stu_num,name,house,tel_num,home_num);//输入学生各项信息 
    Stu.stunum++;											//学生总数增加 
    strcpy(Stu.S[Stu.stunum].stu_num,stu_num);				//将学生信息复制到当前的结构体数组中 
    strcpy(Stu.S[Stu.stunum].name,name);
    strcpy(Stu.S[Stu.stunum].house,house);
    strcpy(Stu.S[Stu.stunum].tel_num,tel_num);
    strcpy(Stu.S[Stu.stunum].home_num,home_num);
    if(fp == NULL)
	{
		printf("文件打开失败\n");				// 文件打开失败,打印错误信息
	}
	fprintf(fp,"%s\t%s\t%s\t%s\t%s\n",Stu.S[Stu.stunum].stu_num,Stu.S[Stu.stunum].name,Stu.S[Stu.stunum].house,Stu.S[Stu.stunum].tel_num,Stu.S[Stu.stunum].home_num);//将增加的学生信息增加到文件中保存 
	fclose(fp);									//关闭文件 
    printf("添加成功!\n");
}
  1. 修改学生信息
void ChangeStu(Student &Stu)									//修改学生信息 
{
	system("cls"); 
	printf("*******************欢迎进入修改学生信息界面**********************\n");
	FILE *fp,*ft;
	int f_flag,i;
    printf("请输入该学生的学号:");
    char key[20];
    scanf("%s",key);  
    for(i=Stu.stunum;i>=1;--i)				//从后往前找
    	if(strcmp(Stu.S[i].stu_num,key)==0)//如果输入学号与学生库中有学号相等,则退出循环,记录此时i的值 
        {		   
		   //	printf("%d\n",i);
            f_flag=i;
            break;
                
        }
    f_flag=i;
    //printf("%d\n",i);
    if(i==0)								//没有此人的信息 
    {
        printf("无此人信息!\n");
        printf("现在的信息库为\n");
        //return ;
    }
    else									//有此人的信息 
    {
		fp = fopen("D:\\sys.txt", "a+");//打开或创建一个文件增补
		ft=fopen("D:\\temp.txt","wt");//只写或建立一个文本文件,只允许写数据 
		if(fp == NULL || ft==NULL)
		{
			printf("fopen error");			// 文件打开失败,打印错误信息
		}
	 	printf("该学生目前信息为\n学号\t\t姓名\t房号\t联系电话\t家庭联系电话\n");
	 	printf("%s\t%s\t%s\t%s\t%s\n",Stu.S[f_flag].stu_num,Stu.S[f_flag].name,Stu.S[f_flag].house,Stu.S[f_flag].tel_num,Stu.S[f_flag].home_num);//输入要修改的学生的信息,以便确认 
	    printf("请依次输入该学生修改后的学号\t\t姓名\t房号\t联系电话\t家庭联系电话\n");
	    scanf("%s%s%s%s%s",Stu.S[f_flag].stu_num,Stu.S[f_flag].name,Stu.S[f_flag].house,Stu.S[f_flag].tel_num,Stu.S[f_flag].home_num);//输入要修改的学生的信息,以便确认 	    
		for(int i=1;i<=Stu.stunum;i++)
			fprintf(ft,"%s\t%s\t%s\t%s\t%s\n",Stu.S[i].stu_num,Stu.S[i].name,Stu.S[i].house,Stu.S[i].tel_num,Stu.S[i].home_num);		//将学生信息重新写进临时文件 
		fclose(fp);//关闭文件
	    fclose(ft);//关闭文件
	    remove("D:\\sys.txt");						//删除原本的文件
	    rename("D:\\temp.txt","D:\\sys.txt");		//将临时文件改为原本的文件,储存了最新的消息 	
	    printf("修改成功!\n");
	    printf("现在的信息库为\n");
    }
}
  1. 对学生信息进行排序
void InsertionSort_Stu_num( Student &Stu, int N )				//学号插入排序递增 
{
    int j, P;
    Student Tmp;
	for( P = 1; P < N; P++ )
    {
		Tmp = Stu;						//记录要插入的数据		    
		for( j = P; j > 0 && strcmp(Stu.S[ j - 1 ].stu_num , Tmp.S[ P ].stu_num)>0; j-- )//从后向前,找到比其小的数的位置
			Stu.S[ j ] = Stu.S[ j - 1 ]; 	//向后挪动
		Stu.S[ j ] = Tmp.S[P];    		//如果找到了比Tmp小的则将Tmp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里
	}
}

void InsertionSort_Name( Student &Stu, int N )				//姓名插入排序递增 
{
     int j, P;
     Student Tmp;						//记录要插入的数据		 
	 for( P = 1; P < N; P++ )
     {
		Tmp = Stu;
		for( j = P; j > 0 && strcmp(Stu.S[ j - 1 ].name , Tmp.S[ P ].name)>0; j-- )//从后向前,找到比其小的数的位置
			Stu.S[ j ] = Stu.S[ j - 1 ];	//向后挪动
		Stu.S[ j ] = Tmp.S[P];			//如果找到了比Tmp小的则将Tmp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里
    }
} 

void InsertionSort_House( Student &Stu, int N )				//房号插入排序递增 
{
     int j, P;
     Student Tmp;
	 for( P = 1; P < N; P++ )
     {
	  	Tmp = Stu;						//记录要插入的数据	
		for( j = P; j > 0 && strcmp(Stu.S[ j - 1 ].house , Tmp.S[ P ].house)>0; j-- )//从后向前,找到比其小的数的位置
			Stu.S[ j ] = Stu.S[ j - 1 ];	//向后挪动
		Stu.S[ j ] = Tmp.S[P];			//如果找到了比Tmp小的则将Tmp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里
    }
}
void Sort_Menu(Student &Stu,int N)								//关键字排序菜单    
{
	FILE *fp,*ft;
	fp = fopen("D:\\sys.txt", "a+");//打开或创建一个文件增补 
	ft = fopen("D:\\temp.txt","wt");//只写或建立一个文本文件,只允许写数据 
	 if(fp == NULL || ft==NULL)
	{
		printf("文件打开失败!!\n");				// 文件打开失败,打印错误信息
	}
	system("cls");
	printf("*******************欢迎进入关键字排序界面**********************\n");
	printf("\t\t1.按姓名对人员进行排序\n");
	printf("\t\t2.按学号对人员进行排序\n");
	printf("\t\t3.按房号对人员进行排序\n");
	printf("\t\t4.返回主菜单\n");
	printf("请输入相应数字(1-4)选择你的操作\n");
	scanf("%d",&sort_flag);
	if (sort_flag<0 || sort_flag>4)
	{
		system("cls");
		printf("\n");
		printf("输入数字不对,请重输!\n");  
		Sleep(2000);
		printf("\n");
		Sort_Menu(Stu,N); 
	}	
	else											//输入正确则进行相应操作 
	{	
		switch(sort_flag)
		{
			case 1:
					InsertionSort_Name(Stu,N+1);	//姓名插入排序 
					Allprint(Stu);					//打印结构体全部信息 
					for(int i=1;i<=Stu.stunum;i++)	//将排序后的顺序重新加载到临时文件中 
						fprintf(ft,"%s\t%s\t%s\t%s\t%s\n",Stu.S[i].stu_num,Stu.S[i].name,Stu.S[i].house,Stu.S[i].tel_num,Stu.S[i].home_num);
					fclose(fp);						//关闭文件 
					fclose(ft);						//关闭文件 
					remove("D:\\sys.txt");			//将原本文件删除 
					rename("D:\\temp.txt","D:\\sys.txt");//将临时文件改为原本文件覆盖
					Again();								
					break;
			case 2:
					InsertionSort_Stu_num(Stu,N+1);	//学号插入排序 	
					Allprint(Stu);					//打印结构体全部信息 
					for(int i=1;i<=Stu.stunum;i++)	//将排序后的顺序重新加载到临时文件中 
						fprintf(ft,"%s\t%s\t%s\t%s\t%s\n",Stu.S[i].stu_num,Stu.S[i].name,Stu.S[i].house,Stu.S[i].tel_num,Stu.S[i].home_num);
					fclose(fp);						//关闭文件
					fclose(ft);						//关闭文件
					remove("D:\\sys.txt");			//将原本文件删除 
					rename("D:\\temp.txt","D:\\sys.txt");//将临时文件改为原本文件覆盖	
					Again();						
					break;
			case 3:
					InsertionSort_House(Stu,N+1);	//宿舍号插入排序 	
					Allprint(Stu);					//打印结构体全部信息 
					for(int i=1;i<=Stu.stunum;i++)	//将排序后的顺序重新加载到临时文件中 
						fprintf(ft,"%s\t%s\t%s\t%s\t%s\n",Stu.S[i].stu_num,Stu.S[i].name,Stu.S[i].house,Stu.S[i].tel_num,Stu.S[i].home_num);
					fclose(fp);						//关闭文件
					fclose(ft);						//关闭文件
					remove("D:\\sys.txt");			//将原本文件删除 
					rename("D:\\temp.txt","D:\\sys.txt");//将临时文件改为原本文件覆盖
					Again();	
					break;
			case 4:
					Sleep(500);						//等待500ms 
					system("cls");					//清屏 
					Menu();							//返回主菜单 
					break; 
			default:
					printf("输入错误!请重新输入!\n");
					Sleep(2000);
					Sort_Menu(Stu,N); 								 	
		}
		
	}
}
  1. 查找学生信息
int Stu_num_BinarySearch(Student &Stu,int n,char target[])		//学号二分查找
{
	int left=0,right=n-1; 
	int mid,flag=0;
	while(left<=right)					//当左标志小于右标志时执行下列操作 
	{
		mid=(left+right)/2; 			//中值为左右之和除二 
		if(strcmp(Stu.S[mid].stu_num,target)==0)//如果中值与查找的数相等则退出循环,返回此时的位置值 
		{ 
			flag=1;
			return mid;
			break;
		}
		else if(strcmp(Stu.S[mid].stu_num,target)<0) left=mid+1;//如果中值小于查找的数,那么左标志等于中值加一也就是查找的数在中值右边 
		else 
			right=mid-1;						//如果中值大于查找的数,那么左标志等于中值减一也就是查找的数在中值左边 
	}
	if(!flag) return -1;						//查找不到返回-1 
}
 
int Stu_num_BinarySearch_agian(Student &Stu,int n,char target[],int sflag)//学号重复值二分查找
{
	int left=0,right=n-1; 
	int mid=sflag,flag=0;
	int i=0;
	while(mid>=0)					//当中值大于0时时执行下列操作 
	{
		if(strcmp(Stu.S[mid].stu_num,target)==0)//如果中值与查找的数相等往左边找 
		{ 
			Stu_num_BinarySearch_flag[i++]=mid;//记录下此时中值的值 
			flag=1;								//返回标志位 
			Stu_num_BinarySearch_flag1++;		//相同学号的人数 加1 
		}
		mid=mid-1;								//中值减1往左边找 
	}
	mid=sflag+1;
	while(mid<n)					//中值小于0时时执行下列操作 往右边找 
	{
		if(strcmp(Stu.S[mid].stu_num,target)==0)//如//如果中值与查找的数相等
		{ 
			Stu_num_BinarySearch_flag[i++]=mid;//记录下此时中值的值 
			Stu_num_BinarySearch_flag1++; //相同学号的人数 加1 
			flag=1;//返回标志位
		}
		mid=mid+1;	//中值加1往右边找 
	}
	if(!flag) return -1;						//查找不到返回-1 
}
int Name_BinarySearch (Student &Stu,int n,char target[])		//姓名二分查找 
{
	int left=0,right=n-1; 
	int mid,flag=0;
	while(left<=right)					//当左标志小于右标志时执行下列操作 
	{
		mid=(left+right)/2;				//中值为左右之和除二 
		if(strcmp(Stu.S[mid].name,target)==0)//如果中值与查找的数相等则退出循环,返回此时的位置值 
		{ 
			flag=1;
			return mid;
			break;
		}
		else if(strcmp(Stu.S[mid].name,target)<0) left=mid+1;//如果中值小于查找的数,那么左标志等于中值加一也就是查找的数在中值右边 
		else 
			right=mid-1;				//如果中值大于查找的数,那么左标志等于中值减一也就是查找的数在中值左边 
	}
	if(!flag) return -1;				//查找不到返回-1 
} 

int Name_BinarySearch_agian(Student &Stu,int n,char target[],int sflag)//姓名重复值二分查找
{
	int left=0,right=n-1; 
	int mid=sflag,flag=0;
	int i=0;
	while(mid>=0)					//当中值大于0时时执行下列操作 
	{
		if(strcmp(Stu.S[mid].name,target)==0)//如果中值与查找的数相等往左边找 
		{ 
			Name_BinarySearch_flag[i]=mid;//记录下此时中值的值 
			i++; 
			flag=1;								//返回标志位 
			Name_BinarySearch_flag1+=1;		//相同姓名的人数 加1 
		}
		mid=mid-1;	
		if(strcmp(Stu.S[mid].name,target)!=0)//如果中值与查找的数相等往左边找 
			break;						
	}
	mid=sflag+1;
	while(mid<n)					//中值小于0时时执行下列操作 往右边找 
	{
		if(strcmp(Stu.S[mid].name,target)==0)//如//如果中值与查找的数相等
		{ 
			Name_BinarySearch_flag[i]=mid;//记录下此时中值的值 
			i++;
			Name_BinarySearch_flag1+=1; //相同学号的人数 加1 
			flag=1;//返回标志位
		}
		mid=mid+1;	//中值加1往右边找 
		if(strcmp(Stu.S[mid].name,target)!=0)//如果中值与查找的数相等往左边找 
			break;					
	}
	if(!flag) return -1;						//查找不到返回-1 
} 
  
int House_BinarySearch (Student &Stu,int n,char target[])		//房号二分查找 
{
	int left=0,right=n-1; 
	int mid,flag=0;
	while(left<=right)				//当左标志小于右标志时执行下列操作 
	{
		mid=(left+right)/2;			//中值为左右之和除二 
		if(strcmp(Stu.S[mid].house,target)==0)//如果中值与查找的数相等则退出循环,返回此时的位置值 
		{ 
			flag=1;
			return mid;
			break;
		}
		else if(strcmp(Stu.S[mid].house,target)<0) left=mid+1;//如果中值小于查找的数,那么左标志等于中值加一也就是查找的数在中值右边 
		else 
			right=mid-1;			//如果中值大于查找的数,那么左标志等于中值减一也就是查找的数在中值左边 
	}
	if(!flag) return -1;			//查找不到返回-1 
}   

int House_BinarySearch_agian(Student &Stu,int n,char target[],int sflag)//房号重复值二分查找
{
	int left=0,right=n-1; 
	int mid=sflag,flag=0;
	int i=0;
	while(mid>=0)					//当中值大于0时时执行下列操作 
	{
		if(strcmp(Stu.S[mid].house,target)==0)//如果中值与查找的数相等往左边找 
		{ 
			House_BinarySearch_flag[i++]=mid;//记录下此时中值的值 
			flag=1;								//返回标志位 
			House_BinarySearch_flag1++;		//相同房号的人数 加1 
		}
		mid=mid-1;								//中值减1往左边找 
	}
	mid=sflag+1; 
	while(mid<n)					//中值小于0时时执行下列操作 往右边找 
	{
		if(strcmp(Stu.S[mid].house,target)==0)//如//如果中值与查找的数相等
		{ 
			House_BinarySearch_flag[i++]=mid;//记录下此时中值的值 
			House_BinarySearch_flag1++; //相同学号的人数 加1 
			flag=1;//返回标志位
		}
		mid=mid+1;	//中值加1往右边找 
	}
	if(!flag) return -1;						//查找不到返回-1 
} 
void Serch_Menu(Student &Stu,int N)								//查找菜单    
{
	char find_sth[20]; 
	int find_it=0;
	system("cls");
	printf("*******************欢迎进入查找界面**********************\n");
	printf("\t\t1.按姓名对人员进行查找\n");
	printf("\t\t2.按学号对人员进行查找\n");
	printf("\t\t3.按房号对人员进行查找\n");
	printf("\t\t4.返回主菜单\n");
	printf("请输入相应数字(1-4)选择你的操作\n"); 
	scanf("%d",&serch_flag);						//输入查找的不同关键词功能 
	if (serch_flag<0 || serch_flag>4)				//输入不正确则提示重输 
	{
		system("cls");
		printf("\n");
		printf("输入数字不对,请重输!\n");  
		Sleep(2000);
		printf("\n");
		Serch_Menu(Stu,N);
	}
	else
	{	
		if(serch_flag!=4)							//如果不是返回主菜单选项则提示输入查找的字符 
		{		
			printf("请输入你想要查找的字符:");
			scanf("%s",find_sth);
		}
		switch(serch_flag)
		{					
			case 1:
					InsertionSort_Name(Stu,N+1);	//姓名插入排序 
					find_it=Name_BinarySearch(Stu,N+1,find_sth);//调用姓名二分查找函数 
					find_it=Name_BinarySearch_agian(Stu,N+1,find_sth,find_it);
					if(find_it>=0)	
						for(int j=0;j<Name_BinarySearch_flag1;j++)
							printf("%s\t%s\t%s\t%s\t%s\n",Stu.S[Name_BinarySearch_flag[j]].stu_num,Stu.S[Name_BinarySearch_flag[j]].name,Stu.S[Name_BinarySearch_flag[j]].house,Stu.S[Name_BinarySearch_flag[j]].tel_num,Stu.S[Name_BinarySearch_flag[j]].home_num);
					else 
						printf("无此人信息!!!\n");	
					Name_BinarySearch_flag1=0;
					Again();							
						break;									
			case 2:
					InsertionSort_Stu_num(Stu,N+1);//学号插入排序 
					find_it=Stu_num_BinarySearch(Stu,N+1,find_sth);//调用学号二分查找函数
					find_it=Stu_num_BinarySearch_agian(Stu,N+1,find_sth,find_it);
					if(find_it>=0)	
						for(int j=0;j<Stu_num_BinarySearch_flag1;j++)
							printf("%s\t%s\t%s\t%s\t%s\n",Stu.S[Stu_num_BinarySearch_flag[j]].stu_num,Stu.S[Stu_num_BinarySearch_flag[j]].name,Stu.S[Stu_num_BinarySearch_flag[j]].house,Stu.S[Stu_num_BinarySearch_flag[j]].tel_num,Stu.S[Stu_num_BinarySearch_flag[j]].home_num);
					else 
						printf("无此人信息!!!\n");	
					Stu_num_BinarySearch_flag1=0; 
					Again();													
					break;
			case 3:
					InsertionSort_House(Stu,N+1);	//宿舍号插入排序 											
					find_it=House_BinarySearch(Stu,N+1,find_sth);//调用宿舍号二分查找函数 
					find_it=House_BinarySearch_agian(Stu,N+1,find_sth,find_it);
					if(find_it>=0)	
						for(int j=0;j<House_BinarySearch_flag1;j++)
							printf("%s\t%s\t%s\t%s\t%s\n",Stu.S[House_BinarySearch_flag[j]].stu_num,Stu.S[House_BinarySearch_flag[j]].name,Stu.S[House_BinarySearch_flag[j]].house,Stu.S[House_BinarySearch_flag[j]].tel_num,Stu.S[House_BinarySearch_flag[j]].home_num);
					else 
						printf("无此人信息!!!\n");	
					House_BinarySearch_flag1=0;
					Again();					
					break;
			case 4:
					Sleep(500);						//等待500ms  
					system("cls");					//清屏 
					Menu();							//返回主菜单 
					break; 		
			default:
					printf("输入错误!请重新输入!\n");
					Sleep(2000);
					Serch_Menu(Stu,N);				//其他无关值则重新进入此菜单						 	
		}
	}												
}
  1. 删除学生信息
void DeleteStu(Student &Stu)									//根据学号删除人员 
{
	system("cls"); 
	printf("*******************欢迎进入删除学生信息界面**********************\n");
	FILE *fp,*ft;
	int f_flag,i;
	int check;
    printf("请输入该学生的学号:");
    char key[20];
    scanf("%s",key);    
    for(i=Stu.stunum;i>=1;--i)					//从后往前找
        if(strcmp(Stu.S[i].stu_num,key)==0)		//如果输入学号与学生库中有学号相等,则退出循环,记录此时i的值 
        {
            f_flag=i;
            break;
        }
    f_flag=i;
    if(i==0)										//没有此人的信息 
    {
         printf("无此人信息!\n");
         printf("现在的信息库为\n");
         return;
    }
    else											//有此人的信息 
	{
		fp = fopen("D:\\sys.txt", "a+");//打开或创建一个文件增补
		ft = fopen("D:\\temp.txt","wt");//只写或建立一个文本文件,只允许写数据 	 
		if(fp == NULL || ft==NULL)
		{
			printf("文件打开失败!\n");				// 文件打开失败,打印错误信息
		}
	    printf("%s\t%s\t%s\t%s\t%s\n",Stu.S[f_flag].stu_num,Stu.S[f_flag].name,Stu.S[f_flag].house,Stu.S[f_flag].tel_num,Stu.S[f_flag].home_num);//打印出要删除学生的信息,以便确认 
	    printf("确定删除请按1,放弃删除请按0\n");  
	    scanf("%d",&check);
	    if(check==0)								//check=0则放弃删除 
	        return;
	    else										//否则将要删除人的后面的序号全部往前提。 
	        for(int i=f_flag;i<Stu.stunum;i++)
	            Stu.S[i]=Stu.S[i+1];
	    Stu.stunum--;								//学生总人数减1
		for(int i=1;i<=Stu.stunum;i++)				//将学生信息重新写进临时文件 
			fprintf(ft,"%s\t%s\t%s\t%s\t%s\n",Stu.S[i].stu_num,Stu.S[i].name,Stu.S[i].house,Stu.S[i].tel_num,Stu.S[i].home_num);
		fclose(fp);									//关闭文件 
	    fclose(ft);									//关闭文件
	    remove("D:\\sys.txt");						//删除原本的文件 
	    rename("D:\\temp.txt","D:\\sys.txt");		//将临时文件改为原本的文件,储存了最新的消息 
	    printf("删除成功!\n");
	    printf("现在的信息库为\n");
	}
}
  1. 显示所有学生信息
void Allprint(Student &Stu)     								//打印全部信息
{	
    printf("学号\t\t姓名\t房号\t联系电话\t家庭联系电话\n");
    for (int i =1;i<=Stu.stunum;i++)
	{
        printf("%s\t%s\t%s\t%s\t%s\n",Stu.S[i].stu_num,Stu.S[i].name,Stu.S[i].house,Stu.S[i].tel_num,Stu.S[i].home_num);
	}
}

三、小结

在以上代码中都进行了非常详细的注释,在我使用这个软件时都可以正常使用,需要完整源代码的请三连该博客,私聊我发噢!!!

  • 23
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值