Имитация работы часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. У меня имеется вот такое задание: Составить программу, имитирующую работу часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени. Пользователь может с помощью стрелок управления курсором замедлять или ускорять ход виртуального времени. Технические требования: Диаметр циферблата часов, начальное время и длительность секунды виртуального времени задается в файле Input.txt. Часы рисуются по центру экрана. Регулировка времени осуществляется с помощью клавиатуры. Предусмотреть возможность остановки часов и записи текущего времени в файл Output.txt. У меня есть текст программы где созданы часы но они работают в реальном режиме времени. Друзья, прошу помощи у вас как более опытных. Буду очень благодарен за помощь.
Листинг программы
  1. uses graph, wincrt,dos;
  2. var gd,gm,x,y,r:integer;
  3. k:char;
  4. h,m,s,hund:word;
  5. i:byte;
  6. a:real;
  7. stro:string;
  8. procedure secunda(secu:word);
  9. var x1,y1:integer;
  10. const rs=180;
  11. begin
  12. setcolor(20);
  13. moveto(x,y);
  14. x1:=x+round(rs*cos(pi*secu/30-pi/2));
  15. y1:=y+round(rs*sin(pi*secu/30-pi/2));
  16. lineto(x1,y1);
  17. moveto(x,y);
  18. setcolor(0);
  19. x1:=x+round(rs*cos(pi*(secu-1)/30-pi/2));
  20. y1:=y+round(rs*sin(pi*(secu-1)/30-pi/2));
  21. lineto(x1,y1);
  22. end;
  23. procedure minuta(secu:word);
  24. var x1,y1:integer;
  25. const rs=150;
  26. begin
  27. setcolor(4);
  28. moveto(x,y);
  29. x1:=x+round(rs*cos(pi*secu/30-pi/2));
  30. y1:=y+round(rs*sin(pi*secu/30-pi/2));
  31. lineto(x1,y1);
  32. moveto(x,y);
  33. setcolor(0);
  34. x1:=x+round(rs*cos(pi*(secu-1)/30-pi/2));
  35. y1:=y+round(rs*sin(pi*(secu-1)/30-pi/2));
  36. lineto(x1,y1);
  37. end;
  38. procedure chas(secu,g:word);
  39. var x1,y1:integer;
  40. const rs=130;
  41. begin
  42. setcolor(5);
  43. moveto(x,y);
  44. x1:=x+round(rs*cos(pi*secu/6-pi/2+pi*g/360));
  45. y1:=y+round(rs*sin(pi*secu/6-pi/2+pi*g/360));
  46. lineto(x1,y1);
  47. moveto(x,y);
  48. setcolor(0);
  49. x1:=x+round(rs*cos(pi*(secu-1)/6-pi/2+pi*g/360));
  50. y1:=y+round(rs*sin(pi*(secu-1)/6-pi/2+pi*g/360));
  51. lineto(x1,y1);
  52. end;
  53. begin
  54. gd:=detect;
  55. initgraph(gd,gm,'');
  56. setcolor(8);
  57. settextstyle(1,2,2);
  58. x:=getmaxx div 2;
  59. y:=getmaxy div 2;
  60. circle(x,y,250);
  61. circle(x,y,255);
  62. r:=210;
  63. a:=-pi/3;
  64. for i:=1 to 12 do
  65. begin
  66. str(i,stro);
  67. outtextxy(x+round(r*cos(a)),y+round(r*sin(a)),stro);
  68. a+=pi/6;
  69. end;
  70. repeat
  71. moveto(x,y);
  72. gettime(h,m,s,hund);
  73. secunda(s);
  74. minuta(m);
  75. chas(h,m);
  76. if keypressed then
  77. k:=readkey;
  78. until k=#27;
  79. closegraph;
  80. end.

Решение задачи: «Имитация работы часов с часовой, минутной и секундной стрелкой в виртуальном режиме времени»

textual
Листинг программы
  1. uses graph, crt;
  2. var  f:text;
  3.      gd,gm,d,z,x,y,x1,y1,x2,y2,x3,y3,r1,r2,r3,k,rs,rm,rh:integer;
  4.      v1,v2:longint;
  5.      c:char;
  6.      i:byte;
  7.      h,m,s,u,ah,am,as:real;
  8.      st:string;
  9. begin
  10. {читаем из файла диаметр, часы, минуты, секунды, продолжительность секунды в млс}
  11. assign(f,'input.txt');{файл в папке с программой}
  12. reset(f);
  13. readln(f,d,h,m,s,z);
  14. close(f);
  15. gd:=detect;
  16. initgraph(gd,gm,'');
  17. v1:=trunc(s+60*m+3600*h);{всего секунд от 0 часов}
  18. v2:=v1;{запомним}
  19. d:=d div 2;{радиус циферблата}
  20. rs:=d-20;{длина секундной стрелки}
  21. rm:=d-40;{длина минутной стрелки}
  22. rh:=d-60;{длина часовой стрелки}
  23. r1:=d-2;{вспомогательные радиусы для разметки циферблата}
  24. r2:=r1-5;
  25. r3:=r2-5;
  26. x:=getmaxX div 2;{центр}
  27. y:=getmaxY div 2;
  28. {рисуем циферблат}
  29. setcolor(14);
  30. line(x-30,15,x-15,15);
  31. line(x-30,15,x-25,12);
  32. line(x-30,15,x-25,18);
  33. outtextXY(x-10,10,'slowly');
  34. line(x-30,35,x-15,35);
  35. line(x-15,35,x-20,32);
  36. line(x-15,35,x-20,38);
  37. outtextXY(x-10,30,'quickly');
  38. outtextXY(x-30,50,'Esc - exit');
  39. setlinestyle(0,0,3);
  40. circle(x,y,d);
  41. u:=pi/2-pi/6;
  42. setlinestyle(0,0,1);
  43. k:=1;
  44. for i:=0 to 59 do
  45.  begin
  46.   x1:=x+round(r1*cos(u));
  47.   y1:=y-round(r1*sin(u));
  48.   x2:=x+round(r2*cos(u));
  49.   y2:=y-round(r2*sin(u));
  50.   x3:=x+round(r3*cos(u));
  51.   y3:=y-round(r3*sin(u));
  52.   if i mod 5=0 then
  53.    begin
  54.     setfillstyle(1,14);
  55.     fillellipse(x1,y1,2,2);
  56.     str(k,st);
  57.     outtextXY(x3-3,y3-5,st);
  58.     inc(k);
  59.    end
  60.   else line(x1,y1,x2,y2);
  61.   u:=u-pi/30;
  62.  end;
  63. {вычислим начальные углы стрелок от 0 часов}
  64. m:=m+s/60;
  65. h:=h+m/60;
  66. ah:=pi/2-30*h*pi/180;
  67. am:=pi/2-6*m*pi/180;
  68. as:=pi/2-6*s*pi/180;
  69. {нарисуем начало}
  70. setcolor(10);
  71. line(x,y,x+round(rh*cos(ah)),y-round(rh*sin(ah)));
  72. line(x,y,x+round(rm*cos(am)),y-round(rm*sin(am)));
  73. setcolor(12);
  74. line(x,y,x+round(rs*cos(as)),y-round(rs*sin(as)));
  75. repeat цикле крутим стрелки}
  76. delay(z);
  77. inc(v2);{+1 секунда}
  78. if v2=12*3600 then v2:=v1;{полный оборот часовой стрелки}
  79. setcolor(0);{стираем стрелки}
  80. line(x,y,x+round(rh*cos(ah)),y-round(rh*sin(ah)));
  81. line(x,y,x+round(rm*cos(am)),y-round(rm*sin(am)));
  82. line(x,y,x+round(rs*cos(as)),y-round(rs*sin(as)));
  83. if keypressed then{если нажата клавиша}
  84.  begin
  85.   c:=readkey;
  86.   if c=#0 then c:=readkey;{если служебная}
  87.   case c of
  88.   #75:if z<=2000 then z:=z+50;{стрелка влево, увеличим длину секунды}
  89.   #77:if z>=100 then z:=z-50;{вправо уменьшим (быстрее)}
  90.   #27:begin{если Escape}
  91.       assign(f,'output.txt');{создадим выходной файл}
  92.       rewrite(f);
  93.       h:=v2 div 3600;{вычислим время на часах}
  94.       m:=v2 mod 3600 div 60;
  95.       s:=v2 mod 60;
  96.       writeln(f,h:0:0,':',m:0:0,':',s:0:0);{запишем в файл}
  97.       close(f);{закроем его}
  98.       exit;{выйдем из программы}
  99.       end;
  100.   end;
  101.  end;
  102. ah:=ah-pi/21600; {вычислим новые углы стрелок}
  103. am:=am-pi/1800;
  104. as:=as-pi/30;
  105. setcolor(10);{нарисуем их}
  106. line(x,y,x+round(rh*cos(ah)),y-round(rh*sin(ah)));
  107. setcolor(10);
  108. line(x,y,x+round(rm*cos(am)),y-round(rm*sin(am)));
  109. setcolor(12);
  110. line(x,y,x+round(rs*cos(as)),y-round(rs*sin(as)));
  111. until c=#27;
  112. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы