资源描述
c++公司人事管理系统课程设计报告(完整版)
(文档可以直接使用,也可根据实际需要修改使用,可编辑 欢迎下载)
面向对象程序设计课程设计报告
公司人事管理系统
院 系: 计算机学院二系
班 级: 计07 – 2班
姓 名:
学 号:
合 作 者:
指导教师:
2008 年 7 月 4 日
程序设计基础课程设计任务书
一、题目:公司人事管理系统
二、设计要求
(1)由(组长)和组成课程设计小组。
(2)小组成员分工协作完成。要求每个成员有自己相对独立的模块,,同时要了解其他组员完成的内容。
(3)查阅相关资料,自学具体课题中涉及到的新知识。
(4)采用结构化、模块化程序设计方法设计,功能要完善。
(5)所设计的系统应有菜单。
(6)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释)、参考文献等。报告一律用A4纸打印,正文的中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。1级标题中文字体为黑体,西文字体为Time New Roma,采用三号字;段落为居中、段前18磅、段后12磅、行距采用“固定值”18磅,首行缩进:无。仅一级标题上目录。
三、课程设计工作量
由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行以上,不得抄袭。
四、课程设计工作计划
2008年6月16日,指导教师讲课,学生根据题目准备资料;
2008年6月16日,设计小组进行总体方案设计和任务分工;
2008年6月17日~6月23日,每人完成自己承担的程序模块并通过独立编译;
2008年6月24日~6月25日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;
2008年6月26日,软件发布
2008年6月27日,验收、撰写报告;
2008年7月4日,交课程设计报告
指导教师签章:
教研室主任签章
程序设计基础课程设计指导教师评语与成绩
指导教师评语:
课程设计表现成绩:
课程设计验收成绩:
课程设计报告成绩:
课程设计 总成绩:
指导教师签章
2021年 7 月 日
目 录
一 概述(宋体,三号,加粗,居中) 4
二 软件需求分析 5
三 总体方案设计 6
四 详细设计 7
五 程序的调试与运行结果说明 12
六 课程设计总结 12
七 后记 12
八 参考文献 12
九 附录 12
一 概述
1. 课程设计的目的:公司人事管理系统
2. 课程设计的要求
(1)目的
1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养学生综合运用所学知识独立完成课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
(2)要求
(1)学生自由组成课程设计小组,建议每组学生人数一般为2-3人左右。
(2)每组选择课程设计题目中的1-2个课题,每个课题限选1组。小组成员分工协作完成。要求每个成员有自己相对独立的模块(每人的代码在200行以上),同时要了解其他组员的完成的内容。
(3)查阅相关资料,自学具体课题中涉及到的新知识。
(4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。
(5)所设计的系统应有菜单、动画和音乐。
(6)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:
封皮、课程设计任务书,目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
3. 课程设计的主要设计思想
我所在的小组设计了一个公司人事管理系统,这个系统的功能比较完善,由一个主函数和多个模块实现了该系统的以下功能:
1, 管理员系统界面,首先输入管理员密码进入界面,可实现添加职员信息,按姓名查找职工信息,修改职工信息,删除指定职工的信息,显示所有职工信息,返回主界面,直接跳出系统等功能。
2, 普通职工系统界面,首先输入自己的姓名进入普通职工界面,可实现输入个人信息,显示个人信息,按姓名查找他人信息,修改个人信息,显示所有在厂职工的信息,返回主页面,直接跳出系统等功能。
二 软件需求分析
一.需求分析:
为了使公司企业更好的管理职工信息及有关情况,方便快捷的处理各种信息,设计了本程序。比如有新职工进入公司,可以利用本程序输入职工的信息与资料,把该职工的信息存档,又比如某职工信息(如 号码)变化了,可利用该程序修改信息,还比如某职工因事离开该公司,还可以利用该程序删除该职工的信息。
二. 操作手册:
运行程序后,直接出现一个菜单。供你选择是按管理员身份还是普通职工身份进入系统,亦或者不进入直接退出,如果想以管理员身份进入必须知道管理员密码,正确执行后可进入管理员功能菜单或者普通职工功能菜单。根据菜单的提示即可进行操作。
三 总体方案设计
一.总体思路
程序运行时,直接进入公司人事管理系统的主菜单栏。
菜单栏清晰明朗的列出了每一项的功能按何种身份进入,包括管理员身份和普通职工身份。
1. 选择管理员身份,首先通过管理员密码确定你是否是管理员,进入管理员界面后,可实现添加职员信息,按姓名查找职工信息,修改职工信息,删除指定职工的信息,显示所有职工信息,返回主界面,直接跳出系统等功能,你可按提示进行操作。
2. 选择普通职工身份,首先输入你的姓名,目的是先确定目前现存文件里是否有该人,如果没有则可以首先提示你先选择1来输入你自己的信息,首先输入姓名也可以在你选择2时直接跳出职工本身的信息。同时该界面还可以实现修改本人信息,按姓名查找他人信息,显示所有在厂职工的信息,返回主页面,直接跳出系统等功能。你可按提示进行操作。
二.定义的函数及说明:
1.void tiquxinxi() / /从文件中提取出全部信息
2.void write() / /输入信息
3.void seach(char NAME[]) / /按姓名查找职工信息
4.void allprint() / /全部输出在厂职工的信息
5.void delet() / /删除职工信息
6.void oneprint() / /显示要查找的职工的信息
7.void change_infor() / /修改职工的信息
8.void mune1() / /管理员的功能菜单
9.void mune2() / /普通职工的功能菜单
10.int queding() / /管理员的密码确定函数
11.void select() / /功能菜单的选择函数
12.int main() / /主函数
三.比较有特色的算法:
本系统多次用到Switch,if,数组,结构体,指针以及各类函数。还用到了纯虚函数及抽象类,在继承和派生方面我们用到了通过利用基类的指针访问派生类的成员函数,
本系统最大的优点就是大量运用C++中的文件部分,只要你输入过的信息并且未被你删除,不管是否关闭过程序,信息都一直存在,你可任意时间查询。
四.整体框图
1管理员界面
2普通职工界面
0退出系统
系统主界面
1输入个人信息
2显示个人信息
3修改个人信息
4按姓名查找他人
5显示所有职工信息
6返回主界面
0直接跳出系统
输入管理员密码确认
首先输入职员姓名
1添加职员信息
2按姓名查找职工
3修改指定职工信息
4删除指定职工信息
5显示所有职工信息
6返回主界面
0直接跳出系统
四 详细设计
以下为我完成的具体功能函数及函数的详细分析和所用算法:
1, void tiquxinxi()函数;
该函数是打开指定文件从中提取所有的职工信息,提取到结构体数组里面,每个结构体存一个职工信息,把行数付给全局变量lenth.最后关闭文件。
void tiquxinxi() //提取信息
{
char e;
int i;
int j;
ifstream myfile("d:\\q.txt",ios::nocreate);
for(i=0;i<1000;i++)
{
myfile.getline(inf[i].name1,11);
if(strlen(inf[i].name1)<2) break;
for(j=1;j<30;j++)
if(inf[i].name1[j]==' ') inf[i].name1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].sex1,4);
for(j=1;j<30;j++)
if(inf[i].sex1[j]==' ') inf[i].sex1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].zhiwu1,11);
for(j=1;j<30;j++)
if(inf[i].zhiwu1[j]==' ') inf[i].zhiwu1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].idemployee1,6);
for(j=1;j<30;j++)
if(inf[i].idemployee1[j]==' ') inf[i].idemployee1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].ID1,21);
for(j=1;j<30;j++)
if(inf[i].ID1[j]==' ') inf[i].ID1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].brithday1,11);
myfile.get(e);
myfile.getline(inf[i].address1,31);
for(j=1;j<30;j++)
if(inf[i].address1[j]==' ') inf[i].address1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].tele1,13);
for(j=1;j<30;j++)
if(inf[i].tele1[j]==' ') inf[i].tele1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].money1,6);
for(j=1;j<30;j++)
if(inf[i].money1[j]==' ') inf[i].money1[j]='\0';
myfile.get(e);
}
lenth=i;
myfile.close();
}
打开q.txt文件
提取信息到结构体里每人一个结构体存放信息
把行数付给全局变量lenth
关闭文件
2. void delet()函数。
该函数首先调用提取函数,输出所有人的信息,然后调用查找函数查到要删除的人,记下在结构体中的位数,以清空的方式打开文件,重新写入信息,到删除的位置时不输出信息,继续输下面人的信息,最后关闭文件。成功完成删除信息的任务。
void delet() //管理员删除职员信息
{
int j;char e;
tiquxinxi();
cout<<"以下为"<<NAME<<"的信息:\n";
seach(NAME);
cout<<"你确定要删除该信息( Y(是) or N(否) )?:";
cin>>e;
if(e=='y'||e=='Y')
{
for(int i=0;i<1000;i++)
if(strcmp(NAME,inf[i].name1)==0) break;
j=i;
ofstream outfile("d:\\q.txt",ios::trunc); //全清
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0;i<lenth;i++)
{
if(i==j) continue;
outfile<<setiosflags(ios::left)<<setw(10)<<inf[i].name1;
outfile<<" "<<setw(3)<<inf[i].sex1;
outfile<<" "<<setw(10)<<inf[i].zhiwu1;
outfile<<" "<<setw(5)<<inf[i].idemployee1;
outfile<<" "<<setw(20)<<inf[i].ID1;
outfile<<" "<<setw(10)<<inf[i].brithday1;
outfile<<" "<<setw(30)<<inf[i].address1;
outfile<<" "<<setw(12)<<inf[i].tele1;
outfile<<" "<<setw(5)<<inf[i].money1;
outfile<<"\n";
}
outfile.close();
cout<<"你已经成功删除"<<NAME<<"的信息"<<endl;
}
else
cout<<"你已经放弃了删除该信息!\n";
调用tiquxinxi()函数
调用seach(NAME)函数
j=i
用outfile以清空的方式打开指定文件” d:\\q.txt”
否 能否打开 能
If(i==j) continue
关闭文件
exit (1);
输出所有NAME信息
N
你已经放弃了删除该信息
if(strcmp(NAME,inf[i].name1)==0)
你确定要删除该信息 Y
For(i=0;i<1000;i++)
For(i=0;i<lenth;i++)
3. void select() 函数
该函数为菜单函数,通过此函数进行相应的操作,首先,有抽象类指针来控制是管理员身份还是普通职工身份,然后进行7种选择,0——退出;1——输入职工的信息;2——显示查找人信息;3——修改查找人信息;4——(1:查找他人信息;2:删除查找人信息;);5——显示所有在厂职工信息;6——返回主菜单。
void select() //菜单管理及选择
{
people *pt;
employee em;
guanliyuan guan;
if(sl==1) pt=&guan;
if(sl==2) pt=&em;
cout<<"请选择你要进行的操作(0-6):";
do
{
int ch;
cin>>ch;
switch(ch)
{
case 0:cout<<"你已经成功退出!谢谢使用!^_^"<<endl;exit(0);
case 1:{pt->input_inf();cout<<"你还想进行何种操作:";break;}
case 2:{pt->oneprint();cout<<"你还想进行何种操作:";break;}
case 3:{pt->change_infor();cout<<"你还想进行何种操作:";break;}
case 4:
{
if(sl==1)
{
cout<<"请输入要删除人的姓名:";
cin>>NAME;
tiquxinxi();
for(int i=0;i<lenth;i++)
if(strcmp(NAME,inf[i].name1)==0) break;
if(i>=lenth) cout<<"记录中暂无此人信息.\n";
else
pt->delet();
cout<<"你还想进行何种操作:";break;
}
if(sl==2)
{cout<<"请输入查找人姓名:";cin>>NAME;pt->seach(NAME);cout<<"你还想进行何种操作:";break;}
}
case 5:{pt->allprint();;cout<<"你还想进行何种操作:";break;}
case 6:k=0;break;
default:cout<<"你的选择错误,请重新选择:";break;
}
}while(k);
}
people *pt
if(sl==1)
Y N
Switch(ch)
case 0:退出 break;
case 1:输入信息 break;
case 2:显示查找人信息 break;
case 3:修改查找人信息 break;
case 4:if(sl=1)输出他人信息;else删除查找人信息 break;
case 5:显示所有在厂职工信息 break;
case 6:返回主菜单
default:你的选择有误,请重新选择
3. 在employee类和guanliyuan类继承people类时的UML图:
派生两类的代码(略)。
UML图如下:
people
#name:char[20]
#sex:char[3]
#zhiwu:char[10]
#ID:char[20]
#brithday:struct date
#address:char[50]
#tele:char[20]
#idemployee:char[20]
#money:double
+Input-inf() : void
+seach(NAME: char[20]) : void
+allprint() : void
+oneprint() : virtual void
+change-infor() : virtual void
+delet() : virtual void
guanliyuan
employee
+delet() : void
+oneprint() : void
+change_infor() : void
+change_infor() : void
+delet() : void
+oneprint() : void
<<Public>>
<<Public>>
五 程序的调试与运行结果说明
1,在确定密码时,事先没有加上<<flush时,往里输密码时,’’*’’号不会因为输入一个字符而出现一个字符,而是输入全部密码后按enter键才会输出全部’’*’’,加上<<flush后,程序就会按输入一个字符显示一个’’*’’的格式出现。以下图是正确后的示图。
2.在提取文件信息时,开始时会出现下列乱码,经检查后才发现getline(sting,n);中提取的信息长度为n-1,原因是n中有一位存’\0’,后每项都加上1后,信息提取便精确了。
改正前:
改正后:
六 课程设计总结
整体来说,该程序还基本满足了公司人事管理的基本需求,比如添加,修改及删除职工信息。由于时间仓促,本系统还不完善,比如,它只能按姓名查询职工信息,不能按其他信息查找,也不能按模糊信息,多项信息查找。如果输入格式有误,该系统会自动跳出。
在进行过程中,我们在修改信息,删除信息方面遇到了很大的麻烦,开始以为可以按文件指针直接在文件里修改及删除,后来经学哥提醒,可以先把全部信息提取出来然后再修改,然后再重新读入文件,才把该问题解决。
七 后记
首先,要感谢王双立老师的指导和他这一学期对我们学习的负责态度,课上实际操作,常举实例,是一种很吸引学生的方法。让我们基础学的很扎实。还要感谢几位同学和学哥的指点。
其次,我还要感谢我的组长魏林林,我们一起完成了这次实验,让我我知道团结就是力量的真正意义。
八 参考文献
[1] 谭浩强,C++程序设计(第一版),北京,清华大学出版社,2004年6月。
[2] 郑莉,董渊,张瑞丰,C++语言程序设计(第3版),北京,清华大学出版社,2004年1月。
九 附录
//全部代码、界面及注释
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
#include<fstream.h>
#include<stdlib.h>
#include<conio.h>
char mima[20],employname[10];
int sl,k=1,lenth=0;
char NAME[20];
struct date
{
int year;
int month;
int day;
};
struct infor
{
char name1[20]; //姓名
char sex1[3]; //性别
char zhiwu1[10]; //职务
char ID1[20]; //身份证号
char brithday1[12]; //生日
char address1[50]; //家庭住址
char tele1[20]; // 号码
char idemployee1[20]; //工作编号
char money1[5];
}inf[100];
void tiquxinxi() //提取信息
{
char e;
int i;
int j;
ifstream myfile("d:\\q.txt",ios::nocreate);
for(i=0;i<1000;i++)
{
myfile.getline(inf[i].name1,11);
if(strlen(inf[i].name1)<2) break;
for(j=1;j<30;j++)
if(inf[i].name1[j]==' ') inf[i].name1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].sex1,4);
for(j=1;j<30;j++)
if(inf[i].sex1[j]==' ') inf[i].sex1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].zhiwu1,11);
for(j=1;j<30;j++)
if(inf[i].zhiwu1[j]==' ') inf[i].zhiwu1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].idemployee1,6);
for(j=1;j<30;j++)
if(inf[i].idemployee1[j]==' ') inf[i].idemployee1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].ID1,21);
for(j=1;j<30;j++)
if(inf[i].ID1[j]==' ') inf[i].ID1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].brithday1,11);
myfile.get(e);
myfile.getline(inf[i].address1,31);
for(j=1;j<30;j++)
if(inf[i].address1[j]==' ') inf[i].address1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].tele1,13);
for(j=1;j<30;j++)
if(inf[i].tele1[j]==' ') inf[i].tele1[j]='\0';
myfile.get(e);
myfile.getline(inf[i].money1,6);
for(j=1;j<30;j++)
if(inf[i].money1[j]==' ') inf[i].money1[j]='\0';
myfile.get(e);
}
lenth=i;
myfile.close();
}
class people //人的类
{
protected:
char name[20]; //姓名
char sex[2]; //性别
char zhiwu[10]; //职务
char ID[20]; //身份证号
date brithday; //生日
char address[50]; //家庭住址
char tele[20]; // 号码
char idemployee[20]; //工作编号
double money;
public:
void input_inf() //输入信息函数
{
ofstream outfile("d:\\q.txt",ios::in|ios::app); //建立并追加方式
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
cout<<"请输入职工姓名:"; /*改成按格式输入文件*/
cin>>name;
outfile<<setiosflags(ios::left)<<setw(10)<<name; //左对齐
cout<<"请输入职工性别:";
cin>>sex;
outfile<<" "<<setw(3)<<sex;
cout<<"请输入职工职务:";
cin>>zhiwu;
outfile<<" "<<setw(10)<<zhiwu;
cout<<"请输入职工工作编号(限制5位):";
cin>>idemployee;
outfile<<" "<<setw(5)<<idemployee;
cout<<"请输入职工身份证号:";
cin>>ID;
outfile<<" "<<setw(20)<<ID;
cout<<"请输入职工生日:";
cin>>brithday.year>>brithday.month>>brithday.day;
outfile<<" "<<setw(4)<<brithday.year<<"/"<<setw(2)<<brithday.month;
cout<<"/"<<setw(2)<<brithday.day;
cout<<"请输入职工家庭住址:";
cin>>address;
outfile<<" "<<setw(30)<<address;
cout<<"请输入职工 号码:";
cin>>tele;
outfile<<" "<<setw(12)<<tele;
cout<<"请输入职工月薪(不超过5位):";
cin>>money;
outfile<<" "<<setw(5)<<money;
outfile<<"\n";
outfile.close();
}
void seach(char NAME[]) //按姓名查找函数
{
tiquxinxi();
for(int t=0;t<lenth;t++)
if(strcmp(NAME,inf[t].name1)==0) break;
if(t<lenth)
{
cout<<NAME<<"的信息如下:";
cout<<"\n姓名:"<<inf[t].name1;
cout<<"\n性别:"<<inf[t].sex1;
cout<<"\n职务:"<<inf[t].zhiwu1;
cout<<"\n工作编号:"<<inf[t].idemployee1;
cout<<"\n身份证号码:"<<inf[t].ID1;
cout<<"\n生日:"<<inf[t].brithday1;
cout<<"\n联系 :"<<inf[t].tele1;
cout<<"\n地址:"<<inf[t].address1;
cout<<"\n工资:"<<inf[t].money1<<endl; //各项信息一一列出
}
else cout<<"查无此人!\n";
}
void allprint() //显示全部信息函数
{
tiquxinxi();
ifstream myfile("d:\\q.txt",ios::nocreate);
int i;
char a[120];
for(i=0;i<lenth;i++)
{
myfile.getline(a,150);
cout<<a<<endl;
}
myfile.close();
}
virtual void oneprint()=0; //显示一个人的信息 //纯虚函数
virtual void change_infor()=0; //修改信息函数
virtual void delet()=0; //删除函数
};
class employee:public people
{
public:
void delet() //只是形式,整个程序不会用到此函数
{
cout<<"YOU CANNOT DELETE INFORMATION!\n";
}
void oneprint() //显示一个人的信息
{
seach(employname);
}
void change_infor() //职员修改个人信息
{
char e;
tiquxinxi();
cout<<"这是你的信息:\n";
seach(employname);
cout<<"你确定要修改该信息( Y(是) or N(否) )?:";
cin>>e;
if(e=='y'||e=='Y')
展开阅读全文