- •Программирование на языке высокого уровня
- •1 Часть Учебное пособие Москва 2007
- •Оглавление
- •1. Основы алгоритмизации
- •1.1. Алгоритмизация и требования к алгоритму
- •1.2. Блок-схемы алгоритмов
- •1.2.1. Способы записи алгоритма
- •1.2.2. Блок-схемы
- •1.2.3. Следование, ветвление, цикл
- •1.3. Этапы разработки программы
- •1.3.1. Язык программирования. Программа
- •1.3.2. Этапы разработки
- •1.4. Ошибки
- •1.4.1. Компилятор. Синтаксис и семантика
- •1.4.2. Типы ошибок
- •2. Алфавит языка Турбо Паскаль. Программа
- •2.1. Идентификаторы
- •2.2. Разделители
- •2.3. Специальные символы
- •2.4. Структура Pascal-программы
- •Пример простейшей программы на языке Pascal
- •3. Типы данных
- •3.1. Структура типов данных
- •3.2. Простые типы
- •3.2.1. Порядковые типы
- •3.2.1.1 Целые типы.
- •3.2.1.1.1. Встроенные процедуры и функции, применимые к целым типам
- •3.2.1.2. Логический тип.
- •3.2.1.3. Символьный тип.
- •3.2.1.4. Перечисляемый тип.
- •3.2.2. Вещественные типы
- •3.3. Константы и переменные
- •3.4. Преобразование типов
- •4. Операторы
- •4.1. Ввод данных
- •4.2. Вывод данных
- •4.3. Составной оператор
- •4.4. Условный оператор
- •4.5. Операторы циклов
- •4.5.1. Оператор for
- •4.5.2. Оператор while
- •4.5.3. Оператор repeat
- •4.5.4. Стандартные функции для циклов
- •4.6. Оператор выбора case
- •5. Массивы
- •5.1 Определение массива
- •5.2. Ввод/вывод одномерного массива (вектора).
- •5.3 Типизированные константы – массивы
- •5.4. Сортировка массивов (ранжирование)
- •6. Процедуры и функции
- •6.1. Подпрограммы
- •6.2. Параметры. Глобальные и локальные описания
- •6.3. Процедуры
- •6.4. Функции
- •6.5. Процедура exit
- •6.6. Рекурсия
- •6.7. Директивы подпрограмм
- •6.8. Открытые массивы
- •7. Записи
- •7.1.Определение и правила записи
- •7.2. Оператор присоединения
- •7.3. Записи с вариантами (экономия пространства)
- •8. Множества
- •8.1. Понятие множества
- •8.2. Конструктор множества
- •8.3. Операции над множествами
- •8.4. Примеры программ, использующих множества.
- •Литература
6.4. Функции
Описание функции в основном аналогично описанию процедуры. Однако, имеются два отличия.
Первое - результатом работы функции является одно скалярное значение или одно значение ссылочного типа. Тип результата задается в заголовке функции.
Второе отличие заключается в том, что теле функции хотя бы раз имени функции должно быть присвоено значение.
Общий вид:
Function <имя> [(список фактических параметров)] :<тип>;
< тип> тип возвращаемого функцией результата.
Пример. Функция принимает любое число и возвращает его квадрат. Если значение квалрата больше 100, то оно считается равным 100. При этом устанавливается глобальный «флаг».
Var
glflag:boolen: {глобальный флаг}
Function getsqr (x:real):real;
Const
sqrmax=100; {локальная const}
begin
X:=x*x; {вычисление квадрата}
Glflag := (x>sqrmax); {результат сравнения в глобальный флаг]
If glflag then x:= sqrmax {ограничение x}
Getsqr :=x {возвращает значение}
end;
Begin {основной вызывающий блок}
Writeln (getsqr (6):7:2, ‘флаг:’, glflag)
End.
При объявлении формальных параметров в <списке формальных параметров>, тип любого параметра может быть только стандартным или ранее объявленным, потому, что нельзя объявить:
Procedure S(a:array[1…10] of real);
Проблема решается так:
Type
Atype = array [1..10] of real
Procedure S (a:atype)
В блок передается весь массив.
6.5. Процедура exit
GOTO нельзя использовать для досрочного выхода из подпрограммы. В Т-П для этой цели используется процедура EXIT.
Пример. Функция, определяющее первое отрицательное число в массиве.
Type
Arr_=array [1..100] of real;
Var
Ar:arr_
Function minus (var mas:arr_; N:integer):real;
Var
I:integer;
Begin
Minus :=0;
For i:=1 to n do
If mas[i]<0 then
Begin
Minus:=mas[i];
Exit
End;
End;
Begin
Writeln (‘Первое отрицательное число в массиве=’, minus(ar,50):7:2);
End.
6.6. Рекурсия
Использование рекурсии – преимущество Т-П. Под рекурсией понимается вызов функции (процедуры) из тела самой функции (процедуры)
Эта возможность связана с тем, что при каждом новом обращении параметры, которые она использует, заносятся в стек, причем параметры предыдущего обращения сохраняются.
В ряде случаев рекурсивное оформление более компактно и эффективно.
Пример. Вариант функции вычисляющей факториал числа N.
Function fact (n:integer):longint;
Begin
If n in[0..1] then fact:=1
else
fact :=n*fact (n-1)
End;
Если в функцию передается n>0, то происходит следующее:
-
запоминаются известные значения членов выражения;
-
для вычисления неизвестных вызываются те же функции, но с «предшествующими» аргументами.
Так происходит до тех пор, пока выражение не станет полностью определенным (ветвь then). После чего алгоритм начинает «раскручиваться» в другую сторону, изымая из памяти «отложенные значения. При этом на каждом очередном шаге все члены выражения будут известны через n обратных шагов, получили результат.
Рекурсия заставляет программы расходовать больше памяти, но сами программы более изящны.