ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 6805
Скачиваний: 51
236
•раздел операторов функции должен содержать хотя бы один оператор присваивания имени
функции;
• обращение к функции - не оператор, а выражение вида
<имя функции> (<список фактических параметров>).
Функции (и процедуры) могут использовать свое имя в собственном описании, т.е. могут
быть рекурсивными.
Пример:
составим программу, которая для заданных четырех натуральных чисел а, b, с, d
напечатает наибольшие общие делители первой и второй пар чисел и сравнит их по величине.
В программе определим
рекурсивную функцию
nod(x,y) по формулам
|
x, если у = 0
nod(x,y) = | nod(y.x). если х < у
| nod(x mod у,у), если х > у
Применяя эти формулы к числам 21 и 15, последовательно находим nod(21,15) = nod(6,15) =
nod(15,6) = nod(3,6) = nod(6,3) = nod(0,3) = nod(3,0) = 3.
Программа 19
program four;
var a,b,c,d,m,n:integer;
function nod(x,у:integer):integer;
var h:integer;
begin
if y=0 then h:=x
else if x<y then h:=nod(y,x)
else h:=nod(x mod у, у);
nod: =h end;
begin
writeln('введите 4 натуральных числа');
read(а,Ь,с,d); writeln;
m:=nod(a,b); n:=nod(c,d);
writeln('нод(',а,',',b,
'
)=',m);
writeln('нод(',c,',',d,')=',n);
if m>n then writeln('первый > второго')
else if m<n then writeln ('первый < второго')
else writeln('нод пар равны') end.
Внешние библиотеки.
Как известно, подпрограммы (процедуры и функции) используются
в программах с целью их структурирования, а также при многократных повторениях некоторых
частей программы. Процедуры и функции описываются в программных единицах в разделе опи-
сания подпрограмм. Они являются внутренними для этих программных единиц.
Бывают случаи, когда одни и те же подпрограммы могут использоваться в различных про-
граммах одного и даже нескольких пользователей. В подобных ситуациях целесообразно созда-
вать внешние подпрограммы, которые можно в необходимый момент подключать в любые про-
граммы. Как правило, внешние подпрограммы объединяют в отдельные пакеты, так называемые,
библиотеки внешних подпрограмм. Могут создаваться личные библиотеки, специализированные
библиотеки коллективного пользования и др. С одной из таких библиотек - встроенной библиоте-
кой стандартных подпрограмм - пользователи имеют дело практически всегда. В состав этой биб-
лиотеки входят процедуры и функции вычисления значений ряда элементарных функций: синуса,
косинуса, экспоненты и т.д., процедуры и функции обработки символьных величин, процедуры
ввода-вывода и др. (список их приведен в конце § 3). Встроенная библиотека подключается к лю-
бой программе автоматически при компиляции. Поэтому откомпилированный файл с расширени-
ем .corn (иногда называемый «комовским»), как правило, занимает в 8 -10 раз больше места в па-
мяти, чем исходный текст.
Внешние подпрограммы создаются обычным образом в виде отдельного файла или файлов.
237
Для подключения внешних подпрограмм в программе пользователя в разделе описания ставится
директива $I имя файла. С этого момента все процедуры и функции внешнего файла становятся
внутренними для программы, и на все входящие в него процедуры и функции распространяется
правило локальных и глобальных переменных. В этой связи, директива подключения внешнего
файла должна размещаться после описания всех ею используемых глобальных параметров, проце-
дур и функций.
Пример.
Создадим внешнюю библиотеку из двух процедур и одной функции. Первая про-
цедура программы 20 очищает экран, выдает приветствие, затем после нажатия клавиши <Про-
бел> снова очищает экран. Вторая процедура возводит число а в степень b. Третья подпрограмма-
функция вычисляет значение экспоненты с некоторым грубым приближением на основе ряда Тей-
лора.
Программа 20
procedure PRIVET;
var a: char;
begin
cirscr; gotoxy(20,10) ;
write('здравствуйте , желаю успехов !') ;
repeat (цикл позволяет)
gotoxy(35,50);write('пробел'); (сменить экран}
read(kbd,а); (по нажатию клавиши)
until а='
'; (*
'пробел' )
cirscr;
end;
procedure STEPEN(a,b:real;var y:real);
begin
y:=exp(b*ln(a)) ;
end;
function MEXP(x:real):real;
begin
mexp:=l+x+x*x/2+x*x*x/6+x*x*x*x/24;
end;
Пусть представленные три подпрограммы записаны в файл с именем lab.pas. А теперь со-
ставим программу, использующую созданную внешнюю библиотеку.
Программа 21
program primeri;
($i lab) (директива подключения библиотеки} var a,b : real;
begin
PRIVET;
STEPEN(2,4,a); writeln('2 в степени 4 =',a); b:=MEXP(l);
write('машинная exp(1)=',EXP(1):6:4,' моя exp(1)=',b:6:4);
end.
В программе используется стандартная функция - экспонента ЕХР(1) и наша подпрограмма
МЕХР(1).
Модули
используют в более поздних версиях Паскаля для создания библиотек и разделе-
ния больших программ на логически связанные независимые друг от друга составные части. В со-
став модуля входят следующие разделы: заголовок, интерфейс, реализация, инициализация. Заго-
ловок необходим для ссылок на модуль. Интерфейс содержит объявления, включая процедуры и
функции, представленные списком заголовков и доступные пользователям в теле основной про-
граммы. Раздел «реализация» содержит тела процедур и функций, перечисленных в интерфейсной
части модуля. Раздел «инициализация» содержит операторы, необходимые для инициализации
модуля. Таким образом модуль - это набор констант, типов данных, переменных, процедур и
функций. Каждый модуль компилируется отдельно; результат компилляции - файл с расширением
.tpu (Turbo Pascal Unit). Каждый элемент модуля можно использовать в программе пользователя
без дополнительного объявления, для чего достаточно записать имя используемого модуля в ди-
238
рективе Uses в начале программы после его заголовка.
В Турбо-Паскале версии 5.0 и выше применяют стандартные модули CRT, GRAPH и др. В
этих модулях содержатся сервисные процедуры и функции по работе с экраном дисплея, с клавиа-
турой, графическими примитивами и т.п. Модули подключаются к программе путем специальной
команды, размещаемой сразу после заголовка:
uses <имя модуля>
Программист может сам создать модуль. Ниже приведен пример с соответствующими ком-
ментариями.
Пример.
Создать модуль, дополняющий математические возможности Паскаля арифмети-
ческими действиями над комплексными числами.
Будем представлять комплексные числа парами действительных: (а, b). Как известно, дей-
ствия над ними выполняются по правилам
(a,b) + (c.d) = (a+c,b+d),
(a,b)-(c,d)=(a-^,b-d),
(a,b) * (c,d) = (a*c-b*d , a*d+b*c),
(a,b) / (c,d) = ( (a*c+b*d)/(c*c+d*d), (b*c-a*d)/(c*c+d*d)).
Создаваемый модуль будет включать четыре процедуры: Sum - сумма,
Raz -разность, Proiz
- произведение, Chastn - частное.
Этот модуль может быть отдельно откомпилирован. После этого любая программа, напи-
санная на Паскале, может получить доступ к интерфейсным объектам (в данном случае - процеду-
рам) этого модуля с помощью директивы Uses CompChisla.
Обратим внимание, что в интерфейсной части модуля от процедур присутствуют лишь за-
головки, а в части «реализация» от заголовков процедур остаются лишь их имена.
Программа 22
unit CompChisla;
interface
procedure Sum(a,b,c,d: real; var
x,y:
real);
procedure Raz(a,b,c,d: real; var
x,y:
real);
procedure Proiz (a,b,c,d: real; var
x,y:
real);
procedure Chstn(a,b,c,d: real; var
x,y:
real);
implementation
procedure Sum;
begin
x:=a+c;
y:=b+d end;
procedure Raz;
begin
x:=a-c; y:=b-d end;
procedure Proiz;
begin x:=a*c-b*d; y:=a*d+b*c
end;
procedure
Razn;
var z:real;
begin z:= c*c+d*d; x:=(a*c+b*d)/z; y:=(b*c-a*d)/z end;
end.
Контрольные вопросы
1. Какова структура процедуры? функции?
2. Какие параметры называют формальными и какие - фактическими?
3. В чем различие между локальными и глобальными переменными?
4. В чем сходство и различие между процедурой и модулем?
3.5. РАБОТА С ФАЙЛАМИ
239
Файл (последовательность) - это одна из наиболее фундаментальных структур данных.
Программная организация компьютеров,
их связь с внешними устройствами основаны на файло-
вой структуре.
Файлы позволяют решить две проблемы:
1) возможность формирования и сохранения значений для последующего использования
другими программами (например, в программах многократной обработки информационных сис-
тем, таких как платежные ведомости, различные АСУ, базы данных, необходимость длительного
хранения информации очевидна);
2) взаимодействие программ с внешними устройствами ввода-вывода: дисплеем, принте-
ром, АСП и т.п.
В Паскале эти проблемы снимаются с помощью структурированных данных файлового ти-
па.
Файловый тип данных в программе задается следующем образом:
type <имя файлового типа> = file of <тип компонентов>
В качестве типа компонентов файла разрешается использовать любой тип данных, кроме
файлового. Например:
type
intfile = file of integer;
refile = file of real;
chfile = file of char;
ran = 1 .. 10;
st = set of ran;
vector = array[ran] of real;
comp = record
re,im : integer;
end;
setfile=file of st;
vecfile = file of vector;
compfile= file ofcompt;
Описание файловой переменной задается обычным способом в разделе описаний. Напри-
мер:
var f: intfile; или var f: file of integer;
Файловая переменная является буфером между Паскаль-программой и внешним устройст-
вом и должна быть логически с ним связана. Связь осуществляется оператором языка Паскаль:
assign (<имя файловой переменной>,'<имя устройства>
'
)
Как правило, файлы для хранения данных связаны с устройством внешней памяти на маг-
нитных носителях (дисковод) и носят название
внешние файлы
. Если, например, файл с именем
primer, dat логически связан с дисководом А:, то все данные, помещаемые в файл, будут храниться
на этом дисковом накопителе, a
установка «окна» между программой и файлом будет определять-
ся через файловую переменную f оператором
assign (f, 'primer.dat')
Если внешним устройством является принтер, то связь осуществляется оператором assign(f,
'1st:'). Здесь 1st - логическое имя печатающего устройства. Ниже приведены логические имена
внешних устройств ввода-вывода:
240
con - консоль; trm - терминал; kbd - клавиатура; 1st - принтер; aux - буфер сети;
usr-драйвер пользователя.
После осуществления связи файловая переменная f отождествляется с соответствующим
файлом.
Для работы с файлом его необходимо открыть, а по окончании работы — закрыть Файл от-
крывается для чтения оператором reset(f), для записи - оператором rewrite(f).
Чтение и запись данных осуществляется известными командами read/write, только в начале
списка помещается имя файловой переменной:
read (f, <список ввода>); readln (f, <список ввода>);
write(f, <список вывода>); writeln(f, <список вывода>).
Закрытие файла осуществляется командой close(f).
УСЛОВНО
файл можно представить в виде ленты, у которой есть начало, а конец не фикси-
руется. Компоненты файла записываются на эту ленту последовательно, друг за другом:
Здесь т.м. - текущий маркер, указывающий на рабочую позицию (окно) файла; м.к. (маркер
конца файла) - специальный код, автоматически формируемый вслед за последним элементом
файла.
Такого рода файлы называются
файлами последовательного доступа
. В исходной версии
Паскаля
файлов прямого доступа
, для которых можно непосредственно «достать» любую ком-
поненту, не предусмотрено; однако, в Турбо-Паскале элементы прямого доступа есть (например,
через функцию seek, см. ниже).
Команда rewrite(f) - открыть файл для записи - устанавливает файл в начальное состояние
режима записи; текущий маркер устанавливается на маркер конца файла. Если в файле f до этого
была информация, то она уничтожается.
В открытом для чтения командой reset(f) файле текущий маркер устанавливается на нуле-
вое состояние, однако содержимое файла не утрачивается.
Команда закрытия файла close (Q обязательна, поскольку эта команда формирует маркер
конца файла, что в большинстве случаев является необходимым нaпpимep, для работы с функцией
eof(f), см ниже).
В системе Турбо-Паскаль предусмотрены встроенные функции по работе с файлами:
filesize(f) - текущее количество компонент открытого файла;
filepos(f) -номер текущей позиции маркера;
геnamе (f,имя) - переименование файла, связанного с f;
erase(f) -уничтожение файла;
execute(f) - выполнение СОМ-файла;
chain(f) -выполнение CHN-файла;
seek(f,N) - устанавливает маркер на позицию N;
eof(f) - возвращает TRUE, если найден конец файла;
ealn(f) - возвращает TRUE, если найден конец строки.
На практике широко используются
текстовые файлы
, которые состоят из литерных (логи-