diff --git a/Sem3/Makefile b/Sem3/Makefile index 954855a..c0d4e80 100644 --- a/Sem3/Makefile +++ b/Sem3/Makefile @@ -1,8 +1,12 @@ CXX = g++ CXXFLAGS = -Wall -g --std=c++11 -main: task1.o +main: task1.o task2.o task1.o: task1.cpp clang-format -i --style=webkit task1.cpp $(CXX) $(CXXFLAGS) -o task1.o task1.cpp + +task2.o: task2.cpp + clang-format -i --style=webkit task2.cpp + $(CXX) $(CXXFLAGS) -o task2.o task2.cpp \ No newline at end of file diff --git a/Sem3/README.md b/Sem3/README.md index f385592..070ab9a 100644 --- a/Sem3/README.md +++ b/Sem3/README.md @@ -1,19 +1,38 @@ -# Задание 1 +# Семинар 05.10.12020 + + +## task1 +### Задание 1 Создать класс для работы с динамическим массивом типа int, хранить в свойствах указатель на данные и размер массива, реализовать функцию вывода всех значений массива, конструктор, получающий на вход размер массива, и деструктор. -# Задание 2 +### Задание 2 Реализовать сеттер, проверяющий входящее значение на принадлежность к промежутку от -100 до 100 включительно и проверяющий выход за границы массива, и геттер, проверяющий выход за границы массива. -# Задание 3 +### Задание 3 Реализовать конструктор копирования. -# Задание 4 +### Задание 4 Реализовать операцию сложения и вычитания для массивов(сложение и вычитание всех элементов). -# Задание 5 +### Задание 5 Реализовать операцию добавления значения в конец массива с расширением его размера. Проверять добавляемое значение на принадлежность к промежутку -100 100. + +## task2 + +### Задание 1 +Реализовать исключение в классе предыдущего задания: std:bad_alloc ошибка выделения памяти, std:out_of_range ошибка при обращении по индексу, std:invalid_argument неверное значение. + +https://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm +### Задание 2 +Реализовать шаблонный класс для массива элементов задаваемого типа. +### Задание 3 +Реализовать операцию “=” с помощью конструктора копирования. Реализовать операцию вывода “<<”. +### Задание 4 +Реализовать операцию сравнения массивов через расстояние между векторами. При сравнении векторов разной длины сравнивать длину без учета значений. + + diff --git a/Sem3/task1.cpp b/Sem3/task1.cpp index aea8fd2..117c42d 100644 --- a/Sem3/task1.cpp +++ b/Sem3/task1.cpp @@ -19,7 +19,7 @@ public: throw invalid_argument("Element is not in [-100; 100]!"); } } else { - throw invalid_argument("Tried to set element out of array bounds!"); + throw out_of_range("Tried to set element out of array bounds!"); } } int get(uint index) @@ -27,7 +27,7 @@ public: if (index < size) { return arr[index]; } - throw invalid_argument("Tried to get element out of array bounds!"); + throw out_of_range("Tried to get element out of array bounds!"); return 0; } uint length() @@ -117,7 +117,9 @@ int main() cout << "Введите размер второго массива: "; cin >> i; + DynArr arr2(i); + i = 0; while (i >= 0) { @@ -129,8 +131,10 @@ int main() cin >> temp; arr2.set(i, temp); } - } catch (const std::exception& e) { + } catch (const std::out_of_range& e) { cerr << e.what() << endl; + } catch (const std::invalid_argument& e) { + cerr << "Invalid number" << endl; } } cout << "Первый массив:\n"; diff --git a/Sem3/task2.cpp b/Sem3/task2.cpp new file mode 100644 index 0000000..1a9af11 --- /dev/null +++ b/Sem3/task2.cpp @@ -0,0 +1,150 @@ +#include +#include +#include +#include + +using namespace std; + +template +class DynArr { +private: + T* arr; + uint size; + +public: + void set(uint index, T value) + { + if (index < size) { + arr[index] = value; + + } else { + throw out_of_range("Tried to set element out of array bounds!"); + } + } + T get(uint index) + { + if (index < size) { + return arr[index]; + } + throw out_of_range("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(T value) + { + T* newArr = new T[size + 1]; + memcpy(newArr, arr, sizeof(T) * size); + delete[] arr; + arr = newArr; + arr[size] = value; + size = size + 1; + } + DynArr operator<<(std::ostream& os) + { + for (uint i = 0; i < size; i++) { + os << arr[i] << " "; + } + } + + inline bool operator<(const DynArr& rhs) + { + if (size == rhs.size) { + double lengthL = 0; + double lengthR = 0; + for (uint i = 0; i < size; i++) { + lengthL += arr[i] * arr[i]; + lengthR += rhs.arr[i] * rhs.arr[i]; + } + lengthL = sqrt(lengthL); + lengthR = sqrt(lengthR); + return lengthL < lengthR; + } else { + return size < rhs.size; + } + } + inline bool operator>(const DynArr& rhs) { return rhs < this; } + inline bool operator<=(const DynArr& rhs) { return !(this > rhs); } + inline bool operator>=(const DynArr& rhs) { return !(this < rhs); } + DynArr(uint dsize) + { + arr = new T[dsize]; + size = dsize; + for (uint i = 0; i < size; i++) { + arr[i] = rand() % 100; + } + } + DynArr(const DynArr& original) + { + size = original.size; + arr = new T[original.size]; + memcpy(arr, original.arr, sizeof(T) * 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::out_of_range& e) { + cerr << e.what() << endl; + } catch (const std::invalid_argument& e) { + cerr << "Invalid number" << endl; + } + } + cout << "Первый массив:\n"; + arr.print(); + cout << "Второй массив:\n"; + arr2.print(); + if (arr < arr2) { + cout << "Второй массив больше первого" << endl; + } else { + cout << "Первый массив больше второго" << endl; + } + return 0; +} \ No newline at end of file