用C语言写一个文件人员管理系统(三)

题目介绍:

设计一个人员管理系统,完成基本的增、删、查、改操作,实现对人员信息的控制,同时要求把信息保存到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);

}

.
.
.
.
运行效果图展示:


欢迎页面:
用C语言写一个文件人员管理系统(三)_第1张图片
.
.
主菜单:
用C语言写一个文件人员管理系统(三)_第2张图片
.
.
首次输入信息
用C语言写一个文件人员管理系统(三)_第3张图片
.
.
添加信息:
用C语言写一个文件人员管理系统(三)_第4张图片

删除:用C语言写一个文件人员管理系统(三)_第5张图片



最后附上源代码,有次类课程设计的同学可以参考一下,自主修改一下功能,有什么错误也欢迎指出和讨论!

#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语言写一个文件人员管理系统系列就阶段性结束了,当然还有许多功能以后会慢慢添加完善,到时候再出续集吧~

你可能感兴趣的:(用C语言写一个文件人员管理系统(三))