计算机科学与技术学院《C高级语言程序设计》课程设计报告 (2012/2013学年 第一学期)学生姓名: 茹伟专业班级: 计算机112002班学生学号: 201120010220指导教师: 王艳 2012年 12 月 29日《工资管理系统》的设计与实现 目 录一、目的和要求 4 (一)课题的来源和研究意义 4 (二)课题的开发环境 4 (三)本课题要达到的设计目标 5二、课程设计任务内容 5 (一)系统功能分析 5 (二)数据流程图 5三、详细设计内容 6 (一)系统功能和流程 6 (二)程序流程图 6 (三)数据库逻辑结构设计及函数功能表 8四、系统具体实现使用说明 9 (一)系统的主界面 9 (二)员工信息管理模块 10 (三)员工工资管理模块 11 (四)保存退出和软件测试 13五、心得与体会 14附录1参考文献 15附录2程序清单-—-————-—-—-——-———------—-——-—-———-----—------——--26一 目的和要求(一)课题的来源和研究意义随着计算机的日益普及和网络的发展,数据库的应用范围越来越广,数据库应用的功能也越来越强,因此编写管理信息系统应用程序也显得尤为重要,在强调管理,强调信息的现代社会中它变得越来越普及。
工资管理是任何企事业单位都需要进行的一项工作,因此,开发制作工资管理系统具有较大的社会现实意义,同时工资管理系统是一切应用系统的典范,它具有一切应用系统的特征,系统结构与现实生活紧密结合,具体直观,具有典范的数据库系统的特性工资管理系统主要用于企业内部员工的档案、工资、考勤、评价的管理,便于公司领导掌握人员的动向,及时调整人才的分配,同时也减少了手工操作带来的一些繁琐与不便,使员工情况的记录和统计变得十分简单这些优点可以极大的提高企业对人事管理的效率因此,工资管理系统是企事业信息化、智能化、科学化和正规化不可缺少的管理软件二)课题的开发环境本系统的设计是在Windows xp中文版操作系统环境下,使用Visual C++ 60中文版开发成功的数据库SQL是其中的重要支持技术,在数据库开发过程中,如何选择数据库管理是一个重要的问题,目前,数据库产品较多,每种产品都具有各自的特点和适用范围,因此,在选择数据库时,应考虑数据库应用的特点及适用范围,本系统选用的数据库语言介绍如下:C++语言C++是一种使用非常广泛的计算机编程语言C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷.很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++.(三)本课题要达到的设计目标工资管理信息系统的开发目标是:克服现在工资管理中存在的人工管理,统计与查询单一、管理效率低下等问题;能科学有效的管理工资,方便地查询和统计人员、工资等情况,对所需要的数据以表格形式显示,以报表形式打印,并为将来进一步扩充和发展工资管理系统奠定基础二 课程设计任务内容 (一)系统功能分析系统开发的总体任务是要实现企业人事信息关系的系统化,规范化和自动化系统功能分析是在系统开发的总体任务的基础之上完成的工资管理系统主要有以下几项功能:1员工档案的管理:包括员工基本信息,姓名和工号2.员工工资的管理:包括工资的添加,工资报表的查询,修改和删除月份工资的管理:包括添加某月某员工的工资和查询某月所有员工的工资信息4.员工补贴的管理:包括津贴,房贴和交通费的输入,计算和修改员工扣除的管理:包括房租,会费和税务的输入,修改和计算.6。
计算:对工资各项数据进行汇总计算7.保存信息和退出系统.8.管理员以及其它功能模块二)功能模块图 根据系统功能的要求,可以将系统分解成几个功能模块来分别设计,功能模块如图2—1所示工资管理系统基本信息查询基本信息管理信息数据库查询员工信息查询工资修改信息删除信息添加信息输出信息导入工资计算公式导入职务基本工资导出数据报表导入员工津贴信息 图2-1 功能模块图三、详细设计任务内容(一)系统功能和流程数据库的设计是指对于一个给定的应用环境,构造最有效的数据库模式,建立数据及应用系统,实质能够有效地存储数据,满足用户的需求,数据库设计是在数据库管理系统支持下进行的.根据功能模块图,可以列出以下数据项和数据结构:员工信息:工号,姓名工资管理:工号,月份,姓名,底薪,津贴,房贴,交通费,应发工资,实发工资员工扣除管理:工号,月份,姓名,房租,会费,税务,应扣数管理员:编号,用户名,密码.(二)程序流程图得到上面的数据项和数据结构以后,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础这些实体包含各种具体信息,通过相互之间的作用形成数据的流动。
根据上面的设计规划出的实体有:员工基本信息实体,员工考勤信息实体,员工工作评价信息实体,员工工资信息实体,人事变动实体,部门管理实体根据实体之间的联系得出程序流程图如图3-1所示 开始 管理员登陆密码是否正确 否 是 汇总计算查询职工工资添加、修改、更新员工信息变动情况添加、修改、查询员工信息及工资信息信息是否出错 是 否保存信息 否 是 退出系统 结束 图3-1 程序流程图 (三)数据库逻辑结构设计及函数功能表根据实体间联系模型的需求分析,本系统需要设计工资管理,考勤管理,员工信息3个表来管理员工数据.具体数据表的设计如下面的表格所示。
表3▪1 工资管理表字段名数据类型长度是否为空说明gzidVarchar10Not null工号gznameVarchar8Not null姓名dixinMoney8Not null底薪fangtieMoney8null房贴jiaotongfeiMoney8null交通费fangzuMoney8null房租huifeiMoney8null会费suodeshuiMoney8null所得税 表3▪2 员工档案信息表 字段名数据类型长度是否为空说明ygidVarchar10Not null工号ygnameVarchar20Not null姓名namechar20Not null管理员用户名passwordchar8Not null密码 表3▪3 函数功能表Add()添加信息Delete()删除信息Search(char nu[])根据职工号查找ReadFile()从文件中读取信息WriteFile()向文件中写入信息Display()在屏幕中输出全部信息Print()输出表头Print2()按月份输出所有职工的工资信息Print1(char nu[])按职工编号输出所有职工的工资信息,带有返回值Change()修改信息 四、系统详细设计与模块的具体实现(一)系统的主界面 在登陆主界面之前,首先登记用户管理窗体: 用户登陆用户名及密码正确进入主界面非法用户重新输入退出 否 是 是 否 图4-1 登陆流程图 图4-2 管理员登陆界面(二)员工信息管理模块登入后界面如图: 图4—3 主菜单图 可以选择0-—9并Enter来进行操作;选择1可以进行添加职工信息,输入职工编号和姓名来编入职工。
如果输入的职工编号重复,则不能输入该信息,如图: 图4—4 员工重复效果图 选择2可以查看所有职工的信息和编号 选择3可以删除职工信息三)员工工资管理模块 选择4可以添加工资信息.如图: 图4—5 工资信息输入图 依次输入编号,月份,基本工资,津贴,房贴,交通费,房租和会费,Enter后可以添加信息了选择7就可以查看刚刚输入的工资信息了,如图;实际发放工资也计算显示了: 图4-6 职工工资图 选择5可以修改信息,比如基础工资,津贴,房贴等数据的改动都可以修改 选择6则可以删除工资信息,可以选择某个月份,删除该月的工资信息 选择8则是输出显示某个月的全部职工工资信息,如图: 图4-7工资信息输出图 (四)保存退出和软件测试 选择9可以保存信息,刚添加的信息需要保存,如果不保存,则退出系统后该信息就会消失选择0则是退出系统 图4-8 退出系统图4.4。
1 确认测试确认测试是根据软件需求说明书中定义的全部功能、性能要求以及确认测试计划来测试整个软件系统是否达到了要求,确认测试是软件产品实际应用之前一道完整又系统的检验,是软件质量保证的最后一个环节.42测试结果分析测试结果表明,由测试用例基本上能产生预期的结果,本系统具有很好的抗错能力由于在设计过程中对数据的输入都进行了合法性检查,从而保证的数据的正确性对于在测试过程中发现的错误,通过利用归纳、演绎和回朔等技术有效地排除了错误,从根本上保证了系统的质量五、心得与体会经过四周的C++课程实践,我对C++语言设计有了一个更深,更全面的了解,尤其体会到了C++面向对象操作对简化程序的重要作用.下面是我的几点体会:①刚拿到课题时,我一脸的茫然,看到如此庞大的工程,不知如何下手.这个工资管理系统中职工子信息竟然包含15条,以前从来没有遇到过如此多的变量.和同学讨论很久好,我发现其实可以化繁为简的,信息中15条不一定全都要,因为其中本身就有重复的,例如津贴和补贴并且可以有一个pay的数组来处理数据所以做任何事情都必须要开动脑筋,积极思考,有时还要学会化繁为简②在编程时条理清晰是至关重要的主函数,函数,成员函数之间的层次关系,调用关系一定要有一个全面的把握,尤其要体会类的封装性。
另外很重要的一点就是一定要对链表的五种操作熟练的掌握③在编译,链接,调试的过程中一定要有耐心因为一个程序中会有很多小的错误,甚至有的问题要几个小时才能解决遇到问题,一定要全面分析,有时候还要向同学请教总得来说,编程时极需要耐心的还有程序里虽然可以运行了,但是应该有的功能也没有,比如说输入职工信息时,输入的职工工号和原来储存的信息里有的工号不能重复,避免输入错误,照成不必要的损失.总之,C++课程设计实践为我们提供了一个综合运用所学知识,解决实际问题的平台,增强了我们实践动手的能力和工程实践能力,并且锻炼和培养了我们的自学能力,让我们对C++有了一个更全面的了解附录1 参考文献谭浩强编著,C++程序设计,清华大学出版社,2004陈文宇,张松梅编著,C++语言教程,电子科技大学出版社,2004附录2 程序清单源代码如下:#include #include 〈conioh>#include〈fstream>#includeusing namespace std;class GZ;struct zhigong{char number[10];char name[15];};struct Zhigong{zhigong zg;Zhigong *next;};class ZG//定义一个职工类{Zhigong *head; //头指针Zhigong *p; //当前指针public:ZG(){head=p=NULL;} ; void Add(); void Delete(); //删除职工 int Search(char nu[]); //根据职工号查找 void ReadFile(); //从文件中读取职工信息 void WriteFile(); //向文件写入职工信息 void Display(); //在屏幕中输出全部职工信息 void Print(char nu[]); void Print(); friend class GZ;};void ZG::Add(){p=new Zhigong;cout〈〈” \t 请输入职工编号:";cin>>p->zg.number;if(Search(p—〉zg.number)==0){cout〈<” \t 请输入职工姓名:”;cin〉〉p—〉zg。
name; p-〉next=head; //头插入建链表 head=p; cout〈〈endl;}elsecout〈<”\n\t已经存在该职工,不能重复添加!"<〈endl;}////////////////////////void ZG::Delete(){if(head!=NULL) {int n=0; Zhigong *q=head;Zhigong *q1=head,*q2=head-〉next ; char gh[10]; cout〈<" \t 请输入您要删除的职工编号:"; cin>〉gh; while(q!=NULL) {n++; if(strcmp(q—〉zgnumber ,gh)==0) break; q=q—>next; } if(q==NULL)cout〈<”不存在该职工!”〈next; } if(q2==NULL) q1=NULL; else q1—>next=q2->next; } cout〈〈”删除成功!”<zg。
number,nu)==0) break; q=q-〉next; }if(q==NULL)return 0;else return 1;}///////////////////void ZG::ReadFile(){p=new Zhigong; ifstream fip("职工信息dat",ios::in|ios::binary); if(!fip)cout<〈”未创建该文件!"〈zg ,sizeof(p-〉zg))) { p—>next=head; head=p; p=new Zhigong; } fip.close(); delete p;}////////////////////void ZG::WriteFile() {Zhigong *s=head; ofstream fop; fop.open(”职工信息.dat",ios::binary|ios::trunc); if(!fop) { cout〈<"职工信息.dat 无法打开!”〈
close();} ///////////////////void ZG::Print(){cout〈〈”\t\t”<zg.number,nu)==0) break; q=q-〉next; } if(q!=NULL) { Print();cout〈〈”\t\t”〈zgname〈〈endl; } else cout<〈"职工不存在”〈〈endl;}/////////////////////////////void ZG::Display() { if(head==NULL) cout<〈"没有职工信息!\n\n”; else {Zhigong *k=head; Print(); while(k) { cout<<"\t\t"<〈setiosflags(ios::left)<zg。
name〈〈endl; k=k-〉next; } }}/////////////////////////////////////////////////////////struct gongzi{char month[7];char num[10];float dixin;float jintie;float fangtie;float jiaotongfei;float fangzhu;float huifei;float yingfa;float suodesui;float yingkou;float shifa;};struct Gongzi{gongzi gz;Gongzi *next;};class GZ//定义一个职工类{Gongzi *head; //头指针Gongzi *p; //当前指针public:GZ(){head=p=NULL;} ; void Add(); void Delete(); //删除 void Change(); void ReadFile(); //从文件中读取职工信息 void WriteFile(); //向文件写入职工信息 void Print1(); //按职工编号输出所有职工的工资信息 int Print1(char nu[]);//按职工编号输出所有职工的工资信息,带有返回值 void Print2(); //按月份输出所有职工的工资信息 void Print(); //输出表头 };void GZ::Add(){ZG A;A。
ReadFile();p=new Gongzi;cout〈<"职工编号:";cin>>p-〉gznum; if(ASearch(p—〉gznum)==1) {cout<<”月份:”;cin>〉p—〉gzmonth; cout〈〈"基本工资:”;cin>>p—〉gzdixin;cout<<"津贴:”;cin>>p—〉gz.jintie;cout〈<"房贴:”;cin〉>p->gz.fangtie ;cout〈<”交通费:”;cin>>p—〉gzjiaotongfei ;cout〈〈”房租:”;cin〉>p—>gzfangzhu;cout〈〈"会费:";cin〉>p-〉gzhuifei ;p—〉gz.yingfa=p-〉gzdixin+p—〉gz.jintie+p-〉gzfangtie+p—〉gz.jiaotongfei;if(p->gzyingfa〈=2000)p—>gz.suodesui=0;else p-〉gz.suodesui=(p->gz.yingfa—2000)*0.2;p->gzyingkou=p—>gzfangzhu+p—〉gzhuifei+p—>gzsuodesui;p-〉gz。
shifa=p—>gzyingfa-p—>gzyingkou; p—〉next=head; //头插入建链表 head=p; }else cout<〈”没有该职工,不能添加工资信息!"<〈endl;}void GZ::Print(){cout<〈setiosflags(ios::left)<nu;if(head==NULL) cout〈〈"\n\n\t\t没有工资信息!\n\n";else{p=head;while(p){ if(strcmp(p->gz.num,nu)==0)n++;p=p—〉next;}}if(n!=0){p=head;Print();while(p){ if(strcmp(p—>gz.num,nu)==0)cout〈〈setiosflags(ios::left)〈
month <〈setiosflags(ios::left)<〈setw(9)〈
gz.jintie <〈setiosflags(ios::left)<gz.jiaotongfei <gz.yingfa<〈setiosflags(ios::left)〈gzfangzhu <〈setiosflags(ios::left)〈〈setw(5)<gzhuifei <gzsuodesui <gz.yingkou <〈setiosflags(ios::left)〈gz。
shifa 〈next;}}if(n!=0){p=head;Print();while(p){ if(strcmp(p—>gz.num,nu)==0)cout〈〈setiosflags(ios::left)<gzdixin 〈〈setiosflags(ios::left)〈〈setw(5)〈gzjintie <〈setiosflags(ios::left)〈〈setw(5)〈〈p—〉gz.fangtie 〈gz.fangzhu 〈gz.huifei 〈gz.suodesui <〈setiosflags(ios::left)<
yingkou 〈next;}return 1;}else {cout<<”该职工暂时没有工资信息"<〈endl;return 0;}}/////////////////////////////////void GZ::Print2(){int n=0;char nu[10];cout<〈"\n\n\t\t请问您要输出哪个月的工资信息:";cin〉>nu;if(head==NULL)cout<<”\n\n\t\t没有工资信息!\n\n";else{p=head;while(p){ if(strcmp(p—〉gzmonth,nu)==0)n++;p=p->next;}}if(n!=0){p=head;Print();while(p){ if(strcmp(p—>gzmonth ,nu)==0)cout<〈setiosflags(ios::left)<〈setw(7)<gz.num〈
dixin 〈gzjintie 〈〈setiosflags(ios::left)〈gzfangtie <〈setiosflags(ios::left)<〈setw(7)<〈p—〉gzjiaotongfei <〈setiosflags(ios::left)<〈setw(7)<〈p—〉gzyingfa<gzfangzhu <gz.huifei <〈setiosflags(ios::left)〈gzsuodesui <gz.yingkou 〈〈setiosflags(ios::left)〈gzshifa 〈〈endl;p=p-〉next;}}else cout〈〈”该月暂时没有工资信息"<
open("工资信息.dat",ios::binary|ios::trunc); if(!fop) { cout〈<"工资信息.dat 无法打开!"〈gz ,sizeof(s->gz ))) { s=s->next; } } fop.close(); cout〈<”操作成功!”;} /////////////////////////////void GZ::ReadFile(){p=new Gongzi; ifstream fip(”工资信息.dat",ios::in|ios::binary); if(!fip)cout〈〈”未创建该文件!"<gz ,sizeof(p—〉gz ))) { p->next=head; head=p; p=new Gongzi; } fip.close(); delete p;}////////////////////////void GZ::Delete(){if(head!=NULL) {int n=0;Gongzi *q=head;Gongzi *q1=head,*q2 =head—>next; char gh[10],mon[10]; cout〈〈” 请输入您要删除的工资信息所对应的职工编号:”; cin〉〉gh;cout<〈” 请输入您要删除的工资信息的月份: ”; cin>>mon; while(q) {if(strcmp(q->gz.num,gh)==0&&strcmp(q—>gz.month ,mon)==0&&q==head) {head=head-〉next; cout〈〈”操作成功!”; break; } else if(strcmp(q-〉gz。
num,gh)==0&&strcmp(q-〉gzmonth ,mon)==0&&q!=head) {q1—>next=q; q2=q—>next; q1-〉next=q2; delete q; cout<<"操作成功!”; break; } q=q—>next; } if(q==NULL)cout<<”不存在该月工资信息!”〈〈endl;}else cout<〈”不存在职工的工资信息!"〈〈endl;}//////////////////////////////////////////////void GZ::Change(){char nu[10];char mon[10];cout<〈”请输入职工编号:";cin〉〉nu;if(Print1(nu)==1){cout〈>mon;p=head;while(p){ if(strcmp(p->gznum,nu)==0&&strcmp(p->gzmonth,mon)==0)break;p=p-〉next;}if(p!=NULL){cout<<”基本工资修改为:”;cin>〉p-〉gz。
dixin;cout<<"津贴修改为:";cin〉〉p->gz.jintie;cout<<"房贴修改为:";cin>>p—〉gzfangtie;cout〈〈"交通费修改为:”;cin>〉p-〉gzjiaotongfei ;cout〈<”房租修改为:";cin>〉p-〉gz.fangzhu;cout〈<"会费修改为:";cin〉>p—〉gz.huifei ;p—〉gzyingfa=p->gz.dixin+p—>gz.jintie+p—〉gzfangtie+p—>gz.jiaotongfei;if(p—〉gzyingfa〈=2000)p—>gz.suodesui=0;else p-〉gzsuodesui=(p->gzyingfa-2000)*02;p—〉gzyingkou=p—〉gz.fangzhu+p->gz.huifei+p-〉gzsuodesui;p->gzshifa=p—>gzyingfa—p-〉gz.yingkou;}elsecout<<"\n没有该月份的工资信息!”<
增加职工 2 查看所有职工 ※\n"〈〈"\t※ 3 删除职工 4. 增加工资信息 ※\n"<<”\t※ 5 修改工资信息 6. 删除工资信息 ※\n"〈<”\t※ 7 输出某职工工资信息 8 输出某月所有工资信息 ※\n"<〈"\t※ 9 保存信息 0 退出系统 ※\n"<<"\t※ ※\n”<<”\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n”〈〈endl; cout〈〈"\t请选择操作方式: ";P:cin>〉b; if(b>=0&&b〈=9)return b; else {cout〈〈"\t\t没有此选项,请重新输入:";goto P;}}////////////////////////////////////////////////////////////////////void tuichu()//退出系统函数{system(”cls”); cout<〈"\n\n\t\t\t感谢您的使用,再见!!\n\n"〈〈endl;getchar();exit(0);} void tishi()//一个操作结束后的提示函数{cout〈〈"\n按任意键继续.。
"<〈endl;getch();}void Pass(){ char UserName[30]; char Passward[20]; int i=0; cout〈〈"****************************************************************************\n”; cout〈〈"\n\t为保护职工工资信息,只有管理员才可以进行管理!\n"; cout<<”\n\t管理员名和登陆密码都只有4次机会,如果超过将自动退出系统!\n\n”; cout〈<”****************************************************************************\n”; cout〈〈”\n请输入管理员名():"; cin〉〉UserName; while (strcmp(UserName,”茹伟”)!=0) { if(i>=3) exit(0); //超过4次则登陆失败,退出系统 i++; cout<〈"\n管理员名无效!请重新输入:"; cin〉〉UserName; } cout〈〈”\n请输入密码():”;while((Passward[j]=getch())!=’\r’) { cout<〈"*"; j++; } Passward[j]=\0; while(strcmp(Passward,"123456”)!=0) { if(i>=3) exit(0); //超过4次则登陆失败,退出系统 i++; cout〈<”\n密码输入错误!请重新输入:"<〉Passward; } cout〈〈”\n\t\t欢迎管理员的到来!!!!!\n"〈〈endl;}//////////////////////////////主函数void main(){int b0;ZG A;GZ B;A.ReadFile();B。
ReadFile();Pass(); system(”PAUSE”);P:switch(b0=menu()){case 0:tuichu();break;case 1:system("cls");AAdd();tishi();goto P;break;case 2:system("cls");A.Display();tishi();goto P;break;case 3:system("cls”);ADelete();tishi();goto P;break;case 4:system(”cls”);BAdd();tishi();goto P;break;case 5:system(”cls”);BChange();tishi();goto P;break;case 6:system(”cls");BDelete();tishi();goto P;break;case 7:system("cls");B.Print1();tishi();goto P;break;case 8:system("cls");BPrint2();tishi();goto P;break;case 9:system(”cls”);A。
WriteFile();B.WriteFile();tishi();goto P;break; }}。