Форум программистов, компьютерный форум CyberForum.ru

умножение матриц: динамические массивы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 5.00
starikNAD
11 / 11 / 3
Регистрация: 01.12.2010
Сообщений: 71
01.12.2010, 18:40     умножение матриц: динамические массивы #1
прошу помощи: на языке C (не C++) необходимо написать программу умножения матриц, при этом программе передаются размеры матриц, а она должна динамически выделить память под них, принять ввод с клавиатуры или стандартного ввода, после чего выполнить умножение.
Помогите хотя бы в одном: как динамически выделить память под двумерный массив и заполнить его? Само умножение матриц я знаю
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
01.12.2010, 19:20     умножение матриц: динамические массивы #2
Цитата Сообщение от starikNAD Посмотреть сообщение
Помогите хотя бы в одном: как динамически выделить память под двумерный массив и заполнить его? Само умножение матриц я знаю
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int ROWS,COLUMNS,i;
int **matrix;
scanf ("%d%d", &ROWS, &COLUMNS);
 
matrix=(int*)malloc(sizeof(int*)*ROWS);
for (i=0;i<COLUMNS;i++)
matrix[i]=(int*)malloc(sizeof(int)*COLUMNS);
return 0;
}
и дальше работаешь как с обычным двумерным массивом
C
1
matrix[i][j];

Цитата Сообщение от starikNAD Посмотреть сообщение
Само умножение матриц я знаю
могу помочь

Добавлено через 2 минуты
как освободить выделенную память надо писать?
starikNAD
11 / 11 / 3
Регистрация: 01.12.2010
Сообщений: 71
01.12.2010, 19:28  [ТС]     умножение матриц: динамические массивы #3
go, пусть Бог продлит дни Вашей жизни!

Добавлено через 2 минуты
насчет самого умножения матриц: я в принципе математику прочел, собираюсь пробовать. Главное - я никак не мог создать массив заданного размера, остальное начну пробовать
А удалять массив - как-то использовать free()?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
01.12.2010, 19:48     умножение матриц: динамические массивы #4
C
1
2
3
for ( i=0;i<COLUMNS;i++) // освобождение памяти
free (matrix[i]);
free (matrix);
просто добавь в конце перед (ретурн 0)

Добавлено через 1 минуту
хотя, в принципе, в мэйн-функции это не нужно
starikNAD
11 / 11 / 3
Регистрация: 01.12.2010
Сообщений: 71
02.12.2010, 19:54  [ТС]     умножение матриц: динамические массивы #5
Уважаемый go, компилятор Borland C++ 3.1 обижает. На строке
matrix=(int *) malloc(sizeof(int *)*ROWS);
сообщает: Cannot convert 'int * ' to 'int * * '
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
02.12.2010, 20:24     умножение матриц: динамические массивы #6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int ROWS,COLUMNS,i;
int **matrix;
scanf ("%d%d", &ROWS, &COLUMNS);
 
matrix=(int**)calloc(sizeof(int*),ROWS); //  указатель пропустил, исправь эту строчку
for (i=0;i<COLUMNS;i++)
matrix[i]=(int*)malloc(sizeof(int)*COLUMNS); 
return 0;
}
кстати добавил calloc
он отличается от malloc тем, что обнуляет предварительно память

Добавлено через 18 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#define n 2
#define m 5
#define k 3
 
int main ()
{ int a[n][m], b[m][k], c[n][k],i,j,z;
for (i=0;i<n;i++) // ввод рандомом
for (j=0;j<m;j++)
a[i][j]=rand ()%5;
 
for (i=0;i<m;i++)
for (j=0;j<k;j++)
b[i][j]=rand ()%5;
 
 
      for (i=0;i<n;i++)
for (j=0;j<k;j++)
{ c[i][j]=0; //обнуляем элемент,  в который будет производится запись перемножения строка на                       //столбец
for (z=0;z<m;z++)
c[i][j]+=a[i][z]*b[z][j]; //записываем сумму  умножая поочередно элементы строки и столбца
}
 
 
for (i=0;i<n;i++)
{ puts ("\n");
for (j=0;j<k;j++)
printf ("%10d", c[i][j]);
}
 
system ("Pause");
return 0;
}
вот умножения
измените, добавив динамический ввод,
думаю это не сложно
если не получится - помогу
starikNAD
11 / 11 / 3
Регистрация: 01.12.2010
Сообщений: 71
02.12.2010, 21:24  [ТС]     умножение матриц: динамические массивы #7
go,
я внес изменение:
C
1
2
3
matrix=(int**)calloc(sizeof(int*),ROWS); //  указатель пропустил, исправь эту строчку
for (i=0;i<ROWS;i++)   // здесь заменил COLUMNS на ROWS
matrix[i]=(int*)malloc(sizeof(int)*COLUMNS);
иначе при умножении матрицы 3х3 на матрицу 3х1 данные получались неверниые

Добавлено через 10 минут
и еще одно: как правильно объявить функцию mmult?
я написал в прототипе
C
1
void mmult(int r, int s, int c, int ** m1, int ** m2, int **m3)
и вызываю как
C
1
mmult(r,s,c,m1,m2,m3)
Добавлено через 1 минуту
а функция "не видит" матриц, числа не соответствуют (хотя ввод в main выполнен правильно, я проверил)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2010, 21:49     умножение матриц: динамические массивы
Еще ссылки по теме:

Умножение матриц C++
C++ Умножение треугольных матриц«Методы обработки разреженных матриц»
Умножение матриц(динамические одномерные массивы) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
02.12.2010, 21:49     умножение матриц: динамические массивы #8
C
1
*(*(mt+i)+j) //mt[i][j]
Yandex
Объявления
02.12.2010, 21:49     умножение матриц: динамические массивы
Ответ Создать тему
Опции темы

Текущее время: 02:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru