Перемножение матриц - 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;
}
Объяснение кода листинга программы
- Заполнение матрицы: функция zap_a считывает значения элементов матрицы a с помощью функции scanf.
- Вывод матрицы: функция vivoda выводит значения элементов матрицы a.
- Умножение матрицы: функция anab выполняет умножение матрицы a на матрицу b и сохраняет результат в матрице ss.
- Нахождение максимума: функция maxi ищет максимальное значение в матрице ss и сохраняет его в переменной max.
- Выделение памяти для матриц a, b и ss: в функции main происходит выделение памяти для динамических массивов a, b и ss с помощью функций malloc.
- Освобождение памяти: в конце программы выполняется освобождение памяти с помощью функции free для каждого массива.
- Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы a с помощью функции scanf.
- Вывод матрицы: функция vivoda выводит значения элементов матрицы a.
- Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы b с помощью функции scanf.
- Вывод матрицы: функция vivoda выводит значения элементов матрицы b.
- Умножение матрицы: функция anab выполняет умножение матрицы a на матрицу b и сохраняет результат в матрице ss.
- Вывод матрицы: функция vivoda выводит значения элементов матрицы ss.
- Нахождение максимума: функция maxi ищет максимальное значение в матрице ss и сохраняет его в переменной max.
- Освобождение памяти: в конце программы выполняется освобождение памяти с помощью функции free для каждого массива.
- Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы a с помощью функции scanf.
- Вывод матрицы: функция vivoda выводит значения элементов матрицы a.
- Ввод значений матрицы: в функции zap_a пользователю предлагается ввести значения элементов матрицы b с помощью функции scanf.
- Вывод матрицы: функция vivoda выводит значения элементов матрицы b.
- Умножение матрицы: функция anab выполняет умножение матрицы a на матрицу b и сохраняет результат в матрице ss.
- Вывод матрицы: функция vivoda выводит значения элементов матрицы ss.