- •Министерство образования и науки российской федерации
- •Начальный курс программирования на основе алгоритмического языка Паскаль
- •Введение
- •Часть. Основы программирования на Паскале
- •1.1. Структура простейшей Паскаль-программы
- •1.2. Данные и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных
- •1.2.3. Правила записи констант
- •1.2.4. Описание переменных и именованных констант в Паскале
- •1.2.5. Выражения
- •1.3. Операторы преобразования данных
- •1.3.1. Оператор присваивания
- •1.3.2. Понятие ввода и вывода
- •1.3.3. Оператор вывода
- •1.3.4. Оператор ввода
- •1.4. Разработка простейших программ
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
- •1. Следование
- •2. Ветвление (развилка)
- •If условие then
- •If условие then
- •3. Цикл
- •1.4.5. Примеры разработки программ
- •1.5. Массивы
- •1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
- •1.5.2. Примеры программ с массивами
- •1.614. Структура паскаль-программы
- •Часть.Подпрограммы
- •2.1. Общие сведения о подпрограммах
- •2.2. Процедуры в Паскале
- •2.2.1.Описание процедур
- •2.2.2. Обращение к процедуре
- •2.3. Функции Паскаля
- •2.3.1. Описание функций
- •2.3.2. Обращение к функции
- •2.4. Глобальные и локальные имена
- •2.5. Использование подпрограммы в качестве параметра другой подпрограммы
- •2.6. Модули
- •2.6.1. Общие сведения
- •2.6.2. Структура модуля
- •2.6.3. Использование модулей
- •2.6.4. Модули как средство программирования
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации
- •3.1.1. Символьный тип
- •3.1.2.Строковые типы
- •3.1.3. Подпрограммы, работающие со строками
- •Функции
- •Процедуры
- •3.2. Тип запись
- •3.3. Файлы
- •3.3.1. Общие понятия
- •3.3.2. Файлы в Турбо Паскале
- •3.3.3. Текстовые файлы
- •Пример 1
- •Пример 2
- •3.3.4. Типизированные файлы
- •3.3.5. Нетипизированные файлы
- •Часть IV. Работа с динамическими массивами
- •О статическом и динамическом распределении памяти
- •Указатели в Паскале
- •Динамические массивы
- •Формальные параметры-массивы без указания границ
- •Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
- •Режимы компиляции программы, использующей модули
- •Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения
- •Сохранение консольного приложения.
- •Отладка программы
- •Контрольные вопросы
- •Заключение
- •Библиографические ссылки
- •Содержание
- •Часть IV. Работа с динамическими массивами 98
2.5. Использование подпрограммы в качестве параметра другой подпрограммы
Использование параметра-подпрограммы необходимо, когда некоторый алгоритм, описанный как подпрограмма, применим к множеству алгоритмов, каждый из которых также задается подпрограммой.
Классические примеры таких ситуаций дают численные методы. В подпрограммах численных методов (вычисления определенного интеграла, нахождения экстремумов и нулей функций, вывода графиков, линий уровня, таблиц функций) обрабатываемые функции задаются как параметры. Средства для использования параметров-подпрограмм имеются во всех алгоритмических языках, предназначенных для решения вычислительных задач (СИ, Фортран, ПЛ/1).
В рассматриваемых версиях Паскаля процедура-формальный параметр должна быть описана с помощью ранее объявленного процедурного (функционального) типа. При объявлении этого типа описывается структура заголовка подпрограммы, т.е. дается заголовок без имени подпрограммы. Примеры процедурных типов:
TYPE PROC1=PROCEDURE(a,b,c:real; var d:integer);
FUNC1=FUNCTION : REAL;
G=FUNCTION (x,y,z:real);
Подпрограмма-фактический параметр должна соответствовать процедурному типу формального параметра, т.е. иметь такой же заголовок с точностью до обозначений.
Замечания
Имена стандартных подпрограмм нельзя использовать в качестве фактических параметров.
В языках BorlandPascalиTurboPascalподпрограммы, используемые как фактические параметры, должны компилироваться с использованием "дальней модели памяти" , поэтому в программу надо включить директивы компилятора {$F+} и {$F-} или поставить стандартную директиву far (для версий начиная сTurboPascal6.0) cразу за заголовком подпрограммы.
Пример 1.Решение двух уравнений на отрезке [0,3] c погрешностью 0.0001.
program primer2_5;
Type fn=function(x:real):real;{функциональный тип, задающий
вид уравнения}
Var r1,r2:real; {коpни уpавнений}
{$F+} {опция дальнего вызова, в ObjectPascalне надо}
function fx1(x:real):real; {fx1 задает первое уравнение}
begin
fx1:=1.0/(1.2*sin(x)/cos(x)+sqrt(x+1));
end;
function fx2(x:real):real; {fx2 задает второе уравнение}
begin
fx2:=(exp(-x)-sqrt(exp(x))+3.7)/3.0;
end;
{$F-} { В Object Pascal не надо }
{root– подпрограмма вычисления корня}
{уравнения fx(x)=0 на [a,b] c погрешн.е методом простых итераций}
function root(fx:fn; a,b,e:real):real;
{fx - функция – формальный параметр}
var x,x0:real;
begin
x0:=(a+b)/2; x:=fx(x0);
while abs(x-x0)>e do
begin
x0:=x; x:=fx(x0);
end;
root:=x;
end;
begin
r1:=root(fx1,0,3,1.0e-4);{fx1 - функция - факт. параметр}
r2:=root(fx2,0,3,1.0e-4);{fx2 - функция - факт. параметр}
writeln('Коpень пеpвого уpавнения r1=',r1:7:4);
writeln('Коpень втоpого уpавнения r2=',r2:7:4);
end.
Пример 2. Предположим, что функцияrootрешения уравнения из примера 1 является библиотечной подпрограммой и не подлежит изменению. Пусть надо решить уравнение, заданное с точностью до параметраp,например, p задается вводом:
x – p cosx=0.
В программе надо обратиться к root, подставив вместо формального параметраfxфактический
g(x,p)= x – p cosx.
Но g имеет два аргумента, аfx один. Выход из этой ситуации состоит в том, чтобы параметрр считать глобальным. Программа решения уравнения приведена ниже; предполагается, что типfn и функцияrootимеются в подключенной к программе библиотеке.
Varp{глобальная переменная для функцииg},
E{погрешность решения уравнения},A,B{границы отрезка}:real;
function g(x:real):real;
begin
g:=x-p*cos(x)
end;
begin
writeln(‘Введите p,A,B,E’);
readln (p,A,B,E );
writeln(‘ корень уравнения равен ‘,root(g,A,B,E));
readln
end.