【C++】类和对象的应用案例 2 - 点和圆的关系

        欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行。动静不失其时,其道光明。


目录

1、缘起

2、分析

3、示例代码 1 

4、代码优化 

4.1、point.h 

4.2、point.c 

4.3、circle.h 

4.4、circle.c 

4.4、main.c 

5、示例代码 2 

6、总结 


1、缘起

        在 C++ 中,类和对象可以用来构建有趣的应用程序。一个生动形象且吸引人的案例是点和圆的关系。通过创建一个 Point 类 表示点的坐标,以及一个 Circle 类 表示圆的属性和行为,我们可以实现各种有趣的操作,如计算圆的面积、判断点是否在圆内等。这个案例展示了如何利用类和对象的概念在编程中创造出有趣和实用的应用。、

2、分析

设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系。

点和圆关系判断: 

点到圆心的距离  == 半径        点在圆上;

点到圆心的距离  >  半径         点在圆外;

点到圆心的距离  <  半径         点在圆内;

点到圆心的距离公式:

\sqrt{(x1-x2)^2+(y1-y2)^{2}}

3、示例代码 1 

#include<iostream>
#include<string>

using namespace std;

//创建一个点类
class Point
{
public:
	//行为
	//设置 x 坐标
	void setX(int x)
	{
		c_x = x;
	}

	//设置 y 坐标
	void setY(int y)
	{
		c_y = y;
	}

	//获取 x 坐标
	int getX()
	{
		return c_x;
	}

	//获取 y 坐标
	int getY()
	{
		return c_y;
	}

private:
	int c_x;
	int c_y;
};

//创建一个圆类
class Circle
{
public:
	//行为
	//设置半径
	void setR(int r)
	{
		c_r = r;
	}

	//设置圆心
	void setCenter(Point center)
	{
		c_center = center;
	}

	//获取半径
	int getR()
	{
		return c_r;
	}

	//获取圆心
	Point getCenter()
	{
		return c_center;
	}

private:
	//圆的半径
	int c_r;

	//圆的圆心
	Point c_center;
};

//全局函数判断点和圆的关系
void isInCircle(Circle& c,Point& p)
{
	//计算两点之间的距离  平方
	int distance =
		(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
		(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());

	//计算半径的平方
	int r_distance = c.getR() * c.getR();

	if (distance == r_distance)
	{
		cout << "点在圆上" << endl;
	}
	if (distance < r_distance)
	{
		cout << "点在圆内" << endl;
	}
	if (distance > r_distance)
	{
		cout << "点在圆外" << endl;
	}
}

int main()
{
	//创建圆
	Circle c;
	c.setR(10);
	Point center;
	center.setX(10);
	center.setY(0);
	c.setCenter(center);

	//创建点
	Point p;
	p.setX(10);
	p.setY(10);

	//判断点和圆的关系
	isInCircle(c, p);

	cout << endl;
	system("pause");
	return 0;
}	

4、代码优化 

        在实际开发中,我们不会把所有的类都写在同一文件中。我们通常会把一个类进行分文件编写。比如在头文件中写声明,在源文件中写实现。

4.1、point.h 

#pragma once  //防止头文件重复包含
#include<iostream>

using namespace std;

class Point
{
public:
	//行为
	//设置 x 坐标
	void setX(int x);

	//设置 y 坐标
	void setY(int y);

	//获取 x 坐标
	int getX();

	//获取 y 坐标
	int getY();

private:
	int c_x;
	int c_y;
};

4.2、point.c 

#include "point.h"

//设置 x 坐标
void Point::setX(int x)
{
	c_x = x;
}

//设置 y 坐标
void Point::setY(int y)
{
	c_y = y;
}

//获取 x 坐标
int Point::getX()
{
	return c_x;
}

//获取 y 坐标
int Point::getY()
{
	return c_y;
}

4.3、circle.h 

#pragma once
#include "point.h"

//创建一个圆类
class Circle
{
public:
	//行为
	//设置半径
	void setR(int r);

	//设置圆心
	void setCenter(Point center);

	//获取半径
	int getR();

	//获取圆心
	Point getCenter();

private:
	//圆的半径
	int c_r;

	//在类中可让另一个类作为本来中的成员
	Point c_center;  //圆心
};

4.4、circle.c 

#include "circle.h"

//创建一个圆类
//行为
//设置半径
void Circle::setR(int r)
{
	c_r = r;
}

//设置圆心
void Circle::setCenter(Point center)
{
	c_center = center;
}

//获取半径
int Circle::getR()
{
	return c_r;
}

//获取圆心
Point Circle::getCenter()
{
	return c_center;
}

4.4、main.c 

#include<iostream>
#include<string>
#include"point.h"
#include"circle.h"

using namespace std;

//全局函数判断点和圆的关系
void isInCircle(Circle& c, Point& p)
{
	//计算两点之间的距离  平方
	int distance =
		(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
		(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());

	//计算半径的平方
	int r_distance = c.getR() * c.getR();

	if (distance == r_distance)
	{
		cout << "点在圆上" << endl;
	}
	if (distance < r_distance)
	{
		cout << "点在圆内" << endl;
	}
	if (distance > r_distance)
	{
		cout << "点在圆外" << endl;
	}
}

int main()
{
	//创建圆
	Circle c;
	c.setR(10);
	Point center;
	center.setX(10);
	center.setY(0);
	c.setCenter(center);

	//创建点
	Point p;
	p.setX(10);
	p.setY(12);

	//判断点和圆的关系
	isInCircle(c, p);

	cout << endl;
	system("pause");
	return 0;
}

5、示例代码 2 

利用 构造函数初始化列表 的知识点重写上述代码。

#include<iostream>
#include<string>

using namespace std;

#include<iostream>
#include<string>

using namespace std;

//定义一个点类
class Point
{
public:
	Point(int x, int y)
	{
		p_x = x;
		p_y = y;
	}

	//获取 x 的值
	int getX()
	{
		return p_x;
	}

	//获取 y 的值
	int getY()
	{
		return p_y;
	}

private:
	int p_x;
	int p_y;
};

//定义一个圆类
class Circle
{
public:
	Circle(int r,int x, int y):c_r(r),c_center(x,y)
	{
		
	}

	//设置圆心
	void setCenter(Point center)
	{
		c_center = center;
	}

	//获取半径
	int getR()
	{
		return c_r;
	}

	//获取圆心
	Point getCenter()
	{
		return c_center;
	}

private:
	int c_r;
	Point c_center;
};

//全局函数判断点和圆的关系
void isInCircle(Circle& c, Point& p)
{
	//计算两点之间的距离  平方
	int distance =
		(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
		(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());

	//计算半径的平方
	int r_distance = c.getR() * c.getR();

	if (distance == r_distance)
	{
		cout << "点在圆上" << endl;
	}
	if (distance < r_distance)
	{
		cout << "点在圆内" << endl;
	}
	if (distance > r_distance)
	{
		cout << "点在圆外" << endl;
	}
}

int main()
{
	//定义一个圆类
	//第一个参数是圆的半径,第二,三个参数是圆心
	Circle c(10,10,0); 

	//创建一个点对象
	Point p(10, 10);

	isInCircle(c, p);

	cout << endl;
	system("pause");
	return 0;
}

 

6、总结 

        本期的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷~~~,笔者必回,我们下期再见啦 !!

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

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

相关文章

Netty 源码分析系列(十八)一行简单的writeAndFlush都做了哪些事?

文章目录 前言源码分析ctx.writeAndFlush 的逻辑writeAndFlush 源码ChannelOutBoundBuff 类addMessage 方法addFlush 方法AbstractNioByteChannel 类 小结 前言 对于使用netty的小伙伴来说&#xff0c;我们想通过服务端往客户端发送数据&#xff0c;通常我们会调用ctx.writeAn…

实时聊天组合功能,你了解吗?

你有兴趣安装实时聊天组合功能吗&#xff1f;如果您选择了SaleSmartly&#xff08;ss客服&#xff09;&#xff0c;您的实时聊天插件可以不仅仅只是聊天通道&#xff0c;还可以有各种各样的功能&#xff0c;你不需要包含每一个功能&#xff0c;正所谓「宁缺勿滥」&#xff0c;功…

再获认可!腾讯连续三年被Gartner列为CWPP供应商之一

随着云的快速发展&#xff0c;企业的工作负载已经从服务器发展到虚拟机、容器、serverless等&#xff0c;部署的模式也日益复杂&#xff0c;包括公有云、混合云和多云等。在此背景下&#xff0c;传统的主机安全防护已无法满足需求&#xff0c;CWPP&#xff08;云工作负载保护平…

C#,码海拾贝(23)——求解“复系数线性方程组“的“全选主元高斯消去法“之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary&g…

day20 - 绘制物体的运动轨迹

在我们平常做目标检测或者目标追踪时&#xff0c;经常要画出目标的轨迹图。绘制轨迹图的一种方法就是利用光流估计来进行绘制。 本期我们主要来介绍视频中光流估计的使用和效果&#xff0c;利用光流估计来绘制运动轨迹。 完成本期内容&#xff0c;你可以&#xff1a; 掌握视…

网站部署与上线(1)虚拟机

文章目录 .1 虚拟机简介2 虚拟机的安装 本章将搭建实例的生产环境&#xff0c;将所有的代码搭建在一台Linux服务器中&#xff0c;并且测试其能否正常运行。 使用远程服务器进行连接&#xff1b; 基本的Linux命令&#xff1b; 使用Nginx搭建Node.js服务器&#xff1b; 在服务器端…

一、预约挂号详情

文章目录 一、预约挂号详情1、需求分析 2、api接口2.1 添加service接口2.2 添加service接口实现2.2.1 在ScheduleServiceImpl类实现接口2.2.2 在获取科室信息 2.3 添加controller方法 3、前端3.1封装api请求3.2 页面展示 二、预约确认1、api接口1.1 添加service接口1.2 添加con…

通过python采集整站lazada商品列表数据,支持多站点

要采集整站lazada商品列表数据&#xff0c;需要先了解lazada网站的结构和数据源。Lazada是东南亚最大的电商平台之一&#xff0c;提供各种商品和服务。Lazada的数据源主要分为两种&#xff1a;HTML和API。 方法1&#xff1a;采集HTML数据 步骤1&#xff1a;确定采集目标 首先…

一、CNNs网络架构-基础网络架构(LeNet、AlexNet、ZFNet)

目录 1.LeNet 2.AlexNet 2.1 激活函数&#xff1a;ReLU 2.2 随机失活&#xff1a;Droupout 2.3 数据扩充&#xff1a;Data augmentation 2.4 局部响应归一化&#xff1a;LRN 2.5 多GPU训练 2.6 论文 3.ZFNet 3.1 网络架构 3.2 反卷积 3.3 卷积可视化 3.4 ZFNet改…

Java的Arrays类的sort()方法(41)

目录 sort&#xff08;&#xff09;方法 1.sort&#xff08;&#xff09;方法的格式 2.使用sort&#xff08;&#xff09;方法时要导入的类 3.作用 4.作用的对象 5.注意 6.代码及结果 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;结果 sort&#xff08;&…

【Netty】字节缓冲区 ByteBuf (六)(上)

文章目录 前言一、ByteBuf类二、ByteBuffer 实现原理2.1 ByteBuffer 写入模式2.2 ByteBuffer 读取模式2.3 ByteBuffer 写入模式切换为读取模式2.4 clear() 与 compact() 方法2.5 ByteBuffer 使用案例 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&…

亏损?盈利?禾赛科技Q1财报背后的激光雷达赛道「现实」

随着禾赛科技在去年登陆美股&#xff0c;作为全球为数不多已经开始前装量产交付的激光雷达上市公司&#xff0c;财务数据的变化&#xff0c;也在一定程度上反映了行业的真实状况。 根据禾赛科技最新发布的今年一季度财报显示&#xff0c;公司季度净营收为4.3亿元&#xff08;人…

day13 - 对指纹图片进行噪声消除

在指纹识别的过程中&#xff0c;指纹图片通常都是现场采集的&#xff0c;受环境的影响会有产生很多的噪声点&#xff0c;如果直接使用&#xff0c;会对指纹的识别产生很大的影响&#xff0c;而指纹识别的应用场景又都是一些比较严肃不容有错的场合&#xff0c;所以去除噪声又不…

python+vue空巢老人网上药店购药系统9h2k5

本空巢老人购药系统主要包括三大功能模块&#xff0c;即用户功能模块、家属功能模块和管理员功能模块。 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户是管理员&#xff0c;管理员登录后&#xff0c;通过管理员功能来管理后台系统。主要功能有&#xff1a;…

【实验】SegViT: Semantic Segmentation with Plain Vision Transformers

想要借鉴SegViT官方模型源码部署到本地自己代码文件中 1. 环境配置 官网要求安装mmcv-full1.4.4和mmsegmentation0.24.0 在这之前记得把mmcv和mmsegmentation原来版本卸载 pip uninstall mmcv pip uninstall mmcv-full pip uninstall mmsegmentation安装mmcv 其中&#xff…

旋翼无人机常用仿真工具

四旋翼常用仿真工具 rviz&#xff1a; 简单的质点&#xff08;也可以加上动力学姿态&#xff09;&#xff0c;用urdf模型在rviz中显示无人机和飞行轨迹、地图等。配合ROS代码使用&#xff0c;轻量化适合多机。典型的比如浙大ego-planner的仿真&#xff1a; https://github.c…

Java面试知识点(全)-分布式算法- ZAB算法

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 研究zookeeper时&#xff0c;必须要了解zk的选举和集群间个副本间的数据一致性。 什么是 ZAB 协议&#xff1f; ZAB 协议介绍 ZAB 协议全称&#xf…

树和二叉树

树 逻辑表示方法 树形表示法 文氏图表示法 凹入表示法 括号表示法 性质 树的结点数等于所有结点的度加一 度为m的树中第i层最多有m的(i-1)次方个结点 高度为h的m次树最多的节点数&#xff08;等比数列公式求和&am…

【数据结构】什么是堆,如何使用无序数组生成一个堆?

文章目录 一、堆的概念及其介绍二、如何使用无序序列构建一个堆&#xff1f;三、C语言实现堆的基本操作结构体创建与销毁获取堆顶数据与个数及堆的判空堆的插入与删除 源代码分享 一、堆的概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称&#xff0c;堆通常是一…

公网远程连接Redis数据库【内网穿透】

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转发自cpolar内网穿透的文章&#xff1a;公网远程连接…