#include <iostream>
#include <conio.h>
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
using namespace std;
class Circle
{
// Элементы данных:
float x, y, r;
/* дружественные функции ввода и вывода (эти функции должны быть именно дружественными, поскольку левым операндом операции является ссылка на поток, а не окружность): */
friend istream& operator >> (istream&, Circle&);
friend ostream& operator << (ostream&, const Circle&);
//функции – члены класса:
public:
//конструкторы:
// два в одном: основной конструктор и конструктор по умолчанию
Circle(float xx=0, float yy=0, float rr=5):x(xx),y(yy),r(rr) {}
Circle(const Circle &); //конструктор копирования
//деструктор:
~Circle(){}
// функции доступа:
void Set_x(float xx) {x=xx;}
void Set_y(float yy) {y=yy;}
void Set_r(float rr) {r=rr;}
float Get_x() {return x;}
float Get_y() {return y;}
float Get_r() {return r;}
// функции – члены класса, обеспечивающие ввод-вывод:
void input();
void output();
// перегрузка операций:
// операция присваивания =:
Circle& operator = (const Circle &);
//операция +:
Circle operator + (const Circle &);
// операция +=:
Circle& operator += (const Circle &);
//прочие функции:
float Area() {return M_PI*r*r;}
float Line() {return 2*M_PI*r;}
|
|
float Mass_Center(int, const Circle*);
};
// Определение функций:
// перегрузка оператора присваивания:
Circle& Circle::operator = (const Circle &obj)
{
if (this!= &obj) // проверка на самоприсваивание (типа с1 = с1;)
{ /* в данном случае просто элементы данных того объекта, который будет стоять слева от знака присваивания (this), становятся равными элементам данных объекта, который будет стоять справа от знака присваивания (obj) */
x=obj.x; y=obj.y; r=obj.r;
}
return *this; /* функция возвращает текущий объект, это позволит выполнять множественное присваивание типа c1 = c2 = c3 */
}
/* перегрузка операции сложения окружностей */
Circle Circle::operator + (const Circle &obj)
{
Circle tmp;
tmp.x = x + obj.x;
tmp.y = y + obj.y;
tmp.r = r + obj.r;
return tmp; /* функция возвращает временный объект, который будет существовать в памяти только во время выполнения операции*/
}
/* перегрузка операции сложения c присваиванием (эта функция позволит изменять параметры окружности, увеличивая или уменьшая их, одной операцией): */
Circle& Circle::operator += (const Circle &obj)
{
x += obj.x;
y += obj.y;
r += obj.r;
return *this; //функция возвращает текущий объект
}
/* функция, которая вычисляет усредненное расстояние от заданной точки (центра текущей окружности) до множества точек (центров других окружностей), так называемый “центр масс” окружностей, по формуле:
*/
float Circle::Mass_Center(int n, const Circle* obj)
//параметрами функции являются количество точек и массив точек
{
float sum = 0;
for (int i=0; i<n; i++)
sum+=sqrt((x + obj[i].x)*(x + obj[i].x)+ (y + obj[i].y)*(y + obj[i].y));
sum/=n;
return sum;
}
// Определение дружественных функций ввода-вывода:
istream& operator >> (istream& is, Circle& obj)
{
cout << "Задайте x:" << endl;
is >> obj.x;
cout << "Задайте y:" << endl;
|
|
is >> obj.y;
do
{
cout << "Задайте r:" << endl;
is >> obj.r;
}while(obj.r<0);
return is;
}
ostream& operator << (ostream& os, const Circle& obj)
{
os << "Значение x:" << obj.x << endl;
os << "Значение y:" << obj.y << endl;
os << "Значение r:" << obj.r << endl;
return os;
}
// Конструктор копирования:
Circle::Circle(const Circle& obj)
{
x=obj.x; y=obj.y; r=obj.r;
}
// Функции-члены класса для ввода и вывода:
void Circle::input()
{
cout << "Задайте x:" << endl;
cin >> x;
cout << "Задайте y:" << endl;
cin >> y;
cout << "Задайте r:" << endl;
cin >> r;
}
void Circle::output()
{
cout << "Значение x:" << x << endl;
cout << "Значение y:" << y << endl;
cout << "Значение r:" << r << endl;
}
// пример программы, которая использует класс Circle:
int main()
{
//Настройки шрифтов и региональных стандартов:
if(SetConsoleCP(1251)==0)
//проверка правильности установки кодировки символов для ввода
{
cerr<<"Fialed to set codepage!"<<endl;
/* если не удалось установить кодовую страницу, вывод сообщения об ошибке */
}
if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода
{
cerr<<"Failed to set OUTPUT page!"<<endl;
}
Circle a;
//пример использования основного конструктора:
a.output();
Circle b(5.6, 7.2, 3.7);
b.output();
// пример использования конструктора копирования:
Circle c(b);
c.output();
//пример использования операции присваивания:
b = a;
b.output();
// пример использования дружественных функций ввода-вывода:
cin >> c;
cout << c;
// пример использования функции, вычисляющей “Центр масс” окружностей:
int k=3;
Circle* CM = new Circle[k]; // массив окружностей
for (int i=0; i<k; i++)
cin >> CM[i];
cout << "Центр масс окружностей:" << c.Mass_Center(k,CM)<< endl;
delete [] CM;
// пример применения операции сложения окружностей:
c = a + b;
cout << c;
c += a;
cout << c;
// пример применения функций доступа:
a.input();
a.output();
float xx,yy,rr;
cout << "Задайте значение x:" << endl;
cin >> xx;
cout << "Задайте значение y:" << endl;
cin >> yy;
cout << "Задайте значение r:" << endl;
cin >> rr;
// Изменяем параметры окружностей:
a.Set_x(xx);
a.Set_y(yy);
a.Set_r(rr);
cout << "Значение x=" << a.Get_x() << endl;
cout << "Значение y=" << a.Get_y() << endl;
cout << "Значение r=" << a.Get_r() << endl;
a.output(); // Пример использования вычислительных функций:
cout << "Площадь окружности:" << a.Area() << endl;
cout << "Длина окружности:" << a.Line() << endl;
_getch();
return 0;
}