Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C] Macierze podawanie i wyświetlanie. Jak zrobić 2 funkcje?

Predi1 26 Dec 2010 20:41 9366 11
  • #1
    Predi1
    Level 9  
    Mam pewien problem, mam funkcję która dynamicznie pobiera macierz z klawiatury i wyświetla ją na ekranie. Chciałbym jednak to rozbić na dwie funkcje jednak nie bardzo wiem jak. Kod mojej funkcji wygląda tak:



    Code:
    int podajMacierz()
    
    {
        /* tworzy macierz AxB */
        int i,j,A,B;
        int **macierz;
        printf("Podaj liczbe kolumn:");
        scanf("%d",&A);
        printf("Podaj liczbe wierszy:");
        scanf("%d",&B);
       
        //dynamiczne utworzenie macierzy
        macierz=(int**)malloc(sizeof(int*)*B);
        for(i=0;i<A;i++)
            macierz[i]=(int*)malloc(sizeof(int)*A);

        for(i=0;i<A;i++)
            {
                for(j=0;j<B;j++)
                {
                     printf("Wrotosc elemntu %d*%d: ",i+1,j+1);
                     scanf("%d",&macierz[i][j]);
                }
            }
            printf("Podana macierz:\n");
            /* wypisuje tablice */
            for(i=0;i<A;i++)
            {
                for(j=0;j<B;j++)
                    {
                        printf("%d ", macierz[i][j]) ;
                    }
                    printf("\n") ; /* oddziela każdy nowy wiersz */
            }
    }


    I tu przy wyświetlaniu mam użyte zmienne które są podawane w tej funkcji, mógłby ktoś mnie jakoś nakierować jak to rozbić na dwie funkcje (podawanie macierzy i wyświetlanie macierzy w dwóch oddzielnych funkcjach)
  • Helpful post
    #3
    Matejkos
    Level 20  
    W jednej funkcji masz jako wejście ilość wierszy i kolum macierzy a wyjściem jest wskaźnik na macierz a w 2 jako parametr przyjmuje rozmiary i wskaźnik na macierz. Jeżeli byś chciał tworzyć macierz od podstaw w sensie że pytasz użytkownika o wielkość w funkcji parametrami wejściowymi musiały by być 2 adresy wskazujące na zmienne wielkości macierzy i reszta podobnie jak wcześniej. Mam nadzieje że pomogłem

    Pozdrawiam Matejkos
  • #4
    Predi1
    Level 9  
    Jestem dopiero początkującym programistą więc nie bardzo wiem jak to zrobić. robiłem tak:
    Code:
    int podajmacierz(int a, int b)
    
    {
        /* tworzy macierz axb */
        int i,j;
        int **macierz;
        printf("podaj liczbe kolumn:");
        scanf("%d",&a);
        printf("podaj liczbe wierszy:");
        scanf("%d",&b);
       
        //dynamiczne utworzenie macierzy
        macierz=(int**)malloc(sizeof(int*)*b);
        for(i=0;i<a;i++)
            macierz[i]=(int*)malloc(sizeof(int)*a);

        for(i=0;i<a;i++)
            {
                for(j=0;j<b;j++)
                {
                     printf("wrotosc elemntu %d*%d: ",i+1,j+1);
                     scanf("%d",&macierz[i][j]);
                }
            }
            printf("podana macierz:\n");
    }

    int wyswietlmacierz(int **macierz, int a, int b)
    {
        int i,j;
        for(i=0;i<a;i++)
        {
           for(j=0;j<b;j++)
           {
               printf("%d ", macierz[i][j]) ;
           }
           printf("\n") ; /* oddziela każdy nowy wiersz */
        }
    }


    Jednak później wywala błąd przy użyciu funkcji (invalid type argument of 'unary *')


    Edit: Zapomniałem dodać na wyjściu podania macierzy wyznacznika. Jednak znowu coś nie działa i wywala błąd. Teraz mam to zapisane tak:

    Code:
    int podajMacierz(int A, int B)
    
    {
        /* tworzy macierz AxB */
        int i,j;
        int **macierz;
        printf("Podaj liczbe kolumn:");
        scanf("%d",&A);
        printf("Podaj liczbe wierszy:");
        scanf("%d",&B);
       
        //dynamiczne utworzenie macierzy
        macierz=(int**)malloc(sizeof(int*)*B);
        for(i=0;i<A;i++)
            macierz[i]=(int*)malloc(sizeof(int)*A);

        for(i=0;i<A;i++)
            {
                for(j=0;j<B;j++)
                {
                     printf("Wrotosc elemntu %d*%d: ",i+1,j+1);
                     scanf("%d",&macierz[i][j]);
                }
            }
            return(**macierz);
    }
  • #6
    Predi1
    Level 9  
    A faktycznie, teraz mam kolejny problem. Program nie zapamiętuje mi podanej liczby kolumn i wierszy (oznaczonych jako A,B u mnie)

    Code:
    int **podajMacierz(int A, int B)
    
    {
        /* tworzy macierz AxB */
        int i,j;
        int **macierz;
        printf("Podaj liczbe kolumn:");
        scanf("%d",&A);
        printf("Podaj liczbe wierszy:");
        scanf("%d",&B);
       
        //dynamiczne utworzenie macierzy
        macierz=(int**)malloc(sizeof(int*)*B);
        for(i=0;i<A;i++)
            macierz[i]=(int*)malloc(sizeof(int)*A);

        for(i=0;i<A;i++)
            {
                for(j=0;j<B;j++)
                {
                     printf("Wrotosc elemntu %d*%d: ",i+1,j+1);
                     scanf("%d",&macierz[i][j]);
                }
            }
            printf("Podana macierz:\n");
           
           
            return macierz;
    }

    int wyswietlMacierz(int A, int B, int **macierz)
    {
        int i,j;
        for(i=0;i<A;i++)
        {
           for(j=0;j<B;j++)
           {
               printf("%d ", macierz[i][j]) ;
           }
           printf("\n") ;
        }
    }



    Wszystko działa jak ręcznie wpiszę liczbę kolumn i wierszy ale chciałbym aby użytkownik mógł zrobić wszystko.

    Edit: Sytuacja jest ciekawa bo dałem kumplowi aby spojrzał na to i on mówi, że u niego wszystko ładnie śmiga

    Edit2: I jeszcze zdjęcie, na czerwono komenda jaką wpisałem (może to kogoś naprowadzi na bład)
    [C] Macierze podawanie i wyświetlanie. Jak zrobić 2 funkcje?
  • Helpful post
    #7
    directx11
    Level 17  
    Code:
    int **podajMacierz(int A, int B) 


    Przekazując w ten sposób parametry do funkcji przekazujesz tak naprawdę ich kopie a nie je same. Więc nie zdziw się, jeśli po wyjściu z funkcji ich wartość nijak się nie będzie miała do tego, co przypiszesz im wewnątrz, bo przypisujesz to do kopii. Zrób przekazanie przez wskaźnik (albo referencję jeśli to C++), albo niech to będą zmienne globalne, wtedy nie będziesz ich musiał przekazywać do funkcji.
  • #8
    Predi1
    Level 9  
    Ze zmiennymi globalnymi mi się udało jednak nie mam zielonego pojęcia jak to zrobić z pomocą wskaźników :|

    Albo jak można sprawdzić używając zmiennych globalnych warunki do mnożenia macierzy (liczba kolumn pierwszej macierzy=liczbie wierszy drugiej macierzy)
  • Helpful post
    #9
    directx11
    Level 17  
    Predi1 wrote:
    Ze zmiennymi globalnymi mi się udało jednak nie mam zielonego pojęcia jak to zrobić z pomocą wskaźników :|


    Code:
    int **podajMacierz(int* A, int* B)
    
    {
      // teram masz różne sposoby odwołania się do zmiennej
      *A = value;     // <- nadanie lub odczytanie wartości
      *B = *A;
     
      // jeśli używasz w funkcji scanf() to:
      scanf("%d", A);  // bez '&'
    }


    Predi1 wrote:
    Albo jak można sprawdzić używając zmiennych globalnych warunki do mnożenia macierzy (liczba kolumn pierwszej macierzy=liczbie wierszy drugiej macierzy)


    Nie bardzo rozumiem pytanie.. chodzi Ci o zwykłe porównanie za pomocą operatora '=='?
  • #10
    Predi1
    Level 9  
    Tak, chodzi o zwykłe porównanie ==

    Jak mam fragment kodu dla mnożenia macierzy

    Code:

    int **mnozMacierz(int **macierz1, int **macierz2)
    {
        int i,j;
        int **wynik;
       
        wynik=(int**)malloc(sizeof(int*)*A);
        for(i=0;i<A;i++)
           wynik[i]=(int*)malloc(sizeof(int)*B);
           
        for(i=0;i<A;i++)
           for(j=0;j<B;j++)
           {
              wynik[i][j]=0;
              for(int k=0;k<B;k++)
                 wynik[i][j]=wynik[i][j]+(macierz1[i][k]*macierz2[k][j]);
           }
        return wynik;

    }

    int main()
    {

    (...)
    (...)
    (...)
    (...)


    int **MacierzA, **MacierzB, **mnozenie;
             int wyswietlA, wyswietlB, wyswietlC;
             
             printf("Podaj pierwsza macierz:\n");
             MacierzA=podajMacierz();
             wyswietlA=wyswietlMacierz(MacierzA);
             printf("\n");
             
             printf("Podaj druga macier:\n");
             MacierzB=podajMacierz();
             wyswietlB=wyswietlMacierz(MacierzB);
             printf("\n");
             
             mnozenie=mnozMacierz(MacierzA,MacierzB);
             printf("Macierz wynikowa:\n");
             wyswietlC=wyswietlMacierz(mnozenie);


    Przy użyciu zmiennych globalnych da się tu sprawdzić czy liczba kolumn macierzy A= liczbie kolumn macierzy B?
  • #11
    directx11
    Level 17  
    Predi1 wrote:
    Tak, chodzi o zwykłe porównanie ==...
    Przy użyciu zmiennych globalnych da się tu sprawdzić czy liczba kolumn macierzy A= liczbie kolumn macierzy B?


    "Globalność" zmiennych nie ma nic do możliwości operowania na nich operatorami - nie rozumiem z czym masz problem... po prostu bierzesz i porównujesz.
  • #12
    Predi1
    Level 9  
    Teoretycznie rozumiem ale jak w obydwu macierzach ta sama zmienna jest liczbą kolumn i wierszy (i w jednej macierzy i w drugiej macierzy liczbe kolumn mam zadeklarowana jako A a liczbę wierszy jako B) to jak to mogę sprawdzić? Jakoś opornie mi to idzie ;p

    Edit: w sumie jest mi to już nie potrzebne, temat rozwiązany. Dzięki wszystkim za pomoc ;)