Имитация работы часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени - 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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы