Перемножение матриц - C (СИ) (72240)

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

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

Помогите найти ошибку. Матрицы перемножает но выводит (Как я понимаю переполненные переменные чтоли) Вы вод не тот Но ищет Максимум правильно
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//Заполнение матрицы А
int zap_a(float **a, int n, int m, int i, int j)
{
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
printf("a[%d][%d] = ", i,j);
scanf("%g", &a[i][j]);
}
return 0;
}
//Выводим матрицу A
int vivoda(float **a, int n, int m, int i, int j)
{
printf("\n");
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
printf("%g ", a[i][j]);
printf("\n");
}
return 0;
}
 
//Умножение матрицы A на матрицу A
int anab(float **b, float **a, float **ss,  int n, int m, int i, int j, float f, int k)
{
        for(i=0;i<n;i++)
        {
                for(j=0;j<n;j++)
                {
                f=0;
                        for(k=0;k<n;k++)
                        {
                        f=f+a[i][k]*b[k][j];
                        ss[i][j]=f;
                        }
 
                }
        }
 
return 0;
}
 
//Выводим матрицу ss
int vivodss(float **ss, int n, int m, int i, int j)
{
printf("\n");
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
printf("%g ", ss[i][j]);
printf("\n");
}
return 0;
}
 
//Находим максимум
int maxi( float **ss, int i, int j, int l, int m, int n, float max)
{
max=0;
for(i = 1; i < n; i++ )
{
        for(j = 0; j < m; j++ )
        {
                if( ss[i][j]>max )
                {
                max=ss[i][j];
                }
        }
 
}
printf("%g ", max);
return 0;
}

int main()
{
int i,j,n,m,q,p,k,l,f;
float  **a,**b,**ss,temp,s,smax,max;
smax=0; s=0; k=0; max=0;
printf("N= ");
scanf("%d", &n);
printf("M= ");
scanf("%d", &m);

//выделение памяти для динамического массива A
a=(float**)malloc(sizeof(float*));
a[i]=(float*)malloc(sizeof(float*));
for (i = 0; i < n; i++)
a[i] = (float*)malloc(m * sizeof(float));
//выделение памяти для динамического массива b
b=(float**)malloc(sizeof(float*));
b[i]=(float*)malloc(sizeof(float*));
for (i = 0; i < n; i++)
b[i] = (float*)malloc(m * sizeof(float));
//выделение памяти для динамического массива ss
ss=(float**)malloc(sizeof(float*));
ss[i]=(float*)malloc(sizeof(float*));
for (i = 0; i < n; i++)
ss[i] = (float*)malloc(m * sizeof(float));
 
//Функции
zap_a(a,n,m,i,j);
printf("\nOriginal matrix A");
vivoda(a,n,m,i,j);
anab(b,a,ss,n,m,i,j,f,k);
printf("\nOriginal matrix SS");
vivodss(ss,n,m,i,j);
maxi(ss,i,j,l,m,n,max);
free(a);
free(b);
free(ss);
getch();  }

Решение задачи: «Перемножение матриц»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//Заполнение матрицы
void zap_a(double **a, int n, int m)
{
    int i,j;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
        {
            printf("elem[%d][%d] = ", i,j);
            scanf("%lg", &a[i][j]);
        }
}
//Выводим матрицу
void vivoda(double **a, int n, int m)
{ 
    int i,j;
    printf("\n");
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
            printf("%lg ", a[i][j]);
        printf("\n");
    }
}
 
//Умножение матрицы A на матрицу B
void anab(double **a, double **b, double **ss,  int n, int m,int k )
{
    int i,j,k0;
    double f;
    for(i=0;i<n;i++)
    {
        for(j=0;j<k;j++)
        {
            f=0;
            for(k0=0;k0<m;k0++)
                f+=a[i][k0]*b[k0][j];
            ss[i][j]=f;
        }
    }
}
 
 
 
//Находим максимум
double maxi( double **ss,  int n, int m)
{
    int i,j,l;
    double max=ss[0][0];
    for(i = 1; i < n; i++ )
    {
        for(j = 0; j < m; j++ )
        {
            if( ss[i][j]>max )
            {
                max=ss[i][j];
            }
        }
 
    }
    return max;
}
 
 
int main()
{
    int n,m,i;
    double  **a,**b,**ss,max;
    printf("N= ");
    scanf("%d", &n);
    printf("M= ");
    scanf("%d", &m);
 
 
    //выделение памяти для динамического массива A
    a=(double**)malloc(sizeof(double*)*n);
    //a[i]=(double*)malloc(sizeof(double*));
    for (i = 0; i < n; i++) // a размером [n][m]
        a[i] = (double*)malloc(m * sizeof(double));
    //выделение памяти для динамического массива b
    b=(double**)malloc(sizeof(double*)*m);
    //b[i]=(double*)malloc(sizeof(double*));
    for (i = 0; i < m; i++) // b размером [m][n]
        b[i] = (double*)malloc(n * sizeof(double));
    //выделение памяти для динамического массива ss
    ss=(double**)malloc(sizeof(double*)*n); // ss размером [n][n]
    //ss[i]=(double*)malloc(sizeof(double*));
    for (i = 0; i < n; i++)
        ss[i] = (double*)malloc(n * sizeof(double));
 
    //Функции
    zap_a(a,n,m);
    printf("\nOriginal matrix A\n");
    vivoda(a,n,m);
 
    zap_a(b,m,n);
    printf("\nOriginal matrix B\n");
    vivoda(b,m,n);
 
    anab(a,b,ss,n,m,n);
    printf("\nMultiplication result matrix SS\n");
    vivoda(ss,n,n);
    max=maxi(ss,n,n);
    printf("SS max=%lg\n", max);
    for (i = 0; i < n; i++)
        free(a[i]);
    free(a);
    for (i = 0; i < m; i++)
        free(b[i]);
    free(b);
    for (i = 0; i < n; i++)
        free(ss[i]);
    free(ss);
    getch();
    return 0;
}

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

  1. Заполнение матрицы: функция zap_a считывает значения элементов матрицы a с помощью функции scanf.
  2. Вывод матрицы: функция vivoda выводит значения элементов матрицы a.
  3. Умножение матрицы: функция anab выполняет умножение матрицы a на матрицу b и сохраняет результат в матрице ss.
  4. Нахождение максимума: функция maxi ищет максимальное значение в матрице ss и сохраняет его в переменной max.
  5. Выделение памяти для матриц a, b и ss: в функции main происходит выделение памяти для динамических массивов a, b и ss с помощью функций malloc.
  6. Освобождение памяти: в конце программы выполняется освобождение памяти с помощью функции free для каждого массива.
  7. Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы a с помощью функции scanf.
  8. Вывод матрицы: функция vivoda выводит значения элементов матрицы a.
  9. Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы b с помощью функции scanf.
  10. Вывод матрицы: функция vivoda выводит значения элементов матрицы b.
  11. Умножение матрицы: функция anab выполняет умножение матрицы a на матрицу b и сохраняет результат в матрице ss.
  12. Вывод матрицы: функция vivoda выводит значения элементов матрицы ss.
  13. Нахождение максимума: функция maxi ищет максимальное значение в матрице ss и сохраняет его в переменной max.
  14. Освобождение памяти: в конце программы выполняется освобождение памяти с помощью функции free для каждого массива.
  15. Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы a с помощью функции scanf.
  16. Вывод матрицы: функция vivoda выводит значения элементов матрицы a.
  17. Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы b с помощью функции scanf.
  18. Вывод матрицы: функция vivoda выводит значения элементов матрицы b.
  19. Умножение матрицы: функция anab выполняет умножение матрицы a на матрицу b и сохраняет результат в матрице ss.
  20. Вывод матрицы: функция vivoda выводит значения элементов матрицы ss.

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


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

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

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