Имитация работы часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени - Turbo Pascal
Формулировка задачи:
Здравствуйте. У меня имеется вот такое задание:
Составить программу, имитирующую работу часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени. Пользователь может с помощью стрелок управления курсором замедлять или ускорять ход виртуального времени.
Технические требования: Диаметр циферблата часов, начальное время и длительность секунды виртуального времени задается в файле Input.txt. Часы рисуются по центру экрана. Регулировка времени осуществляется с помощью клавиатуры. Предусмотреть возможность остановки часов и записи текущего времени в файл Output.txt.
У меня есть текст программы где созданы часы но они работают в реальном режиме времени.
Друзья, прошу помощи у вас как более опытных. Буду очень благодарен за помощь.
Решение задачи: «Имитация работы часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени»
textual
Листинг программы
uses graph, crt;
var f:text;
gd,gm,d,z,x,y,x1,y1,x2,y2,x3,y3,r1,r2,r3,k,rs,rm,rh:integer;
v1,v2:longint;
c:char;
i:byte;
h,m,s,u,ah,am,as:real;
st:string;
begin
{читаем из файла диаметр, часы, минуты, секунды, продолжительность секунды в млс}
assign(f,'input.txt');{файл в папке с программой}
reset(f);
readln(f,d,h,m,s,z);
close(f);
gd:=detect;
initgraph(gd,gm,'');
v1:=trunc(s+60*m+3600*h);{всего секунд от 0 часов}
v2:=v1;{запомним}
d:=d div 2;{радиус циферблата}
rs:=d-20;{длина секундной стрелки}
rm:=d-40;{длина минутной стрелки}
rh:=d-60;{длина часовой стрелки}
r1:=d-2;{вспомогательные радиусы для разметки циферблата}
r2:=r1-5;
r3:=r2-5;
x:=getmaxX div 2;{центр}
y:=getmaxY div 2;
{рисуем циферблат}
setcolor(14);
line(x-30,15,x-15,15);
line(x-30,15,x-25,12);
line(x-30,15,x-25,18);
outtextXY(x-10,10,'slowly');
line(x-30,35,x-15,35);
line(x-15,35,x-20,32);
line(x-15,35,x-20,38);
outtextXY(x-10,30,'quickly');
outtextXY(x-30,50,'Esc - exit');
setlinestyle(0,0,3);
circle(x,y,d);
u:=pi/2-pi/6;
setlinestyle(0,0,1);
k:=1;
for i:=0 to 59 do
begin
x1:=x+round(r1*cos(u));
y1:=y-round(r1*sin(u));
x2:=x+round(r2*cos(u));
y2:=y-round(r2*sin(u));
x3:=x+round(r3*cos(u));
y3:=y-round(r3*sin(u));
if i mod 5=0 then
begin
setfillstyle(1,14);
fillellipse(x1,y1,2,2);
str(k,st);
outtextXY(x3-3,y3-5,st);
inc(k);
end
else line(x1,y1,x2,y2);
u:=u-pi/30;
end;
{вычислим начальные углы стрелок от 0 часов}
m:=m+s/60;
h:=h+m/60;
ah:=pi/2-30*h*pi/180;
am:=pi/2-6*m*pi/180;
as:=pi/2-6*s*pi/180;
{нарисуем начало}
setcolor(10);
line(x,y,x+round(rh*cos(ah)),y-round(rh*sin(ah)));
line(x,y,x+round(rm*cos(am)),y-round(rm*sin(am)));
setcolor(12);
line(x,y,x+round(rs*cos(as)),y-round(rs*sin(as)));
repeat {в цикле крутим стрелки}
delay(z);
inc(v2);{+1 секунда}
if v2=12*3600 then v2:=v1;{полный оборот часовой стрелки}
setcolor(0);{стираем стрелки}
line(x,y,x+round(rh*cos(ah)),y-round(rh*sin(ah)));
line(x,y,x+round(rm*cos(am)),y-round(rm*sin(am)));
line(x,y,x+round(rs*cos(as)),y-round(rs*sin(as)));
if keypressed then{если нажата клавиша}
begin
c:=readkey;
if c=#0 then c:=readkey;{если служебная}
case c of
#75:if z<=2000 then z:=z+50;{стрелка влево, увеличим длину секунды}
#77:if z>=100 then z:=z-50;{вправо уменьшим (быстрее)}
#27:begin{если Escape}
assign(f,'output.txt');{создадим выходной файл}
rewrite(f);
h:=v2 div 3600;{вычислим время на часах}
m:=v2 mod 3600 div 60;
s:=v2 mod 60;
writeln(f,h:0:0,':',m:0:0,':',s:0:0);{запишем в файл}
close(f);{закроем его}
exit;{выйдем из программы}
end;
end;
end;
ah:=ah-pi/21600; {вычислим новые углы стрелок}
am:=am-pi/1800;
as:=as-pi/30;
setcolor(10);{нарисуем их}
line(x,y,x+round(rh*cos(ah)),y-round(rh*sin(ah)));
setcolor(10);
line(x,y,x+round(rm*cos(am)),y-round(rm*sin(am)));
setcolor(12);
line(x,y,x+round(rs*cos(as)),y-round(rs*sin(as)));
until c=#27;
end.
Объяснение кода листинга программы
Этот код имитирует работу часов с помощью графического интерфейса. Он использует библиотеку graph для отображения циферблата и стрелок. Переменные и их значения:
- f: текстовая переменная, используется для чтения из файла и записи в файл.
- gd, gm, d, z, x, y, x1, y1, x2, y2, x3, y3, r1, r2, r3, k, rs, rm, rh: integer, используются для определения размеров и положения циферблата и стрелок.
- v1, v2: longint, используются для хранения текущего времени.
- c: char, используется для чтения нажатой клавиши.
- i: byte, используется для определения текущего состояния программы.
- h, m, s, u, ah, am, as: real, используются для хранения текущего времени в часах, минутах, секундах, а также для вычисления новых значений при повороте стрелок.
- st: string, используется для хранения времени в строковом формате. В начале кода происходит чтение из файла 'input.txt', который содержит диаметр циферблата, часы, минуты и секунды. Затем эти значения используются для определения размеров и положения циферблата и стрелок. Далее следует цикл, который обновляет положение стрелок на циферблате. В этом цикле используется функция delay для задержки выполнения программы, чтобы создать эффект движения стрелок. Значение z используется для определения скорости движения стрелок. Если нажата клавиша Escape, то программа создает новый файл 'output.txt' и записывает в него текущее время. После этого программа закрывается. В конце кода происходит вычисление новых значений для стрелок, и цикл повторяется до тех пор, пока не будет нажата клавиша Escape.