学习友元函数的定义与调用,理解友元函数的意义。
- 友元函数时在类中用关键字 friend修饰的函数,是类的非成员函数,但是它可以通过对象名访问类的私有和保护成员
- 利用圆心距与两圆半径之间的关系来判断两圆的位置关系。假设
d
c
dc
dc为圆心距,
R
R
R与
r
r
r分别是两圆的半径,则:
(1) d c > R + r dc > R + r dc>R+r,两圆外离;
(2) d c = R + r dc = R + r dc=R+r,两圆外切;
(3) ∣ R – r ∣ < d c < R + r |R – r| < dc < R + r ∣R–r∣<dc<R+r,两圆相交;
(4) d c = ∣ R – r ∣ dc = |R – r| dc=∣R–r∣,两圆内切;
(5) 0 < = d c < ∣ R – r ∣ 0 <= dc < |R – r| 0<=dc<∣R–r∣,两圆内含。
题目:定义一个表示圆的类
C
i
r
c
l
e
Circle
Circle,包含
x
,
y
,
r
x,y,r
x,y,r三个私有变量,分别为圆心
x
x
x坐标,圆心
y
y
y坐标和圆半径。声明
C
i
r
c
l
e
Circle
Circle类的两个友元函数
d
i
s
t
a
n
c
e
distance
distance和
r
e
l
a
t
i
o
n
relation
relation,分别计算两圆圆心位置和判断两圆位置关系。
要求:
- 两圆的参数 x , y , r x,y,r x,y,r从命令行读入;
- 程序具有健壮性;
- 测试五种位置关系。
注意:浮点数之间做比较考虑精度问题。
#include <iostream>
#include <cmath>
using namespace std;
class Circle {
private:
double x, y, r;
public:
Circle() {
double xx, yy, rr;
cout << "Please enter the center coordinates (x,y) and the radius:" << endl; //提示输入圆心坐标与半径
cin >> xx >> yy >> rr;
if (rr > 0) { //检查圆半径值是否合理
x = xx;
y = yy;
r = rr;
cout << "center coordinates:" << "(" << x << "," << y << ") " << "radius:" << r <<"\n"<< endl; //显示圆的坐标与半径
}
else {
cout << "the radius is wrong " << endl;
}
}
friend double distance(Circle &c1, Circle &c2);
friend void relation(Circle &c1, Circle &c2);
};
/* distance函数:计算两圆圆心距离 */
double distance(Circle &c1, Circle &c2) {
double dc;
dc = sqrt((c1.x - c2.x)*(c1.x - c2.x )+(c1.y - c2.y)*(c1.y - c2.y));
return dc;
}
/* relation函数:判断两圆位置关系 */
void relation(Circle &c1, Circle &c2) {
if (distance(c1, c2) - (c1.r + c2.r)>0) {
cout << "两圆外离" << endl;
}
else if (distance(c1, c2) == (c1.r + c2.r)) {
cout << "两圆外切" << endl;
}
else if ((fabs(c1.r - c2.r) - distance(c1, c2)<0) && (distance(c1, c2) - (c1.r + c2.r)<0)) {
cout << "两圆相交" << endl;
}
else if (distance(c1, c2) == abs(c1.r - c2.r)) {
cout << "两圆内切" << endl;
}
else {
cout << "两圆内含" << endl;
}
}
int main()
{
Circle C1; // 第一个圆
Circle C2; // 第二个园
distance(C1, C2); // 计算距离
cout << "the distance of two circle is " << distance(C1, C2) << endl;
relation(C1, C2);
return 0;
}
依次输入两圆的坐标和半径
第一个圆圆心
(
0.1
,
0.1
)
(0.1, 0.1)
(0.1,0.1),半径
6
6
6
第二个圆圆心
(
10
,
10
)
(10,10)
(10,10),半径
1
1
1
代入公式计算,得圆心距离为
14.0007
14.0007
14.0007,大于两圆半径之和,所以外离
同理,以下是另外4组测试数据