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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 12 kwi 2025, o 08:35


    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 ] [ Zaznacz wszystko ]
    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: 27372
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 2595
    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Lub:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    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 0 gości


    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