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