Довести до ума программу по перемножению матриц - C (СИ)
Формулировка задачи:
помогите пожалуйста довести до ума программу по перемножению матриц
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
# define M 3
# define N 3
# define K 3
void zap1(int mas[M][N]);
void zap2(int mas[N][K]);
void vuv(int mas[M][N]);
void zap1(int mas[M][N])
{
int i,j;
for (i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
mas[i][j] = rand()%20-10;
printf("%4d", mas[i][j]);
}
printf("\n");
}
}
void zap2(int mas[N][K])
{
int i,j;
for (i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
mas[i][j] = rand()%20-10;
printf("%4d", mas[i][j]);
}
printf("\n");
}
}
void vuv(int mas3[M][K])
{int i,j;
for (i=0;i<M;i++)
{ for(j=0;j<N;j++)
printf("%4d", mas3[i][j]);
printf("\n");
}
}
int main()
{
int i,j,a,b,g;
int mas1[M][N];
int mas2[N][K];
int mas3[M][K];
int sum;
zap1(mas1);
printf("\n");
printf("\n");
zap2(mas2);
printf("\n");
printf("\n");
b=0;
for(i=0;i<K;i++)
{
g=b;
for(j=0;j<M;j++)
{
for(a=0;a<N;a++)
{
sum=mas1[j][a]*mas2[a][j];
g=g+sum;
}
mas3[j][i]=g;
}
}
printf("\n");
printf("novai");
printf("\n");
vuv( mas3);
system ("PAUSE");
}Решение задачи: «Довести до ума программу по перемножению матриц»
textual
Листинг программы
#include <conio.h>
#include <stdio.h>
void Umn_matr(int n, int r, int r1, int m, double **pa, double **pb, double **pc);
int main()
{
int n, r, r1, m,i,j;
double **pa, **pb, **pc;
FILE *file_a, *file_b, *file_c;
file_a = fopen("Vvod_a.txt","r");
file_b = fopen("Vvod_b.txt","r");
file_c = fopen("razm.txt","r");
fscanf(file_c, "%d %d %d %d", &n, &r, &r1, &m);
pa = calloc(n,sizeof(double*));
pb = calloc(r1,sizeof(double*));
pc = calloc(n,sizeof(double*));
for(i=0;i<n;i++)
{
pa[i]= calloc(r,sizeof(double));
pc[i]= calloc(m,sizeof(double));
}
for(i=0;i<r1;i++)
{
pb[i]= calloc(m,sizeof(double));
}
for(i=0; i<n; i++)
{
for(j=0; j<r; j++)
{
fscanf(file_a, "%lf", &pa[i][j]);
printf("pa[%d][%d]=%lf; ",i, j, pa[i][j]);
}
printf("\n");
}
for(i=0; i<r1; i++)
{
for(j=0; j<m; j++)
{
fscanf(file_b, "%lf", &pb[i][j]);
printf("pb[%d][%d]=%lf; ",i, j, pb[i][j]);
}
printf("\n");
}
for(i=0; i<n; i++)
for(j=0; j<m; j++)
pc[i][j]=0;
Umn_matr(n, r, r1, m, pa, pb, pc);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
printf("pc[%d][%d]=%lf; ",i, j, pc[i][j]);
printf("\n");
}
for(i=0;i<n;i++)
{
free(pa[i]);
free(pc[i]);
}
for(i=0;i<r1;i++)
{
free(pb[i]);
}
free(pa);
free(pb);
free(pc);
getch();
fclose(file_a);
fclose(file_b);
fclose(file_c);
return 0;
}
void Umn_matr(int n, int r, int r1, int m, double **pa, double **pb, double **pc)
{
int i,j,t;
if ((n==m)&&(r==r1))
{
for(i=0; i<n; i++)
for(j=0; j<m; j++)
for(t=0; t<r; t++)
{
pc[i][j]+= pa[i][t]*pb[t][j];
}
}
else
{
printf("\nNevernaya razmernost matric\n");
exit(1);
}
}
Объяснение кода листинга программы
Код представляет собой программу для перемножения матриц. Он считывает значения матриц a и b из файлов Vvod_a.txt и Vvod_b.txt соответственно, а затем перемножает их и сохраняет результат в матрицу c.
- Объявлены функции main() и Umn_matr().
- В функции main() открываются файлы Vvod_a.txt, Vvod_b.txt и razm.txt для чтения.
- Из файла razm.txt считываются размеры матриц a, b и c, а также переменная m.
- Выделяется память под матрицы a, b и c.
- С помощью цикла считываются значения матрицы a из файла Vvod_a.txt и выводятся на экран.
- С помощью цикла считываются значения матрицы b из файла Vvod_b.txt и выводятся на экран.
- Выполняется перемножение матриц a и b и результат сохраняется в матрицу c.
- Выводится на экран результат перемножения матриц a и b.
- Выделяемая память освобождается.
- В функции Umn_matr() проверяется условие: если размерность матриц a и b совпадает, то происходит перемножение, иначе выводится сообщение об ошибке и программа завершается. Поскольку код не полностью оформлен, пронумерованы только элементы, выделенные в списке.