Умножение матриц произвольного размера

DREAMspb

Доброго времени суток.Нужно написать вот это Написать функцию для умножения матриц произвольного размера. размеры матриц передавать в параметрах и контролировать их корректность. Имеется вот это помогите сделать пожалуйста
# include "stdafx.h"
# include <stdio.h>
# include <Windows.h>
# include <conio.h>
int result( int size11, int size12, int size21, int size22, int resultmas[100][100])
{
    int i=0; // ввод массивов
    int N;
    int j=0;
    int digitmas1[100][100];
    int digitmas2[100][100];
    printf("---------------------\nвведите первый массив\n");
    for (i=0; i<size12; i++)
        for (j=0; j< size11; j++)
            scanf("%d", & digitmas1[i][j]);
    printf("---------------------\nвведите второй массив\n");
    for (i=0; i<size22; i++)
        for (j=0; j< size21; j++)
            scanf("%d", & digitmas2[i][j]);
    int u=0;
    for (i=0; i<size12; i++) // заполнение результирующего массива
        for (j=0; j<size11; j++)
            for (u=0; u<size11; u++)
                resultmas[i][j]=resultmas[i][j]+(digitmas1[i][u]*digitmas2[u][j]);
    return 0;
}
void main (void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int size11; // ввод размерности массива
    int size12;
    int size21;
    int size22;
    printf("введите количество столбцов первой матрицы: ");     scanf("%d", &size11);
    printf("введите количество строк первой матрицы: ");        scanf("%d", &size12);
    printf("введите количество столбцов второй матрицы: ");     scanf("%d", &size21);
    printf("введите количество строк второй матрицы: ");        scanf("%d", &size22);  
    if (size11!=size22||size12!=size21)
        {
            printf("некорректные данные\n");
            exit(1);
        }
    int i; 
    int j;
    int N;
    int u; // создание и обнуление массива
    int resultmas[100][100];
    for (i=0; i<100; i++)
        for (j=0; j<100; j++)
 
            resultmas[i][j]=0;
 
    result(size11, size12, size21, size22, resultmas);
    printf("\n результат умножения матриц\n");
    printf("------------------------------------------------------------------\n");
    for (i=0; i<size12; i++) //вывод результата
    {
        for (j=0; j<size21; j++)
            printf("%10d", resultmas[i][j]);
        printf("\n");
    }
    printf("------------------------------------------------------------------\n");
    getch();
}
14 ответов

DREAMspb

а что непонятно то? размеры передаются в функцию параметрами, проверка на корректность есть... ошибки что ли пишет какие?


DREAMspb

Нужно что бы прога умножала матрици произвольного размера int result( int size11, int size12, int size21, int size22, int resultmas[100][100]) А у меня указано 100


DREAMspb

int **a=(int **)malloc(n*sizeof(int));
     for(i=0; i<n; i++) 
          a[i] = (int *)malloc(m*sizeof(int));
вот так задаются двумерные динамические массивы (n*m) в Си. не забудте подключить библиотеку alloc.h и да, не забываем про поиск по форуму, там таких тем уйма


DREAMspb

ок спсЕсли не затруднит можете дописать прогу plz


DREAMspb

Помомгите пожалуйста с прогой ни как не получается


DREAMspb

#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <alloc.h>
 
void result( int n, int m, int** resultmas)
{
** * * *int i=0; // ввод массивов
** * * *int N;
** * * *int j=0;
** * * *int **digitmas1 = (int**)malloc(n * sizeof(int*));
** * * *for (i = 0; i < n; ++i)*
** * * *    digitmas1[i] = (int *)malloc(m * sizeof(int));
** * * *int **digitmas2 = (int**)malloc(n * sizeof(int*));
    for (i = 0; i < n; ++i)
        digitmas2[i] = (int *)malloc(m * sizeof(int));
** * * *printf("---------------------\nвведите первый массив\n");
** * * *for (i=0; i<n; i++)
** * * * * * * *for (j=0; j< m; j++)
** * * * * * * * * * * *scanf("%d", & digitmas1[i][j]);
** * * *printf("---------------------\nвведите второй массив\n");
** * * *for (i=0; i<n; i++)
** * * * * * * *for (j=0; j< m; j++)
** * * * * * * * * * * *scanf("%d", & digitmas2[i][j]);
** * * *int u=0;
** * * *for (i=0; i<n; i++) // заполнение результирующего массива
** * * * * * * *for (j=0; j<m; j++)
** * * * * * * * * * * *for (u=0; u<m; u++)
** * * * * * * * * * * * * * * *resultmas[i][j]=resultmas[i][j]+(digitmas1[i][u]*digitmas2[u][j]);
** * * *return 0;
}
void main (void)
{
** * * *SetConsoleCP(1251);
** * * *SetConsoleOutputCP(1251);
** * * *int size11; // ввод размерности массива
** * * *int size12;
** * * *int size21;
** * * *int size22;
** * * *printf("введите количество столбцов первой матрицы: "); * * * * scanf("%d", &size11);
** * * *printf("введите количество строк первой матрицы: "); * * * * * *scanf("%d", &size12);
** * * *printf("введите количество столбцов второй матрицы: "); * * * * scanf("%d", &size21);
** * * *printf("введите количество строк второй матрицы: "); * * * * * *scanf("%d", &size22); *
** * * *if (size11!=size22||size12!=size21)
** * * * * * * *{
** * * * * * * * * * * *printf("некорректные данные\n");
** * * * * * * * * * * *exit(1);
** * * * * * * *}
** * * *int i;*
** * * *int j;
** * * *int N;
** * * *int u; // создание и обнуление массива
** * * *int **resultmas = (int**)malloc(size12 * sizeof(int*));
    for (i = 0; i < size12; ++i)
        resultmas*=*(int*)malloc(size11** sizeof(int));
** * * *for (i=0; i<size12; i++)
** * * * * * * *for (j=0; j<size11; j++)
** * * * * * * * * * * *resultmas[i][j]=0;
** * * *result(size12, size11, resultmas);
** * * *printf("\n результат умножения матриц\n");
** * * *printf("------------------------------------------------------------------\n");
** * * *for (i=0; i<size12; i++) //вывод результата
** * * *{
** * * * * * * *for (j=0; j<size11; j++)
** * * * * * * * * * * *printf("%10d", resultmas[i][j]);
** * * * * * * *printf("\n");
** * * *}
** * * *printf("------------------------------------------------------------------\n");
** * * *getch();
}
тестируй ошибки если будут тут отпиши


DREAMspb

Со звёздочками не очень понятно, то там где-то надо ставить, то не надо... Возможно ли отредактировать???


DREAMspb

Пишет что Не удается открыть файл включение: alloc.h: No such file or directory Пишу в студии 10А еще с этими звездачками пролема отредактируй пожалуйста оч прошу


DREAMspb

Писать нужно "malloc.h" А со звездами я тока до 2 ошибок дошёл


DREAMspb

Вот так работает, в MS VC++ 2010
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <malloc.h>
 
void result( int n, int m, int** resultmas)
{
    int i=0; // ввод массивов
    int N;
    int j=0;
    int **digitmas1 = (int**)malloc(n * sizeof(int*));
    for (i = 0; i < n; ++i)
        digitmas1[i] = (int *)malloc(m * sizeof(int));
    int **digitmas2 = (int**)malloc(n * sizeof(int*));
    for (i = 0; i < n; ++i)
        digitmas2[i] = (int *)malloc(m * sizeof(int));
    printf("---------------------\nвведите первый массив\n");
    for (i=0; i<n; i++)
        for (j=0; j< m; j++)
            scanf("%d", & digitmas1[i][j]);
    printf("---------------------\nвведите второй массив\n");
    for (i=0; i<n; i++)
        for (j=0; j< m; j++)
            scanf("%d", & digitmas2[i][j]);
    int u=0;
    for (i=0; i<n; i++) // заполнение результирующего массива
        for (j=0; j<m; j++)
            for (u=0; u<m; u++)
                resultmas[i][j]=resultmas[i][j]+(digitmas1[i][u]*digitmas2[u][j]);
}
int main (void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int size11; // ввод размерности массива
    int size12;
    int size21;
    int size22;
    printf("введите количество столбцов первой матрицы: "); scanf("%d", &size11);
    printf("введите количество строк первой матрицы: "); scanf("%d", &size12);
    printf("введите количество столбцов второй матрицы: "); scanf("%d", &size21);
    printf("введите количество строк второй матрицы: "); scanf("%d", &size22);
    if (size11!=size22||size12!=size21)
    {
        printf("некорректные данные\n");
        return 0;
    }
    int i;
    int j;
    int N;
    int u; // создание и обнуление массива
    int **resultmas = (int**)malloc(size12 * sizeof(int*));
    for (i = 0; i < size12; ++i)
        resultmas[i]=(int*)malloc(size11 * sizeof(int*));
    for (i=0; i<size12; i++)
        for (j=0; j<size11; j++)
            resultmas[i][j]=0;
    result(size12, size11, resultmas);
    printf("\n результат умножения матриц\n");
    printf("------------------------------------------------------------------\n");
    for (i=0; i<size12; i++) //вывод результата
    {
        for (j=0; j<size11; j++)
            printf("%10d", resultmas[i][j]);
        printf("\n");
    }
    printf("------------------------------------------------------------------\n");
    getch();
    return 0;
}


DREAMspb

#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <malloc.h>
 
void result( int n, int m, int **resultmas)
{
int i=0; // ввод массивов
int N;
int j=0;
int **digitmas1 = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; ++i)
digitmas1[i] = (int*)malloc(m * sizeof(int));
int **digitmas2 = (int**)malloc(n * sizeof(int*));
        for (i = 0; i < n; ++i)
                digitmas2[i] = (int *)malloc(m * sizeof(int));
printf("---------------------\nвведите первый массив\n");
for (i=0; i<n; i++)
for (j=0; j< m; j++)
scanf("%d", &digitmas1[i][j]);
printf("---------------------\nвведите второй массив\n");
for (i=0; i<n; i++)
for (j=0; j< m; j++)
scanf("%d", &digitmas2[i][j]);
int u=0;
for (i=0; i<n; i++) // заполнение результирующего массива
for (j=0; j<m; j++)
for (u=0; u<m; u++)
resultmas[i][j] = resultmas[i][j]+(digitmas1[i][u] * digitmas2[u][j]);
return 0;
}
void main (void)
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int size11; // ввод размерности массива
int size12;
int size21;
int size22;
printf("введите количество столбцов первой матрицы: ");
scanf("%d", &size11);
printf("введите количество строк первой матрицы: ");
scanf("%d", &size12);
printf("введите количество столбцов второй матрицы: ");
scanf("%d", &size21);
printf("введите количество строк второй матрицы: ");
scanf("%d", & size22);
if (size11!=size22||size12!=size21)
{
printf("некорректные данные\n");
exit(1);
}
int i;
int j;
int N;
int u; // создание и обнуление массива
int **resultmas = (int**)malloc(size12 * sizeof(int*));
        for (i = 0; i < size12; ++i)
                *resultmas = (int*)malloc(size11 * sizeof(int));
for (i=0; i<size12; i++)
for (j=0; j<size11; j++)
resultmas[i][j]=0;
result(size12, size11, resultmas);
printf("\n результат умножения матриц\n");
printf("------------------------------------------------------------------\n");
for (i=0; i<size12; i++) //вывод результата
{
for (j=0; j<size11; j++)
printf("%10d", &resultmas[i][j]);
printf("\n");
}
printf("------------------------------------------------------------------\n");
}
1 ошибка дальше ни как...


DREAMspb

for (i = 0; i < size12; ++i) *resultmas=(int*)malloc(size11 * sizeof(int));
строки 58, 59. В цикле-то индекс i надо использовать, а у вас неправильно написано, вот и не работает.


DREAMspb

Спасибо за разъяснение))) Очень выручили))


DREAMspb

Спасибо большоеЕще один вопрос а можно сделать так что бы прога умнажала матрицы разных размеров например 2х2 на 3х3?