Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamiana fragmentu programu na funkcje

Ostatnio zmodyfikowano 2009-10-22 16:26
Autor Wiadomość
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:
C/C++
#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;
       
    }
   
    //   macierz 2 !!!!!!!!!!
    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++ ) // wypisuje macierz1
    {
        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++ ) // wypisanie macierz2
    {
        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";
   
    // rozpoczecie mnozenia
   
    a = 0;
    b = 1;
    x = 0;
   
    int rozmiar_wyniku = kol2 * rzad1;
   
   
    for( i = 1; i <= rozmiar_wyniku; i++ )
    {
        macierz3[ i ] = 0;
    }
   
    // tu sie zaczyna funkcja !!
    /////////////////////////////////////////////////////////////////////////////////
   
   
    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;
           
           
        }
    }
   
   
    // koniec funkcji  !!!
    /////////////////////////////////////////////////////////////////////////////
   
    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 :)
P-11010
DejaVu
» 2009-10-21 10:36:06
P-11027
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ę :/
P-11035
DejaVu
» 2009-10-21 21:10:48
Gotowców nie robimy - wybacz.
P-11041
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 :)
P-11043
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.
P-11047
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.
P-11049
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 !
P-11052
« 1 » 2
  Strona 1 z 2 Następna strona