Главная страница

№1 Лабораторная работа Алгоритмы и структуры данных (2). Отчет по лабораторной работе 1 по Алгоритмам и структурам данных


Скачать 23.85 Kb.
НазваниеОтчет по лабораторной работе 1 по Алгоритмам и структурам данных
Дата01.06.2022
Размер23.85 Kb.
Формат файлаdocx
Имя файла№1 Лабораторная работа Алгоритмы и структуры данных (2).docx
ТипОтчет
#562566


Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего образования
«Новосибирский государственный технический университет»

Кафедра Автоматизированных систем управления

Отчет

по лабораторной работе №1

по Алгоритмам и структурам данных

Выполнил Проверил

студенты гр. АП-026 Ландовский В.В.

Губарев Артём

Заикин Данил

г. Новосибирск

2022г.

Приложение (исходный код программ)

Содержимое файла Matrix.h

#pragma once

#include

class Matrix

{

int ** A;

int n, m;

public :

Matrix(int n, int m);

Matrix();

void FillMatrix();

void PrintMatrix();

void SwapLines(int number_row_1, int number_row_2);

};

Содержимое файла Matrix.cpp

#include "Matrix.h"

Matrix::Matrix(int n, int m)

{

this->n = n;

this->m = m;

A = new int*[n];

for (int i = 0; i < n; i++)

{

A[i] = new int[m];

}

}

Matrix::Matrix()

{

for (int i = 0; i < n; i++)

{

delete[] A[i];

}

delete[] A;

}

void Matrix:: FillMatrix()

{

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

A[i][j] = rand() % 100;

}

}

}

void Matrix:: PrintMatrix()

{

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

std::cout << A[i][j] << " ";

}

std::cout << std::endl;

}

}

void Matrix::SwapLines(int number_row_1, int number_row_2)

{

int *tmp = A[number_row_1];

A[number_row_1] = A[number_row_2];

A[number_row_2] = tmp;

}

Содержимое файла Stack.h

#pragma once

#include

class Stack

{

int count, size;

int* values;

public:

Stack(int size);

int get_count();

int get_size();

bool isEmpty();

void push(int value);

int pop();

void clear();

void print();

};

Содержимое файла Stack.cpp

#include "Stack.h"

Stack :: Stack (int size)

{

this->size = size;

count = 0;

values = new int[size];

}

int Stack :: get_count()

{

return count;

}

int Stack:: get_size()

{

return size;

}

bool Stack:: isEmpty()

{

if (count == 0) return true;

else return false;

}

void Stack::push(int value)

{

if (count == size)

{

throw std::exception("Stack overflow!");

}

values[count] = value;

count++;

}

int Stack::pop()

{

if (isEmpty())

{

throw std::exception("Stack is empty!");

}

count--;

return values[count];

}

void Stack::clear()

{

while (count != 0)

{

pop();

count--;

}

}

void Stack::print()

{

for (int i = 0; i < count; i++)

std::cout << values[i] << std::endl;

}

Содержимое файла List.h

#pragma once

#include

struct Node {

int val;

Node* next;

Node(int _val) : val(_val), next(nullptr) {}

};

class List

{

Node* first;

Node* last;

bool is_empty() {

return first == nullptr;

}

public:

List() : first(nullptr), last(nullptr) {}

void push_back(int _val) {

Node* p = new Node(_val);

if (is_empty()) {

first = p;

last = p;

return;

}

last->next = p;

last = p;

}

void print() {

if (is_empty()) return;

Node* p = first;

while (p) {

std :: cout << p->val << " ";

p = p->next;

}

std :: cout << std :: endl;

}

void remove_last() {

if (is_empty()) return;

if (first == last) {

remove_first();

return;

}

Node* p = first;

while (p->next != last) p = p->next;

p->next = nullptr;

delete last;

last = p;

}

void remove_first() {

if (is_empty()) return;

Node* p = first;

first = p->next;

delete p;

}

Node* operator[] (const int index) {

if (is_empty()) return nullptr;

Node* p = first;

for (int i = 0; i < index; i++) {

p = p->next;

if (!p) return nullptr;

}

return p;

}

};

Содержимое файла Queue.h

#pragma once

#include

#include

using namespace std;

template

class Queue

{

private:

T* p; // динамический массив

int count; // количество элементов в очереди

public:

// конструктор по умолчанию

Queue()

{

count = 0; // очередь пустая

}

// конструктор копирования

Queue(const Queue& obj)

{

// скопировать obj в текущий объект

count = obj.count;

try {

// попытка выделить память для p

p = new T[count];

// заполнить значениями

for (int i = 0; i < count; i++)

p[i] = obj.p[i];

}

catch (bad_alloc e)

{

// если память не выделена, то вывести текст ошибки

cout << e.what() << endl;

count = 0; // создать пустую очередь

}

}

// добавить элемент в очередь

void push(T item)

{

T* p2; // объявить дополнительный указатель

p2 = p; // перенаправить дополнительный указатель на p

try {

// попытка выделить новый фрагмент памяти для p, но на 1 больше

p = new T[count + 1];

// скопировать данные из участка на который указывает p2 (старые данные)

// в участок, на который указывает p

for (int i = 0; i < count; i++)

p[i] = p2[i];

// скопировать последний элемент

p[count] = item;

// увеличить количество элементов на 1

count++;

// освободить предварительно выделенную память

if (count > 1)

delete[] p2;

}

catch (bad_alloc e)

{

// если память не выделена

cout << e.what() << endl; // вывести сообщение об ошибке

// вернуть старый указатель на p

p = p2;

}

}

// вытянуть первый элемент из очереди

T pop()

{

if (count == 0)

return 0;

// заполнить элемент, который вытягивается из очереди

T item;

item = p[0];

// сформировать новый участок памяти, который на 1 меньше

try {

T* p2;

// попытка выделить пам'ять

p2 = new T[count - 1];

count--; // уменьшить количество элементов в очереди

// p=>p2

for (int i = 0; i < count; i++)

p2[i] = p[i + 1]; // копируются все кроме первого элемента

// освободить участок, на который указывает p

if (count > 0)

delete[] p;

// перенаправить p на p2

p = p2;

// вернуть item

return item;

}

catch (bad_alloc e)

{

// если память не выделилась, то вернуть 0

cout << e.what() << endl;

return 0;

}

}

// операторная функция operator=(),

// реализует присваивание объектов типа Queue

Queue& operator=(const Queue& obj)

{

T* p2; // указатель на дополнительную память

try {

// попытка выделить новый участок памяти для p2

p2 = new T[obj.count];

// если память выделена успешно,

// можно освобождать предварительно выделенную память для p

if (count > 0)

delete[] p;

// скопировать obj в текущий объект

p = p2; // перенаправить p на p2

count = obj.count;

// заполнить значениями

for (int i = 0; i < count; i++)

p[i] = obj.p[i];

}

catch (bad_alloc e)

{

// если память не выделилась, то вывести соответствующее сообщение

cout << e.what() << endl;

}

return *this; // вернуть текущий объект

}

// деструктор

Queue()

{

if (count > 0)

delete[] p;

}

// взять первый элемент из очереди не вытягивая его

T GetItem()

{

if (count > 0)

return p[0];

else

return 0;

}

// очистка очереди

void clear()

{

if (count > 0)

{

delete[] p;

count = 0;

}

}

// проверка существования элементов в очереди

bool IsEmpty()

{

return count == 0;

}

// количество элементов в очереди

int GetN()

{

return count;

}

// метод, выводящий очередь

void print(const char* objName)

{

cout << "Object: " << objName << endl;

for (int i = 0; i < count; i++)

cout << p[i] << "\t";

cout << endl;

cout << "---------------------" << endl;

}

};

Содержимое файла StackOnList.h

#pragma once

#include

#include "List.h"

class StackOnList

{

List values;

int count;

public:

StackOnList()

{

count = 0;

}

int get_count()

{

return count;

}

bool isEmpty()

{

return (count == 0);

}

void push(int value)

{

values.push_back(value);

count++;

}

int pop()

{

if (isEmpty())

{

throw std ::exception("Stack is empty!");

}

values.remove_last();

count--;

return values[count]->val;

}

void print()

{

for (int i = 0; i < count; i++)

std::cout << values[i]->val << std::endl;

}

};

main.cpp

#include

#include "Stack.h"

#include "Matrix.h"

#include "List.h"

#include "StackOnList.h"

#include "Queue.h"

void test_Stack()

{

try

{

Stack stack(4);

stack.push(2);

stack.push(7);

stack.push(5);

stack.push(4);

stack.pop();

stack.print();

}

catch (std::exception &ex)

{

std::cout << ex.what();

}

}

void test_Matrix()

{

Matrix matrix(3,3);

matrix.FillMatrix();

matrix.PrintMatrix();

std::cout << std::endl;

matrix.SwapLines(0, 2);

matrix.PrintMatrix();

}

void test_StackOnList()

{

try

{

StackOnList stackOnList;

stackOnList.push(2);

stackOnList.push(1);

stackOnList.push(7);

stackOnList.push(4);

stackOnList.pop();

stackOnList.print();

}

catch (std::exception &ex)

{

std::cout << ex.what();

}

}

void test_Queue()

{

Queue<int> Q1;

Q1.print("Q1");

Q1.push(5);

Q1.print("Q1");

Q1.push(8);

Q1.push(11);

Q1.push(17); // Q1 = {5,8,11,17}

Q1.print("Q1");

int d;

d = Q1.GetItem();

cout << "d = " << d << endl;

Q1.print("Q1");

}

void test_QueueOnList()

{

}

int main()

{

test_Queue();

return 0;

}



написать администратору сайта