Автор | Сообщение |
|
Отправлено: 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 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]; так?
|
|
|
Ответов - 70
, стр:
1
2
3
4
All
[только новые]
|
|