/* (程序头部注释开始)* 程序的版权和版本声明部分* Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved.* 文件名称: * 作 者: 苗影 * 完成日期: 2012 年 5 月 9 日* 版 本 号: * 对任务及求解方法的描述部分
先建立一个Point(点)类,包含数据成员x,y(坐标点);(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心;(3)编写上述两类中的构造、析构函数及必要的输入输出函数(4)定义友元函数int locate,判断点p在圆c上、圆c内或圆c外,返回值<0圆内,==0圆上,>0 圆外;(5)重载关系运算符(6种)运算符,使之能够按圆的面积比较两个圆的大小;(6)给定一点p,求出该点与圆心相连成的直线与圆的两个交点并输出* 输入描述: * 问题描述: * 程序输出: * 程序头部的注释结束*/
#include <iostream> #define PI 3.1415926 #include<Cmath> using namespace std; class Point //定义坐标点类 { public: Point(){x = 0; y = 0;} Point(double x0, double y0) {x = x0; y = y0;} double getx(){return x;} double gety(){return y;} void setx(double n){x = n;} void sety(double n){y = n;} friend ostream &operator << (ostream & input, Point & c); private: double x, y; //点的横坐标和纵坐标 }; ostream &operator << (ostream & output, Point & c) { output << "Point:(" << c.x << ", " << c.y << ")"; return output; } class Circle : public Point { public: Circle(){r = 0;} Circle(double x0, double y0, double r); double getr(){return r;} friend ostream &operator << (ostream & out, Circle & c); friend double locate(Point &p, Circle &c); friend void crossover_point1(Point &p1,Circle &c1,Point &p4,Point &p5); bool operator > (Circle &t); bool operator < (Circle &t); bool operator >= (Circle &t); bool operator <= (Circle &t); bool operator == (Circle &t); bool operator != (Circle &t); double area(); private: double r; }; Circle :: Circle(double x0, double y0, double r1) : Point(x0, y0), r(r1){} //圆的构造函数定义 ostream &operator << (ostream & output, Circle & c) { output << "以" << "(" << c.getx() << "," << c.gety() << ")" << "为圆心, " << "以" << c.r << "为半径的圆" << endl; return output; } double Circle :: area() //面积的计算{ return PI * r * r; } bool Circle ::operator > (Circle &t) //面积的比较{ if(area() > t.area()) {return true;} else return false; } bool Circle ::operator < (Circle &t) { if(area() < t.area()){return true; } else return false; } bool Circle ::operator >= (Circle &t) { if(area() < t.area()) {return false; } else return true; } bool Circle ::operator <= (Circle &t) { if(area() > t.area()){return false; } else return true; } bool Circle ::operator == (Circle &t) { if(area() >= t.area() && area() <= t.area()) {return true; } else return false; } bool Circle ::operator != (Circle &t) { if(area() > t.area() || area() < t.area()){return true; } else return false; } double locate(Point &p, Circle &c) //点的判断{ double d; d = (p.getx() - c.getx()) * (p.getx() - c.getx()) + (p.gety() - c.gety()) * (p.gety() - c.gety()); return (d - c.getr() * c.getr()); } void crossover_point1(Point &p1,Point &p4,Point &p5, Circle &c1,) //两个交点{ double d; d = c1.getx() + (p1.getx() - c1.getx()) * c1.getr() / sqrt((p1.getx() - c1.getx()) * (p1.getx() - c1.getx()) + (p1.gety() - c1.gety()) * (p1.gety() - c1.gety())); p4.setx(d); d = c1.getx() - (p1.getx() - c1.getx()) * c1.getr() / sqrt((p1.getx() - c1.getx()) * (p1.getx() - c1.getx()) + (p1.gety() - c1.gety()) * (p1.gety() - c1.gety())); p5.setx(d); d = c1.gety() + (p1.gety() - c1.gety()) * c1.getr() / sqrt((p1.getx() - c1.getx()) * (p1.getx() - c1.getx()) + (p1.gety() - c1.gety()) * (p1.gety() - c1.gety())); p4.sety(d); d = c1.gety() - (p1.gety() - c1.gety()) * c1.getr() / sqrt((p1.getx() - c1.getx()) * (p1.getx() - c1.getx()) + (p1.gety() - c1.gety()) * (p1.gety() - c1.gety())); p5.sety(d); } 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; cout << endl; cout << "圆c1: " << c1; if(c1 > c2) cout << "大于" << endl; if(c1 < c2) cout << "小于" << endl; if(c1 >= c2) cout << "大于等于" << endl; if(c1 <= c2) cout << "小于等于" << endl; if(c1 == c2) cout << "等于" << endl; if(c1 != c2) cout << "不等于" << endl; cout << "圆c2: " << c1; cout << endl; Point p4, p5; crossover_point1(p1, c1, p4, p5); cout << "点p1: " << p1; cout << "与圆c1: " << c1; cout << "的圆心相连,与圆交于两点,分别是:" << endl; cout << "交点: " << p4; cout << "交点: " << p5; cout << endl; system("pause"); return 0; }
感言;计算两个交点时真麻烦,还有就是根据别人的思路编的,觉得自己很被动