Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Алкок Д. -> "Язык Паскаль в иллюстрациях" -> 21

Язык Паскаль в иллюстрациях - Алкок Д.

Алкок Д. Язык Паскаль в иллюстрациях — M.: Мир, 1991. — 192 c.
ISBN 5-03-001292-3
Скачать (прямая ссылка): yazpaskal1991.djvu
Предыдущая << 1 .. 15 16 17 18 19 20 < 21 > 22 23 24 25 26 27 .. 58 >> Следующая

END { while }
END. { program } f че^может^быте
1 параметром-переменной)
ют определение функции projection( , , ):
^^^—^^м^^ункци^
FUNCTION project ion(bng,dist: REAL; ^FUNCTION rat і o(x: REAL): REAL): REAL; BEGIN I^^-^JC""
projection:-dist*ratio(bng); С определяет третий END;_^-¦A формальный параметр
вот как определяются функции, имена которых используются в качестве фактических параметров функции projection( , , ):
FUNCTION sine(b: REAL): REAL;
BEGIN sine:- SIN(3.1415926*b/180) END; FUNCTION cosine(b:REAL):REAL;
BEGIN cosine:- COS(3.1415926.b/180) END;
(обратите внимание на определение третьего формального параметра функции projection( , , ):
FUNCTION
^фактическим параметро. ,должна быть функция, опре^ деленная пользователем
REAL
ratio(jc : Real ):
зтсгфункция] должна иметь параметр типа REAL
функция должна
возвращать результат типа REAL
Единственная роль имени х - указать, что здесь должен быть параметр; тем самым синтаксис функции-параметра согласуется с определением функции.
[ля полноты картины ниже приведено начало программы:
PROGRAM traverse(f,OUTPUT); VAR northing,easting: REAL;
здесь следуеУпоместить определения'функций
затем основную программу)
что здесь описано, будет работать далеко не во всех Паскаль-системах. Многие компиляторы не позволяют использовать имена функций в качестве параметров, и я не могу утверждать, что осуждаю их за это. Единственная известная мне задача, где параметры-функции действительно нужны - это интегрирование. ... ВЫДОХ!
73
В ПРОЦЕССЕ КОМПИЛЯЦИИ
\?/бъявления констант и переменных в любом блоке располагаются перед скобками BEGIN и END, которые заключают в себе собственно операторы. Вследствие этого компилятору никогда не приходится иметь дело с оператором, содержащим константы и переменные, о которых он (компилятор) еще не знает. Появление необъявленной константы или переменной вызовет во время компиляции сообщение об ошибке.
^Je же рассуждения справедивы и в отношении подпрограмм (т.е. функций и процедур). Если компилятор встречает вызов подпрограммы, о которой он не знает, то появляется сообщение об ошибке. Следить за правильным порядком следования определений - обязанность программиста.
PROGRAM demo( IN PUT, OUTPUT); VAR a,b,c: REAL;
PROCEDURE ring(VAR area.circumf: REAL; diam: REAL); BEGIN
circumf:-3.14*diam; ^~*-^\ 6 ЭТ<>м месте компилятор еще area:-circle(diam) ^*ЗГ<^^*~\не знает о функции circle( ). END " ^
FUNCTION circle(d: REAL): REAL;
BEGIN circle:-3.14*SQR(d)/4 END;
(очевидный выход - поменять порядок строк так, чтобы функция circle( ) была определена перед процедурой ring( , , ). Однако можно обойтись и меньшей кровью (перестановка строк в реальных программах, значительно более длинных, чем наши простенькие примеры, может быть весьма серьезной операцией):
t оставьте злополучную подпрограмму на своем месте, лишь упростите ее заголовок, вычеркнув все параметры
#* вставьте полный заголовок там, где ему надлежит быть, ~ т.е. перед подпрограммой, которая его вызывает.
• после полного заголовка добавьте предопределенное слово FORWARD25:
PROGRAM demo( IN PUT, OUTPUT); VAR a,b,c: REAL;
вставьте полный заголовок* \перед всеми подпрограммами, вызывающими эту функциюк FUNCTION circle(d:REAL):REAL; " " ^ ^ A
FORWARD, ^З^^^р^мт^^^млягор, ^то Ъпределение^следует)
PROCEEDURE ring(VAR area.circumf: REAL; diam: REAL); BEGIN
circumf:-3.1415926*diam; area:-circle(diam)
END' Доставьте от заголовка ш л, л ¦, (/v^ л - a я л - ,,
только имя_Т^ С Уо, ^
FUNCTION circle; --^ <-fe^l ?• трогайте
BEGIN circie:-3.1415926*SQR(d)/4.0 END;
ООомимо определения подпрограмм ссылки вперед используются в Паскале только для указателей в списках. Это описано в гл. 12.
74
ЕННЫЕ
СОЗДАЮТСЯ ЗАНОВО ПРИ КАЖДОМ ОБРАЩЕНИИ, ИСЧЕЗАЮТ ПРИ ВОЗВРАТЕ
Приведенные ниже примеры использовались на с. 69, чтобы показать различия между локальными и нелокальными переменными в процедуре:
PROCEDURE swop(VAR a.bJNTEGER); VAR tempry: INTEGER-^^ело^ BEGIN ^gaj«g) L^^iS
tempry.-=a; a:=b; b:=tempry END;_
PROCEDURE reverse(a,b; •INTEGER);
BEGIN U
WRITELN(b,a) ) ' л ока л ьные\
END; ^ ^переменные/
окальные' переменные создаются при вызове процедуры. Затем текущие значения параметров-значений копируются в соответствующие локальные переменные.
Например, вызов: ______.
| ___ ^ _ геуегее^б);
повлечет копирование числа 4 в локальную переменную с именем а и числа 5 в локальную переменную с именем 6.
|осле этого начинает выполняться процедура. При завершении, когда управление возвращается в вызвавшую программу, локальные переменные забываются, их содержимое теряется навсегда. Но пока управление не возвращено вызывающей программе, локальные переменные сохраняются. Это очень важно в случае рекурсивных подпрограмм, что видно уже из банального примера о «факториале»:
FUNCTION factorial(number: integer): INTEGER; VAR n: INTEGER;,,
BEGIN локальная переменная n
Предыдущая << 1 .. 15 16 17 18 19 20 < 21 > 22 23 24 25 26 27 .. 58 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100