- •ПРЕДИСЛОВИЕ
- •1.1. История и классификация языков программирования высокого уровня
- •1.2. Первое (знакомство с Паскалем
- •Задания
- •Лекция 2
- •2.1. Некоторые сведения о системе ТУрбо-Паскаль
- •2.2. Способы описания языка программирования
- •Лекция 3
- •3.2. Типы данных
- •4.1. Структура Паскаль-программы
- •4.2. Арифметические операции, функции, выражения Арифметический оператор присваивания
- •Форматы процедуры write
- •Задания
- •1. Что будет напечатано программой
- •если последовательно вводятся три числа: 36, -6, 2345?
- •5.2. Функции, связывающие различные типы данных
- •Задания
- •Теперь посмотрим, как это программируется наТЛаскале.
- •Здесь
- •<параметр цикла>::= <имя простой переменной порядкового типа>
- •Задания
- •7.1. Подпрограммы-процедуры
- •7.2. Подпрограммы-функции
- •7.4. Рекурсивные подпрограммы
- •8.1. Что такое рекуррентная последовательность
- •8.2. Программирование вычислений рекуррентных последовательностей
- •Задания
- •Задания
- •6. Вывод результата.
- •Теперь будем составлять подпрограммы.
- •Задания
- •12.2. Операции над множествами
- •12.3. Примеры использования множеств
- •Красивая программа! К сожалению, ею нельзя воспользоваться для
- •В этой программе использована функция определений размера файла:
- •.Fiiesize(<HMH файловой переменной>);
- •Задания
- •14.2. Работа с файлами записей
- •Задания
- •15.2. Связанные списки
- •Лекция 16
- •16.1. Организация внешних подпрограмм
- •16,2. Создание и использование модулей
- •распечаткой текста программы с подробными комментариями.
- •выполнения следующих операции над обыкновенными дробями вида -q
- •(Р — целое, Q — натуральное):
- •1) сложение;
- •2) вычитание;
- •3) умножение;
- •4) деление;
- •5) сокращение дроби;
- •7) функции, реализующие операции отношения (равно, не равно,
- •Используя этот модуль, решить задачи:
- •При разработке модуля рекомендуется такая последовательность
- •Задания
- •Приведем текст программы целиком.
- •ЗАДАНИЯ ПО ТЕМЕ “ЛИНЕЙНЫЕ АЛГОРИТМЫ”
- •ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА
- •Сортировка массивов
- •ЗАДАЧИ ПО ТЕМЕ “ОБРАБОТКА СТРОК”
- •ЗАДАНИЯ ПО ТЕМЕ “МОДУЛИ”
- •ЗАДАНИЯ ПО ТЕМЕ “ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ”
- •Задачи, предлагавшиеся на школьных олимпиадах по программированию (Пермская область)
- •Учебное издание
Поэтому переменные М и ЛГ, используемые в процедуре, получают свои значения через оператор присваивания в основном блоке про граммы. Результат получается в глобальной переменной Jf, значение которой выводится на экран.
Использование механизма передачи через параметры делает про цедуру более универсальной, независимой от основной программы. Однако в некоторых случаях оказывается удобнее использовать пере дачу через глобальные переменные. Чаще такое бывает с процедурами, работающими с большими объемами информации. В этой ситуации глобальное взаимодействие экономит память ЭВМ.
7.2. Подпрограммы-функции
Теперь выясним, что такое подпрограмма-функция. Обычно фун кция используется в том случае, если результатом подпрограммы дол жна быть скалярная (простая) величина. Тип результата называется типом функции. В Турбо-Паскале допускаются функции строкового типа.
Структура описания функции:
< описание функции> |
<блок>— ► |
|
------------ *------------------------- |
<оаголовок> — K i ) — |
|
< заголовок> |
function — >• <имя функции> |
<ти п > - |
|
< список формальных параметров>
Как и у процедуры, у функции в списке формальных параметров могут присутствовать параметры-переменные и параметры-значения. Все это — аргументы функции. Параметры вообще >*огут отсутство вать (если аргументы передаются глобально).
Программа решения рассмотренной выше задачи с использованием функции будет следующей:
Program |
N0D3; |
|
|
|
|
Var А, |
В, |
Rez |
Integer; |
|
|
Function |
Evklid(M, N |
Integer) |
Integer; |
||
Begin |
|
|
|
|
|
While M <> N Do
I f M > N
Then M := M - N |
|
||
Else N := N - М; |
|
||
Evklid |
:« |
М |
|
End; |
|
|
|
Begin |
|
|
|
W rite(, a= |
') ; |
|
|
ReadLn(A); |
|
|
|
W rite('b= |
’ ) ; |
|
|
ReadLn(B); |
|
|
|
Rez := |
Evklid(Evklid(A |
+ B, Abs(A - В)), A * B) ; |
|
Writ eLnO NOD равен *, |
Rez) |
||
End. |
|
|
|
Из примера видно, что тело функции отличается от тела процедуры только тем, что в функции результат присваивается переменной
с тем же именем, что и функция.
Обращение к функции является операндом в выражении. Оно запи сывается в следующей форме:
<имя функции>(<список фактических гхараметров>)
Правила соответствия между формальными и фактическими параме трами все те же.
Сравнивая приведенные выше программы, можно сделать вывод, что программа N0D3 имеет определенные преимущества перед дру гими. Функция позволяет получить ^гоуяьтат путем выполнения одного оператора присваивания. Здесь иллюстрируется возможность того, что фактическим аргументом при обращении к функции может быть эта же функция.
По правилам стандарта Паскаля возврат в вызывающую программу из подпрограммы происходит, когда выполнение^подпрограммы дохо дит до ее конца (последний end). Однако в ТУрбо-Паскале есть сред ство, позволяющее выйти из подпрограммы в любом ее месте. Это оператор-процедура Exit. Например, функцию определения наиболь шего из двух данных вещественных чисел можно описать так:
Function |
Мах(Х, |
Y |
Real) |
Real; |
|
Begin |
|
|
|
|
|
Max |
:= |
X; |
|
|
|
I f X |
> Y Then |
Exit |
Else Max |
:= Y |
|
End; |
|
|
|
|
|
Из подпрограммы В1 можно обратиться к А, поскольку ее описание является глобальным по отношению к В1, но нельзя обратиться к А1, поскольку область действия описания А1 не распространяется на блок подпрограммы В.
Из подпрограммы В22 можно обратиться только к В21, В1, А. Объ ясните сами, почему?
Все понятно? Если нет, то прочитайте еще раз этот раздел. Очень важно в нем разобраться.
Если одно и то же имя описано во внешнем блоке (глобально) и во внутреннем блоке (локально), то последнее описание (локальное) пере крывает первое в пределах внутреннего блока. Рассмотрим следующий пример:
Program |
Examplel; |
Program |
Example2; |
|
Var X |
Integer; |
Var X |
Integer; |
|
Procedure P; |
Procedure P; |
|
||
Var X |
Integer; |
Begin |
WriteLn(*x« |
X) |
Begin WriteLnOx * } , X) |
End; |
|
|
|
End; |
|
Begin X |
:■ 1; |
|
Begin X |
:* 1; |
P |
|
|
P |
|
End. |
|
|
End. |
|
|
|
|
Что выведется на экран в результате работы программы Examplel и Ехатр1е2? Первая программа выдаст результат:
х =
На месте многоточия будет какое-то произвольное значение, соответ ствующее неопределенной величине х. Вторая программа в результате даст
X = 1
Впервом случае переменная с именем х описана как глобально, так
илокально. Но процедура выводит значение локальной переменной, ко торой ничего не присвоено. В этом примере идентификатором х обо значены две совершенно разные величины, им соответствуют две раз ные ячейки памяти.
Во втором примере переменная х одна на всю программу. Она опи
сала глобально. Поэтому значение 1, присвоенное ей в основной про грамме, передается и в подпрограмму.
Теперь составим программу, по которой машина рассчитает алго ритм работы монахов и выведет его для любого значения п (количества дисков). Пусть на площадке А находится п дисков. Алгоритм решения задачи будет следующим:
1. Если п = 0, то ничего не делать.
2. Если п > 0, то переместить п - 1 диск на С через В; переместить диск с А на В (А=*В); переместить п - 1 диск с С на В через А.
При выполнении пункта 2 последовательно будем иметь три состо яния:
А |
В |
С |
Рис. 7.3
Описание алгоритма имеет явно рекурсивный характер. Переме щение п дисков описывается через перемещение п - 1 диска. А где же выход из этой последовательности рекурсивных ссылок алгоритма самого на себя? Он в пункте 1, как бы не показалось странным его тривиальное содержание.
А теперь построим программу на Паскале. В ней имеется рекурси вная процедура Налоу, выполнение которой заканчивается только при п = 0. При обращении к процедуре используются фактические имена площадок, заданные их номерами: 1, 2, 3. Поэтому на выходе цепочка