资源描述
课 程 设 计 报 告
课程名称 面向对象程序设计
课题名称 高校工资管理系统
专 业 计算机科学与技术
班 级 计算机1181班
学 号 201113030122
姓 名 宋思达
指导教师 李珍辉 谭小兰
2012年 12 月 15 日
湖南工程学院
课 程 设 计 任 务 书
课程名称 面向对象程序设计
课 题 高校工资管理系统
专业班级 计算机1181班
学生姓名 宋思达
学 号 201113030122
指导老师 李珍辉 谭小兰
审 批
任务书下达日期 2012 年 12 月 15 日
任务完成日期 2013 年 01 月 05 日
一、设计内容与设计要求
1.课程设计目的:
面向对象程序设计课程设计是集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。要求学生达到熟练掌握C++语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。
2.课题题目
高校工资管理系统
3.设计要求:
(1)根据自己对应的课题完成以下主要工作:①完成系统需求分析:包括系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求。②完成系统总体设计:包括系统功能分析;系统功能模块划分与设计(系统功能模块图)。③完成系统详细设计:包括数据库需求分析;数据库概念结构设计(E-R图);数据库逻辑结构设计;类层次图;界面设计与各功能模块实现。④系统调试:调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。⑤使用说明书及编程体会:说明如何使用你编写的程序,详细列出每一步的操作步骤。⑥关键源程序(带注释)
(2) 按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。
(3)不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
二、进度安排
第 17 周 星期二 8:00——12:00
星期三 8:00——12:00
星期四 8:00——12:00
星期五 8:00——12:00
星期六 8:00——12:00
第 18 周 星期五 8:00——12:00
三、参考书籍
1.《C++程序设计课程设计》 刘振安编著 TP312C563
2.《C++ Builder和Delphi课程设计与系统开发案例》 伍俊良 清华大学出版社 7-302-06072-X
3.Visual C++课程设计案例精编 严华峰 中国水利水电出版社 7-5084-2007-1 2004
4.Visual C++课程设计与系统开发案例 伍俊良 清华大学出版社 7-302-05968-3 2002
5.Visual C++语言课程设计 : 案例精选与编程指导 陈清华朱红 东南大学出版社 7-81089-275-4 2003
6.VisualC++课程设计案例精编 中国水利水电出版社 7-5084-1004-1 2002
7.数据结构课程设计案例精编 : 用C/C++描述 李建学李光元吴春芳 清华大学出版社 7-302-14536-9 2007
(编程平台不限,vc++, c++ Builder等等。)
高校工资管理系统
(一)、课程设计题目:
高校工资管理系统
(二)、目的与要求:
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;
(4)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、写出设计说明书
(三)、设计方法和基本原理:
1、问题描述(功能要求):
现一高校有五类职工:教师,实验员,行政人员,教师兼职实验员,行政人员兼职教师。为了实现工资发放的自动功能,现要求编写程序来自动完成此功能。同时注意生成的相关数据结果以文件方式存放在硬盘中。程序应具备从键盘录入,文件的可继续录入,任意职工的工资查询(可由职工编号和职工姓名来实现),如若有职工由于工作调动,则可进行相对应的删除动作。
相关信息:
每一学期将学校职工的本学期任职情况及上学期工作的相关情况输入计算机,则本学期职工的月工资按程序处理后的结果发放,其中职工的工资计算方法如下:
其中工资的基本构成如下:
教师: 基本工资+课时费;
实验员: 基本工资+实验室补助;
行政人员: 基本工资+行政补贴;
教师兼职实验员: 基本工资+课时费+实验室补助;
行政人员兼职教师:基本工资+行政补贴+课时费;
(其中:
(1)课时费:教师每一学期的基本工作量为120,实验员每学期基本工作量为70,行政人员没有基本工作量,每节课时费为20元;课时费=(上学期工作量-基本工作量)*20;
注意:如果上学期基本工作量没完成,则其(上学期工作量-基本工作量)*20为负值。
(2)基本工资:教师800元,实验员650元,行政人员750元。
(3)行政补贴:250元。
(4)实验室补助:150元。
2、问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
(1)写出需求分析(做什么);
(2)分析系统中的各个实体之间的关系及其属性和行为;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述(包括属性和方法);
(5)完成类中各个成员函数的定义;
(6)用户界面的设计;
(7)分析系统功能模块(系统流程图);
(8)代码编写 ,功能调试;
(9)完成系统总结报告以及系统使用说明书。
目 录
1. 系统需求分析 3
2. 总体设计 8
3. 详细设计 12
4. 系统调试 16
5. 结果分析 19
6. 总结 20
1.系统化需求分析
随着计算机技术的飞速发展计算机在高校管理中应用的普及利用计算机实现高校人事管理势在必行。对于高校来说利用计算机支持高校高效率完成人事管理的日常事务是适应现代高校制度的要求推动高校人事管理走向科学化、规范化的必要条件计算机管理所无法比拟的优点检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大的提高人事管理的效率也是高校科学化、正规化的管理与世界接轨的重要条件,学校有对职工具体信息操作,对职工信息的查询,修改,增加和删除,工资的计算和发放需求.这个系统可以保存员工信息,根据输入的数据自动实现工资发放功能,也可以查询该职工所有信息,也可以按职工在编号或姓名来实现职工在修改,增加和删除功能,实现了任意职工的工资查询。职工信息保存在文件里,实现文件保存功能
主菜单
2.总体设计
退出程序
职工的增加和删除
职工信息查询和修改
职工工资查询
职工工资放统计和发放
职工信息录入
增加职工
新学期工资统计
工资发放
信息查询
信息修改
删除职工
3.详细设计
GUANLI
-name: string
-sex: string
-address: string
-id: string
-job: string
-number: int
-classhour: int
-newclsshour: int
-pay: int
-year: int
-month: int
-day: int
<<static>>-laoshiji: int
<<static>>-shiyanji: int
<<static>>-xingzhengji: int
<<static>>-shiyanbu: int
<<static>>-xingzhengbu: int
<<static>>-classpay: int
+GUANLI()
+outname(): string
+outsex(): string
+outaddress(): string
+outid(): string
+outjob(): string
+outnumber(): int
+outclasshour(): int
+outnewclasshour(): int
+outpay(): int
+outyear(): int
+outmonth(): int
+outday(): int
+changejob(): void
+pay(): void
+display(): void
+newpay(): void
+shanpay(): void
4. 系统调试
1.图:进入主菜单:
2.图:职工信息录入:
3.图:输入“N”回到主菜单:
3. 图:查询职工信息:
5.图:修改职工信息:
6.图:增加职工信息:
7.图:浏览职工信息:
8.图:删除职工信息:
8. 返回主菜单,退出程序。
5.结果分析
这个设计的独到指出就是,操作简单,实现方便,基本实现了员工基本资料的查询和修改,对工资的操作也很简洁方便。不足之处是挺多的功能都未实现,比如整个系统,职工资料对外都是全部开放的,任何人都可对系统进行操作,员工的资料还没进行保密和封锁工作,系统还有很多需要完善的地方,系统的实用性和灵活性都还很缺乏,不完善之处还需继续努力的修改……
6. 总结
这次的程序设计相对于上学期还是有了进步的,这次的课设中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。这次的实验给以了我警示,它让我明白我所掌握的知识还很欠缺,对于继承与派生这一章的知识,我以为自己勉强掌握了,这次实验后我发现我掌握得还不够。基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢,原先我认为是可以的,经过这次程序设计,我知道我错了。 总之,我觉得做学问不应该马虎,对于所学一定要有深入的理解,这也是我这次课设得到的启示。课程设计总体感觉就是有点小麻烦,也终于知道到当初李珍辉老师讲的C++比上学期学的C语言要难要深奥很多也难了狠多,因为C++的知识面和深度都比C大很多,学起来相对也比较吃力。而这次的课设,把我在学这门课程存在的弊端全部暴露出来了,原来对于这门课,我学到的仅仅是一些皮毛而已,在做程序的过程中,发现好多功能我都无法用我脑中的知识去实现它,必须翻开课本依葫芦画瓢才能把程序写出来,还有遇到的一些要求根本没遇到过,比如用文件保存的方式保存,这就得用到c++里的文件流来输入输出,并保存到指定的文件里,这些知识点老实虽然没讲,但是作为一个大学生,并不是老师不讲就不看的,应该自己去看,因为后边的只是点反而是最重要的,在我们班,有了好几个同学都已经把后边的知识看了几遍了,所以他们用起来就得心应手了,而我,也来不及去好好看书了,只能厚着脸皮去问他们,让他们列个模版给我,然后再由自己去想程序的具体实行部分,这直接导致的结果就是浪费了好多时间,所以我决定以后一定认真听课,坚决不旷课早退,要把这么只是彻彻底底的学好,学扎实。
附:源程序
#include <fstream.h>
#include <string.h>
class Person //人员类(抽象类)
{
protected:
double num; //编号
char Name[20]; //姓名
int Duty; //人员类别标志(1-教师,2-实验员,3-行政人员,4-教师兼实验员,5-行政兼教师)
double Salary; //基本工资
Person *next; //指针域
public:
Person() //基类构造
{
next=0; //指针域设置为空
}
virtual ~Person() //基类虚析构
{
}
virtual void Input()=0; //从键盘输入数据
virtual void Input(ifstream& ifs)=0; //从文件输入数据
virtual void Output()=0; //向屏幕输出数据
virtual void Output(ofstream& ofs)=0; //向文件输出数据
virtual double Incoming()=0; //计算收入
friend class College;
};
class Teacher:virtual public Person //教师类
{
protected:
int Hours; //教师课时
public:
//为对象设置数据分为两种途径,通过1)构造函数,2)一般成员函数
//分开可以使得程序中应用更加灵活
//本程序采用:缺省构造+Input()
Teacher() //构造函数,初始化部分数据
{
Duty=1;
Salary=800;
}
void Input() //键盘补充输入其它数据
{
cout<<"\n编号:"; cin>>num;
cout<<"\n姓名:"; cin>>Name;
cout<<"\n教师上学期课时:"; cin>>Hours;
Salary=Incoming();
}
void Input(ifstream& ifs)
{
ifs>>num>>Name>>Duty>>Hours>>Salary;
}
void Output()
{
cout<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl;
}
void Output(ofstream& ofs)
{
ofs<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl;
}
double Incoming()
{
if(Hours>120)
return Salary+(Hours-120)*20;
else
return Salary;
}
};
class Assistant:virtual public Person //实验员
{
protected:
int Allowance;
int Hours;
public:
Assistant()
{
Duty=2;
Salary=650;
Allowance=150;
}
void Input()
{
cout<<"\n编号:"; cin>>num;
cout<<"\n姓名:"; cin>>Name;
cout<<"\n实验员上学期实验课时:"; cin>>Hours;
Salary=Incoming();
}
void Input(ifstream& ifs)
{
ifs>>num>>Name>>Duty>>Hours>>Salary;
}
void Output()
{
cout<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl;
}
void Output(ofstream& ofs)
{
ofs<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl;
}
double Incoming()
{
if(Salary>70)
return Salary+Allowance+(Hours-70)*20;
else
return Salary+Allowance;
}
};
class Manager:virtual public Person //行政人员
{
protected:
int Allowance;
public:
Manager()
{
Duty=3;
Salary=750;
Allowance=250;
}
void Input()
{
cout<<"编号:"; cin>>num;
cout<<"姓名:"; cin>>Name;
Salary=Incoming();
}
void Input(ifstream& ifs)
{
ifs>>num>>Name>>Duty>>Salary;
}
void Output()
{
cout<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<"\t"<<Salary<<"\t"<<endl;
}
void Output(ofstream& ofs)
{
ofs<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Salary<<"\t"<<endl;
}
double Incoming()
{
return Salary+Allowance;
}
};
class Teacher_Assistant:public Teacher,public Assistant //教师兼实验员
{
public:
Teacher_Assistant()
{
Duty=4;
Teacher::Salary=800;
Assistant::Allowance=150;
}
void Input()
{
cout<<"\n编号:"; cin>>num;
cout<<"\n姓名:"; cin>>Name;
cout<<"\n教师上学期课时:"; cin>>Teacher::Hours;
Salary=Incoming();
}
void Input(ifstream& ifs)
{
ifs>>num>>Name>>Duty>>Teacher::Hours>>Salary;
}
void Output()
{
cout<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Teacher::Hours
<<"\t"<<Salary<<endl;
}
void Output(ofstream& ofs)
{
ofs<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Teacher::Hours<<"\t"
<<Salary<<"\t"<<endl;
}
double Incoming()
{
if(Teacher::Hours>120)
return Salary+(Teacher::Hours-120)*20
+Allowance;
else
return Salary+Allowance;
}
};
class Manager_Teacher:public Manager,public Teacher //行政人员兼教师
{
public:
Manager_Teacher()
{
Duty=5;
Manager::Salary=750;
}
void Input()
{
cout<<"\n编号:"; cin>>num;
cout<<"\n姓名:"; cin>>Name;
cout<<"\n行政人员兼职教师上学期课时:"; cin>>Hours;
Salary=Incoming();
}
void Input(ifstream& ifs)
{
ifs>>num>>Name>>Duty>>Hours>>Salary;
}
void Output()
{
cout<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl;
}
void Output(ofstream& ofs)
{
ofs<<num<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl;
}
double Incoming()
{
return Manager::Salary+Allowance+Hours*20;
}
};
class College
{
private:
Person *PL;
void Clear();
int College::Cfind(int ID,Person **p1,Person **p2);
public:
College(); //构造
~College(); //析构
void Add(); //增加职工
void Delete(); //删除职工
void Modify(); //修改职工
void Print(); //输出职工信息
void Save(); //职工信息存盘
void Load(); //职工信息装入
void Find(); //查找
void Build(); //导引
void Stat(); //统计
};
College::College() //构造函数(创建1个头结点的链表)
{
Person *p=new Teacher;
PL=p;
cout<<"自动装入数据……………………\n";
Build();
}
College::~College() //析构函数(仅保留1个头结点)
{
Person *p=PL;
while(p) //逐个删除结点,包括头结点
{
PL=p->next;
delete p;
p=PL;
}
PL=0;
}
void College::Add() //增加职工
{
char c;
do
{
cout<<"\n** 增加职工 **\n";
//查找尾结点
Person *p=PL;
while(p->next)p=p->next;
int ch;
cout<<"输入职工分类码[1-教师,2-实验员,3-行政人员,4-教师兼实验员,5-行政兼教师]:\n"; cin>>ch;
//创建新结点,录入数据,连接到链表
Teacher *pt;
Assistant *pa;
Manager *pm;
Teacher_Assistant *pta;
Manager_Teacher *pmt;
switch(ch)
{
case 1: pt=new Teacher; pt->Input();
p->next=pt;
break;
case 2: pa=new Assistant; pa->Input();
p->next=pa;
break;
case 3: pm=new Manager; pm->Input();
p->next=pm;
break;
case 4: pta=new Teacher_Assistant; pta->Input();
p->next=pta;
break;
case 5: pmt=new Manager_Teacher; pmt->Input();
p->next=pmt;
break;
default: return;
}
cout<<"是否进行循环?y/n\n";
cin>>c;
}while(c=='y'||c=='Y');
Save();
}
void College::Clear() //清除所有的职工结点(仅保留头结点)
{
Person *p=PL->next;
while(p)
{
PL->next=p->next;
delete p;
p=PL->next;
}
}
//查找
void College::Find()
{
double ID;
Person *p1;
Person *p2;
cout<<"输入你要查询的编号:";
cin>>ID;
p1=PL->next;
p2=PL;
while(p1)
{
if(p1->num==ID)
break; //找到
else
{
p2=p1; //继续查找
p1=p1->next;
}
}
if(!p1) {cout<<"找不到你所查询的人!!!\n请确认你所查询的编号是否出错!!!\n";return;}
else
{ cout<<"\n** 职工信息表 **\n";
cout<<"编号 姓名 岗位 课时 收入情况(元)\n";
p1->Output();}
}
//查找职工结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)
int College::Cfind(int ID,Person **p1,Person **p2)
{
*p1=PL->next;
*p2=PL;
while(*p1)
{
if((*p1)->num==ID)
break; //找到
else
{
*p2=*p1; //继续查找
*p1=(*p1)->next;
}
}
return *p1?1:0;
}
void College::Delete() //删除职工
{
cout<<"\n** 删除职工 **\n";
int num;
Person *p1,*p2;
cout<<"编号:"; cin>>num;
if(!Cfind(num,&p1,&p2))
{
cout<<"指定的人员没有找到!\n";
}
else
{
p2->next=p1->next; //连接
delete p1;
cout<<"正确删除!\n";
}
Save();
}
void College::Modify() //修改职工
{
cout<<"\n** 修改职工 **\n";
int num;
Person *p1,*p2;
cout<<"编号:"; cin>>num;
if(!Cfind(num,&p1,&p2))
{
cout<<"指定的人员没有找到!\n";
}
else
{
p1->Output(); //输出原来的职工信息(做提示)
p1->Input(); //输入新的职工信息(更新)
cout<<"修改完成!\n";
}
Save();
}
void College::Print() //输出职工信息
{
cout<<"\n** 职工信息表 **\n";
cout<<"编号 姓名 岗位 课时 收入情况(元)\n";
Person *p=PL->next;
if(!p)
{
cout<<"无职工记录!\n";
return;
}
while(p) //遍历链表,输出职工信息
{
p->Output();
p=p->next;
}
}
void College::Save() //职工信息存盘?
{
ofstream f("Person.dat",ios::out); //打开文件
//遍历输出至文件
Person *p=PL->next;
while(p)
{
p->Output(f);
p=p->next;
}
f.close(); //关闭文件
cout<<"职工信息已经保存在Person.dat.\n";
}
void College::Build() //职工信息
{
char buf[81]; //临时空间
int Duty; //人员类型
Person *p2; //新建结点的指针
long t; //读写位置
//清除现有结点(保留头结点)
Clear();
//打开文件
ifstream f("Person.dat",ios::in);
//建立结点,读数据
Person *p=PL; //尾结点指针
while(1)
{
//读取人员类型
t=f.tellg();
f>>buf>>buf>>Duty;
if(f)
{
//根据人员类型创建新结点
switch(Duty)
{
case 1: p2=new Teacher; break;
case 2: p2=new Assistant; break;
case 3: p2=new Manager; break;
case 4: p2=new Teacher_Assistant; break;
case 5: p2=new Manager_Teacher; break;
default: f.close(); return;
}
p->next=p2;
p=p->next;
f.seekg(t);
p->Input(f);
}
else
break;
}
//关闭文件
f.close();
}
void College::Load() //职工信息录入
{
char ah;
int c;
cout<<"\n** 职工信息录入 **\n";
do
{
cout<<"输入要录入的职工个数:\n";
cin>>c;
for(int i=1;i<=c;i++)
{
//查找尾结点
Person *p=PL;
while(p->next)p=p->next;
int ch;
cout<<"输入职工分类码[1-教师,2-实验员,3-行政人员,4-教师兼实验员,5-行政兼教师]:"; cin>>ch;
//创建新结点,录入数据,连接到链表
Teacher *pt;
Assistant *pa;
Manager *pm;
Teacher_Assistant
展开阅读全文