From aac4005be8eb57dafa73cf98fd5e7c76bcfb3b6c Mon Sep 17 00:00:00 2001 From: Inex Code Date: Mon, 5 Oct 2020 06:59:09 +0000 Subject: [PATCH] Sem3: task1 --- Sem3/Makefile | 8 +++ Sem3/README.md | 19 ++++++ Sem3/task1.cpp | 156 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 Sem3/Makefile create mode 100644 Sem3/README.md create mode 100644 Sem3/task1.cpp diff --git a/Sem3/Makefile b/Sem3/Makefile new file mode 100644 index 0000000..954855a --- /dev/null +++ b/Sem3/Makefile @@ -0,0 +1,8 @@ +CXX = g++ +CXXFLAGS = -Wall -g --std=c++11 + +main: task1.o + +task1.o: task1.cpp + clang-format -i --style=webkit task1.cpp + $(CXX) $(CXXFLAGS) -o task1.o task1.cpp diff --git a/Sem3/README.md b/Sem3/README.md new file mode 100644 index 0000000..f385592 --- /dev/null +++ b/Sem3/README.md @@ -0,0 +1,19 @@ +# Задание 1 + +Создать класс для работы с динамическим массивом типа int, хранить в свойствах указатель на данные и размер массива, реализовать функцию вывода всех значений массива, конструктор, получающий на вход размер массива, и деструктор. + +# Задание 2 + +Реализовать сеттер, проверяющий входящее значение на принадлежность к промежутку от -100 до 100 включительно и проверяющий выход за границы массива, и геттер, проверяющий выход за границы массива. + +# Задание 3 + +Реализовать конструктор копирования. + +# Задание 4 + +Реализовать операцию сложения и вычитания для массивов(сложение и вычитание всех элементов). + +# Задание 5 + +Реализовать операцию добавления значения в конец массива с расширением его размера. Проверять добавляемое значение на принадлежность к промежутку -100 100. diff --git a/Sem3/task1.cpp b/Sem3/task1.cpp new file mode 100644 index 0000000..aea8fd2 --- /dev/null +++ b/Sem3/task1.cpp @@ -0,0 +1,156 @@ +#include +#include +#include + +using namespace std; + +class DynArr { +private: + int* arr; + uint size; + +public: + void set(uint index, int value) + { + if (index < size) { + if (-100 <= value && value <= 100) { + arr[index] = value; + } else { + throw invalid_argument("Element is not in [-100; 100]!"); + } + } else { + throw invalid_argument("Tried to set element out of array bounds!"); + } + } + int get(uint index) + { + if (index < size) { + return arr[index]; + } + throw invalid_argument("Tried to get element out of array bounds!"); + return 0; + } + uint length() + { + return size; + } + void print() + { + cout << "Size is " << size << endl; + for (uint i = 0; i < size; i++) { + cout << arr[i] << " "; + } + cout << "\n"; + } + void dynAdd(int value) + { + if (!(-100 <= value && value <= 100)) { + throw invalid_argument("Element is not in [-100; 100]!"); + } + int* newArr = new int[size + 1]; + memcpy(newArr, arr, sizeof(int) * size); + delete[] arr; + arr = newArr; + arr[size] = value; + size = size + 1; + } + DynArr operator+(const DynArr& second) + { + DynArr result(second); + uint target_size = size; + if (second.size < size) + target_size = second.size; + for (uint i = 0; i < target_size; i++) { + result.set(i, result.get(i) + arr[i]); + } + return result; + } + DynArr operator-(const DynArr& second) + { + DynArr result(second); + uint target_size = size; + if (second.size < size) + target_size = second.size; + for (uint i = 0; i < target_size; i++) { + result.set(i, arr[i] - result.get(i)); + } + return result; + } + DynArr(uint dsize) + { + arr = new int[dsize]; + size = dsize; + for (uint i = 0; i < size; i++) { + arr[i] = rand() % 100; + } + } + DynArr(const DynArr& original) + { + size = original.size; + arr = new int[original.size]; + memcpy(arr, original.arr, sizeof(int) * size); + } + ~DynArr() + { + delete[] arr; + } +}; + +int main() +{ + int i, temp; + cout << "Введите размер первого массива: "; + cin >> i; + DynArr arr(i); + i = 0; + while (i >= 0) { + cout << "Введите номер элемента: "; + cin >> i; + if (i >= 0) { + cout << "Введите его значение: "; + cin >> temp; + arr.set(i, temp); + } + } + cout << "Первый массив:\n"; + arr.print(); + + cout << "Введите размер второго массива: "; + cin >> i; + DynArr arr2(i); + i = 0; + + while (i >= 0) { + try { + cout << "Введите номер элемента: "; + cin >> i; + if (i >= 0) { + cout << "Введите его значение: "; + cin >> temp; + arr2.set(i, temp); + } + } catch (const std::exception& e) { + cerr << e.what() << endl; + } + } + cout << "Первый массив:\n"; + arr.print(); + cout << "Второй массив:\n"; + arr2.print(); + cout << "Первый + второй:\n"; + try { + (arr + arr2).print(); + } catch (const std::exception& e) { + cerr << e.what() << endl; + } + cout << "Первый - второй:\n"; + try { + (arr - arr2).print(); + } catch (const std::exception& e) { + cerr << e.what() << endl; + } + cout << "Расширенный второй\n"; + arr2.dynAdd(80); + arr2.print(); + return 0; +} \ No newline at end of file