Автор | Сообщение |
|
Отправлено: 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; } |
| - если не трудно, посмотрите в чем может быть ошибка тут. Уже весь день с этой прогой сижу...
|
|
|
Ответов - 70
, стр:
1
2
3
4
All
[только новые]
|
|
|
Отправлено: 28.07.12 12:06. Заголовок: akira пишет: // вво..
akira пишет: цитата: | // ввод элементов матриц. int a[rd1][st1]; |
| Вообще-то, программа не должна компилироватся, так как в С++ размерность массива должна быть константным выражением, А у вас размерность массива задана переменными. Вы компилировали программу? Каким компилятором?
|
|
|
|
Отправлено: 28.07.12 12:09. Заголовок: - у меня комплировал..
- у меня комплировалось. шел ввод самих элементов. потом писало ошибку и с программы выбрасывало. компилятор Dev C++.
|
|
|
|
Отправлено: 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. К тому же для элемента массива вы должны указать два индекса, а не один, так как у вас двумерный массив.
|
|
|
|
Отправлено: 28.07.12 12:22. Заголовок: Сыроежка пишет: Зде..
Сыроежка пишет: цитата: | Здесь также у вас код не должен компилироваться. Во-первых, индексация элементов массива в С/С++ должна начинаться с 0, а не с 1. К тому же для элемента массива вы должны указать два индекса, а не один, так как у вас двумерный массив. |
| - эта часть как раз работает. я не могу нормально продумать сам алгоритм умножения и потом выывод матрицы -результата. как видите то, что я написал не работает правильно...
|
|
|
|
Отправлено: 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. Я подкорректировал код.
|
|
|
|
Отправлено: 28.07.12 12:26. Заголовок: Я понял, в чем пробл..
Я понял, в чем проблема. При форматировании текста теги некоторые пропадают. То есть, где должно быть a[ i ][ j ] редактор пишет a[j]. Ставьте пробелы после и перед квадратными скобками. Тогда сейчас посмотрим ваш код дальше Но тем не менее исправьте начальные индексы цикла, как я указал, то есть индекс должен начинаться с 0, а не с 1.
|
|
|
|
Отправлено: 28.07.12 12:27. Заголовок: - все ошибки понял, ..
- все ошибки понял, кроме этого: Сыроежка пишет: - разве не должны в массив вписываться количество рядков и столбцов?
|
|
|
|
Отправлено: 28.07.12 12:28. Заголовок: Сыроежка пишет: Я п..
Сыроежка пишет: цитата: | Я понял, в чем проблема. При форматировании текста теги некоторые пропадают. То есть, где должно быть a[ i ][ j ] редактор пишет a[j]. Ставьте пробелы после и перед квадратными скобками. Тогда сейчас посмотрим ваш код дальше Но тем не менее исправьте начальные индексы цикла, как я указал, то есть индекс должен начинаться с 0, а не с 1. |
| - сейчас попробую
|
|
|
|
Отправлено: 28.07.12 12:31. Заголовок: akira пишет: int C;..
akira пишет: Потом эта размерность матрицы не понятна. Если я еще помню математику, то размерность результирующей матрицы должна быть равна размерности матрицы, являющейся левым операндом произведения, Или это не так?!
|
|
|
|
Отправлено: 28.07.12 12:32. Заголовок: Сыроежка пишет: Пот..
Сыроежка пишет: цитата: | Потом эта тразмерность матрицы не понятна. Если я еще помню математику, то размерность результирующей матрицы должна быть равна размерности матрицы, являющейся левым операндом произведения, Или это не так?! |
| - размерность результирующей матрицы должна быть: число рядков с первой матрицы и число столбцов со второй. + то, что указали выше поправил.
|
|
|
|
Отправлено: 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 ]; } }
|
|
|
|
|
Отправлено: 28.07.12 12:35. Заголовок: akira пишет: - разм..
akira пишет: цитата: | - размерность результирующей матрицы должна быть: число рядков с первой матрицы и число столбцов со второй. |
| А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:) Да, посмотрел. Если умножается матрица размерностью m * l на матрицу размерностью l * n, то результирующая матрица будет размерностью m * n.:)
|
|
|
|
Отправлено: 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? |
| - чтобы значение правильно возвращалось. но даже так у меня не вышло. Сыроежка пишет: цитата: | А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:) |
| - я смотрел.) должны быть матрицы, количество столбцов первой равно количеству рядков второй. умножение производиться рядок на столбец и записывается в первый элемент матрицы-результата. затем тот же рядок умножается на второй столбец второй матрицы поэлементно и результаты суммируются, после чего записываются во второй элемент рядка матрицы-результата. и т.д. потом переход на слушающий рядок, когда столбцы заканчиваются.
|
|
|
|
Отправлено: 28.07.12 12:38. Заголовок: Сейчас, я почитаю пр..
Сейчас, я почитаю про произведени матриц, и минут через 10-15 напишу правильный код
|
|
|
|
Отправлено: 28.07.12 12:40. Заголовок: Сыроежка пишет: Сей..
Сыроежка пишет: цитата: | Сейчас, я почитаю про произведени матриц, и минут через 10-15 напишу правильный код |
| - буду очень благодарен. а то уже весь день на это убил. но так программу и не написал...
|
|
|
|
Отправлено: 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 также размерности твоих матриц? Покажи, что получилось.
|
|
|
|
Отправлено: 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; } |
|
|
|
|
|
Отправлено: 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;
|
|
|
|
Отправлено: 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; }
|
|
|
|
Отправлено: 28.07.12 12:48. Заголовок: Надеюсь, программа к..
Надеюсь, программа компилируется и выдает правильный результат?
|
|
|
Ответов - 70
, стр:
1
2
3
4
All
[только новые]
|
|