Форум » C/C++ для начинающих (C/C++ for beginners) » Поиск ошибки в программе для умножения матриц. » Ответить

Поиск ошибки в программе для умножения матриц.

akira : здрасте. В общем, я почти закончил свою программу. Так мне кажется. Но, при компиляции создается екзешник, затем по началу программа работает. Ввожу элементы матрицы, но до самих расчетов не доходит. Вот сам исходник: [quote]#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; }[/quote] - если не трудно, посмотрите в чем может быть ошибка тут. Уже весь день с этой прогой сижу...

Ответов - 70, стр: 1 2 3 4 All

Сыроежка: akira пишет: // ввод элементов матриц. int a[rd1][st1]; Вообще-то, программа не должна компилироватся, так как в С++ размерность массива должна быть константным выражением, А у вас размерность массива задана переменными. Вы компилировали программу? Каким компилятором?

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

Сыроежка: 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. К тому же для элемента массива вы должны указать два индекса, а не один, так как у вас двумерный массив.


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

Сыроежка: 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]; } }; Что-то я очень сомневаюсь, что ваш код компилировался! Так как размеры массива вы определяете во время выполнения программы, то сам массив нужно выделять в памяти из динамически из кучи. Но давайте хотя бы исправим приведенный выше код цикла. Должно быть [pre2]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 ]; } }[/pre2] Точку с запятой не надо ставить после закрывающейся фигурной скобки блока кода цикла P.S. Я подкорректировал код.

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

akira: - все ошибки понял, кроме этого: Сыроежка пишет: cin >> a[j]; - разве не должны в массив вписываться количество рядков и столбцов?

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

Сыроежка: akira пишет: int C[j][t]; Потом эта размерность матрицы не понятна. Если я еще помню математику, то размерность результирующей матрицы должна быть равна размерности матрицы, являющейся левым операндом произведения, Или это не так?!

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]; [pre2]for ( int i = 0 ; i < rd1; i++ ) { for ( int j = 0; j < st1; j++) { cout << "vveditb element a " << i << "_" << j << " = "; cin >> a[ i ][ j ]; } }[/pre2]

Сыроежка: akira пишет: - размерность результирующей матрицы должна быть: число рядков с первой матрицы и число столбцов со второй. А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:) Да, посмотрел. Если умножается матрица размерностью m * l на матрицу размерностью l * n, то результирующая матрица будет размерностью m * n.:)

akira: Сыроежка пишет: Кроме того, я хотел бы обратить внимание, что нре надо было объявляться четыре переменных 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? - чтобы значение правильно возвращалось. но даже так у меня не вышло. Сыроежка пишет: А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:) - я смотрел.) должны быть матрицы, количество столбцов первой равно количеству рядков второй. умножение производиться рядок на столбец и записывается в первый элемент матрицы-результата. затем тот же рядок умножается на второй столбец второй матрицы поэлементно и результаты суммируются, после чего записываются во второй элемент рядка матрицы-результата. и т.д. потом переход на слушающий рядок, когда столбцы заканчиваются.

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

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

Сыроежка: Так, сейчас буду рассуждать и сразу же писать код произведения матриц. Допустим, матрица A имеет размерность m * l, а матрица B - l * n. Тогда произведением будет матрица размерностью m * n, каждый элемент которой вычисляется по формуле c[ i ][ j ] = сумма a[ i ][ k ] * b[ k ][ j ], где k меняется от 1 до l. Это так в математике. Заменяем это циклами языка С++ [pre2]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 ]; } } }[/pre2] Правильно? Осилишь теперь вставить вместо матриц a, b и с идентификаторы своих матриц, а вместо m, n, k также размерности твоих матриц? Покажи, что получилось.

akira: - так должно быть? #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; }

Сыроежка: Давай поработаем над кодом. Во-первых, у тебя не используются переменные sum и ch. Во-вторых, при выводе результата ты забыл исправить управляющие индексы цикла, что они должны начинаться с нуля и должны быть меньше размерностей массивов, а не меньше равно. То есть вот эта часть кода некорректная [pre2]// вывод результата. i=1; j=1; for (int i=1; i<=rd1; i++){ for (int j=1; j<=st2; j++){ cout << C [j]; } cout << endl; } [/pre2] И надо вообще убрать строчки [pre2]i=1; j=1; [/pre2]

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

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



полная версия страницы