On-line: гостей 1. Всего: 1 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 12:02. Заголовок: Поиск ошибки в программе для умножения матриц.


здрасте. В общем, я почти закончил свою программу. Так мне кажется. Но, при компиляции создается екзешник, затем по началу программа работает. Ввожу элементы матрицы, но до самих расчетов не доходит.
Вот сам исходник:



 цитата:
#include <iostream>
#include <conio.h>
using namespace std;


int main() {
int i=1,j=1,k=1,l=1;
int sum , rd1 , st1 , rd2 , st2 ;
char ch;
// ввод расширения первой матрицы.
cout << "Vveditb rozmirnistb pershoi Matruci: ";
cin >> rd1;
cin >> st1;
// ввод расширения 2 матрицы.
cout << "Vveditb rozmirnistb dryhoi matruci: ";
cin >> rd2;
cin >> st2;
// выход при не соответствии.
if (st1 != rd2) {
cout << "\nMatruc9 ne ob4usljuets9!";
getch();
return 0;
}
// ввод элементов матриц.
int a[rd1][st1];
for (i=1; i<=rd1; i++){
for (j=1; j<=st1; j++){
cout << "vveditb element a " << i << "_" << j << " = " << endl;
cin >> a[j];
}
};

int b[rd2] [st2];
for (k=1; k<=rd2; k++){
for (l=1; l<=st2; l++){
cout << "vveditb element b " << k << "_" << l << " = " << endl;
cin >> b[k][l];
}
};

cout << endl;
// умножение.
int t=0,z;
int C[j][t];
for (int j=0; j<rd2; j++){
while (t<st1){
for (int i=0; i<st1; i++){
z = a[t] * b[t] + z;
}
C[j][t] = z;
t++;
}
t=0;
}

// вывод результата
i=1;
j=1;
for (int i=1; i<=rd1; i++){
for (int j=1; j<=st2; j++){
cout << C[j];
}
cout << endl;
}
system("PAUSE");
return 0;
}




- если не трудно, посмотрите в чем может быть ошибка тут. Уже весь день с этой прогой сижу...

Спасибо: 0 
Цитата Ответить
Ответов - 70 , стр: 1 2 3 4 All [только новые]





ссылка на сообщение  Отправлено: 28.07.12 12:06. Заголовок: akira пишет: // вво..


akira пишет:

 цитата:
// ввод элементов матриц.
int a[rd1][st1];



Вообще-то, программа не должна компилироватся, так как в С++ размерность массива должна быть константным выражением, А у вас размерность массива задана переменными.

Вы компилировали программу? Каким компилятором?

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:09. Заголовок: - у меня комплировал..


- у меня комплировалось. шел ввод самих элементов. потом писало ошибку и с программы выбрасывало.
компилятор Dev C++.

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:21. Заголовок: akira пишет: int a;..


akira пишет:

 цитата:
int a[rd1][st1];
for (i=1; i<=rd1; i++){
for (j=1; j<=st1; j++){
cout << "vveditb element a " << i << "_" << j << " = " << endl;
cin >> a[j];
}
};



Здесь также у вас код не должен компилироваться. Во-первых, индексация элементов массива в С/С++ должна начинаться с 0, а не с 1. К тому же для элемента массива вы должны указать два индекса, а не один, так как у вас двумерный массив.


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:22. Заголовок: Сыроежка пишет: Зде..


Сыроежка пишет:

 цитата:
Здесь также у вас код не должен компилироваться. Во-первых, индексация элементов массива в С/С++ должна начинаться с 0, а не с 1. К тому же для элемента массива вы должны указать два индекса, а не один, так как у вас двумерный массив.


- эта часть как раз работает.
я не могу нормально продумать сам алгоритм умножения и потом выывод матрицы -результата. как видите то, что я написал не работает правильно...


Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:24. Заголовок: akira пишет: int a;..


akira пишет:

 цитата:
int a[rd1][st1];
for (i=1; i<=rd1; i++){
for (j=1; j<=st1; j++){
cout << "vveditb element a " << i << "_" << j << " = " << endl;
cin >> a[j];
}
};



Что-то я очень сомневаюсь, что ваш код компилировался! Так как размеры массива вы определяете во время выполнения программы, то сам массив нужно выделять в памяти из динамически из кучи.

Но давайте хотя бы исправим приведенный выше код цикла. Должно быть

int a[rd1][st1];  

for (i = 0 ; i < rd1; i++ )
{
for (j = 0; j < st1; j++)
{
cout << "vveditb element a " << i << "_" << j << " = ";
cin >> a[ i ][ j ];
}
}

Точку с запятой не надо ставить после закрывающейся фигурной скобки блока кода цикла

P.S. Я подкорректировал код.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:26. Заголовок: Я понял, в чем пробл..


Я понял, в чем проблема. При форматировании текста теги некоторые пропадают.
То есть, где должно быть a[ i ][ j ] редактор пишет a[j]. Ставьте пробелы после и перед квадратными скобками.

Тогда сейчас посмотрим ваш код дальше

Но тем не менее исправьте начальные индексы цикла, как я указал, то есть индекс должен начинаться с 0, а не с 1.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:27. Заголовок: - все ошибки понял, ..


- все ошибки понял, кроме этого:
Сыроежка пишет:

 цитата:
cin >> a[j];


- разве не должны в массив вписываться количество рядков и столбцов?


Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:28. Заголовок: Сыроежка пишет: Я п..


Сыроежка пишет:

 цитата:
Я понял, в чем проблема. При форматировании текста теги некоторые пропадают.
То есть, где должно быть a[ i ][ j ] редактор пишет a[j]. Ставьте пробелы после и перед квадратными скобками.

Тогда сейчас посмотрим ваш код дальше

Но тем не менее исправьте начальные индексы цикла, как я указал, то есть индекс должен начинаться с 0, а не с 1.


- сейчас попробую

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:31. Заголовок: akira пишет: int C;..


akira пишет:

 цитата:
int C[j][t];



Потом эта размерность матрицы не понятна. Если я еще помню математику, то размерность результирующей матрицы должна быть равна размерности матрицы, являющейся левым операндом произведения, Или это не так?!

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:32. Заголовок: Сыроежка пишет: Пот..


Сыроежка пишет:

 цитата:
Потом эта тразмерность матрицы не понятна. Если я еще помню математику, то размерность результирующей матрицы должна быть равна размерности матрицы, являющейся левым операндом произведения, Или это не так?!


- размерность результирующей матрицы должна быть: число рядков с первой матрицы и число столбцов со второй.


+ то, что указали выше поправил.

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:34. Заголовок: akira пишет: // умн..


akira пишет:

 цитата:
// умножение.
int t=0,z;
int C[j][t];
for (int j=0; j<rd2; j++){
while (t<st1){
for (int i=0; i<st1; i++){
z = a[t] * b[t] + z;
}
C[j][t] = z;
t++;
}
t=0;
}



Мне представляется, что и с произведением вы намудрили! Зачем здесь три цикла? Два - for и один - while?

Кроме того, я хотел бы обратить внимание, что не надо было объявлять четыре переменных i, j, k, l в начале тела функции main В С++ управляющую переменную цикла можно объявить внутри цикла. Например,

int a[rd1][st1];

for ( int i = 0 ; i < rd1; i++ ) 
{
for ( int j = 0; j < st1; j++)
{
cout << "vveditb element a " << i << "_" << j << " = ";
cin >> a[ i ][ j ];
}
}




Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:35. Заголовок: akira пишет: - разм..


akira пишет:

 цитата:
- размерность результирующей матрицы должна быть: число рядков с первой матрицы и число столбцов со второй.



А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:)

Да, посмотрел. Если умножается матрица размерностью m * l на матрицу размерностью l * n, то результирующая матрица будет размерностью m * n.:)

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:37. Заголовок: Сыроежка пишет: Кро..


Сыроежка пишет:

 цитата:
Кроме того, я хотел бы обратить внимание, что нре надо было объявляться четыре переменных i, j, k, l в начале тела функции main В С++ управляющую переменную цикла можно объявить внутри цикла. Например,

int a[rd1][st1];

for ( int i = 0 ; i < rd1; i++ )
{
for ( int j = 0; j < st1; j++)
{
cout << "vveditb element a " << i << "_" << j << " = ";
cin >> a[ i ][ j ];
}
}


- это я знаю.) уже поправил.
Сыроежка пишет:

 цитата:
Мне представляется, что и с произведением вы намудрили! Зачем здесь три цикла? Два - for и один - while?


- чтобы значение правильно возвращалось. но даже так у меня не вышло.
Сыроежка пишет:

 цитата:
А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:)


- я смотрел.) должны быть матрицы, количество столбцов первой равно количеству рядков второй. умножение производиться рядок на столбец и записывается в первый элемент матрицы-результата. затем тот же рядок умножается на второй столбец второй матрицы поэлементно и результаты суммируются, после чего записываются во второй элемент рядка матрицы-результата. и т.д. потом переход на слушающий рядок, когда столбцы заканчиваются.

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:38. Заголовок: Сейчас, я почитаю пр..


Сейчас, я почитаю про произведени матриц, и минут через 10-15 напишу правильный код

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:40. Заголовок: Сыроежка пишет: Сей..


Сыроежка пишет:

 цитата:
Сейчас, я почитаю про произведени матриц, и минут через 10-15 напишу правильный код


- буду очень благодарен. а то уже весь день на это убил. но так программу и не написал...

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:41. Заголовок: Так, сейчас буду рас..


Так, сейчас буду рассуждать и сразу же писать код произведения матриц. Допустим, матрица A имеет размерность m * l, а матрица B - l * n. Тогда произведением будет матрица размерностью m * n, каждый элемент которой вычисляется по формуле

c[ i ][ j ] = сумма a[ i ][ k ] * b[ k ][ j ], где k меняется от 1 до l.

Это так в математике.

Заменяем это циклами языка С++

for ( int i = 0 ; i < m ; i++ ) 
{
for ( int j = 0 ; j < n ; j ++ )
{
c[ i ][ j ] = 0;
for ( int k = 0 ; k < l ; k ++ )
{
c[ i ][ j ] += a[ i ][ k ] * b[ k ][ j ];
}
}
}


Правильно? Осилишь теперь вставить вместо матриц a, b и с идентификаторы своих матриц, а вместо m, n, k также размерности твоих матриц? Покажи, что получилось.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:43. Заголовок: - так должно быть? #..


- так должно быть?

 цитата:
#include <iostream>
#include <conio.h>
using namespace std;


int main() {
int sum , rd1 , st1 , rd2 , st2 ;
char ch;
// расширение первой матрицы.
cout << "Vveditb rozmirnistb pershoi Matruci: ";
cin >> rd1;
cin >> st1;
// расширение второй матрицы.
cout << "Vveditb rozmirnistb dryhoi matruci: ";
cin >> rd2;
cin >> st2;
// выход при неправильности условия.
if (st1 != rd2) {
cout << "\nMatruc9 ne ob4usljuets9!";
getch();
return 0;
}
// ввод элементов.
int a[rd1] [st1];
for (int i=0; i < rd1; i++){
for (int j=0; j<st1; j++){
cout << "vveditb element a " << i << "_" << j << " = ";
cin >> a [j];
}
}

int b[rd2] [st2];
for (int k=0; k<rd2; k++){
for (int l=0; l<st2; l++){
cout << "vveditb element b " << k << "_" << l << " = ";
cin >> b[k] [l];
}
}

cout << endl;
// умножение.
for ( int i = 0 ; i < rd1 ; i++ )
{
for ( int j = 0 ; j < st2 ; j ++ )
{
c[ i ][ j ] = 0;
for ( int k = 0 ; k < l ; k ++ )
{
c[ i ][ j ] += a[ i ][ k ] * b[ k ][ j ];
}
}
}

// вывод результата.
i=1;
j=1;
for (int i=1; i<=rd1; i++){
for (int j=1; j<=st2; j++){
cout << C [j];
}
cout << endl;
}
system("PAUSE");
return 0;
}



Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:46. Заголовок: Давай поработаем над..


Давай поработаем над кодом. Во-первых, у тебя не используются переменные sum и ch.

Во-вторых, при выводе результата ты забыл исправить управляющие индексы цикла, что они должны начинаться с нуля и должны быть меньше размерностей массивов, а не меньше равно.

То есть вот эта часть кода некорректная

// вывод результата.  
i=1;
j=1;
for (int i=1; i<=rd1; i++){
for (int j=1; j<=st2; j++){
cout << C [j];
}
cout << endl;
}


И надо вообще убрать строчки

i=1;  
j=1;


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:47. Заголовок: Сыроежка - все попра..


Сыроежка - все поправил. ошибки понял.
// вывод результата.
for (int i=0; i < rd1; i++){
for (int j=0; j < st2; j++){
cout << C [j];
}
cout << endl;
}
system("PAUSE");
return 0;
}

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:48. Заголовок: Надеюсь, программа к..


Надеюсь, программа компилируется и выдает правильный результат?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 70 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 3
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет