C++题目实验四.docx
- 文档编号:6274100
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:21
- 大小:20.99KB
C++题目实验四.docx
《C++题目实验四.docx》由会员分享,可在线阅读,更多相关《C++题目实验四.docx(21页珍藏版)》请在冰豆网上搜索。
C++题目实验四
HZAU-专业C++2实验4(计算机3-4班)
程序设计题
1. (10分)
栈类——类模板
题目描述
用类模板方式设计一个链栈类stack
Node
push(元素入栈)、pop(元素出栈)和stackempty(判断栈是否为空),并建立一个整数栈和一个字符栈。
template
classstack
{
};
注意:
为了能够生成结点类型不同的链式栈,结点类的设计也需要用类模板。
template
classNode
{
};
输入描述
输入整数栈的数据元素和字符栈的数据元素
输出描述
输出整数栈的数据元素出栈序列和字符栈的数据元素出栈序列
输入样例
4832
adbc
输出样例
2384
cbda
窗体底端
2. (10分)
二进制类
(1)——运算符重载
题目描述
将一个16位二进制数表示成0和1的字符序列,即用一个字符数组来存放这个二进制数。
在这个类中设置两个构造函数,一个是传递整数参数的,另一个是传递字符串参数的。
因为用户在创建对象时传递的二进制数,可能是以整数形式给出,也可能是以数字串形式给出,系统应该都能接受。
另外有一个类型转换函数int(),用来将类类型向整型转换。
两个重载运算符“+”,“-”,用来完成两个二进制数之间的加减运算。
classbinary{//定义二进制类
charbits[16];//二进制字模数组
public:
binary(char*);//字符串参数构造函数
binary(int);//整型参数构造函数
friendbinaryoperator+(binary,binary);//重载“+”
friendbinaryoperator-(binary,binary);//重载“-”
operatorint();//类类型转换函数
voidprint();
};
主函数设计如下:
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
cout< cout< cout< cout< return0; } 输入描述 无 输出描述 略 输入样例 无 输出样例 0000000000001011 0000000000011010 0000000000000100 31 21 9 -1 窗体顶端 窗体底端 3. (10分) 二进制类 (2)——运算符重载 题目描述 在上一题的基础上,将+、-运算符定义为binary类的成员函数。 并且重载运算符~、&、|,分别将二进制数按位取反、数按位与及按位或。 主函数设计如下: intmain() { binaryn1="1011"; binaryn2=int(n1)+15; binaryn3=n1-binary(7); n1.print(); n2.print(); n3.print(); binaryn4=n1&n2; binaryn5=n1|n2; binaryn6=~n1; n4.print(); n5.print(); n6.print(); return0; } 输入描述 无 输出描述 略 输入样例 无 输出样例 0000000000001011 0000000000011010 0000000000000100 0000000000001010 0000000000011011 111111*********0 窗体顶端 窗体底端 4. (10分) 图形类——继承和派生 题目描述 定义一个图形类,其中有保护类型的成员数据: 高度和宽度,一个公有的构造函数。 由该图形类建立两个派生类: 矩形类和等腰三角形类。 在每个派生类中都包含一个函数Area(),分别用来计算矩形和等腰三角形的面积。 提示: classpic { }; classrecg: publicpic { }; classtag: publicpic { }; 输入描述 输入矩形的长和宽以及等腰三角形的底边长和高。 输出描述 矩形的面积和等腰三角形的面积 输入样例 35 35 输出样例 15 7.5 窗体顶端 窗体底端 5. (10分) 人员管理信息系统——继承与派生 题目描述 阅读以下程序,并调试运行。 #include #include usingnamespacestd; classemployee { protected: char*name; //姓名 intindividualEmpNo; //个人编号 intgrade; //级别 floataccumPay; //月薪总额 staticintemployeeNo; //本公司职员编号目前最大值 public: employee(); //构造函数 ~employee(); //析构函数 voidpay(); //汁算月薪函数 voidpromote(int); //升级函数 voiddisplayStatus(); //显示人员信息 }; classtechnician: publicemployee //兼职技术人员类 { private: floathourlyRate; //每小时酬金 intworkHours; //当月工作时数 public: technician(); //构造函数 voidpay(); //计算月薪函数 voiddisplayStatus(); //显示人员信息 }; classsalesman: virtualpublicemployee //兼职推销员类 { protected: floatCommRate; //按销售额提取酬金的百分比 floatsales; //当月销售额 public: salesman(); //构造函数 voidpay(); //计算月薪函数 voiddisplayStatus(); //显示人员信息 }; classmanager: virtualpublicemployee //经理类 { protected: floatmonthlyPay; //固定月薪数 public: manager(); //构造函数 voidpay(); //计算月薪函数 voiddisplayStatus(); //显示人员信息 }; classsalesmanager: publicmanager,publicsalesman //销售经理类 { public: salesmanager(); //构造函数 voidpay(); //计算月薪函数 voiddisplayStatus(); //显示人员信息 }; intemployee: : employeeNo=1000; //员工编号基数为1000 employee: : employee() { charnamestr[50]; //输入雇员姓名时首先临时存放在namestr中 cout<<"请输入下一个雇员的姓名: "; cin>>namestr; name=newchar[strlen(namestr)+1]; //动态申请用于存放姓名的内存空间 strcpy(name,namestr); //将临时存放的姓名复制到name individualEmpNo=employeeNo++; //新输入的员工,编号为目前最大编号加1 grade=1; //级别初值为1 accumPay=0.0; //月薪总额初值为0 } employee: : ~employee() { delete[]name; //在析构函数中删除为存放姓名动态分配的内存空间 } voidemployee: : pay() //计算月薪,空函数 { } voidemployee: : promote(intincrement) { grade+=increment; //升级,提升的级数由increment指定 } voidemployee: : displayStatus() //显示入员信息,空函数 { } technician: : technician() { hourlyRate=100; //每小时酬金100元 } voidtechnician: : pay() { cout<<"请输入"< "; cin>>workHours; accumPay=hourlyRate*workHours; //计算月薪,按小时计酬 cout<<"兼职技术人员"< <<"本月工资"< } voidtechnician: : displayStatus() { cout<<"兼职技术人员"< <<"级别为"< } salesman: : salesman() { CommRate=0.04; //销售提成比例4% } voidsalesman: : pay() { cout<<"请输入"< "; cin>>sales; accumPay=sales*CommRate; //月薪=销售提成 cout<<"推销员"< <<"本月工资"< } voidsalesman: : displayStatus() { cout<<"推销员"< <<"级别为"< } manager: : manager() { monthlyPay=8000; //固定月薪80m元 } voidmanager: : pay() { accumPay=monthlyPay; //月薪总额即固定月薪数 cout<<"经理"< <<"本月工资"< } voidmanager: : displayStatus() { cout<<"经理"< <<"级别为"< } salesmanager: : salesmanager() { monthlyPay=5000; CommRate=0.005; } voidsalesmanager: : pay() { cout<<"请输入"< "; cin>>sales; employee: : accumPay=monthlyPay+sales*CommRate; //月薪=固定月薪+销售提成 cout<<"销售经理"< <<"本月工资"< } voidsalesmanager: : displayStatus() { cout<<"销售经理"< <<"级别为"< } intmain() { managerm1; techniciant1; salesmanagersm1; salesmans1; m1.promote(3); //经理m1提升3级 m1.pay(); m1.displayStatus(); t1.promote (2); t1.pay(); t1.displayStatus(); sm1.promote (2); sm1.pay(); sm1.displayStatus(); s1.pay(); s1.displayStatus(); return0; } 输入描述 略 输出描述 略 输入样例 wang li zhang liu 1 12 13 输出样例 请输入下一个雇员的姓名: 请输入下一个雇员的姓名: 请输入下一个雇员的姓名: 请输入下一个雇员的姓名: 经理wang编号1000本月工资8000 经理wang编号1000级别为4级,已付本月工资8000 请输入li本月的工作时数: 兼职技术人员li编号1001本月工资100 兼职技术人员li编号1001级别为3级,已付本月工资100 请输入zhang所管辖部门本月的销售总额: 销售经理zhang编号1002本月工资5000.06 销售经理zhang编号1002级别为3级,已付本月工资5000.06 请输入liu本月的销售额: 推销员liu编号1003本月工资0.52 推销员liu编号1003级别为1级,已付本月工资0.52 窗体顶端 窗体底端 6. (10分) 构造析构函数——继承 题目描述 阅读下面的程序,请编写一个简单的主函数,使其满足对应的输出要求。 #include usingnamespacestd; classCBase1 { intx; public: CBase1() {x=0;cout<<"调用构造函数CBase1()! \n";} CBase1(inta) {x=1;cout<<"调用构造函数CBase1(int)! \n";} ~CBase1(){cout<<"调用析构函数~CBase1()! \n";} }; classCBase2 { inty; public: CBase2() {y=0;cout<<"调用构造函数CBase2()! \n";} CBase2(inta) {y=a;cout<<"调用构造函数CBase2(int)! \n";} ~CBase2(){cout<<"调用析造函数~CBase2()! \n";} }; classA { intx; public: A(){x=0;cout<<"调用构造函数A()! \n";} A(inta){x=a;cout<<"调用构造函数A(int)! \n";} ~A(){cout<<"调用析构函数~A()! \n";} }; classCDerived: publicCBase1,virtualpublicCBase2 { Aa; public: CDerived() {cout<<"调用构造函数CDerived()! \n";} CDerived(intx,inty,intz): a(x),CBase1(y),CBase2(z) {cout<<"调用构造函数CDerived(int,int)! \n";} ~CDerived(){cout<<"调用析造函数~CDerived()! \n";} }; intmain() { } 输入描述 无 输出描述 略 输入样例 无 输出样例 调用构造函数CBase2()! 调用构造函数CBase1()! 调用构造函数A()! 调用构造函数CDerived()! 调用构造函数CBase2(int)! 调用构造函数CBase1(int)! 调用构造函数A(int)! 调用构造函数CDerived(int,int)! 调用析造函数~CDerived()! 调用析构函数~A()! 调用析构函数~CBase1()! 调用析造函数~CBase2()! main()函数结束! 调用析造函数~CDerived()! 调用析构函数~A()! 调用析构函数~CBase1()! 调用析造函数~CBase2()! 窗体底端 7. (10分) 水果超市管理系统—4—继承与派生 题目描述 水果超市管理系统采用面向对象的程序设计方法开发,继承机制是面向对象程序设计最重要的特征之一,在水果超市管理系统的设计过程中运用继承方法由已有类派生出新类,实现了代码重用。 水果超市的水果分为正价水果和特价水果,它们都是具体的水果,具有水果的特征和属性。 在上次实验中我们实现了水果类Fruit的定义,现在可以通过继承方法由水果类派生出“正价水果类(RegularFruit)”和“特价水果类(DiscountFruit)”。 “正价水果类”RegularFruit由“水果类”Fruit派生得来。 除了继承水果类原有的成员外,还新添加了正常售价数据成员,以及相应的构造函数和修改、提取正常售价的成员函数,并对继承自基类的显示水果信息的函数DispFruit()进行了重写。 “特价水果类”DiscountFruit由“水果类”Fruit派生得来。 特价水果类除了继承水果类原有的成员外,还新添加了原价和折扣价两个数据成员,以及相应的构造函数和显示、修改、提取折扣价的成员函数等,并对继承自基类的显示水果信息的函数DispFruit()进行了重写。 为了进行验证,设计如下主函数,在主函数部分进行验证。 intmain() { RegularFruitr1(101,"国光苹果",1.5,2.0),r2; r1.DispFruit(); r2.SetFruitName("玫瑰香葡萄"); r2.SetFruitNumber(102); r2.SetPurchasePrice(3.0); r2.SetRegularPrice(3.5); r2.DispFruit(); DiscountFruitd1(201,"巨峰葡萄",1.8,2.5,2.0),d2; d1.DispFruit(); d2.SetFruitName("黄金帅苹果"); d2.SetFruitNumber(202); d2.SetPurchasePrice(1.2); d2.SetOriginalPrice(1.8); d2.SetDiscountPrice(1.5);; d2.DispFruit(); return0; } 输入描述 略 输出描述 在主函数验证部分分别调用正价水果类重载的构造函数创建函数创建有参和无参的两个对象r1和r2,调用特价水果类重载的构造函数创建有参和无参的对象d1和d2进行验证。 派生类对象既可以调用派生类中新声明的公有成员,也可以调用从基类继承来的公有成员。 当通过派生类对象r1和r2调用DispFruit()函数时,执行的是派生类RegularFruit中重写的函数,从而可以精确输出正价水果的属性。 通过d1和d2调用DispFruit()函数时,执行的是DiscountFruit类中重写的函数,因此输出的是特价水果的属性。 输入样例 无 输出样例 正价水果编号: 101,名称: 国光苹果,售价: 2 正价水果编号: 102,名称: 玫瑰香葡萄,售价: 3.5 特价水果编号: 201,名称: 巨峰葡萄,原价: 2.5,现价: 2 特价水果编号: 202,名称: 黄金帅苹果,原价: 1.8,现价: 1.5 窗体顶端 窗体底端 8. (10分) 登山人选问题——深度优先搜索(选作题) 题目描述 攀登一座高山,假定匀速前进,从山脚登到山顶需走N天,下山也需N天。 山上没有水和食品,给养要靠登山队员携带,而每个队员所携带的给养量要少于他登顶再返回山脚所消耗的给养量。 因此,一定要组成一个登山队,在多人支持的情况下,保证有一个登顶。 现在登山俱乐部有P个人待选,我们将P个人依次编号为k=1,2,...,P,令E[k]表示编号为k的人每日消耗的给养量,M[k]表示编号为k的人最多可携带的给养量。 登山计划要求登山队所有成员同时出发,其中一些人分别在启程若干天后返回,最终保证出发N天后至少有一人登顶,出发2N天后所有人都返回山脚,无人滞留山上。 编程要求: 用键盘输入天数N(N<10)、俱乐部人数P(P<10),之后依次输入E[k]和M[k],k=1,2,...,P,分别输出两个登山组队计划。 计划1: 要求参加登山的人数最少,在满足这一条件之下消耗的总给养量最少。 计划2: 要求消耗的总给养量最少(人数不限)。 有多少队员参加登山,消耗的总给养量,在出发时每人分别携带多少给养,每人分别在出发几天后返回(几天后开始下山)。 题目数据保证有解。 输入描述 略 输出描述 计划1中由2个人组队,分别携带18和24的给养量,分别在出发6天和3天后返回。 计划2中由3个人组队,3人分别携带18、17和3的给养量,分别在出发后6天、3天和1天之后返回。 输入样例 66 122233 7817182225 输出样例 242 1824 63 338 18173 631 窗体底端 9. (10分) 三色二叉树——二叉树(选做题) 题目描述 一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”: S=0表示该树没有子节点,S=1S1表示该树有一个子节点,S1为其子树的二叉
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 题目 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)