rufek Temat założony przez niniejszego użytkownika |
Zamiana fragmentu programu na funkcje » 2009-10-20 16:13:54 Witam! Jestem tu nowy więc proszę wybaczyć wszelkie niedoskonałości :) Do rzeczy: Napisałem program do mnożenia macierzy (kwadratowych i prostokątnych). Jest dość obszerny i z góry przepraszam za bałagan w nim panujący. Algorytmowi do optymalnego na pewno też wiele brakuje. Chciałbym, by ktoś zamienił zaznaczony przeze mnie fragment (pod koniec kodu) w programie na funkcję i napisał, jak jej użyć. Sam to zrobiłem ale zamiast poprawnego wyniku zobaczyłem same zera... oto kod: #include <iostream>
using namespace std;
int main() { int i, a, z, b, x, j = 1, kol1, kol2, rzad1, rzad2, macierz1[ 10 ][ 10 ], macierz2[ 10 ][ 10 ], macierz3[ 100 ]; do { cout << "Podaj liczbe kolumn pierwszej macierzy: "; cin >> kol1; cout << "Podaj liczbe rzedow pietrwszej macierzy: "; cin >> rzad1; cout << "Podaj liczbe kolumn drugiej macierzy: "; cin >> kol2; cout << "Podaj liczbe rzedow drugiej macierzy: "; cin >> rzad2; } while( kol1 != rzad2 ); cout << "ok, teraz wypelnij Macierz 1 (od lewej do prawej)"; for( i = 1; i <= kol1; i++ ) { if( i == 1 && j == 1 ) cout << "\n\nWypelniasz pierwszy rzad"; cin >> macierz1[ j ][ i ]; if( i == kol1 && j != rzad1 ) { i = 0; j++; cout << "\nWypelniasz " << j << " rzad!"; } if( j == rzad1 + 1 ) break; } j = 1; cout << "ok, a teraz wypelnij Macierz 2 (od lewej do prawej)"; for( i = 1; i <= kol2; i++ ) { if( i == 1 && j == 1 ) cout << "\n\nWypelniasz pierwszy rzad"; cin >> macierz2[ j ][ i ]; if( i == kol2 && j != rzad2 ) { i = 0; j++; cout << "\nWypelniasz " << j << " rzad!"; } if( j == rzad2 + 1 ) break; } j = 1; cout << "\n\nMacierz pierwsza: "; for( i = 1; i <= kol1; i++ ) { if( i == 1 ) cout << endl; cout << macierz1[ j ][ i ]; if( i == kol1 ) j++, i = 0, cout << endl; if( j == rzad1 + 1 ) break; } j = 1; cout << "\n\nMacierz druga: "; for( i = 1; i <= kol2; i++ ) { if( i == 1 ) cout << endl; cout << macierz2[ j ][ i ]; if( i == kol2 ) j++, i = 0, cout << endl; if( j == rzad2 + 1 ) break; } cout << "\n\n Oto wymnozona macierz: \n\n"; a = 0; b = 1; x = 0; int rozmiar_wyniku = kol2 * rzad1; for( i = 1; i <= rozmiar_wyniku; i++ ) { macierz3[ i ] = 0; } for( z = 1; z <= rozmiar_wyniku; z++ ) { a++; for( i = 1; i <= kol1; i++ ) { if( z % rzad1 == 0 ) a = z / rzad1; else a = z / rzad1 + 1; if( z % kol2 != 0 ) b = z % kol2; else b = kol2; x = macierz1[ a ][ i ] * macierz2[ i ][ b ]; macierz3[ z ] = macierz3[ z ] + x; } } cout << "\n\n\n\n\nRysujemy macierz wynikowa!: \n\n\n\n\n\n"; for( i = 1; i <= rozmiar_wyniku; i++ ) { cout << macierz3[ i ] << " "; if( i % kol2 == 0 ) cout << "\n"; } system( "PAUSE" ); return EXIT_SUCCESS; }
z góry dziękuję i pozdrawiam :) |
|
DejaVu |
» 2009-10-21 10:36:06 |
|
rufek Temat założony przez niniejszego użytkownika |
kurs » 2009-10-21 18:33:23 hmm, ten akurat przejrzałem, ale funkcji uczyłem się z Grębosza. Liczyłem, że ktoś mi przerobi ten fragment bo wszystkie poprzednie (wczytanie, wypisanie, zerowanie) przerobiłem na funkcje i śmiga, a tego jednego nie mogę :/ |
|
DejaVu |
» 2009-10-21 21:10:48 Gotowców nie robimy - wybacz. |
|
rufek Temat założony przez niniejszego użytkownika |
» 2009-10-21 21:52:28 No jednak nie poprosiłem was o napisanie funkcji mnożącej macierze a tylko przerobienie gotowego, działającego algorytmu (któremu z uwagi na swoja kiepska znajomość c++ poświęciłem sporo czasu) na funkcję, więc gotowcem bym tego nie nazwał... Dla niektórych z was to pewnie kwestia paru minut ale jacyś niechętni do pomocy jesteście :) |
|
malan |
» 2009-10-22 00:21:18 Skoro przerobiłeś pozostałe części programu na funkcje, to z tym też nie powinieneś mieć problemu. Ja bym to zrobił tak: Typ funckji: void; Ar1: rzad1; Ar2: kol1; Ar3: kol2; Ar4: rozmiar_wyniku; Ar4: macierz1[][]; Ar5: macierz2[][]; Ar6: macierz3[];
D: a=x=0, x=1;
Ar numer - Argument funckji . D - Deklaracja zmiennych w ciele funckji.
Wystarczy teraz Ctrl+C, Ctrl+V i gotowe :).
Nie gwarantuję, że jest to idealne rozwiązanie (pomijam już, że nie zapoznałem się jeszcze z pojęciem 'macierz'). Być może da się to zrobić krócej, używając np. mniejszej liczy argumentów. |
|
DejaVu |
» 2009-10-22 02:40:25 Wątpię czy zapis macierz1[][] przepuści kompilator jako argument funkcji. Najlepiej tablicę wielowymiarową przekazać do argumentu poprzez wskaźnik i podać rozmiary każdego wymiaru jako argumenty. |
|
rufek Temat założony przez niniejszego użytkownika |
» 2009-10-22 13:00:48 kompilator nie przepuszcza dwuwymiarowych, wiec rozwiązałem to w ten sposób:
void wypelnij(int macierz1[10][10] , int kol1, int rzad1)
a w funkcji jest pętla która wypełnia i tak tylko tyle, ile potrzeba.
Ze wskaźnikami nie czuję się jeszcze zbyt pewnie, ale dziękuję za wskazówki, mam nadzieję, że pomogą mi one to przerobić :) pozdrawiam ! |
|
« 1 » 2 |