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

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

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

Автор: shadoof 13.10.2005 2:22

Народ, может кто-нить поможет зарешать! СРОЧНО!!! :molitva: :molitva: :molitva:

Составьте программу вывода на экран изображения циферблата механических часов с секундной, минутной и часовой стрелками. Запуск часов осуществляйте клавишей Enter, при этом перемещение секундной стрелки сопровождается «харак-терным» для часов звуком и предусмотрите коррекцию времени путем перемещения стрелок часов при нажатии клавиши Курсор влево и Курсор вправо.

Автор: volvo 13.10.2005 2:27

А в поиск заглянуть? ;)
http://forum.pascal.net.ru/index.php?showtopic=2027&view=findpost&p=17136

Автор: shadoof 13.10.2005 4:46

Спасибо!
А как можно сделать, чтобы с помощью стрелочек можно было время корректировать!

Автор: volvo 13.10.2005 5:35

Цитата
А как можно сделать, чтобы с помощью стрелочек можно было время корректировать!
Вот что получилось у меня: программа считывает реальное время, поэтому чтобы не заморачиваться с постоянными переустановками, я попробовал ввести "дельту времени", то есть 3 переменные, которые показывают, на сколько увеличивать (или уменьшать, если они отрицательные) считанные процедурой GetTime значения часов, минут и секунд... А по нажатию кнопок влево и вправо я просто увеличиваю или уменьшаю "дельту"... smile.gif

Будут вопросы - задавай...


Прикрепленные файлы
Прикрепленный файл  __CLOCKS.PAS ( 3.42 килобайт ) Кол-во скачиваний: 322

Автор: shadoof 13.10.2005 15:47

Огромное спасибо! :yessss:

Автор: shadoof 14.10.2005 2:20

volvo, слушай, я конечно понимаю, что это нагло с моей стороны, но может, если можешь, посмотри ещё одну задачку пожалуйста! :molitva:

Здесь задачу нужно написать исключительно с помощью только CRT!

Составьте программу вывода на экран трех окон. В первое окно введите вертикальную строку текста. Нажатием клавиши Enter организуйте непрерывное движение копий строки по «кольцу» последовательно через второе и третье окно. Направление «бегущей строки» сверху вниз, но во втором окне направление «бегущей строки» снизу вверх.

Заранее спасибо! ;)

Автор: volvo 14.10.2005 2:38

Не понял, как окна должны располагаться одно относительно второго? Одно над другим или слева/справа/посередине?

P.S. Зачем поменял название темы? Вообще-то на форуме не принято обращаться лично к кому-то, на то он и форум. У нас достаточно участников, которым вполне по силам решение этой задачи...

Автор: shadoof 14.10.2005 3:39

Расположение окон абсолютно безразличное, когда я пытался решать, я предполагал что друг под другом по середине, но это не принципиально!

По поводу названия темы: извиняюсь, что изменил, просто по поводу первой задачи, конкретно вы мне очень оперативно помогли... поэтому и обращаюсь к вам!

Ещё раз заранее спасибо!

Автор: volvo 14.10.2005 4:26

Я все равно ничего не могу понять... Допустим, строка полностью поместилась в первом окне... Начинаем прокрутку. Что происходит со строкой, когда она достигает нижней границы первого окна? Появляется сверху? Или "уходит" вниз, за пределы окна, одновременно появляясь снизу второго окна (и "перетекает" полностью из первого окна во второе, из него - в третье, и так по кругу)?

Автор: shadoof 14.10.2005 13:53

Так точно! Строка достигает нижней границы первого окна и уходит вниз, одновременно появляясь снизу второго окна! Потом в третьем оно появляется сверху окна.... Потом опять сверху первого, снизу второго, сверху третьего!
Все эти переходы как-бы перетекая из окна в окно происходят...

Автор: volvo 14.10.2005 18:15

Так пойдет? (окна выделены цветом, если курсор будет мешать - можно его отключить...)

uses crt;
type
{
Record - объединение разнотипных данных "под одной крышей".
Например, чтобы полноценно работать с окном,
мне надо знать про него следующее: }
RWin = record
{ координаты левого верхнего (xs, ys) и правого нижнего (xf, yf) угла }
xs, ys, xf, yf: integer;
{ цвет фона }
b_color: byte;

{ ну и дополнительная информация (разная для разных окон) }
count: byte;
s: string;
end;

{ Для инициализации констант типа Record пользуемся синтаксисом:
(<имя поля>:<значение>), при этом можно не указывать те поля,
инициализировать которые мы будем в другом месте...

Далее инициализируется массив записей (для трех окон) }
const
winds: array[1 .. 3] of RWin =
((xs: 3; ys:1; xf:10; yf: 8; b_color:red; count:1),
(xs:12; ys:1; xf:25; yf:12; b_color:green; count:1),
(xs:32; ys:1; xf:48; yf:17; b_color:blue; count:1));

{ "Высота" окна }
function win_height(i: integer): integer;
begin
with winds[i] do
win_height := yf - ys + 1;
end;

{ Процедура, очищающая окно, заданное записью R }
procedure clearwindow(r: RWin);
begin
with r do begin
window(xs, ys, xf, yf);
textbackground(b_color);
clrscr;
end;
end;

{
Эта поцедура изменяет окно с номером i,
с учетом того что в 1-ом и 3-ем окне строка "выезжает" сверху,
а во втором - снизу }
procedure show_window(i: integer);
begin
with winds[i] do begin
window(xs, ys, xf, yf);
textbackground(b_color); { устанавливаем i-ое окно }

gotoxy(1, 1); { переходим в его левый верхний угол }

if i = 2 then begin
{
если окно - второе, то удаляем первую строку, при этом
все остальные строки сдвигаются вверх, и соответственно
внизу появляется пустая строка, куда и устанавливаем курсор
}
delline; gotoxy(1, yf - ys + 1);
end
else begin
{
если окно первое или третье, то добавляем строку, соответственно
все остальные строки сдвигаются на одну вниз, и нижняя строка
выходит за пределы окна... Курсор оставляем в левом верхнем углу
}
insline; gotoxy(1, 1);
end;

{
в позицию, где находится курсор (она уже была правильно выставлена),
выводим текущий символ, и увеличиваем счетчик символов. Если счетчик
"зашкалило", сбрасываем его в 1...
}
write(s[count]); inc(count);
if count > length(s) then count := 1;

end;
end;

var
s: string;
i, j: integer;

begin
{ чистим экран черным цветом }
textattr := lightgray + 16 * black;
clrscr;

s := 'testing'; { эта строка будет "крутиться" }

{
здесь устанавливаются символы, в порядке появления их
внизу/вверху i-го окна (нарисуй окно на бумаге, и посмотри,
в каком порядке символы заданной строки должны в этом окне
появляться). При таком подходе достаточно потом просто
проходить в цикле по всем символам строки и все будет работать
как положено...
}
for i := 1 to 3 do begin
winds[i].s := '';
for j := length(s) downto 1 do
winds[i].s := winds[i].s + s[j];
end;

for i := 1 to win_height(1) - length(s) do begin
winds[1].s := winds[1].s + #32;
winds[2].s := #32 + winds[2].s;
winds[3].s := #32 + winds[3].s;
end;

for i := 1 to win_height(2) do begin
winds[1].s := winds[1].s + #32;
winds[2].s := winds[2].s + #32;
winds[3].s := #32 + winds[3].s;
end;

for i := 1 to win_height(3) do begin
winds[1].s := winds[1].s + #32;
winds[2].s := winds[2].s + #32;
winds[3].s := winds[3].s + #32;
end;

{ Теперь очищаем все три окна (делаем их видимыми) ... }
for i := 3 downto 1 do
clearwindow(winds[i]);
{ ... выводим заданную строку в первое окно ... }
for j := 1 to length(s) do
show_window(1);
{ ... и ждем нажатия на Enter }
readln;

{ Основной цикл программы - пока пользователь не нажмет
какую-нибудь клавишу, перерисовываем все 3 окна (что
заставит строку прокручиваться)
}
repeat
for i := 1 to 3 do begin
show_window(i);
delay(7200);
end;
until keypressed;

{
чистим буфер клавиатуры, чтобы по окончании работы программы
не вываливался мусор ...
}
while keypressed do readkey;

{ и возвращаемся в обычное черно-белое окно на полный экран }
window(1, 1, 80, 25);
textattr := lightgray + 16 * black;
clrscr;

end.

Автор: shadoof 15.10.2005 17:04

volvo, СПАСИБО! Всё работает!

Ещё, если будет возможность, то вы бы не могли пару комментов написать по некоторым моментам(просто для самообразования=)), но это не к спеху!

Конкретно:
1. Что это за тип такой record и что он делает?
2. Соответственно и раздел констант не очень ясен...
3. Что делает процедура show_window?
4. Вы писали, что курсор маргающий можно убрать, как?
5. И если вы уже возьмётесь за написание комментов, то можете пояснить циклы в самой программе...

Заранее спасибо... rolleyes.gif

Автор: volvo 15.10.2005 17:38

Комментарии добавлены ... smile.gif

Автор: Altair 15.10.2005 17:54

название информативно... а личная переписка у нас по правилам в PM ...
close.