Автор | Сообщение |
|
Отправлено: 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. Заголовок: Надеюсь, программа к..
Надеюсь, программа компилируется и выдает правильный результат?
|
|
|
|
Отправлено: 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. Заголовок: Короче говоря, напиш..
Короче говоря, напиши наконец-то правильно цикл! Я тебе комментарием пометил ошибку в коде!
|
|
|
|
Отправлено: 28.07.12 13:22. Заголовок: - цикл правильно! вы..
- цикл правильно! вы вроде просто не поняли как умножаться матрицы. - а ви сделали только чтобы поэлементно множилось. или вообще не так.
|
|
|
|
|
Отправлено: 28.07.12 13:24. Заголовок: Я еще раз повторяю, ..
Я еще раз повторяю, исправь ошибку в цикле. Я ее красным цветом выделил. Код правильный.
|
|
|
|
Отправлено: 28.07.12 13:25. Заголовок: Сыроежка пишет: Я е..
Сыроежка пишет: цитата: | Я еще раз повторяю, исправь ошибку в цикле. Я ее красным цветом выделил. Код правильный. |
| - а, тысячу извинений. я думал, что исправил. блин, ужасно протупил. стыдно. спасибо большое за помощь. очень благодарен. если что-нить помочь будет надо - то обращайтесь. помогу ем смогу. еще один вопрос - с чего лучше начинать профессиональное изучение С++? есть какая-нибудь хорошая литература или нечто подобное? а то в нете масса всего, а толкового почти нет. потому хотел спросить у вас, специалиста.
|
|
|
|
Отправлено: 28.07.12 13:29. Заголовок: С азов надо начинать..
С азов надо начинать. Есть такая хорошая книжка для начального изучения С++, как Дж. Либерти "Освой самостоятельно С++ за 21 день".
|
|
|
|
Отправлено: 28.07.12 13:31. Заголовок: Сыроежка пишет: С а..
Сыроежка пишет: цитата: | С азов надо начинать. Есть такая хорошая книжка для начального изучения С++, как Дж. Либерти "Освой самостоятельно С++ за 21 день". |
| - сегодня же возьмусь за изучение. еще один вопрос - а можно как-то красивы вывести элементы матрицы-результата? и через какую функцию и как выводить первые две матрицы, перед третьей?
|
|
|
|
Отправлено: 28.07.12 13:32. Заголовок: Если делать "кра..
Если делать "красиво", то надо использовать графический режим. А прииспользовании стандартного потока вывода можно выводить лишь в режиме телетайпа. Конечно можно вставить разлиные заголовки перед выводом матриц. Можно также вывод каждой строки заключить в фигурные скобки. Но не более того.
|
|
|
|
Отправлено: 28.07.12 13:33. Заголовок: Сыроежка пишет: Есл..
Сыроежка пишет: цитата: | Если делать "красиво", то надо использовать графический режим. А прииспользовании стандартного потока вывода можно выводить лишь в режиме телетайпа. Конечно можно вставить разлиные заголовки перед выводом матриц. Можно также вывод каждой строки заключить в фигурные скобки. Но не более того. |
| - понятно. а вывод первой и второй матрицы делать так же, как и вывод результата?
|
|
|
|
Отправлено: 28.07.12 13:34. Заголовок: Да, ведь вы имеете д..
Да, ведь вы имеете дело с одним и тем же типом объекта. Можно вообще оформить вывод матрицы в виде отдельной общей функции. Что-то вроде следующего void show( const char *title, int **a, int n, int m ) { if ( title != NULL ) std::cout << title << "\n\n"; for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < m; j++) { std::cout << C[ i ][ j ] << ' '; } std::cout << endl; } } И вызывать ее в коде в виде, например, show( "Matrix A:", (int ** ) a, rd1, st1 ); или show( "Matrix A:", reinterpret_cast<int **>( a ), rd1, st1 );
|
|
|
|
Отправлено: 28.07.12 13:38. Заголовок: А все начиналось где..
А все начиналось где-то на другом форуме __http://www.cyberforum.ru/cpp-beginners/thread386251.html, где наш герой заблокирован.
|
|
|
|
Отправлено: 28.07.12 13:39. Заголовок: Сыроежка - сейчас по..
Сыроежка - сейчас попробую переоформить. AlexMyr пишет: цитата: | А все начиналось где-то на другом форуме __http://www.cyberforum.ru/cpp-beginners/thread386251.html, где наш герой заблокирован. |
| - ну а разве я виноват, что там не было ответа? человек предложил помощь и собственно помог в решении задачи, за что я очень благодарен. в чем проблема-то?
|
|
|
|
Отправлено: 28.07.12 13:41. Заголовок: akira пишет: - ну а..
akira пишет: цитата: | - ну а разве я виноват, что там не было ответа? человек предложил помощь и собственно помог в решении задачи, за что я очень благодарен. в чем проблема-то? |
| Проблема в том, что есть люди, которым становится очень плохо, когда у других все хорошо!:)
|
|
|
|
Отправлено: 28.07.12 13:42. Заголовок: Сыроежка пишет: Про..
Сыроежка пишет: цитата: | Проблема в том, что есть люди, которым становится очень плохо, когда у других все хорошо!:) |
| - понятно. у меня еще один вопрос. я попробовал раскидать программу по функциям. но оно потом не распознает cout, cin и т.д. что можно с этим сделать?
|
|
|
|
Отправлено: 28.07.12 13:43. Заголовок: В вашей исходной про..
В вашей исходной программе есть строчка using namespace std; которая помещает имена cout, cin из стандартного пространства имен в глобальное пространство имен. Таким образом вы можете не указывать явно для этих имен их пространство имен. То есть без этой директивы вы должны бы были писать std::cin или std::cout Теперь возвращаясь к вашему вопросу, возможно вы поместили определения функций перед этой директивой. Если это так, то компилятор действительно не знает, что это за имена cin и cout Определения ваших функций должно находиться между этой директивой и телом функции main. Либо вы можете в эту область поместить объявления функций, а их определения поместить после тела функции main
|
|
|
|
Отправлено: 28.07.12 13:44. Заголовок: - поменял. но теперь..
- поменял. но теперь константу не принимает почему-то. вот код: #include <iostream> using namespace std; int rd1 , st1 , rd2 , st2; const mr=100; int a[mr][mr]; int b[mr][mr]; int c[mr][mr]; void dimension(){ // расширение первой матрицы. cout << "enter the dimension of the first matrix:" <<endl; cout << "line="; cin >> rd1; cout << "column="; cin >>st1; // расширение второй матрицы. cout << "enter the dimension of the second matrix:" << endl; cout << "line="; cin >> rd2; cout << "column="; cin >> st2; // выход при неправильности условия. if (st1 != rd2) { cout << "product of these matrices can be calculated"; } } void input_a(){ // ввод элементов. for (int i=0; i < rd1; i++){ for (int j=0; j<st1; j++){ cout << "type element a [" << i <<"]_[" << j << "] = "; cin >> a [j]; } } } void input_b(){ for (int k=0; k<rd2; k++){ for (int l=0; l<st2; l++){ cout << "type element b [" << k << "]_[" << l << "] = "; cin >> b[k] [l]; } } } void multiplication(){ // умножение. for ( int i = 0 ; i < rd1 ; i++ ) { for ( int j = 0 ; j < st2 ; j ++ ) { c[j] = 0; for (int k = 0 ; k < st1 ; k ++) { c[j] += a[k] * b[k] [j]; } } } } void output(){ // вывод результата. cout << "result:" << endl; for (int i=0; i < rd1; i++) { for (int j=0; j < st2; j++) { cout << c [j]; } cout << endl; } } int main(){ dimension(); input_a(); input_b(); multiplication(); output(); system("PAUSE"); return 0; }
|
|
|
|
Отправлено: 28.07.12 13:45. Заголовок: Надо указать тип это..
Надо указать тип этой константы const mr=100; Например, const int mr=100;
|
|
|
|
Отправлено: 28.07.12 13:46. Заголовок: Сыроежка пишет: Над..
Сыроежка пишет: цитата: | Надо указать тип этой константы const mr=100; |
| - прописать int mr перед объявление константы?
|
|
|
|
Отправлено: 28.07.12 13:47. Заголовок: Я привел пример в пр..
Я привел пример в предыдущем ответе.
|
|
|
|
Отправлено: 28.07.12 13:48. Заголовок: - все, привел до ума..
- все, привел до ума программу. только одно не нравиться - если элементы матриц двухзначные сила, то сливаются и пробелами между ними всеми нету....
|
|
|
|
Отправлено: 28.07.12 13:50. Заголовок: akira пишет: все, ..
akira пишет: цитата: | все, привел до ума программу. только одно не нравиться - если элементы матриц двухзначные сила, то сливаются и пробелами между ними всеми нету.. |
| Не должно сливаться, так как в функции, которую я вам продемонстрировал, после вывода каждого элемента строки массива следом выводится пробел. Но есть еще один путь, эо использовать манипуляторы потока, например, устанавливать ширину выводимого поля и выравнивание по правому краю поля. Но, думаю, вам достаточно просто после вывода каждого элемента следом выводить один пробел.
|
|
|
|
Отправлено: 28.07.12 13:51. Заголовок: Сыроежка пишет: Но,..
Сыроежка пишет: цитата: | Но, думаю, вам достаточно просто после вывода каждого элемента следом выводить один пробел. |
| - а как это прописать? cout << b[k] << " " << [l]; так?
|
|
|
|
Отправлено: 28.07.12 13:52. Заголовок: akira пишет: - а ка..
akira пишет: цитата: | - а как это прописать? cout << b[k] << " " << [l]; так? |
| Одного пробела для вызова достаточно. то есть пробел можно заключить в одинарные кавычки.
|
|
|
|
Отправлено: 28.07.12 13:53. Заголовок: Сыроежка пишет: Одн..
Сыроежка пишет: цитата: | Одного пробела для вызова достаточно. то есть пробел можно заключить в одинарные кавычки. |
| - можете пример показать?
|
|
|
|
Отправлено: 28.07.12 13:55. Заголовок: Сыроежка пишет: Это..
Сыроежка пишет: Это тот же код, что вы сами привели цитата: | - а как это прописать? cout << b[k] << ' ' << [l]; так? |
| Только пробел я поставил в одинарные кавычки. Разница в том, что когда используются одинарные кавычки, то это - один символ. А когда используются двойные кавычки - это это символьный массив, состоящий из символа пробела и завершающего символьного нуля. Только и всего.
|
|
|
|
Отправлено: 28.07.12 13:56. Заголовок: Сыроежка пишет: Тол..
Сыроежка пишет: цитата: | Только пробел я поставил в одинарные кавычки. Разница в том, что когда используются одинарные кавычки, то это - один символ. А когда используются двойные кавычки - это это символьный массив, состоящий из символа пробела и завершающего символьного нуля. Только и всего. |
| - ошибку пишет. expected primary-expression before '[' token
|
|
|
|
Отправлено: 28.07.12 13:57. Заголовок: У меня в примере, гд..
У меня в примере, где написал эту функцию, все есть. Скопируй оттуда вывод. В данном же случае ругается на на последние непонятные фигурные скобки.
|
|
|
|
Отправлено: 28.07.12 13:58. Заголовок: Сыроежка пишет: Ско..
Сыроежка пишет: - я так и сделал. суть в том, что если убрать эти << ' ' << то все нормально работает.
|
|
|
|
Отправлено: 28.07.12 13:59. Заголовок: akira пишет: - я та..
akira пишет: цитата: | - я так и сделал. суть в том, что если убрать эти << ' ' << то все нормально работает. |
| У тебя синтаксически неправильная конструкция. Должно быть cout << a[ i ][ j ] << ' '; Таким образом должна выводиться строка элементов матрицы. После вывода строки пишешь cout << endl;
|
|
|
|
Отправлено: 28.07.12 14:00. Заголовок: Сыроежка пишет: У т..
Сыроежка пишет: цитата: | У тебя синтаксически неправильная конструкция. Должно быть cout << a[ i ][ j ] << ' '; Таким образом должна выводиться строка элементов матрицы. После вывода строки пишешь cout << endl; |
| - вышло. каким оператором в функции можно осуществить выход?
|
|
|
|
Отправлено: 28.07.12 14:08. Заголовок: akira пишет: каким ..
akira пишет: цитата: | каким оператором в функции можно осуществить выход? |
| Если у функции тип возвращаемого значения объыявлен как void, то функция завершит свою работу по достижению закрывающейся фигурной скобки тела функции. Либо можно вставить предложение return; Но оно будет просто тлишним, если логика выполнения функции достигает закрывающейся фигурной скобки.
|
|
|
|
Отправлено: 28.07.12 14:09. Заголовок: Сыроежка пишет: Есл..
Сыроежка пишет: цитата: | Если у функции тип возвращаемого значения объыявлен как void, то функция завершит свою работу по достижению закрывающейся фигурной скобки тела функции. Либо можно вставить предложение return; Но оно будет просто тлишним, если логика выполнения функции достигает закрывающейся фигурной скобки. |
| - я уже сам справился. сделал через return возвращение к началу программы.
|
|
|
Ответов - 70
, стр:
1
2
3
4
All
[только новые]
|
|