[C++] Wyjaśnienie paru funkcji


(Kielbas99) #1

Witam. Prosiłbym, aby ktoś wyjaśnił mi do czego służą niektóre funkcje. Z tego co zauważyłem, program wyświetla 10 losowych liczb mniejszych od 10, następnie je dodaje, a wynik dzieli przez 10.

Do czego służy srand(time(NULL));, tab =rand()%9+1; oraz cout <<(float)suma/10 << endl;. Wkleiłem całe linijki, w ostatniej chodzi mi tylko o to float .

#include 

using namespace std;

int main()

{

    int tab[10],i,suma=0;

    srand(time(NULL));

    for(i=0;i<10;i++)

    {

                     tab[i]=rand()%9+1;

    }

    for(i=0;i<10;i++)

    {

                     cout << tab[i]<< ' ';

    }

    cout << endl;

    for(i=0;i<10;i++)

    suma=suma+tab[i];

    cout << suma << ' ';

    cout <<(float)suma/10 << endl;

    system ("PAUSE");

    return 0;

}

(Sawyer47) #2

srand – http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

time – http://www.cplusplus.com/reference/clibrary/ctime/time/

rand – http://www.cplusplus.com/reference/clib ... dlib/rand/

(type) – operator rzutowania http://pl.wikibooks.org/wiki/C++/Zmienne#Rzutowanie


(Kielbas99) #3

Hm... Czyli dobrze zrozumiałem, iż srand(time(NULL)); resetuje liczby losowe? Z tego co pamiętam, to bez tej funkcji komputer będzie wyświetlał ciągle takie same liczby losowe, tab =rand()%9+1 oznacza liczbę losową od 0 do 8 +1, a cout <<(float)suma/10 << endl; wyświetla liczbę rzeczywistą podzieloną przez 10? Nie do końca zrozumiałem z tego co mi wysłałeś, troszkę się domyśliłem.


(Drobok) #4

Raczej przydzielenie do tablicy o indeksie i, reszty z dzielenia liczby pseudolosowej przez 9 powiększonej o 1.


(Sawyer47) #5

srand(time(NULL)) inicjuje ziarno generatora liczb pseudolosowych aktualnym czasem, dzięki czemu przy uruchomieniu programu w różnym czasie sprawi, że rand będzie dawał różne wartości pseudolosowe.

rand()%9+1 daje wartości pseudolosowe z zakresu [1, 9]

(float)suma/10 sprawia, że zostanie wyświetlona liczba zmiennoprzecinkowa (float). Zmienna suma jest typu całkowitoliczbowego jak i dzielona jest przez liczbę całkowitą, wynik więc również byłby całkowity. Jednak ponieważ suma jest rzutowana na typ float, następuje dzielenie zmiennoprzecinkowe i wynik również będzie zmiennoprzecinkowy.


(Kielbas99) #6

Dalej trochę tego nie rozumiem. Mógłby mi ktoś to klarowniej wyjaśnić np. na podstawie tego zadania? Najlepiej wszystko po kolei, oczywiście jakby ktoś mógł. Ja to rozumiem tak, że mam tablicę od 0 do 9 oraz jakąś liczbę "i". Za każdym razem, gdy uruchamiam program następuje resetowanie losowych liczb. Przechodzę do pętli "for" z której musi spełniać warunek i<10 (na początku i jest równe 0), więc będzie działać dla i=0,1,2,3,4,5,6,7,8,9; i++, czyli dodaje 1. Następnie jest tab =rand()%49+1; i nie rozumiem właśnie tego dalej. W następnej pętli "for" każe wypisywać liczby z kolejnych miejsc w tablicy od 0 do 9.

#include 

using namespace std;

int main()

{

    int tab[10], i;

    srand(time(NULL));

    for(i=0; i<10; i++)

    {

             tab[i]=rand()%49+1;

    }

    for(i=0; i<10; i++)

    {

             cout << tab[i] << ' ';

    }

    system ("PAUSE");

    return 0;

}

(Sawyer47) #7

tab_=rand()%49+1_

tab – to odwołanie się do i-tego elementu tablicy tab

Zostanie tam wpisana wartość rand()%49+1.

Funkcja rand() zwraca liczby pseudolosowe z zakresu od 0 do RAND_MAX (bez wgłębiania się w szczegóły, duża liczba). Wynik jest dzielony modulo prez 49 (innymi słowy jest to reszta z dzielenia przez 49). Wiadomo, że taka reszta będzie z przedziału od 0 do 48. Następnie do tej liczby dodawana jest jedynka, więc ostatecznie dostajesz liczbę pseudolosową z przedziału od 1 do 49 (0+1 .. 48+1).


(Kielbas99) #8

Ok dzięki, jeszcze jedno pytanie, lecz z innej bajki. Jak napisać, aby losowało liczby z przedziału od -100 do 100?


(Drobok) #9
rand()%201-100; [/code]

@up learn c nab ;p // jak już to cout<<"..."<