Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Emulator minutnika sterowany kodem.

Czebu 07 Gru 2011 18:05 1809 12
  • #1 07 Gru 2011 18:05
    Czebu
    Poziom 19  

    Kompilator Turbo Pascal 7.0, system Windows XP Professional. Język programowania: Pascal.

    Próbuję pisać algorytm(kod) programu. Muszę użyć słowa algorytm, żeby mi się nie mieszało. Program ma działać na takiej zasadzie. Mamy emulator minutnika i to urządzenie jest sterowane kodem. Minutnik odlicza czas do zera. Minutnik osiąga zero i włącza się alarm. To jest oczywiste. Kod jest jak takie hasło. Kod ma być wpisywany otwartym tekstem. Kiedy wpiszę ten kod to minutnik wraca do początkowej wartości. Np. minutnik odlicza czas 59 minut 59 sekund . Jest 30 minut 0 sekund. Wpisuję kod i minutnik wraca do tych 59 minut i 59 sekund.
    Trudno mi jest określić jak miałby wyglądać ten algorytm. Zapewniam Was, że próbowałem już wszystkiego. Powstało może ze trzy takie wersje i za każdym razem było trochę inaczej. Zwykły prosty strukturalny algorytm, próba napisania algorytmu z obiektami, prosty strukturalny algorytm z użyciem asemblera. Nie używałem bibliotek graficznych.

    Wszystko mogę zaprogramować, ale nie mogę zrobić tak, żeby w tym samym czasie minutnik odliczał, a ja będę mógł wpisać w dowolnej chwili ten kod sterujący minutnikiem. Zauważyłem, że cały problem robi funkcja Read. Ona potrafi zablokować mi cały program. Wszystko stoi w miejscu. Próbowałem obejść to przez asembler. Nic z tego. Jest tak samo. Przerwanie programowe blokuje mi cały program.

    Słyszałem od pewnej osoby, że tutaj jest programowanie wielowątkowe. Najlepiej byłoby przetłumaczyć program na język C++. Jak dla mnie to nie wchodzi w grę. Na razie nie ma mowy, żebym tłumaczył program. Próbuję wycisnąć z kompilatora Turbo Pascal 7.0 tyle ile się da.

    Wymyśliłem coś innego. A gdyby dobrać się do bufora klawiatury. Przecież wtedy kiedy naciskam dowolny klawisz. Taki klawisz musi być umieszczony w jakimś buforze. Może jest sposób, aby sprawdzić ten klawisz. Może trzeba stworzyć jakiś dodatkowy sterownik, aby w nietypowy sposób obsłużyć klawiaturę.
    Co o tym myślicie?

    0 12
  • #2 15 Gru 2011 15:42
    lukvia
    Poziom 8  

    Kod: pascal
    Zaloguj się, aby zobaczyć kod


    Tutaj jest kod licznika napisany przezemnie jakiś czas temu :)

    0
  • #3 15 Gru 2011 16:15
    Xitami
    Poziom 29  

    czas:=sysutils.time() + ((sekundy/60+minuty)/60+godziny)/24;
    ...

    if sysutils.time()> czas then .....

    0
  • #4 15 Gru 2011 18:59
    lukvia
    Poziom 8  

    Xitami napisał:
    czas:=sysutils.time() + ((sekundy/60+minuty)/60+godziny)/24;
    ...

    if sysutils.time()> czas then .....




    Oooo tego to ja nie znałem (mam programowanie dopiero jeden semestr) :)
    To rozwiązanie będzie zapewne prostsze

    0
  • #6 16 Gru 2011 13:14
    arnoldziq
    Moderator Programowanie

    Mnie tam sysutils.time() bardziej przypomina Delphi niż TP, ale nie chcę się kłócić :P
    Wiele lat temu, w TP7.0 robiło się takie rzeczy w taki sposób :

    Kod: pascal
    Zaloguj się, aby zobaczyć kod


    Przyjemnej zabawy.

    0
  • #7 21 Gru 2011 10:13
    Czebu
    Poziom 19  

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    arnoldziq. Domyślam się, że wykorzystałeś sekundy z zegara. Ale nadal nie wiele z tego rozumiem. Możesz dopisać komentarze do tego algorytmu, który zacytowałem wyżej? Chociaż najlepiej byłoby, gdybyś dopisał je w tej całości, którą napisałeś.
    Nie myślcie sobie, że ja nic nie robię. Cały czas próbuję ten program zbudować. Chciałbym też zastosować Wasze pomysły. Bardzo mi zależy, aby ten program był napisany jak najprościej. Na pewno napiszę jak sobie z tym poradziłem. Temat jest cały czas otwarty. Ostatnie słowo. Chyba nie do końca się zrozumieliśmy. Emulator minutnika sterowany kodem. To znaczy, że ten minutnik jest sterowany takim jakby hasłem. Ten kod to jest to hasło. Nie chodzi o kod źródłowy.

    0
  • #8 21 Gru 2011 10:52
    arnoldziq
    Moderator Programowanie

    Dodałem komentarze do kodu.
    Algorytm, jak to nazwałeś, to zwykłe odejmowanie.
    Niestety, w TP, typ TDateTime, to typ rekordowy:

    Kod: pascal
    Zaloguj się, aby zobaczyć kod
    Odejmowanie od siebie lat, dni, godzin itd., jest trochę uciążliwe. Aby tego uniknąć stosuje się procedurę PackTime, która zamienia ten rekord, na 4-ro bajtową wartość Long Integer. Następnie odejmujesz od siebie dwie takie 'spakowane' daty, 'rozpakowujesz' wynik do trzeciej i w ten sposób otrzymujesz dokładną różnicę, pomiędzy badanymi datami/czasami, wyrażoną w typie rekordowym.
    Gotową do wyświetlenia.
    Dobra. To by było na tyle, jeżeli chodzi o operacje na czasie.
    Ale ja dalej nie rozumiem, w jaki sposób chcesz sterować minutnikiem, za pomocą hasła.
    Ba... ja nawet nie wiem, co ty masz na myśli. Może opisz dokładnie, co chcesz uzyskać. Bo na razie, to wszystko jest bardzo tajemnicze i niezrozumiałe.

    0
  • #9 21 Gru 2011 11:40
    Czebu
    Poziom 19  

    arnoldziq. Ten minutnik ma liczyć minuty i sekundy. Alarm nie może włączać się na określoną godzinę. Minutnik mogę ustawić i cofnąć kodem. To jeszcze nie wszystko. Tam jeszcze trzeba dołożyć kilka rzeczy. Ale to na później. Wszystko musi działać jako tekst. Ten minutnik jest wyświetlany tekstem oraz ten kod sterujący. Czyli prościej tłumacząc, można to rozpisać na takie punkty:
    1. Na środku ekranu włącza się minutnik w postaci tekstowej. Odlicza on minuty i sekundy do zera.
    2. Gdzieś na górze ekranu umieszczony jest napis, żeby wprowadzić kod sterujący. I w tym miejscu ma pojawić się wpisywany przeze mnie kod. Otwarty tekst.
    3. Aby minutnik powrócił do konkretnego ustawienia muszę wpisać kod. Jeżeli minutnik osiąga zero, to wtedy muszę koniecznie wpisać ten kod. Minutnik sam siebie nie cofnie.

    Minutnik musi:
    1. Liczyć minuty i sekundy do zera.
    2. Zaczynać od konkretnej wartości. Stała wartość. Stałe ustawienie.
    2. Być w postaci tekstowej.

    Kod musi:
    1. W każdej chwili ustawić minutnik do początkowej wartości.
    2. Być w postaci tekstowej.
    Też nie chcę się sprzeczać, ale ja nie wiem jak to nazywać. Słyszałem, że powinno się mówić algorytm. Właściwie w kompilatorach, ten "kod źródłowy" to jest prawidłowo plik źródłowy, bo tam jest napisane source file. Uważam, że algorytmy to nie tylko sortowanie bąbelkowe itp. Systemy operacyjne też są zbudowane z bardziej rozbudowanych algorytmów. Tak myślę. Poza tym określenie algorytm nie miesza mi się z tym kodem sterującym.

    0
  • Pomocny post
    #10 21 Gru 2011 12:51
    arnoldziq
    Moderator Programowanie

    Może nie jest to idealne rozwiązanie, ale spełnia postawione przez ciebie warunki.

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    0
  • #11 23 Gru 2011 17:59
    Czebu
    Poziom 19  

    arnoldziq. Proszę Cię o dodanie komentarzy. Proszę Cię, sprawdź jeszcze raz, czy dobrze mi wszystko napisałeś. Mam wrażenie, że coś mi się nie zgadza w tym algorytmie-kodzie źródłowym. Wiesz, chyba zaczyna mi się wszystko powoli wyjaśniać.

    0
  • #12 23 Gru 2011 21:03
    ksitami
    Poziom 1  

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    0
  • #13 19 Kwi 2012 02:46
    Czebu
    Poziom 19  

    arnoldziq. Dostałeś pomógł, bo na prawdę mi pomogłeś. Chodzi o funkcję ReadKey oraz KeyPressed. To eliminuje użycie asemblera do odczytu znaków z klawiatury.
    Reszcie dziękuję za spopularyzowanie tego tematu.

    Ogólnie to program chodzi paskudnie. Działa bardzo powoli. Spodziewałem się tego. Ale na początek nauki programowania wystarczy. Na razie nie chcę umieszczać kodu źródłowego tego programu. Nie chcę wszystkiego zdradzać. Niech nabierze mocy urzędowej. :-) Może kiedyś go pokażę. W tym temacie, a może w innym miejscu. Może na stronach poświęconych programowaniu w Pascalu. Podam link.
    Postaram się mniej więcej opisać ten program. Na początek ogólnie.
    W funkcji głównej umieściłem kolejno:
    czyszczenie ekranu (ClrScr), procedurę Tytul(tytuł mojego programu), ClrScr, wyzerowaną zmienną licz(do tablicy i do wyświetlenia), pętla For przypisująca do tablicy jednowymiarowej(W[i]) odpowiednie znaki, słowo 'exit' (Chr()), pętla For przypisująca do tablicy jednowymiarowej (K[i]) ten supertajny kod :-), TextColor(), GoToXY, Write(), zmienną przestaw_minutnik typu boolean , zmienną wyjscie typu boolean, nieskończona pętla Repeat ... Until, w pętli Repeat Until jest umieszczona funkcja Wlacz (minutnik) oraz jest umieszczony warunek decydujący o wyjściu z programu (Exit)

    Funkcja Wlacz jest trochę rozbudowana. Użyłem pętli Repeat Until. Ta pętla wykonuje się aż do zera. W pętli Repeat umieściłem pętlę For. Może źle myślę. Wydaje mi się, że stosowanie pętli For w pętli For doprowadza do nieprawidłowego działania programów. To jeszcze nie koniec. W pętli For, jest kilka instrukcji If then else. W dwóch instrukcjach If są dwie instrukcje case. W instrukcjach case są efekty dźwiękowe (Sound()). Tutaj istotna rzecz. Nie potrafiłem tego inaczej zrobić. W odpowiednich miejscach umieściłem procedurę Odczytaj (odczyt znaków z klawiatury). Jeszcze są trzy instrukcje If then else do sterowania minutnikiem. Za pętlą Repeat jest umieszczony rozbudowany alarm. Cały minutnik nie jest sterowany przez spakowany czas. To sterowanie zrobiłem trochę inaczej. Przez opóźnienie Delay().

    Procedura Odczytaj(). Kolejne elementy. Dodatkowa instrukcja warunkowa(If), której funkcji na razie nie ujawnię. Instrukcja warunkowa(If) do sterowania pozycją kursora(GoToXY()). Instrukcja warunkowa, która sprawdza czy naciśnięto klawisz (KeyPressed). Przyjmujemy, że naciśnięto klawisz. Następuje przypisanie tego klawisza(ReadKey(),Ord()). Teraz następuje przejście do procedury WprowadzIWypisz.

    Procedura WprowadzIWypisz. Instrukcja warunkowa (If). Warunek jest taki aby klawisz był z przedziału od 13 do 127 (ASCII). Wewnątrz tej instrukcji jest licznik (licz), który oblicza ile znaków wprowadzono. Kolejny warunek, który sprawdza czy naciśnięto klawisz Enter (13 w ASCII). Jeżeli naciśnięto, to sprawdza kod (SprawdzKod). Jeżeli nie to idziemy dalej. Każdy znak z klawisza jest wprowadzony do tablicy znaków (string). TextColor(), GoToXY(), instrukcja If (wyświetlanie wszystkich znaków oprócz Enter, Write()).

    SprawdzKod. Zastosowałem zmienną, która może być wykorzystana do dynamicznego sprawdzania kodu. Zależy ona od wartości naszego licznika sprawdzającego kod. Pętla For. W pętli For trzy zmienne odczytują kolejne znaki z tablic T[], K[] oraz W[]. Potem liczona jest różnica. Warunek: jeżeli roznica_W = 0 (wyłączanie programu) lub roznica_K =0 (kod sterujący minutnikiem), to idź dalej. W przeciwnym wypadku wyświetl tekst Nieznana komenda. Idziemy dalej. Do wspomnianych wcześniej tablic wprowadzone są nawet spacje. Kolejne dwa warunki. Jeżeli inicjalizator i = 5 oraz roznica_W =0, to licz = 0, to wyjdź. Jeżeli i = 16 oraz roznica_K = 0, to licz = 0 i procedura Ustaw. Tutaj jest bardziej złożone ustawianie minutnika. Efekty dźwiękowe (Sound()) i inne.
    Procedura sprawdzająca kod nie wygląda tak jakbyście chcieli. To co mi podaliście, to jest typowo szkolny algorytm hasłowy. Przekonałem się, że szkolne algorytmy hasłowe, nie mają nic wspólnego z rzeczywistością. Rzeczywistość jest bardziej skomplikowana. Takie jest moje zdanie. Chociaż może i jest pewne minimalne podobieństwo. Tutaj musiałem użyć dodatkowej pustej tablicy T[i]. Dzięki temu można w przyszłości ten kod sterujący minutnikiem nawet zaszyfrować prostym szyfrem.
    Cały kod źródłowy ma 412 linii. Pisałem jego w okresie: styczeń 2008 - 31.03.2012.
    Bardzo brakuje mi czasopism o programowaniu.

    0