某单位职工档案信息课程设计论文Word格式.docx
《某单位职工档案信息课程设计论文Word格式.docx》由会员分享,可在线阅读,更多相关《某单位职工档案信息课程设计论文Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
1、基本要求:
为方便管理某单位职工档案信息,编写一个职工档案管理系统软件。
系统记录必须包括职工的ID号、姓名以及性别、出生年月、职称、工资、所在单位、在岗情况等。
2、基本管理功能:
(1)添加:
增加一名职工的档案信息到管理系统中。
(2)查询:
可以根据职工姓名或ID号查找某人的相关信息,若找到则显示其信息。
(3)修改:
在管理系统中修改一名职工的记录。
(4)保存:
将所有职工档案信息保存在一个文件中(数据库文件或普通的文本文件)。
(5)读取:
从文件中读取已保存了数据。
(6)删除:
从管理系统中删除一条记录。
(7)恢复:
能恢复被删除的记录。
(8)统计:
(A)计算平均工资及总工资,(B)统计男/女职工各占总职工的人数的百分比、统计职工平均年龄和单位在岗职工人数占总职工人数的百分比、统计副高以上职工人数占总职工人数的百分比。
(C)以表格形式打印全部职工档案信息表。
(9)其他:
可以根据自己的思路设计其他功能。
三.总体设计方案及思路
我让主函数非常简洁,而每一个功能对应一个函数,还有几个另外函数就是界面函数,菜单选择函数和进入前用到的密码函数。
密码函数中有初始密码,也可以修改密码;
密码输入正确才可以进入菜单界面,否则重新输入或退出;
菜单中有对应的功能选择和提示,是用一个switch结构进行选择的,每一个功能前都有对应的序号,用户可以根据序号来选择想要执行的功能;
而在各个函数中,都会有一些中文的提示让你知道该怎样执行这个函数。
好的下面就来看一下程序的流程图和界面吧!
四.流程图及程序界面:
五.程序设计过程中遇到的问题及解决
1.第一个呢,就是怎样做文件的保存和读取啦。
因为没怎么学文件的知识,后来就狠狠的看了一遍书,再问了下班上的大神,最后终于顺利解决了,才发现原来挺简单的呀!
比如保存函数:
voidSave(intn)
{
ofstreamofile("
staff.txt"
ios:
:
out|ios:
binary);
for(i=0;
i<
n;
i++)
ofile.write((char*)&
staf[i],sizeof(staf[i]));
ofile.close();
}
小感想:
所以呢,很多东西可能开始感觉很难,但多想想,多查查,多问问就会有不一样的结果啦!
2.还有一个很重要的问题,也是一开始就困扰的问题,就是不知道怎样确定文件中已经有的职工信息数,这样的话其他的功能就都不好做,尤其是统计。
一开始,我是用普通的查找再个数加一,但进行了添加和删除之后都会出现问题,我就好好想了下,最后呢,也在大神的指点下用文件的知识解决了这个问题。
intLoad()
fstreamiofile("
in|ios:
if(!
iofile)return0;
else
{
for(i=0;
;
{
if(iofile.peek()==EOF)break;
iofile.read((char*)&
}
iofile.close();
returni;
}}
要相信,方法总比问题多。
不行的时候,换一种思路,换一种方法,问题总是会解决的。
3.在看了题目之后,感觉最难做的功能就是恢复啦,一开始的思路是在删除前把对象数组赋给另外一个数组,再恢复时就输出另外这个数组,但在删除两次和做恢复后的统计等功能时,明显就不对了。
后来想想就换了一种很好的方法,就是把要删除的职工信息先移动到另外一个数组中,恢复的时候再又移回到原来的位置,这样就成功的用很少的代码完成了这个我认为最难的功能。
voidrecover(intn)
{
for(inti=0;
n+1;
{
if(staf1[i].ID!
=0)
{for(;
n>
i;
n--)staf[n]=staf[n-1];
staf[i]=staf1[i];
}Save(n+1);
}
问题难,可能就是你看着它难,但努力想想,其实就那样,甚至非常简单,任何问题都经不住“认真”二字的。
备注:
以上的n都是职工的个数,由Load()函数确定。
4、开始的时候,我把生日设为了char型的,就直接包括了年月日,由键盘一次性输入,但后来发现,这样就算不了平均年龄了,所以一定要把年分离开来,后来就把生日改为了一个3个成员的int数组,输入也就分三次依次输入年月日。
这样就解决了平均年龄的统计问题啦,下面是统计代码:
for(i=0;
num;
{age=2014-staf[i].birthday[0];
average+=age;
average=average/num;
cout<
<
"
全体职工的平均年龄是:
"
average<
岁"
endl;
很多问题可能一开始注意不到,但在后面发现了,就要努力去改善它,因为还为时不晚。
5.在编写后期,我添加了进入界面前的密码输入功能,如果直接输入密码在屏幕上显示的话,不符合实际生活中的要求。
就想用*号去代替输入进去的密码,而这个确确实实难到了我,但我想既然做了,就一定要把它做好,于是查找资料,再自行修改、调试,花了一个晚上的时间,终于做好了。
不过还有一点点缺陷,就是密码只能是数字,不能是字母,暂定的是四位数,不过是可以修改的。
当然我已经尽力了,就很欣慰了。
下面来看看用*代替数字的函数吧!
intkey_hide()
intstr[4];
intt=0;
intlen=0,a=0,i,j;
for(;
len<
4;
)
{t=getch();
str[len++]=t-48;
*"
for(i=2;
i>
=0;
i--)
for(j=i;
j<
3;
j++)str[i]=str[i]*10;
a=a+str[i];
a=a+str[3];
returna;
我只想说皇天不负有心人,这个函数做到一半的时候都想放弃了,但想想还是坚持了下来,终于也就完成了,这一个晚上的努力没有白费。
所以认定了能干的就一定努力干下去,总会有收获的就是是没有,这个过程也会让人锻炼很多的。
6、也有一个不足的地方就是,不能对输入的信息进行判断是否正确,比如对于名字,应该输入汉字,但输入字母也不报错,这样的话,确实有点不够完善,但也由于时间有限,而且要输入的东西挺多,给每一次的输入都进行判断,确有些麻烦,所以,就没编写这个功能。
六.程序特色
1.主函数非常简单,仅有三行,而且还包括一个界面颜色的设置,看上去很简洁,很清爽。
因为要执行的函数都在一个switch结构中了,输入一个数字就执行一种功能。
下面是主函数和switch结构函数。
intmain()
system("
color9C"
);
key();
return0;
这是包括switch结构的函数;
voidhandle_menu()
{intnum;
{num=Load();
switch(menu_select())
case1:
add(num);
break;
case2:
findrecord(num);
case3:
modify(num);
case4:
Save(num);
case5:
display(num+1);
case6:
remove(num);
case7:
{recover(num);
display(num+1);
case8:
tongji(num);
case9:
{cout<
亲~谢谢使用职工档案管理系统!
exit(0);
system("
pause"
system("
cls"
);
key()就是下面要介绍的密码函数啦!
它包括了handle_menu()函数,在密码输入正确之后就执行handle_menu()函数
2.key()是我认为这个程序中亮点,也是我花了最多时间的一个功能函数。
因为它不仅要输入正确的密码才能进入功能界面,而且还可以修改密码,且输入的密码是以*号代替的,也就是说密码输入的时候,从屏幕上是看不到的你输入的数字的,这也正好符合现实中的使用要求,具有保密性,这一点在实际生活中是非常重要的。
voidkey()
inta,c,b,key=1111;
{system("
endl<
*欢迎使用职工档案管理系统"
*工号:
cin>
>
a;
*密码:
b=fun();
cout<
*按1进入系统,按2修改密码,按0退出:
c;
if(c==1&
&
key==b){system("
handle_menu();
elseif(c!
=1&
c!
=2)exit(0);
elseif(c==2)
{fstreamiofile1("
key.txt"
iofile1.read((char*)&
key,sizeof(key));
iofile1.close();
do
{system("
请输入原密码:
a=fun();
请输入新密码:
key=fun();
cout<
1.确认修改2.重新设置"
}while(a==2);
ofile.write((char*)&
ke