Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 4 liczniki
Forum PHP.pl > Forum > Przedszkole
dsinfo
Witam! Mam problem z następującym zadaniem. Otóż muszę napisać aplikację licznika. Dokładnie z czterema licznikami.
W oknie chcę wyświetlić obok siebie cztery liczniki w takiem układzie: A B C D . Te litery oznaczają wartości zwracane
przez liczniki. Każdy z nich liczy maksymalnie do 20 i zaczynają od 0.

Ma to dziłać tak:

Licznik D liczy od 0 do 20. W pierwszym etapie liczniki A,B i C przyjmują wartość 0, a licznik D ma również wartość 0.
W drugim etapie liczniki A,B,C mają 0, a licznik D ma 1.
Gdy, licznik D przyjmnie wartość 20, pozostałe nadal mają wartość 0.
I dopiero w następnym etapie licznik D przyjmuje wartość 0, a licznik C przyjmuje wartość 1.


A B C D

0 0 0 1

0 0 0 19

0 0 0 20

0 0 1 0


W dalszym etapie licznik C ma wartość 1, a licznik D ulega zwiększeniu, więc ma 1 i tak dalej.
Następnie, gdy wartość licznika D dojdzie do 20, to licznik C ma nadal 0. Ale, w następnym etapie licznik C przyjmnie
już wartość 2, a licznik D znowu 0 i zaczyna liczyć od nowa.

0 0 1 1

0 0 1 19

0 0 1 20

0 0 2 1

(...)


Gdy, wartość licznika C przyjmnie wartość 20 i licznik D przyjmnie wartość 20, to pozostałe nadal mają po 0.
W następnym kroku, licznik B przyjmnie wartość 1, a liczniki C i D ulegają wyzerowaniu i liczą od nowa.
I tak samo z licznikiem A. Gdy, Liczniki B,C,D przyjmą odpowiednio wartości 20 , 20 , 20 - licznik A ma wartość 0.
Ale, w następnym etapie licznik A przyjmnie wartość 1, pozostałe ulegną wyzerowaniu i liczą od nowa wg powyższego
schematu. Gdy, wartość licznika A przyjmnie wartość większą od 20 (ma być 21, czyli zostanie przepełniony licznik A),
to wszystkie liczniki (A,B,C,D) ulegają wyzerowaniu.
sadistic_son
No ładnie to opisałeś, dokładniej się rzeczywiście już nie da. Ale mógłbyś wyjaśnić co ma być "akcją" powodującą zwiększanie wartości licznika? Co konkretnie powoduje, że D zwiększa swoją wartość o 1? Naciśnięcie przycisku, odświeżenie strony, dodanie czegoś do bazy? Co? Dalej... gdzie ten licznik ma się zapamiętywać? W sesji, w bazie, w pliku, w ciachu?
markonix
Coś jak system dziesiętny z tym, że zmieniony w 20 jednostek.

4 zmienne i licznik D ciągle się zwiekszający.
Przy zwiększeniu zapytujesz czy jest równy 20 i jeśli tak zwiększasz C, i zapytujesz czy C jest równy 20 i jeśli tak to zwiększasz B, jeśli B == 20 to A++ i jeśli A == 20 to A = B = C = D = 0
sadistic_son
No i dupa, bo wyraźnie jest napisane, że jak A == 20 to B nadal == 0, dopiero przy wyzerowaniu A B ma wskoczyć o pozycję wyżej.
Generalnie to bardzo prosta sprawa, ale odpowiedz na moje pytania z I postu.
markonix
No to wszystko co napisałem tylko porównywać do 21, a nie do 20.
dsinfo
Zmiany mają następować po odświeżeniu strony.
pmir13
Ale jakie jest właściwie pytanie w tym wątku?
Ok, przedstawiłeś jak ten licznik działa, ale w czym konkretnie masz problem?
ciekawskiii
Cytat(pmir13 @ 27.04.2011, 16:56:31 ) *
Ale jakie jest właściwie pytanie w tym wątku?
Ok, przedstawiłeś jak ten licznik działa, ale w czym konkretnie masz problem?

wyglada na to, ze ktos ma zrobic to za niego, zadanie domowe...
prowseed
Mam coś takiego napisane w TurboPascalu. Nie przepiszę Ci tego do php, bo mi się zwyczajnie nie chce. Pomijam już fakt, że zadanie jest banalne i wystarczy chwile pomyslec nad jego rozwiazaniem. Wkleję tylko kod, który jest Ci potrzebny do rozwiązania i go zmodyfikuję już pod Twoje potrzeby.

Kod
  repeat
        sec:=sec+1;
        if sec=60 then
            begin
            sec:=0;
            m:=m+1;
            end;
        if m=60 then
            begin
            m:=0;
            h:=h+1;
            end;
        WriteLn(h,' : ',m,' : ', sec);
        delay(1000);
  until h=20;
end.


Zamiast repeat ... until dajesz do while (oczywiscie z odpowiednio zmienionym warunkiem petli czyli np h<=20).
Jesli chcesz to zrobic poprzez odswiezanie strony, to w ogole zamiast petli daj na koncu po prostu header location ktory od razu komponuje zmienna get z odpowednio h,m,sec + sleep w skrypcie zeby wyswietlic wynik (czyli Twoje A B C D - o, musisz jedno dopisac) i potem na poczatku skrypu zczytuj wartosci poczatkowe. Ewentualnie zamiast header location zrobic jakis uposledzony licznik ktory na koncu skryptu bedzie otwieral plik, czyscil go i dopisywal wartosci ABCD.
Dodajesz tylko D (D++), reszte dodawania robia ify. Na warunek zamiast 20 powinienes chyba dac 21.
Gdzies sobie daj jeszcze warunek, ze jezeli A=B=C=D=20 to wszystko sie zeruje.

Do pracy smile.gif
thek
A ja to w sumie zamiast bawić się z zapamiętywaniem tryliona wartości liczników pamiętałbym tylko wartość D, bez ograniczania do 20 i użyłbym modulo oraz dzielenia. Efekt?
Licznik = 12453
A = floor( ( licznik%194481 ) / 9261 );
B = floor( ( licznik%9261 ) / 441 );
C = floor( ( licznik%441 ) / 21 );
D = floor( licznik%21 );

A = floor( 1,3446712018140589569160997732426 ) = 1
B = floor( 7,2380952380952380952380952380952 ) = 7
C = floor( 5 ) = 5
D = floor( 0 ) = 0

Sprawdzenie?

Leć na odwrót 0*1 + 5*21 + 7 * 441 + 1 * 9261 = 0 + 105 + 3087 + 9261 = .... 12453
Zgadza się.

Ogólny wzór na licznik dla systemu X to:
pozycja = floor (liczba modulo system^pozycja )/system^(pozycja-1)
Niezależnie od przyjętego systemu. Przykład w dziesiętnym by łatwo zauważyć od najmniejszej idąc smile.gif

12345
jednostki = floor(12345%10^1 /10^0) = floor(5/1) = 5
dziesiątki = floor(12345%10^2 / 10^1) = floor(45/10) = 4
setki = floor(12345%10^3 / 10^2) = floor(345/100) = 3
tysiące = floor(12345%10^4 / 10^3) = floor(2345/1000) = 2
d.tysiecy = floor(12345%10^5 / 10^4) = floor(12345/10000) = 1

EDIT: To czysta matematyka, a więc jak widać masz z nią problemy. Ja zastosowałem zaokrąglenia w dół, by pozbyć się ułamków, gdyż domyślnie php zaokrągla używając round() a więc w sposób, który dałby zły wynik.

Aha... Wyjaśnię wzór:
pozycja = floor (liczba modulo system^pozycja )/system^(pozycja-1)
pozycja to konkretny w kolejności licznik a więc Twoje ABCD, lecąc od najmłodszego wzwyż, czyli od D do A
floor - wycięcie ułamka
liczba - Twój licznik główny z pełną liczbą w postaci 12453
modulo - operacja modulo, czyli reszty z dzielenia
system - system liczbowy użyty. Jest o 1 większy niż największa możliwa do uzyskania w nim pojedyncza liczba. U Ciebie największa to 20, więc system to 21
pozycja - liczba określająca pozycję w systemie liczbowym licząc od najmniejszej czyli niejako cyfry "jedności" (1) poprzez cyfrę "dziesiątek" (2), "setek" (3) i tak dalej

Jeśli masz problemy z przeliczaniem wartości między systemami to się weź za matmę porządnie, bo w informatyce przeskakiwanie między systemami binarnym, ósemkowym i heksadecymalnym oraz dziesiętnym jest normą a znając podstawy można operować na dowolnym systemie niedziesiętnym, włącznie z takimi operacjami jak dodawanie, odejmowanie, mnożenie i dzielenie ( to ostatnie sprawia nawet studentom nieraz problemy )
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.