Умножение квадратных матриц - C (СИ)
Формулировка задачи:
Доброго времени суток.
Я опять прошу Вашей неоценимой помощи.
Столкнулся с задачей, нужно умножить 2-е квадратные матрицы.
У меня такой бред получился, что даже стыдно код сюда выкладывать(
Работаю под Линуксом, поэтому виндовые библиотеки не работают
Матрицы генерирую так:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main() { int m1[0][0],m2[0][0],i,j,n,a; scanf ( "%d", &n ); //Ввод размерности матрицы nxn //==============Генерирую первую матрицу==================// for (i=0; i<n; i++) { for (j=0; j<n; j++) { m1[n][n]=rand()%10; printf("%5d", m1[n][n]); } printf("\n"); } printf("\n"); //=================Вторую матрицу=====================// for (i=0; i<n; i++) { for (j=0; j<n; j++) { m2[n][n]=rand()%10; printf("%5d", m2[n][n]); } printf("\n"); } printf("\n"); return 0; }
Решение задачи: «Умножение квадратных матриц»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> void showVec(int *X, int m) { int j; if(X != NULL && -1 < m) { for(j = 0; j < m; j++) printf((X[j] < 0 ? "%d\t" : " %d\t"),X[j]); printf("\n"); } } void showArr(int **X, int m) { int i; if(X != NULL && -1 < m) { for(i = 0; i < m; i++) showVec(X[i], m); } } void freeArr(int **X, int m) { int i; if(X != NULL && -1 < m) { for(i = m - 1; 0 < i; i--) free((void *)X[i]); free((void *)X); } } int **genArr(int **X, int m) { int i, j; if(X = (int **)malloc(m*sizeof(int *))) for(i = 0; i < m; i++) { if(X[i] = (int *)malloc(m*sizeof(int))) { for(j = 0; j < m; j++) X[i][j] = rand()%100 - 50; } else break; } if(i != m) freeArr(X, i); return X; } int **fillArr(int m, int count, int **C, int **A, int **B) { int i, j, k, p; if(C != NULL && A != NULL && B != NULL && -1 < m&& 0 < count) { for(k = 0; k < count; k++) for(p = 0; p < count; p++) { for(i = 0; i < m; i++) for(j = 0; j < m; j++) { C[i + k][j + p] = A[k][p]*B[i][j]; } } } return C; } int main() { int m, **A, **B, **C; time_t t; while(1) { printf("Enter size of matrix : "); scanf("%d",&m); srand(time(&t)); if(!(A = genArr(A, m))) printf("Allocation memory error for A\n"); else if(!(B = genArr(B,m))) printf("Allocation memory error for B\n"); else if(!(C = genArr(B,2*m))) printf("Allocation memory error for C\n"); else { printf("Matrix A:\n");showArr(A, m); printf("Matrix B:\n");showArr(B, m); C = fillArr(m, 2, C, A, B); printf("Matrix C:\n");showArr(C, 2*m); freeArr(A, m); freeArr(B, m); freeArr(C, 2*m); } } return 0; }
Объяснение кода листинга программы
- В функции
showVec
мы выводим значения вектораX
с помощьюprintf
. ЕслиX
содержит отрицательные значения, то перед выводом мы используем символ\t
для добавления табуляции. - В функции
showArr
мы выводим значения массиваX
с помощьюprintf
. ЕслиX
содержит отрицательные значения, то перед выводом мы используем символ\t
для добавления табуляции. - В функции
freeArr
мы освобождаем память, выделенную для массиваX
. ЕслиX
не равенNULL
, то мы освобождаем память для каждого элемента массиваX
. - В функции
genArr
мы выделяем память для массиваX
с помощьюmalloc
. Затем мы инициализируем каждый элемент массиваX
с помощьюmalloc
. Если выделение памяти дляX
или одного из его элементов не удалось, то мы выводим сообщение об ошибке и завершаем выполнение программы. - В функции
fillArr
мы заполняем матрицуC
значениями, полученными путем умножения соответствующих элементов матрицA
иB
. Мы используем вложенные циклы для обхода всех элементов матрицыC
. - В функции
main
мы считываем размер матрицыm
с помощьюscanf
. Затем мы генерируем случайные значения для матрицA
иB
с помощьюgenArr
. Если выделение памяти дляA
илиB
не удалось, то мы выводим сообщение об ошибке и завершаем выполнение программы. - Если выделение памяти для
A
,B
иC
было успешным, то мы выводим значения матрицA
иB
с помощьюshowArr
. Затем мы заполняем матрицуC
с помощьюfillArr
и выводим ее значения с помощьюshowArr
. - После вывода значений матрицы
C
мы освобождаем память, выделенную дляA
,B
иC
, с помощьюfreeArr
. - Если выделение памяти для
A
,B
иC
было успешным, то мы повторяем шаги 6-8 до тех пор, пока пользователь не введет размер матрицыm
равный -1. - В конце программы мы возвращаем значение 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д