Помощь - Поиск - Пользователи - Календарь
Полная версия: Часы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Pascal
Подскажите, как сделать часы на Паскале, лучше со стрелками. Очень надо! smile.gif
virt
тебе татушка нужна???

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

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


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

Но это теория ,может тебя именно графическая реализация интересовала?
Serega
Если все лишнее убрать, то получится то, что тебе надо. ;)
Код

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
Serega
Подскажи, где можно взять модуль dos.
trminator
Модуль DOS -- встроенный модуль Паскаля (в Borland/Turbo pascal for DOS как минимум)
Pascal
Спасибо, у меня ещё один вопрос: где-нибудь можно взять исходники часов?
HelpAusHeaven
Какие именно тебе нужны исходники?
Тебе же привели уже программу с исходным кодом....
Pascal
Часы с этим кодом у меня бегают как бешеные.
BlackShadow
А ты им успокоительное синсталлируй smile.gif
Пардон за флуд
virt
Pascal
а ты перед gettime поставь
Код
delay(100);
BlackShadow
virt, а я бы Delay и не советовал. Работает он сейчас... Ну дай бог через 10 раз...
FreeMan
вместа дэлая юзай системный таймер по адресу $40:$6c. smile.gif
Pascal
Ну вроде заработало.
Спасибо всем!
Тему можно закрывать.
Человечище
Нет!!!
Тему закрывать нельзя.
Может кто-нибудь предоставит решение классической задачи "ЧАСЫ".
Пусть даны целые числа m,n (часы, минуты), 0 <= m <= 11, 0 <= n <= 59, определяющие время суток. Опеределить наименьшее время (число полных минут), которое должно пройти до того момента, когда часовая и минутная стрелки:
1. совпадут
2. расположатся перпендикулярно друг другу
(программа должна быть линейной[без циклов, ветвлений])
Задача взята из задачника Усковой "Программирование на языке Паскаль".
Чего то не доходит, как её решать!!! blink.gif
Atos
Для 1. надо воспользоваться тем фактом, что 11 точек совпадения стрелок делят циферблат на 11 равных частей.
Гость
а может и мне поможете? у нас в школе началось программирование в паскале... и задал нам препод очень странную задачку : надо создать часы в формате часы:минуты:секунды , чтобы было 01 , 05 ( сек мин часов) и т.д. а также чтобы можно было устанавливать время самостоятельно, был будильник... сколько пробовал сделать не получается... wacko.gif то что получилось прекреплю...
Артемий
Цитата
а также чтобы можно было устанавливать время самостоятельно

Но он у тебя каждый раз должен просто отсчет вперед вести (1 сек,2 сек, 3 сек, n сек) или все-таки время системное показывать?
Или ты имел ввиду настроить время для будильника?
Артемий
немного подделал по твоему наброску..Если не очень красиво, без обид. 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;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.