問題及代碼:
/*
*Copyright (c)2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*文件名稱: 點、圓的關係 .cpp
*作 者:白雲飛
*完成日期:2015年5月21日
*版 本 號:v1.0
*
*問題描述:(1)先建立一個Point(點)類,包含數據成員x,y(座標點);
(2)以Point爲基類,派生出一個Circle(圓)類,增加數據成員(半徑),基類的成員表示圓心;
(3)編寫上述兩類中的構造、析構函數及必要運算符重載函數(本項目主要是輸入輸出);
(4)定義友元函數int locate,判斷點p與圓的位置關係(返回值<0圓內,==0圓上,>0 圓外);
*程序輸入:座標
*程序輸出:判斷座標與圓的關係
*/
#include <iostream>
#include<cmath>
using namespace std;
class Point
{
protected:
double x;
double y;
public:
Point(double a=0,double b=0):x(a),y(b) {}
double distance(const Point&a) const;
friend ostream & operator<<(ostream &,const Point &);
};
double Point::distance(const Point&a) const
{
return sqrt((x-a.x)*(x-a.x)+(y-a.y)*(y-a.y));
}
ostream & operator<<(ostream &output,const Point &p)
{
output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}
class Circle:public Point
{
protected:
double radius;
public:
Circle(double a=0,double b=0,double r=0):Point(a,b),radius(r) {}
friend ostream &operator<<(ostream &,const Circle &);
friend int locate(const Point&a,const Circle&b);
};
ostream &operator<<(ostream &output,const Circle &c)
{
output<<"["<<c.x<<", "<<c.y<<"], r="<<c.radius<<endl;
return output;
}
int locate(const Point& a,const Circle&b)
{
const Point z(b.x,b.y);
double d = z.distance(a);
if (d ==b.radius)
return 0;
else if (d < b.radius)
return -1;
else
return 1;
}
int main( )
{
Circle c1(3,2,4),c2(4,5,5); //c2應該大於c1
Point p1(1,1),p2(3,-2),p3(7,3); //分別位於c1內、上、外
cout<<"圓c1: "<<c1;
cout<<"點p1: "<<p1;
cout<<"點p1在圓c1之"<<((locate(p1, c1)>0)?"外":((locate(p1, c1)<0)?"內":"上"))<<endl;
cout<<"點p2: "<<p2;
cout<<"點p2在圓c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"內":"上"))<<endl;
cout<<"點p3: "<<p3;
cout<<"點p3在圓c1之"<<((locate(p3, c1)>0)?"外":((locate(p3, c1)<0)?"內":"上"))<<endl;
return 0;
}
運行結果:
學習心得:
distance的函數作爲Point類的成員函數比較方便。