1、中国石油大学(华东)信息与控制工程学院 《程序设计实习》报告 小型公司工资管理系统的设计与实现 专业班级:电气工程及其自动化12级1班 学 号:12053117 姓 名:XXXXX 起止日期:2013.7.22~2013。7.27 指导老师:齐玉娟 2013年7月27日 目录 一、 实习内容……………………………………………………………………… 二、 设计思路……………………………………………………………………… 三、 调试分析……………………………………………………………………… 四、 程序清单……………………………………………………………………… 五
2、 测试结果……………………………………………………………………… 六、 实习总结及心得体会………………………………………………………… 七、 程序的使用及相关说明……………………………………………………… 一、实习内容 1.1、课程设计的目的 此次课程设计的目的是以《程序设计语言(C/C++)》为基础,针对具有一定难度的综合性题目,进行分析、编程、调试和运行,进一步掌握面向对象和面向过程程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实践相结合,提高分析问题、解决问题的能力。 通过设计一个简单的《小型公司工资管理系统》,进一步熟悉C++中类的概念、类的封装、继承和多
3、态的实现方式.了解系统开发的需要分析,类层次设计,模块分析,编码测试,模块组装与整体调试的全过程,逐步熟悉程序设计的方法,并养成良好的编程习惯. 1.2、设计题目及要求 1 题目:《小型公司工资关系系统》设计 2 设计说明与要求 (1) 公司主要有4类人员:经理、技术员、销售员、销售经理。要求储存这些人的职工号姓名、月工资、年龄、性别等信息。 (2) 工资的计算方法 A、经理:固定月薪为8000元; B、技术员:工作时间×小时工资(100元每小时); C、销售员:销售额×4%提成; D、销售经理:底薪(5000元)+所辖部门销售额总额×0。5%; (3) 类的层
4、次结构大体如下: 雇员类 技术员类 销售员类 经理类 销售经理类 (4) 输入员工基本数据,要求每类人员不能少于4人,销售员工不少于8人,员工信息输出格式参考运行效果。 (5) 实现功能 应用程序中要有菜单,用于选择各种功能,其中 ① 数据输入:输入各种数据; ② 数据统计:统计各种销售经理下属销售员的销售额及限售额之和;销售经理按工资进行的冒泡排序; ③ 数据打印:打印各类员工的数据信息; ④ 数据备份:把各类员工的数据星系写入文件中保存; ⑤ 推出本系统; (6) 菜单说明
5、 ① 数据录入指通过键盘输入各类员工的各项数据; ② 数据统计指统计各销售经理下属销售员的销售额及销售额之和;销售经理按工资进行冒泡法排序; ③ 数据打印指按照表格的格式在屏幕上输出个员工的信息; ④ 数据备份指将所有员工的信息保存到文件; ⑤ 退出:结束程序的运行。 (7) 注意一个销售经理管辖多个销售员。 (8) 其他功能可以自己扩充(扩充的功能若比较合理可适当加分). (9) 要求在控制台下完成(显示内容都在黑屏下显示). 二、设计思路 1、整体考虑程序应该实现的功能,有数据输入,数据统计,数据打印,数据备
6、份和退出系统5个. 2、首先定义一个employee的雇员基类,然后由此派生出technician,manager,seller,,四个分别为技术员类,经理类,销售员类;再由manager派生出销售经理类sellmanager。每个类中的数据成员都是protected型的,所有的继承都是公有继承,基类中定义有数据输入函数. 3、程序里定义了四个对象数组,technician te[4];manager ma[4];seller se[8];sellmanager sm[4],[]中的数据代表各类成员人数。 4、整个程序由主函数的一个while循环控制,根据输入的操作选项通过一个swit
7、ch语句判断该进行什么操作,每一个case后面对应一个函数,每个函数对应一个操作,1对应数据输入,2对应数据统计,3对应数据打印,4对应数据备份,5对应退出系统. 5、数据统计、打印以及备份都以表格形式输出。表格通过制表符进行设计。表头表尾表中、菜单还有分隔符均单独定义成void 型的函数。 6、主函数中用到了两个switch语句,switch(a)控制数据的输入、数据统计、数据打印、数据备份和退出系统,而switch(b)定义在switch(a)中a=1的情况下,用于对雇员的数据进行输入。 7、在进行销售经理的数据输出时,考虑其与销售员之间所属关系,排序时通过if语句先判断所属关系,再
8、进行冒泡法排序,这是要用到双重循环。
8、考虑各种数据类型还有所需的C++内的函数,要引用〈iostream〉 9、给成员数据赋初值十分重要,在编写程序时我将employee类编成了这样class employee //雇员基类
{
protected:
string name;
int num;
int age;
char sex;
double wage;
} 结果在编译的过程中遇到了很多错误其中前几个错误如下:
C:\Users\yangkai\Desktop\C++\e。cpp(19) : error C2628: 'employee' followed by ’void' is illegal (did 10、 you forget a ’;’?)
C:\Users\yangkai\Desktop\C++\e。cpp(22) : error C2065: 'name’ : undeclared identifier
C:\Users\yangkai\Desktop\C++\e。cpp(24) : error C2065: 'sex' : undeclared identifier
大致上就是说name、sex、age、num、和wage未定义,经过思考我发现是这四个成员数据未赋初值,因此我在类中又加上了:
public:
employee()
{
name=”\0";
11、 num=0;
age=0;
sex=’\0’;
wage=0;
}
经此修改后,前面的错误果然没有了,由此我得出对成员数据赋初值是类定义的过程中必不可少的环节。
在排序的过程中我也犯了一个致命的错误,那就是将冒泡法和选择法弄混淆了。具体的程序如下:
for(int i=0;i<4;i++) 12、
{
for(int j=i+1;j<4;j++)
if(sm[i]。show_wage() 13、不符合要求的,由于没有错误提示,找起错误来相对麻烦了许多,在查找过C++课本上关于选择和排序后我才发现原来是自己在编译的过程中将两种方法混合起来了,弄清楚原因后我很容易就将错误改正了过来,再次编译后发现显示的结果符合要求了。经过这一次的分析和调试我对选择法和冒泡法有了更加深刻了解。
在编写程序备份的过程中我也犯了个原则上的错误,那就是在使用ofstream 和backup前未加上应有的头文件,结果在编译时出现了不少错误,其中第一个错误是:
C:\Users\yangkai\Desktop\C++\e.cpp(349) : error C2079: ’backup’ uses undefin 14、ed class 'basic_ofstream 15、{
protected:
string name;
int num;
int age;
char sex;
double wage;
public:
employee()
{
name=”\0";
num=0;
age=0;
sex=’\0’;
wage=0;
}
void set()
{
cout〈<”其姓名:”;
cin〉>name;
cout<〈"性别(M/W):”;
cin〉>sex;
cout〈〈"年龄:”;
cin〉〉age;
}
int show_num()
16、{
return num;
}
string show_name()
{
return name;
}
char show_sex()
{
return sex;
}
int show_age()
{
return age;
}
double show_wage()
{
return wage;
}
};
class technician:public employee //技术员派生类
{
protected:
int workhour;
public:
void set() 17、
{
cout<〈”技术员的编号:";
cin〉>num;
employee::set();
cout<<"工作时间:”;
cin〉〉workhour;
cout<〈endl;
wage=100*workhour;
}
};
technician te[4];
class manager:public employee //经理派生类
{
public:
void set()
{
cout<<”经理的编号:”;
cin〉>num;
employee::set();
cout< 18、 19、out〈〈”所属销售经理的编号:";
cin〉〉belong_to_num;
wage=amount*0。04;
cout〈〈endl;
}
int show_belong_to_num()
{
return belong_to_num;
}
double show_amount()
{
return amount;
}
void tongjishuju()
{
cout〈<"│”< 20、
}
};
seller se[8];
class sellmanager:public employee //销售经理派生类
{
protected:
int sum_amount;
public:
void set()
{
cout<〈”销售经理的编号:”;
cin〉〉num;
employee::set();
cout< 21、amount+se[i].show_amount();
}
wage=5000+sum_amount*0。005;
}
void tongjishuju()
{
cout<<”职工号为 "< 22、ger sm[4];
void line()
{
cout<<"—--——-—-—--—-——-——--—---—-——-——---—-—”<〈endl< 23、}
void shuruse() //输入销售员循环
{
for(j=0;j<8;j++)
se[j].set();
line();
}
void shurusm() //输入销售经理循环
{
for(i=0;i<4;i++)
sm[i].set();
line();
}
void mulu()
{
cout〈〈” ★★小型公司工资管理系统★★ "< 24、〈 25、
cin〉>a;
cout〈 26、经理数据输入:4,并按回车键 │”<〈endl;
cout<〈"│返回上一级: 5,并按回车键 │"〈 27、"│"〈〈setw(12)<<”职工号”〈〈”│”〈〈setw(12)〈<"姓名"<<"│"<〈setw(12)〈〈"性别”<〈”│"<〈setw(12)<〈"年龄"<<”│”<〈setw(12)<〈"工资”〈<”│"<〈endl;
}
void biaozhong()
{
cout<<”├──────┼──────┼──────┼──────┼──────┤”〈 28、
int a,b,sum;
for(a=0;a〈4;a++)
{
sum=0;
sm[a].tongjishuju();
for(b=0;b〈8;b++)
{
if(se[b].show_belong_to_num()==sm[a]。show_num())
{
cout〈〈"├──────┼──────┼──────┤”< 29、─┤”< 30、
{
for(int j=i+1;j〈4;j++)
if(sm[i]。show_wage() 31、g();
cout〈〈"│”< 32、endl<〈endl;
cout<〈"技术员"<〈endl<〈endl;
biaotou();
for(k=0;k〈4;k++)
{
biaozhong();
cout<〈”│”< 33、line();
cout〈〈"经理”<〈endl〈 34、ne();
cout〈<”销售经理"< 35、);
cout〈<”销售员"〈〈endl< 36、"〈 37、ndl;
cout〈〈”-—-—-—--—-—-————-——---—-—-—--—-—--—————-——————--”< 38、ckup〈〈"│”〈〈setw(12)<〈"职工号"〈〈"│"〈 39、]。show_sex()<<"│”〈〈setw(12)< 40、"< 41、 42、etw(12)〈〈”工资"〈<”│"< 43、}
backup<〈”└──────┴──────┴──────┴──────┴──────┘"< 44、k=0;k〈8;k++)
{
backup〈<”├────┼────┼────┼────┼────┼──────────┤"< 45、〈 46、
shuruma();
continue;
case 3:
shuruse();
continue;
case 4:
shurusm();
continue;
}
}
continue;
case 2:
tongjishuju();
continue;
case 3:
displaying();
continue;
case 4:
copy();
continue;
}
}
retur 47、n 0;
}
23
五、测试结果
六、总结及心得体会
通过对小型公司工资管理系统的C++程序编写,加强了我对C++功能的了解,对象与类之间关系的理解,同时也提高了上机实践能力,自主学习能力,错误分析能力……
实习前对实习内容进行了半天的构思自以为考虑周全了,实则不然,如老师所言,要全局考虑,而我也正因为编写前考虑不周全,在定义完类以后,很快把输入数据的函数编写出来了,上机操作也很成功。可是到统计部分还有打印和备份部分就开始发现原写的程序有许多地方需要改动,或者增添新的成员或函数,比如统计数据时需要计算销售经理的工资并且排序,这就需要定义新的数组,新的函数来判断哪些销售员属 48、于哪位销售经理,并按其工资从高到低排序。还有打印数据时需要计算各类对象的工资,就得回头重新定义一些成员函数,而且由于成员都是保护类型的,类外不能直接访问,所以需要在类中定义具有返回类中各数据功能的函数。这些都是数据输入时没有考虑到的。
所以说,全局统筹规划,有缜密的构思很重要。当然,快速接受新事物的能力也是必备的,因为备份数据在课堂上听的不是很明白,所以就需要我下课后上网百度搜索相关的资料让后再自己学习,现学现用,因此我发现自主学习能力很重要。
再者,由于程序编写过程中出现错误是常有的事,那么,分析错误的能力也就需要慢慢提高,因为错误提示都是英文,所以学好英语也很有必要。错误往往是粗心或者 49、语法不对,比如大括号少了或者多了或者放错了位置,少打分号了,输入法转换时符号输入不经意间改变了,或者一些函数没有声明,声明位置靠后了,由于程序较长,有时候搞不清在哪定义在哪调用了。有时也可能重复定义了。
但其实难改的错误并不是这些,当一个程序可以运行时,发现输出的数据存在问题这才是最头疼的,比如程序写好了,费了好大的劲叔好了相关的数据却发现得到的表格是错误的,因此我就不得不修改程序和继续输入数据,这个过程花费了我很长时间 ,但是同时也培养了我的耐心和毅力。
总体来说,在整个程序中,我们通过使用while循环,switch语句,选择排序法,表格设计中的setw()以及类的定义及使用来完成程序 50、设计,使我提高了对C++中语句的使用能力和组合能力,进一步加强了我对使用C++编程的能力.
通过这次实习,对C++进行了更如的了解,得到了宝贵的经验,许多同学都有了很大的收获,对程序的优化问题也有了一定认识。然而我写的程序不算灵活,因为人数都是固定的,如果能定义成动态的,并且设置一些查找函数,增加多级菜单,我想程序会更实用。
最后我要向与我们相处了五天的齐老师,表达我内心的感激之情,虽然以前的C++课程不是她教授我们的,但是她给我们的感觉很亲切,在我们遇到问题的时候她总是不厌其烦的给我们答疑解惑,给我们感觉是她不仅是我们的老师,更像我们的朋友。谢谢老师!
七、程序的使用说明
1、运行程






