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

Sposób działania tablicy jako argumentu funkcji [Lekcja 19]

Ostatnio zmodyfikowano 2015-11-22 02:33
Autor Wiadomość
baddevil96
Temat założony przez niniejszego użytkownika
Sposób działania tablicy jako argumentu funkcji [Lekcja 19]
» 2015-11-21 23:21:56
Jestem po 19 lekcji kursu z tej strony. Właściwie do tej pory wszystko było dla mnie jasne, argumenty funkcji, jako "potrzebne rzeczy" przez funkcję, lecz nie mogłem zrozumieć sposobu działania tablic jako argumentów.

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int tablica_losowanie( int t[], int iLiczby, int min, int max )
{
    max = max - min + 1;
    int i = 0;
    do {
        t[ i ] =(( rand() % max ) + min );
        i++;
    } while( i < iLiczby );
   
}

int wypisz_liczby( int tablica_wypisz[], int iLiczby )
{
    int i = 0;
    tablica_wypisz[ iLiczby ];
    do {
        cout << tablica_wypisz[ i ] << ", ";
        i++;
    } while( i < iLiczby );
   
}

int sumujemy( int tablica_suma[], int iLiczby )
{
    int i = 0;
    int suma = 0;
    do {
        suma = suma + tablica_suma[ i ];
        i++;
    } while( i < iLiczby );
   
    cout << endl << "Suma wynosi: " << suma;
}

int main()
{
    srand( time( 0 ) );
    int iLiczby = 0;
    int min = 0;
    int max = 0;
    int tablica_zakres1[ 999 ];
    cout << " Podaj ile liczb ma zostac wylosowane, max 999: ";
    cin >> iLiczby;
    cout << endl << endl << "Podaj zakres (od, do) liczb ktore maja zostac wylosowane: " << endl;
    cin >> min;
    cin >> max;
    cin.clear();
    cin.sync();
    tablica_losowanie( tablica_zakres1, iLiczby, min, max );
    //Wywołuje funkcje, podaje jej potrzebne argumenty, w przypadku tablicy, tablica otrzymuje zawartosc
    wypisz_liczby( tablica_zakres1, iLiczby );
   
    sumujemy( tablica_zakres1, iLiczby );
}

No niby wszystko fajnie, zadanie zrobiłem ostatecznie bez zadnej pomocy, lecz tak naprawdę nie mam zielonego pojęcia o co chodzi z tymi tablicami..
C/C++
tablica_losowanie( tablica_zakres1, iLiczby, min, max );


Wywołuje funkcje i daje jej potrzebne argumenty, w tym jeden w postaci tablicy, i magicznie tablica ktorą podałem jako argument wypełnia się liczbami wygenerowanymi tutaj:
C/C++
int tablica_losowanie( int t[], int iLiczby, int min, int max )
{
    max = max - min + 1;
    int i = 0;
    do {
        t[ i ] =(( rand() % max ) + min );
        i++;
    } while( i < iLiczby );
   
}

No dobra, rozumiem ze dla tablicy te argumenty dzialaja jakos odwrotnie, skoro 'tablica_zakres1' dostaje dane z 't'.

I potem robie osobna funkcje ktora mi te liczby wypisze:
C/C++
int wypisz_liczby( int tablica_wypisz[], int iLiczby )
{
    int i = 0;
    tablica_wypisz[ iLiczby ];
    do {
        cout << tablica_wypisz[ i ] << ", ";
        i++;
    } while( i < iLiczby );
   
}
I w tym przypadku dane z tablicy 'tablica_zakres1' są przesłane do funkcji 'wypisz_liczby', a nie jak w poprzednim przykładzie, odwrotnie...

Moze za duzo dzisiaj siedze i dostaje jakiegos mindfucka, moze napisalem zly program, w sumie juz nic nie wiem i proszę, wytłumaczy mi ktoś z jakimiś prostymi przykładami jaka jest zaleznosć miedzy tablicą a argumentem funkcji?

Dzięki :)
P-140527
carlosmay
» 2015-11-22 01:32:44
W wywołaniu funkcji
C/C++
tablica_losowanie( tablica_zakres1, iLiczby, min, max );
 podajesz w argumencie nazwę tablicy, ale jej nazwa w wywołaniu funkcji jest zupełnie dowolna (taki alias nazwy).

I w tym przypadku dane z tablicy 'tablica_zakres1' są przesłane do funkcji 'wypisz_liczby', a nie jak w poprzednim przykładzie, odwrotnie...
 to nie tak.
Wszystkie działania odbywają się na oryginalnej tablicy, bo do funkcji przekazujesz adres początku tablicy (zapoznaj się ze wskaźnikami),
czyli "wskaźnik" (można tak to nazwać, ale działa tak samo) na pierwszy element. Więc cokolwiek zrobisz z tablicą w funkcji, działasz tam gdzie jest zadeklarowana.
Operator '[]' nawias kwadratowy służy do wyłuskania (odczytania) zawartości komórki tablicy pod danym nr indeksu. Można też odczytać dane z tablicy za
pośrednictwem wskaźnika.

C/C++
// main()
int tab[ 3 ] = { 1, 2, 3 };
cout << & tab[ 0 ] << ", " << & tab[ 2 ] << endl; // wypisz adresy pierwszego i trzeciego el. tablicy
funkcja_edytuj_tablice( tab, 3 ); // wywolanie funkcji

// funkcja
void funkcja_edytu_tablice( int tablica_w_funkcji[], int rozmiar )
{
    cout << & tablica_w_funkcji[ 0 ] << ", " << & tablica_w_funkcji[ 2 ] << endl;
    cout << * tablica_w_funkcji << endl; // zapis wskaznikowy tablica[0]
    cout << *( tablica_w_funkcji + 1 ) << endl; // zapis wskaznikowy tablica[1]
}
 adresy tych samych elementów pokrywają się. To dowód, że tablica nie jest przekazywana przez wartość,
a w funkcji zmienia się jej identyfikator (nazwa) na dowolną zadeklarowaną w nagłówku funkcji.
P-140533
baddevil96
Temat założony przez niniejszego użytkownika
» 2015-11-22 02:06:25
Czyli jeśli dobrze rozumiem...

C/C++
tablica_losowanie( tablica_zakres1, iLiczby, min, max );
Tutaj działam na zadeklarowanej tablicy, 'tablica_zakres1', a wywołując funkcję 'tablica_losowanie, zmieniam po prostu jej zawartosc?

C/C++
wypisz_liczby( tablica_zakres1, iLiczby );
Tutaj dzialam tez na 'tablica_zakres1' lecz nie modyfikuje jej zawartosci lecz po nią "sięgam"?

P-140535
carlosmay
» 2015-11-22 02:33:00
Tak.
P-140537
« 1 »
  Strona 1 z 1