Технические дисциплины - Информатика

Параметры-константы.

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

PROCEDURE <имя процедуры> (CONST <имя константы>: <тип>; ...);

FUNCTION <имя функции> (CONST <имя константы> : <тип> ; ...): <тип результата> ;

Параметр-константу нельзя передавать в качестве параметра в другую подпрограмму.

Параметры-процедуры и параметры-функции.

Для объявления процедурного типа используется заголовок подпрограммы , в котором опускается имя процедуры(функции).

Например:

TYPE

TPR1= PROCEDURE( X,Y : REAL; VAR Z : REAL);
TPR2= PROCEDURE ;
TF1= FUNCTION: STRING;
TF2=FUNCTION ( VAR S: STRING) : REAL;

Ниже приведен пример использования функции FF в качестве параметра другой функции RR.

USES CRT;
TYPE FUN=FUNCTION (X,Y: REAL): REAL;
VAR ...
FUNCTION FF (X,Y: REAL): REAL; FAR;
...
BEGIN
...
END;
FUNCTION RR (X,Y: REAL; F : FUN): REAL; FAR;
...
BEGIN
...
END;
PROCEDURE TP (VAR Z : REAL; X,Y: REAL; CONST R: INTEGER);
...
BEGIN
...
END ;
BEGIN
...
Z:=RR(3 , 1 , FF);
TP (Z,X,Y,R);
...
END.

В этом примере используются :

  • X,Y - параметры-значения;
  • Z- параметр-переменная;
  • F- параметр-функция;
  • R- параметр-константа.

наверх

4.5. Область действия имен.

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

На рисунке схематично представлены области действия отдельных идентификаторов:

 

Y - локальная переменная по отношению к блоку 4, недоступна в блоках 1,2,3.

K, L - локальная переменная для блока 2, недоступна в блоках 1,3,4.

C - глобальная переменная по отношению к блоку 3, недоступна в блоках 1 и 2.

B, D- глобальные переменные для блоков 2,3,4.Доступны в блоках 1,2,3,4.

T - общий тип

Идентификатор А обозначает две разные переменные : А - областью действия которой являются блоки 1 и 2, и переменная А' - область действия которой блоки 3 и 4 . То же самое с именем Х: одна переменная Х - с областью действия 1,2 и 3 блоки и переменная Х', которая действует только в блоке 4.

Если подпрограмма имеет параметры, то идентификаторы из списка формальных параметров являются локальными для этой процедуры(функции) и глобальными для каждой подпрограммы в ней (если таковые имеются) .

наверх

4.6. Процедуры и функции без параметров.

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

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

наверх

4.7. Рекурсивные процедуры и функции.

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

Рекурсия может быть прямой или косвенной. При прямой рекурсии оператор вызова подпрограммы содержится непосредственно в ее исполняемой части. Любую рекурсивную процедуру (функцию) можно сделать не рекурсивной. Рекурсивное описание обычно короче и нагляд-нее, но требует больших затрат машинного времени (за счет повторных обращений) и памяти машины (за счет дублирования переменных) . Рекурсивная подпрограмма однократно вызывается извне. Условие полного окончания работы рекурсивной процедуры или функции должно находиться в ней самой.

Рассмотрим пример. Вычислить значение F=M! Рекурсивное определение значение факториала можно записать следующим образом:

при М=1 F=1
при М> 1 F= M!= M*(M-1)!, т.е. М! определяется через (М-1)!


a) Рекурсивная функция

PROGRAM MAIN;
VAR M: INTEGER;

F:REAL;

FUNCTION FACT (N:INTEGER): REAL;
BEGIN

IF N=1 THEN

FACT:=1

ELSE

FACT:= N* FACT(N-1);

END;
BEGIN

READLN(M);
F:= FACT ( M );
WRITELN (' M!=', F);

END.

b) Рекурсивная процедура

PROGRAM MAIN;
VAR M: INTEGER;

F:REAL;

PROCEDURE FACT(N:INTEGER; VAR F: REAL);
VAR Q : REAL;
BEGIN

IF N=1 THEN Q:=1

ELSE FACT(N-1,Q);

F:=N*Q;

END;
BEGIN

READLN(M);
FACT ( M, F );
WRITELN (' M!=', F);

END.

B варианте а) при м=4 выполняются следующие действия:

FACT:=4*FACT(3); FACT:=3*FACT(2); FACT:=2*FACT(1); FACT(1):=1.

При входе в функцию в первый раз отводится память под локальную переменную, соответствующую параметру-значению; ей присваивается значение фактического параметра (М). При каждом новом обращении строятся новые локальные переменные. Так как FACT(1)=1, то выполнение функции заканчивается. После этого выполняются действия:

FACT(1):=1; FACT:=2*FACT(1);
FACT(2):=2; FACT:=3*FACT(2);
FACT(3):=3*2=6; FACT:=4*FACT(3); т.е. FACT=24

наверх

4.8. Предварительно-определенные процедуры.

При косвенной рекурсии одна подпрограмма вызывает другую, которая либо сама, либо посредством других подпрограмм вызывает исходную. В этом случае используется предварительное описание процедур (функций), так как в языке Турбо Паскаль все процедуры и функции должны быть описаны до их вызова. В этом случае отдельно от текста процедуры (функции) записывается ее заголовок и к нему после символа ";" добавляется ключевое слово FORWARD. Сам текст подпрограммы начинается урезанным заголовком, в котором задается только ее имя, а список параметров (и тип результата для функции ) отсутствует.

Например:

PROGRAM KOSV_R;

VAR X,Y: INTEGER;

PROCEDURE LR ( A : INTEGER); FORWARD;
PROCEDURE TT (B: INTEGER);
...
BEGIN
...

LR (...);

END;
PROCEDURE LR ;
...
BEGIN
...

TT(...) ;

...
END;
BEGIN
...

TT( X) ;
LR(Y);

...
END.

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

 

 

36-38.Записи в Турбо Паскале

Запись - это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.

Структура объявления типа записи такова:

<имя типа> = RECORD <сп.полей> END

Здесь <имя типа> - правильный идентификатор;

RECORD, END - зарезервированные слова (запись,конец); <сп.полей> - список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой.

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором (идентификаторами) ставится двоеточие и описание типа поля (полей), например:

type

BirthDay = record

day,month : Byte;

year : Word

end;

var

a,b : Birthday;

…….

В этом примере тип BIRTHDAY (день рождения) есть запись с полями DAY, MONTH и YEAR (день, месяц и год); переменные А и В содержат записи типа BIRTHDAY.

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

а := b;

К каждому из компонентов записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля:

а.day := 27;

b.year := 1939;

Для вложенных полей приходится продолжать уточнения:

type

BirthDay = record

day,month: Byte;

year : Word

end;

var

с : record

name : String;

bd : BirthDay

end;

begin

…..

if c.bd.year = 1939 then …

end.

Чтобы упростить доступ к полям записи, используется оператор присоединения WITH:

WITH <переменная> DO <оператор>

Здесь WITH, DO - ключевые слова (с, делать);

<переменная> - имя переменной типа запись, за которым, возможно, следует список вложенных полей; <оператор> - любой оператор Турбо Паскаля.

Например:

with c.bd do month := 9;

Это эквивалентно

with с do with bd do month := 9;

или

with c,bd do month := 9;

или

c.bd.month := 9;

Турбо Паскаль разрешает использовать записи с так называемыми вариантными полями, например:

type

Forma = record

Name: String;

case Byte of

0: (Birthplace: String [40]);

1: (Country : String [20];

EntryPort : String [20];

EntryDate : 1. . 31;

ExitDate : 1..31)

end;

В этом примере тип FORMA определяет запись с одним фиксированным полем NAME и вариантной частью, которая задается предложением CASE… OF. Вариантная часть состоит из нескольких вариантов (в примере - из двух вариантов: 0 и 1). Каждый вариант определяется константой выбора, за которой следует двоеточие и список полей, заключенный в круглые скобки. В любой записи может быть только одна вариантная часть, и, если она есть, она должна располагаться за всеми фиксированными полями.

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

var

mem4 : record case Byte of

0 : (by : array’[0..3] of Byte);

1 : (wo : array [0..1] of Word);

2 : (lo : longint);

end;

В этом примере запись МЕМ4 имеет три варианта, каждый из которых занимает в памяти один и тот же участок из 4 байт. В зависимости от того, к какому полю записи мы обращаемся в программе, этот участок может рассматриваться как массив из 4 байт (поле ВТ), массив из двух целых типа WORD (поле WO) или, наконец, как одно целое число типа LONGINT (поле LO). Например, этой записи можно сначала присвоить значение как длинному целому, а затем проанализировать результат по байтам или словам:

var

х : Word;

xb: Byte;

x1: Longint;

begin

…..

with m do

begin

lo := trunc(2*pi*x);

if wo[1] = 0

then if by[l] = 0 then

xb := x[0]

else

x := wo[0]

else

x1 := lo

end;

…..

end.

Предложение CASE… OF, открывающее вариантную часть, внешне похоже на соответствующий оператор выбора, но на самом деле лишь играет роль своеобразного служебного слова, обозначающего начало вариантной части. Именно поэтому в конце вариантной части не следует ставить END как пару к CASE… OF. (Поскольку вариантная часть - всегда последняя в записи, за ней все же стоит END, но лишь как пара к RECORD). Ключ выбора в предложении CASE… OF фактически игнорируется компилятором: единственное требование, предъявляемое к нему Турбо Паскалем, состоит в том, чтобы ключ определял некоторый стандартный или предварительно объявленный порядковый тип. Причем сам этот тип никак не влияет ни на количество следующих ниже вариантных полей, ни даже на характер констант выбора. В стандартном Паскале в качестве ключа выбора необходимо указывать некоторую переменную порядкового типа, причем в исполняемой части программы можно присваивать значение этой переменной и таким образом влиять на выбор полей. В Турбо Паскале также можно в поле ключа выбора указывать переменную порядкового типа и даже присваивать ей в программе значение, что однако не влияет на выбор поля: значения констант выбора в Турбо Паскале могут быть произвольными, в том числе повторяющимися, например:

type

reel = record

a : Byte;

b : Word;

end;

rec2 = record

с : longint;

case x : Byte of

1 : (d : Word);

2 : (e : record

case Boolean of

3 :( freel);

3 :( g Single);

‘3′:( с Word);

end)

end;

var

r : rec2;

begin

r.x := 255;

if r.e.g = 0 then

WriteLn(’O.K. ‘)

else

WriteLn(r.e.g)

end.

В этом примере предложение

case Boolean of

в записи, определяемой в поле Е, объявляет ключом выбора логический тип, который, как известно, имеет лишь два значения - TRUE и FALSE. Константы же выбора следующих далее вариантов не только содержат совершенно не свойственные этому типу значения, но и две из них повторяются, а общее количество вариантов - три, а не два, как следовало бы ожидать.

Имена полей должны быть уникальными в пределах той записи, где они объявлены, однако, если записи содержат поля-записи, т.е. вложены одна в другую, имена могут повторяться на разных уровнях вложенности.

 

39-40.Множественный тип данных Паскаля

Множественный тип данных Паскаля напоминает перечислимый тип данных. Вместе с тем множественный тип данных – набор элементов не организованных в порядке следования.

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

Понятие множества в языке программирования значительно уже математического понятия.

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

В качестве базовых типов могут использоваться:

  • перечислимые типы;
  • символьный;
  • байтовый;
  • диапазонные на основе вышеперечисленных.

Такие ограничения связаны с формой представления множественного типа данных в Паскале и могут быть сведены к тому, чтобы функция ord() для используемого базового типа лежала в пределах от 0 до 255.

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

Описание множественного типа данных Паскаля

Type <имя_типа>= set of <базовый_тип>

Пример множественного типа данных Паскаля

 
        Type symbol= set of char; {описан множественный тип symol из букв}
        Var letter, digits, sign: symbol; {описаны три переменные множественного типа}

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

sign:= [‘+’, ‘-‘];

Конструктор множества может содержать диапазон значений базового типа. Тогда во множества включаются все элементы диапазона. Например,

digits:= [‘0’ .. ‘9’];
letter:= [‘a’ .. ‘z’];

Обе формы конструирования множеств могут сочетаться. Например,

letter:= [‘a’ .. ‘z’, ‘A’ .. ‘Z’];

Конструктор вида [] обозначает пустые множества.

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

Const YesOrNo= [‘Y’, ‘y’, ‘N’, ‘n’];

Можно множественный тип определить как типизированную константу:

Const digits: set of char= [‘0’ .. ‘9’];

При описании множественного тип как констант допускается использование знака “+” (слияние множеств). Например,

Const Yes= [‘Y’, ‘y’]; No= [‘N’, ‘n’];
YesOrNo= Yes+ No;

Операции над множественными типами Паскаля

С множественными типами Паскаля можно выполнять действия объединения, исключения и пересечения.

Объединение множественных типов содержит элементы, которые принадлежат хотя бы одному множеству, при этом каждый элемент входит в объединение только один раз. Операция объединения множеств обозначается знаком ‘+’.

Пример множественных типов Паскаля

 
Type symbol= set of char;
Var small, capital, latin: symbol;
  ………………
       small:= [‘a’ .. ‘z’];
           capital:= [‘A’ .. ‘Z’];
       latin:= small + capital; {образованы множества латинских букв путем объединения множеств small и capital}

Возможно объединять множественные типы и отдельные элементы. Например,

small:= [‘c’ .. ‘z’];
small:= small + [‘a’] +[‘b’];

Исключение определяется как разность множественных типов, в котором из уменьшаемого исключаются элементы, входящие в вычитаемое. Если в вычитаемом есть элементы, отсутствующие в уменьшаемом, то они никак не влияют на результат. Операция исключения обозначается знаком ‘-‘.

Пример исключения множественных типов Паскаля

 
        letter:= [‘a’ .. ‘z’]; {множества букв латинского алфавита}
        glasn:= [‘a’, ‘e’, ‘o’, ‘u’, ‘i’, ‘y’]; {множества гласных букв}
        soglasn:= letter-glasn; {образовано множества согласных букв путем исключения из множества всех букв множества гласных букв}

Пресечение множественных типов– множества, содержащие элементы, одновременно входящие в оба множества. Операция пересечения множеств обозначается знаком ‘*’.

Пример пересечения множественных типов

 
        Type chisla= set of byte;
        Var z,x,y: chisla;
        ………..
        x:= [0..150];
        y:= [100..255];
        z:= x*y {получено множества чисел из диапазона 100..150 в результате пересечения двух множеств}

Операции отношения множественных типов Паскаля

Наряду с рассмотренными выше операциями, над значениями множественного типа определены и некоторые операции отношения. Операндами операций над множественными значениями в общем случае являются множественные выражения. Среди операций отношения над значениями множественного типа особое место занимает специальная операция проверки вхождения элемента во множества, обозначаемая служебным словом in. В отличие от остальных операций отношения, в которых значения обоих операндов относятся к одному и тому же множественному типу значений, в операции in первый операнд должен принадлежать базовому типу, а второй – множественному типу значений, построенному на основе этого базового типа. Результатом операции отношения, как обычно, является логическое значение (true или false).

 
        ‘a’ in glasn значение операции true;
        ‘o’ in soglasn значение операции false;

Операция сравнения на равенство множественных типов Паскаля. Множества считаются равными (эквивалентными), если все элементы одного множества присутствуют в другом и наоборот. Для операции сравнения на равенство или неравенство используются символы ‘=’ и ‘<>’.

 
        A:= [2,1,3];
        D:= [1,3,2];

Тогда операция A=D имеет значение true, а операция A<>D имеет значение false.

Проверка включения. Одно множество считается включенным в другое (одно множество является подмножеством другого), если все его элементы содержатся во втором множестве. Обратное утверждение может быть и несправедливым. Операции проверки включения обозначаются ‘<=’ и ‘>=’.

 
        letter >= glasn;
        soglan <= letter;

Следует отметить, что применение операций < и > над операндами множественного типа недопустимо.

 

 

41-43.Понятие "файл"

Определение.

  1. Файл - это последовательность записей, размещаемая на внешних запоминающих устройствах (внешней памяти) и рассматриваемая в процессе пересылки и обработки как единое целое. Таким образом, под файлом понимается "физическое" место на диске, имеющее имя и размер.
  2. Файл - это совокупность упорядоченных и взаимосвязанных записей, имеющая описание для идентификации отдельных записей, таким образом, файл - это структура данных.

Структура данных файл в зависимости от типа элементов делится на типизированные, текстовые и нетипизированные файлы.

А. Типизированные файлы

Типизированный файл - это файл, состоящий из последовательности элементов (называемых компонентами) одного типа. Количество компонентов файла при задании файла не ограничивается.

Так как все компоненты файла имеют одинаковую "длину", то позиция каждого компонента в файле может быть вычислена.

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

type R=File of TC,

где: File (от англ. файл), of (от англ. из) - служебные слова;
R - идентификатор типа;
TC - тип компонентов (не может быть типом File).

Отметим, что не допускается использование файловых переменных в операторах присваивания и в выражениях.

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

Над файлами можно выполнять два явных вида действий:

  1. Создание файла. Оно выполняется в результате добавления новых компонент в конец первоначально пустого файла. В процессе создания новые значения разрешается записывать только в конец файла;
  2. Просмотр файла. Он выполняется в результате последовательного продвижения по файлу, начиная с его начала. При этом в каждый момент времени доступен лишь один компонент файла. В процессе просмотра файла изменять значения компонентов на новые запрещается.

Начать писать в файл можно только с самого его начала, дописывая новые компоненты последовательно одну за другой; для чтения также надо начинать просмотр файла с самого начала. Вследствие такой организации на одном просмотре файла нельзя совмещать и чтение, и запись информации: можно либо только читать из файла, либо только писать в файл. Однако, работая с различными файлами A и B, можно одновременно читать файл A и писать в файл B (и наоборот).

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

Некоторые стандартные процедуры для последовательной работы с файлами

1. Assign (var F: File; Name: String); Assign (var F: File of Type; Name: String),

где: Assign (от англ. назначить) - имя процедуры;
F - имя файловой переменной (логическое имя файла);
Name - имя файла на диске (физическое имя файла). Это имя связывается с файловой переменной F, и в дальнейшем все операции с F будут производиться над дисковым файлом с именем Name.

После выполнения этой процедуры Name и F отождествляются, т.е. отождествляются логическое и физическое имена файла.

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

2. Reset (var F: File),

где: Reset (от англ. переустановить) - имя процедуры;
F - имя переменной файлового типа.

Процедура открывает файл F для чтения и ставит указатель на начало первого компонента файла (на компонент с номером 0).

Файловая переменная F должна соответствовать уже существующему на диске файлу, иначе возникает ошибка "I/О error" (от англ. Input/Output error - ошибка ввода-вывода).

3. Rewrite (var F: File),

где: Rewrite (от англ. установить на запись) - служебное слово;
F - имя переменной файлового типа.

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

4. Read (var F: File of Type; var V: Type),

где: Read (от англ. читать) - имя процедуры;
F - имя переменной файлового типа;
V - имя переменной (или список из нескольких переменных, разделенных запятыми), совпадающей по типу с типом Type элементов файла.

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

5. Write (var F: File of type; var V: Type),

где: Write (от англ. писать) - имя процедуры;
F - имя переменной файлового типа;
V - имя переменной (или список нескольких переменных, разделенных запятыми), совпадающей по типу с типом элементов файла Type.

Каждая переменная записывается в дисковый файл, и после окончания операции записи файловый указатель перемещается на следующий компонент файла. После окончания работы с файлом, он должен быть закрыт, иначе результат будет потерян. "Закрывает" файл процедура Close.

6. Close (var F: File),

где: Close (от англ. закрыть) - служебное слово;
F - имя переменной файлового типа.

Дисковый файл, отождествленный с переменной F, закрывается и в каталог диска вносятся необходимые изменения.

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

1. Seek (F,n),

где: Seek (от англ. искать) - имя процедуры;
F - имя переменной файлового типа;
n - целочисленное выражение.

Процедура перемещает указатель файла на компоненту файла с номером n (номер первой компоненты файла равен 0).

2. Seek (F,FileSize(F)),

где: Seek - имя процедуры;
F - имя переменной файлового типа;
FileSize() - стандартная функция возвращает количество компонентов файла, а т.к. компоненты нумеруются, начиная с 0, то результат получается на единицу большим номера последнего компонента файла.

Процедура позволяет помещать указатель файла за конец файла.

Стандартные функции для работы с файлами

1. EOF (var F: File): Boolean,

где: EOF (от англ. End Of File - конец файла) - имя функции;
F - имя переменной файлового типа.

Функция позволяет определить готовность файла к чтению, либо к записи информации. Если указатель файла продвинулся за конец файла (готовность к записи), то эта функция возвращает значение TRUE, в остальных случаях функция возвращает значение FALSE.

2. FilePos (var F: File of Type): Integer; FilePos (var F: File): Integer,

где: FilePos (от англ. File Position - позиция файла) - имя функции;
F - имя переменной файлового типа.

Функция возвращает значение текущей позиции указателя файла. Номер первой компоненты файла равен 0.

3. FileSize (var F: File of Type): Integer; FileSize (var F: File): Integer,

где: FileSize (от англ. File Size - размер файла) - имя функции;
F - имя переменной файлового типа.

Функция возвращает размер файла, т.е. число компонентов файла. Если FileSize(F)=0, то файл является пустым.

Замечание. Функции FilePos() и FileSize() не применимы к текстовым файлам.

Б. Текстовые файлы как "почти" типизированные файлы

Особое практическое значение имеют типизированные файлы, компонентами которых являются символы, т.е. файлы типа File of Char. Текстовыми файлами (типа Text) называются "почти" типизированные файлы, имеющими компоненты, которые могут иметь либо типа Char, либо являться символом "Конец строки". Символ "Конец строки" - это совокупность символов "Перевод строки" с шестнадцатеричным кодом 0D и "Возврат каретки" с шестнадцатеричным кодом 0A.

Символы в текстовом файле сформированы в последовательности символов типа Char, которые называются строками; каждая строка оканчивается специальным составным символом, который называется "Конец строки".

Стандартные процедуры и функции для работы с текстовыми файлами

1. ReadLn (var F: Text)

Процедура осуществляет переход к началу следующей строки, т.е. пропускает все символы текущей строки.

2. WriteLn (var F: Text)

Процедура записывает символ "Конец строки" в текстовый файл.

3. EOLN (var F: Text): Boolean

Функция возвращает TRUE, если в файле F найден символ "Конец строки" или символ "Конец файла" и FALSE - в противном случае.

Замечание. С символом EOLN оперируют следующие процедуры:

  1. процедура WriteLn(F) записывает символ "Конец строки" (EOLN) в компонент файла, на который установлен указатель файла;
  2. процедура ReadLn(F) пропускает оставшуюся часть текущей строки и устанавливает указатель файла на первый символ новой строки.

4. EOF (var F: Text): Boolean

При работе с текстовым файлом функция возвращает результат TRUE, если указатель файла расположен в позиции символа "Конец файла" ("CTRL"+"Z") и FALSE - в противном случае.

5. SeekEOLN (var F: Text): Boolean

Аналогична функции EOLN, но пропускает символы "Пробел" перед проверкой на достижение символа "Конец строки".

6. SeekEOF (var F: File): Boolean

Аналогична функции EOF, но пропускает символы "Пробел" и символы "Конец строки" перед проверкой на достижение символа "Конец файла".

В. Нетипизированные файлы

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

Описание нетипизированного файла: var F: File;

Для обработки файлов без типа применяют те же функции, что и для файлов с типом (т.е. функции EOF, FileSize, FilePos).

Процедуры для обработки нетипизированных файлов.

1. Rewrite (F: File; Size: Word)

создает новый файл; если файл с таким именем уже существует на диске, то он удаляется и создается новый. Второй параметр определяет размер записи в файле; если он отсутствует, то предполагается, что он равен 128 байтам.

2. Reset (F: File; Size: Word)

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

3. BlockRead (Var F: File; Var Buf: ?; Count: Word [Var Result: Word])

читает из файла F Count-записей в буфер ввода Buf; если указан четвертый параметр, то он получает значение реального числа прочитанных записей. Количество прочитанных записей может не совпадать с Count при чтении последней, а потому, возможно, неполной, порции данных из файла. Если четвертый параметр не указан и количество затребованных и реально прочитанных записей не совпадает, то возникает ошибка ввода-вывода.

4. BlockWrite (Var F: File; Var Buf: ?; Count: Word [Var Result: Word])

записывает в файл F Count записей из буфера ввода Buf; если указан четвертый параметр, то он получает значение реального числа записанных компонент. Количество записанных записей может не совпадать с Count при нехватке места на диске. Если четвертый параметр не указан и количество требуемых и реально выведенных записей не совпадает, то возникает ошибка ввода-вывода.

5. Seek (F: File; n: LongInt)

передвигает указатель файла на n-ю запись (n - целочисленное выражение). Первый компонент имеет номер 0.

 

 

49-50. Модули.

Процедуры и функции могут быть сгруппированы в отдельный модуль. Модуль (unit)- это программная единица, текст которой компилируется автономно (независимо от главной программы). Если модуль откомпилирован для реального режима, то результат имеет расширение TPU; модули, откомпилированные для защищенного режима, имеют расширение TPP. Структура модуля отличается от структуры обычной программы на языке Турбо Паскаль. Модули имеют четыре основные части: заголовок, который следует за зарезервированным словом UNIT; описательную (интерфейсную) часть, которая начинается за зарезервированным словом INTERFACE (в ней помещаются объявления переменных, процедур, функций, констант и типов данных, которые должны быть доступны для других программных модулей, использующих данный модуль); исполнительную (внутреннюю) часть, которая начинается словом IMPLEMENTATION (в нее входит текст подпрограмм и локальные объекты, доступные только внутри данного модуля) и необязательную часть (секцию инициализации), расположенную после исполнительной части между словами BEGIN и END (при этом, если инициализация модуля не нужна, то в секции помещается лишь слово END). При описании подпрограмм модуля допустимо использовать сокращенные заголовки (без параметров и указания типа результата для функции) как, например, в случае использования директивы FORWARD. Начинается модуль заголовком, состоящим из зарезервированного слова UNIT и имени модуля. Имя модуля обязательно должно совпадать с именем файла (имеющим расширение PAS), в котором он находится. Модуль имеет следующую структуру:

UNIT <имя модуля>;
INTERFACE
USES <список подключаемых модулей>;
TYPE <описание типов, определенных в данном модуле и доступных для других модулей>;

CONST <описание констант, определенных в данном модуле и доступных для других модулей >;

VAR <описание переменных, определенных в данном модуле и доступных для других модулей >;

PROCEDURE <заголовки процедур, определенных в данном модуле и доступных для других модулей >;

FUNCTION <заголовки функций, определенных в данном модуле и доступных для других модулей >;

IMPLEMENTATION

USES <список подключаемых модулей>;

TYPE <описание типов, определенных в данном модуле и недоступных для других модулей>;

CONST <описание констант, определенных в данном модуле и недоступных для других модулей >;

VAR <описание переменных, определенных в данном модуле и недоступных для других модулей >;

PROCEDURE <реализация процедур, определенных в данном модуле и доступных для других модулей >;

FUNCTION <реализация функций, определенных в данном модуле и доступных для других модулей >;

PROCEDURE <заголовки и реализация процедур, определенны в данном модуле и недоступных для других модулей >;

FUNCTION <заголовки и реализация функций, определенных в данном модуле и недоступных для других модулей >;

BEGIN< это слово необходимо, если имеются операторы секции инициализации>

<Необязательная часть модуля>

END.

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

Рассмотрим пример. Требуется написать главную программу, в которой вводится размерность вектора и элементы вектора и вызывается процедура сортировки одномерного массива целых чисел в порядке возрастания. Длина массива не превышает 100. Процедуру оформить в виде модуля.

USES CRT,MODSORT;
VAR A:MAS;

I:BYTE;
N:BYTE;

BEGIN

WRITELN('ВВОД ИСХОДНЫХ ДАННЫХ:');
READLN(N);
FOR I:=1 TO N DO

READLN(A[I]);

SORT(A,N);
FOR I:=1 TO N DO

WRITELN(A[I]);

READKEY

END.

Первым предложением программы является Uses, в котором подключается стандартный модуль и модуль Modsort, в котором и находится процедура сортировки.

Кроме того тип, с которым описывается массив отсутствует в главной программе, т.к. он присутствует в модуле.

UNIT MODSORT;
INTERFACE
TYPE MAS=ARRAY[1..100] OF INTEGER;
PROCEDURE SORT(VAR A:MAS; N:BYTE);
IMPLEMENTATION
PROCEDURE SORT;
VAR I,J:BYTE;

X:INTEGER;

BEGIN

FOR J:=1 TO N-1 DO

FOR I:=1 TO N-J DO

IF A[I]>A[I+1] THEN
BEGIN

X:=A[I]; A[I]:=A[I+1]; A[I+1]:=X

END;

END;
END.

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

 

Добавить комментарий


Защитный код
Обновить