Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

JamesVoo

[Pascal]Program do liczenia ilości godzin, minut i sekund z podanej liczby sekund

Polecane posty

Mam taki problem z programem podanym w temacie. Otóż napisałem taki oto kod:

program Zegra;
uses crt;
var h,m,s,a:Longint;
begin;
writeln('Witaj w programie ktory liczy ile godzin, minut i sekund miesci sie w podanej liczbie sekund');
writeln('Podaj liczbę sekund');
readln(a);
a:=h div 3600;
m:=h mod 3600;
m:=m div 60;
s:=m div 60;

writeln('Podales' ,h, 'godzin,' ,m, 'minut' ,s, 'sekund');


readkey;
end.

I obojętnie co wpiszę to wyskakuje mi 0 we wszystkich pozycjach, mógłby ktoś pomóc? :)

Link do komentarza
Udostępnij na innych stronach

Tu nie chodzi o to jak używać operacji div i mod, tylko jak używać operacji przypisania. Jeśli masz operacją

zm1:=zm2 div zm3;

To oznacza to, że pod zm1 przypisywana jest część całkowita z dzielenia zm2 przez zm3.

Innymi słowy ten fragment kodu

readln(a);
a:=h div 3600;
m:=h mod 3600;
m:=m div 60;
s:=m div 60;

działa tak

wczytaj a z klawiatury;
pod a przypisz część całkowitą z dzielenia h przez 3600;
pod m przypisz resztę z dzielenie h przez 3600;
pod m przypisz część całkowitą z dzielenia m przez 60;
pod s przypisz część całkowitą z dzielenia m przez 60;

Oczywiście można zmodyfikować zmienną zaraz po wczytaniu, ale ten sposób, w który to zrobiłeś jest bez sensu. Wczytujesz zmienną tylko po to, by zaraz potem ją zastąpić stałą równą 0, bo h w momencie zainicjowania ma taką wartość, a ta zmienna nie była wcześniej w ogóle modyfikowana.

Link do komentarza
Udostępnij na innych stronach

Czyli z tego co napisałeś program powinien wyglądać tak

h:=a div 3600;
m:=h mod 3600;
m:=m div 60;
s:=m mod 60;

Czyli według tego co napisałeś

do h przypisuję dzielenie całkowite przez 3600

do m przypisuję resztę z dzielenia h przez 3600

do m przypisuję dzielenie całkowite przez 60

do s przypisuję resztę z tego dzielenia

czyli teoretycznie powinno działać, ale niestety nie działa, chyba że gdzieś w tej części popełniłem

Link do komentarza
Udostępnij na innych stronach

Nie działa, ponieważ obecnie robi tak:

do h przypisuje całkowity wynik dzielenia a przez 3600 - ok

do m przypisuje resztę z dzielenia a przez 3600 - ok

do m przypisuje całkowitą wartość z dzielenia m przez 60 - ok

do s przypisuje resztę z dzielenia m przez 60 - nie ok, bo on bierze już to m wyżej, podzielone przez 60.

Jest tak:

np. podaje mu się 3680 sekund.

Dzieli przez 3600 - wywala 1 pod h

Pod m wywala 80.

Dzieli m przez 60 - pod m wywala 1

Teraz znowu dzieli m przez 60 i daje resztę, ale on już nie dzieli 80, tylko 1. Potrzebna jest dodatkowa zmienna, która by zachowała to pierwotne m.

Link do komentarza
Udostępnij na innych stronach

Kolejność wykonywania działań jest istotna to raz, a dwa, że jedna rzecz nadal nie ma sensu.

h:=a div 3600;

To jest ok.

m:=h mod 3600;

h nie ma informacji o minutach. Ma ją tylko a, czyli tu powinno być

m:=a mod 3600;

I kolejna rzecz:

m:=m div 60;
s:=m mod 60;

Pierwsza operacja sprawia, że tracisz informację o sekundach, więc drugie dzielenie zwróci coś innego niż powinno (tak naprawdę wyjdzie, że s=m). Powinno więc być:

s:=m mod 60;
m:=m div 60;

[edit]

Tu się odnosiłem do przedostatniego posta. Nie potrzeba żadnych dodatkowych zmiennych, trzeba to tylko zrobić w sposób optymalny jeśli chodzi o kolejność.

[edit2]

W powyższym poście jest też błąd, bo

1. Masz m:=h mod 3600; (patrz wytłumaczenie wyżej).

2. m:=n; n po zainicjowaniu ma wartość 0. Wartości zmiennej n nie zmieniałeś, czyli tak naprawdę pod m podstawiasz tu 0.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...