Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 21 lis 2024, o 19:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 10 lis 2016, o 21:46 
Offline
Nowy

Dołączył(a): 10 lis 2016
Posty: 6
Pomógł: 0

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2016, o 21:51 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27309
Lokalizacja: Szczecin
Pomógł: 1041

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?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2016, o 21:54 
Offline
Nowy

Dołączył(a): 10 lis 2016
Posty: 6
Pomógł: 0

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 :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2016, o 07:28 
Offline
Użytkownik

Dołączył(a): 27 lut 2013
Posty: 230
Pomógł: 4

Moze bedzie prosciej jak podasz ktorej linijki nie rozumiesz
;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2016, o 08:51 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2584
Pomógł: 128

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2016, o 12:07 
Offline
Nowy

Dołączył(a): 10 lis 2016
Posty: 6
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2016, o 22:13 
Offline
Użytkownik

Dołączył(a): 28 wrz 2016
Posty: 215
Pomógł: 14

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 postu otrzymał pochwałę

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2016, o 22:29 
Offline
Nowy

Dołączył(a): 10 lis 2016
Posty: 6
Pomógł: 0

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! :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2016, o 00:44 
Offline
Użytkownik

Dołączył(a): 28 wrz 2016
Posty: 215
Pomógł: 14

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 postu otrzymał pochwałę

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2016, o 13:36 
Offline
Nowy

Dołączył(a): 10 lis 2016
Posty: 6
Pomógł: 0

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ę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2016, o 16:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

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 postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2016, o 11:42 
Offline
Nowy

Dołączył(a): 10 lis 2016
Posty: 6
Pomógł: 0

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! :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO