Скачать программы Все программы автораЗАДАЧИ1. Задачи на обработку клавиатуры.
1. Написать программу, печатающую код нажимаемой клавиши и заканчивающей работу после нажатия клавиши ESC. Определить все клавиши, не генерирующие кода и генерирующие расширенный код.
Решение. Эта программа очень проста:
Repeat c:=ReadKey; Until c=#27 { 27 -код клавиши ESC } End. Не генерируют кода клавиши смещения Shift, Alt, Ctrl и клавиши-переключатели Caps Lock, Num Lock, Break, Scroll Lock, Print Screen. Генерируют расширенный код функциональные клавиши, клавиши редактирования Ins и Del, клавиши передвижения курсора. Расширенный код также генерируют некоторые комбинации клавиш, получаемые клавишами Alt и Ctrl.
2. Дана программа рисования
звездочки в центре экрана; при нажатии букв U, D, R, L рисуется звездочка
выше, ниже, правее, левее предыдущей звездочки соответственно. Программа
заканчивает работу по нажатии клавиши Esc. ClrScr; TextColor(7); c:=ReadKey; Until c=#27 End. Таким образом, программа является очень упрощенной моделью графического редактора. Попытку выхода за границу экрана она отрабатывает неправильно. Также не корректно она обрабатывает нажатие некоторых клавиш. Например, нажатие клавиши F10 оказывает такой же эффект, как и нажатие буквы D (так как 'D'=#68, а клавиша F10 генерирует последовательность символов #0#68). Усовеpшенствуйте программу
так, чтобы: Решение. Все усовершенствования касаются только основного цикла Repeat-Until. Главное изменение заключается в том, чтобы обрабатывать правильно клавиши расширенного кода. Тогда пункт 1) достигается заменой символов 'U' и 'u' на #0 и #72 во внешнем и внутреннем операторах Case соответственно и т.д. Для пункта 2) достаточно перед процедурами Inc и Dec поставить соответствующие условия. Пункты 3)-5) выполняются путем расширения списков обрабатываемых клавиш в операторах Case. Вот как может выглядеть исправленная программа: Program SuperStars; ClrScr; TextColor(7); c:=ReadKey; c2:=ReadKey; end; {case
c} Until c2=#45 { #0#45 -код клавиш ALT+X } End. Семь строчек программы, обрабатывающих клавиши F1-F7, можно заменить одной строкой #59..#65: TextColor(ord(c2)-58);
2. Задачи на рекурсию
3. В выражении Решение. Предположим, что k первых звездочек уже заменено знаками
сложения и вычитания и результат первых k операций (сумма s) нам известен
(в начальный момент k=0, s=12894). Тогда (k+1)-ю звездочку мы можем
заменить двумя способами. Подсчитывая в обоих случаях получающуюся
сумму первых k+1 операций, мы приходим к исходной ситуации, но с k,
на единицу большим. Если же k=8, то надо проверить равенство s=1989
и при его выполнении напечатать ответ. Запоминается k-ая операция в
k-ом символе строки z. If k = 8 then End; 4. В написанном выражении ((((1 ? 2) ? 3) ? 4) ? 5) ? 6 вместо каждого знака "?" вставить знак одного из четырех арифметических действий: +, -, *, / так, чтобы результат вычислений равнялся 35 (при делении дробная часть в частном отбрасывается). Решение аналогично предыдущей
задаче. If k = 6 then End;
5. Из заданных N предметов выбрать такие, чтобы их суммарный вес был менее 30 кг, а стоимость - наибольшей. Напечатать номера и суммарную стоимость выбранных предметов. Вес и стоимость предметов заданы массивами A[1:N] и B[1:N]. Замечание. Можно предполагать, что предметы уже расположены в порядке возрастания или убывания веса A[i], стоимости B[i] или какого-либо иного признака. Решение. В отношении каждого предмета у нас два варианта действий:
мы можем его выбрать или не выбрать. Эта ситуация напоминает задачу
3: там тоже каждая звездочка предоставляла два варианта действий. Но
есть и отличия. If V>30
then M[k] := 0 End; For i:=1 to
N do begin End.
6. Написать программу, реализующую рекурсивный алгоритм закраски замкнутой области цветом, совпадающим с цветом границы области. Решение. Ядро простейшего алгоритма закраски составляет рекурсивная
процедура, которая проверяет цвет заданной точки и, если он отличен
от цвета закраски, закрашивает ее и вызывает себя для четырех соседних
точек. В качестве примера реализации алгоритма приводим программу,
рисующую круг и закрашивающую его путем вызова рекурсивной процедуры
PAINT. If GetPixel(x,y)<>c
then begin End; d:=CGA; r:=1;
InitGraph(d,r,'BGI\'); End. С помощью данной процедуры можно закрашивать только небольшие области. В противном случае возможен настолько глубокий уровень рекурсивного вызова, что для выполнения программы не хватит оперативной памяти.
7. Написать программу, рисующую елочку с помощью рекурсивной процедуры.
Решение. Общая схема рекурсивной процедуры может быть такой:
Таким образом, при выполнении
алгоритма сначала будут нарисованы все левые ветки елочки снизу вверх,
а затем все правые ветки сверху вниз. Условие определения верхней ветки
может быть различным. Например, по достижении определенного номера
ветки или ее размера процедура прерывает рекурсивное обращение к себе.
Тем самым последняя нарисованная левая ветка окажется верхней. Ниже
приводится программа, в которой заранее задано количество веток и размер
веток в пикселях (n=3, R=100). LineRel(-R,0); End; d:=VGA; r:=2;
InitGraph(d,r,'C:\TP5\BGI'); End. Если при вызове процедуры VETKA первый параметр R заменить на 2*R div 3 (указано в комментариях), то только первая ветка будет иметь размер 100, а каждая следующая ветка станет в полтора раза меньше предыдущей. |