Міністерство освіти і науки, молоді та спорту України
НУ «Львівська політехніка»
Кафедра АСУ
/
Лабораторна робота №2
На тему: «Перевантаження операцій С++»
Мета роботи: ознайомитись зі способами перевантаження операцій та навчитися використовувати їх при роботі з об’єктами.
Послідовність роботи:
1. Ознайомитись зі способами перевантаження операцій у С++
2. Проаналізувати приклад програми, яка оголошує клас та перевантажує низку операцій над точками у тривимірному просторі. Визначити результат її роботи.
3. Модифікувати текст програми, оголосивши операторні функції друзями класу( якщо це можливо). Запропонувати власні функції друзі-класу.
4. Для заданого варіанта завдання виконати перевантаження операцій для зручності роботи з об’єктами. При необхідності оголосіть певні операторні функції друзями класу.
5. Оформити звіт про роботу за такою структурою:
назва роботи;
мета роботи;
послідовність роботи;
індивідуальне завдання;
текст програми;
контрольний приклад та результати роботи програми;
висновки.
#include <iostream>
#include <assert.h>
using namespace std;
class complex
{
double re, im;
public:
complex(double = 0, double = 0);
~complex();
complex operator + (complex&);
complex operator - (complex&);
complex operator * (complex&);
complex operator / (complex&);
complex operator ^ (unsigned);
friend istream& operator >> (istream&, complex&);
friend ostream& operator << (ostream&, complex&);
};
complex::complex(double r, double i)
{
re = r; im = i;
}
complex::~complex()
{
}
complex complex::operator + (complex& y)
{
return complex(re + y.re, im + y.im);
}
complex complex::operator - (complex& y)
{
return complex(re - y.re, im - y.im);
}
complex complex::operator * (complex& y)
{
return complex(re * y.re - im * y.im, re * y.im + im * y.re);
}
complex complex::operator / (complex& y)
{
double r1 = re, i1 = im, r2 = y.re, i2 = y.im;
return complex((r1 * r2 - i1 * i2) / (r2 * r2 + i2 * i2), (-r1 * i2 + i1 * r2) / (r2 * r2 + i2 * i2));
}
complex complex::operator ^ (unsigned n)
{
complex y(1, 0);
for (unsigned i=1; i<=n; i++) y = y * (*this);
return y;
}
istream& operator >> (istream& is, complex& x)
{
char c;
is>>x.re;
cin>>c;
assert(c == ',');
is>>x.im;
return is;
}
ostream& operator << (ostream& os, complex& x)
{
os<<x.re<<','<<x.im<<endl;
return os;
}
int main()
{
complex a(1, 1), b(1, 1), c(1, 1), x;
cout<<"Insert complex number :"; cin>>x;
cout<<"Result: "<<a*(x^2) + b * x + c<<endl;
system("pause");
return 0;
}
Індивідуальне завдання:
Створити клас – трикутник. У закритій частині описати поля – довжини сторін. Визначити необхідні конструктори, методи доступу, деструктор. Перевантажити потокові операції введення і виведення, операції порівняння за периметром <,> та ==, за площею <=, >= та !=.
Розвязок:
Модифікований код базового класу:
#include <iostream>
#include <assert.h>
using namespace std;
class complex
{
double re, im;
public:
complex(double = 0, double = 0);
~complex();
friend complex operator + (complex&, complex);
friend complex operator - (complex&, complex);
friend complex operator * (complex&, complex);
friend complex operator / (complex&, complex);
friend bool operator == (complex&, complex);
complex operator ^ (unsigned);
friend istream& operator >> (istream&, complex&);
friend ostream& operator << (ostream&, complex&);
};
complex::complex(double r, double i)
{
re = r; im = i;
}
complex::~complex()
{
}
complex operator + (complex& y, complex x)
{
return complex(x.re + y.re, x.im + y.im);
}
complex operator - (complex& y, complex x)
{
return complex(x.re - y.re, x.im - y.im);
}
complex operator * (complex& y, complex x)
{
return complex(x.re * y.re - x.im * y.im, x.re * y.im + x.im * y.re);
}
complex operator / (complex& y, complex x)
{
double r1 = x.re, i1 = x.im, r2 = y.re, i2 = y.im;
return complex((r1 * r2 - i1 * i2) / (r2 * r2 + i2 * i2), (-r1 * i2 + i1 * r2) / (r2 * r2 + i2 * i2));
}
bool operator == (complex& x, complex y)
{
if (x.im == y.im && x.re == ...