#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.mfbz.cn/a/545165.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

儿童护眼台灯怎么选?五款必选的高口碑护眼台灯推荐

儿童台灯&#xff0c;想必大家都不会陌生了&#xff0c;是一种学生频繁使用的小灯具&#xff0c;一般指放在桌面用的有底座的电灯。随着近年来儿童青少年的视力急速下滑&#xff0c;很多家长都会选择给孩子选择一款合适的护眼台灯&#xff0c;以便孩子夜晚学习能有个好的照明环…

数据结构—顺序表实现通讯录

在上一节我们基本了解了顺序表的基本知识&#xff0c;接下来我们就用顺序表来实现一下通讯录。 一、基于动态顺序表实现通讯录 1.1 功能介绍 1. 能够保存用户信息&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;电话&#xff0c;地址等 2. 添加联系人信息 3. …

零基础使用FlexLua打造LoRa无线气体流量计,硬件轻松快速开发。

在工业领域&#xff0c;对气体流量进行准确监测和管理是保障生产安全和提高效率的重要环节。而LoRa&#xff08;长距离低功耗无线技术&#xff09;作为一种适用于远距离、低功耗的通信技术&#xff0c;为无线传感器网络的建设提供了可靠的解决方案。结合气体流量传感技术&#…

【JS】querySelectorAll和getElementsByClassName

现有一段代码&#xff0c;li的类名均为item&#xff0c;有一按钮可动态添加类名为item的li。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

vue表格操作列,按钮太多显示... 点击后悬浮显示全部按钮

效果: 分析原理: 一共就三步,仔细看看很简单,位置要加对,代码结构下边有demo 代码结构demo: <el-table-columnlabel"操作"align"center"fixed"right"show-overflow-tooltip><template slot-scope"scope"><el-buttonsi…

润乾报表平台 InputServlet 任意文件读取漏洞复现

0x01 产品简介 润乾报表是一个纯JAVA的企业级报表工具&#xff0c;支持对J2EE系统的嵌入式部署&#xff0c;无缝集成。服务器端支持各种常见的操作系统&#xff0c;支持各种常见的关系数据库和各类J2 EE的应用服务器&#xff0c;客户端采用标准纯html方式展现&#xff0c;支持…

1000BASE-SX VS 1000BASE-LX SFP光模块

SFP光模块是一种小型可插拔光模块&#xff0c;用于支持1G速率的光纤通信&#xff0c;有多种不同类型。市场上使用较广泛是1000BASE-SX和1000BASE-LX SFP光模块。在本文中&#xff0c;飞速&#xff08;FS&#xff09;将对这两种LC SFP光模块进行简要介绍。 什么是1000BASE-SX S…

3dmax制作小熊猫的基本流程

1.透视图插入面片&#xff0c;改高度宽度&#xff0c;把参考图放进面片里。 2.角度捕捉切换&#xff0c;角度改为90 3.shift旋转&#xff0c;旋转面片&#xff0c;复制一个出来 4.在前视图&#xff0c;把参考图片中的正式图小熊猫的一半的位置&#xff08;可以是眼睛&#x…

Android Studio引入framework.jar包

一. 前言 Android Studio 引入framework.jar 步骤&#xff0c;记录笔记 Android源码编译产生的framework.jar 在不同的版本上生成路径是不同的 Android N/O: 7 和 8 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar Android P/Q: 9 和 10 out/s…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果 一、简单介绍 二、简单图片添加水印效果实现原理 三、简单图片添加水印效果案例…

c++ - 类的默认成员函数

文章目录 前言一、构造函数二、析构函数三、拷贝构造函数四、重载赋值操作符五、取地址及const取地址操作符重载 前言 默认成员函数是编译器自动生成的&#xff0c;也可以自己重写&#xff0c;自己重写之后编译器就不再生成&#xff0c;下面是深入了解这些成员函数。 一、构造…

每个人都可以做一个赚钱的社群

如何创建并运营一个赚钱的社群 一、引言 大家好&#xff0c;今天&#xff0c;我想和大家分享一下如何创建并运营一个赚钱的社群。我的分享目的是希望能够持续输出有价值的内容。 二、心态建设 1. 重要性&#xff1a;创业心态与平常心 在开始社群运营之前&#xff0c;我们需…

面试官:MySQL的自增 ID 用完了,怎么办?

如果你用过或了解过MySQL&#xff0c;那你一定知道自增主键了。每个自增id都是定义了初始值&#xff0c;然后按照指定步长增长&#xff08;默认步长是1&#xff09;。虽然&#xff0c;自然数是没有上限的&#xff0c;但是我们在设计表结构的时候&#xff0c;通常都会指定字段长…

Flink入门学习 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…

优化汽车制造中的库存管理

在拥有足够的库存以满足客户需求和最大限度地减少过剩库存之间取得适当的平衡&#xff0c;对于高效运营和正向现金流运营至关重要。我们将探讨如何利用数据见解和预测技术来支持汽车制造商进行精益运营&#xff0c;避免库存过多或不足的缺陷。 销售模式告诉我们什么&#xff1…

手拉手安装启动Kafka2.13

启动Kafka本地环境需Java 8以上 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xff09;是在现代网络上的许多社会功能的一个关键因素。 Kafka启动…

创新营销利器:淘宝扭蛋机小程序开发全解析

在数字化浪潮的推动下&#xff0c;淘宝扭蛋机小程序的开发成为了一种全新的购物体验。它巧妙地将传统扭蛋机的乐趣与移动技术的便捷相结合&#xff0c;为用户带来了前所未有的惊喜与互动。 淘宝扭蛋机小程序的开发&#xff0c;不仅是一次技术的革新&#xff0c;更是一次购物方…

c++中常用库函数

大小写转换 islower/isupper函数 char ch1 A; char ch2 b;//使用islower函数判断字符是否为小写字母 if(islower(ch1)){cout << ch1 << "is a lowercase letter." << end1; } else{cout << ch1 << "is not a lowercase lette…

Java单例集合

Collection接口介绍 Collection 表示一组对象&#xff0c;它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。 Collection接口中定义的方法 方法说明boolean add(Object element)增加元素到容器中boolean remove(Object element)从容器中移除元素 boolean c…

【源码】2024全开源多语言多商户跨境商城源码|多语言跨境外贸电商系统App

ikTok SHOP跨境电商系统V8版是一套B2CB2B跨境电商商城系统源码&#xff0c;多商户多语言&#xff0c;全新百变DIY模板&#xff1b;该系统支持B-C自营、B-B-C第三方卖家系统、B2B批发电商模式&#xff1b;该源码是使用Laravel框架PHP开发的&#xff0c;前后端全开源可二开。 版…