
ОП2
.docxГУАП
КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Старший преподователь |
|
|
|
Д.В. Куртяник |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №2 |
АГРЕГАЦИЯ. КОНСТРУКТОРЫ. ПЕРЕГРУЗКА. |
по курсу: ОСНОВЫ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Цель работы : изучение структуры, свойств и видов объектов; изучение способов доступа к полям и правил вызова методов объектов; получение навыков объектно-ориентированного программирования на языке C++.
Задание : используя технологию объектно-ориентированного программирования разработать программу.
Номер варианта – 23
Индивидуальное задание : Реализовать класс для работы с нечеткими числами, которые представляются тройками чисел (х – e1, х, х – e2). Для чисел А = (А – a1, А, А – a2) и В = (В – b1, В, В + b2) реализовать методы:
– вычитание А - В = (А - В - a1 - b1, А - В, А - В + a2 + b2);
– деление А / В = ((А - a1) / (В + b2), А / В, (А + a2) / (В - b2)).
Для выполнения данного задания были созданы два класса.
Класс атрибутов FazzyNumber, содержащий три поля:
e1, x и e2.
Базовый класс, Number , содержит одно поле
F,типа FazzyNumber.
Классы снабжены конструкторами, имеющие значения по умолчанию и списки инициализации.
Для реализации функции преобразования числа , в классеFazzyNumber был создан метод, который изменяет левое и правое число в тройке чисел. Вызывается этот метод с помощью метода в классе Number.
Для реализации методов вычитания и деления , в классе Number были перегружены операторы вычитания , деления и присваивания (т.к. результат вычитания , а затем и деления, присваиваются объекту с).
Интерфейс классов и методы были разделены в разных файлах для удобочитаемости.
Код программы:
Main.cpp
#include "Header.h"
using namespace std;
int main() {
Number a, b; //все виды инициализации
Number c(1, 1, 1);
Number d(0);
a.get(); //Объект класса, вызванный с пустыми значениями
c.get();//Объект класса, вызванный с введёнными значениями
d.get();//Объект класса, вызванный со стандартными значениями
a.exchange_a(); // изменение числа а
b.exchange_b(); // изменение числа b
a.get(); // вызов ихмененённых чисел
b.get();
c = a-b; //применение перегруженного оператора
c.get(); // вызов результата a-b
c = a/b; // применение перегруженного оператора
c.get(); //вызов результата a/b
return 0;
}
Class.h
#include <iostream>
using namespace std;
class FazzyNumber {
public:
FazzyNumber();
FazzyNumber(double e1, double x, double e2);
void set();
void set(double e1, double x, double e2);
void exchange_a();
void exchange_b();
void get();
double x, e1, e2;
};
class Number {
private:
FazzyNumber f;
public:
void get();
void exchange_a();
void exchange_b();
Number();
Number(double e1, double x, double e2);
void set(double e1, double x, double e2);
Number operator =(const Number& c) {
this-> ~Number(); //явно вызываем деструктор для настоящего объекта
new (this) Number(c); //и тут же выделяем новую память настоящему объекту и копируем в неё состояние присваиваемого объекта
return *this;
};
Number operator -(const Number& b) {
Number temp(f.x - b.f.x - f.e1 - b.f.e1, f.x - b.f.x, f.x - b.f.x + f.e2 + b.f.e2);
return temp;
};
Number operator/ (Number& b) {
Number temp((f.x - f.e1) / (b.f.x + b.f.e2), f.x / b.f.x, (f.x + f.e2) / (b.f.x - b.f.e2));
return temp;
}
};
Method.h
FazzyNumber::FazzyNumber() :e1(), x(), e2() //пустой конструктор
{}
FazzyNumber::FazzyNumber(double e1, double x=0, double e2=0) : e1(e1), x(x), e2(e2) //Конструкор со значениями и списком инициализации
{}
void FazzyNumber::set() //сеттер
{
cout << "Enter:";
double a1, a, a2;
cin >> a1 >> a >> a2;
e1 = a1;
x = a;
e2 = a2;
}
void FazzyNumber::exchange_a()
{
e1 = x - e1;
e2 = x - e2;
}
void FazzyNumber::exchange_b()
{
e1 = x - e1;
e2 = x + e2;
}
void FazzyNumber::set(double a1, double a, double a2) //Сеттер
{
e1 = a1;
x = a;
e2 = a2;
}
void FazzyNumber::get() { //Геттер
cout <<endl<< "{" << e1 << "," << x << "," << e2 << "}" << endl;
}
void Number::exchange_a() //преобразование числа
{
f.exchange_a();
}
void Number::exchange_b() //преобразование числа
{
f.exchange_b();
}
void Number::get()
{
f.get();
}
void Number::set(double e1, double x, double e2) // Сеттер (ввод с помощью аргументов)
{
f.set(e1, x, e2);
}
Number::Number() {
f.set();
}
Number::Number(double e1, double x=0, double e2=0) : f(e1, x, e2) //Контсруктор со значениями по умолчанию
{ };
Результат работы программы:
Ввод чиселa a и b и применение всех видов инициализации:
Преобразованные числа a и b:
Результаты вычитания и деления a и b:
Вывод: в ходе лабораторной работы я изучила структуры, свойств и виды объектов;
изучила способы доступа к полям и правила вызова методов объектов;
получила навыки объектно-ориентированного программирования на языке C++.