题目的主要信息:
- 有圆类(Circle)和点类(Pointer),请在圆类中实现一个 isPointerInCircle方法,该方法传入一个点类对象,判断点和圆的关系,并在该方法中输出in 或者 on 或者out
- 点类(Pointer):
成员变量:x轴坐标(int x) y轴坐标(int y)
成员方法:成员变量的公共访问方法
- 圆类(Circle):
成员变量:圆心(Point center) 半径(int radius)
成员方法:成员变量的公共访问方法 判断点和圆关系的方法(isPointerInCircle)
具体做法:
点类的成员变量定义好了,属于private,不允许直接访问,所幸定义了访问和修改点横纵坐标的public成员方法。
圆类成员变量也定义好了,属于private,定义了修改变量的方法,获取变量的方法在本题用不着,出题者没写我们也不用加。我们需要做的就是写判断点与圆的距离关系,然后输出,这就是isPointerInCircle方法。
我们需要做的起始就是计算点到圆心的距离,然后判断这个距离与半径的关系:
两点距离公式为: ,我们直接根据Pointer类的获取横纵坐标的方法得到两个点的坐标,再上述平方相加开方即可,开方函数用到了cmath库中的sqrt()。同时为了更准确,我们用double来比较。
#include <iostream>
#include <cmath>
using namespace std;
// 点类
class Pointer {
private:
int x; // x 坐标
int y; // y 坐标
public:
void setX(int x) {
this->x = x;
}
int getX() {
return x;
}
void setY(int y) {
this->y = y;
}
int getY() {
return y;
}
};
// 圆类
class Circle {
private:
Pointer center; // 圆心
int radius; // 半径
public:
void setCenter(int x, int y) {
center.setX(x);
center.setY(y);
}
void setRadius(int radius) {
this->radius = radius;
}
// write your code here......
void isPointerInCircle(Pointer p){
//计算圆心到点的距离
double dis = (center.getX() - p.getX()) * (center.getX() - p.getX()) + (center.getY() - p.getY()) * (center.getY() - p.getY());
dis = sqrt(dis);
//比较距离与半径的大小关系
if(dis == (double)radius)
cout << "on" << endl;
else if(dis > (double)radius)
cout << "out" << endl;
else
cout << "in" << endl;
}
};
int main() {
// 键盘输入点的坐标
int x, y;
cin >> x;
cin >> y;
// 创建一个点
Pointer p;
p.setX(x);
p.setY(y);
// 创建一个圆
Circle c;
c.setCenter(5, 0);
c.setRadius(5);
// 判断点和圆的关系
c.isPointerInCircle(p);
return 0;
}
复杂度分析:
- 时间复杂度:,直接计算,常数时间
- 空间复杂度:,常数空间