Форум » 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: - цикл правильно! вы вроде просто не поняли как умножаться матрицы. - а ви сделали только чтобы поэлементно множилось. или вообще не так.

Сыроежка: Я еще раз повторяю, исправь ошибку в цикле. Я ее красным цветом выделил. Код правильный.

akira: Сыроежка пишет: Я еще раз повторяю, исправь ошибку в цикле. Я ее красным цветом выделил. Код правильный. - а, тысячу извинений. я думал, что исправил. блин, ужасно протупил. стыдно. спасибо большое за помощь. очень благодарен. если что-нить помочь будет надо - то обращайтесь. помогу ем смогу. еще один вопрос - с чего лучше начинать профессиональное изучение С++? есть какая-нибудь хорошая литература или нечто подобное? а то в нете масса всего, а толкового почти нет. потому хотел спросить у вас, специалиста.


Сыроежка: С азов надо начинать. Есть такая хорошая книжка для начального изучения С++, как Дж. Либерти "Освой самостоятельно С++ за 21 день".

akira: Сыроежка пишет: С азов надо начинать. Есть такая хорошая книжка для начального изучения С++, как Дж. Либерти "Освой самостоятельно С++ за 21 день". - сегодня же возьмусь за изучение. еще один вопрос - а можно как-то красивы вывести элементы матрицы-результата? и через какую функцию и как выводить первые две матрицы, перед третьей?

Сыроежка: Если делать "красиво", то надо использовать графический режим. А прииспользовании стандартного потока вывода можно выводить лишь в режиме телетайпа. Конечно можно вставить разлиные заголовки перед выводом матриц. Можно также вывод каждой строки заключить в фигурные скобки. Но не более того.

akira: Сыроежка пишет: Если делать "красиво", то надо использовать графический режим. А прииспользовании стандартного потока вывода можно выводить лишь в режиме телетайпа. Конечно можно вставить разлиные заголовки перед выводом матриц. Можно также вывод каждой строки заключить в фигурные скобки. Но не более того. - понятно. а вывод первой и второй матрицы делать так же, как и вывод результата?

Сыроежка: Да, ведь вы имеете дело с одним и тем же типом объекта. Можно вообще оформить вывод матрицы в виде отдельной общей функции. Что-то вроде следующего [pre2]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; } }[/pre2] И вызывать ее в коде в виде, например, [pre2]show( "Matrix A:", (int ** ) a, rd1, st1 );[/pre2] или [pre2]show( "Matrix A:", reinterpret_cast<int **>( a ), rd1, st1 );[/pre2]

AlexMyr: А все начиналось где-то на другом форуме __http://www.cyberforum.ru/cpp-beginners/thread386251.html, где наш герой заблокирован.

akira: Сыроежка - сейчас попробую переоформить. AlexMyr пишет: А все начиналось где-то на другом форуме __http://www.cyberforum.ru/cpp-beginners/thread386251.html, где наш герой заблокирован. - ну а разве я виноват, что там не было ответа? человек предложил помощь и собственно помог в решении задачи, за что я очень благодарен. в чем проблема-то?

Сыроежка: akira пишет: - ну а разве я виноват, что там не было ответа? человек предложил помощь и собственно помог в решении задачи, за что я очень благодарен. в чем проблема-то? Проблема в том, что есть люди, которым становится очень плохо, когда у других все хорошо!:)

akira: Сыроежка пишет: Проблема в том, что есть люди, которым становится очень плохо, когда у других все хорошо!:) - понятно. у меня еще один вопрос. я попробовал раскидать программу по функциям. но оно потом не распознает cout, cin и т.д. что можно с этим сделать?

Сыроежка: В вашей исходной программе есть строчка using namespace std; которая помещает имена cout, cin из стандартного пространства имен в глобальное пространство имен. Таким образом вы можете не указывать явно для этих имен их пространство имен. То есть без этой директивы вы должны бы были писать std::cin или std::cout Теперь возвращаясь к вашему вопросу, возможно вы поместили определения функций перед этой директивой. Если это так, то компилятор действительно не знает, что это за имена cin и cout Определения ваших функций должно находиться между этой директивой и телом функции main. Либо вы можете в эту область поместить объявления функций, а их определения поместить после тела функции main

akira: - поменял. но теперь константу не принимает почему-то. вот код: #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; }

Сыроежка: Надо указать тип этой константы const mr=100; Например, const int mr=100;

akira: Сыроежка пишет: Надо указать тип этой константы const mr=100; - прописать int mr перед объявление константы?

Сыроежка: Я привел пример в предыдущем ответе.

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

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

akira: Сыроежка пишет: Но, думаю, вам достаточно просто после вывода каждого элемента следом выводить один пробел. - а как это прописать? cout << b[k] << " " << [l]; так?



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