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