Помощь - Поиск - Пользователи - Календарь
Полная версия: Часы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
shadoof
Народ, может кто-нить поможет зарешать! СРОЧНО!!! :molitva: :molitva: :molitva:

Составьте программу вывода на экран изображения циферблата механических часов с секундной, минутной и часовой стрелками. Запуск часов осуществляйте клавишей Enter, при этом перемещение секундной стрелки сопровождается «харак-терным» для часов звуком и предусмотрите коррекцию времени путем перемещения стрелок часов при нажатии клавиши Курсор влево и Курсор вправо.
volvo
А в поиск заглянуть? ;)
Часы
shadoof
Спасибо!
А как можно сделать, чтобы с помощью стрелочек можно было время корректировать!
volvo
Цитата
А как можно сделать, чтобы с помощью стрелочек можно было время корректировать!
Вот что получилось у меня: программа считывает реальное время, поэтому чтобы не заморачиваться с постоянными переустановками, я попробовал ввести "дельту времени", то есть 3 переменные, которые показывают, на сколько увеличивать (или уменьшать, если они отрицательные) считанные процедурой GetTime значения часов, минут и секунд... А по нажатию кнопок влево и вправо я просто увеличиваю или уменьшаю "дельту"... smile.gif

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

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

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

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

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

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

Ещё раз заранее спасибо!
volvo
Я все равно ничего не могу понять... Допустим, строка полностью поместилась в первом окне... Начинаем прокрутку. Что происходит со строкой, когда она достигает нижней границы первого окна? Появляется сверху? Или "уходит" вниз, за пределы окна, одновременно появляясь снизу второго окна (и "перетекает" полностью из первого окна во второе, из него - в третье, и так по кругу)?
shadoof
Так точно! Строка достигает нижней границы первого окна и уходит вниз, одновременно появляясь снизу второго окна! Потом в третьем оно появляется сверху окна.... Потом опять сверху первого, снизу второго, сверху третьего!
Все эти переходы как-бы перетекая из окна в окно происходят...
volvo
Так пойдет? (окна выделены цветом, если курсор будет мешать - можно его отключить...)
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
volvo, СПАСИБО! Всё работает!

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

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

Заранее спасибо... rolleyes.gif
volvo
Комментарии добавлены ... smile.gif
Altair
название информативно... а личная переписка у нас по правилам в PM ...
close.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.