![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 2 Dołączył: 30.03.2006 Ostrzeżenie: (10%) ![]() ![]() |
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. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
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?
Ten post edytował sadistic_son 27.04.2011, 15:28:09 -------------------- Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami... -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc! -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
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 -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował sadistic_son 27.04.2011, 15:30:16 -------------------- Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami... -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc! -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
No to wszystko co napisałem tylko porównywać do 21, a nie do 20.
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 2 Dołączył: 30.03.2006 Ostrzeżenie: (10%) ![]() ![]() |
Zmiany mają następować po odświeżeniu strony.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 39 Dołączył: 7.11.2010 Skąd: Raz tu, raz tam Ostrzeżenie: (30%) ![]() ![]() |
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... -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 433 Pomógł: 64 Dołączył: 29.01.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
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 ![]() 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 )
Powód edycji: [thek]: Dodałem sprawdzenie dla Twojego systemu i wyjaśnienie
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 21:23 |