Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОП2

.docx
Скачиваний:
0
Добавлен:
12.04.2025
Размер:
31.84 Кб
Скачать

ГУАП

КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

Старший преподователь

Д.В. Куртяник

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №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++.

Соседние файлы в предмете Основы программирования