Автор | Сообщение |
|
Отправлено: 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:51. Заголовок: Сыроежка пишет: Над..
Сыроежка пишет: цитата: | Надеюсь, программа компилируется и выдает правильный результат? |
| - не компилирует. пишет ошибку вот тут: akira пишет: 45 C:\Users\Kiwi\Desktop\Untitled1.cpp `c' undeclared (first use this function)
|
|
|
|
Отправлено: 28.07.12 12:54. Заголовок: - то уже поправил. С..
- то уже поправил. Сыроежка пишет: цитата: | for ( int k = 0 ; k < l ; k ++ ) |
| - тут должно быть l или 1?
|
|
|
|
Отправлено: 28.07.12 12:55. Заголовок: Наверное ты забыл об..
Наверное ты забыл объявить массив c
|
|
|
|
Отправлено: 28.07.12 12:56. Заголовок: Сыроежка пишет: Нав..
Сыроежка пишет: цитата: | Наверное ты забыл объявить массив c |
| - я уже поправил.
|
|
|
|
Отправлено: 28.07.12 12:57. Заголовок: l - это что? ..
l - это что?
|
|
|
|
Отправлено: 28.07.12 12:58. Заголовок: akira пишет: - тут ..
akira пишет: цитата: | - тут должно быть l или 1? |
| Здесь должна быть их совпадающая размерность, то есть число столбцов первой матрицы и число строк второй матрицы. Я писал в пример размерности матриц m * l и l * n
|
|
|
|
Отправлено: 28.07.12 13:00. Заголовок: Сыроежка пишет: Зде..
Сыроежка пишет: цитата: | Здесь должна быть их совпадающая размерность, то есть число столбцов первой матрицы и число строк второй матрицы. Я писал в пример размерности матриц m * l и l * n |
| - а если я делал для столбцов первой матрицы и числа строк второй матрицы разные переменные?
|
|
|
|
Отправлено: 28.07.12 13:01. Заголовок: akira пишет: - а ес..
akira пишет: цитата: | - а если я делал для столбцов первой матрицы и числа строк второй матрицы разные переменные? |
| Еще раз внимательно посмотри мои рассуждения, где я писал циклы. У тебя две исходные матрицы. Первая размером m * l, вторая - l * n. Значит итоговая матрица имеет размерность m * n. В циклах я использовал эти идентификаторы. Никаких единиц там нет. Там есть три счетчика циклов: i, j и k
|
|
|
|
Отправлено: 28.07.12 13:03. Заголовок: Сыроежка пишет: Еще..
Сыроежка пишет: цитата: | Еще раз внимательно посмотри мои рассуждения, где я писал циклы. У тебя две исходные матрицы. Первая размером m * l, вторая - l * n. Значит итоговая матрица имеет размерность m * n. В циклах я использовал эти идентификаторы. Никаких единиц там нет. Там есть три счетчика циклов: i, j и k |
| - так это я понял. я о другом. в общем, если можешь, то попробуй у себя скомпилировать: http://zalil.ru/32080071
|
|
|
|
Отправлено: 28.07.12 13:04. Заголовок: У меня не будет комп..
У меня не будет компилироваться, потому что С++ не принимает массивы с переменной размерностью. Выкладывай свой код здесь. И укажи, какую ошибку выдает компилятор при компиляции.
|
|
|
|
Отправлено: 28.07.12 13:05. Заголовок: // умножение. for (..
цитата: | // умножение. for ( int i = 0 ; i < rd1 ; i++ ) { for ( int j = 0 ; j < st2 ; j ++ ) { c[j] = 0; for (int k = 0 ; k < 1 ; k ++) { c[j] += a[k] * b[k][j]; } } } |
| ошибка тут: c [j] = 0; я прописываю перед этим int c[j] и оно уже на нем ошибку выписывает.
|
|
|
|
|
Отправлено: 28.07.12 13:07. Заголовок: У тебя, похоже, k ме..
У тебя, похоже, k меняется от 0 до единицы, а должно меняться до количества столбцов в первой матрице или, что равносильно, до количества строк во второй матрицы. Покажи объявление массива c и текст сообщения об ошибке.
|
|
|
|
Отправлено: 28.07.12 13:08. Заголовок: Сыроежка пишет: У т..
Сыроежка пишет: цитата: | У тебя, похоже, k меняется от 0 до единицы, а должно меняться до количества столбцов в первой матрице или, что равносильно, до количества строк во второй матрицы. |
| - понял, поправлю. вот: // умножение. int c [j]; for ( int i = 0 ; i < rd1 ; i++ ) { for ( int j = 0 ; j < st2 ; j ++ ) { c[j] = 0; for (int k = 0 ; k < rd2 ; k ++) { c[j] += a[k] * b[k][j]; } } } ошибка: 41 C:\Users\Kiwi\Desktop\Untitled1.cpp name lookup of `i' changed for new ISO `for' scoping
|
|
|
|
Отправлено: 28.07.12 13:10. Заголовок: У тебя массив cдолже..
У тебя массив c должен быть объявлен с размерностью rd1 * st2. А у тебя там какое-то j задано. Я имею в виду объявление массива с, а не обращение к его элементам в цикле.
|
|
|
|
Отправлено: 28.07.12 13:12. Заголовок: Сыроежка пишет: У т..
Сыроежка пишет: цитата: | У тебя массив cдолжен быть объявлен с размерностью rd1 * st2. А у тебя там какое-то j задано. Я имею в виду объявление массива с, а не обращение к его элементам в цикле. |
| - работает. но не так, как должно. оно множит поэлементно. и при умножении матрицы 2х2 где все элементы 2 на такую же матрицы выдает матрицу 2х2 где все элементы 4. а должны быть 8.
|
|
|
|
Отправлено: 28.07.12 13:15. Заголовок: Показывай еще раз ци..
Показывай еще раз цикл перемножения и цикл вывода на экран результата.
|
|
|
|
Отправлено: 28.07.12 13:18. Заголовок: // умножение. int c..
// умножение. int c[rd1][st2]; for ( int i = 0 ; i < rd1 ; i++ ) { for ( int j = 0 ; j < st2 ; j ++ ) { c[j] = 0; for (int k = 0 ; k < 1 ; k ++) { c[j] += a[k] * b[k][j]; } } } // вывод результата. 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 13:19. Заголовок: - оно тут не полност..
- оно тут не полностью массивы отображает
|
|
|
|
Отправлено: 28.07.12 13:20. Заголовок: Если код у тебя совп..
Если код у тебя совпадает с приведенным мною кодом ниже, то должно все правильно считать. // умножение. int c[rd1][st2]; for ( int i = 0 ; i < rd1 ; i++ ) { for ( int j = 0 ; j < st2 ; j ++ ) { c[ i ][ j ] = 0; for (int k = 0 ; k < 1 ; k ++) // Я же говорил, что здесь не единица, а st1 или rd2!!!! { c[ i ][ j ] += a[ i ][ k ] * b[ k ] [ j]; } } } // вывод результата. for (int i=0; i < rd1; i++) { for (int j=0; j < st2; j++) { cout << c] i ] [ j ]; } cout << endl; } system("PAUSE"); return 0; } Можно на пальцах проверить. Если i = 0, j = 0, то в цикле for (int k = 0 ; k < 1 ; k ++) { c[ i ][ j ] += a[ i ][ k ] * b[ k ] [ j]; } должно быть две итерации. Первая - a[ 0 ][ 0 ] * b[ 0 ][ 0] . Вторая - a[ 0][ 1 ] * b[ 1 ][ 0 ] . И берется их сумма. Как может получиться неверный результат?!
|
|
|
|
Отправлено: 28.07.12 13:21. Заголовок: Короче говоря, напиш..
Короче говоря, напиши наконец-то правильно цикл! Я тебе комментарием пометил ошибку в коде!
|
|
|
Ответов - 70
, стр:
1
2
3
4
All
[только новые]
|
|