设计一个人员管理系统,完成基本的增、删、查、改操作,实现对人员信息的控制,同时要求把信息保存到txt文本文件中。可用于学生管理系统,出入人员管理系统,图书馆书籍管理系统等等。
本章在(一)、(二)的基础上,进一步优化了功能,美化页面,加快使用者的上手速度,主要添加了一下几个函数:
void welcome(FILE *fp,struct message me[20]);//欢迎界面
void clc(); //清屏
void menu(FILE *fp,struct message me[20]); //主菜单界面
void ret(FILE *fp,struct message me[20]); //返回菜单
void allnum(FILE *fp,struct message me[20]); //统计显示所有记录人员
void first(FILE *fp,struct message me[20]);//第一次录入信息
通过添加这些自定义函数,大大节省了主函数的代码,让程序更加清晰直观,主函数如下:
void main()
{
FILE *fp; //定义文件指针
if((fp=fopen("d:\\123.txt","w"))==NULL) //打开文件
{
printf("error");
exit(0);
}
struct message me[20]; //定义结构数组
welcome(fp,me); //调用欢迎函数
clc(); //清屏
menu(fp,me);//调用菜单函数
}
可以看到,现在的主函数只进行了变量类型定义和欢迎界面与菜单函数的调用。
下面把新加入的函数代码附上:
欢迎页面函数:
void welcome(FILE *fp,struct message me[20]) //欢迎函数
{
printf("***********************************************************\n\n\n");
printf("\t\t欢迎进入文件人员管理系统!\n\n\n");
printf("***********************************************************\n\n");
printf("\t\t现在请输出第一次添加的人数:");
scanf("%d",&N);
sum=N;
if(N==0) //第一次未添加信息
{
clc();
menu(fp,me); //直接进入菜单页面
}
else //第一次添加信息
{ clc();
first(fp,me); //进入首次输入页面
}
}
菜单函数
void menu(FILE *fp,struct message me[20]) //功能菜单
{
int z;
printf("\t\t/************************\n/");
printf("\t\t功能1:添加新人员\n");
printf("\t\t功能2:删除人员\n");
printf("\t\t功能3:人员查看\n");
printf("\t\t功能4:修改人员信息\n");
printf("\t\t功能5:查看全部人员信息\n");
printf("\t\t功能6:退出程序\n");
printf("\t\t/************************\n/");
printf("\t\t请输入你要进行的操作:");
scanf("%d",&z);
clc();//清屏
switch(z){
case 1:sum=add(fp,me); ret(fp,me);break;
case 2:sum=del(fp,me);ret(fp,me);break;
case 3:see(fp,me);break;
case 4: modify(fp,me);break;
case 5: allnum(fp,me);break;
case 6: break;
}
}
返回菜单函数
void ret(FILE *fp,struct message me[20]) //返回菜单函数
{
int a;
printf("是否返回上个菜单?(1:返回,0:结束)");
scanf("%d",&a);
if(a==1) {
clc();
menu(fp,me); //返回菜单
}
else ; //直接退出程序
}
人数统计显示函数
void allnum(FILE *fp,struct message me[20]) //显示总人数函数
{
int i;
printf("姓名\t年龄\t性别\t家庭住址\n");
for(i=0;i<sum;i++)
{
//读数据
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
printf("现在共有%d个人\n",sum);
ret(fp,me);
}
首次输入函数
void first(FILE *fp,struct message me[20]) //第一次输入函数
{
int i;
fp=fopen("d:\\123.txt","w");
for(i=0;i<N;i++)//输入信息
{
printf("请输入第%d个人的信息:\n",i+1);
printf("姓名:");
scanf("%s",me[i].name);
printf("年龄:");
scanf("%d",&me[i].age);
printf("性别:");
scanf("%s",me[i].sex);
printf("地址:");
scanf("%s",me[i].add);
}
for(i=0;i<N;i++)//向文件中写数据
{
fprintf(fp,"%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add);
}
fclose(fp);
printf("姓名\t年龄\t性别\t家庭住址\n");
fopen("d:\\123.txt","r");//从文件中读数据
for(i=0;i<N;i++)
{
fscanf(fp,"%s%d%s%s",me[i].name ,&me[i].age ,me[i].sex ,me[i].add);
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
fclose(fp);
}
.
.
.
.
运行效果图展示:
’
’
欢迎页面:
.
.
主菜单:
.
.
首次输入信息
.
.
添加信息:
’
’
’
最后附上源代码,有次类课程设计的同学可以参考一下,自主修改一下功能,有什么错误也欢迎指出和讨论!
#include
#include
#include
int N ;
int sum; //定义总人数,包括后来添加,删除的人
struct message{
char name[20];
int age;
char sex[20];
char add[50];
};
int add(FILE *fp,struct message me[20]);
void see(FILE *fp,struct message me[20]);
void modify(FILE *fp,struct message me[20]);
int del(FILE *fp,struct message me[20]);
void welcome(FILE *fp,struct message me[20]);
void clc();
void menu(FILE *fp,struct message me[20]);
void ret(FILE *fp,struct message me[20]);
void allnum(FILE *fp,struct message me[20]);
void first(FILE *fp,struct message me[20]);
void sort(FILE *fp,struct message me[20]);
/***********************显示模块***********************/
void see(FILE *fp,struct message me[20]) //显示函数
{
int i,c;
printf("姓名\t年龄\t性别\t家庭住址\n");
printf("请输入要显示第几个人:\n");
scanf("%d",&c);
for(i=0;i<sum;i++)
{
if (i+1==c)
{
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
}
ret(fp,me);
}
/****************************添加模块***********************************/
int add(FILE *fp,struct message me[20])
{
int i;
int a;
printf("姓名\t年龄\t性别\t家庭住址\n");
for(i=0;i<sum;i++)
{
//读数据
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
fp=fopen("d:\\123.txt","a+");
printf("请输入要追加人数:");
scanf("%d",&a);
for(i=sum;i<a+sum;i++){
printf("请输入第%d个人的信息:\n",i+1);
printf("姓名:");
scanf("%s",me[i].name);
printf("年龄:");
scanf("%d",&me[i].age);
printf("性别:");
scanf("%s",me[i].sex);
printf("地址:");
scanf("%s",me[i].add);
}
for(i=sum;i<a+sum;i++)
{
fprintf(fp,"%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add); //向文件中写数据
}
fclose(fp);
printf("姓名\t年龄\t性别\t家庭住址\n");
for(i=0;i<a+sum;i++)
{
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
return a+sum;
}
/********************************修改模块************************************/
void modify(FILE *fp,struct message me[20]) //修改某一个信息
{
int j,i,a;
printf("姓名\t年龄\t性别\t家庭住址\n");
for(i=0;i<sum;i++)
{
//读数据
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
printf("输入要修改第几个人的信息及信息标号(1年龄,2性别,3地址):");
scanf("%d%d",&a,&j);
printf("输入修改后的信息:");
if(j==1)
{
printf("输入新年龄:");
scanf("%d",&me[a-1].age );
}
else if(j==2)
{
printf("输入新性别:");
scanf("%s",me[a-1].sex );
}
else if(j==3)
{
printf("输入新地址:");
scanf("%s",me[a-1].add );
}
else printf("输入错误\n");
fp=fopen("d:\\123.txt","w+");
for(i=0;i<sum;i++)
{
fprintf(fp,"%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add); //向文件中写数据
}
for(i=0;i<sum;i++)
{
//读数据
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
fclose(fp);
ret(fp,me);
}
/******************************删除模块***********************************/
int del(FILE *fp,struct message me[20])
{
int i,a;
printf("姓名\t年龄\t性别\t家庭住址\n");
for(i=0;i<sum;i++)
{
//读数据
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
printf("请输入要删除第几个人:");
scanf("%d",&a);
if(a<=sum){
for(i=a-1;i<sum;i++){
strcpy(me[i].name ,me[i+1].name) ;
me[i].age =me[i+1].age;
strcpy(me[i].sex ,me[i+1].sex);
strcpy(me[i].add ,me[i+1].add);
}
printf("删除成功\n");
}
else printf("没有此人\n");
fp= fopen("d:\\123.txt","w+");
for(i=0;i<sum-1;i++)
{
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
fprintf(fp,"%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add); //向文件中写数据
}
fclose(fp);
return sum-1;
}
/************************排序模块***************************************/
void sort(FILE *fp,struct message me[20])
{
int i,j;
struct message t;
printf("姓名\t年龄\t性别\t家庭住址\n");
for(i=1;i<sum;i++)
for(j=0;j<sum-i;j++)
{
if(me[j].age>me[j+1].age)
{
t=me[j];
me[j] =me[j+1];
me[j+1]=t;
}
}
fp= fopen("d:\\123.txt","r+");
for(i=0;i<sum;i++)
{
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
fprintf(fp,"%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add); //向文件中写数据
}
fclose(fp);
ret(fp,me);
}
void menu(FILE *fp,struct message me[20]) //功能菜单
{
int z;
printf("\t\t/************************\n/");
printf("\t\t功能1:添加新人员\n");
printf("\t\t功能2:删除人员\n");
printf("\t\t功能3:人员查看\n");
printf("\t\t功能4:修改人员信息\n");
printf("\t\t功能5:查看全部人员信息\n");
printf("\t\t功能6:按年龄排序\n");
printf("\t\t功能7:退出程序\n");
printf("\t\t/************************\n/");
printf("\t\t请输入你要进行的操作:");
scanf("%d",&z);
clc();//清屏
switch(z){
case 1:sum=add(fp,me); ret(fp,me);break;
case 2:sum=del(fp,me);ret(fp,me);break;
case 3:see(fp,me);break;
case 4: modify(fp,me);break;
case 5: allnum(fp,me);break;
case 6: sort(fp,me);break;
case 7: break;
}
}
void allnum(FILE *fp,struct message me[20]) //显示总人数函数
{
int i;
printf("姓名\t年龄\t性别\t家庭住址\n");
for(i=0;i<sum;i++)
{
//读数据
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
printf("现在共有%d个人\n",sum);
ret(fp,me);
}
void ret(FILE *fp,struct message me[20]) //返回菜单函数
{
int a;
printf("是否返回上个菜单?(1:返回,0:结束)");
scanf("%d",&a);
if(a==1) {
clc();
menu(fp,me);
}
else ;
}
void welcome(FILE *fp,struct message me[20]) //欢迎函数
{
printf("***********************************************************\n\n\n");
printf("\t\t欢迎进入文件人员管理系统!\n\n\n");
printf("***********************************************************\n\n");
printf("\t\t现在请输出第一次添加的人数:");
scanf("%d",&N);
sum=N;
if(N==0)
{
clc();
menu(fp,me);
}
else
{ clc();
first(fp,me);
}
}
void clc() //清屏函数
{
system("pause");
system("cls");
}
void first(FILE *fp,struct message me[20]) //第一次输入函数
{
int i;
fp=fopen("d:\\123.txt","w");
for(i=0;i<N;i++)
{
printf("请输入第%d个人的信息:\n",i+1);
printf("姓名:");
scanf("%s",me[i].name);
printf("年龄:");
scanf("%d",&me[i].age);
printf("性别:");
scanf("%s",me[i].sex);
printf("地址:");
scanf("%s",me[i].add);
}
for(i=0;i<N;i++)
{
fprintf(fp,"%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add); //向文件中写数据
}
fclose(fp);
printf("姓名\t年龄\t性别\t家庭住址\n");
fopen("d:\\123.txt","r");
for(i=0;i<N;i++)
{
fscanf(fp,"%s%d%s%s",me[i].name ,&me[i].age ,me[i].sex ,me[i].add); //从文件中读数据
printf("%s\t%d\t%s\t%s\n",me[i].name ,me[i].age ,me[i].sex ,me[i].add );
}
fclose(fp);
}
void main()
{
FILE *fp;
if((fp=fopen("d:\\123.txt","w"))==NULL)
{
printf("error");
exit(0);
}
struct message me[20];
welcome(fp,me); //调用欢迎函数
clc(); //清屏
menu(fp,me);//调用菜单函数
}
至此,用C语言写一个文件人员管理系统系列就阶段性结束了,当然还有许多功能以后会慢慢添加完善,到时候再出续集吧~