#include "stdafx.h" #include <memory.h> #include <stdlib.h> #include <stdio.h> typedef unsigned long DWORD; typedef const TCHAR *LPCTSTR; class SquareM { double *m; DWORD dDim; public: SquareM(DWORD dim = 0) : m(NULL), dDim(dim) { if (dDim) { size_t i = dDim * dDim; m = new double[i]; memset(m, 0, i * sizeof(double)); } } SquareM(const SquareM &mm) : m(NULL), dDim(mm.dDim) { if (dDim) { size_t i = dDim * dDim; m = new double[i]; i *= sizeof(double); if (mm.m) memcpy_s(m, i, mm.m, i); else memset(m, 0, i); } } ~SquareM() { delete[] m; } DWORD size() const { return dDim; } double el(DWORD x, DWORD y) const { if ((x < dDim) && (y < dDim)) return m[x * dDim + y]; throw _T("Element does not exist."); } void el(DWORD x, DWORD y, double d) { if ((x < dDim) && (y < dDim)) m[x * dDim + y] = d; else throw _T("Element does not exist."); } SquareM &operator=(const SquareM &mm) { dDim = mm.dDim; delete[] m; m = NULL; if (dDim) { size_t i = dDim * dDim; m = new double[i]; i *= sizeof(double); if (mm.m) memcpy_s(m, i, mm.m, i); else memset(m, 0, i); } return *this; } SquareM &operator*=(double d) { for (DWORD x = 0; x < dDim; ++x) for (DWORD y = 0; y < dDim; ++y) el(x, y, el(x, y) * d); return *this; } SquareM operator+(const SquareM &mm) const { SquareM m2(dDim); if (dDim == mm.dDim) for (DWORD x = 0; x < dDim; ++x) for (DWORD y = 0; y < dDim; ++y) m2.el(x, y, el(x, y) + mm.el(x, y)); return m2; } SquareM operator-(const SquareM &mm) const { SquareM m2(dDim); if (dDim == mm.dDim) for (DWORD x = 0; x < dDim; ++x) for (DWORD y = 0; y < dDim; ++y) m2.el(x, y, el(x, y) - mm.el(x, y)); return m2; } SquareM operator*(double d) const { SquareM m2(dDim); for (DWORD x = 0; x < dDim; ++x) for (DWORD y = 0; y < dDim; ++y) m2.el(x, y, el(x, y) * d); return m2; } void print() const { _tprintf_s(_T("Matrix size: %u\n"), dDim); for (DWORD x = 0; x < dDim; ++x) for (DWORD y = 0; y < dDim; ++y) _tprintf_s(_T("[%u,%u]=%f\n"), x+1, y+1, el(x, y)); } bool write(LPCTSTR fn) const { bool res = false; FILE *f; if (_tfopen_s(&f, fn, _T("wb"))) _tprintf_s(_T("Cannot create file %s \n"), fn); else { fwrite(&dDim, sizeof(dDim), 1, f); fwrite(m, sizeof(double), dDim * dDim, f); fclose(f); _tprintf_s(_T("File %s was saved successfully.\n"), fn); res = true; } return res; } bool read(LPCTSTR fn) { bool res = false; FILE *f; if (_tfopen_s(&f, fn, _T("rb"))) _tprintf_s(_T("Cannot open file %s \n"), fn); else { size_t r = fread(&dDim, sizeof(dDim), 1, f); if (r == 1) { delete[] m; size_t i = dDim * dDim; m = new double[i]; r = fread(m, sizeof(double), i, f); if (r != i) { memset(m, 0, i * sizeof(double)); r = 0; } } fclose(f); if (res = r) _tprintf_s(_T("File %s was loaded successfully.\n"), fn); else _tprintf_s(_T("Cannot load file %s \n"), fn); } return res; } }; int _tmain(int argc, _TCHAR* argv[]) { if (argc > 1) { SquareM mx; if (mx.read(argv[1])) { _tprintf_s(_T("Matrix A+A*2:\n")); mx *= 3; // что эквивалентно mx = mx + mx * 2; mx.print(); } } else { _tprintf_s(_T("Enter matrix size: ")); DWORD sz = 0; _tscanf_s(_T("%u"), &sz); SquareM mx(sz); for (DWORD x = 0; x < sz; ++x) for (DWORD y = 0; y < sz; ++y) { float d = 0.0; _tprintf_s(_T("Enter matrix element[%u,%u](float): "), x+1, y+1); _tscanf_s(_T("%f"), &d); mx.el(x, y, d); } _tprintf_s(_T("\nSave to a file? (y/n) ")); TCHAR c = _gettch(); _tprintf_s(_T("\n")); if ((c == _T('y')) || (c == _T('Y'))) { _tprintf_s(_T("File name: ")); TCHAR fn[_MAX_PATH]; _tscanf_s(_T("%s"), fn, _countof(fn)); mx.write(fn); } _tprintf_s(_T("Matrix A+A*2:\n")); mx *= 3; // что эквивалентно mx = mx + mx * 2; mx.print(); } return 0; } |