1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Народ, может кто-нить поможет зарешать! СРОЧНО!!! :molitva: :molitva: :molitva:
Составьте программу вывода на экран изображения циферблата механических часов с секундной, минутной и часовой стрелками. Запуск часов осуществляйте клавишей Enter, при этом перемещение секундной стрелки сопровождается «харак-терным» для часов звуком и предусмотрите коррекцию времени путем перемещения стрелок часов при нажатии клавиши Курсор влево и Курсор вправо.
Сообщение отредактировано: shadoof - 13.10.2005 22:24
Так пойдет? (окна выделены цветом, если курсор будет мешать - можно его отключить...)
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;
{ здесь устанавливаются символы, в порядке появления их внизу/вверху 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;