Перемножить матрицы и вывести результат - C (СИ)
Формулировка задачи:
помогите, пожалуйста, найти и исправить ошибки в фрагменте программы. вообще она должна делать с матрицами все, но пока проблема в том, чтобы их перемножить и грамотно вывести на экран.
программа должна быть написана на си, без использования с++
сама программа:
#include "stdafx.h" #include <stdlib.h> #include <math.h> int print_matrix(int **arr, int m, int n); int **get_matrix(int m, int n); int check_matrixes(int m1, int n1, int m2, int n2); int multiply_matrixes( int **matrix_1, int m1, int n1, int **matrix_2, int m2, int n2, int ***result_matrix, int *result_m, int *result_n); int main() { int m_A, n_A,q , m_B, n_B , m_C, n_C; int **A=(int **) calloc(m_A, sizeof(int)); for (int i=0; i<m_A; i++) A[i]=(int *) calloc(n_A, sizeof(int)); int **B=(int **) calloc(m_B, sizeof(int)); for (int i=0; i<m_B; i++) B[i]=(int *) calloc(n_B, sizeof(int)); int **C=(int **) calloc(m_C, sizeof(int)); for (int i=0; i<m_C; i++) C[i]=(int *) calloc(n_C, sizeof(int)); do { printf("write original matrix size:\n"); printf("write row number:\n"); scanf ("%d",&m_A); printf ("write coloum number:\n"); scanf ("%d",&n_A); (get_matrix(m_A, n_A)); } while (m_A<=0||n_A<=0); //интерфейс for ( ; ; ) {printf("write the number of operation:\n 0-print matrix\n 1-Addition\n C=k1*A+k2*B\n"); printf(" 2-Multiplication\n C=A*B\n 3-determinant\n 4-inverse matrix\n 5-exit\n"); scanf("%d",&q); switch (q) { case 0: (print_matrix(A, m_A, n_A)); break; case 1: break; case 2: do { printf("write second matrix size:\n"); printf("write row number:\n"); scanf ("%d",&m_B); printf ("write coloum number:\n"); scanf ("%d",&n_B); (get_matrix(m_B, n_B)); } while (m_B<=0||n_B<=0); if (check_matrixes(m_A , n_A, m_B, n_B)) { if (multiply_matrixes(*A, m_A, n_A, *B, m_B, n_B, *C, &m_C, &n_C)) { printf ("\n\nRESULT:\n\n"); print_matrix (*C, m_C, n_C); } }else printf ("\n\n====MATRIXES CAN NOT BE MULTIPLY====\n\n"); break; case 3: break; case 4: break; case 5: return 0; break; default: printf("\n\n====WRONG NUMBER====\n\n"); } } return 0; } //функция выделения памяти и получения матрицы int **get_matrix(int m, int n) { int **arr=(int **) calloc(m, sizeof(int)); for (int i=0; i<m; i++) arr[i]=(int *) calloc(n, sizeof(int)); //Ввод элементов матрицы printf("write matrix elements:\n"); for(int i=0; i < m; i++) for(int j=0; j < n; j++) scanf("%d", (*(arr+i)+j)); return arr; } //функция вывода матрицы на экран int print_matrix(int **arr, int m, int n) { for(int i=0; i < m; i++) for(int j=0; j < n; j++) printf("%d\t", *(*(arr + i) + j)); return 0; } // проверка размерностей матриц int check_matrixes(int m1, int n1, int m2, int n2) { return (m2==n1); } // умножение матриц int multiply_matrixes( int **matrix_1, int m1, int n1, int **matrix_2, int m2, int n2, int ***result_matrix, int *result_m, int *result_n) { *result_m = m1; *result_n = n1; int **ret = (int **) calloc(*result_m, sizeof(int)); for (int i=0; i<*result_m; i++) ret[i]=(int *) calloc(*result_n, sizeof(int)); if (ret !=0 ) { for (int i=0; i<*result_m; i++) for (int j=0; j<*result_n; j++) { int sum = 0; for (int t=0; t< m2; t++) { sum += matrix_1[i][t]*matrix_2[t][j]; } (*result_matrix)[i][j] = sum; }return 0; }else return 1; }
Решение задачи: «Перемножить матрицы и вывести результат»
textual
Листинг программы
#include <iostream> #include <conio.h> using namespace std; void enter(int** p,int n,char* h) { cout<<"\n Matrix "<<h<<":\n"; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>p[i][j]; } void out(int** p,int n) { for(int i=0;i<n;i++) delete [] p[i]; delete []p; } void mult(int** a,int** b,int n) { int c[n][n]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c[i][j]=0; for(int k=0;k<n;k++) c[i][j]+=a[i][k]*b[k][j]; cout<<" "<<c[i][j]; } cout<<endl; } } int main() { int i,n; cout<<" n="; cin>>n; int** a=new int*[n]; for(i=0;i<n;i++) a[i]=new int[n]; enter(a,n,"A"); int** b=new int*[n]; for(i=0;i<n;i++) b[i]=new int[n]; enter(b,n,"B"); cout<<"\n A*B:\n"; mult(a,b,n); out(a,n); out(b,n); getch(); return 0; }
Объяснение кода листинга программы
В этом коде происходит перемножение двух матриц и вывод результата.
- Сначала объявляются две матрицы a и b, которые представляют собой двумерные массивы (матрицы) целых чисел.
- Затем пользователю предлагается ввести размерность матрицы (n).
- Далее, с помощью оператора new, выделяется память под матрицы a и b.
- Функция enter используется для ввода значений матрицы a и b.
- Функция mult выполняет перемножение матриц a и b, используя цикл for и операторы присваивания и сложения. Результат сохраняется в матрице c.
- Функция out используется для освобождения памяти, выделенной под матрицы a и b.
- В функции main, после вывода размера матрицы, происходит вызов функций enter, mult, out, а также используется функция getch для приостановки выполнения программы до нажатия клавиши.
- В конце программы возвращается 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д