Міністерство освіти і науки, молоді та спорту України
НУ «Львівська політехніка»
Кафедра АСУ
/
Лабораторна робота №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 == y.re) return true;
else return false;
}
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), d(1,2), x;
cout<<"Insert complex number :"; cin>>x;
cout<<"Result: "<<a*(x^2) + b * x + c<<endl;
if (c==a) cout<<"c = a"<<endl;
else cout<<"c != a"<<endl;
if (b==d) cout<<"b = d"<<endl;
else cout<<"b != d"<<endl;
system("pause");
return 0;
}
/
Індивідуальне завдання:
#include <iostream>
using namespace std;
class triangle
{
double a, b, c;
public:
void set_a(double);
void set_b(double);
void set_c(double);
double get_a();
double get_b();
double get_c();
double area();
double area(double, double, double);
double perimeter();
double perimeter(double, double, double);
bool operator <= (triangle);
bool operator >= (triangle);
bool operator != (triangle);
bool operator < (triangle);
bool operator > (triangle);
bool operator == (triangle);
triangle(double a1, double a2, double a3);
~triangle() {}
};
void triangle::set_a(double temp)
{
a = temp;
}
void triangle::set_b(double temp)
{
b = temp;
}
void triangle::set_c(double temp)
{
c = temp;
}
double triangle::get_a()
{
return a;
}
double triangle::get_b()
{
return b;
}
double triangle::get_c()
{
return c;
}
double triangle::area()
{
double p = (a + b + c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
double triangle::area(double x, double y, double z)
{
double p = (y + x + z)/2;
return sqrt(p*(p-x)*(p-y)*(p-z));
}
double triangle::perimeter()
{
return a + b + c;
}
double triangle::perimeter(double x, double y, double z)
{
return x + y + z;
}
bool triangle::operator <= (triangle ob)
{
if (area()<=area(ob.a, ob.b, ob.c)) return true;
else return false;
}
bool triangle::operator >= (triangle ob)
{
if (area()>=area(ob.a, ob.b, ob.c)) return true;
else return false;
}
bool triangle::operator != (triangle ob)
{
if (area()!=area(ob.a, ob.b, ob.c)) return true;
else return false;
}
bool triangle::operator < (triangle ob)
{
if (perimeter()<perimeter(ob.a, ob.b, ob.c)) return true;
else return false;
}
bool triangle::operator > (triangle ob)
{
if (perimeter()>perimeter(ob.a, ob.b, ob.c)) return true;
else return false;
}
bool triangle::operator == (triangle ob)
{
if (perimeter()==perimeter(ob.a, ob.b, ob.c)) return true;
else return false;
}
triangle::triangle(double a1, double a2, double a3)
{
a = a1;
b = a2;
c = a3;
}
int main()
{
triangle a(4,5,6), b(7,8,9), c(7,7,10), d(6,5,4);
cout<<"Start data:"<<endl;
cout<<"Triangle 1: area("<<a.area()<<"), perimeter("<<a.perimeter()<<")"<<endl;
cout<<"Triangle 1: area("<<b.area()<<"), perimeter("<<b.perimeter()<<")"<<endl;
cout<<"Triangle 1: area("<<c.area()<<"), perimeter("<<c.perimeter()<<")"<<endl;
cout<<"Triangle 1: area("<<d.area()<<"), perimeter("<<d.perimeter()<<")"<<endl;
cout<<"End data\n"<<endl;
if (a > b) cout<<"Perimeter A > perimeter B"<<endl;
if (a > c) cout<<"Perimeter A > perimeter C"<<endl;
if (a > d) cout<<"Perimeter A > perimeter D"<<endl;
if (a < b) cout<<"Perimeter A < perimeter B"<<endl;
if (a < c) cout<<"Perimeter A < perimeter C"<<endl;
if (a < d) cout<<"Perimeter A < perimeter D"<<endl;
if (a == b) cout<<"Perimeter A = perimeter B"<<endl;
if (a == c) cout<<"Perimeter A = perimeter C"<<endl;
if (a == d) cout<<"Perimeter A = perimeter D"<<endl;
if (a >= b) cout<<"Area A >= area B"<<endl;
if (a >= c) cout<<"Area A >= area C"<<endl;
if (a >= d) cout<<"Area A >= area D"<<endl;
if (a <= b) cout<<"Area A <= area B"<<endl;
if (a <= c) cout<<"Area A <= area C"<<endl;
if (a <= d) cout<<"Area A <= area D"<<endl;
if (a != b) cout<<"Area A != area B"<<endl;
if (a != c) cout<<"Area A != area C"<<endl;
if (a != d) cout<<"Area A != area D"<<endl;
system("pause");
return 0;
}
/
Висновок:
На даній лабораторній роботі я навчився перевантажувати оператори по відношенню до об’єкта. Також я навчився оголошувати та використовувати дружні функції.