Умножение матриц (не работает для неквадратных матриц) - C (СИ)
Формулировка задачи:
Доброго времени суток. Написал код для перемножения двух матриц. При вводе квадратной матрицы всё работает нормально.
При вводе матриц с разным количеством столбцов, т.е. 3x2 и 2x3 например, программа вылетает, при этом выдает правильный ответ. Видимо выход за границы массива. Помогите доработать. Заранее спасибо.
#include <stdio.h>
#include <stdlib.h>
int vvod(int **a, int m, int n){
int i,j;
{
for ( i=0;i<m;i++)
for ( j=0;j<n;j++)
{
a[i][j]=rand()%25-5;
}}}
int vivod(int **a, int m, int n){
int i,j;
for ( i=0;i<m;i++){
for ( j=0;j<n;j++)
{
printf("%4d\t",a[i][j]);
}
printf("\n");}
}
//int rogueone(int **c,int **b,int **a,int i,int j ,int k)
//{
//c[i][j] += a[i][k] * b[k][j];
//}
int main(void)
{
int **a,**b,**c,h,k,z,x,i,j,m,n,co;
printf("Enter Matrix 1\n");
scanf("%d",&m);
scanf("%d",&n);
scanf("Enter Matrix 2\n");
scanf("%d %d",&z,&x);
if(n!=z){
system("pause"); return 0;}
a=(int**)malloc(m*sizeof(int*));
b=(int**)malloc(z*sizeof(int*));
c=(int**)malloc(m*sizeof(int*));
for (i=0;i<m;i++)
{ a[i]=(int*)malloc(n*sizeof(int));
}
for (i=0;i<m;i++)
{ b[i]=(int*)malloc(x*sizeof(int));
}
for (i=0;i<m;i++)
{ c[i]=(int*)malloc(x*sizeof(int));
}
vvod(a,m,n);
vivod(a,m,n);
printf("\n\n");
vvod(b,z,x);
vivod(b,z,x);
printf("\n\n");
for(i = 0; i < m; i++)
for(j = 0; j < x; j++)
{
co=0;
for(k = 0; k < z; k++)
{
co+=a[i][k]*b[k][j];
c[i][j]=co;
//rogueone(c,b,a,i,j,k);
}
}
vivod(c,m,x);
for( i=0;i<m;i++)
{
free(a[i]);
}
for( i=0;i<z;i++)
{
free(b[i]);
}
for( i=0;i<m;i++)
{
free(c[i]);
}
free(a);
free(b);
free(c);
system("pause");
return 0;
}Решение задачи: «Умножение матриц (не работает для неквадратных матриц)»
textual
Листинг программы
scanf("Enter Matrix 2\n");