[Pascal] Zegarek cyfrowy, problem ze zmianą wartości


(Danielek566) #1

Witam, na początek wrzucę ss z moich dokonań:

scaled.php?server=31&filename=pascalk.jpg&res=landing

troche ucięlem var i end, ale to nie istotne

chcę, żeby to działało tak, ze np mamy teraz godzine 7.00 to zeby ta moja siódemka utworzona z @@@ znalazła się w tym writeln('Jest godzina ',h);...

do tej pory to jest tak, że wpisuje mi się ona luźno przez wyświetleniem godziny a moje "h" dalej normalnie pobierane jest z komputera.

Proszę o pomoc


(system) #2

Lepszym rozwiązaniem jest napisanie procedury, która pobiera h i odpowiednio wyświetla daną godzinę, będzie to trochę pracochłonne. instrukcja warunkowa powinna wyglądać tak :

if h = 7 then 

   begin

     ->wcięcie ....................

   end;

([alex]) #3

O to ci chodzi?

if h=7 then

begin

   WriteLn(' @@@');

   WriteLn(' @');

   WriteLn('jest godzina: @ ');

   WriteLn(' @ ');

   WriteLn(' @ ');

end;

(Danielek566) #4

@alex, chcialbym miec taki "wynik", ale do tego dochodzą jeszcze minuty, sekundy, a dla każdego mozliwego przypadku nie będę robił nowego "writeln", więc chciałbym to możliwie ukrócić.

-- Dodane 01.05.2012 (Wt) 10:06 --

a mógłbyś powiedzieć coś więcej, bo niezbyt kumam


([alex]) #5

Coś w tym stylu?

uses crt,sysutils;


const Tb:array[0..10,0..4]of String=

(

   (

      ' @@ ',

      '@ @',

      '@ @',

      '@ @',

      ' @@ '

   ),

   (

      ' ',

      ' ',

      ' 1 ',

      ' ',

      ' '

   ),

   (

      ' ',

      ' ',

      ' 2 ',

      ' ',

      ' '

   ),

   (

      ' ',

      ' ',

      ' 3 ',

      ' ',

      ' '

   ),

   (

      ' ',

      ' ',

      ' 4 ',

      ' ',

      ' '

   ),

   (

      ' ',

      ' ',

      ' 5 ',

      ' ',

      ' '

   ),

   (

      ' ',

      ' ',

      ' 6 ',

      ' ',

      ' '

   ),

   (

      '@@@',

      ' @',

      ' @ ',

      '@ ',

      '@ '

   ),

   (

      ' ',

      ' ',

      ' 8 ',

      ' ',

      ' '

   ),

   (

      ' ',

      ' ',

      ' 9 ',

      ' ',

      ' '

   ),

   (

      ' ',

      ' @ ',

      ' ',

      ' @ ',

      ' '

   )

);


procedure WriteBig(const str:String);

var px,py,p,i,y,m,ym:Integer;

begin

  px:=WhereX;

  py:=WhereY;

  for i:=1 to Length(str) do

  begin

    if str[i]=':' then p:=10

    else p:=Ord(str[i])-Ord('0');

    if (0<=p)and(p<=10) then

    begin

      m:=0;

      for y:=0 to 4 do

      begin

        GotoXY(px,py+y-2);

        Write(Tb[p,y]);

        ym:=Length(Tb[p,y]);

        if m
      end;

      Inc(px,m+1);

    end;

  end;

end;


begin

  WriteLn;

  WriteLn;

  Write('jest godzina: ');

  WriteBig(FormatDateTime('hh:nn:ss',Now));

  ReadLn;

end.

(Danielek566) #6

to juz jest jakies zaawansowane programowanie, a ja dopiero jestem w I LO i dostalem takie zadanie na zaliczenie. da sie to zrobic jakos bez poszerzania zakresu wiadomosci dot. pascala? tzw metodą budowy cepa


(system) #7

Możesz zrobić pętlę. Która z opóźnieniem będzie aktualizowała godzinę, pozostaje również tryb graficzny.


([alex]) #8

Tu niema nic a nic zaawansowanego, ale możesz sobie skomplikować do swojego poziomu ignorancji. Jak coś nie jasne - pytaj.


(Danielek566) #9

Chodzi mi o to, że chcę to zrobić na tym co już umiem, a nie wykraczać poza program uzywając np czegos takiego jak Inc(px,m+1), sysutils itp. bo po pierwsze sam nie wiem o co tam biega a po drugie nauczycielowi od informatyki też tego wytlumaczę. Czy po prostu nie da się zrobić tak, żeby dla tego mojego h,m,s przypisać cyfrowe znaki? Potem sobie je odpowiednio ustawię za pomocą gotoxy.

-- Dodane 01.05.2012 (Wt) 17:01 --

pętla to nie problem, ale sęk w tej zamianie liczby na znak graficzny


(system) #10

Moduł crt, ma swego rodzaju ograniczoną możliwość formatowania "wyjścia". Moim zdaniem to, jak chcesz to zrobić mija się z celem, chyba że masz zamiar napisać dodatkowo 36 procedur lub bardzo dużą tablicę zawierającą wszystkie liczby, ale to lekko wydaje się bezsensowne. Dlaczego uparłem się na tryb graficzny, a dlatego że w tym trybie są dostępne kroje pisma o podanych rozmiarach. Jeżeli uprzeć się na Twoją wersje to zakładając, że wyrysowałbyś to w tablicy należałoby użyć pętli for(lub inna), która wypisałaby podany indeks tablicy(zakładając, że liczby są wpisane w odpowiedniej kolejności od najmniejszej do największej)


([alex]) #11

Inc(px,m+1);

można zamienić na:

px:=px+m+1;


(Danielek566) #12

No dobra, ale mimo to dla mnie są to nieco dziwne, zupełnie nierozumiane metody. Nauczyciel od informatyki twierdził, że da sie to zrobić (na moim poziomie znajomosci pascala), a więc bez wykroczeń poza uses crt, dos. powiedział, że jest to trochę żmudne, ale da radę to zrobić, dlatego chciałbym to zrobić tak, że pisania może być dużo, ale żeby to było w miarę logiczne dla mnie, a nie wprowadzanie jakies nowe wartosci, zmienne, o których nie mam zielonego pojęcia. Chyba że, powiedziecie mi, że to syzyfowa praca, więc wtedy temat do zamknięcia.


([alex]) #13

Da się to zrobić na wiele różnych sposobów bardziej lub mniej sensownych. Z tym że jeżeli nauczyciel twierdzi że "da sie to zrobić na moim poziomie znajomosci pascala" to nie wie o czym gada, ponieważ nie zna tego twego poziomu paskala.

sysutils użyty aby mieć dostęp do funkcji: FormatDateTime oraz Now

aczkolwiek możesz to zastąpić na gettime a po tym wpisać to do stringu w formacie np: hh:mm:ss

gettime(h,m,s,ss);

str:='##:##:##';

str[1]:=Chr(Ord('0')+(h div 10));

str[2]:=Chr(Ord('0')+(h mod 10));

str[4]:=Chr(Ord('0')+(m div 10));

str[5]:=Chr(Ord('0')+(m mod 10));

str[7]:=Chr(Ord('0')+(s div 10));

str[8]:=Chr(Ord('0')+(s mod 10));

Właściwie nikt nie da rady ci pomóc dopóki nie zdefiniujesz czym jest "twój poziom znajomosci pascala".


(Danielek566) #14

mysle ze nauczyciel wie o czym mowi, bo wie czego juz nas nauczył i że tą naszą już zdobytą wiedzą nt. pascala napiszemy taki program. to co tutaj piszesz z pewnością jest bardzo pomocne, ale na nic mi zrobic program i nie rozumiec dlaczego tak jest a nie inaczej. wolałbym dojść do tego na logikę, a nie jakimis obcymi mi tekstami (które piszesz). tylko wlasnie problem w tym zeby cyfry zastąpić znakami. chcialbym na ten problem dostać jakieś sprawne, szybkie rozwiązanie, a nie jakies tabele, tryby graficzne itd.. jestes w stanie mi tak pomóc?

p.s. gettime lepiej jest mi znane niz formatdatetime


([alex]) #15

No to kod który ci podałem w poprzednim poście pozwala na zapisanie godziny w postaci stringu w formacie

hh:mm:ss

8 wierszy zamiast:

str:=FormatDateTime('hh:nn:ss',Now);

Jak ci to bardziej odpowiada to ok.

Tylko tak się zastanawiam czy wasz nauczyciel naprawdę uważa że da rady nauczyć was wszystkiego co jest w paskalu, czy to tylko ty boisz się użyć czegokolwiek poza tym o czym wspomniał nauczyciel?


(Danielek566) #16

Generalnie chodzi o to, że inne rzeczy poza zrealizowanym już programem nauczania są dla mnie nieco niezrozumiałe, i wolałbym dojść do nich w swoim czasie, a na razie pracować na tym co umiem i ROZUMIEM! nawet tak patrząc na tą propozycję z gettime, to nie obczajam tych "Chr(Ord('0')+(h div 10));" więc chyba odpuszczę sobie ten program i go przemilczę, bo czuję, że to takie zabieranie się z motyką na słońce.


([alex]) #17

Chr() - funkcja "tworząca" znak z numeru ASCII

Ord() - funkcja "tworząca" numer ASCII ze znaku (owszem nie tylko ale ci narazie tego wystarczy).


(Danielek566) #18

Napiszesz mi jedną definicję to w niej nie rozumiem kolejnych znaczeń i powstaje takie błędne koło... Szkoda nerwów i czasu. Dzięki za pomoc.


(system) #19

Nie jest to błędne koło. Kolega alex bardzo lubi komplikować sprawę. Wystarczy użyć

uses crt,graph;

Pobrać godzinę oraz wyrysować w trybie graficznym zegar za pomocą procedur graficznych chociażby, jak przykładowo

Ellipse(x,y,alfa,beta,r) - rysuje łuk elipsy.

I po prostu pobierać godzinę z gettime oraz wypisać procedurą OutTextXy pobraną godzinę.


([alex]) #20

Protected_48 , znowu masz problem ze zrozumieniem tekstu pisanego.

W zadaniu napisano że ma być tryb tekstowy, wiec tryb graficzny - odpada.

Problem RHCP_R10 polega na tym że nie potrafi przekształcić aktualnego czasu na format tekstowy hh:mm:ss, bo dalej to pestka.

FormatDateTime - to trza dołączyć sysutils a jemu na zajęciach o czymś takim nie mówiono, więc nie wolno.

Zupełnie "ręcznie" to też nie da się bo trza użyć takich cudów jak Ord, Chr, mod, div a otakich cudach on też na zajęciach nie słyszał.

Owszem jest jeszcze kilka metod na to zaś trzeba kombinować i kombinować tym bardziej że RHCP_R10 nie podaje definicji "swojego poziomu".

Może coś na kształt:

function czas:String;

var t:string;

var h,m,s,x:Word;

begin

  gettime(h,m,s,x);

  str(s,t);

  if s<10 then t:='0'+t;

  czas:=':'+t;

  str(m,t);

  if m<10 then t:='0'+t;

  czas:=':'+t+czas;

  str(h,t);

  if h<10 then t:='0'+t;

  czas:=t+czas;

end;