1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Есть секундомер Но что-то он сильно быстро бегает. В чём может быть проблема?
Код
uses crt;
function Zero (i: integer): string; var s: string[2]; begin str (i, s); if i < 10 then s := '0' + s; Zero := s; end;
procedure ShowTime (t: word); var mm, ss: word; begin mm := t div 60; { целое кол-во при делении на 60 секунд } ss := t mod 60; {остаток от деления на 60 секунд }
write (mm:2, ':', Zero(ss): 2); end;
var elapsed: word; {истёкшее время}
begin elapsed := 0; while Not Keypressed do begin inc (elapsed); delay (1000); {1 sec = 1000 msec} clrscr; ShowTime (elapsed); end; end.
что-то он сильно быстро бегает. В чём может быть проблема?
Проблема в том, что delay из TP/BP работает некорректно. Обсуждение этого давно перестало быть актуальным (поищи в FAQе).
Для подобных целей рекомендую использовать GetTime/GetDate. Реализуй свою функцию наподобие такой (раскопал специально для тебя из старых запасов)):
function Timer:LongInt; {время в сотых долях секунды} var m,d,h,mi,s,s1:word; l:LongInt; begin GetDate(h,m,d,mi);GetTime(h,mi,s,s1);l:=d; Timer:=(((l*24+h)*60+mi)*60+s)*100+s1 end;
И тогда вместо Delay(1000) ставь, например, цикл:
t0:=Timer; while Timer-t0<100 do;
Хотя, конечно, такой стиль работы - непростительная трата ресурсов..
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Function Beauty(n: Word): String; var s: string; begin str(n, s); while length(s) < 2 do s := '0' + s; Beauty := s; end; Procedure PrintTime; begin clreol; write(#13,Beauty(hr),':',Beauty(min),':',Beauty(sec)); End; {$F+} Procedure MyTimer; interrupt; begin if second_call then begin inc(hund, 11); if hund >= 100 then begin dec(hund, 100); inc(sec); if sec >= 60 then begin dec(sec, 60); inc(min); if min >= 60 then begin dec(min, 60); inc(hr); if hr >= 24 then dec(hr, 24); end; end; printtime; end; end; Inline ($9C); TimerVect; second_call := not second_call; end; {$F-} begin { GetTime(hr, min, sec, hund); } hr := 0; min := 0; sec := 0; hund := 0; second_call := false; GetIntVec ($8, @TimerVect); GetIntVec ($8, OldVect); SetIntVec ($8, Addr (myTimer));
repeat delay(10); until keypressed; while keypressed do readkey;
SetIntVec ($8, OldVect); end.
(вкратце - пишешь свой обработчик прерывания таймера, который вызывается раз в 55 миллисекунд, поэтому если обрабатывать каждый второй тик, то время увеличивается на 11 сотых секунды, а потом уже проверяешь, если больше 100 сотых, то увеличиваешь секунды, потом - минуты, потом - часы)