这篇文章,我们将通过做一个案例,来增强我们对C++中的类、对象、类中的封装有更深刻地认识。
题目
判断圆与点的关系
题目分析
首先,我们先分析题目。圆与点有几种关系?
3种:
- 点在圆上
- 点在圆内
- 点在圆外
其次,我们来想想怎么用代码来解决它。
我们很容易地可以想到:利用 两点间距离公式 求出点与圆心的距离,然后用这个距离与半径做比较。
此时会出现3种情况,同时也对于着圆与点的3种关系:
- 距离 > 半径 ---- 点在圆外
- 距离 < 半径 ---- 点在圆内
- 距离 = 半径 ---- 点在圆上
好了,题目分析到这就结束了,现在我们来设计代码。
代码实现思路
如果我们用面向过程的C语言,会很容易实现这个功能,因为我们的C语言已经很熟练了。
但我们现在在学习C++,同时也在学习它面对对象的思想。
所以我们看到这个题目的时候或许应该这样思考:
- 题目中需要一个圆 -------------- 我最好设计一个圆类
- 圆的构造需要圆心和半径 ------- 我可以把这2个放在圆类的成员属性中
- 题目中不仅圆有需要坐标(圆心的坐标),点也需要坐标。既然有2次使用, 我不如也设计一个点类
- 圆类有了,点类也有了。我最后再设计一个函数,用来比较它们的关系,这个题目就解完了
代码实现
#include <iostream>;
using namespace std;
//基本思路:
// 1.设计一个点类(记录坐标)
// 2.设计一个圆类
// 3.设计一个函数,判断某点与圆的关系(圆内、圆外、圆上)
//1.设计一个点类
class Point
{
public:
//设置坐标
void SetX(float& newX)
{
x = newX;
}
void SetY(float& newY)
{
y = newY;
}
//返回坐标
float GetX(void)
{
return x;
}
float GetY(void)
{
return y;
}
private:
float x;
float y;
};
//2.设计一个圆类
class Circle
{
public:
void SetRadius(float &myRadius)
{
radius = myRadius;
}
void SetCenter(Point &newCenter)
{
center = newCenter;
}
Point GetCenter(void)
{
return center;
}
float GetRadius(void)
{
return radius;
}
private:
float radius;
Point center;
};
//3.判断某点与圆的关系(圆内、圆外、圆上)
void PointAndCircle(Circle &circle, Point &point)
{
float distance = 0.0f;
//利用 两点间距离公式 , 来计算出2个点的直线距离
distance =
(float)sqrt(pow(circle.GetCenter().GetX() - point.GetX(), 2) +
pow(circle.GetCenter().GetY() - point.GetY(), 2));
//用 点与圆心的直线距离 和 圆的半径 进行对比,求出点与圆的关系
if (distance > circle.GetRadius())
{
cout << "该点在此圆外" << endl;
}
else if (distance < circle.GetRadius())
{
cout << "该点在此圆内" << endl;
}
else
{
cout << "该点在此圆上" << endl;
}
}
int main()
{
Circle cir;
Point pointCenter;
Point pointTem;
float x = 0.0f;
float y = 0.0f;
float r = 0.0f;
//录入圆的信息:
// 1.圆心坐标
// 2.圆的半径
cout << "准备输入圆心的坐标" << endl;
cout << "请输入 x 坐标:";
cin >> x;
cout << "请输入 y 坐标:";
cin >> y;
cout << "准备输入圆的半径:";
cin >> r;
//将用户输入的圆数据,存放入我们的圆中
pointCenter.SetX(x);
pointCenter.SetY(y);
cir.SetCenter(pointCenter);
cir.SetRadius(r);
//录入点的坐标
cout << endl;
cout << "准备需要测试的点的坐标" << endl;
cout << "请输入 x 坐标:";
cin >> x;
cout << "请输入 y 坐标:";
cin >> y;
//将用户输入的点的数据,放入我们的点中
pointTem.SetX(x);
pointTem.SetY(y);
//进行判断并输出结果
PointAndCircle(cir, pointTem);
return 0;
}
运行结果
总结
我们在使用面对对象的语言时,应该使用面对对象的思想去思考问题。因为只有这样,我们才能更好地发挥面对对象语言的优势,写出具有该语言优势的代码,从而提高我们的效率、减少我们的bug。