
- •Процедуры, функции; записи; файлы. Программирование рекурсивных алгоритмов.
- •Программирование рекурсивных алгоритмов
- •0 00011010 - Положительное число 1 00011010 – отрицательное число
- •Кодирование текстовой информации
- •Кодирование графической информации
- •Кодирование звуковой информации
- •Языки программирования высокого уровня
- •Основные преимущества алгоритмических языков перед машинными таковы:
Процедуры, функции; записи; файлы. Программирование рекурсивных алгоритмов.
Процедуры и функции относятся к подпрограммам. Подпрограмма – поименованная, специальным образом оформленная часть программы, которая может быть неоднократно вызвана из других частей программы. Подпрограмма - это отдельная функционально независимая часть программы. Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом. Стандартная подпрограмма (процедура или функция) - подпрограмма, включенная в библиотеку программ, доступ к которой обеспечивается средствами языка программирования. Вызывается подпрограмма по имени с заданием фактических параметров. Типы фактических параметров должны соответствовать типам формальных параметров, указанным при описании данной процедуры в библиотеке процедур и функций. Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров. Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными - передающиеся из подпрограммы в вызывающий блок (результаты работы подпрограммы).
Процедура не возвращает значение (результат выполнения подпрограммы) и не может использоваться в выражении. Структура процедуры имеет следующий вид:
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 := 'Профсоюзная';
Примечание. Поля записи, в свою очередь, тоже могут быть массивами, множествами, записями.
Файлы. Тип файла представляет собой описание упорядоченного набора данных одного типа, которые хранятся на различных носителях информации (жесткие диски, флэш-карты).
Типы файлов:
текстовые – являются предопределенными. TextFile, Text.
нетипизированные – являются предопределенными. file
типизированные – необходимо описывать.
Синтаксис
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) – удаляет файл.
Прежде чем делать какие-то операции с файлом его надо открыть, после чтения или записи закрыть. Все операции чтения или записи осуществляются с текущей позиции. Типиз и нетипиз файлы позволяют напрямую изменять данную позицию. В текстовых файлах текущая позиция меняется только при операциях записи и чтения.