initial pre-alfa version
This commit is contained in:
1 file changed
+244
@@ -0,0 +1,244 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <cstring>
|
||||||
|
#include <utility>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Exception: public exception
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
// Сообщение об ошибке
|
||||||
|
char* str;
|
||||||
|
public:
|
||||||
|
Exception(const char* s)
|
||||||
|
{
|
||||||
|
str = new char[strlen(s) + 1];
|
||||||
|
strcpy(str, s);
|
||||||
|
}
|
||||||
|
Exception(const Exception& e)
|
||||||
|
{
|
||||||
|
str = new char[strlen(e.str) + 1];
|
||||||
|
strcpy(str, e.str);
|
||||||
|
}
|
||||||
|
~Exception()
|
||||||
|
{
|
||||||
|
delete[] str;
|
||||||
|
}
|
||||||
|
// Функцию вывода можно будет переопределить в производных
|
||||||
|
// классах, когда будет ясна конкретика
|
||||||
|
virtual void print()
|
||||||
|
{
|
||||||
|
cout << "Exception: " << str;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class BaseMatrix
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
double** ptr;
|
||||||
|
int height;
|
||||||
|
int width;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BaseMatrix(int Height = 2, int Width = 2)
|
||||||
|
{
|
||||||
|
if (Height <= 0 || Width <= 0)
|
||||||
|
throw Exception("Non-positive size of matrix");
|
||||||
|
height = Height;
|
||||||
|
width = Width;
|
||||||
|
ptr = new double*[height];
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
ptr[i] = new double[width];
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseMatrix(const BaseMatrix& M) : height(M.height), width(M.width)
|
||||||
|
{
|
||||||
|
ptr = new double*[height];
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
ptr[i] = new double[width];
|
||||||
|
for (int j = 0; j < width; j++)
|
||||||
|
ptr[i][j] = M.ptr[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseMatrix(double** arr, int Height, int Width) : height(Height), width(Width)
|
||||||
|
{
|
||||||
|
ptr = new double*[height];
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
ptr[i] = new double[width];
|
||||||
|
for (int j = 0; j < width; j++)
|
||||||
|
ptr[i][j] = arr[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~BaseMatrix()
|
||||||
|
{
|
||||||
|
if (ptr != NULL)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
delete[] ptr[i];
|
||||||
|
delete[] ptr;
|
||||||
|
ptr = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void print()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < width; j++)
|
||||||
|
cout << ptr[i][j] << " ";
|
||||||
|
cout << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double& operator()(int row, int column)
|
||||||
|
{
|
||||||
|
if (row < 0 || column < 0 || row >= height || column >= width)
|
||||||
|
throw Exception("Index is out of bounds");
|
||||||
|
return ptr[row][column];
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseMatrix& operator=(const BaseMatrix& other)
|
||||||
|
{
|
||||||
|
if (this != &other)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
delete[] ptr[i];
|
||||||
|
delete[] ptr;
|
||||||
|
|
||||||
|
height = other.height;
|
||||||
|
width = other.width;
|
||||||
|
|
||||||
|
ptr = new double*[height];
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
ptr[i] = new double[width];
|
||||||
|
for (int j = 0; j < width; j++)
|
||||||
|
ptr[i][j] = other.ptr[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend ostream& operator<<(ostream& ustream, BaseMatrix obj);
|
||||||
|
friend istream& operator>>(istream& ustream, BaseMatrix& obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
ostream& operator<<(ostream& ustream, BaseMatrix obj)
|
||||||
|
{
|
||||||
|
if (typeid(ustream).name() == typeid(ofstream).name())
|
||||||
|
{
|
||||||
|
ustream << obj.height << " " << obj.width << "\n";
|
||||||
|
for (int i = 0; i < obj.height; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < obj.width; j++)
|
||||||
|
ustream << obj.ptr[i][j] << "\n";
|
||||||
|
}
|
||||||
|
return ustream;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < obj.height; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < obj.width; j++)
|
||||||
|
ustream << obj.ptr[i][j] << " ";
|
||||||
|
ustream << "\n";
|
||||||
|
}
|
||||||
|
return ustream;
|
||||||
|
}
|
||||||
|
|
||||||
|
istream& operator>>(istream& ustream, BaseMatrix& obj)
|
||||||
|
{
|
||||||
|
if (typeid(ustream) == typeid(ifstream))
|
||||||
|
ustream >> obj.height >> obj.width;
|
||||||
|
for (int i = 0; i < obj.height; i++)
|
||||||
|
for (int j = 0; j < obj.width; j++)
|
||||||
|
ustream >> obj.ptr[i][j];
|
||||||
|
return ustream;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MultidimensionalArray : public BaseMatrix
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MultidimensionalArray(int Height = 2, int Width = 2) : BaseMatrix(Height, Width) {}
|
||||||
|
|
||||||
|
MultidimensionalArray(const MultidimensionalArray& M) : BaseMatrix(M) {}
|
||||||
|
|
||||||
|
MultidimensionalArray(double** arr, int Height, int Width) : BaseMatrix(arr, Height, Width) {}
|
||||||
|
|
||||||
|
MultidimensionalArray& operator=(const MultidimensionalArray& other)
|
||||||
|
{
|
||||||
|
BaseMatrix::operator=(other);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
pair<double, double> calculateCenterOfMass()
|
||||||
|
{
|
||||||
|
double totalMass = 0.0;
|
||||||
|
double weightedSumX = 0.0;
|
||||||
|
double weightedSumY = 0.0;
|
||||||
|
|
||||||
|
for (int i = 0; i < height; ++i)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < width; ++j)
|
||||||
|
{
|
||||||
|
double mass = ptr[i][j];
|
||||||
|
totalMass += mass;
|
||||||
|
weightedSumX += j * mass; // умножаем координату на массу
|
||||||
|
weightedSumY += i * mass; // умножаем координату на массу
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalMass == 0.0)
|
||||||
|
{
|
||||||
|
return make_pair(-1.0, -1.0); // Или другое значение по умолчанию
|
||||||
|
}
|
||||||
|
|
||||||
|
double centerX = weightedSumX / totalMass;
|
||||||
|
double centerY = weightedSumY / totalMass;
|
||||||
|
|
||||||
|
return make_pair(centerX, centerY);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MultidimensionalArray Wrong(-2, 0);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
cout << "\nException has been caught: ";
|
||||||
|
e.print();
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "\n";
|
||||||
|
|
||||||
|
MultidimensionalArray M;
|
||||||
|
cin >> M;
|
||||||
|
|
||||||
|
ofstream fout("out.txt");
|
||||||
|
if (fout.is_open())
|
||||||
|
{
|
||||||
|
fout << M;
|
||||||
|
fout.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
ifstream fin("out.txt");
|
||||||
|
MultidimensionalArray M1;
|
||||||
|
if (fin)
|
||||||
|
{
|
||||||
|
fin >> M1;
|
||||||
|
fin.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << M1;
|
||||||
|
|
||||||
|
char c1;
|
||||||
|
cin >> c1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in new issue
Block a user