2017-02-06

06. Часы на PascalABC

Для работы программы необходим файл с рисунком циферблата (скачать).

Рассмотрим код программы:

Program Timer;
uses crt, GraphABC;
var pic, x0,y0, x,y,  R, min, sec : integer;
begin
  SetWindowSize(360,480);
   HideCursor;
  x0:=173; y0:=300; min:=0; sec:=0;
  pic:=LoadPicture('timer.jpg');

  repeat

    DrawPicture(pic,0,0,360,480);                     
// Рисование циферблата
    sec:=sec+1;

     min:= sec div 60;                                         // секунды и минуты
    x:=x0+Round(120*sin(Pi*sec/30));
    y:=y0-Round(120*cos(Pi*sec/30));
    SetPenWidth(3);

    Line(x0, y0, x, y);                                     // секундная стрелка
    x:=x0+Round(100*sin(Pi*min/30));
    y:=y0-Round(100*cos(Pi*min/30));
    SetPenWidth(7);

    Line(x0, y0, x, y);                                     // минутная стрелка
    sleep(1000);
  until (min>=60) or keyPressed;
end.


Теперь разберемся как она работает.

Во-первых программа использует два модуля: модуль CRT - для запуска программы в отдельном окне. Во-вторых модуль GraphABC - для того, чтобы можно было вырисовывать минутную и секундную стрелки.

Загрузка изображения часов осуществляется в два этапа: сначала с файлом изображения связывается идентификатор изображения (в нашем случае это pic). Это делается следующим оператором: pic:=LoadPicture('timer.jpg');

Далее уже в цикле происходит прорисовка изображения :    DrawPicture(pic,0,0,360,480); 

Оператор HideCursor;  "прячет" курсор, который всегда "моргает" в левом верхнем углу окна.

Оператор   x0:=173; y0:=300; min:=0; sec:=0; устанавливает центр циферблата - точку, откуда будут рисоваться стрелки, а ткже устанавливает начальное значение минут и секунд в ноль.

Работа цикла с постусловием.

Цикл repeat......until (min>=60) or keyPressed; работает пока количество минут не превысит 60 или не будет нажата какая-либо из клавиш клавиатуры.

Что происходит в теле цикла.

1. Прорисовка часов:     DrawPicture(pic,0,0,360,480);

2. Увеличение количества секунд на 1:  sec:=sec+1;

3. Расчет количества минут:  min:= sec div 60;

4. Расчет конечных координат x и у для секундрой стрелки :

  x:=x0+Round(120*sin(Pi*sec/30));
    y:=y0-Round(120*cos(Pi*sec/30));

5. Прорисовка линии секундной стрелки: SetPenWidth(3); Line(x0, y0, x, y); 

6. Расчет конечных координат х и у для минутной стрелки:

  x:=x0+Round(100*sin(Pi*min/30));
    y:=y0-Round(100*cos(Pi*min/30));

7. Прорисовка линии минутной стрелки: SetPenWidth(7); Line(x0, y0, x, y);  

8. Задержка работы программы на 1 секунду: sleep(1000);

Небольшой видеофрагмент поможет еще досканельнее разобраться в работе программы:

Видеоурок:

 

Как добавить часовую стрелку в часы?

1. В области описания переменных добавить еще одну, отвечающую за количество часов, например hour.

2.  После расчета количества минут добавить строку для расчета количества часов на основе количества минут:

hour:= min div 12;  (здесь делим нацело уже не на 60, а на 12, т.к. часовая стрелка за один полный оборот минутной стрелки должна сместиться не на одно, а на 5 делений);

3. Далее необходимо по аналогии с секундной и минутной стрелками сделать перерасчет количества часов в координаты конца стрелки x и y. В этом же блоке необходимо учесть, что часовая стрелка должна быть еще короче минутной:

  x:=x0+Round(80*sin(Pi*hour/30));
    y:=y0-Round(80*cos(Pi*hour/30));

4. Выставить толщину и цвет часовой стрелки и провести линию, изображающую часовую стрелку.

5. Для того, чтобы пронаблюдать ход часов в ускоренном виде, необходимо сократить задержку с 1000 ms до 10m:  sleep(10);

Вот и все. Удачи Вам в написании программы!


article

Авторизация
Логин:
Пароль:

Добро пожаловать,
гость сайта!

Статистика по сайту:

Сегодня сайт уже посетили 25 чел.

Количество всех статей на сайте: 498.

Количество online-тестов: 211.