资源描述
学号
2016年-2017年 第二学期
1608220203
《C语言程序设计》
课程设计
题目:
人事档案管理系统
专业:
网络工程
班级:
16(3)班
姓名:
代应豪
指导教师:
代美丽
成绩:
计算机学院
目录
1.需求分析
2.系统框图
3.设计模块
4.系统的软硬件环境
5.设计分析
5.1.人事档案管理系统功能
5.2.模块功能及操作步骤
6.使用说明
7.结束语
7.1程序优点
7.2程序不足之处
7.3收获
8.源代码
9.参考书籍
人事档案管理系统
一、需求分析
电脑已经深入到我们日常工作和生活的方方面面,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家,各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上已经充满了多如牛毛的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。
随着企事业单位的发展,人员会越来越多,少则几十人、多则上万人。例如一个企业分很多部门,每个部门又分为许多科或室等,而其下又分为各级领导和员工。用笔和纸传统的手工管理档案,这中管理方式存在着不易更新、不易存放、不安全、容易丢失、难以备份等重大缺陷,管理起来效率低下而且很可能造成管理上的混乱。而自己建立简单的电子文档对信息管理进行管理虽然克服了以上的缺点,但查询效率较低,特别是当数据量十分庞大时,劣势尤其明显。因此开发一个既可以存储信息,又可以进行更新、查询、管理等功能,同时价格又能为广大消费者接受的多功能电子人事信息管理系统就显得十分必要。
二、系统框图
输入i
判断i
输入人事信息
显示人事信息
删除人事信息
查询人事信息
读取文件
存储文件
读取文件
人事统计信息
性别统计
人数规模
入公司时间
输入
判断i
开始
关闭
2
三、设计模块
需要有以下模块:
输入模块,显示模块,删除模块 、存储模块 查询模块、读取模块统计模块、退出模块 。
四、系统的软硬件环境
1、硬件环境: CPU intel i3 2GM内存 500G硬盘。
2、软件环境:visual C++ 6.0 操作系统 Windows7。
五、设计分析
1.人事档案管理系统功能:
程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。在人事管理过程中,由于预计记录对于一个单位的学生数或人事数来说太大,操作除了能够增加、删除、保存等外,更多的情况是查询,且能够实现快速查询。特别是当需要动态变化时利用链表,例如插入和删除数据等操作时,为方便插入和删除人事记录,通过数据的自动的移动数据,实现动态管理。
本系统涉及的模块主要有:开始、系统管理、人事管理、信息查询等四大模块。
(1) 人事管理主要包括:(编号、姓名、性别、年龄、出生日期、政治面貌、家庭住址、图片等)基本 内容的输入,删除,修改,查询
(2) 系统管理主要包括:用户的注册,资料的修改等。
(3) 信息查询主要包括:员工信息的查找、打印等。
2. 模块功能及操作步骤:
各个模块功能及流程图
(1)record()系统将提示输入人事姓名、性别、城市、街道、电话、邮编、进入公司的时间(*****注意:按提示输入******),主要使用”scanf()”及”getchar()”语句。首先利用”malloc”函数在内存的动态存储器中开辟一个长度为”sizeof”长度的空间,以存放预定义的”*worker”指向的内容。并用”new”指向起始地址的指针。若不能执行,返回空指针.否则,利用链表执行输入功能。即:else
流程图
head=NULL
输入
new=head
new=this
new=>this->next
this->next=thisis
this->next.=NULL
head=>this
申请内存
记录
(1)
Y
(2)listall()系统将显示文件中存储的人事档案。此功能利用do{}while;语句。若”this”不指向空。该系统利用语句
do
{printf(“\n记录%d”,++i);
printf(this);
getchar();
this=this->next;
}
此外使用“printf()”语句完成显示功能系统。(流程图在7页)
(3)del()系统将提示输入要删除人事的姓名。输入相应信息。系统将删除您所指定的信息。主要使用”strcmp()”及”printf()”等语句。本系统执行删除语句一条比较函数。即:if(strcmp(p->name,str)==0)break;应用链表的实行地址转换,以便执行查找人名的功能:
if(p2)
{p1->next=p2->next;
free(p2);<*释放内存区,使该区被其他变量使用*>
print (“\n**请存盘**\n”);
显示
head=NULL
head=this
输出this
this->next=this
this=NULL
读取
getchar();
}
else
{printf(“没找到所须删除员工\n”);
getchar();
} 流程图:
删除
删除
输入str
head=p1
p1=p2
p2=NULL
比较p->name及str
p2=p1
p2->next=p2
p2=head
head->next=next
p2=NULL
(3)
Y
N
Y
(4) search()系统将对您指定的信息进行查找。主要使用“strcmp()”“getchar()”等语句。该系统主要运行过程为:若头指针不为空,则利用比较函数if(strcmp(p1->name,nsme)= =0)如果该语句成立,证明输入的信息已被查询到,如果语句(p1==NULL)成立,表示您查找的人不是本公司员工,按任意键可回到主程序执行区。(流程图在11页)
(5) rfile()系统将显示您所要读取的信息。主要使用文件指针及“fopen”“fclose”语句。此模块我们系统的重要部分,相对来说较为复杂。开始时要用到”mallo”函数来开辟空间(及模块‘1’中的原理相同),如果能打开目标文件,逐条读取,直到指针指向的下个地址为空,则表明读取完毕。执行此项功能的语句为:
else
{while(fread(p,sizeof(worker),1,in)= =1)
{j++;
printf(“\n 记录\n”,j);
if(j= =1)
head=p;
p=p->next;
if(p= =NULL)
p=(worker*)malloc(sizeof(worker));
p2=p;
}
free(p);
p2=NULL;
fclose(in);
printf(“\n%d条文件读取完毕\n”,j);
}
if(j = =0)
printf(“**磁盘无数据**\n”);
printf(“按任意键继续\n”);
getchar();
(流程图在下页)
head=p1
查询
显示
输入str
head=NULL
p1=NULL
比较str及姓名
p1->head=p1is
输出
(4)
Y
显示
存储
打开文件
P=NULL
存 储
p->next=p
关闭文件
P=NULL
(5)
Y
Y
(6) wfile()系统将自动保存您所要存储的信息。用到了”if”及”for”语句。如果该文件能打开,预将文件存储在1.out文件中,即:
while(p)
{fwrite(p,sizeof(worker),1.out);/*将p以sizeof长度逐条存储在文件1.out中*/
n++;
p =p->next;
fclose(out);
printf(“\n文件的%d被写入。\n”,n);
}
printf(“按任意键继续”\n);
getchar;
流程图
p=NULL
申请内存
打开文件
提取
j++
j=1
p=>next
p->next=>p
p=NULL
申请内存
p->p2
释放p
关闭
读取
(6)
N
N
N
(7) total()系统将统计您所输入的信息。这个模块是本组成员最满意的,此模块的执行程序极为简单,但是执行的功能确实非常齐全。本模块主要运用”if()else{}”的循环嵌套;就完成了性别统计、公司人员规模、入公司时间的三项功能。值得一提的是在执行性别统计及公司人员规模的执行语句后加上2个”getchar()”本小组成员在借鉴的同时的提高,这是为了减缓程序运行速度,保证指针所指向的最后一个内容被系统执行,这才使两项功能完整的执行。(流程图在16页)
开 始
Head->p
输入str
判断str
p=NULL
p=NULL
p=NULL
x++
y++
i++
输出
pt->sex
pt->next=>pt
X+=1
pt->next=>pt
输出日期
pt->next=>pt
(8)退出模块:系统将退出到DOS环境。
(7)
1 2 3
Y Y
六、使用说明
初始化界面
输入回车进入主菜单
选择功能,(输入0--7)
录入功能
输入人事信息
输入姓名,性别,城市,街道,电话,邮编,年龄。入公司年份。
显示人事信息
键入6并按回车键以后,保存录入信息,键入2并按回车,可以显示录入的人事信息。
查询功能
键入4,按回车后,就可以进行查询功能。
查询人事信息,需要输入查询人事的姓名。
删除功能
键入3并按回车,可以进行删除功能。一旦删除无法恢复,请审用。
删除人事记录
七、结束语
程序优点:
本系统属于小型应用程序,适用于人事管理系统。使用灵活方便,本系统操作界面友好,有无计算机基础军可使用。能提高工作效率,节约时间,使烦琐的管理变得十分轻松。
程序的不足之处:
本程序虽然使用方便,但是并不十分完善,由于我们的能力和要求的范围有限,对具体细节的内容作的并不是很到位。我们并不能计算学生的借书时间等。设计之初我们也没有把文件这一重要组成部分写到程序里,使得本程序只能使用一次。经过迟老师的细心指导我们才知道一个完整的程序是可以重复使用的并且及时添加了这一功能。由于时间有限,我们只能运用一些简单的函数进行编程本程序。以及对某些函数录入的限制还有待改进和完善。
收获:
成功之处:此系统程序虽然简单,却集结了基本的管理功能。删除,存储,统计等功能还是较为成功的。特别是人事档案的统计管理功能,使烦琐的工作变得简单轻松。
不足之处:由于我们水平和时间有限,难免有不足和差强人意的地方。尤其是对于系统应该配以保密性的设置,可是由于我们的知识积累不够,运行不了。
小结:利用课余时间别编写了这套人事管理系统。通过这次课程设计,使我们所学的知识转化今天的成果。当然,在程序设计的过程中,通过及其他专业同学交流,我们也深刻体会到自计算机水平的有限及不足,为了将我们及其他专业学生以及其他高校学生的差距缩小,我们今后将会以200%的努力投入到学习中去,用汗水和知识衡量我们及成功间的差距!
八、源程序
#include "string.h"
#include <stdio.h>
#include "stdlib.h"
#define NULL 0
typedef struct worker
{
char name[20];
char sex;
char age[4];
char te[20];
char zi[10];
char adress[20];
char city[10];
typedef struct date
{
int year;
int month;
int day;
}date;
}worker;
worker *head,*this,*new;
/************************主函数********************/
main()
{
char order;
head=NULL;
clrscr();
printf("\n\n***提示请先读取文件!!****\n);
printf ("\n\n*** 按回车继续!!!***\n);
getchar();
do
{clrscr();
printf(" <<*人事管理系统*>>\n");
printf("\n");
printf("************************************\n");
printf(" ** 1.输入人事信息 $ 2.显示人事信息 **\n");
printf(" ** 3.删除人事信息 $ 4.查询人事信息 **\n");
printf(" ** 5.读取文件 $ 6.存储文件 **\n");
printf(" ** 7.人事统计信息 $ 0.退出系统 **\n");
printf("************************************\n");
printf("\n 请您在上述功能(0-7)中选择:\n");
order=getch();
switch(order)
{
case'1':record();break;
case'2':listall();break;
case'3':del(head);break;
case'4':search();break;
case'5':r);break;
case'6':w);break;
case'7':total(head);break;
case'0':w);break;
}
}
while(order!='0');
clrscr();
printf("\n\n\n\n\n\n");
printf("***** c 语言程序设计 *****\n");
printf("* 名称:人事管理系统\n");
printf("* 班级:16网工3班。\n");
printf("* 指导老师:迟立颖老师\n");
printf("* 设计者:刘燕山 \n");
printf("* 设计时间:2017年4月\n");
getchar();
}
/*******************************输入信息***********************/
record()
{
char re,num[30];
new=(worker*)malloc(sizeof(worker));/****(*void)malloc(sizeof(*))
\***malloc(sizeof(*void))是内存的动态存储中分配一个长度为sizeof的连续空间((*void)指向分配域起始地址的指针)若不能执行返回空指针***\
if(head==NULL)
head=new;
else
{
this=head;
while(this->next!=NULL)
this=this->next;
this->next=new;
}
this=new;clrscr();
printf("\n 请您输入姓名:\n");
scanf("%s",this=->name);getchar();
printf("\n 请您输入性别(m代表男,W代表女:\n");
this->sex=getchar();getchar();
printf("\n 请您输入城市:\n");
scanf("%s",this->city);getchar();
printf("\n请您输入街道:\n");
scanf("%s,this->address);getchar();
printf("\n请您输入电话\n");
scanf("%s",this->tel);getchar();
printf("\n请您输入邮编\n");
scanf("%s",this->zi);getchar();
printf("\n请您输入年龄\n");
scanf("%s",this->age);getchar()
printf("\n请输入入公司时间年份\n");
scanf("%d",&this->date->year);getchar();
printf("\n请输入入公司时间月份\n");
scanf("%d",&this->date->month);getchar();
printf("\n请输入入公司时间日期\n");
scanf("%d",&this->date->day);getchar();
printf("\n**请存盘!**");getchar();
this->next=NULL;
}
/************************显示信息**************************/
listall()
{
int i=0;
if(head==NULL)
{rfile();return();}
this=head;
clrscr();
do{
printf("\n记录%d\n",++i);
print(this);
this=this->next;
}
while(this!=NULL);
(--this)->next=NULL;
}
void print(worker *t) \**** *t传递链表、储存数据****\
{
printf("姓名:%s\n",t->name);
printf("性别:%c\n",t->sex);
printf("入公司时间:%4d/%2d/%2d\n",
pt->date->year,
pt->date->month,
pt->date->month);
printf("城市:%s\n",pt->city);
printf("街道:%s\n",pt->adress);
printf("电话:%s\n",pt->te);
printf("邮编:%s\n",pt->zi);
}
/************************查询信息*******************************/
int search()
{
worker *p1;
char name[20];
p1 = head;
printf("请输入所需查询员工姓名:");
scanf("%s",name);
printf("\n");
if(head == NULL)
{
printf("记录以空!\n");
return 0;
}
printf("按回车键继续!!\n");
getchar();
clrscr();
while(p1!=NULL)
{
if(strcmp(p1->name,name)!=0)
p1 = p1->next;
else
{
printf("所查询人员信息:\n");
print(p1);
break;
}
}
if(p1 == NULL)
{
printf("%s 不是本公司人事.\n");
printf("按任意键继续\n");
getchar();
}
}
/**************************删除信息****************************/
void del(worker *pt)
{
worker *p1,p2;
char str[20];
printf("请输入所需删除人员姓名:");
scanf("%s",str);
p1 = p5;p2 = p1;
while(p2)
{
if(strcmp(p2->name,str) == 0)break;
else{p1 = p2;p2 = p2->next;}
}
if(p2)
{
p1->next = p2->next;
free(p2);/**free(void)释放void内存区使该区能被其它变量使用**/
printf("\n** 请存盘 **\n");
}
else
printf("没找到所需删除员工\n");
if(p2 == head)
head = head->next;
printf("按回车键继续 \n");
getchar();
}
/************************存储信息**************************/
void w *p)
{
int n =0;
FILE *out;
if((out = fopen("a:\数据.c","wb"))==NULL)
{
printf("\n不能打开“a:\数据.c”");
}
else
{
if(p)
{
while(p)
{
fwrite(p,sizeof(worker),1,out);
n++;
p = p->next;
}
fclose(out);
listall();
printf(\n文件的%d条记录被写入。\n",n);
}
printf("按任意键继续\n");
getchar();
}
}
/***************************读取信息**************************/
void r *p)
{
int j=0;
FILE *in;
if((in = fopen("a:数据\.c","rb"))== NULL)
{
printf("不能打开目标文件\n");
return;
}
else
{
while(fread(p,sizeof(worker),1,in)==1)
{
j++;
printf("\n记录:%d",j);
if(j == 1)
head = p;
p = p->next;
}
fclose(in);
printf("\n%d条文件读取完毕.\n",j);
}
if(j == 0)
printf("** 磁盘无数据 **\n");
printf("按任意键继续\n");
getchar();
}
/************************** 统计信息**************************/
void total(worker *p)
{
char str;
int i=0,x=0,y=0;
float a=0.0;
worker pt, /****pt当前变量****/
pt2, /****pt2循环变量 ****/
pri; /*****pri前驱*********/
if(p == NULL)
{
printf("\n**********请先读文件*********");
printf("\n** 按回车继续 **");
getchar();
return 0;
}
pri = pt =t;
printf("\n******************************");
printf("\n** 1.性别统计 2.公司人数规模*");
printf("\n** 3.工龄 0.退出 *");
printf("\n******************************");
printf("\n 请你在上述功能(0-3)选择 ");
str = getchar();
if(str == '0')
return;
if(str == '1');
{
while(pt)
{
i++;
if(pt->sex == 'm')x++;
else y++;
pt = pt->next;
}
printf("\n公司人员总数:%5d\n",i);
printf("\n性别比例:%4.2f\n",x/y);
printf("\n人员-男:%5d\n",x);
printf("\n人员-女:%5d\n",x);
}
else if(str == '2')
{
while(pt)
{
pt2 = pt->next;
while(pt2)
{
if(pt->age < pt2->age)
{
pt->next = pt2->next;
pt2->next = pt;
pri->next = pt2;
} /**********交换***********/
pt2 = pt2->next;
}
pri = pt;
pt = pt->next;
}
pt =p;
printf("\n公司员工年龄");
while(pt)
{
printf("姓名:%s----",pt->name);
printf("年龄:%5d\n",pt->age);
pt = pt->next;
}
}
else if(str == '3')
{
printf("\n入公司时间\n");
while(pt)
{
printf("姓名:%s-------",pt->name);
printf("入公司时间:%4d/%2d/%2d\n",
pt->date->year,
pt->date->month,
pt->date->month);
printf(" 城市:%s\n",pt->city);
printf(" 街道:%s\n",pt->adress);
printf(" 电话:%s\n",pt->te);
printf(" 邮编:%s\n",pt->zi);
printf("\n\n\n");
getchar();
pt = pt->next;
}
}
}
九、参考文献
1、 C语言大学实用教程
-----------------------------------------------------------------------------------------------电子工业出版社
2. 程序设计及c语言引论
-----------------------------------------------------------------------------------------------北京大学出版社
3、c语言程序设计教程
-----------------------------------------------------------------------------------------------北京大学出版社
4、c语言程序设计实例精粹
------------------------------------------------------------------------------------------------电子工业出版社
:
5、C语言程序设计(第四版)谭浩强著
----------------------------------------------------------------------------------------------清华大学出版社
38 / 38
展开阅读全文