ATNEL tech-forum
https://forum.atnel.pl/

Liczby losowe lotka bez powtórzeń (Język C)
https://forum.atnel.pl/topic16783.html
Strona 1 z 1

Autor:  czupryn888 [ 10 lis 2016, o 21:46 ]
Tytuł:  Liczby losowe lotka bez powtórzeń (Język C)

Witam serdecznie. Na forum jestem pierwszy raz i prosiłbym o pomoc w zrozumieniu tego kodu programu. Niektóre wiersze rozumiem i sam dopisałem, ale inne zostają dla mnie zagwozdką. Pomożecie? :)
Prosiłbym o wytłumaczenie łapotologiczne ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  mirekk36 [ 10 lis 2016, o 21:51 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

a co to ma wspólnego z językiem C dla AVR ? .... przenoszę do innego działu i na przyszłość proszę zakładać wątki w odpowiednim dziale ok?

Autor:  czupryn888 [ 10 lis 2016, o 21:54 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

W takim razie przepraszam, ale dla takiego prostego człowieka, który pierwszy raz ma kontakt z programowaniem język C, a jakieś AVR niczym się nie różni :D
Już na przyszłość będę wiedzieć, żeby wrzucać posty w dział "Programowanie w innych językach".

Także czekam na pomoc :)

Autor:  michal1210 [ 11 lis 2016, o 07:28 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

Moze bedzie prosciej jak podasz ktorej linijki nie rozumiesz
;)

Autor:  micky [ 11 lis 2016, o 08:51 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

No właśnie :) których to nie rozumiesz?

Autor:  czupryn888 [ 13 lis 2016, o 12:07 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

Dokładnie tych, których nie opisałem. Czyli prawie z połowa :)
Byłbym wdzięczny, potrzebuję zrozumieć wszystko na zaliczenie :D

Autor:  Alef2 [ 13 lis 2016, o 22:13 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

W programie są dwa problemy do zrozumienia: generowanie liczb pseudolosowych i zapewnienie, że liczby sie nie powtórzą.
Pierwszy problem. Użyta jest funkcja rand(), która zwraca liczbę całkowitą z zakresu od 0 do 32767, a nam potrzebna jest liczba z zakresu od 1 do 49. By zamienić jeden zakres na drugi wykorzystana jest operacja dzielenia modulo, która zwraca nam resztę z dzielenia, w tym wypadku dzielenia przez 49. W wyniku tego otrzymujemy liczby całkowite z zakresu od 0 (najmniejsza reszta z dzielenia, gdy liczby dzielą się bez reszty) do 48 (największa reszta, bo 49 już by się podzieliło bez reszty). Dodając 1 przesuwamy zakres o 1 i otrzymujemy upragniony zakres od 1 do 49.
Jest jednakże małe ale. Generator liczb pseudolosowych potrzebuje tzw "ziarna" (seed), czyli punktu startowego.Tym się zajmuje funkcja srand(). Gdyby jej nie było generator startowałby zawsze z tego samego punktu i program generowałby zestaw liczb pseudolosowych, ale zawsze, za każdym uruchomieniem taki sam zestaw liczb. Aby za każdym kolejnym uruchomieniem program generował inny zestaw liczb pseudolosowych, generator musi za każdym uruchomieniem startować z innego punktu, tzn funkcja srand() musi być wywoływana z innym argumentem. Tym argumentem jest funkcja time(NULL), która zwraca bieżący czas w postaci liczby sekund jakie upłynęły od 1 stycznia 1970 roku. Tak więc za każdym uruchomieniem programu jest inny czas, generator startuje z innego punktu i otrzymujemy inny zestaw liczb pseudolosowych. Funkcja time() jest w bibliotece time.h i zapis #include <time.h>, umożliwia nam korzystanie z tej funkcji.
Jeżeli jest to zrozumiałe, to proszę dać znać a wytłumaczę jak jest zapewniane, że liczby się nie powtórzą.

Autor:  czupryn888 [ 13 lis 2016, o 22:29 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

Oo, super wszystko wyjaśnione :)

Właśnie, w jaki sposób jest to tutaj zrobione, że liczby mają się nie powtarzać? I jeszcze jak działa te do i while.
W sumie te pętle for też dobrze byłoby gdybyś mógł wyjaśnić, bo mniej więcej wiem co robią, ale zupełnie nie rozumiem co w nie trzeba wstawić (robię to jakby schematem, ale go nie rozumiem).

Dziękuję pięknie! :)

Autor:  Alef2 [ 14 lis 2016, o 00:44 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

OK. Wiemy już jak powstają liczby pseudolosowe.
Pętla
for (i=0; i<6; i++) //linia 9
odpowiada za losowanie kolejnych liczb. Zaczyna się dla i=0, wykonuje się dopóki spełniony jest warunek i<6, a za każdym przejściem i zwiększane jest o 1 (i++). Tak więc pętla wykona się 6 razy dla i 0, 1, 2, 3, 4, 5. Dla i=6 warunek nie będzie już spełniony i pętla się zakończy. Rozpoczęcie pętli od 0 ma tą zaletę, że pierwszy element tablicy ma indeks właśnie 0.
Następnie mamy pętlę do-while (czyli wykonuj dopóki). W tego rodzaju pętli, w odróżnieniu od pętli for(). mamy tylko warunek wykonywania się pętli bez warunku startowego i bez określenia co ma się zmieniać w kolejnych przejściach pętli. Pętla ta najpierw wykonuje czynności zawarte w nawiasach, a następnie sprawdza warunek. jeżeli jest prawdziwy, to wykonuje się ponownie, jeżeli nie to pętla kończy swoje działanie. Ponieważ warunek sprawdzany jest na końcu, pętla ta wykona się co najmnej raz.
Na początku tej pętli nadajemy wartość zmiennej pomocniczej nowaliczba=1. Wartość 1 tej zmiennej oznacza, że nowo wylosowana liczba jest różna od poprzednio wylosowanych (liczby nie powtórzyły się), wartość 0 oznacza, że nowo wylosowana liczba jest równa którejś z poprzednio wylosowanych (liczby powtórzyły się).
Dalej mamy wylosowanie nowej liczby.
Następnie mamy pętle
for(k=0; k<i; k++)
wraz ze sprawdzeniem warunku
if (lotek[k]==losowaliczba) nowaliczba=1;
Zaczynamy pętle z k=0, pętla wykonuje się póki spełniony jest warunek k<i i k zwiększa się o 1. W tablicy lotek[] mamy już wylosowane liczby.
Jeżeli i=0, czyli to pierwsza losowana liczba, to warunek k<i, nie będzie spełniony i pętla się nie wykona, zmienna nowaliczba będzie mieć wartość 0 (nadaną w linii 13), warunek nowaliczba==1 w while (linia 19) nie będzie spełniony i pętla do-while się zakończy.
Jeżeli i=1, czyli losujemy drugą liczbę, warunek k<i będzie spełniony dla k=0 i petla wykona się raz dla k=0. Jeżeli teraz poprzednio wylosowana liczba zawarta w tablicy lotek[0] jest równa obecnie wylosowanej (liczby powtórzyły się), to nadawana jest wartść 1 zmiennej nowaliczba, warunek while (nowaliczba==1) jest spełniony i pętla do-wile jest wykonywana ponownie. Następuje ponowne losowanie liczby, bo liczby sie powtórzyły.
Jeżeli natomiast warunek lotek[0]==losowaliczba, nie jest spełniony (liczby są różne), to wartość zmiennej nowaliczba pozostaje 0 i warunek while (nowaliczba==1) nie jest spełniony, pętla do-wile się kończy i rozpoczyna się kolejny obieg pętli for dla kolejnego i, a zarazem losowanie kolejnej liczby.
Dla i=2,3,4,5 przebiega to analogicznie, z tym, że warunek lotek[k]==losowaliczba, jest sprawdzany dla kolejnych liczb, odpowiednio
dla i=2, lotek[0]==losowaliczba, lotek[1]==losowaliczba
dla i=3, lotek[0]==losowaliczba, lotek[1]==losowaliczba, lotek[2]==losowaliczba, itd

Autor:  czupryn888 [ 16 lis 2016, o 13:36 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

Ogromne dzięki. Wszystko już rozumiem. Aczkolwiek da się zrobić tutaj taki warunek na podobie do tego co już jest, aby lotek odrzucał liczbę np. 5 i losował zamiast niej inną liczbę?

Autor:  anshar [ 16 lis 2016, o 16:40 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

czupryn888 napisał(a):
Aczkolwiek da się zrobić tutaj taki warunek na podobie do tego co już jest, aby lotek odrzucał liczbę np. 5 i losował zamiast niej inną liczbę?

Oczywiście, że tak. Zobacz dodatkowy warunek w linii 28:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Lub tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Lub:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  czupryn888 [ 27 lis 2016, o 11:42 ]
Tytuł:  Re: Liczby losowe lotka bez powtórzeń (Język C)

Dziękuję pięknie. Program zrozumiałem i dzięki temu zaliczyłem kolosa na 4+. Tylko, że akurat program miał z 21 liczb(0-20) wylosować 30 (powtarzających się) i sprawdzić czy jest liczba 10. Udało się, dzięki zrozumieniu. Jeszcze raz wielkie dzięki. Jak coś będzie jeszcze niezrozumiałe to będę uderzać do Was! :)

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/