#381. 四边形继承练习

太爽了

甚至还现学了叉积判断线段是否相交和求面积的方法

先给出我的代码:

#include <iostream>
#include <vector>
#include <iomanip>
#include <cmath>using namespace std;//下面需要补充多个类的声明及实现代码
const double EPS = 1e-6;
struct Point{double x, y;Point(double x, double y):x(x), y(y){}
};class Quadrilateral{
public:Quadrilateral(){}Quadrilateral(vector<Point> &vertices):p(vertices){}double getArea();double getPerimeter();bool verify();
protected:vector<Point> p;//四边形的四个顶点,从任一顶点出发按顺序存放
};class Parallelogram:protected Quadrilateral{
public:Parallelogram(){}Parallelogram(vector<Point> &vertices){Quadrilateral::p = vertices;}double getArea();double getPerimeter();bool verify();
};class Rectangle:protected Parallelogram{
public:Rectangle(){}Rectangle(vector<Point> &vertices){Quadrilateral::p = vertices;}double getArea();double getPerimeter();bool verify();
};bool Quadrilateral::verify(){{double x1 = p[2].x - p[0].x, y1 = p[2].y - p[0].y;double x2 = p[1].x - p[0].x, y2 = p[1].y - p[0].y;double x3 = p[3].x - p[0].x, y3 = p[3].y - p[0].y;if((x1 * y2 - x2 * y1) * (x1 * y3 - x3 * y1) >= 0) return false;}{double x1 = p[3].x - p[1].x, y1 = p[3].y - p[1].y;double x2 = p[0].x - p[1].x, y2 = p[0].y - p[1].y;double x3 = p[2].x - p[1].x, y3 = p[2].y - p[1].y;if((x1 * y2 - x2 * y1) * (x1 * y3 - x3 * y1) >= 0) return false;}return true;
}
double Quadrilateral::getArea(){if(verify()){double S1 = 0.5 * fabs((p[1].x - p[0].x) * (p[2].y - p[0].y) - (p[1].y - p[0].y) * (p[2].x - p[0].x));double S2 = 0.5 * fabs((p[3].x - p[0].x) * (p[2].y - p[0].y) - (p[3].y - p[0].y) * (p[2].x - p[0].x));return S1 + S2;}else return 0.0;
}
double Quadrilateral::getPerimeter(){if(verify()){double l1 = sqrt(pow(p[1].x - p[0].x, 2.0) + pow(p[1].y - p[0].y, 2.0));double l2 = sqrt(pow(p[2].x - p[1].x, 2.0) + pow(p[2].y - p[1].y, 2.0));double l3 = sqrt(pow(p[3].x - p[2].x, 2.0) + pow(p[3].y - p[2].y, 2.0));double l4 = sqrt(pow(p[0].x - p[3].x, 2.0) + pow(p[0].y - p[3].y, 2.0));return l1 + l2 + l3 + l4;}else return 0.0;
}bool Parallelogram::verify(){if(Quadrilateral::verify()){double l1 = sqrt(pow(p[1].x - p[0].x, 2.0) + pow(p[1].y - p[0].y, 2.0));double l2 = sqrt(pow(p[2].x - p[1].x, 2.0) + pow(p[2].y - p[1].y, 2.0));double l3 = sqrt(pow(p[3].x - p[2].x, 2.0) + pow(p[3].y - p[2].y, 2.0));double l4 = sqrt(pow(p[0].x - p[3].x, 2.0) + pow(p[0].y - p[3].y, 2.0));if(fabs(l1 - l3) <= EPS && fabs(l2 - l4) <= EPS) return true;else return false;}else return false;
}
double Parallelogram::getArea(){if(verify()) return Quadrilateral::getArea();else return 0.0;
}
double Parallelogram::getPerimeter(){if(verify()) return Quadrilateral::getPerimeter();else return 0.0;
}bool Rectangle::verify(){if(Parallelogram::verify()){double l1 = sqrt(pow(p[2].x - p[0].x, 2.0) + pow(p[2].y - p[0].y, 2.0));double l2 = sqrt(pow(p[3].x - p[1].x, 2.0) + pow(p[3].y - p[1].y, 2.0));if(fabs(l1 - l2) <= EPS) return true;else return false;}else return false;
}
double Rectangle::getArea(){if(verify()) return Quadrilateral::getArea();else return 0.0;
}
double Rectangle::getPerimeter(){if(verify()) return Quadrilateral::getPerimeter();else return 0.0;
}//填空结束int main()
{vector<Point> vertices;for (int i=0;i<4;i++){double x,y;cin>>x>>y;Point p(x,y);vertices.push_back(p);}Quadrilateral q(vertices);Parallelogram pa(vertices);Rectangle r(vertices);cout<<fixed<<setprecision(2);cout<<(q.verify()?1:0)<<endl;cout<<q.getArea()<<endl;cout<<q.getPerimeter()<<endl;cout<<(pa.verify()?1:0)<<endl;cout<<pa.getArea()<<endl;cout<<pa.getPerimeter()<<endl;cout<<(r.verify()?1:0)<<endl;cout<<r.getArea()<<endl;cout<<r.getPerimeter()<<endl;return 0;
}

当然以上是老师给的原文件填上我的答案之后的,我填的地方有注释标注的,很明显

说实话第一次用继承,虽然上次有用过,但是没那么深入

代码还有可以改进的地方,像在求面积和周长的时候,可以用一个值记录,以及一个值记录是否判断过,避免重复判断

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

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

相关文章

RocketMQ 02 功能大纲介绍

RocketMQ 02 主流的MQ有很多&#xff0c;比如ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等。 之前阿里巴巴也是使用ActiveMQ&#xff0c;随着业务发展&#xff0c;ActiveMQ IO 模块出现瓶颈&#xff0c;后来阿里巴巴 通过一系列优化但是还是不能很好的解决&#xff0c;之后…

小程序变更主体需要多久?

小程序迁移变更主体有什么作用&#xff1f;小程序迁移变更主体的好处有很多哦&#xff01;比如可以获得更多权限功能、公司变更或注销时可以保证账号的正常使用、收购账号后可以改变归属权或使用权等等。小程序迁移变更主体的条件有哪些&#xff1f;1、新主体必须是企业主体&am…

判断IQ水平-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第50讲。 判断IQ水平&#…

如何检测和避免线程死锁?

在日常开发中涉及到多线程开发时候就很容易会产生死锁 what: 什么是线程死锁? 线程死锁是指两个或两个以上的线程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞现象。当这些线程互相持有对方所需要的资源时&#xff0c;会互相等待对方释放资源&am…

排序算法—堆排序

文章目录 堆排序堆思路过程建堆排序 代码实现 堆排序 时间复杂度&#xff1a;O(N*logN) 稳定性&#xff1a;不稳定&#xff08;相同元素排序后的相对位置改变&#xff09; 堆 堆的逻辑结构是一棵完全二叉树&#xff1b;堆的物理结构是一个数组&#xff0c;通过下标表示父子结…

Shell脚本学习(一):Shell内置命令与Shell运算符

Shell内置命令 理解内置命令的含义。 内置命令介绍 Shell内置命令&#xff0c;就是由Bash Shell自身提供的命令&#xff0c;而不是文件系统中的可执行文件。 使用type 可以用来确定一个命令是否是内置命令&#xff1a; type 命令演示&#xff1a; 对于上述演示的两个命令来…

普乐蛙VR神州飞船设备VR太空舱体验馆VR博物馆

中国航天式浪漫知多少&#xff1f;千百年来古人对浩瀚宇宙有着无尽的浪漫想象&#xff0c;而在一代又一代中国航天事业奋斗者的努力中&#xff0c;远古神话不再是幻想&#xff0c;它终被照进现实——中国载人飞船“神舟”、中国载人空间站“天宫”、中国绕月人造卫星“嫦娥一号…

mybatis的一对多

业务&#xff1a;通常主表从表 查询&#xff0c;一对多关系&#xff0c;通常是先查主表&#xff0c;然后拿主表的 关联字段与从表关联。在代码中 通常用for 循环等方法给 从表的数据赋值&#xff0c;很麻烦&#xff0c;&#xff0c;&#xff0c;很麻烦。。。。 用mybatis的…

Linux 正则表达式及三剑客(awk、grep、sed)

原文&#xff1a;https://blog.iyatt.com/?p14465 1 前言 2024.4.8 昨天接了一个代写单子&#xff0c;要求用 Python 实现 sed 的部分功能。我用 Linux 也有几年了&#xff0c;基本的命令知道&#xff0c;但是几乎没有写涉及高级功能的 shell 脚本&#xff0c;所以对于正则表…

小米汽车值得去吗?最终拒了 offer。

车企选择 今天逛某职场 App 时&#xff0c;无意间看到一篇寻求 offer 抉择意见的帖子&#xff1a; 这位同学刚从加班闻名&#xff08;但 CEO 强调既学华为狼性&#xff0c;也学华为分配&#xff09;的理想汽车离职。 经过了 6 轮面试&#xff0c;收到了小米 offer&#xff0c;但…

QT文本操作

文本的操作 文本的读写流程 文本的读写流程 // 文本的读写流程// 1.打开文件》打到文本》QFileDialog::getOpenFileName返回的是// 一个字符串&#xff0c;包括了路径文件名字// open()方法打开文本// 2.读写文本// readAll(),readLine(),write()// 3.关闭文本 // close()使用…

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…