Умножение квадратных матриц - 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, что означает успешное выполнение программы.