Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <cmath>
- using namespace std;
- class MATRIX; // Прототип класса. Нужен для объявления функций
- class VECTOR
- {
- double vect[30];
- int n;
- public:
- VECTOR(int a){
- n = a;
- }
- friend void pro_matr_vect(MATRIX* m, VECTOR* v, VECTOR* r);
- friend void vvod(VECTOR *y1);
- friend void vivod(MATRIX *y1, VECTOR *y2, ostream &sout);
- friend void vivod_pro(VECTOR *y5, ostream &sout);
- };
- class MATRIX_SQ
- {
- int ch, n;
- double mas[30][30];
- public:
- MATRIX_SQ(int a)
- {
- n = a;
- cout << "Создается объект." << endl;
- }
- MATRIX_SQ(const MATRIX_SQ &ob)
- {
- n = ob.n;
- ch = ob.ch + 1;
- cout << "Создается копия." << endl;
- }
- ~MATRIX_SQ()
- {
- if (ch == 0)
- cout << "Объект разрушен, здесь сработал деструктор." << endl;
- else
- cout << "Копия объекта разрушена." << endl;
- }
- int get_n() {return n;};
- friend void vvod(MATRIX_SQ *y1);
- friend void vivod(MATRIX *y1, MATRIX_SQ *y2, ostream &sout);
- void pro(MATRIX* y1, MATRIX* y5);
- };
- class MATRIX
- {
- int ch, m, n;
- double mas[30][30];
- public:
- MATRIX(int a, int b)
- {
- ch = 0;
- m = a;
- n = b;
- cout << "Создается объект." << endl;
- }
- MATRIX(const MATRIX &ob)
- {
- m = ob.m;
- n = ob.n;
- ch = ob.ch + 1;
- cout << "Создается копия." << endl;
- }
- ~MATRIX()
- {
- if (ch == 0)
- cout << "Объект разрушен, здесь сработал деструктор." << endl;
- else
- cout << "Копия объекта разрушена." << endl;
- }
- int get_m() {return m;};
- int get_n() {return n;};
- friend bool can_add(MATRIX* y1, MATRIX* y2);
- friend bool can_mlt(MATRIX* y1, MATRIX* y2);
- friend void vvod(MATRIX *y1);
- friend void MATRIX_SQ::pro(MATRIX* y1, MATRIX* y5);
- friend double umn(MATRIX*, MATRIX*);
- friend void vvod(MATRIX *y1);
- friend void vvod(MATRIX_SQ *y1);
- friend void sum(MATRIX *y1, MATRIX *y2, MATRIX *y3);
- friend void raz(MATRIX *y1, MATRIX *y2, MATRIX *y3);
- friend double umn(MATRIX *y1, MATRIX *y3);
- friend void vivod_sum_raz(MATRIX *y1, MATRIX *y2, MATRIX *y3, int ch, ostream &sout);
- friend void vivod_pro(MATRIX *y1, MATRIX_SQ *y4, MATRIX *y5, ostream &sout);
- friend void vivod_umn(MATRIX *y1, MATRIX *y3, double y, ostream &sout);
- friend void vivod(MATRIX *y1, MATRIX *y2, ostream &sout);
- friend void vivod(MATRIX *y1, MATRIX_SQ *y2, ostream &sout);
- friend void pro_matr_vect(MATRIX* m, VECTOR* v, VECTOR* r);
- friend void vivod(MATRIX *y1, VECTOR *y2, ostream &sout);
- };
- void pro_matr_vect(MATRIX* m, VECTOR* v, VECTOR* r){
- int i, k;
- for(i = 0; i < m->get_m(); i++)
- {
- r->vect[i] = 0;
- for(k = 0; k < m->get_n(); k++)
- r->vect[i] += m->mas[i][k] * v->vect[k];
- }
- }
- void MATRIX_SQ::pro(MATRIX* y1, MATRIX* y5){
- int i, j, k;
- for(i = 0; i < y1->get_m(); i++)
- {
- for(j = 0; j < this->get_n(); j++)
- {
- y5->mas[i][j] = 0;
- for(k = 0; k < y1->get_n(); k++)
- y5->mas[i][j] += y1->mas[i][k] * this->mas[k][j];
- }
- }
- }
- bool can_add(MATRIX* y1, MATRIX* y2){
- return (y1->m == y2->m) && (y1->n == y2->n);
- }
- bool can_mlt(MATRIX* y1, MATRIX* y2){
- return y1->m == y2->n;
- }
- void vvod(MATRIX *y1);
- void vvod(MATRIX_SQ *y1);
- void sum(MATRIX *y1, MATRIX *y2, MATRIX *y3);
- void raz(MATRIX *y1, MATRIX *y2, MATRIX *y3);
- double umn(MATRIX *y1, MATRIX *y3);
- void pro(MATRIX *y1, MATRIX *y4, MATRIX *y5);
- void vivod(MATRIX *y1, MATRIX *y2, ostream &sout);
- void vivod_sum_raz(MATRIX *y1, MATRIX *y2, MATRIX *y3, int ch, ostream &sout);
- void vivod_umn(MATRIX *y1, MATRIX *y3, double y, ostream &sout);
- void vivod_pro(MATRIX *y1, MATRIX *y4, MATRIX *y5, ostream &sout);
- int main()
- {
- setlocale(LC_ALL, "rus_rus.1251");
- MATRIX_SQ mat4(5);
- MATRIX mat1(5,6), mat2(5,6), mat3(5,6);//, mat4(6,5);
- MATRIX
- *y1_5x6 = &mat1,
- *y2_5x6 = &mat2,
- *y3_5x6 = &mat3;
- //, *y5;
- MATRIX_SQ
- *y4_5x5 = &mat4;
- VECTOR v6(6);
- VECTOR v5(5);
- int ch;//, q;
- //double y;
- //y1 = &mat1;
- //y2 = &mat2;
- //y3 = &mat3;
- //y4 = &mat4;
- //y5 = &mat5;
- cout << "Ввод 1-ой матрицы 5x6:" << endl;
- vvod(y1_5x6);
- cout << "1 - Сумма матриц, 2 - Разность матриц, 3 - Произведение матриц, 4 - умножение матрицы на вектор, 5 - умножение вектора на матрицу" << endl;
- cin >> ch;
- ofstream pout("d:\\out.txt");
- switch (ch)
- {
- case 1: // Сложение матриц 5х6
- case 2: // Вычитание матриц 5х6
- cout << "Ввод 2-ой матрицы 5x6:" << endl;
- vvod(y2_5x6);
- if (can_add(y1_5x6,y2_5x6))
- {
- if(ch == 1)
- sum(y1_5x6, y2_5x6, y3_5x6);
- else
- raz(y1_5x6, y2_5x6, y3_5x6);
- vivod(y1_5x6, y2_5x6, cout);
- vivod(y1_5x6, y2_5x6, pout);
- vivod_sum_raz(y1_5x6, y2_5x6, y3_5x6, ch, cout);
- vivod_sum_raz(y1_5x6, y2_5x6, y3_5x6, ch, pout);
- }
- else
- {
- cout << "Операция не выполнена, так как ввод размерностей неверный!" << endl;
- return 2;
- }
- break;
- case 3: // Произведение матриц 5х6 на 5х5
- cout << "Ввод 2-ой матрицы 5x5:" << endl;
- vvod(y4_5x5);
- y4_5x5 -> pro(y1_5x6, y3_5x6);
- vivod(y1_5x6, y4_5x5, cout);
- vivod(y1_5x6, y4_5x5, pout);
- vivod_pro(y1_5x6, y4_5x5, y3_5x6, cout);
- vivod_pro(y1_5x6, y4_5x5, y3_5x6, pout);
- break;
- case 4: // Умножение матрицы 5х6 на вектор 6х1
- cout << "Ввод вектора длины 6:" << endl;
- vvod(&v6);
- pro_matr_vect(y1_5x6, &v6, &v5);
- vivod(y1_5x6, &v6, cout);
- vivod_pro(&v5, cout);
- break;
- default:
- cout << "Error" << endl;
- return -1;
- }
- pout.close();
- return 0;
- }
- void vvod(MATRIX *y1)
- {
- for(int i = 0; i < y1->get_m(); i++)
- {
- for(int j = 0; j < y1->get_n(); j++)
- {
- cout << "Введите mat[" << i << "][" << j << "] ";
- cin >> y1->mas[i][j];
- }
- }
- }
- void vvod(VECTOR *y1)
- {
- for(int i = 0; i < y1->n; i++)
- {
- cout << "Введите mat[" << i << "] ";
- cin >> y1->vect[i];
- }
- }
- void vvod(MATRIX_SQ *y1)
- {
- for(int i = 0; i < y1->n; i++)
- {
- for(int j = 0; j < y1->n; j++)
- {
- cout << "Введите mat[" << i << "][" << j << "] ";
- cin >> y1->mas[i][j];
- }
- }
- }
- void sum(MATRIX *y1, MATRIX *y2, MATRIX *y3)
- {
- for(int i = 0; i < y1->get_m(); i++)
- for(int j = 0; j < y1->get_n(); j++)
- y3->mas[i][j] = y1->mas[i][j] + y2->mas[i][j];
- }
- void raz(MATRIX *y1, MATRIX *y2, MATRIX *y3)
- {
- for(int i = 0; i < y1->get_m(); i++)
- for(int j = 0; j < y1->get_n(); j++)
- y3->mas[i][j] = y1->mas[i][j] - y2->mas[i][j];
- }
- double umn(MATRIX *y1, MATRIX *y3)
- {
- double k;
- cout << "Введите число: ";
- cin >> k;
- for(int i = 0; i < y1->get_m(); i++)
- for(int j = 0; j < y1->get_n(); j++)
- y3->mas[i][j] = k * y1->mas[i][j];
- return k;
- }
- void vivod(MATRIX *y1, MATRIX *y2, ostream &sout)
- {
- for(int i = 0; i < y1->get_m(); i++)
- {
- if(i == y1->get_m() / 2)
- {
- sout << "A = ";
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y1->get_n(); j++)
- {
- sout << y1->mas[i][j] << ' ';
- }
- sout << " ";
- if(i == y2->get_m() / 2)
- {
- sout << "B = ";
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y2->get_n(); j++)
- {
- sout << y2->mas[i][j] << ' ';
- }
- sout << endl;
- }
- sout << endl;
- }
- void vivod(MATRIX *y1, VECTOR *y2, ostream &sout)
- {
- int rows = max(y1->m, y2->n);
- for(int i = 0; i < rows; i++)
- {
- if(i == y1->get_m() / 2)
- {
- sout << "A = ";
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y1->get_n(); j++)
- {
- if(i < y1->m)
- sout << y1->mas[i][j] << ' ';
- else
- sout << " ";
- }
- sout << " ";
- if(i == y2->n / 2)
- {
- sout << "B = ";
- }
- else
- {
- sout << " ";
- }
- sout << y2->vect[i] << ' ';
- sout << endl;
- }
- sout << endl;
- }
- void vivod(MATRIX *y1, MATRIX_SQ *y2, ostream &sout)
- {
- for(int i = 0; i < y1->get_m(); i++)
- {
- if(i == y1->get_m() / 2)
- {
- sout << "A = ";
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y1->get_n(); j++)
- {
- sout << y1->mas[i][j] << ' ';
- }
- sout << " ";
- if(i == y2->get_n() / 2)
- {
- sout << "B = ";
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y2->get_n(); j++)
- {
- sout << y2->mas[i][j] << ' ';
- }
- sout << endl;
- }
- sout << endl;
- }
- void vivod_sum_raz(MATRIX *y1, MATRIX *y2, MATRIX *y3, int ch,ostream &sout)
- {
- for(int i = 0; i < y1->get_m(); i++)
- {
- if(i == y1->get_m() / 2)
- {
- if(ch == 1)
- {
- sout << "A + B = ";
- } else
- if(ch == 2)
- {
- sout << "A - B = ";
- }
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y2->get_n(); j++)
- {
- sout << y3->mas[i][j] << ' ';
- }
- sout << endl;
- }
- }
- void vivod_umn(MATRIX *y1, MATRIX *y3, double y,ostream &sout)
- {
- for(int i = 0; i < y1->get_m(); i++)
- {
- if(i == y1->get_m() / 2)
- {
- sout << y << " * A = ";
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y1->get_n(); j++)
- {
- sout << y3->mas[i][j] << ' ';
- }
- sout << endl;
- }
- }
- void vivod_pro(MATRIX *y1, MATRIX_SQ *y4, MATRIX *y5, ostream &sout)
- {
- for(int i = 0; i < y1->get_m(); i++)
- {
- if(i == y1->get_m() / 2)
- {
- sout << "B * A = ";
- }
- else
- {
- sout << " ";
- }
- for(int j = 0; j < y4->get_n(); j++)
- {
- sout << y5->mas[i][j] << ' ';
- }
- sout << endl;
- }
- }
- void vivod_pro(VECTOR *y5, ostream &sout)
- {
- for(int i = 0; i < y5->n; i++)
- {
- if(i == y5->n / 2)
- {
- sout << "A * B = ";
- }
- else
- {
- sout << " ";
- }
- sout << y5->vect[i] << ' ';
- sout << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement