Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8б-1 Процедуры функции записи файлы_ Программир...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
103.42 Кб
Скачать

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

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

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

Procedure <имя процедуры>(формальные параметры); Var   (локальные переменные) begin   . . . end;

Процедура вызывается по имени: <имя процедуры> (фактические параметры);

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

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

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

Procedure express(a, b, c : real; var x, y : real); Var z : real; begin z:=a + b + c; x:=sqr(z); y:=sqrt(z); end ;

Эту процедуру можно вызвать следующим образом: express(8.6, 6.9, 9.5, x1, y1);

Входные формальные параметры a, b, c принимают значения соответствующих фактических параметров: a=8.6; b=6.9; c=9.5. При этих значениях выполняется процедура. Результатом выполнения процедуры являются x, y, которые передают свои значения соответствующим фактическим параметрам x1, y1. Таким образом, в основной программе будем иметь x1=625, y1=5.

Фактическими параметрами могут быть константы, переменные, выражения, массивы. В качестве формальных параметров могут выступать только переменные (константы и выражения недопустимы).

Функция – подпрограмма, которая возвращает значение (результат выполнения подпрограммы). Функция является выражением и может использоваться для формирования других более сложных выражений. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу. Функция оформляется в следующем виде:

Function <имя функции>(формальные параметры): тип значения функции; Var   . . .  Begin   . . . End ;

Вызывается функция по её имени с указанием фактических параметров. Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается. Пример. Пусть требуется найти (x! - y!) * d!. Напомним, что n! представляет собой произведение n чисел натурального ряда: n! = 1*2*3*......*n

Function fac(n: integer): integer; Var   p, i: integer; Begin   p:=1;   for i:=2 to n do     p:=p*i;   fac:=p; End;

Вызвать данную функцию можно так: f := (fac(x) - fac(y)) * fac(d).

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

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

Записи – набор элементов различных типов. Компонент записи называется полем. Каждое поле имеет имя, уникальное в пределах записи, и тип. Синтаксис описания типа записи:

Type

TypeName=record

Field1:Type1;

...

FieldN:TypeN;

end;

TypeName – имя типа записи, Field – имена полей записи, Type – типы данных полей. Типом поля записи может быть любой тип. Пример:

Type

Mesto=Record

HouseNumber : Integer;     StreetName, CityName : String[20];     PeopleName : String;

End;

Var   Address : Mesto

Помимо действий над отдельными полями записи Address можно выполнять операции над всей записью.

Описание записей возможно и без использования имени типа, например:

Var   Address : Record     HouseNumber : Integer;     StreetName, CityName : String[20];     PeopleName : String;   End;

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

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

Для записей определена единственная операция – присваивание (при этом происходит поэлементное копирование значений полей одной записи в поле другой).

Оператор, который присваивает полю HouseNumber значение 45, выглядит так: Address.HouseNumber := 45;

Таким же образом присваиваются значения другим полям записи Address:

Address.StreetName := 'Профсоюзная';

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

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

Типы файлов:

  1. текстовые – являются предопределенными. TextFile, Text.

  2. нетипизированные – являются предопределенными. file

  3. типизированные – необходимо описывать.

Синтаксис

type

TypeName=file of BaseType

TypeName – имя типа, BaseType – базовый тип файла (тип элементов, которые содержатся в массиве).

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

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

Описание переменных файлового типа аналогично описанию обычных переменных.

type

Name:FileType

Name – имя файловой переменной, FileType – файловый тип.

Для того чтобы работать с определенными файлами необходимо установить связь между именем файла в программе (файловой переменной) и физическим именем файла, принятым в ОС. Выполняется с помощью предопределенной процедуры AssignFile (Name, FileName)

Name – имя файловой переменной, FileName – имя файла на диске.

Можно указывать полное или неполное имя файла.

Текстовые файлы фактически представляют собой последовательность строк, разделенных специальными символами (символ окончания строки). Для работы с файлами определены стандартные операции:

Reset (Name[RecordSize]) -  открывает существующий файл для чтения, если файла не существует – ошибка.

Name – имя файловой переменной, RecordSize – размер блока данных в байтах. RS используется только для нетипизированных файлов. Rewrite (Name[RecordSize]) – создает и открывает новый файл для записи на внеш­нем устройстве (если файл ранее существовал, вся предыдущая информация из него стирается). CloseFile(Name)-  закрывает открытый файл. Для определения конца файла используется стандартная встро­енная функция EOF (файловая переменная), которая принимает значение True, если достигнут конец файла, и значение False в противном случае. Append (f) - процедура, открывающая файл f для добавления строк в конец файла. Используется только для текстовых файлов. Write и Read- записывают и читают информацию из указанного файла и перемещают  указатель файла к сле­дующей записи. Для типизированных файлов тип переменных должен совпадать с базовым типом файлов. Для текстовых файлов переменные могут быть практически любых простых типов. Read (Name, var1, var2,...) Write (Name, var1, var2,...) var1, var2 – имена переменных. ReadLnотличается от предыдущей тем, что после чтения текущая позиция перемещается на начало следующей строки. Применяется только для текстовых файлов. WriteLn – после записи данных в файл, перемещает текущую позицию на следующую строку. FilePos (Name) – возвращает целое значение и номер текущей позиции. Применяется только для типизированных и нетипизированных файлов. EOLN (Name) – возвращает логическое значение: является ли текущая позиция концом строки. Применяется только для текстовых файлов. Seek (Name, Pos) – устанавливает текущую позицию в значение Pos. Применяется только для типиз и нетипиз файлов. FileSize (Name) – возвращает целое значение: размер файла, т.е. число записей. Erase (Name) – удаляет файл.

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