Перемножение матриц - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д