Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6805

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

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 раз больше места в па-
мяти, чем исходный текст. 

Внешние подпрограммы создаются обычным образом в виде отдельного файла или файлов. 


background image

 

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).  Каждый  элемент  модуля  можно  использовать  в  программе  пользователя 
без дополнительного объявления, для чего достаточно записать имя используемого модуля в ди-


background image

 

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. РАБОТА С ФАЙЛАМИ 


background image

 

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  -  логическое  имя  печатающего  устройства.  Ниже  приведены  логические  имена 
внешних устройств ввода-вывода: 


background image

 

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, если найден конец строки. 
 
На практике широко используются 

текстовые файлы

, которые состоят из литерных (логи-