Add sem2 task2
This commit is contained in:
parent
126e8e2e0f
commit
fe45b151f2
|
@ -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
|
||||||
|
|
173
Sem2/task2.cpp
Normal file
173
Sem2/task2.cpp
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class DynArr {
|
||||||
|
private:
|
||||||
|
int* arr;
|
||||||
|
uint size;
|
||||||
|
uint width;
|
||||||
|
uint height;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void set(uint h, uint w, int value)
|
||||||
|
{
|
||||||
|
if (h < height && w < width) {
|
||||||
|
if (-100 <= value && value <= 100) {
|
||||||
|
arr[h * width + w] = value;
|
||||||
|
} else {
|
||||||
|
arr[h * width + w] = value % 100;
|
||||||
|
cerr << "Tried to set element " << h << " x " << w << " with " << value << " but this value is not in [-100; 100]. Will assign (val % 10)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
cerr << "Tried to set element " << h << " x " << w << " with " << value << " but the array size is " << size << ". Skipping.\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int get(uint h, uint w)
|
||||||
|
{
|
||||||
|
if (h < height && w < width) {
|
||||||
|
return arr[h * width + w];
|
||||||
|
}
|
||||||
|
cerr << "Tried to get element " << h << " x " << w << " from an array with size " << size << ". Returning 0.\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
uint length()
|
||||||
|
{
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
uint getWidth()
|
||||||
|
{
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
uint getHeight()
|
||||||
|
{
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
void print()
|
||||||
|
{
|
||||||
|
cout << "Size is " << width << " x " << height << endl;
|
||||||
|
for (uint i = 0; i < height; i++) {
|
||||||
|
for (uint j = 0; j < width; j++)
|
||||||
|
cout << arr[i * width + j] << " ";
|
||||||
|
cout << "\n";
|
||||||
|
}
|
||||||
|
cout << "\n";
|
||||||
|
}
|
||||||
|
DynArr operator+(const DynArr& second)
|
||||||
|
{
|
||||||
|
DynArr result(*this);
|
||||||
|
uint target_height, target_width;
|
||||||
|
if (second.height > height) {
|
||||||
|
target_height = height;
|
||||||
|
} else {
|
||||||
|
target_height = second.height;
|
||||||
|
}
|
||||||
|
if (second.width > width) {
|
||||||
|
target_width = width;
|
||||||
|
} else {
|
||||||
|
target_width = second.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint i = 0; i < target_height; i++) {
|
||||||
|
for (uint j = 0; j < target_width; j++) {
|
||||||
|
result.set(i, j, result.get(i, j) + second.arr[i * second.height + j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
DynArr operator-(const DynArr& second)
|
||||||
|
{
|
||||||
|
DynArr result(*this);
|
||||||
|
uint target_height, target_width;
|
||||||
|
if (second.height > height) {
|
||||||
|
target_height = height;
|
||||||
|
} else {
|
||||||
|
target_height = second.height;
|
||||||
|
}
|
||||||
|
if (second.width > width) {
|
||||||
|
target_width = width;
|
||||||
|
} else {
|
||||||
|
target_width = second.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint i = 0; i < target_height; i++) {
|
||||||
|
for (uint j = 0; j < target_width; j++) {
|
||||||
|
result.set(i, j, result.get(i, j) - second.arr[i * second.height + j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
DynArr(uint dwidth, uint dheight)
|
||||||
|
{
|
||||||
|
arr = new int[dwidth * dheight];
|
||||||
|
width = dwidth;
|
||||||
|
height = dheight;
|
||||||
|
size = width * height;
|
||||||
|
for (uint i = 0; i < size; i++) {
|
||||||
|
arr[i] = rand() % 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DynArr(const DynArr& original)
|
||||||
|
{
|
||||||
|
size = original.size;
|
||||||
|
height = original.height;
|
||||||
|
width = original.width;
|
||||||
|
arr = new int[original.size];
|
||||||
|
memcpy(arr, original.arr, sizeof(int) * size);
|
||||||
|
}
|
||||||
|
~DynArr()
|
||||||
|
{
|
||||||
|
delete[] arr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i, j, temp;
|
||||||
|
cout << "Введите размер первого массива в формате h w: ";
|
||||||
|
cin >> i;
|
||||||
|
cin >> j;
|
||||||
|
DynArr arr(i, j);
|
||||||
|
i = 0;
|
||||||
|
j = 0;
|
||||||
|
while (i >= 0) {
|
||||||
|
cout << "Введите координаты элемента через пробел или -1 чтобы закончить ввод: ";
|
||||||
|
cin >> i;
|
||||||
|
if (i >= 0) {
|
||||||
|
cin >> j;
|
||||||
|
cout << "Введите его значение: ";
|
||||||
|
cin >> temp;
|
||||||
|
arr.set(i, j, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cout << "Первый массив:\n";
|
||||||
|
arr.print();
|
||||||
|
|
||||||
|
cout << "Введите размер второго массива: ";
|
||||||
|
cin >> i;
|
||||||
|
cin >> j;
|
||||||
|
DynArr arr2(i, j);
|
||||||
|
i = 0;
|
||||||
|
while (i >= 0) {
|
||||||
|
cout << "Введите координаты элемента через пробел или -1 чтобы закончить ввод: ";
|
||||||
|
cin >> i;
|
||||||
|
if (i >= 0) {
|
||||||
|
cin >> j;
|
||||||
|
cout << "Введите его значение: ";
|
||||||
|
cin >> temp;
|
||||||
|
arr.set(i, j, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cout << "Первый массив:\n";
|
||||||
|
arr.print();
|
||||||
|
cout << "Второй массив:\n";
|
||||||
|
arr2.print();
|
||||||
|
cout << "Первый + второй:\n";
|
||||||
|
(arr + arr2).print();
|
||||||
|
cout << "Первый - второй:\n";
|
||||||
|
(arr - arr2).print();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue