Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <random>
- #include <cmath>
- #include <ctime>
- struct Vect {
- protected:
- double *massiv;
- int len;
- bool ornt;
- public:
- Vect(bool b = true) {
- massiv = nullptr;
- len = 0;
- ornt = b;
- }
- Vect(int l, bool b = true) {
- massiv = new double[len = l];
- for(int i = 0; i < l; i++) massiv[i] = 0;
- }
- Vect(double *a, int l, bool b = true) {
- massiv = new double[l];
- len = l;
- for(int i = 0; i < l; i++) massiv[i] = a[i];
- }
- Vect(Vect *v) {
- len = v->len;
- massiv = new double[len];
- for(int i = 0; i < len; i++) massiv[i] = v->massiv[i];
- }
- Vect(const Vect &v) {
- len = v.len;
- massiv = new double[len];
- for(int i = 0; i < len; i++) massiv[i] = v.massiv[i];
- }
- double& operator [] (int index) {
- double zero = 0;
- return index < len ? massiv[index] : zero;
- }
- Vect& operator = (Vect v) {
- if(massiv) delete[] massiv;
- len = v.size();
- massiv = new double[len];
- for(int i = 0; i < len; i++) massiv[i] = v[i];
- return *this;
- }
- Vect operator + (Vect v) {
- Vect rslt(ornt);
- int l = v.size() > len ? v.size() : len;
- rslt.set_size(l);
- for(int i = 0; i < l; i++) rslt[i] = massiv[i] + v[i];
- return rslt;
- }
- Vect operator + (double n) {
- Vect rslt(ornt);
- rslt.set_size(len);
- for(int i = 0; i < len; i++) rslt[i] = massiv[i] + n;
- return rslt;
- }
- Vect operator * (Vect v) {
- Vect rslt(ornt);
- int l = v.size() > len ? v.size() : len;
- rslt.set_size(l);
- for(int i = 0; i < l; i++) rslt[i] = massiv[i] * v[i];
- return rslt;
- }
- Vect operator * (double n) {
- Vect rslt(ornt);
- rslt.set_size(len);
- for(int i = 0; i < len; i++) rslt[i] = massiv[i] * n;
- return rslt;
- }
- bool operator == (Vect v) {
- if(v.size() != len) return false;
- for(int i = 0; i < len; i++) if(massiv[i] != v[i]) return false;
- return true;
- }
- bool operator != (Vect v) {
- if(v.size() != len) return true;
- for(int i = 0; i < len; i++) if(massiv[i] != v[i]) return true;
- return true;
- }
- void set_size(int l) {
- int p = l < len ? l : len;
- double *buf = new double[len = l];
- for(int i = 0; i < p; i++) buf[i] = massiv[i];
- delete[] massiv;
- massiv = buf;
- }
- void push_back(double n) {
- set_size(len+1);
- massiv[len-1] = n;
- }
- void print() {
- std::cout << "(" << massiv[0];
- for(int i = 1; i < len; i++) std::cout << ", " << massiv[i];
- std::cout << ")" << std::endl;
- }
- int sum() {
- int rslt = 0;
- for(int i = 0; i < len; i++) rslt += massiv[i];
- return rslt;
- }
- int module() {
- int rslt = 0;
- for(int i = 0; i < len; i++) rslt += massiv[i]*massiv[i];
- return std::sqrt(rslt);
- }
- int size() {
- return len;
- }
- bool isRow() {
- return ornt;
- }
- bool isColumn() {
- return !ornt;
- }
- void transpose() {
- ornt = !ornt;
- }
- void random(int N, std::default_random_engine *generator, std::uniform_real_distribution<double> *distribution) {
- if(massiv) delete[] massiv;
- massiv = new double[N];
- len = N;
- std::uniform_real_distribution<double> d = *distribution;
- for(int i = 0; i < len; i++) massiv[i] = d(*generator);
- }
- void random(int N, double R, int seed = time(nullptr)) {
- std::default_random_engine generator(seed);
- std::uniform_real_distribution<double> distribution(-R, R);
- random(N, &generator, &distribution);
- }
- ~Vect() {
- delete[] massiv;
- }
- };
- struct Matrix {
- protected:
- int NR;
- int NC;
- Vect* massiv;
- public:
- Matrix() {
- massiv = nullptr;
- NR = 0;
- NC = 0;
- }
- Matrix(Vect v) {
- if(v.isRow()) {
- NR = 1, NC = v.size();
- massiv = new Vect[NR];
- massiv[0] = new Vect(v);
- }
- else {
- NR = v.size(), NC = 1;
- massiv = new Vect[NR];
- for(int i = 0; i < NR; i++) massiv[i] = new Vect(v[i], NC);
- }
- }
- Matrix(int a, int b) {
- massiv = new Vect[a];
- NR = a;
- NC = b;
- for(int i = 0; i < a; i++) {
- massiv[i] = new Vect(b);
- }
- }
- Matrix(double n, int a, int b) {
- massiv = new Vect[a];
- NR = a;
- NC = b;
- for(int i = 0; i < a; i++) {
- massiv[i] = new Vect(b);
- if(i < b) massiv[i][i] = n;
- }
- }
- Matrix(double **m, int a, int b) {
- massiv = new Vect[a];
- NR = a;
- NC = b;
- for(int i = 0; i < a; i++) massiv[i] = new Vect(m[i], b);
- }
- Matrix(Vect *m, int a, int b) {
- massiv = new Vect[a];
- NR = a;
- NC = b;
- for(int i = 0; i < a; i++) massiv[i] = new Vect(m[i]);
- }
- Matrix(Matrix *m) {
- NR = m->NR;
- NC = m->NC;
- massiv = new Vect[NR];
- for(int i = 0; i < NR; i++) massiv[i] = new Vect(m->massiv[i]);
- }
- Matrix(const Matrix &m) {
- NR = m.NR;
- NC = m.NC;
- massiv = new Vect[NR];
- for(int i = 0; i < NR; i++) massiv[i] = new Vect(m.massiv[i]);
- }
- Vect& operator [] (int index) {
- return massiv[index];
- }
- Matrix& operator = (Matrix m) {
- if(massiv) delete[] massiv;
- NR = m.rows();
- NC = m.columns();
- massiv = new Vect[NR];
- for(int i = 0; i < NR; i++) massiv[i] = m[i];
- return *this;
- }
- Matrix operator + (Matrix m) {
- Matrix rslt;
- int a = m.rows() > NR ? m.rows() : NR;
- int b = m.columns() > NC ? m.columns() : NC;
- rslt.set_size(a, b);
- for(int i = 0; i < a; i++) rslt[i] = massiv[i] + m[i];
- return rslt;
- }
- Matrix operator + (double n) {
- Matrix rslt;
- rslt.set_size(NR, NC);
- for(int i = 0; i < NR; i++) rslt[i] = massiv[i] + n;
- return rslt;
- }
- Matrix operator * (Matrix m) {
- Matrix rslt(NR, m.columns());
- if (NC == m.rows()) {
- for (int i = 0; i < NR; i++) {
- for (int j = 0; j < m.columns(); j++) {
- for (int k = 0; k < NC; k++) {
- rslt[i][j] = rslt[i][j] + massiv[i][k] * m[k][j];
- }
- }
- }
- return rslt;
- }
- std::cout << "Error" << std::endl;
- return nullptr;
- }
- Matrix operator * (double n) {
- Matrix rslt;
- rslt.set_size(NR, NC);
- for(int i = 0; i < NR; i++) rslt[i] = massiv[i] * n;
- return rslt;
- }
- bool operator == (Matrix m) {
- if(m.rows() != NR || m.columns() != NC) return false;
- for(int i = 0; i < NR; i++) if(massiv[i] != m[i]) return false;
- return true;
- }
- bool operator != (Matrix m) {
- if(m.rows() != NR || m.columns() != NC) return true;
- for(int i = 0; i < NR; i++) if(massiv[i] != m[i]) return true;
- return false;
- }
- int rows() {
- return NR;
- }
- int columns() {
- return NC;
- }
- void random(int a, int b, int R, int seed) {
- std::default_random_engine generator(seed);
- std::uniform_real_distribution<double> distribution(-R, R);
- NR = a;
- NC = b;
- delete[] massiv;
- massiv = new Vect[NR];
- for(int i = 0; i < NR; i++) {
- massiv[i] = new Vect();
- massiv[i].random(NC, &generator, &distribution);
- }
- }
- void set_size(int a, int b) {
- NC = b;
- int p = a < NR ? a : NR;
- Vect *buf = new Vect[NR = a];
- for(int i = 0; i < p; i++) {
- massiv[i].set_size(NC);
- buf[i] = massiv[i];
- }
- for(int i = p; i < NR; i++) {
- buf[i] = new Vect(NC);
- }
- delete[] massiv;
- massiv = buf;
- }
- int sum() {
- int rslt = 0;
- for(int i = 0; i < NR; i++) rslt += massiv[i].sum();
- return rslt;
- }
- int trace() {
- int rslt = 0, p = NR < NC ? NR : NC;
- for(int i = 0; i < p; i++) rslt += massiv[i][i];
- return rslt;
- }
- void print() {
- for(int i = 0; i < NR; i++) massiv[i].print();
- }
- void swapRows(int a, int b) {
- Vect buf = massiv[a];
- massiv[a] = massiv[b];
- massiv[b] = buf;
- }
- void swapColumns(int a, int b) {
- for(int i = 0; i < NR; i++) {
- double buf = massiv[i][a];
- massiv[i][a] = massiv[i][b];
- massiv[i][b] = buf;
- }
- }
- void transpose() {
- int c = NC;
- NC = NR;
- NR = c;
- Vect* buf = new Vect[NR];
- for(int i = 0; i < NR; i++) {
- buf[i] = new Vect(NC);
- for(int j = 0; j < NC; j++) {
- buf[i][j] = massiv[j][i];
- }
- }
- delete[] massiv;
- massiv = buf;
- }
- Matrix getBlock(int y, int x, int a, int b) {
- Matrix rslt(a, b);
- for(int i = 0; i < a; i++) {
- for(int j = 0; j < b; j++) {
- rslt[i][j] = massiv[i+y][j+x];
- }
- }
- return rslt;
- }
- void putBlock(int y, int x, double** m, int a, int b) {
- for(int i = 0; i < a; i++) {
- for(int j = 0; j < b; j++) {
- massiv[i+y][j+x] = m[i][j];
- }
- }
- }
- void putBlock(int y, int x, Matrix m) {
- for(int i = 0; i < m.rows(); i++) {
- for(int j = 0; j < m.columns(); j++) {
- massiv[i+y][j+x] = m[i][j];
- }
- }
- }
- Matrix sumRows(int a, int b, double n) {
- Matrix rslt(*this);
- for(int i = 0; i < NC; i++) rslt[a][i] = massiv[a][i] + massiv[b][i] * n;
- return rslt;
- }
- ~Matrix() {
- delete[] massiv;
- }
- };
- double func(Matrix m) {
- double max = 0;
- int a = m.rows();
- int b = m.columns();
- int n = b - a;
- for(int i = 0; i < a; i++) max += m[i][i];
- for(int i = 1; i <= n; i++) {
- int sum = 0;
- for(int j = 0; j < n; j++) sum += m[j][j+i];
- if(sum > max) max = sum;
- }
- return max;
- }
- void prog() {
- int m, n;
- std::cout << "Vvedi m: ";
- std::cin >> m;
- std::cout << "Vvedi n: ";
- std::cin >> n;
- Matrix M(m, n);
- for(int i = 0; i < m; i++) {
- for(int j = 0; j < n; j++) {
- M[i][j]= rand();
- std::cout << M[i][j] << " ";
- }
- std::cout << std::endl;
- }
- std::cout << "Max summa: " << func(M) << std::endl;
- }
- int main() {
- prog();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement