Умножение квадратных матриц - 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;
}

Объяснение кода листинга программы

  1. В функции showVec мы выводим значения вектора X с помощью printf. Если X содержит отрицательные значения, то перед выводом мы используем символ \t для добавления табуляции.
  2. В функции showArr мы выводим значения массива X с помощью printf. Если X содержит отрицательные значения, то перед выводом мы используем символ \t для добавления табуляции.
  3. В функции freeArr мы освобождаем память, выделенную для массива X. Если X не равен NULL, то мы освобождаем память для каждого элемента массива X.
  4. В функции genArr мы выделяем память для массива X с помощью malloc. Затем мы инициализируем каждый элемент массива X с помощью malloc. Если выделение памяти для X или одного из его элементов не удалось, то мы выводим сообщение об ошибке и завершаем выполнение программы.
  5. В функции fillArr мы заполняем матрицу C значениями, полученными путем умножения соответствующих элементов матриц A и B. Мы используем вложенные циклы для обхода всех элементов матрицы C.
  6. В функции main мы считываем размер матрицы m с помощью scanf. Затем мы генерируем случайные значения для матриц A и B с помощью genArr. Если выделение памяти для A или B не удалось, то мы выводим сообщение об ошибке и завершаем выполнение программы.
  7. Если выделение памяти для A, B и C было успешным, то мы выводим значения матриц A и B с помощью showArr. Затем мы заполняем матрицу C с помощью fillArr и выводим ее значения с помощью showArr.
  8. После вывода значений матрицы C мы освобождаем память, выделенную для A, B и C, с помощью freeArr.
  9. Если выделение памяти для A, B и C было успешным, то мы повторяем шаги 6-8 до тех пор, пока пользователь не введет размер матрицы m равный -1.
  10. В конце программы мы возвращаем значение 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы