版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、题 目 C+ 面向对象程序设计课程设计清单:5小题+职工工资管理系统(类、链表实现)姓 名:学号:专 业:计算机科学与技术学院:指导教师:2018年6月17日Part 1:小程序练习1类的继承定义一个point类,包含私有数据成员x, y,成员函数包括无参构造函数,带参构造函数,set和get属性函数。定义circle 类,从point类公有派生,增加数据成员半径r,成员函数包括无参构造函数,带参构造函数,计算面积函数getarea。在main函数中定义一个circle的对象,并计算其面积。/*1 .定义Point类,设置其成员函数(构造函数,拷贝构造函数和析构函数)以及 setx() set
2、y() getx() gety()四个属性函数。2 定义circle 类,设置其成员函数(构造函数,拷贝构造函数和析构函数)以及获取半径r的函数get_r() 计算面积并获取面积的函数getarea()。3 在主函数中定义类的对象c1并初始化r=2。再调用getarea()函数输出面积*/#include using namespace std; class pointpublic:point() point(int x, int y) void set_x(int x)this-x = x;/定义 point 类int get_x() _return x;void set_y(int y)t
3、his-y = y;int get_y() return y;private:/私有对象x yint x;int y;class circle :public point/circle 类 公 有 派 生pointpublic:circle() circle(double r,int x,int y):point(x,y)this-r = r;double get_r()return r;double getarea()运行结果分析:return(3.14*r*r);private:int r; /circle 私 有对象 r;int main()circle c1(2,3,6);coutr=
4、c1.get_r()endl;cout 该圆面积 =c1.getarea() ,功能。在 main 函数里测试该类。/*1. 定义 counter 类,私有成员数据 weight ,设置其成员函数 (构造函数和析构函数)2. 重载自加自减运算符和 运算符。3. 在主函数中实现运算符重载。4. 友元函数需要声明。*/#include#includeusing namespace std; class counter;istream& operator(istream& is,counter& a);ostream& operator(istream& is,counter&a);/声明友元,重载
5、输入运算符 friend ostream& operator(istream&/ 运算符 重载实现ina.P;前置+重载后置+重载前置 - 重载后置-in,counter& a)if(!in)counter c1(236),c2(632); coutc1=c1endlc2=c2endl cout+c1=+c1endl;/ 测试 coutc1+=c1+endl; coutc2-=c2-endl; cout-c2=-c2endl; system(pause); return 0;cerr 输入错误! endl; return in;ostream& operator(ostream& out,co
6、unter& a) / 运算符 重载实现outa.P; return out;int main()运行结果分析:定义 c1 的值为 236, c2 的值为 632;此时+C1的数值为237; C1+输出时为237,输出后为238;此时 c2- 输出时为 632; -c2 输出时为 630,输出后为 630;3 虚函数和抽象类定义一个抽象类shape,包括公有的计算面积 area函数,计算体积volume函数,输出基本信息函数 printinfo (三个函数均为纯虚函数) 。从 shape 公有派 生 point 类,增加私有数据成员 x,y 坐标, 以及构造函数, 析构函数。从 point 公
7、有派生 CirCle 类,增加私有数据成员半径 r ,以及构造函数,析构函数。从 circle公有派生cylinder类,增加私有数据成员高度 h,以及构造函数,析构 函数。(在定义三个派生类的过程中, 自己考虑需要重定义哪个虚函数) 。在 main函数中,定义 shape 类的指针, 指向派生类的对象, 输出三类对象的基本信息, 面积,体积;(将 shape 指针改为引用再尝试) 。/*1. 先定义基类shape。设置三个纯虚函数并且声明:声明计 算面积纯虚函数 area() ;声明计算体积纯虚函数 volume() ; 声明输出基本信息纯虚函数 printinfo() ;2 .定义类poi
8、nt共有继承自类shape。并且在该类中实现三 个纯虚函数。3定义类 circle 共有继承自类 point 。并且在该类中实现三 个纯虚函数。4定义类 cylinder 共有继承自类 circle 。并且在该类中实 现三个纯虚函数。5在主函数中分别创建类 point 的对象 a,circle 的对象 b,cylinder的对象c,并初始化;6在主函数中分别定义 shape 类的指针和引用,调用 printinfo() 函数。*/#include #include #define Pi 3.141516using namespace std;class shapepublic:virtual
9、double area() = 0; 面积,体积,基本输出virtual double volume() = 0; virtual void printinfo () = 0;class point :public shapepoint 类;点并没有体积面积,所以只写 public:point() point(double x, double y)this-x = x; this-y = y;void printinfo()cout x= x ,y= y r = r;double area()return Pi*r*r;void printinfo() point:printinfo(); c
10、out 半径为 r endl;cout 圆的面积是 area() h = h;/* double area()return 2*Pi*this-r+circle:area();/ 未实现计算圆柱表面积*/ double volume()return h*circle:area();void printinfo()circle:printinfo();cout 高为 h endl;cout 圆柱的体积是 volume() endl;cylinder() private:double h;int main()cylinder temp(6, 2, 3, 3);shape *s;/ 实例化一个圆柱对
11、象s = &temp; (*s).printinfo();printf(n);cout temp 中数据构成的圆面积为 area() endl;cout 体积为 (*s).volume() endl; system(pause);return 0;4 模板编写一个使用类模板对数组进行查找、求元素和、重载下标 运算符,以及输 出的程序。1) 设计一个类模板 : 形式 1 为 templateclass Array ;形似 2 为templateclass Array ;用于对 T 类型的数组进行构造和输出;3)产生模板类2)产生模板类 Array 和 Array 进行测试;Array和 Arra
12、y 进行测试。/ 先实现第( 2)小题#include #include using namespace std;template class Array private:T* list;int size;public:Array(int size = 10); / 构造函数Array(); / 析构函数T & operator (int i); /重载 ”const T & operator (int i) const;T sum(int n);int search(T e,int n);int getSize() const;void resize(int sz);template Arr
13、ay:Array(int sz) /构造函数assert(sz = 0);size = sz;list = new T size;template Array:Array() /析构函数delete list;/ 重载下标运算符 template T &Array:operator (int n)assert(n = 0 & n size);return listn;template const T &Array:operator (int n) constassert(n = 0 & n size);return listn;/ 取当前数组的大小 template int Array:get
14、Size() constreturn size;/ 将数组大小修改为 sz template void Array:resize(int sz)assert(sz = 0);if (sz = size) return;T* newList = new T sz;int n = (sz size) ? sz : size;for (int i = 0; i n; i+)newListi = listi;delete list; / 删除原数组list = newList; /使 list 指向新数组size = sz; /更新 size template T Array:sum(int n)T
15、sum = list0;for(int i = 1; i n; i+)sum += listi; return sum;/ 查找 template int Array:search(T e, int n) for(int i = 0; i n; i+) if(listi = e) return i;return -1;int main()Array a(5);int i,n,m, count = 0;cout n;for (i = 1; i m;if (count = a.getSize() a.resize(count *2); acount+ = m;for ( i = 0; i coun
16、t; i+) cout ai;cout endl;cout 数组和为: a.sum(n)endl;cout 数 字 4 在 数 组 中 的 位 置 是 a.search(4,n)endl;/* Array 进行测试 Array a(5);int i,n,m, count = 0;cout n;for (i = 1; i m;if (count = a.getSize() a.resize(count *2); acount+ = m;for ( i = 0; i count; i+) cout setw(8) ai;cout endl;cout 数组和为: a.sum(n)endl;cout
17、数 字 4 在 数 组 中 的 位 置 是 : a.search(4,n)endl;*/return 0;/ 然后实现第( 3)小题#include #include using namespace std;template class Array private:T *list ;public:Array(); / 构造函数Array(); / 析构函数T & operator (int i); /重载 ”const T & operator (int i) const;T sum();int search(T e);template Array:Array() /构造函数list=new
18、Tn;template Array:Array() /析构函数delete list;/ 重载下标运算符 template T &Array:operator (int i)return listi;templateT Array:sum()运行结果:5 文件读写T sum = list0; for(int i = 1; i n; i+) sum += listi;return sum;/ 查找 template int Array:search(T e)for(int i = 0; i n; i+) if(listi = e) return i;return -1;int main()Arr
19、ay a;int i,n,m, count = 0;cout n;for (i = 1; i m;acount+ = m;for ( i = 0; i count; i+) cout ai;cout endl;cout 数组和为: a.sum()endl;cout 数 字 4 在 数 组 中 的 位 置 是 a.search(4)endl;/* Array 进行测试 Array a;int i,n,m, count = 0;cout n;for (i = 1; i m;if (count = a.getSize() a.resize(count *2); acount+ = m;for ( i
20、 = 0; i count; i+) cout setw(8) ai;cout endl;cout 数组和为: a.sum(n)endl;cout 数 字 4 在 数 组 中 的 位 置 是 a.search(4,n)endl;*/ return 0;定义学生类数组,有 N个人(N=5),包括姓名和语数外三名课的成绩,通过重int chinese_score;int maths_score;int english_score;int main()int i;student sN;for( i=0;isi;ofstream ofs(c:testtest.txt, ios_base:out);if
21、(!ofs)cerrfile open failedendl; exit(1);for( i=0;iN;i+)/ 这个我也不太明白 -ofs.write(reinterpret_castchar si),sizeof(student);ifstream ifs(c:testtest.txt, ios_base:out);if(!ifs)cerrfile open failedendl; exit(1);for( i=0;iN;i+) ifs.read(reinterpret_castchar si),sizeof(student);for(i=0;iN;i+) cout(&*(&载和运算符实现
22、学生数组的文件读写/*1. 定义 student 类,私有数据成员字符数组 name20 ;2. 定义运算符 重载;3. 在住函数中定义 student 类数组 sN; 并以输出和二 进制的方式打开文件*/#include #include #include #define N 5using namespace std;class student;ostream& operator (istream & is, student &s); class student/student 类:姓名 + 4 门成绩public:student() student(string name, int chi
23、nese_socre, int maths_score, int english_score)this-name = name; this-chinese_score= chinese_score; this-maths_score = maths_score; this-english_score = english_score;friend ostream& operator(ostream & os, students) / 声明友元,重写 os s.chinese_score s.maths_score s.english_score (istream & is, stu
24、dent &s)is s.chinese_score s.maths_score s.english_score;return is;private:string name;运行结果:Part 2: 小型软件的开发一、设计题目职工工资管理基本要求:定义职工( employee )类,其中至少包括姓名、性别、工号、电话、所在科室和工资。功能要求:1 、设计菜单实现功能选择;2 、输入功能:输入职工信息,并保存到文件中;3 、查询功能:1 )能够根据工号精确查询职工信息;2 )能够根据姓名、科室查询职工信息3 )分科室进行工资统计,计算各科室的平均工资4 、根据职工的工资排序输出5
25、、根据工号修改职工信息6 、根据工号删除职工信息二、运行环境Windows7x86 加 vc+6.0 (实验室)三、算法设计的思想对于整个系统的设计思路是,首先,由员工输入用户信息,包括姓名、性 别、工号、电话、所在科室和工资;然后,在计算某职工的当月工资时,系统 先从已输入的职工信息文件中获取职工信息,接着调用不同的处理程序进行计 算;最后将结果存档。因此可以设计一个基类 employee (职工),根据用户需要 employee 类应 该拥有的属性有:工号、姓名、电话、性别、科室和工资等。 Employee 类的服/ 显示格式设置/ 创建一个链表/ 释放链表空间/ 完成信息录入/ 查找满足
26、“姓名”“科室”/ 查找满足“科室”的/ 查找满足“工/ 显示职工信息/ 在标准输出设备上输出/ 修改职工信息/ 根据工号删除职工信息/ 归档操作/ 工资排序务应包括 :void Print();employee* Create(employee* Head); void Rel(employee* Head); employee* Add(employee* Head); bool Search(employee* Head);的职工信息int SearchPost(employee* Head,string post);职工信息employee* Search_Unique_Front(e
27、mployee* Head);号”的职工信息void Display_List(employee* Head); void Display_Node(employee* pNode); employee* Modify(employee* Head); employee* Del(employee* Head);void Save_ByFile(employee* Head,fstream& ofile);employee* Sort(employee* Head);四、算法的流程图开始根据菜单输入值选择程序1录入职工2修改职工3删除职工4查找职工信息5保存职工6职工工资7职工 信息按职按科工
28、号室查查找找结束五、算法设计分析1、主函数:mai n() 显示系统工作菜单,罗列该系统所有功能。先声明所有将会调用到的函数名。 再运用选择函数 switch 即可根据使用者所输入的功能代号 menu 进入对应的 功能程序。( cout 打印出相应的菜单)2、输入实现在 employee 类下创建一个带头节点的空链表employee* Head 来传递职工的所有信息。 (工号、姓名、电话、性别、科室和工资) 。在函数 employee* Add() 中通过前插法输入所有职工的信息。 用 cout 提示要输入的内容, 接着用 cin 输入相应的内容。3、信息显示声明链表指针 ptr ,其中 He
29、ad-Next 用来接收调用浏览函数时所传递过来的实 参,用设置好的输出格式( print ()、Display ()以及 while 循环,不为空 则开始打印信息。4、查询信息1)按工号查询声明链表指针ptr指向Next , cout、cin提示输入工号并赋值给 code,匹配 ptr中的m_code 显示匹配结果即可;2)按科室查询声明链表指针 ptr 指向 Next , cout 、 cin 提示输入科室并赋值给 post ,匹配 ptr中的m_post,显示匹配结果即可;3)双匹配查询声明链表指针 ptr 指向 Next , cout 、 cin 提示输入工号、 科室并赋值给 code
30、、 post,匹配 ptr 中的 m_code m_post,显示匹配结果5、修改信息通过职工的工号修改职工信息。声明链表指针ptr ,调用查找 函数Search_Unique_Front ()找到需修改的职工信息, 再次赋值即可。 需要用 cout提示要输入的内容,接着用 cin 输入相应的内容。6、删除信息 键盘输入的职工号,通过职工的工号 code 删除职工信息。链表指针匹配m_code并删除 Head-Next7、计算科室平均工资在按科室查找 SearchPost 函数中定义一个 int 类型 n (为科室人数) ,初始化为0 ;每添加一人,则sum+二ptr-m_Wage。用总的工资
31、除以总人数,算出平均工资。六、源代码 #include #include #include #include #include #include #include #include using namespace std; int n=0;class employeepublic:string m_Code; / 职工工号string m_Name;string m_phone;string m_Sex;string m_Post;/ 所在科室 unsigned int m_Average; unsigned int m_Cash; unsigned int m_Wage;/ 链表节点的指针域
32、 -employee* Next;public:void Print();employee* Create(employee* Head); / 创 建一个链表void Rel(employee* Head); employee* Add(employee* Head); bool Search(employee* Head);int SearchPost(employee* Head,string post);employee* Search_Unique_Front(employee* Head) void Display_List(employee* Head);void Display
33、_Node(employee* pNode); employee* Modify(employee* Head); employee* Del(employee* Head);void Save_ByFile(employee* Head,fstream& ofile); employee* Sort(employee* Head);employee* employee:Create(employee* Head)/ 创建一个带头节点的空链表。Head=new employee;if(!Head)cout 分配内存失败! m_Code=;Head-m_Name=;Head-m_phone=;H
34、ead-m_Sex=;Head-m_Post=;Head-m_Wage=0;Head-Next=NULL;Head-m_Average=0;Head-m_Cash=0;return Head;void employee:Rel(employee* Head)/ 释放链表。employee* ptr;/ 声明一个操作用的指针。 while(Head!=NULL)ptr=Head;Head=Head-Next;delete ptr;/ 释放节点资源。employee* employee:Add(employee* Head) /输入职工信息/ 前插法添加数据。employee* pNew;/ 声明
35、一个新节点。char again;string code,name,sex,post,phone;unsigned int wage;dopNew=new employee;/ 数据域。coutcode;coutendlname;coutendlphone;coutendlsex;coutendlpost;coutendlwage;while(cin.fail()cout 请输入正确的工资数据。 wage;coutm_Code=code;pNew-m_Name=name;pNew-m_phone=phone;pNew-m_Sex=sex;pNew-m_Post=post;pNew-m_Wage
36、=wage;/ 指针域。pNew-Next=Head-Next;Head-Next=pNew;cout 数 据 添 加 成 功 ! 是 否 继 续 添 加 ?(Y/N)again;while(again=Y|again=y); return Head;bool employee:Search(employee* Head)/ 查询同时满足 “姓名”和“科室 ”的职工信息 employee* ptr; string name,post; ptr=Head-Next;coutpost;coutendlname;coutendltt 查 询 结 果m_Name=name)&(ptr-m_Post=p
37、ost) Display_Node(ptr);/ 打印满足条件的节 点。return true; ptr=ptr-Next;/ 查询下一节点。coutn 无此职工的信息。 Next; coutcode;coutendltt 查 询 结 果m_Code=code) Display_Node(ptr); return ptr; ptr=ptr-Next;coutn 无此职工的信息。 Next; while(ptr) if(ptr-m_Post=post) sum+=ptr-m_Wage; n+; ptr=ptr-Next;cout 科室 post 里的平均工资为: sum/n endl;retur
38、n 0;void employee:Print()coutsetw(10)left 工号 ;coutsetw(10)left 姓名 ;coutsetw(18)left 电话 ;coutsetw(10)left 性别 ;coutsetw(10)left 科室 ;coutsetw(10)left 工资 Next;couttt= 所 有 职 工 信 息=Next;void employee:Display_Node(employee* pNode)/ 在标准输出设备上输出。coutsetw(10)leftm_Code setw(10)leftm_Name setw(18)leftm_phone se
39、tw(10)leftm_Sex setw(10)leftm_Postsetw(10)leftm_Wageendl;/setw(10) 表示占 10 个字符位置。employee* employee:Modify(employee* Head)/ 修改职工 信息/ 修改单一个节点。employee* ptr;ptr=Search_Unique_Front(Head);string code,name,sex,post,phone;unsigned int wage;if(ptr)couttt 你现在可以修改此职工的信息了 endl;/ 数据域。coutcode; coutendlname;coutendlphone;coutendlsex;coutendlpost;coutendlwage;while(cin.fail()cout 请输入正确的工资数据。 wage;coutm_Code=code;ptr-m_Name=name;ptr-m_phone=phone;ptr-m_Sex=sex;ptr-m_Post=post;ptr-m_Wage=wage;elsecout 没找到此职 工的记录, 无法修改 。endl;return Head;employee* employee:Del(employee* Head) / 根据工号
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论