Прога

Прога


#include "stdafx.h"

#include <iostream>

using namespace std;


struct matrix {

        matrix *next;

        float **a;

        int nn, mm;

        //constructor

        matrix(int n, int m) {

                a = new float*[n];

                for (int i = 0;i < n;i++) {

                        a[i] = new float[m];

                }

                for (int i = 0;i < n;i++) {

                        for (int j = 0;j < m;j++) {

                                a[i][j] = 0;

                        }

                }

                this->nn = n;

                this->mm = m;

        }


        matrix() {};

        //destructor

        ~matrix() {

                for (int i = 0;i < nn;i++) {

                        //delete a[i];

                }

                //delete a;

        }


        float *access(int n, int m) {

                return &a[n][m];

        };



        

        void m_out() {

                for (int i = 0;i < nn;i++) {

                        for (int j = 0;j < mm;j++) {

                                cout << a[i][j] << " ";

                        }

                        cout << endl;

                }

        }


};

//"+"

matrix operator+(matrix ma1, matrix ma2) {

        int n1 = ma1.nn;

        int m1 = ma1.mm;

        int n2 = ma2.nn;

        int m2 = ma2.mm;

        if (n1 == n2 && m1 == m2) {

                matrix c(n1,m1);

                for (int i = 0;i < n1;i++) {

                        for (int j = 0;j < m1;j++) {

                                c.a[i][j] = ma1.a[i][j] + ma2.a[i][j];

                        }

                }

                return c;

        }

        else {

                cout << "Size error" << endl;

        }

};


//"-"

matrix operator-(matrix ma1, matrix ma2) {

        int n1 = ma1.nn;

        int m1 = ma1.mm;

        int n2 = ma2.nn;

        int m2 = ma2.mm;

        if (n1 == n2 && m1 == m2) {

                matrix c(n1, m1);

                for (int i = 0;i < n1;i++) {

                        for (int j = 0;j < m1;j++) {

                                c.a[i][j] = ma1.a[i][j] - ma2.a[i][j];

                        }

                }

                return c;

        }

        else {

                cout << "Size error" << endl;

        }

};


//"*"

matrix operator*(matrix ma1, matrix ma2) {

        int n1 = ma1.nn;

        int m1 = ma1.mm;

        int n2 = ma2.nn;

        int m2 = ma2.mm;

        if (m1==n2) {

                matrix c(n1,m2);

                for (int i = 0;i < n1;i++) {

                        for (int j = 0;j < m2;j++) {

                                for (int k = 0;k < n1;k++) {

                                        c.a[i][j] += ma1.a[i][k] + ma2.a[k][j];

                                }

                        }

                }

                return c;

        }

        else {

                cout << "Size error" << endl;

        }

};



class List {

public:

        List();

        ~List();

        void add(matrix data);

        int GetSize() { return size; };

        void add_index(matrix data, int index);

        void del_index(int index);


        matrix& operator[](const int index);


private:

        class Node {

        public:

                Node *next;

                matrix data;


                Node(matrix data = matrix(0,0), Node* pnext = nullptr) {

                        this->data = data;

                        this->next = pnext;

                }



        };

        int size;

        Node *head;

};






List::List() {

        size = 0;

        head = nullptr;

};


List::~List() { }




//добавление элемента в список

void List::add(matrix data) {

        if (head == nullptr) {

                head = new Node(data);

        }

        else {

                Node *current = this->head;

                while (current->next != nullptr) {

                        current = current->next;

                }

                current->next = new Node(data);

        }

        size++;

};



//добавить в определенную позицию

void List::add_index(matrix data, int index) {

        Node *current = head;

        Node *temp;

        for (int i = 0;i<index - 1;i++) {

                current = current->next;

        }

        temp = current->next;


        current->next = new Node(data);

        current = current->next;

        current->next = temp;

        size++;


}



//удалить из определенной позиции

void List::del_index(int index) {

        Node *current = head;

        Node *temp;

        for (int i = 0;i<index - 1;i++) {

                current = current->next;

        }

        temp = current->next;

        current->next = temp->next;

        delete temp;

        size--;

}



matrix& List::operator[](const int index) {

        Node *current = this->head;

        int count = 0;

        while (current != nullptr) {

                if (count == index)

                        return current->data;


                current = current->next;

                count++;

        }

};



void l_out(List l) {

        for (int i = 0;i < l.GetSize();i++) {

                l[i].m_out();

                cout << endl;

        }

}



//транспонированная матрица

void ret_tr(matrix &a) {

        matrix c(a.mm, a.nn);

        for (int i = 0;i < c.nn;i++) {

                for (int j = 0;j < c.mm;j++) {

                        c.a[j][i] = a.a[i][j];

                }

        }

        for (int i = 0;i < c.nn;i++) {

                for (int j = 0;j < c.mm;j++) {

                        a.a[i][j] = c.a[i][j];

                }

        }


};



int main()

{

        matrix a1(3, 3);

        matrix a2(3, 3);

        for (int i = 0;i < 2;i++) {

                for (int j = 0;j < 2;j++) {

                        a1.a[i][j] = i+j;

                }

        }

        for (int i = 0;i < 2;i++) {

                for (int j = 0;j < 2;j++) {

                        a2.a[i][j] = i * j;

                }

        }

        List l;

        l.add(a1);

        l.add(a2);

        a1 = a1*a2;

        a1.m_out();

        cout << endl;

        ret_tr(a1);

        a1.m_out();


        system("pause");

  return 0;

}


Report Page