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

[C] Problem z tablicami dwuwymiarowymi i funkcją

Ostatnio zmodyfikowano 2012-02-07 00:29
Autor Wiadomość
Matti
Temat założony przez niniejszego użytkownika
[C] Problem z tablicami dwuwymiarowymi i funkcją
» 2012-02-06 22:06:28
Usiłuję napisać mnożenie macierzy, chciałem sprawdzić czy program do tego momentu poprawnie działa, niestety mam problem. Części programu: "zerowanie macierzy" i "mnozenie macierzy" nie chcą się wykonać. Robię błąd w:
macierz3 = ZerowanieMacierzy(macierz3, x1, y2);
return macierz3;
i odpowiednio to samo dla mnożenia macierzy.
Niestety nie wiem jak to poprawić. Może mi ktoś pomóc? Kod:
C/C++
#include <stdio.h>

int ZerowanieMacierzy( int ** macierz3, int x1, int y2 )
{
    int i, j;
    for( i = 0; i < x1; ++i )
    for( j = 0; j < y2; ++j )
         macierz3[ i ][ j ] = 0;
   
    return macierz3;
}

int MnozenieMacierzy( int ** macierz1, int ** macierz2, int x1, int y1, int x2, int y2 )
{
    int i, j, k;
    int macierz3[ x1 ][ y2 ];
    for( i = 0; i < x1; ++i )
    for( j = 0; j < y2; ++j )
    for( k = 0; k < x1; ++k )
         macierz3[ i ][ j ] +=( macierz1[ k ][ j ] * macierz2[ i ][ k ] );
   
    return macierz3;
}

int WypelnijMacierz( int x, int y )
{
    int i, j;
    int macierz[ x ][ y ];
    for( i = 1; i <= x; ++i )
    {
        for( j = 1; j <= y; ++j )
        {
            printf( "w%d k%d:\n", i, j );
            scanf( "%d", & macierz[ i - 1 ][ j - 1 ] );
        }
    }
    printf( "Macierz wypelniona!\n" );
    return macierz[ x ][ y ];
}

int WymiarMacierzy()
{
    int x;
    scanf( "%d", & x );
    return x;
}

main()
{
    int x1, x2, y1, y2;
   
    //ODCZYTYWANIE WYMIAROW MACIERZY
   
    printf( "Podaj szerokosc i wysokosc pierwszej macierzy:\n" );
    x1 = WymiarMacierzy();
    y1 = WymiarMacierzy();
    printf( "Podaj szerokosc i wysokosc drugiej macierzy:\n" );
    x2 = WymiarMacierzy();
    y2 = WymiarMacierzy();
    if( x1 != y2 )
         printf( "Nie da sie wymnozyc macierzy!" );
   
    //WYPELNIANIE MACIERZY
   
    int macierz1[ x1 ][ y1 ], macierz2[ x2 ][ y2 ], macierz3[ x1 ][ y2 ];
    macierz1[ x1 ][ y1 ] = WypelnijMacierz( x1, y1 );
    macierz2[ x2 ][ y2 ] = WypelnijMacierz( x2, y2 );
   
    //ZEROWANIE MACIERZY
   
    macierz3 = ZerowanieMacierzy( macierz3, x1, y2 );
   
    //MNOZENIE MACIERZY
   
    macierz3 = MnozenieMacierzy( macierz1, macierz2, x1, y1, x2, y2 );
   
    return 0;
   
}
P-50214
malan
» 2012-02-06 22:09:42
» Kurs C++ » Poziom 2Funkcje - pierwsze starcie lekcja, paragraf: Czas życia zmiennych w funkcjach.
P-50216
Matti
Temat założony przez niniejszego użytkownika
» 2012-02-06 22:16:00
Dobrze, ale co to ma wspólnego z moim programem? Nie widzę powiązania. Ja wchodzę do funkcji raz, obliczam w niej co trzeba i chcę wynik zwrócić jako tablicę do mojej tablicy.
P-50218
DejaVu
» 2012-02-06 22:19:16
Po co funkcje zerowanieMacierzy i mnozenieMacierzy zwracają cokolwiek? :) Wywal tam te returny i daj void-a jako zwracany typ.
P-50220
Matti
Temat założony przez niniejszego użytkownika
» 2012-02-06 22:32:06
http://i42.tinypic.com/nnjqqx.jpg

Takie błędy po zmianach, które zaproponowałeś.
Ogółem to wydaje mi się, że funkcja musi coś zwracać, z pewnością tablicę.
P-50221
DejaVu
» 2012-02-06 23:11:00
1. przy zerowaniu macierzy:
C/C++
macierz3 = ZerowanieMacierzy(...)
Powinno być:
C/C++
ZerowanieMacierzy(...)
2. Przy mnożeniu analogiczna uwaga jak w pkt 1.. Ponadto masz źle zorganizowany kod, więc uwaga malana jest jak najbardziej poprawna i uzasadniona.
P-50224
Matti
Temat założony przez niniejszego użytkownika
» 2012-02-06 23:21:40
Poprawiłem do:
C/C++
#include <stdio.h>

void ZerowanieMacierzy( int ** macierz3, int x1, int y2 )
{
    int i, j;
    for( i = 0; i < x1; ++i )
    for( j = 0; j < y2; ++j )
         macierz3[ i ][ j ] = 0;
    //return macierz3;
}

void MnozenieMacierzy( int ** macierz1, int ** macierz2, int x1, int y1, int x2, int y2, int ** macierz3 )
{
    int i, j, k;
    //int macierz3[x1][y2];
    for( i = 0; i < x1; ++i )
    for( j = 0; j < y2; ++j )
    for( k = 0; k < x1; ++k )
         macierz3[ i ][ j ] +=( macierz1[ k ][ j ] * macierz2[ i ][ k ] );
    //return macierz3;
}

int WypelnijMacierz( int x, int y )
{
    int i, j;
    int macierz[ x ][ y ];
    for( i = 1; i <= x; ++i )
    {
        for( j = 1; j <= y; ++j )
        {
            printf( "w%d k%d:\n", i, j );
            scanf( "%d", & macierz[ i - 1 ][ j - 1 ] );
        }
    }
    printf( "Macierz wypelniona!\n" );
    return macierz[ x ][ y ];
}

int WymiarMacierzy()
{
    int x;
    scanf( "%d", & x );
    return x;
}

main()
{
    int x1, x2, y1, y2;
   
    //ODCZYTYWANIE WYMIAROW MACIERZY
   
    printf( "Podaj szerokosc i wysokosc pierwszej macierzy:\n" );
    x1 = WymiarMacierzy();
    y1 = WymiarMacierzy();
    printf( "Podaj szerokosc i wysokosc drugiej macierzy:\n" );
    x2 = WymiarMacierzy();
    y2 = WymiarMacierzy();
    if( x1 != y2 )
         printf( "Nie da sie wymnozyc macierzy!" );
   
    //WYPELNIANIE MACIERZY
   
    int macierz1[ x1 ][ y1 ], macierz2[ x2 ][ y2 ], macierz3[ x1 ][ y2 ];
    macierz1[ x1 ][ y1 ] = WypelnijMacierz( x1, y1 );
    macierz2[ x2 ][ y2 ] = WypelnijMacierz( x2, y2 );
   
    //ZEROWANIE MACIERZY
   
    ZerowanieMacierzy( macierz3, x1, y2 );
   
    //MNOZENIE MACIERZY
   
    MnozenieMacierzy( macierz1, macierz2, x1, y1, x2, y2, macierz3 );
   
    return 0;
   
}

Nadal nie wiem co mam źle, że są błędy. Poprawiłem te dwie funkcje, teraz nie korzystają ze zmiennej tymczasowej macierz3.
P-50226
DejaVu
» 2012-02-06 23:23:42
Wklejaj treść logu kompilacji... (i nie jako screen bo screen za kilka dni przestanie działać).
P-50228
« 1 » 2
  Strona 1 z 2 Następna strona