一、项目概述
本项目是博主之前用纯C语言写的一个软件,目的是为了给宿舍管理人员编写一个宿舍管理查询软件,该软件具有以下功能:
- 建立数据文件,文件中保存着宿舍入住人员的信息,包括姓名、学号、房号、
联系电话、家庭联系电话等; - 软件中可按关键字(姓名、学号、房号)对人员信息进行排序;
- 软件提供查询功能(用二分查找实现以下操作)可分别按姓名、学号、房号等
进行查询 - 可在软件中增加和删除入住人员。
说完概述,话不多说,上图!给大家看最终成品。
未登陆时
登录成功时
登陆失败时
增加学生页面
修改学生页面
关键字排序
按学号排序结果
按学号查找
按学号删除
显示所有学生信息
功能大概就是以上,接下来对每个功能进行详细解析。
二、程序解析
- 首先看主函数,主函数结构非常清晰,首先是进入登陆界面,登入成功的话进入主菜单,进入主菜单后对按键按下的值进行判断,进而执行相应的功能函数。
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; //学生整体信息储存
- 登陆界面
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,进入系统失败
}
- 读入学生信息
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");
}
- 增加学生信息
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");
}
- 修改学生信息
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");
}
}
- 对学生信息进行排序
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);
}
}
}
- 查找学生信息
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); //其他无关值则重新进入此菜单
}
}
}
- 删除学生信息
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");
}
}
- 显示所有学生信息
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);
}
}
三、小结
在以上代码中都进行了非常详细的注释,在我使用这个软件时都可以正常使用,需要完整源代码的请三连该博客,私聊我发噢!!!