Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 152 additions & 10 deletions include/tmatrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class TDynamicVector
{
if (sz == 0)
throw out_of_range("Vector size should be greater than zero");
if (sz > MAX_VECTOR_SIZE)
throw out_of_range("Size exceeds the max allowed size");
pMem = new T[sz]();// {}; // У типа T д.б. констуктор по умолчанию
}
TDynamicVector(T* arr, size_t s) : sz(s)
Expand All @@ -35,67 +37,131 @@ class TDynamicVector
pMem = new T[sz];
std::copy(arr, arr + sz, pMem);
}
TDynamicVector(const TDynamicVector& v)
{
TDynamicVector(const TDynamicVector& v) : sz(v.sz) {
pMem = new T[sz];
std::copy(v.pMem, v.pMem + sz, pMem);
}
TDynamicVector(TDynamicVector&& v) noexcept
TDynamicVector(TDynamicVector&& v) noexcept : sz(v.sz), pMem(v.pMem)
{
v.sz = 0;
v.pMem = nullptr;
}
~TDynamicVector()
{
delete[] pMem;
}
TDynamicVector& operator=(const TDynamicVector& v)
{
if (this == &v)
return *this;
if (v.sz == 0)
throw out_of_range("size should be greater than zero");
TDynamicVector tmp(v);
swap(*this, tmp);
return *this;
}
TDynamicVector& operator=(TDynamicVector&& v) noexcept
{
if (this == &v)
return *this;
delete[] pMem;
sz = v.sz;
pMem = v.pMem;
v.sz = 0;
v.pMem = nullptr;
return *this;
}

size_t size() const noexcept { return sz; }

// индексация
T& operator[](size_t ind)
{
if (ind >= sz)
throw out_of_range("Index out of range");
return pMem[ind];
}
const T& operator[](size_t ind) const
{
if (ind >= sz)
throw out_of_range("Index out of range");
return pMem[ind];
}
// индексация с контролем
T& at(size_t ind)
{
if (ind >= sz)
throw out_of_range("Index out of range");
return pMem[ind];
}
const T& at(size_t ind) const
{
if (ind >= sz)
throw out_of_range("Index out of range");
return pMem[ind];
}

// сравнение
bool operator==(const TDynamicVector& v) const noexcept
{
return (sz == v.sz) && std::equal(pMem, pMem + sz, v.pMem);
}
bool operator!=(const TDynamicVector& v) const noexcept
{
return !(*this == v);
}

// скалярные операции
TDynamicVector operator+(T val)
{
TDynamicVector result(*this);
for (size_t i = 0; i < sz; ++i)
result[i] += val;
return result;
}
TDynamicVector operator-(T val)
{
TDynamicVector result(*this);
for (size_t i = 0; i < sz; ++i)
result[i] -= static_cast<T>(val);
return result;
}
TDynamicVector operator*(T val)
TDynamicVector operator*( T val)
{
TDynamicVector result(*this);
for (size_t i = 0; i < sz; ++i)
result[i] *= static_cast<T>(val);
return result;
}

// векторные операции
TDynamicVector operator+(const TDynamicVector& v)
{
if (sz != v.sz)
throw invalid_argument("Vectors must be the same size");
TDynamicVector result(sz);
for (size_t i = 0; i < sz; ++i)
result[i] = pMem[i] + v.pMem[i];
return result;
}
TDynamicVector operator-(const TDynamicVector& v)
{
if (sz != v.sz)
throw invalid_argument("Vectors must be the same size");
TDynamicVector result(sz);
for (size_t i = 0; i < sz; ++i)
result[i] = pMem[i] - v.pMem[i];
return result;
}
T operator*(const TDynamicVector& v) noexcept(noexcept(T()))

int operator*(const TDynamicVector& v) noexcept(noexcept(T()))
{
if (sz != v.sz)
throw invalid_argument("Vectors must be same size");
int result = 0;
for (size_t i = 0; i < sz; ++i)
result += pMem[i] * v.pMem[i];
return result;
}

friend void swap(TDynamicVector& lhs, TDynamicVector& rhs) noexcept
Expand Down Expand Up @@ -129,45 +195,121 @@ class TDynamicMatrix : private TDynamicVector<TDynamicVector<T>>
using TDynamicVector<TDynamicVector<T>>::sz;
public:
TDynamicMatrix(size_t s = 1) : TDynamicVector<TDynamicVector<T>>(s)
{
{
if (s == 0)
throw out_of_range("size should be greater than zero");
if (s > MAX_MATRIX_SIZE)
throw out_of_range("The matrix size is larger");
for (size_t i = 0; i < sz; i++)
pMem[i] = TDynamicVector<T>(sz);
}
TDynamicMatrix& operator=(const TDynamicMatrix& m)
{
if (this == &m)
return *this;
if (m.sz == 0)
throw out_of_range("size should be greater than zero");
for (size_t i = 0; i < sz; ++i) {
pMem[i] = TDynamicVector<T>();
}
if (sz != m.sz) {
delete[] pMem;
sz = m.sz;
pMem = new TDynamicVector<T>[sz];
}
for (size_t i = 0; i < sz; ++i) {
pMem[i] = m.pMem[i];
}
return *this;
}

TDynamicMatrix(const TDynamicMatrix& m) : TDynamicVector<TDynamicVector<T>>(m.sz) {
for (size_t i = 0; i < sz; i++) {
pMem[i] = m.pMem[i];
}
}

using TDynamicVector<TDynamicVector<T>>::operator[];
using TDynamicVector<TDynamicVector<T>>::size;

// сравнение
bool operator==(const TDynamicMatrix& m) const noexcept
{
if (sz != m.sz)
return false;
for (size_t i = 0; i < sz; i++) {
if (pMem[i] != m.pMem[i])
return false;
}
return true;
}

// матрично-скалярные операции
TDynamicMatrix operator*(const T& val)
{
TDynamicMatrix operator*(const T& val) const {
TDynamicMatrix<T> result(sz);
for (size_t i = 0; i < sz; ++i) {
result[i] = pMem[i] * val;
}
return result;
}

// матрично-векторные операции
TDynamicVector<T> operator*(const TDynamicVector<T>& v)
TDynamicVector<T> operator*(const TDynamicVector<T>& v) const
{
if (sz != v.size())
throw invalid_argument("Matrix and vector sizes mismatch");
TDynamicVector<T>result(sz);
for (size_t i = 0; i < sz; ++i)
for (size_t j = 0; j < sz; ++j)
result[i] += (*this)[i][j] * v[i];
return result;
}

// матрично-матричные операции
TDynamicMatrix operator+(const TDynamicMatrix& m)
{
if (sz != m.sz)
throw invalid_argument("Matrix sizes mismatch");
TDynamicMatrix result(sz);
for (size_t i = 0; i < sz; ++i)
result[i] = (*this)[i] + m[i];
return result;
}
TDynamicMatrix operator-(const TDynamicMatrix& m)
{
if (sz != m.sz)
throw invalid_argument("Matrix sizes mismatch");
TDynamicMatrix result(sz);
for (size_t i = 0; i < sz; ++i)
result[i] = (*this)[i] - m[i];
return result;
}
TDynamicMatrix operator*(const TDynamicMatrix& m)
TDynamicMatrix operator*(const TDynamicMatrix& m) const
{
if (sz != m.sz)
throw invalid_argument("Matrix sizes mismatch");
TDynamicMatrix result(sz);
for (size_t i = 0; i < sz; ++i)
for (size_t j = 0; j < sz; ++j) {
result[i][j] = T();
for (size_t k = 0; k < sz; ++k)
result[i][j] += (*this)[i][k] * m[k][j];
}
return result;
}

// ввод/вывод
friend istream& operator>>(istream& istr, TDynamicMatrix& v)
{
for (size_t i = 0; i < v.sz; ++i)
istr >> v.pMem[i];
return istr;
}
friend ostream& operator<<(ostream& ostr, const TDynamicMatrix& v)
{
for (size_t i = 0; i < v.sz; ++i)
ostr << v.pMem[i] << endl;
return ostr;
}
};

Expand Down
84 changes: 84 additions & 0 deletions samples/sample_matrix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,87 @@ void main()
cout << "Matrix c = a + b" << endl << c << endl;
}
//---------------------------------------------------------------------------

using namespace std;

int main() {


size_t n;
cout << "enter the matrix dimension ";
cin >> n;

if (n == 0 || n > MAX_MATRIX_SIZE) {
throw out_of_range("the matrix size must be greater than 0 and not exceed the max");
}

try {
TDynamicMatrix<int> a(n), b(n), c(n);
int i, j;

for (i = 0; i < n; i++) {
for (j = i; j < n; j++) {
a[i][j] = i * 10 + j;
b[i][j] = (i * 10 + j) * 100;
}
}

cout << "Matrix A:\n" << a << endl;
cout << "Matrix B:\n" << b << endl;

c = a + b;
cout << "result of addition (A + B):\n" << c << endl;

c = a - b;
cout << "result of subtraction (A - B):\n" << c << endl;
cout << "a == b? true - 1, false - 0" << endl << (a == b) << endl;

int scalar = 5;
c = a * scalar;

cout << "result of multiplication (A * " << scalar << "):\n" << c << endl;

c = a * b;
cout << "result of matrix multiplication (A * B):\n" << c << endl;


TDynamicVector<int> v(n);
TDynamicVector<int> r(n);
for (size_t i = 0; i < v.size(); ++i) {
v[i] = 1;
}

TDynamicVector<int> result = a * v;
cout << "result of multiplying a matrix by a vector:\n" << result << endl;

int k;
cout << "scalar?" << endl;
cin >> k;
r = result + k;
cout << "result of addition (vector + scalar) \n" << r << endl;
r = result - k;
cout << "result of subtraction (vector - scalar)\n" << r << endl;
r = result * k;
cout << "result of multiplication (vector * scalar)\n" << r << endl;

TDynamicVector<int> s = r;
cout << "true - 1, false - 0" << endl << (r == v) << endl << (s == r) << endl;
result = r + v;
cout << "result of addition (vector + vector) \n" << result << endl;
result = r - v;
cout << "result of subtraction (vector - vector) \n" << result << endl;


}
catch (const out_of_range& e) {
cout << "error: " << e.what() << endl;
}
catch (const invalid_argument& e) {
cout << "error: " << e.what() << endl;
}
catch (const exception& e) {
cout << "error: " << e.what() << endl;
}

return 0;
}
Loading