资源描述
职工档案管理系统设计
17
2020年4月19日
文档仅供参考,不当之处,请联系改正。
一、软件课题:
职工档案管理系统设计
二、软件要求:
1、用C语言实现系统;
2、函数功能要划分好(结构化程序设计);
3、界面友好(良好的人机交互),加必要的注释;
4、要提供程序测试方案,程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
三、功能结构:
职工档案管理系统包含了职工的全部信息,每个职工是一条记录,包括编号,姓名,部门,电话等。系统可完成:信息录入、信息查询,并按可选的自定义规则进行排序;信息删除与修改(须设置密码),将职工的信息保存于外部存储器的文件中。
Switch语句
添加函数
删除函数
修改函数
排序函数
查找函数
列表函数
保存函数
退出
输入姓名
输入密码
输入名字
查找
删除数据
输入姓名
修改
要添加的人数
添加
保存在文档中
显示信息
显示
直接结束
主函数
统计总数
四、软件特色
在程序的开头,从文件读取一个字符,来判断以前是否有保存职工的信息,如果有,则读取已保存的内容,若没,则什么都不做,执行下面的程序。
主函数很普通。
添加函数:如果没有数据,能够批量添加,如果有数据,能够一个一个添加,且不会覆盖前面的数据,使程序更健壮。
删除函数:密码是已经定义好的,删除用if判断是否跟已定义的密码一样,一样的话,则执行删除操作。
排序函数:原理是冒泡法排序。两个选项供用户选择。
保存函数:先调用了统计函数,统计共添加多少数据,然后经过循环进行保存。共保存了两个文件,信息文件和标记文件。标记文件是用来标记已经保存过职工的信息,供下次打开程序时读取职工的信息。
查找函数、列表显示是按书上的方法改了点。
五、程序代码
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
struct zhigong //定义结构体
{
char name[10]; //定义姓名。
int gonghao; //定义工号。
char bumen[10]; //定义部门。
char haoma[15]; // 定义号码。
struct zhigong *next;
};
void main() //主函数。
{
struct zhigong *duqu(void);//带回一个指向链表头的指针
struct zhigong *tianjia(struct zhigong *head); //声明自定义函数
struct zhigong *shanchu(struct zhigong *head); //声明自定义函数
struct zhigong *xiugai(struct zhigong *head); //声明自定义函数
struct zhigong *paixu(struct zhigong *head); //声明自定义函数
void chazhao(struct zhigong *); //声明自定义函数
void liebiao(struct zhigong *); //声明自定义函数
void baocun(struct zhigong *); //声明自定义函数
char k[5];
int b; //定义选择数字,switch中用到
struct zhigong *head=NULL; //定义头结点
FILE *fp;
fp=fopen("d:/biaoji.txt","r+");
if(!fp)
; //要是打不开就什么都不做,直接运行下面的程序
else
head=duqu();
while(1) //无限循环,选择菜单能多次选择。
{
printf(" 职工档案管理系统\n");
printf("*****************************************\n");
printf("1、添加 ");
printf("2、删除\n");
printf("3、查找 ");
printf("4、列表查看\n");
printf("5、保存 ");
printf("6、修改\n");
printf("7、排序 ");
printf("8、退出\n");
printf("*****************************************\n");
printf("请输入你的选择\n");
scanf("%s",k);
b=atoi(k);
if(b<1||b>8) //判断输入的选择是否越界。
printf("选择错误,请重新选择\n"); //如果越界,重新选择。
switch (b)
{
case 1: head=tianjia(head);break; //返回值要赋给head
case 2: head=shanchu(head);break;
case 3: chazhao(head);break;
case 4: liebiao(head);break;
case 5: baocun(head);break;
case 6: head=xiugai(head);break;
case 7: head=paixu(head);break;
case 8: exit(0);break;
}
}
}
struct zhigong *tianjia(struct zhigong *head) //添加函数
{
struct zhigong *p,*q; //定义结构体类型。
int i,z; //用于for 循环
if(!head)
{
printf("请输入要添加的人数\n");
scanf("%d",&z);
head=p=(struct zhigong *)malloc (sizeof (struct zhigong)); //头结点
head->next=NULL; //头结点 指向的next 为空
for(i=0;i<z;i++) // for 循环,进行链表的节点的开辟、连接
{
q=(struct zhigong *)malloc (sizeof(struct zhigong));
printf("请输入 姓名,工号,部门,号码\n");
scanf("%s%d%s%s",q->name,&q->gonghao,q->bumen,q->haoma);
p->next=q;
p=p->next; //继续开辟
}
p->next=NULL;
}
else
{
p=head;
while(p->next!=NULL)
p=p->next;
q=(struct zhigong *)malloc(sizeof(struct zhigong));
printf("请输入 姓名,工号,部门,号码\n");
scanf("%s%d%s%s",q->name,&q->gonghao,q->bumen,q->haoma);
q->next=NULL;
p->next=q;
p=p->next;
}
return head; // 返回链表的首地址,head 接收。
}
struct zhigong *shanchu(struct zhigong *head) //删除函数
{
struct zhigong *p,*q; // 声明是结构体类型
char name1[10]; //定义要删除的人的姓名
char mima[10]="yuan"; // 定义删除密码
char b[10]; // 用来输入删除密码
p=head;
if(head==NULL) //判断head是否为空。
{
printf("列表为空!无法删除。\n");
return 0;
}
printf("请输入要删除的职工的姓名\n"); //输入要删除的姓名。
scanf("%s",name1);
while(strcmp(p->name,name1)!=0&&p->next!=NULL) //经过循环来找到要删除的姓名。
{
q=p;
p=p->next;
}
if(strcmp(p->name,name1)==0) //找到要删除的姓名了。
{
printf("请输入删除密码\n");
scanf("%s",b);
if(strcmp(b,mima)==0) //判断删除密码是否正确,正确执行删除操作。
{
q->next=p->next;
free(p); //释放掉(能够不释放喔!)
printf("删除成功\n");
}
else // 不正确,显示密码错误。
printf("密码不正确\n");
}
else //没有找到要删除的姓名。
printf("找不到该姓名\n");
return head; //返回主函数。
}
void chazhao(struct zhigong *head) //查找函数
{
struct zhigong *p; //声明是结构体类型。
char name1[10]; //声明要查找的姓名。
if(head==NULL) //还是判断head 是否为空。
printf("没有数据\n");
else
{
p=head->next; //因为头结点不为空,故p=head->next。
printf("请输入要查找的姓名\n"); //输入要查找的姓名。
scanf("%s",name1);
while(strcmp(p->name,name1)!=0&&p->next!=NULL) //寻找要查找的姓名。
p=p->next;
if(strcmp(p->name,name1)==0) //找到了。
{
printf("姓名,工号,部门,号码\n");
printf("%s,%d,%s,%s\n",p->name,p->gonghao,p->bumen,p->haoma); /*显示该姓名的信息。*/
}
else
printf("找不到该姓名\n"); //没有找到。
}
}
void liebiao(struct zhigong *head) //列表显示 函数。
{
struct zhigong *p; //声明是结构体类型。
if(head==NULL) //判断是否为空。
printf("没有数据\n");
else
{
p=head->next; //head 不为空,p=head->next。
printf("姓名,工号,部门,号码\n");
for(;p!=NULL;p=p->next) //循环 显示链表中所有节点的内容。
{
printf("%s,%d,%s,%s\n",p->name,p->gonghao,p->bumen,p->haoma);
}
} //没有返回值。
}
void baocun(struct zhigong *head) //保存函数。
{
int zongshu(struct zhigong *head);
struct zhigong *p; //声明是结构体类型。
FILE *fp;
FILE *TP;
int n;
int biaoji;
fp=fopen("d:/yuan.txt","w+"); //为保存 新建一个文件。
if(fp==NULL) //判断是否打开成功。
printf("文件打开失败\n");
if(head==NULL) //判断链表是否为空。
{
printf("没有数据\n");
return ;
}
n=zongshu(head); //把统计得到的数给它
fputc(n,fp); //把n输出到fp所指的文件夹
p=head->next; //头结点为空。
while(p) //循环保存,结束条件等价于 p!=NULL。
{
fprintf(fp,"%s %d %s %s\n",p->name,p->gonghao,p->bumen,p->haoma);
p=p->next;
}
fclose(fp);
TP=fopen("d:/biaoji.txt","w+");
if(!TP)
{
printf("文件打开失败!\n");
return; /*没有数据就要返回*/
}
biaoji=1;
fputc(biaoji,TP);//把n输出到tp所指的文件夹
fclose(TP);
printf("保存成功\n");
}
struct zhigong *xiugai(struct zhigong *head) //修改函数。
{
struct zhigong *p; //声明是结构体类型
char name1[10];
if(head==NULL)
printf("没有数据\n");
else
{
p=head->next;
printf("请输入要修改的姓名\n");
scanf("%s",name1);
while(strcmp(p->name,name1)!=0&&p->next!=NULL)
p=p->next;
if(strcmp(p->name,name1)==0)
{
printf("请输入要修改的数据\n");
printf("请输入 姓名,工号,部门,号码\n");
scanf("%s%d%s%s",p->name,&p->gonghao,p->bumen,p->haoma); /*修改节点的内容。*/
printf("修改成功\n");
}
else
printf("找不到该姓名\n");
}
return head;
}
struct zhigong *paixu(struct zhigong *head) //排序函数。
{
struct zhigong *p,*q; //声明是结构体类型。
int flag,k,b; //flag 是用来判断循环是否结束。
char cat[10],v[5]; /*两字符串进行交换所需的中间字符串*/
if(head==NULL) //判断是否为空。
{
printf("没有数据\n");
return 0;
}
printf("1、按工号排序。\n");
printf("2、按姓名排序。\n");
printf("请输入你的选择。\n");
scanf("%s",v);
b=atoi(v); //字符型的转换为整型的。
if(b>2||b<1)
{
printf("选择错误。\n");
return head;
}
switch(b)
{
case 1:
{
do{ /*两个循环进行排序,其原理是冒泡排序法。*/
p=head->next;
flag=0; //flag 使其为零,结束循环。
while(p->next!=NULL) /* 函数目的是两个节点的内容进行比较和交换节点的内容。*/
{
q=p->next;
if((p->gonghao)>(q->gonghao)) /*如果前个节点的工号大于后个节点的工号,两个节点的内容交换。*/
{
strcpy(cat,p->name); //交换节点的内容。
strcpy(p->name,q->name); /*两个字符串的内容是不能直接进行交换的,因此借助strcpy.*/
strcpy(q->name,cat);
k=p->gonghao;
p->gonghao=q->gonghao;
q->gonghao=k;
strcpy(cat,p->bumen);
strcpy(p->bumen,q->bumen);
strcpy(q->bumen,cat);
strcpy(cat,p->haoma);
strcpy(p->haoma,q->haoma);
strcpy(q->haoma,cat);
flag=1; /*flag ==1 外层循环的结束标志,在这里是记录里面的循环是否执行,如果没执行,说明链表里的内容是有序的。*/
}
p=p->next;
}
}while(flag);
printf("排序完成。\n");
return head;
}
break;
case 2:
{
do{ //两个循环进行排序,其原理是冒泡排序法。
p=head->next;
flag=0; //flag 使其为零,结束循环。
while(p->next!=NULL) /*函数目的是两个节点的内容进行比较和交换节点的内容。*/
{
q=p->next;
if(strcmp(p->name,q->name)>0) /*如果前个节点的姓名大于后个节点的姓名,两个节点的内容交换。*/
{
strcpy(cat,p->name); //交换节点的内容。
strcpy(p->name,q->name); /*两个字符串的内容是不能直接进行交换的,因此借助strcpy.*/
strcpy(q->name,cat);
k=p->gonghao;
p->gonghao=q->gonghao;
q->gonghao=k;
strcpy(cat,p->bumen);
strcpy(p->bumen,q->bumen);
strcpy(q->bumen,cat);
strcpy(cat,p->haoma);
strcpy(p->haoma,q->haoma);
strcpy(q->haoma,cat);
flag=1; /*flag ==1 外层循环的结束标志,在这里是记录里面的循环是否执行,如果没执行,说明链表里的内容是有序的。*/
}
p=p->next;
}
}while(flag);
printf("排序完成\n");
return head;
}
break;
}
return head;
}
struct zhigong *duqu(void)
{
struct zhigong *p,*q,*H;
FILE *fp;
int n;
H=p=(struct zhigong *)malloc (sizeof(struct zhigong));
fp=fopen("D:/yuan.txt","r+");
if(!fp)
printf("文件打开失败");
else
{
n=fgetc(fp); //共添加多少
while(n>0)
{
q=(struct zhigong *)malloc (sizeof(struct zhigong));
fscanf(fp,"%s %d %s %s\n",q->name,&q->gonghao,q->bumen,q->haoma);
p->next=q;
p=p->next; //继续开辟下一个。
n--;
}
p->next=NULL;
}
fclose(fp);
return H;
}
int zongshu(struct zhigong *head) //统计一下下共添加了多少。
{
int n=0;
struct zhigong *p;
p=head->next;
while(p)
{
n++;
p=p->next;
}
return n;
}
六、程序调试及修改记录:
排序函数增加了一个选择,原来只是按序号排序的。运用atoi将字符型的转换为整型的。显示函数做了修改,能够将上一次输入的信息显示出来。增加一个标记文档,要是标记里面有内容,则能够进行读取。对输入的信息进行记录(总数)。
七、输入数据及输出结果:
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
4
姓名,工号,部门,号码
张三,2,自治部,
李四,8,学习部,
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
1
请输入 姓名,工号,部门,号码
王五
3
文娱部
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
4
姓名,工号,部门,号码
张三,2,自治部,
李四,8,学习部,
王五,3,文娱部,
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
5
保存成功
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
3
请输入要查找的姓名
王五
姓名,工号,部门,号码
王五,3,文娱部,
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
2
请输入要删除的职工的姓名
王五
请输入删除密码
yuan
删除成功
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
4
姓名,工号,部门,号码
张三,2,自治部,
李四,8,学习部,
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
6
请输入要修改的姓名
李四
请输入要修改的数据
请输入 姓名,工号,部门,号码
李四
5
生活部
修改成功
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
4
姓名,工号,部门,号码
张三,2,自治部,
李四,5,生活部,
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
7
1、按工号排序。
2、按姓名排序。
请输入你的选择。
2
排序完成
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
4
姓名,工号,部门,号码
李四,5,生活部,
张三,2,自治部,
职工档案管理系统
*****************************************
1、添加 2、删除
3、查找 4、列表查看
5、保存 6、修改
7、排序 8、退出
*****************************************
请输入你的选择
8
Press any key to continue
八、实训收获及心得:
展开阅读全文