一 实验目的及要求
1、目的:
(1)要求学生达到熟练掌握c++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及c++的编程思想来完成系统的设计;
(2)明确实训任务,复习与查阅有关资料,建立清晰的类层次,在系统中至少要定义一个类,类中要有各自的属性和方法;在系统的设计中,至少要用到面向对象的一种机制。
(3)对应用程序的要求:
a.凡等候用户输入时,给出足够的提示信息,如“请选择(1 借书 2 还书……):”提示用户选择。
b.程序具有一定的健壮性,不会因为用户的输入错误引起程序运行错误而中断执行。对输入值的类型、大小范围、字符串的长度等,进行正确性检查,对不合法的输入值给出出错信息,指出错误类型,等待重新输入
c.对删除数据应给出警告。
(3)创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改、删除、添加的功能。
(4)按要求完成实训内容,设计报告要求文字和图工整、思路清楚、正确。
(5)分组:最多3人一组,也可以1人一组,每组一名组长,小组成员分工明确(设计报告前附加人物分工说明书),由组长负责人员调度安排和工作进度控制,以及设计报告中自我评分。
二 实验步骤
1、需求分析:对用户提出的问题提出解决的办法和思路。
2、根据需求:分析系统中的各个实体之间的关系及其属性和行为,设计系统功能模块(系统流程图),并设计相应的类和界面。
3、根据基本思路:规定输入和输出,设计程序的算法。
4、确定用到的所有类的描述和定义(包括属性和方法),并设计测试程序来对类进行测试。
6、编辑、编译、调试程序,检验程序的可运行性。
三 实验内容
1、 设计内容
问题描述(功能要求)
现一高校有五类职工:教师,实验员,行政人员,教师兼职实验员,行政人员兼职教师。为了实现工资发放的自动功能,现要求编写程序来自动完成此功能。同时注意生成的相关数据结果以文件方式存放在硬盘中。程序应具备从键盘录入,文件的可继续录入,任意职工的工资查询(可由职工编号和职工姓名来实现),如若有职工由于工作调动,则可进行相对应的删除动作。
相关信息:
每一学期将学校职工的本学期任职情况及上学期工作的相关情况输入计算机,则本学期职工的月工资按程序处理后的结果发放,其中职工的工资计算方法如下:
其中工资的基本构成如下:
教师: 基本工资+课时费;
实验员: 基本工资+实验室补助;
行政人员: 基本工资+行政补贴;
教师兼职实验员: 基本工资+课时费+实验室补助;
行政人员兼职教师:基本工资+行政补贴+课时费;
(其中:
1.课时费:教师每一学期的基本工作量为120,实验员每学期基本工作量为70,行政人员没有基本工作量,每节课时费为20元;课时费=(上学期工作量-基本工作量)*20;
注意:如果上学期基本工作量没完成,则其(上学期工作量-基本工作量)*20为负值。
2.基本工资:教师800元,实验员650元,行政人员750元。
3.行政补贴:250元。
4.实验室补助:150元。
2、算法设计与分析
2.1、主要知识点
本程序由六个文件组成分别是main.cpp、Person.h、Teacher.h、Assitant.h、manatant.h、Teacher_ Assitant.h、和Teacher_ manatant.h,main.cpp中定义了程序所需要的全局函数,以及要用到的标准头文件。用到的知识主要有类的继承与派生,头文件的组织等操作,程序菜单选择和处理函数的组织和编写,文件的读写操作。
2.2、关键技术
程序中每一种数据类型用一个类来实现,共设计了6个类,人员类Person,教师类Teacher,实验员类Assitant,行政人员类manatant,教师兼实验员类Teacher_ Assitant,教师兼行政人员类Teacher_ manatant,每一种类都定义了相应的成员函数,具体的定义如下:
(1)类Person
类Person为抽象类,为另外两个类的基类,成员变量num表示职工编号,name表示
职工的姓名,duty表示职工的岗位,work表示职工上个学期的工作量,wok表示职工这个学期的工作量,salary表示职工的工资,一个person()函数用来为职工的基本信息赋值, 函数set_Salary()用来计算工资的,一个查询函数 chaxun(),他可以显示职工的信息,函数showBill(char* billname)可以显示文件的内容让我们知道该怎么操作,函数set_Age()用来给职工的年龄赋值,set_Name()用来设置职工的姓名。
(2)类Teacher
类Teacher中,在继承基类数据成员的基础上增加了函数set_Salary4()用来计算教师的工资的,成员sy表示教师的基本工资,函数Sy2()用来返回教师的基本工资,函数Salary4()输出工资。
(3)类Assitant
类Teacher中,在继承基类数据成员的基础上增加了函数set_salary3()用来计算实验员的工资的,成员sy2表示实验员的基本工资,函数Sy2()用来返回实验员的基本工资,函数Salary3()输出工资。
(4)类manatant
类manatant中,在继承基类数据成员的基础上增加了函数set_salary2()用来计算行政人员的工资的,成员sy1表示行政人员的基本工资,函数Sy2()用来返回行政人员的基本工资,函数Salary2()输出工资。
(5)类Teacher_Assitant
类Teacher_Assitant中,在继承基类数据成员的基础上增加了函数set_Salary5()用来计算教师兼实验员的工资的,成员sy4表示教师兼实验员的基本工资,函数Sy2()用来返回教师兼实验员的基本工资,函数Salary5()输出工资。
(6)类Teacher_manatant
类Teacher_Assitant中,在继承基类数据成员的基础上增加了函数set_Salary4()用来计算教师兼行政人员的工资的,成员sy3表示教师兼行政人员的基本工资,函数Sy2()用来返回教师兼行政人员的基本工资,函数Salary5()输出工资。
(7)程序的主要功能函数及相关算法
本程序共定义了6个类,分别是personnel类、teacher类、manatant类、asiitant类,人员类派生出行政人员类、实验员类和教师类,而且人员类是行政人员类、实验员类和教师类的公共基类,用到的知识主要有类的继承与派生。
manager 函数是用来选择相应的功能来调用不同的函数,分别是gaimi函数,chaxun函数,input函数等。
Input函数的功能是用来执行管理员的操作,他会根据管理员不同的操作而调用不同的函数,调用的函数有input1函数、input2函数、input3函数。
chaxun函数的功能用来查询职工的信息;
showBill函数用来把文件中的信息显示出来;
input2函数的功能是删除职工的信息,他是根据用户输入的编号或名字来删除指定的职工;
input1函数的功能是录入职工的信息,该函数需要用户选择职工的类型,在输入要录入的人数,然后在输入职工的信息。
input3的功能的是修改职工的信息,他是根据用户输入的编号或名字来删除指定的职工;
input4函数的功能是根据用户输入的姓名来显示出职工的信息。
Input5函数的功能是统计职工信息。
Xianshi函数的功能是显示职工的信息,他可以分类显示职工的信息,按工资的大小排序。
Gaimi函数的功能是管理员可以进行改密码的操作。
Save函数可以保存数据;
2.3、基本功能要求
1、主要功能
(1) 管理员可以修改管理员密码,初始密码1234,改了之后下次运行就是这个了
(2) 管理员可以选择增加职工信息;
(3) 管理员可以选择修改职工信息;
(4) 管理员可以选择删除职工信息;
(5) 管理员可以查询表现优秀、表现良好、表现合格和不合格的职工;
(6) 管理员可以选择显示全部职工信息:可以选择按工资、年龄、编号,等方式排序;
(7) 管理员可以选择查询职工信息:包括每年完成的工作量,工资,年龄等;
(8) 管理员可以查询职工的数目;
(9) 用户可以通过输入账号密码来查询自己的信息;
2、功能选择可以用菜单来实现
例如:
请选择您的计算机内容
(1)数据录入
(2)查询职工信息
(3)增加职工记录
(4)删除职工信息
(5)统计职工信息
(6)显示所有信息
(7)退出系统
3、运行是给出明确的提示信息。
比如,在选择主功能菜单是选择范围是(1-7),如果用户输入的选择不在可选择项的范围内,程序会给出输入选项不在可选择的范围内的提示,并要求用户且知道输入选项在可选范围内才执行相应的功能,本程序有较友好的的用户交互界面,每进入或离开一个功能界面都有相应的提示信息,方便用户操作。
3系统总体设计
本程序的类继承关系如下
简易IU设计
详细设计及核心代码
//人员类:
class Person
{
public:
void person(string name, int age,int wok,int work1,int num);// 为职工的年龄、薪水、名字赋值,工作量,编号赋值;
void set_Age(int a); // 为职工的年龄赋值
void set_Salary(int a); //为职工的薪水赋值
void set_Name(string a); //设置职工的名字
int Age(int a); //返回职工的年龄
void set_flag() //赋值
int Flag() //返回flag
int Salary(); //返回职工的薪水
string Name(); //返回职工的名字
void showBill(char* billname)//显示billname文件内容
{
ifstream bill(billname);
char ch;
while (bill.get(ch))
cout<<ch;
cout<<endl;
bill.close();
}
void putBill(char* billname)//显示billname文件内容 **从文件中读取密码**
{
ifstream bill(billname);
char ch,num[10];
int i=0;
while (bill.get(ch))
{
num[i]=ch;
i++;
}
num[i]='\0';
sscanf(num,"%d",&psw);
cout<<endl;
bill.close();
}
string name; //职工的名字
string name1; //职工的种类
int age; //职工的年龄
int num; //编号
int work1; //上个学期的课时
int wok; //这个学期的课时
int salary; //薪水
int flag; //标记职工是否存在
}p;
//教师类
class Teacher:public Person
{
public:
void set_work(int a); //为工作量赋值
void set_salary1(int a,int b); //算出总工资
int Salary1(); //返回总工资
int Sy(); // 返回教师的基本工资
int salary1; //总工资
int sy; //教师的基本工资
};
Teacher *a=new Teacher[10000];
//行政人员类
class Manager:public Person
{
public:
void set_salary2(int a); //算出总工资
int Salary2(); //返回总工资
int Sy1(); //返回基本工资
int salary2; //总工资
int sy1; //基本工资
};
Manager *b=new Manager[10000];
//实验员类
class Assitant:public Person
{
public:
void set_salary3(int a,int b); //算出总工资
int Salary3(); //返回总工资
int Sy2(); //返回基本工资
int salary3; //总工资
int sy2; //基本工资
};
Assitant *c=new Assitant[10000];
//教师和实验员类
class Teacher_Assitant:public Person
{
public:
void set_Salary5(int a,int b); int Salary5(); //返回教师和实验员的总工资
int Sy4(); //返回教师和实验员的基本工资
int salary5;
};
Teacher_Assitant *d=new Teacher_Assitant[10000];
//教师和行政人员类
class Teacher_Manager:public Person
{
public:
void set_Salary4(int a,int b);int Salary4(); //返回教师和行政人员的总工资
int Sy3(); //返回教师和行政人员的基本工资
//private:
int salary4;
};
Teacher_Manager *z=new Teacher_Manager[10000];
void gaimi(); //函数的作用是用来改密码且存在文件中
int set_psw(int psw); //验证密码函数
void manager(); //进行管理员有关的操作
void input1(); //增加职工的信息
void input2(); //删除职工的信息
void input3(); //改动职工的信息
void chaxun() //查询职工的信息
int main()
{
int i;
p.putBill ("2.txt"); //读入密码
do
{
cls();
save(); //保存数据
p.showBill ("1.txt"); //显示主界面
cin>>i;
switch (i)
{
case 1:{
int count=0;
while (set_psw(psw)!=1)
{
cout<<"密码错误!\n";
count++;
if (count==3) break;//密码输入错误超过三次,退出
}
if (count!=3) {cls();manager();}//管理员进入
break;}
case:yonhu(); //用户进入
beak;
case 3:
cls();
p.showBill ("8.txt"); //显示****欢迎使用*****
break;
default:
break;
}
}while(i!=3);
return 0;
}
4.实验结果
选1
选1
选1
选2
选1
程序运行正常;
5. 实验总结分析
在做这个高校工资管理系统过程中,深刻地体会到了自学能力的重要性。毕竟在学校课堂学到的知识是有限的,而且以前的知识也有些不记得了,这样做既能有效的复习了以前的知识,还能体会到乐趣,而在做的过程中仅凭原有的一点点知识是远远不够的,只有翻阅大量的资料才能学到更多的知识,才能实现其预期的功能。在做的过程中,遇到困难是在所难免的,期间和同学进行交流,从中明白了很多。做一个系统,恒心和毅力也是不可缺少的,如果一遇到难题就心慌,想要放弃,那这样就不可能完成系统。同样,在开发过程当中,细心也是非常重要的,由于很多事项都要很注意才行,如果没有做到这一点,就会出错。在开发过程当中,我学到很多,明白了做任何事情都要有始有终,要敢于同困难作斗争,要养成独立思考的习惯。在以后的工作和生活当中,我将继续发扬这些好风。
对于此程序,其设计风格与思路在例题基础上继承并加以创造及改变。采用原例题的运用格式与编写语音,给于我们一条清晰的思路,使得程序在编写过程简单化。即使如此,编写此程序也是一种挑战。一旦程序报错,必将花时间去查找。时间一久,便容易引起情绪波动。因此写此程序务必仔细。同时在巩固C++所学的类与对象。通过对此次程序的编写,开阔了对程序的认知,不再对现存的软件感到遥不可及。
优点 | 1、管理员可以多次修改管理员密码,改了之后下次运行就是这个了 2、管理员可以多次增加职工信息; 3、管理员可以多次修改职工信息,输入名字或编号后就会显示出你原来的信息,在把你要修改的信息书进去; 4、管理员可以多次删除职工信息输入名字或编号后就会显示出你原来的信息,提示你是否删除避免手误等一切错误导致误删; 5、管理员可以多次查询表现优秀、表现良好、表现合格和不合格的职工; 6、管理员可以多次显示全部职工信息:可以选择按工资、年龄、编号,等方式排序; 7、管理员可以选择查询职工信息:包括每年完成的工作量,工资,年龄等; 8、管理员可以选择显示各类职工的排名; 9、管理员可以多次查询各类职工和总职工的数目; 10、用户可以通过输入账号密码来查询自己的信息;
|
缺点 | 1、 提示输入数字后如果你误输了字符等不是数字的字符,程序运行的字幕就会不停的跳,不能进行任何操作。 2、 管理员进行增加职工的时候只能先选择增加什么职工才能进行操作。 3、 管理员不能知道工资在什么范围分别有哪些职工。 |