Учебные материалы по математике | Создание простых динамических структур данных | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Создание простых динамических структур данных


·  Должны иметь общий виртуальный метод Print, печатающий параметры фигуры и ее тип в стандартный поток вывода cout.

·  Должный иметь общий виртуальный метод расчета площади фигуры – Square.

·  Должны иметь конструктор, считывающий значения основных параметров фигуры из стандартного потока cin.

·  Должны быть расположенны в раздельных файлах: отдельно заголовки (.h), отдельно описание методов (.cpp).

Программа должна позволять вводить фигуру каждого типа с клавиатуры, выводить параметры фигур на экран и их площадь.

Полезный пример

Данный пример демонстрирует основные возможности языка C++, которые понадобится применить в данной лабораторной работе. Пример не является решением варианта лабораторной работы.

Листинг файла Figure. h

#ifndef FIGURE_H

#define FIGURE_H

class Figure {

public:

virtual double Square() = 0;

virtual void Print() = 0;

};

#endif /* FIGURE_H */

Листинг файла Triangle. h

#ifndef TRIANGLE_H

#define TRIANGLE_H

#include <cstdlib>

#include <iostream>

#include "Figure. h"

class Triangle : public Figure{

public:

Triangle();

Triangle(std::istream &is);

Triangle(size_t i, size_t j, size_t k);

Triangle(const Triangle& orig);

double Square() override;

void Print() override;

virtual ~Triangle();

private:

size_t side_a;

size_t side_b;

size_t side_c;

};

#endif /* TRIANGLE_H */

Листинг файла Triangle. cpp

#include "Triangle. h"

#include <iostream>

#include <cmath>

Triangle::Triangle() : Triangle(0, 0, 0) {

}

Triangle::Triangle(size_t i, size_t j, size_t k) : side_a(i), side_b(j), side_c(k) {

std::cout << "Triangle created: " << side_a << ", " << side_b << ", " << side_c << std::endl;

}

Triangle::Triangle(std::istream &is) {

is >> side_a;

is >> side_b;

is >> side_c;

}

Triangle::Triangle(const Triangle& orig) {

std::cout << "Triangle copy created" << std::endl;

side_a = orig. side_a;

side_b = orig. side_b;

side_c = orig. side_c;

}

double Triangle::Square() {

double p = double(side_a + side_b + side_c) / 2.0;

return sqrt(p * (p — double(side_a))*(p — double(side_b))*(p — double(side_c)));

}

void Triangle::Print() {

std::cout << "a=" << side_a << ", b=" << side_b << ", c=" << side_c << std::endl;

}

Triangle::~Triangle() {

std::cout << "Triangle deleted" << std::endl;

}

Листинг файла main. cpp

#include <cstdlib>

#include "Triangle. h"

int main(int argc, char** argv) {

Figure *ptr = new Triangle(std::cin);

ptr->Print();

std::cout << ptr->Square() << std::endl;

delete ptr;

return 0;

}

Лабораторная работа №2

Цель работы

Целью лабораторной работы является:

·  Закрепление навыков работы с классами.

·  Создание простых динамических структур данных.

·  Работа с объектами, передаваемыми «по значению».

Задание

Необходимо спроектировать и запрограммировать на языке C++ класс-контейнер первого уровня, содержащий одну фигуру ( колонка фигура 1), согласно вариантов задания (реализованную в ЛР1).

Классы должны удовлетворять следующим правилам:

·  Требования к классу фигуры аналогичны требованиям из лабораторной работы 1.

·  Классы фигур должны иметь переопределенный оператор вывода в поток std::ostream (<<). Оператор должен распечатывать параметры фигуры (тип фигуры, длины сторон, радиус и т. д).

·  Классы фигур должны иметь переопределенный оператор ввода фигуры из потока std::istream (>>). Оператор должен вводить основные параметры фигуры (длины сторон, радиус и т. д).

·  Классы фигур должны иметь операторы копирования (=).

·  Классы фигур должны иметь операторы сравнения с такими же фигурами (==).

·  Класс-контейнер должен соджержать объекты фигур “по значению” (не по ссылке).

·  Класс-контейнер должен иметь метод по добавлению фигуры в контейнер.

·  Класс-контейнер должен иметь методы по получению фигуры из контейнера (опеределяется структурой контейнера).

·  Класс-контейнер должен иметь метод по удалению фигуры из контейнера (опеределяется структурой контейнера).

·  Класс-контейнер должен иметь перегруженный оператор по выводу контейнера в поток std::ostream (<<).

·  Класс-контейнер должен иметь деструктор, удаляющий все элементы контейнера.

·  Классы должны быть расположенны в раздельных файлах: отдельно заголовки (.h), отдельно описание методов (.cpp).

Нельзя использовать:

·  Стандартные контейнеры std.

·  Шаблоны (template).

·  Различные варианты умных указателей (shared_ptr, weak_ptr).

Программа должна позволять:

·  Вводить произвольное количество фигур и добавлять их в контейнер.

·  Распечатывать содержимое контейнера.

·  Удалять фигуры из контейнера.

Полезный пример

Данный пример демонстрирует основные возможности языка C++, которые понадобится применить в данной лабораторной работе. Пример не является решением варианта лабораторной работы.

Листинг Файла TStack. h

#ifndef TSTACK_H

#define TSTACK_H

#include "Triangle. h"

#include "TStackItem. h"

class TStack {

public:

TStack();

TStack(const TStack& orig);

void push(Triangle &&triangle);

bool empty();

Triangle pop();

friend std::ostream& operator<<(std::ostream& os, const TStack& stack);

virtual ~TStack();

private:

TStackItem *head;

};

#endif /* TSTACK_H */

Листинг Файла TStack. cpp

#include "TStack. h"

TStack::TStack() : head(nullptr) {

}

TStack::TStack(const TStack& orig) {

head = orig. head;

}

std::ostream& operator<<(std::ostream& os, const TStack& stack) {

TStackItem *item = stack. head;

while(item!=nullptr)

{

os << *item;

item = item->GetNext();

}

return os;

}

void TStack::push(Triangle &&triangle) {

TStackItem *other = new TStackItem(triangle);

other->SetNext(head);

head = other;

}

bool TStack::empty() {

return head == nullptr;

}

Triangle TStack::pop() {

Triangle result;

if (head!= nullptr) {

TStackItem *old_head = head;

head = head->GetNext();

result = old_head->GetTriangle();

old_head->SetNext(nullptr);

delete old_head;

}

return result;

}

TStack::~TStack() {

delete head;

}

Листинг Файла TStackItem. h

#ifndef TSTACKITEM_H

#define TSTACKITEM_H

#include "Triangle. h"

class TStackItem {

public:

TStackItem(const Triangle& triangle);

TStackItem(const TStackItem& orig);

friend std::ostream& operator<<(std::ostream& os, const TStackItem& obj);

TStackItem* SetNext(TStackItem* next);

TStackItem* GetNext();

Triangle GetTriangle() const;

virtual ~TStackItem();

private:

Triangle triangle;

TStackItem *next;

};

#endif /* TSTACKITEM_H */

Листинг Файла TStackItem. cpp

#include "TStackItem. h"

#include <iostream>

TStackItem::TStackItem(const Triangle& triangle) {

this->triangle = triangle;

this->next = nullptr;

std::cout << "Stack item: created" << std::endl;

}

TStackItem::TStackItem(const TStackItem& orig) {

this->triangle = orig. triangle;

this->next = orig. next;

std::cout << "Stack item: copied" << std::endl;

}

TStackItem* TStackItem::SetNext(TStackItem* next) {

TStackItem* old = this->next;

this->next = next;

return old;

}

Triangle TStackItem::GetTriangle() const {

return this->triangle;

}

TStackItem* TStackItem::GetNext() {

return this->next;

}

TStackItem::~TStackItem() {

std::cout << "Stack item: deleted" << std::endl;

delete next;

}

std::ostream& operator<<(std::ostream& os, const TStackItem& obj) {

os << "[" << obj. triangle << "]" << std::endl;

return os;

}

Листинг Файла Triangle. h

#ifndef TRIANGLE_H

#define TRIANGLE_H

#include <cstdlib>

#include <iostream>

class Triangle {

public:

Triangle();

Triangle(size_t i, size_t j, size_t k);

Triangle(const Triangle& orig);

Triangle& operator++();

double Square();

friend Triangle operator+(const Triangle& left, const Triangle& right);

friend std::ostream& operator<<(std::ostream& os, const Triangle& obj);

friend std::istream& operator>>(std::istream& is, Triangle& obj);

Triangle& operator=(const Triangle& right);

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020

А ты боишься COVID-19?

 Пройди опрос и получи промокод