在(一)的基础上进一步优化功能
此篇文章在(一)的基础上,进一步扩大了人员文件管理系统的两个功能,修改人员信息和删除人员。
至此,简单的增删查改功能全部实现。
代码没有用到链表(主要是刚学,还不熟QAQ),用的是结构体数组,下面直接给出实现功能的函数代码,纯手打:
首先四个函数声明:
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 modify(FILE *fp,struct message me[20]) //修改某个信息
{
int j,i,a;
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");
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); //关闭文件
}
删除函数:
int del(FILE *fp,struct message me[20])
{
int i,a;
printf("请输入要删除第几个人:"); //每次只能删除一个人
scanf("%d",&a);
if(a<=sum){
for(i=a-1;i<sum;i++){ //用循环方式,将第i+1个人的信息赋给第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");
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; //返回人员总数
}
代码运行演示图片在此不再展示,下面附上源码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int N =3; //定义开始录入的人数
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 main()
{
FILE *fp;
int i,b;
struct message me[20];
if((fp=fopen("d:\\123.txt","w"))==NULL)
{
printf("error");
exit(0);
}
for(i=0;i<N;i++)
{
printf("请输入第%d个人的信息:",i+1);
scanf("%s%d%s%s",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);
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);
see(fp,me);
printf("请输入是否追加:(1:追加,0:不追加)");
scanf("%d",&b);
if(b==1){
sum=N+add(fp,me);
}
modify(fp,me);
sum=del(fp,me);
printf("现有总人数%d\n",sum);
}
void see(FILE *fp,struct message me[20])
{
int i,c;
printf("请输入要显示第几个人:\n");
scanf("%d",&c);
for(i=0;i<N;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 );
}
}
}
int add(FILE *fp,struct message me[20]) //添加新人员信息
{
int i;
int a;
fopen("d:\\123.txt","a+");
printf("请输入要追加人数:");
scanf("%d",&a);
for(i=N;i<a+N;i++){
printf("请输入第%d个人的信息:",i+1);
scanf("%s%d%s%s",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);
printf("姓名\t年龄\t性别\t家庭住址\n");
//fp=fopen("d:\\123.txt","r+");
for(i=0;i<a+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 );
}
return a;
}
void modify(FILE *fp,struct message me[20]) //修改某一个信息
{
int j,i,a;
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");
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);
}
int del(FILE *fp,struct message me[20])
{
int i,a;
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");
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;
}
预告:
在(三)中,会进一步完善代码,包括一些功能的优化,系统主页面的建立等等,但函数功能基本确定,应该就是一个完整的人员管理系统了。相应的可以修改成学生,职工,工厂等等人员的管理系统。
对于初学C的我来讲,现在就先考虑代码功能的实现,至于内部存储以及节省空间等等,还是等我以后学习深入后在慢慢理解吧~