Имитация работы часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени - Turbo Pascal
Формулировка задачи:
Здравствуйте. У меня имеется вот такое задание:
Составить программу, имитирующую работу часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени. Пользователь может с помощью стрелок управления курсором замедлять или ускорять ход виртуального времени.
Технические требования: Диаметр циферблата часов, начальное время и длительность секунды виртуального времени задается в файле Input.txt. Часы рисуются по центру экрана. Регулировка времени осуществляется с помощью клавиатуры. Предусмотреть возможность остановки часов и записи текущего времени в файл Output.txt.
У меня есть текст программы где созданы часы но они работают в реальном режиме времени.
Друзья, прошу помощи у вас как более опытных. Буду очень благодарен за помощь.
Листинг программы
- uses graph, wincrt,dos;
- var gd,gm,x,y,r:integer;
- k:char;
- h,m,s,hund:word;
- i:byte;
- a:real;
- stro:string;
- procedure secunda(secu:word);
- var x1,y1:integer;
- const rs=180;
- begin
- setcolor(20);
- moveto(x,y);
- x1:=x+round(rs*cos(pi*secu/30-pi/2));
- y1:=y+round(rs*sin(pi*secu/30-pi/2));
- lineto(x1,y1);
- moveto(x,y);
- setcolor(0);
- x1:=x+round(rs*cos(pi*(secu-1)/30-pi/2));
- y1:=y+round(rs*sin(pi*(secu-1)/30-pi/2));
- lineto(x1,y1);
- end;
- procedure minuta(secu:word);
- var x1,y1:integer;
- const rs=150;
- begin
- setcolor(4);
- moveto(x,y);
- x1:=x+round(rs*cos(pi*secu/30-pi/2));
- y1:=y+round(rs*sin(pi*secu/30-pi/2));
- lineto(x1,y1);
- moveto(x,y);
- setcolor(0);
- x1:=x+round(rs*cos(pi*(secu-1)/30-pi/2));
- y1:=y+round(rs*sin(pi*(secu-1)/30-pi/2));
- lineto(x1,y1);
- end;
- procedure chas(secu,g:word);
- var x1,y1:integer;
- const rs=130;
- begin
- setcolor(5);
- moveto(x,y);
- x1:=x+round(rs*cos(pi*secu/6-pi/2+pi*g/360));
- y1:=y+round(rs*sin(pi*secu/6-pi/2+pi*g/360));
- lineto(x1,y1);
- moveto(x,y);
- setcolor(0);
- x1:=x+round(rs*cos(pi*(secu-1)/6-pi/2+pi*g/360));
- y1:=y+round(rs*sin(pi*(secu-1)/6-pi/2+pi*g/360));
- lineto(x1,y1);
- end;
- begin
- gd:=detect;
- initgraph(gd,gm,'');
- setcolor(8);
- settextstyle(1,2,2);
- x:=getmaxx div 2;
- y:=getmaxy div 2;
- circle(x,y,250);
- circle(x,y,255);
- r:=210;
- a:=-pi/3;
- for i:=1 to 12 do
- begin
- str(i,stro);
- outtextxy(x+round(r*cos(a)),y+round(r*sin(a)),stro);
- a+=pi/6;
- end;
- repeat
- moveto(x,y);
- gettime(h,m,s,hund);
- secunda(s);
- minuta(m);
- chas(h,m);
- if keypressed then
- k:=readkey;
- until k=#27;
- closegraph;
- end.
Решение задачи: «Имитация работы часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени»
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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д