Wczytywanie z klawiatury godziny

0

Witam,

Mam za zadanie obliczyć czas przebytej drogi mając gg/mm/ss startu i "mety". O ile same obliczenia to nie problem, to nie mogę sobie poradzić z kosmetyką mianowicie:

Jak zapisać poszczególne wartości w kodzie, aby godzina 07 00 00 wpisana z klawiatury, była pokazywana 0700, a nie 70. Naprawdę próbowałem wszystkiego.

Dodam, że jestem początkujący i chciałbym jak najprościej to załatwić.

Może dla pełnego obrazu wrzucę kawałek kodu:

program czas;
uses crt;
var
gs,ms,ss:integer;
gz,mz,sz:integer;
begin
clrscr;
writeln('Podaj godzinę rozpoczęcia biegu w formacie gg/mm/ss , oddzielając je spacja');
read(gs);
read(ms);
read(ss);
writeln;
writeln((gs),':',(ms),':',(ss));
writeln;
writeln('Podaj godzinę zakończenia biegu w formacie gg/mm/ss , oddzielając je spacja');
read(gz);
read(mz);
read(sz);
writeln;
writeln((gz),':',(mz),':',(sz));
readkey;
end.

Kombinowałem z (gs)2/(gs)2 itd..
próbowałem nawet uwarunkować wszystko w mniej wiecej taki sposób
if gs=0 then writeln('0',(gz),':',(mz),':',(sz)) else ...
ale za dużo jest zmiennych i to jest nie wykonalne .
próbowałem zmienne oznaczyć jako integer real a nawet word, może jest jakiś typ zmiennej, który powoduje, iż 07 00 00 , będzie pokazywane tak samo jak się wpisało..

Proszę o pomoc, na pewno jest jakiś prosty sposób.

dodanie znacznika <code class="delphi"> - fp

0

jeśli chodzi tylko o wyświetlenie, to można np tak: "0" + godzina + ":" (jeśli jest mniejsza niż 10, jak nie to normalnie) i tak ze wszystkim.

//napisałem 'schematycznie', to nie jest kod programu. Chciałem Cie tylko naprowadzić :)

0

W cudzysłowie? A nie w apostrofie?

0

Przede wszystkim kod sformatuj i wstaw w odpowiednie znaczniki. Ponieważ nawet pomimo iż jest go niewiele, to nie chce się na to patrzeć, bo aż człowieka odrzuca. Zaś do poprzedzenia godziny/minuty/sekundy - możesz oczywiście napisać swoją własną i prostą funkcję. Po prostu sprawdzać czy wartość jest niższa od 10 i dodawać z przodu 0. Oczywiśćie znakiem obejmującym stringi jest w Pascalu '. Odpowiedź poprzednika jest "od czapy". Za pewne nie spojrzał on na tagi wątku. Jeżeli natomiast możesz skorzystać z modułów VCL, to polecam funkcję Format z modułu SysUtils. Są też funkcje operujące na dacie i czasie. Więcej informacji do wygooglowania.

0

a propoS tego '0'+(gs) , to gdy napisze 3 instrukcje warunkowe dla gs ms i ss to pokazują się 3 linijki, a ja chcę to w jednej linijce godzine ... pisałem, że nie czaje jeszcze wszystkiego... :( będę próbował, ale miło by było, gdyby ktoś napisał jak to ująć... proszę...

Póki co mam tak, ale łapie tylko pierwszy warunek, a reszta nie reaguje ...

writeln;
if (gs<10) then writeln('0',+(gs),':',(ms),':',(ss)) else

if (ms<10) then writeln((gs),':','0',+(ms),':',(ss)) else

if (ss<10) then writeln((gs),':',(ms),':','0',+(ss)) else

writeln((gs),':',(ms),':',(ss));

writeln;

2

Strasznie sobie komplikujesz. A w ogóle musisz najpierw poznać podstawy języka, czytając kurs, bo będziesz modził po omacku. Może być kompendium na stronie 4p. Zobacz. Są dwa rozwiązania. Pierwsze z użyciem modułu VCL, drugie bez niego. Kod napisany i skompilowany pod Delphi 7. Ale dla innego IDE, to też nie problem. Dla FPC ewentualnie należy wywalić dyrektywę dla aplikacji konsolowej i dodać inną {$MODE DELPHI}.

program sposobik_1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  Godz, Min, Sek : Byte;
begin
  Write('Podaj godzine: ');
  Readln(Godz);
  Write('Podaj minute: ');
  Readln(Min);
  Write('Podaj sekunde: ');
  Readln(Sek);
  Writeln(Format('Czas to: %0.2d:%0.2d:%0.2d', [Godz, Min, Sek]));
  Readln;
end.
program sposobik_2;

{$APPTYPE CONSOLE}

function IntToStr(I : integer) : string;
var
  S : string[11];
begin
  Str(I, S);
  IntToStr := S;
end;

function AddZeroPrefix(AValue : integer) : string;
begin
  if AValue < 10 then
  begin
    Result := '0' + IntToStr(AValue);
  end
  else
  begin
    Result := IntToStr(AValue);
  end;
end;

var
  Godz, Min, Sek : Byte;
begin
  Write('Podaj godzine ');
  Readln(Godz);
  Write('Podaj minute: ');
  Readln(Min);
  Write('Podaj sekunde: ');
  Readln(Sek);
  Writeln('Czas to: ', AddZeroPrefix(Godz), ':', AddZeroPrefix(Min), ':', AddZeroPrefix(Sek));
  Readln;
end.
0

Dzięki za pomoc, postaram się jakoś zrozumieć ten drugi sposób. U mnie nie mieliśmy jeszcze modułów. Mieliśmy pętle, warunki, arraye, random, także tego nie miałem, a skoro tak, to i na sprawdzianie też nie będę miał, więc nie chce nie potrzebnie inwestować czas w prehistorycznego pascala .. Dam Ci łapkę, Dzięki jeszcze raz :)

tak już zamykając dojszłem do tego sam :) (wiedzą która mnie obowiązuje, byłem pewny, ze można prościej :P) :

writeln;
if (gs<10) then writeln('0',+(gs),':')

if (ms<10) then writeln('0',+(ms),':' 

if (ss<10) then writeln('0',+(ss)) else

writeln((gs),':',(ms),':',(ss));

writeln;
1

I można:

Writeln(Format('Czas to: %.2d:%.2d:%.2d',[gs,ms,ss]));
0

Spoko. To co podałem w pierszym sposobie jest najprościej. Drugi też jest banalny. Oczywiście można w głownym kodzie dawać warunki. Ale jak się już uczyć, to najpoprawniej i optymalniej. Jest zasada DRY. Czyli Don't Repeat YourSelf. Także nie powtarzasz się niepotrzebnie, tylko opakowujesz wykorzystywany więćej niż jeden raz kod - w prostą funkcję. Moduły to też nic szczególnego. Piszesz, że ich nie używacie, a w Twoim kodzie z pierwszego posta widzę crt.

Jasne. Można wszystko pisać samemu. Ale skoro są już gotowe sprawy i zakładamy, że dopiero zaczynasz i nie chcesz wszystkiego rzeźbić na przykład pod WinAPI, to dlaczego by się nie wspomóc VCL'owymi udogodnieniami. A o przestarzałym Turbo Pascalu czy Dev_Pas, najlepiej zapomnij. Masz darwmowe i wygodne FPC. Jeżeli pod nowszymi systemami chcesz mieć go elegancko na pełnym ekranie, to polecam użyć darmowego ConEmu. Sam jestem miło zaskoczony, po sprawdzeniu nowszych jego wersji, że w końcu bez problemów obsługuje i FPC, z czym wcześniej były problemy.

0

@Renewerek - użyj po prostu funkcji FormatDateTime i miej z głowy ręczne sprawdzanie i bawienie się z Write; Wcale nie potrzeba kombinacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1