Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОАиП.doc
Скачиваний:
16
Добавлен:
15.11.2018
Размер:
435.2 Кб
Скачать

22. Дайте определение рекурсии, рекурсивной функции. Кратко опишите достоинства и недостатки рекурсии. Сформулируйте главное требование к рекурсивным подпрограммам.

Разработайте программу с использованием рекурсивной функции для вычисления факториала числа.

Рекурсия

Рекурсия – вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная рекурсия).

Подпрограмма называется рекурсивной, если она вызывает саму себя. Рекурсивной так же будет процедура, вызывающая другую процедуру, которая в свою очередь обращается к первой процедуре. В первом случае рекурсия – прямая, во втором – косвенная. Рекурсивные программы часто выполняются быстрее и позволяют решить задачу эффективнее.

Преимущества и недостатки рекурсии

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

Главное требование к рекурсивным подпрограммам.

Главное требование к рекурсивным подпрограммам заключается в том, что вызов рекурсивной подпрограммы должен выполняться по условию, которое на каком-то уровне рекурсии станет ложным. Если условие истинно, то рекурсивный спуск продолжается. Когда оно становится ложным, то спуск заканчивается и начинается рекурсивный возврат из всех вызванных на данный момент копий рекурсивной подпрограммы.

Программа с использованием рекурсивной функции для вычисления факториала

program my;

const

n = 4;

function f(n : byte) : longint;

begin

if n=0 then f:=1 else

f:=f(n-1)*n;

end;

begin

writeln('f = ', f(n));

readln;

end.

23. Опишите стандартные процедуры модуля CRT, предназначенные для управления клавиатурой (KeyPressed, ReadKey), для управления экраном (TextColor, TextBackground, ClrScr, Window, GotoXY), для программирования звукового генератора (Sound, NoSound, Delay).

Разработайте фрагмент программы для описания данных 20 абонентов телефонной сети, т.е. массив типа запись (номер телефона, ФИО, год подключения).

Программирование клавиатуры

Функция KeyPressed. Возвращает значение типа Boolean, указывающее состояние буфера клавиатуры: False означает, что буфер пуст, a True - что в буфере есть хотя бы один символ, еще не прочитанный программой.

Функция ReadKey. Возвращает значение типа Char. При обращении к этой функции анализируется буфер клавиатуры: если в нем есть хотя бы один не прочитанный символ, код этого символа берется из буфера и возвращается в качестве значения функции, в противном случае функция будет ожидать нажатия на любую клавишу. Ввод символа с помощью этой функции не меняет содержимое экрана.

Текстовый вывод на экран

Процедура TextColor(Color:Byte) Определяет цвет выводимых символов.

Процедура TextBackground(Color:Byte); Определяет цвет фона.

Единственным параметром обращения к этим процедурам должно быть выражение типа Byte, задающее код нужного цвета.

Процедура ClrScr. Очищает экран или окно (см. ниже процедуру Window). После обращения к ней экран (окно) заполняется цветом фона и курсор устанавливается в его левый верхний угол.

Процедура Window (XI,Y1,X2,Y2:Byte); Определяет текстовое окно - область экрана, которая в дальнейшем будет рассматриваться процедурами вывода как весь экранX1...Y2 - координаты левого верхнего (XI,Y1) и правого нижнего (X2,Y2) углов окна. Левый верхний угол экрана имеет координаты (1,1), горизонтальная координата увеличивается слева направо, а вертикальная - сверху вниз.

Обращение к процедуре Window игнорируется, если какая-либо из координат выходит за границы экрана или если нарушается одно из условий: Х2>Х1 и Y2>Y1.

Каждое новое обращение к Window отменяет предыдущее определение окна.

Процедура GotoXY(X,Y:Byte);. Переводит курсор в нужное место экрана или текущего окна. Здесь X, Y - новые координаты курсора.

Программирование звукового генератора

Процедура Sound(F:Word);.Заставляет динамик звучать с нужной частотой. Здесь F - выражение типа Word, определяющее частоту звука в герцах. После обращения к процедуре включается динамик, и управление немедленно возвращается в основную программу, в то время как динамик будет звучать впредь до вызова процедуры NoSound.

Процедура NoSound. Выключает динамик. Если он к этому моменту не был включен, вызов процедуры игнорируется.

Процедура Delay(T:Word);. Обеспечивает задержку работы программы на заданный интервал времени. Здесь Т - выражение типа Word, определяющее интервал времени (в миллисекундах), в течение которого задерживается выполнение следующего оператора программы.

program my;

type

tTel = record

Nomer : integer;

FIO : string[100];

Year : integer;

end;

var

Tel : array[1..20] of tTel;

i : integer;

begin

for i:=1 to 20 do

begin

write('Enter Nomer, FIO, Year : ');

readln(Tel[i].Nomer, Tel[i].FIO, Tel[i].Year);

end;

end.

24. Дайте определение очереди, стека. Опишите основные отличия очереди от стека. Дайте определение понятия «указатель». Приведите структуру объявления типизированного и нетипизированного указателя. Перечислите операции, допустимые над указателями.

Разработайте программу для вычисления суммы всех отрицательных элементов матрицы 5x5. Вещественные числа вводятся с клавиатуры пользователем.