Программа считывает матрицы из документа и умножает следующие матрицы(AxBxCx…) проверяя одновременно можно ли умножить следующую матрицу на результат предыдущей операции

 В документе text.txt находятся данные в следующем формате

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
5
4 4
1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2
2 4
1 2
3 4
7 6
5 4
3 2
10 11 12
13 14 15
3 3
1 2 3
4 5 6
7 8 9
2 2
1 1
5 5

-Первое целое число в документе сообщает количество матриц в документе

-Далее находятся матрицы вида MxN ,где

-Две первые цифры это количество строк и столбцов

Далее находятся значения следующих строк

Напиши программу, которая использует матрицы из документа и умножает следующие матрицы(AxBxCx…) проверяя одновременно можно ли умножить следующую матрицу на результат предыдущей операции. Конечный результат выписать на экран.
text
anya_zadanie_2_cpp_int

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//#include "dialog.h"
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<iostream>
#include<windows.h>

using namespace std;
int main()
{
  system("chcp 1251"); //Русский
  system("cls");
  int kol_matryc;
  FILE *f;
  f=fopen("C:\\Users\\Vadim\\Documents\\text.txt","r"); //Путь к файлу и имя файла
  if (NULL==f)
  {
    cout << "Файл не найден проверьте путь! " <<endl;//printf("File ne naiden!");
  }
  fscanf(f,"%d",&kol_matryc); //Считываем количество матриц
  cout << "Количество матриц = " << kol_matryc<<endl; //printf( "Kolichestwo matric=%d ",;
  int *m=new int[kol_matryc];//Массивы размерностей матриц
  int *n=new int[kol_matryc];
  int ***matr =new int **[kol_matryc];//трехмерный массив [номер матрицы,строки,столбцы]
  for (int k=0;k<kol_matryc;k++) //Цикл по номерам матриц
  {
    cout << endl;//printf("\n Matrnomer%d", k); //перевод строки
    fscanf(f,"%d%d",&n[k],&m[k]); //Считываем размерность к той матрицы
    cout<<" Размер m*n " << k << "матрицы = " << m[k]<< "x" <<n[k]; //printf( "m*n [%d]=%d,%d ",k,m[k],n[k]);
    matr[k]=new int*[m[k]];
      for (int count = 0; count < m[k]; count++)// m- строк
                              matr[k][count] = new int [n[k]];//n-столбцов   
      for(int i=0;i<m[k];i++)
      {
        cout << endl; //printf("\n");
        for (int j=0;j<n[k];j++)
        {
          fscanf(f,"%d",&matr[k][i][j]); //Считываем элементы к-той матрицы
          cout << matr[k][i][j]<< " "; //printf( "[%d,%d]=%d ",i,j,matr[k][i][j]);
        }
      }
  }
  // Умножение матриц
  for (int k=0;k<kol_matryc-1;k++) //Цикл по номерам матриц
  {  
    if (n[k] != m[k+1])
    {
      cout << "Нельзя умножить следующую номер " << k+1 << " матрицу на результат предыдущей операции" <<endl;
      cin.get(); cin.get();
      return 0;
    }
    else
    {  
      cout <<endl<< "Матрица произведения предыдущей на" << k+1  <<endl;
      int **proizw = new int*[m[k]];
      for (int i = 0; i<m[k]; i++)
      {
        proizw[i] = new int[n[k+1]];
        for (int j = 0; j<n[k+1]; j++)
        {               // Произведения элементов матрицы  
          proizw[i][j] = 0;
          for (int z = 0; z<n[k]; z++)
          {
            proizw[i][j] += matr[k][i][z] * matr[k+1][z][j];
          }          
          cout << proizw[i][j] << " ";// Вывод элементов матрицы  произведения        
        }
        cout << endl;
      }
      matr[k+1]=proizw; //Заменяем к+1 матрицу произведением (указатель)
      m[k+1]=m[k];
      n[k+1]=n[k+1];
    }
  }
}

Умножение матриц
Чтобы можно было умножить две матрицы, количество столбцов первой матрицы должно быть равно количеству строк второй матрицы.
Алгоритм умножения матриц
Умножаем элементы в строках первой матрицы на элементы в столбцах второй матрицы.

Умножаем элементы первой строки на элементы первого столбца.
Умножаем первый элемент первой строки на первый элемент первого столбца.
Умножаем второй элемент первой строки на второй элемент первого столбца.
Делаем то же самое с каждым элементом, пока не дойдем до конца как первой строки первой матрицы, так и первого столбца второй матрицы.
Складываем полученные произведения.
Полученный результат будет первым элементом первой строки произведения матриц.
Умножаем элементы первой строки первой матрицы на элементы второго столбца второй матрицы.
Умножаем первый элемент первой строки на первый элемент второго столбца.
Умножаем второй элемент первой строки на второй элемент второго столбца.
Делаем то же самое с каждым элементом, пока не дойдем до конца как первой строки первой матрицы, так и второго столбца второй матрицы.
Складываем полученные произведения.
Полученный результат будет вторым элементом первой строки произведения матриц.
Применяя тот же самый алгоритм, умножаем элементы первой строки первой матрицы на элементы остальных столбцов второй матрицы. Полученные числа составят первую строку вычисляемой матрицы.
Вторая строка вычисляемой матрицы находится аналогично умножением элементов второй строки первой матрицы на элементы каждого столбца второй матрицы: результаты записываются в новую матрицу после каждого суммирования.
Делаем это с каждой строкой первой матрицы, пока все строки новой матрицы не будут заполнены.

Добавить комментарий