150 lines
3.6 KiB
C++
150 lines
3.6 KiB
C++
|
#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;
|
|||
|
}
|