Sem 3 task 2
This commit is contained in:
parent
aac4005be8
commit
6a59f6a463
|
@ -1,8 +1,12 @@
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CXXFLAGS = -Wall -g --std=c++11
|
CXXFLAGS = -Wall -g --std=c++11
|
||||||
|
|
||||||
main: task1.o
|
main: task1.o task2.o
|
||||||
|
|
||||||
task1.o: task1.cpp
|
task1.o: task1.cpp
|
||||||
clang-format -i --style=webkit task1.cpp
|
clang-format -i --style=webkit task1.cpp
|
||||||
$(CXX) $(CXXFLAGS) -o task1.o 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
|
|
@ -1,19 +1,38 @@
|
||||||
# Задание 1
|
# Семинар 05.10.12020
|
||||||
|
|
||||||
|
|
||||||
|
## task1
|
||||||
|
### Задание 1
|
||||||
|
|
||||||
Создать класс для работы с динамическим массивом типа int, хранить в свойствах указатель на данные и размер массива, реализовать функцию вывода всех значений массива, конструктор, получающий на вход размер массива, и деструктор.
|
Создать класс для работы с динамическим массивом типа int, хранить в свойствах указатель на данные и размер массива, реализовать функцию вывода всех значений массива, конструктор, получающий на вход размер массива, и деструктор.
|
||||||
|
|
||||||
# Задание 2
|
### Задание 2
|
||||||
|
|
||||||
Реализовать сеттер, проверяющий входящее значение на принадлежность к промежутку от -100 до 100 включительно и проверяющий выход за границы массива, и геттер, проверяющий выход за границы массива.
|
Реализовать сеттер, проверяющий входящее значение на принадлежность к промежутку от -100 до 100 включительно и проверяющий выход за границы массива, и геттер, проверяющий выход за границы массива.
|
||||||
|
|
||||||
# Задание 3
|
### Задание 3
|
||||||
|
|
||||||
Реализовать конструктор копирования.
|
Реализовать конструктор копирования.
|
||||||
|
|
||||||
# Задание 4
|
### Задание 4
|
||||||
|
|
||||||
Реализовать операцию сложения и вычитания для массивов(сложение и вычитание всех элементов).
|
Реализовать операцию сложения и вычитания для массивов(сложение и вычитание всех элементов).
|
||||||
|
|
||||||
# Задание 5
|
### Задание 5
|
||||||
|
|
||||||
Реализовать операцию добавления значения в конец массива с расширением его размера. Проверять добавляемое значение на принадлежность к промежутку -100 100.
|
Реализовать операцию добавления значения в конец массива с расширением его размера. Проверять добавляемое значение на принадлежность к промежутку -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
|
||||||
|
Реализовать операцию сравнения массивов через расстояние между векторами. При сравнении векторов разной длины сравнивать длину без учета значений.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ public:
|
||||||
throw invalid_argument("Element is not in [-100; 100]!");
|
throw invalid_argument("Element is not in [-100; 100]!");
|
||||||
}
|
}
|
||||||
} else {
|
} 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)
|
int get(uint index)
|
||||||
|
@ -27,7 +27,7 @@ public:
|
||||||
if (index < size) {
|
if (index < size) {
|
||||||
return arr[index];
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
uint length()
|
uint length()
|
||||||
|
@ -117,7 +117,9 @@ int main()
|
||||||
|
|
||||||
cout << "Введите размер второго массива: ";
|
cout << "Введите размер второго массива: ";
|
||||||
cin >> i;
|
cin >> i;
|
||||||
|
|
||||||
DynArr arr2(i);
|
DynArr arr2(i);
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
while (i >= 0) {
|
while (i >= 0) {
|
||||||
|
@ -129,8 +131,10 @@ int main()
|
||||||
cin >> temp;
|
cin >> temp;
|
||||||
arr2.set(i, temp);
|
arr2.set(i, temp);
|
||||||
}
|
}
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::out_of_range& e) {
|
||||||
cerr << e.what() << endl;
|
cerr << e.what() << endl;
|
||||||
|
} catch (const std::invalid_argument& e) {
|
||||||
|
cerr << "Invalid number" << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cout << "Первый массив:\n";
|
cout << "Первый массив:\n";
|
||||||
|
|
150
Sem3/task2.cpp
Normal file
150
Sem3/task2.cpp
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
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<int> 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<int> 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;
|
||||||
|
}
|
Loading…
Reference in a new issue