рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Процедурные типы

Процедурные типы - раздел Транспорт, От автора Язык Паскаль Позволяет Использовать В Программе Данные Типа “Процедура” Или Т...

Язык Паскаль позволяет использовать в программе данные типа “процедура” или типа “функция”. Такие данные можно передавать как аргументы подпрограмм, можно описывать и использовать массивы процедур и массивы функций. Тип “процедура” описывается в операторе Type следующим образом:

Type имя типа=Procedure(список параметров);

Описание процедурного типа отличается от заголовка процедуры только отсутствием имени процедуры, список параметров записывается обычным образом. Если такой оператор Type есть в программе, то все дальние процедуры, записанные ниже и имеющие столько же параметров таких же типов (имена параметров значения не имеют), автоматически становятся объектами этого типа. Процедура называется дальней, если она откомпилирована в режиме F+, этого можно добиться двумя способами: или используя соответствующую опцию компилятора :

{$F+} Procedure A(x:Real; c:Char); Begin...End; {$F-},

или записав после заголовка процедуры атрибут Far:

Procedure A(x:Real; c:Char); Far; Begin ... End;

Опция {$F+} действует до ее отмены опцией {$F-} или до конца программы, а атрибут Far - только на данную процедуру. Дальние объекты в программе имеют четырехбайтовые адреса, состоящие из сегмента и смещения, а ближние объекты имеют двухбайтовые адреса, содержащие только смещение, поскольку все они хранятся в одном сегменте данных. Если процедура находится в модуле, то она является дальней по умолчанию. Функциональный тип описывается так же, как процедурный:

Type имя типа=Function(список параметров):тип;

Данные функционального типа также обязаны иметь дальние адреса. Попробуем применить процедурные типы в реальной задаче. Вспомним алгоритм решения уравнения методом бисекции, описанный в разделе 17. Предположим, что нам требуется решить не одно уравнение, а много уравнений с различными левыми частями. Вместо того чтобы писать много практически одинаковых программ (они будут отличаться только одной функцией) или каждый раз модифицировать программу перед запуском, опишем соответствующий функциональный тип и будем передавать методу бисекции функцию как параметр. Чтобы не записывать несколько операторов вызова метода бисекции, опишем массив функций и будем обрабатывать их в цикле. Такая структура программы позволяет очень легко добавлять новые уравнения.

 

Const N_Func = 4; {количество уравнений - пока их четыре}

Type

T_Func = Function (x:Real):Real; {тип левой части уравнения}

T_Func_Array = Array[1..N_Func] Of T_Func; {тип массива функций}

T_Num_Array = Array[1..N_Func] Of Real; {тип числового массива}

 

Function f1(x:Real):Real; Far; Begin f1:=Sqr(x)*(Exp(-x)-1)+1; End;

Function f2(x:Real):Real; Far; Begin f2:=x*Sqr(Sqr(x))-Ln(2+Sqr(x)); End;

Function f3(x:Real):Real; Far; Begin f3:=Sqr(Sqr(x))*(Exp(-2*x)-1)+2; End;

Function f4(x:Real):Real; Far; Begin f4:=ArcTan(1+Sqr(x))-x*Sqr(x)/3; End;

 

Function Bisection(a,b:Real; f:T_Func):Real; {функция находит корень уравнения f(x)=0 на отрезке [a,b], функция f, вычисляющая левую часть уравнения, передается как параметр}

Var x,Fa,Fx : Real;

Begin

Fa:=f(a); x:=(a+b)/2;

While (x<>a)And(x<>b) Do Begin

Fx:=f(x); If Fx*Fa<0 Then b:=x Else a:=x; x:=(a+b)/2;

End;

Bisection:=x;

End;

 

Const

f : T_Func_Array = (f1,f2,f3,f4); {массив функций}

a : T_Num_Array =(0,0,0,0); { массив левых концов отрезка [a,b]}

b : T_Num_Array =(5,5,5,5); { массив правых концов отрезка [a,b]}

Var

n : Byte;

Root : Real;

Begin

WriteLn;

For n:=1 To N_Func Do Begin

Root:=Bisection(a[n],b[n],f[n]);

WriteLn('f',n,'(',Root:0:3,')=',f[n](Root):0:6);

End;

End.

 

Программа выведет

f1(1.197)=-0.000000

f2(1.022)=0.000000

f3(1.217)=-0.000000

f4(1.570)=-0.000000

 

– Конец работы –

Эта тема принадлежит разделу:

От автора

B r... Теперь мы можем присвоить переменным их значения...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Процедурные типы

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

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

Round(x) - округленное до целого вещественное число, преобразованное к типуLongInt
6. Sqr(x) - квадрат числа 7. Sqrt(x) - квадратный корень 8. Exp(x) - экспонента 9. Ln

Символьный тип данных
Для хранения символьной информации в Паскале предусмотрен специальный тип данных Char. Допустимы переменные, нетипизированные и типизированные константы такого типа. Данные типа

Caseвыражение Of
список значений : оператор/блок .................................. список значений: оператор/блок

Процедуры и функции. Сфера действия описаний
В языке Паскаль (как вы уже поняли из предыдущего материала) существуют понятия процедуры и функции. Процедуры и функции можно определить как замкнут

Открытые массивы и нетипизированные параметры
Из предыдущего раздела мы узнали, что параметры подпрограмм описываются как [Var] имя : имя типа , это правда, но не вся правда - существует еще два

Множества
Понятие множества в Паскале очень близко к математическому определению: множество - это совокупность однотипных неиндексированных объектов. Множества

Графические средства языка Паскаль
Монитор персонального компьютера может работать в двух режимах - текстовом и графическом. Все, что мы делали до сих пор, мы делали в текстовом режиме. Текстовый экран содержит 2000 знако

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

Case тип Of
константа 1 : (описание поля); константа 2 : (описание поля); .....................

Модуль Crt
Crt - еще один стандартный модуль Паскаля, в котором содержатся разнообразные средства консольного ввода-вывода (то есть ввода с клавиатуры и вывода на текстовый экран). Процедуры

Var TextAttr : Byte
В ней содержится текущий цвет фона и цвет символов, используемые при выводе на экран процедурами Write иWriteLn. Изменив эту переменную, вы задаете новый

Другие средства обработки файлов и модуль DOS
Для того чтобы определить, есть ли на диске файл с заданным именем, удобно использовать уже известную нам стандартную функцию IOResult , которая возвращает ноль при успешном завершении последней оп

Type SearchRec=Record
Fill : Array[1..21] of Byte; Attr : Byte; Time : LongInt; Size : LongInt; Name : Stri

Указатели и динамическая память
Указателями называются переменные и константы, значениями которых являются адреса. Различаются два вида указателей - обобщенные указатели и

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

Открытые строки
  Открытыми строками, или длинными строками, или C-строками, называются символьные последовательности длиной до 65535 символов, ограниченные справа нуль-символ

Использование командной строки и вызов внешних программ
Паскаль позволяет передавать информацию в программу при ее запуске через командную строку. Для этого служат две стандартные функции -ParamCount и ParamStr.

Обработка программных прерываний
Программное прерывание - это ситуация, возникающая, когда дальнейшее выполнение программы невозможно. Например, деление на ноль, переполнение, ошибка Range check error, обращение по неверному адрес

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

Type имя типа=Object
описание полей описание методов End; Поля объектов описываются так же, как поля записей, а описание метода - это заголовок процедуры или функции. Сами методы распол

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

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

Стеки и очереди
Значение стека как структуры данных в программировании не исчерпывается лишь стеком отложенных заданий. В этом разделе мы решим с помощью стека задачу о вычислении значения арифметического выражени

Комбинаторные алгоритмы
В этом разделе мы рассмотрим три наиболее важные задачи комбинаторики: нахождение всех подмножеств множества из n элементов; нахождение всех выборок по m элементов из n элементов и нахождение всех

Бинарные деревья
В этом разделе мы рассмотрим различные алгоритмы обхода бинарного дерева. К алгоритмам создания бинарного дерева мы обратимся несколько позже, а пока будем считать, что дере

Упорядоченные бинарные деревья и приоритетные очереди
Упорядоченным бинарным деревом, или бинарным деревом поиска, называют дерево, в любой части которого элементы левого поддерева меньше корневого элеме

Алгоритмы сортировки
В этом разделе мы рассмотрим различные алгоритмы решения задачи сортировки. Задача сортировки ставится следующим образом: дана последовательность записей R1,R

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги