Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Часы

Автор: Pascal 8.05.2004 18:56

Подскажите, как сделать часы на Паскале, лучше со стрелками. Очень надо! smile.gif

Автор: virt 8.05.2004 20:31

тебе татушка нужна???

а так есть системный таймер :

Код
var Timer:longint absolute $0:$046c;


по этому адресу ~ 18.2 раза в секунду увеличивается значение на 1 (точнее 1000/55 ~= 18.18...). Можешь отслеживать изменения и каждые 18 увеличений прорисовывать новое положение стрелок. Не забудь каждые 1620 увеличений счетчика (90 секунд) ,корректировать значение часов на +2 сек.

Но это теория ,может тебя именно графическая реализация интересовала?

Автор: Serega 9.05.2004 1:31

Если все лишнее убрать, то получится то, что тебе надо. ;)

Код

program clock;
uses crt,graph,dos;
var gb,gm,R:integer;x,y,x1,y1,u1,u,x2,y2,u2:real;
   i:integer;
   s:string[2];
   h,m,c,d,c1:word;
begin

 gb:=detect;
 initgraph(gb,gm,'c:\bp\bgi');

 R:=80;x:=320;y:=240;
    x1:=320;y1:=240;u:=-pi/2;
    x2:=320;y2:=240;

 setfillstyle(1,6);
 bar(0,300,640,480);

 setfillstyle(10,2);
 bar(0,0,640,300);

 setfillstyle(1,7);
 setcolor(7);
 sector(250,150,35,215,30,30);
 sector(390,150,325,360,30,30);
 sector(390,150,0,143,30,30);
 setlinestyle(0,0,3);
 line(250,150,270,170);
 line(390,150,370,170);
 bar(305,120,335,125);
 line(320,125,320,170);
 setlinestyle(0,0,1);
 sector(320,360,0,180,60,40);
 setfillstyle(1,6);setcolor(6);
 fillellipse(320,370,40,25);
 setfillstyle(1,7);
 fillellipse(320,240,R+20,R+20);
 setbkcolor(0);

 for i:=1 to 12 do
  begin
   u:=u+pi/6;
   x:=(R+10)*cos(u)+317;y:=(R+10)*sin(u)+237;
   str(i,s);
   outtextxy(round(x),round(y),s);
 end;

 for i:=1 to 60 do
  begin
   u:=u+pi/30;
   x:=(R+17)*cos(u)+320;y:=(R+17)*sin(u)+240;
   putpixel(round(x),round(y),1);
  end;

 for i:=1 to 12 do
  begin
   u:=u+pi/6;
   x:=(R+17)*cos(u)+320;y:=(R+17)*sin(u)+240;
   setcolor(1);
   setfillstyle(1,7);
   fillellipse(round(x),round(y),2,2);
   circle(round(x),round(y),2);
  end;
repeat
 gettime(h,m,c,d);
 if c1<>c then
  begin c1:=c;
 setcolor(7);
 line(320,240,round(x),round(y));
 line(320,240,round(x1),round(y1));
 setlinestyle(0,0,3);
 line(320,240,round(x2),round(y2));

 x2:=(R-23)*cos(u2)+320;y2:=(R-30)*sin(u2)+240;
 setcolor(9);
 line(320,240,round(x2),round(y2));
 setlinestyle(0,0,1);

 x1:=(R-15)*cos(u1)+320;y1:=(R-15)*sin(u1)+240;
 setcolor(1);
 line(320,240,round(x1),round(y1));

 x:=(R)*cos(u)+320;y:=(R)*sin(u)+240;
 setcolor(4);
 line(320,240,round(x),round(y));

 setcolor(4);
 setfillstyle(1,4);
 fillellipse(320,240,3,3);
 u:=(c+45)*pi/30;
 u1:=(m+45)*60*pi/1800;
 u2:=(h*5+m/15+45)*3600*pi/108000;
end;
until keypressed;
closegraph;
end.

По-моему это надо отправить в "Задачи"

Автор: Pascal 9.05.2004 19:49

Serega
Подскажи, где можно взять модуль dos.

Автор: trminator 9.05.2004 22:16

Модуль DOS -- встроенный модуль Паскаля (в Borland/Turbo pascal for DOS как минимум)

Автор: Pascal 10.05.2004 14:44

Спасибо, у меня ещё один вопрос: где-нибудь можно взять исходники часов?

Автор: HelpAusHeaven 11.05.2004 6:53

Какие именно тебе нужны исходники?
Тебе же привели уже программу с исходным кодом....

Автор: Pascal 11.05.2004 18:09

Часы с этим кодом у меня бегают как бешеные.

Автор: BlackShadow 11.05.2004 18:36

А ты им успокоительное синсталлируй smile.gif
Пардон за флуд

Автор: virt 11.05.2004 19:58

Pascal
а ты перед gettime поставь

Код
delay(100);

Автор: BlackShadow 11.05.2004 20:26

virt, а я бы Delay и не советовал. Работает он сейчас... Ну дай бог через 10 раз...

Автор: FreeMan 11.05.2004 20:40

вместа дэлая юзай системный таймер по адресу $40:$6c. smile.gif

Автор: Pascal 12.05.2004 0:43

Ну вроде заработало.
Спасибо всем!
Тему можно закрывать.

Автор: Человечище 19.05.2004 20:11

Нет!!!
Тему закрывать нельзя.
Может кто-нибудь предоставит решение классической задачи "ЧАСЫ".
Пусть даны целые числа m,n (часы, минуты), 0 <= m <= 11, 0 <= n <= 59, определяющие время суток. Опеределить наименьшее время (число полных минут), которое должно пройти до того момента, когда часовая и минутная стрелки:
1. совпадут
2. расположатся перпендикулярно друг другу
(программа должна быть линейной[без циклов, ветвлений])
Задача взята из задачника Усковой "Программирование на языке Паскаль".
Чего то не доходит, как её решать!!! blink.gif

Автор: Atos 22.05.2004 11:32

Для 1. надо воспользоваться тем фактом, что 11 точек совпадения стрелок делят циферблат на 11 равных частей.

Автор: Гость 15.03.2007 0:05

а может и мне поможете? у нас в школе началось программирование в паскале... и задал нам препод очень странную задачку : надо создать часы в формате часы:минуты:секунды , чтобы было 01 , 05 ( сек мин часов) и т.д. а также чтобы можно было устанавливать время самостоятельно, был будильник... сколько пробовал сделать не получается... wacko.gif то что получилось прекреплю...


Прикрепленные файлы
Прикрепленный файл  Gmail.zip ( 676 байт ) Кол-во скачиваний: 213

Автор: Артемий2 15.03.2007 0:26

Цитата
а также чтобы можно было устанавливать время самостоятельно

Но он у тебя каждый раз должен просто отсчет вперед вести (1 сек,2 сек, 3 сек, n сек) или все-таки время системное показывать?
Или ты имел ввиду настроить время для будильника?

Автор: Артемий2 15.03.2007 1:22

немного подделал по твоему наброску..Если не очень красиво, без обид. smile.gif

uses crt;
var i,k,m,d: integer;
f: boolean;
c: char;
dat: record
h,m,s: Integer;
end;
label 10,11;
begin
clrscr;
writeln('Press 2 to prepare the alarm clock!');
readln(d);
case d of
2: begin goto 10 end;
end;
11: for i:=0 to 23 do
begin
for k:=0 to 59 do
begin
for m:=0 to 59 do
begin
if not (2 <> d) then begin
if (i=Dat.h) and (k=Dat.m) and (m=Dat.s) then begin
gotoxy (11,11);
writeln('Stand up!');
f:=true;
break;
end;
end;
gotoxy (11,11);
delay (50000);
delay (50000);
delay (50000);
write(i,' з б®ў : ',k,' ¬Ё­гв : ',m,' ᥪ㭤');
end;
if f then break;
end;
if f then break; goto 10
end;
writeln('Do you want to exit? (y/n)');
readln( c);
case c of
'y': begin exit; end;
'n': begin writeln; end;
end;
10: writeln('Put your settings: ');
readln(Dat.h,Dat.m,Dat.s);
goto 11;