#381. 四边形继承练习

news2024/12/23 6:53:13

太爽了

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

先给出我的代码:

#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.coloradmin.cn/o/1595791.html

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

相关文章

STM32之FreeRTOS移植

1.FreeRTOS的移植过程是将系统需要的文件和代码进行移植和裁剪&#xff0c;其移植的主要过程为&#xff1a; &#xff08;1&#xff09;官网上下载FreeRTOS源码&#xff1a;https://www.freertos.org/ &#xff08;2&#xff09;移植文件夹&#xff0c;在portable文件夹中只需…

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

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

【C语言】指针篇-初识指针(1/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 **内存和地址(知识铺垫(了解即可))**如何理解编址**指针变量*…

故障诊断 | 基于LSTM的滚动轴承故障诊断

效果 概述 基于LSTM(长短期记忆网络)的滚动轴承故障诊断是一种利用深度学习技术来预测滚动轴承是否存在故障的方法。下面是一个基本的滚动轴承故障诊断的流程: 数据收集:首先,需要收集与滚动轴承相关的振动信号数据。这些数据可以通过传感器或振动监测系统获取。收集的数…

OSI七层网络模型 —— 筑梦之路

在信息技术领域&#xff0c;OSI七层模型是一个经典的网络通信框架&#xff0c;它将网络通信分为七个层次&#xff0c;每一层都有其独特的功能和作用。为了帮助记忆这七个层次&#xff0c;有一个巧妙的方法&#xff1a;将每个层次的英文单词首字母组合起来&#xff0c;形成了一句…

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

构建第一个ArkTS应用之@BuilderParam装饰器:引用@Builder函数

当开发者创建了自定义组件&#xff0c;并想对该组件添加特定功能时&#xff0c;例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法&#xff0c;将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题&#xff0c;ArkUI引入了BuilderParam装饰器&…

2024年网络安全行业全景图 | 亚信安全实力占据62领域

近日&#xff0c;安全牛《中国网络安全行业全景图》&#xff08;第十一版&#xff09;正式发布。 本次发布的全景图&#xff0c;包含16个一级安全分类&#xff0c;108个二级细分领域&#xff0c;共收录454家国内安全厂商&#xff0c;细分领域共收录2413项。亚信安全凭借在云安全…

① 学习PID--先认识有什么电机和驱动

我们在学习和使用PID的时候&#xff0c;可能会有很多电机的选择。然而不同的电机使用的PID参数是不太一样的。所以我们需要认识电机和驱动器。 1 电机有什么类型 1.1 电机的简介 电机是一种可以在电能和机械能的之间相互转换的设备&#xff0c;其中发电机是将机械能转换为电能…

虚拟机下CentOS7开启SSH连接

虚拟机下CentOS7开启SSH连接 自己在VMware中装了CentOS 6.3&#xff0c;然后主机&#xff08;或者说xshell&#xff09;与里面的虚拟机连不通&#xff0c;刚学习&#xff0c;一头雾水&#xff0c;查了半天&#xff0c;也不知道怎么弄。 在虚拟机&#xff08;Vmware Workstatio…

优思学院|2024年如何成为一名六西格玛黑带?

如果你总是觉得无论多么努力&#xff0c;职场上似乎难以有所突破&#xff0c;那么你应该知道&#xff0c;你并不是孤独的。 实际上&#xff0c;大量研究表明&#xff0c;高达90%的人对自己的工作感到不满&#xff0c;这意味着在你认识的每10人中&#xff0c;可能只有1人对其工…

小程序视频如何下载到电脑上

小程序视频如何下载到电脑上&#xff0c;很简单 1.利用Fiddler和Charles这些专业的抓包工具 2.利用录屏 3.利用专门抓取资源的工具(集成了抓取下载&#xff0c;而且对资源下载很友好) 工具我已经打包好了 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w…

烧结钕铁硼永磁体是如何生产的?

烧结钕铁硼永磁体是采用粉末冶金法生产的&#xff0c;从备料到成品发货一般要经过十几个工艺环节&#xff0c;在不同阶段还包括若干次检测分析。 整个生产过程是一个系统工程&#xff0c;环环相扣。一般我们将生产磁体毛坯的过程称为前道生产环节&#xff0c;将毛坯加工成最终…

Thingsboard PE 白标的使用

只有专业版支持白标功能。 使用 ThingsBoard Cloud 或安装您自己的平台实例。 一、介绍 ThingsBoard Web 界面提供了简便的操作,让您能够轻松配置您的公司或产品标识和配色方案,无需进行编码工作或重新启动服务。 系统管理员、租户和客户管理员可以根据需要自定义配色方案、…

计算机网络2——物理层2

文章目录 一、信道复用技术1、介绍2、频分复用、时分复用和统计时分复用3、波分复用4、码分复用 二、数字传输系统三、宽带接入技术1、介绍2、ADSL 技术3、光纤同轴混合网(HFC网)4、FTTx技术 一、信道复用技术 1、介绍 复用(multiplexing)是通信技术中的基本概念。计算机网络…

抖音小店开店必做的几个基础搭建,新手注意,不做店铺没流量

大家好&#xff0c;我是电商笨笨熊 新手入手做抖音小店一定不要着急选品&#xff0c;先去做店铺基础搭建&#xff0c;吸引更多流量进入店铺&#xff0c;提升店铺曝光度。 店铺搭建都没做好&#xff0c;流量来了你也接不住&#xff0c;所以今天我们就来聊聊哪些必做的搭建内容…

常见 Java 代码缺陷及规避方式

阿里妹导读 在日常开发过程中&#xff0c;我们会碰到各种各样的代码缺陷或者 Bug&#xff0c;比如 NPE、 线程安全问题、异常处理等。这篇文章总结了一些常见的问题及应对方案&#xff0c;希望能帮助到大家。 问题列表 空指针异常 NPE 或许是编程语言中最常见的问题&#xff0…

rv1103/buildroot系统中添加包如v4l2

v4l2: rv1103给出的包中已经有v4l,只需要在menuconfig中打开编译选项&#xff0c;步骤如下&#xff1a; 在luckfox的github网站中下载的源代码在~/linux/luckfox/luckfox-pico-main中目录结构如下&#xff1a; 打开编译选项 cd ./sysdrv/source/buildroot/buildroot-2023.02.…

浅谈普通人成为程序员的几个原因

成为程序员的原因可以因人而异&#xff0c;以下是一些普遍的原因&#xff1a; 兴趣和热情&#xff1a;很多人对计算机科学和编程非常感兴趣。他们喜欢探索如何使用代码来解决问题&#xff0c;并且享受编程过程中的逻辑思考和创造性。 高薪和就业机会&#xff1a;现代社会对技术…

GEE错误——Landsat影像加载后显示白色或黑色如何解决?

错误展示 简介 在GEE中,如果加载的Landsat影像显示为白色或黑色,可能的原因: 1. 数据范围问题:Landsat影像通常以16位有符号整数的格式存储,但在加载到GEE时,默认使用了0到1的归一化数据范围。这可能导致影像显示不正确。解决方法是通过将图像转换为正确的数据范围来修…