Перемножить матрицы и вывести результат - C (СИ)

Узнай цену своей работы

Формулировка задачи:

помогите, пожалуйста, найти и исправить ошибки в фрагменте программы. вообще она должна делать с матрицами все, но пока проблема в том, чтобы их перемножить и грамотно вывести на экран. программа должна быть написана на си, без использования с++ сама программа:
#include "stdafx.h"
#include <stdlib.h>
#include <math.h>
 
int print_matrix(int **arr, int m, int n);
int **get_matrix(int m, int n);
int check_matrixes(int m1, int n1, int m2, int n2);
int multiply_matrixes(  int **matrix_1, int m1, int n1,
                        int **matrix_2, int m2, int n2,
                        int ***result_matrix, int *result_m, int *result_n);
int main()
{
    int m_A, n_A,q , m_B, n_B , m_C, n_C;
    int **A=(int **) calloc(m_A, sizeof(int));   
        for (int i=0; i<m_A; i++)
                A[i]=(int *) calloc(n_A, sizeof(int));
    int **B=(int **) calloc(m_B, sizeof(int));   
        for (int i=0; i<m_B; i++)
                B[i]=(int *) calloc(n_B, sizeof(int));
    int **C=(int **) calloc(m_C, sizeof(int));   
        for (int i=0; i<m_C; i++)
                C[i]=(int *) calloc(n_C, sizeof(int));
    do 
        {   printf("write original matrix size:\n");
            printf("write row number:\n");
                scanf ("%d",&m_A);
            printf ("write coloum number:\n");
                scanf ("%d",&n_A);
        (get_matrix(m_A, n_A));
        }
    while (m_A<=0||n_A<=0);
//интерфейс
        for ( ; ; )
        {printf("write the number of operation:\n 0-print matrix\n 1-Addition\n  C=k1*A+k2*B\n");
         printf(" 2-Multiplication\n  C=A*B\n 3-determinant\n 4-inverse matrix\n 5-exit\n");
          scanf("%d",&q);
            switch (q)
            {   case 0: (print_matrix(A, m_A, n_A));
                        break;
                case 1: 
                        break;
                case 2: do 
                        {   printf("write second matrix size:\n");
                                printf("write row number:\n");
                                    scanf ("%d",&m_B);
                                printf ("write coloum number:\n");
                                    scanf ("%d",&n_B);
                            (get_matrix(m_B, n_B));
                        }
                        while (m_B<=0||n_B<=0); 
                    if (check_matrixes(m_A , n_A, m_B, n_B))
                    {
                        if (multiply_matrixes(*A, m_A, n_A,
                            *B, m_B, n_B,
                            *C, &m_C, &n_C))
                        {
                            printf ("\n\nRESULT:\n\n");
                            print_matrix (*C, m_C, n_C);
                        }
                    }else printf ("\n\n====MATRIXES CAN NOT BE MULTIPLY====\n\n");
                        break;
                case 3: 
                        break;
                case 4:
                        break;
                case 5: return 0;
                        break;
                default: printf("\n\n====WRONG NUMBER====\n\n");
            }
        }
 
        return 0;
}
//функция выделения памяти и получения матрицы
int **get_matrix(int m, int n)
{   
    int **arr=(int **) calloc(m, sizeof(int));   
        for (int i=0; i<m; i++)
                arr[i]=(int *) calloc(n, sizeof(int));
        //Ввод элементов матрицы 
        printf("write matrix elements:\n");
        for(int i=0; i < m; i++)
            for(int j=0; j < n; j++)
                scanf("%d", (*(arr+i)+j));
    return arr;
}
//функция вывода матрицы на экран
int print_matrix(int **arr, int m, int n)
{
    for(int i=0; i < m; i++)
        for(int j=0; j < n; j++)
                    printf("%d\t", *(*(arr + i) + j));
return 0;
}
// проверка размерностей матриц
int check_matrixes(int m1, int n1, int m2, int n2)
{
    return (m2==n1);
}
// умножение матриц
int multiply_matrixes(  int **matrix_1, int m1, int n1,
                        int **matrix_2, int m2, int n2,
                        int ***result_matrix, int *result_m, int *result_n)
{
    *result_m = m1;
    *result_n = n1;
    int **ret = (int **) calloc(*result_m, sizeof(int));   
        for (int i=0; i<*result_m; i++)
                ret[i]=(int *) calloc(*result_n, sizeof(int));
        if (ret !=0 )
        {
            for (int i=0; i<*result_m; i++)
                for (int j=0; j<*result_n; j++)
                {
                    int sum = 0;
                    for (int t=0; t< m2; t++)
                    {
                        sum += matrix_1[i][t]*matrix_2[t][j];
                    }
                    (*result_matrix)[i][j] = sum;
                }return 0;
        }else return 1;
}

Решение задачи: «Перемножить матрицы и вывести результат»

textual
Листинг программы
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void enter(int** p,int n,char* h)
{
    cout<<"\n  Matrix "<<h<<":\n"; 
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++) cin>>p[i][j];
}
 
void out(int** p,int n)
{
    for(int i=0;i<n;i++) delete [] p[i]; 
    delete []p; 
}
 
void mult(int** a,int** b,int n)
{
    int c[n][n]; 
    for(int i=0;i<n;i++) 
    {
       for(int j=0;j<n;j++)
       {
           c[i][j]=0;
           for(int k=0;k<n;k++) c[i][j]+=a[i][k]*b[k][j];
           cout<<"  "<<c[i][j];
       }
       cout<<endl;
    }
}
 
  
int main()
{
    int i,n;
    cout<<"  n="; cin>>n;
    
    int** a=new int*[n]; 
    for(i=0;i<n;i++) a[i]=new int[n];  
    enter(a,n,"A");
    
    int** b=new int*[n]; 
    for(i=0;i<n;i++) b[i]=new int[n];  
    enter(b,n,"B");
   
    cout<<"\n  A*B:\n"; mult(a,b,n);  
       
    out(a,n);
    out(b,n);
    getch();
    return 0;
 
}

Объяснение кода листинга программы

В этом коде происходит перемножение двух матриц и вывод результата.

  1. Сначала объявляются две матрицы a и b, которые представляют собой двумерные массивы (матрицы) целых чисел.
  2. Затем пользователю предлагается ввести размерность матрицы (n).
  3. Далее, с помощью оператора new, выделяется память под матрицы a и b.
  4. Функция enter используется для ввода значений матрицы a и b.
  5. Функция mult выполняет перемножение матриц a и b, используя цикл for и операторы присваивания и сложения. Результат сохраняется в матрице c.
  6. Функция out используется для освобождения памяти, выделенной под матрицы a и b.
  7. В функции main, после вывода размера матрицы, происходит вызов функций enter, mult, out, а также используется функция getch для приостановки выполнения программы до нажатия клавиши.
  8. В конце программы возвращается 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы