【C++】C++面向对象练习题

利用多态机制完成以下题目

现需要一个理财程序,其中包含四个类,分别为投资(Investment)、储蓄(Saving)、基金(Fund)和理财人(Person),储蓄和基金为两种具体投资,都有确定的投资金额(m_capital),但它们年底结算(setrle)的方式不同。储蓄的结算方式如下:

m_capital = m_capital * (1+1.78/100);

基金的结算方式如下:

m_capital =m_capital * (rand()%20 +90)/100;

理财人实例化时确定本金m_cashFlow。理财人通过其成员函数addInvest 添加具体投资,将新建的投资类实例的地址保存在vector 类型的成员mv_invests中,并从本金中减去投资额。一年后,理财人通过其成员函数settle结算所有投资,将投资额返回本金。实现效果如下:

//初始本金十万元

Person Wang(100000);

//储蓄、基金分别投资五万、两万

Wang.addInvest(Saving(50000));

Wang.addInvest (Fund(20000));

//年底全部结算转入本金

cout<<Wang.settle()<<endl;

请据此给出投资、储蓄、基金、理财人这四个类的定义,并利用上述代码进行测试。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>// 投资基类
class Investment {
public:// 构造函数,初始化投资金额Investment(double capital) : m_capital(capital) {}// 获取投资金额的方法,声明为 const,不改变对象状态double getCapital() const {return m_capital;}// 纯虚函数,用于派生类实现投资结算逻辑virtual double settle() = 0;protected:double m_capital; // 投资金额
};// 储蓄类,继承自投资基类
class Saving : public Investment {
public:// 构造函数,调用基类构造函数初始化投资金额Saving(double capital) : Investment(capital) {}// 实现投资结算逻辑double settle() override {m_capital *= (1 + 1.78 / 100); // 年底结算方式:本金增加 1.78%return m_capital; // 返回年底结算后的本金}
};// 基金类,继承自投资基类
class Fund : public Investment {
public:// 构造函数,调用基类构造函数初始化投资金额Fund(double capital) : Investment(capital) {}// 实现投资结算逻辑double settle() override {m_capital *= (rand() % 20 + 90) / 100.0; // 年底结算方式:本金按 90%~109% 之间的随机比例变动return m_capital; // 返回年底结算后的本金}
};// 理财人类
class Person {
public:// 构造函数,初始化理财人本金Person(double cashFlow) : m_cashFlow(cashFlow) {}// 添加投资,将投资金额从本金中扣除,并保存投资对象的指针void addInvest(Investment* invest) {m_cashFlow -= invest->getCapital(); // 本金减去投资金额mv_invests.push_back(invest); // 将投资对象指针保存到投资对象容器中}// 年底结算,对所有投资进行结算,并将结算后的金额返回到本金中double settle() {double totalCapital = 0; // 总投资金额// 遍历所有投资对象,进行结算for (auto& invest : mv_invests) {totalCapital += invest->settle(); // 累加所有投资的结算金额}m_cashFlow += totalCapital; // 将结算后的金额追加到本金中return m_cashFlow; // 返回年底结算后的本金}// 公有接口,用于获取投资对象容器const std::vector<Investment*>& getInvests() const {return mv_invests; // 返回投资对象容器}private:double m_cashFlow; // 理财人的本金std::vector<Investment*> mv_invests; // 投资对象容器
};int main() {srand(time(nullptr)); // 初始化随机数种子Person Wang(100000); // 创建一个理财人对象,初始本金为 100000Wang.addInvest(new Saving(50000)); // 添加一个储蓄投资,投资金额为 50000Wang.addInvest(new Fund(20000)); // 添加一个基金投资,投资金额为 20000std::cout << "年底结算后的本金:" << Wang.settle() << std::endl; // 输出年底结算后的本金// 释放动态分配的内存for (auto& invest : Wang.getInvests()) {delete invest;}return 0;
}

已知Point类和LineString折线类定义如下,请写出LineString类的各个成员函数的实现。

class Point { public:double x, y; };

class LineString {//由多个点组成的线串类,由n个点组成的折线包含n-1个线段

public:

LineString(Point* pnts, int num); //构造函数,通过传入点数组来构造

LineString(const LineString& another); //复制构造函数

~LineString();//析构函数

LineString& operator=(const LineString& rhs);//赋值函数

Point& operator[](int index);//返回线串中第index个点的引用

private:

Point* m_data;//用于保存组成线串的点

int m_num;// 线串中点的数量

};

#include <iostream>
#include <cassert> // 引入 assert 头文件以使用断言using namespace std;// 定义点类
class Point {
public:double x, y;// 默认构造函数Point() : x(0), y(0) {}// 带参构造函数Point(double _x, double _y) : x(_x), y(_y) {}
};// 定义线串类
class LineString {
public:// 默认构造函数LineString() : m_data(nullptr), m_num(0) {}// 构造函数,通过传入点数组来构造线串LineString(Point* pnts, int num) {m_num = num; // 设置线串中点的数量m_data = new Point[num]; // 分配动态内存用于存储点数组for (int i = 0; i < num; ++i) {m_data[i] = pnts[i]; // 复制传入的点数组到线串的内部存储中}}// 复制构造函数,用于创建新线串对象时复制另一个线串对象的内容LineString(const LineString& another) {m_num = another.m_num; // 复制另一个线串对象中的点数量m_data = new Point[m_num]; // 分配动态内存用于存储新线串对象的点数组for (int i = 0; i < m_num; ++i) {m_data[i] = another.m_data[i]; // 复制另一个线串对象的点数组到新线串对象的内部存储中}}// 析构函数,用于释放线串对象的动态内存~LineString() {delete[] m_data;}// 赋值函数,用于将一个线串对象赋值给另一个线串对象LineString& operator=(const LineString& rhs) {if (this == &rhs) return *this; // 检查自赋值情况delete[] m_data; // 释放原有的动态内存m_num = rhs.m_num; // 复制另一个线串对象的点数量m_data = new Point[m_num]; // 分配动态内存用于存储新线串对象的点数组for (int i = 0; i < m_num; ++i) {m_data[i] = rhs.m_data[i]; // 复制另一个线串对象的点数组到新线串对象的内部存储中}return *this;}// 重载下标运算符,用于访问线串对象中的点数组中的某个点Point& operator[](int index) {assert(index >= 0 && index < m_num); // 使用断言确保索引合法return m_data[index];}private:Point* m_data; // 用于保存线串对象中的点数组int m_num; // 线串中点的数量
};int main() {// 创建一些点对象Point p1(1.0, 1.0);Point p2(2.0, 2.0);Point p3(3.0, 3.0);// 创建一个点数组Point pnts[] = { p1, p2, p3 };// 使用点数组构造一个线串对象LineString ls(pnts, 3);// 测试复制构造函数,将已有的线串对象复制给新线串对象LineString ls_copy = ls;// 测试赋值函数,将已有的线串对象赋值给另一个线串对象LineString ls_assigned;ls_assigned = ls;// 输出线串对象中各个点的坐标for (int i = 0; i < 3; ++i) {cout << "Point " << i + 1 << ": (" << ls[i].x << ", " << ls[i].y << ")" << endl;}return 0;
}

已知String类定义如下:

class String

{

public:

String(const char*str=NULL);//通用拷贝函数

String(const String&another);//拷贝构造函数

~String();//析构函数

String &operator=(const String&rhs);//赋值函数

operator const char *();//强制转换

private:

char *m_data;//用于保存字符串

};

请写出String类的各个成员函数的实现

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)class String
{
public:String(const char* str = nullptr); // 通用拷贝函数String(const String& another);     // 拷贝构造函数~String();                         // 析构函数String& operator=(const String& rhs); // 赋值函数operator const char* ();            // 强制转换private:char* m_data; // 用于保存字符串  
};String::String(const char* str) {if (str == nullptr) {m_data = new char[1];*m_data = '\0';}else {m_data = new char[strlen(str) + 1];strcpy(m_data, str);}
}String::String(const String& another) {m_data = new char[strlen(another.m_data) + 1];strcpy(m_data, another.m_data);
}String::~String() {delete[] m_data;
}String& String::operator=(const String& rhs) {if (this != &rhs) {delete[] m_data;m_data = new char[strlen(rhs.m_data) + 1];strcpy(m_data, rhs.m_data);}return *this;
}String::operator const char* () {return m_data;
}int main() {// 测试构造函数String s1("Hello, world!");String s2(s1); // 使用拷贝构造函数std::cout << "s1: " << s1 << std::endl;std::cout << "s2: " << s2 << std::endl;// 测试赋值函数String s3;s3 = s1; // 使用赋值函数std::cout << "s3: " << s3 << std::endl;return 0;
}

定义抽象类型Shape ,包含计算图形面积的纯虚函数Area ,由他派生三个类:Circle。Rectangle、Trapezoid 另外重载运算符+ 以支持如下测试代码

Circle c(10);

Rectangle r(4,5);

Trapezoid t(5,6,2);

double area=c+r+t;//计算c r t的面积和

提示:需要两个互为重载的运算符函数,且一个函数的两个参数为Shape的引用,另一个函数的两个参数为double和Shape的引用

#include <iostream>class Shape {
public:virtual double Area() const = 0; // 纯虚函数virtual ~Shape() {} // 虚析构函数,确保正确释放资源
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double Area() const override {return 3.14 * radius * radius;}
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double Area() const override {return width * height;}
};class Trapezoid : public Shape {
private:double a, b, h;
public:Trapezoid(double a1, double b1, double h1) : a(a1), b(b1), h(h1) {}double Area() const override {return (a + b) * h / 2;}
};// 重载运算符+,两个参数为Shape的引用
double operator+(const Shape& s1, const Shape& s2) {return s1.Area() + s2.Area();
}// 重载运算符+,一个参数为double,另一个参数为Shape的引用
double operator+(double d, const Shape& s) {return d + s.Area();
}int main() {Circle c(10);Rectangle r(4, 5);Trapezoid t(5, 6, 2);// 计算c r t的面积和double area = c + r + t;std::cout << "Total area: " << area << std::endl;return 0;
}

设计复数类Complex ,包含double类型的实部和虚部,实现运算符+-*以及输出符号的重载 。Complex的调用如main函数所示。

#include<iostream>

using namespace std;

void main() {

Complex c1(2.0, 3.0);

Complex c2(1.0, 2.0);

cout<<c1+c2<<endl;

cout<<c1-c2<<endl;

cout<<c1*c2<<endl;

}

#include <iostream>
using namespace std;class Complex {
private:double real;double imag;public:// 构造函数Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 重载加法运算符+Complex operator+(const Complex& other) const {return Complex(real + other.real, imag + other.imag);}// 重载减法运算符-Complex operator-(const Complex& other) const {return Complex(real - other.real, imag - other.imag);}// 重载乘法运算符*Complex operator*(const Complex& other) const {double r = real * other.real - imag * other.imag;double i = real * other.imag + imag * other.real;return Complex(r, i);}// 重载输出运算符<<friend ostream& operator<<(ostream& out, const Complex& c) {out << "(" << c.real << ", " << c.imag << "i)";return out;}
};int main() {Complex c1(2.0, 3.0);Complex c2(1.0, 2.0);cout << c1 + c2 << endl;  // 输出 c1 + c2 的结果cout << c1 - c2 << endl;  // 输出 c1 - c2 的结果cout << c1 * c2 << endl;  // 输出 c1 * c2 的结果return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker学习之数据管理(超详解析)

Docker存储资源类型&#xff1a; 用户在使用 Docker 的过程中&#xff0c;势必需要查看容器内应用产生的数据&#xff0c;或者需要将容器内数据进行备份&#xff0c;甚至多个容器之间进行数据共享&#xff0c;这必然会涉及到容器的数据管理&#xff1a; &#xff08;1&#xff…

(含代码)利用NVIDIA Triton加速Stable Diffusion XL推理速度

在 NVIDIA AI 推理平台上使用 Stable Diffusion XL 生成令人惊叹的图像 扩散模型正在改变跨行业的创意工作流程。 这些模型通过去噪扩散技术迭代地将随机噪声塑造成人工智能生成的艺术&#xff0c;从而基于简单的文本或图像输入生成令人惊叹的图像。 这可以应用于许多企业用例&…

【剑指offer--C/C++】JZ25 合并两个排序的链表

题目 思路 这个题目大逻辑比较简单&#xff0c;就是一个比较和穿插&#xff0c;但细节上要考虑清楚&#xff0c;可以画个图模拟一下。我这里是设置将两个链表拆开组成一个新的链表&#xff0c;这样不需要占用新的空间。两个指针对应节点的值进行比较&#xff0c;那个节点值较小…

GEE——如何在谷歌地球引擎中获取二进制概率的准确性?(含具体代码介绍)

如何在谷歌地球引擎中获取二进制概率的准确性? Receiver Operating Characteristic(ROC)简介 Receiver Operating Characteristic(ROC)曲线是一种描述分类模型性能的图形工具。在二元分类问题中,ROC曲线以假正例率(False Positive Rate, FPR)为横坐标,真正例率(Tru…

【Stable Diffusion】入门-03:图生图基本步骤+参数解读

目录 1 图生图原理2 基本步骤2.1 导入图片2.2 书写提示词2.3 参数调整 3 随机种子的含义4 拓展应用 1 图生图原理 当提示词不足以表达你的想法&#xff0c;或者你希望以一个更为简单清晰的方式传递一些要求的时候&#xff0c;可以给AI输入一张图片&#xff0c;此时图片和文字是…

QT表格初始化与数据库值插入(库存管理系统)

void MainWidget::TableWidgetListDataFunc() // tablewidget表格控件初始化操作 {// 编号 名称 数量 单价 供应商家 负责人 入库时间 出库时间 备注// 设置表格控件200行9列ui->tableWidget_ListData->setColumnCount(9);ui->tableWidget_ListData->setRowCount(2…

Android 11存储权限兼容

Android 11 外部存储权限适配指南及方案 - 简书 //https://www.jianshu.com/p/e94cea26e213<uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.MANAGE_EXTERNAL_STORA…

数据可视化学习:Matplotlib概述

一、图表的常用设置 1.基本绘图主要函数 (1).matplotlib.pyplot.plot(x,y,format_string,**kwargs) 2.参数说明 (1).x:x轴数据 (2).y:y轴数据 (3).format_string:控制曲线格式的字符串&#xff0c;包括颜色、线条样式和标记样式 (4)**kwargs:键值参数&#xff0c;相当于…

基础知识学习 -- qnx 系统

QNX是一个基于优先级抢占的系统。 这也导致其基本调度算法相对比较简单。因为不需要像别的通用操作系统考虑一些复杂的“公平性”&#xff0c;只需要保证“优先级最高的线程最优先得到 CPU”就可以了。 基本调度算法 调度算法&#xff0c;是基于优先级的。QNX的线程优先级&a…

VS调试快捷键

VS调试快捷键 4. VS调试快捷键4.1 环境准备4.2 调试快捷键调试最常使⽤的⼏个快捷键&#xff1a; 4. VS调试快捷键 那程序员怎么调试代码呢&#xff1f; 4.1 环境准备 首先是环境的准备&#xff0c;需要⼀个支持调试的开发环境&#xff0c;我们上课使用VS&#xff0c;应该把…

Magical Combat VFX

这个包包含30个可供游戏使用的VFX,有各种口味,为您的游戏增添趣味! 所有VFX都经过了很好的优化,可以在所有平台上使用。 这个包特别有一堆闪电魔法,有两种主要的变体,一种是深色的,另一种是浅色的。但它也提供了一系列其他视觉效果,如神圣咒语、音乐主题等等! 我们提供…

fetch,前端 面试题

Fetch Fetch API 是近年来被提及将要取代XHR的技术新标准&#xff0c;是一个 HTML5 的 API。 基于promise的设计&#xff0c;返回的是Promise对象 fetch()采用模块化设计&#xff0c;API 分散在多个对象上&#xff08;Response 对象、Request 对象、Headers 对象&#xff09;…

如何在webapp中于动发布一个应用

目录 第一步&#xff1a;在webapp文件夹内自定义文件夹第二步&#xff1a;生成一个文本&#xff0c;并把后缀改为 .html第三步&#xff1a;进入bin文件夹打开服务第四步&#xff1a;打开方式选择java第六步&#xff1a;输入你想输出的东西第七步&#xff1a;双击运行即可 第一步…

mybatis-plus笔记1

mybatis-plus笔记1 mybatis-plus快速入门基于Mapper接口的crud增强基于service的crud分页查询分页添加到自定义方法queryWrapper简单使用使用细节 updateWrapperlambdaWrapper mybatis-plus快速入门 pom.xml文件中导入相关依赖 application.yaml配置文件 MainApplication.java…

2024年企业经济管理与大数据国际会议(ICEEMBD 2024)

2024年企业经济管理与大数据国际会议&#xff08;ICEEMBD 2024&#xff09; 2024 International Conference on Enterprise Economic Management and Big Data 会议简介&#xff1a; 大数据分析在经济管理中发挥着至关重要的作用&#xff0c;它不仅能够提高决策效率和准确性…

使用Java Runtime执行docker下的mysqldump

Runtime直接使用 docker exec mysql mysqldump -u%s -p%s cblog > %s&#xff08;%s是需要填充的数据&#xff09;&#xff0c;命令无法执行并且不会报错&#xff0c;需要使用字符串数组加入"sh", “-c”&#xff0c;具体代码示例&#xff1a; /*** MySQL数据备份…

KubeSphere 社区双周报|2024.02.29-03.14

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2024.02.29-03.14…

android 简单快速 实现滚轮控件WheelView(类似DatePicker/TimePicker)

github 地址&#xff1a;GitHub - Bigkoo/Android-PickerView: This is a picker view for android , support linkage effect, timepicker and optionspicker.&#xff08;时间选择器、省市区三级联动&#xff09; https://github.com/Bigkoo/Android-PickerView 1.引用库 …

vue 记录一个echarts页面 单色环形饼图 多色环形饼图 柱状图加折线图 饼状图 双柱状图 雷达图 多色堆叠柱状图

“设备使用”模块没有做 因为项目不需要 仅自己记录使用 可供参考 那么上代码 <template><!--app-container--><div class"home-wrap"><div class"wrap" v-if"schoolId"><!--第一块--><div class"statis…

MongoDB从0到1:高效数据使用方法

MongoDB&#xff0c;作为一种流行的NoSQL数据库。从基础的文档存储到复杂的聚合查询&#xff0c;从索引优化到数据安全都有其独特之处。文末附MongoDB常用命令大全。 目录 1. 引言 MongoDB简介 MongoDB的优势和应用场景 2. 基础篇 安装和配置MongoDB MongoDB基本概念 使…