- •Элементы языка pascal
- •1.1 Алфавит
- •1.2 Идентификаторы
- •1.3 Типы данных
- •1.4. Константы. Переменные
- •Структура Pascal-программы
- •Преобразование типов
- •Выражения. Операции
- •2. Операторы
- •2.1. Составной и пустой операторы
- •2.2. Условный оператор
- •2.3. Операторы повторений
- •2.4. Оператор выбора
- •2.5 Метки и операторы перехода
- •3. Массивы
- •Процедуры и функции
- •Текстовые файлы
- •Типизированные файлы
- •Нетипизированные файлы
Процедуры и функции
Процедуры и функции представляют собой инструмент Турбо Паскаля, позволяющий писать хорошо структурированные программы (разделённые на относительно самостоятельные фрагменты). В структурированных программах обычно легко прослеживается основной алгоритм, они проще в отладке и менее чувствительны к ошибкам программирования. Все эти свойства являются следствием особенности процедур (функций), каждая из которых представляет собой во многом самостоятельный фрагмент программы, связанный с основной программой лишь с помощью нескольких параметров. Самостоятельность процедур (функций) позволяет локализовать в них все детали программной реализации того или иного алгоритмического действия и поэтому изменение этих деталей обычно не приводит к изменениям основной программы.
Процедурой называется особым образом оформленный фрагмент программы, имеющей собственное имя. Упоминание этого имени в тексте программы приводит к активизации процедуры и называется ее вызовом. Сразу после активизации процедуры начинают выполняться входящие в нее операторы, после выполнения последнего из них управление возвращается обратно в основную программу и выполняются операторы непосредственно стоящие за оператором вызова процедуры.
Для обмена информацией между основной программой и процедурой используется один или насколько параметров вызова (параметры вызова могут и не использоваться). Если они есть, то они перечисляются в круглых скобках за именем процедуры и вместе с ним образуют оператор вызова процедуры.
Функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции, и, следовательно, вызов функции может использоваться наряду с другими операторами в выражениях.
С примерами процедур и функций мы уже встречались – это стандартные процедуры ввода-вывода данных, математические функции и др. Стандартными они называются потому, что созданы одновременно с системой Турбо Паскаля и являются ее неотъемлемой частью. Нестандартные процедуры и функции необходимо писать, чтобы компилятор мог установить связь между оператором вызова и теми действиями, которые предусмотрены в процедуре (функции). Описание процедуры (функции) помещается в разделе описаний.
Program CharConvert;
{Программа вводит текстовую строку, преобразует все входящие в нее
буквы в прописные и выводит результат}
Procedure UpString(s1:string; var s2:string);
{Процедура преобразует буквы входной строки s1 в прописные буквы
латинского алфавита и помещает результат преобразования в выходную
строку s2. Предполагается, что последовательность букв образуют
непрерывный массив. В соответствии с таблицей кодировки символов
коды символов латинских строчных букв от а до z образуют непрерывный массив монотонно нарастающих чисел от 97 до 122, а коды соответствующих им прописных букв – непрерывный массив чисел от 65 до90. Преобразование строчных букв в прописные состоит в уменьшении кода буквы на 32}
Var
i:integer;
c:char; {Рабочая переменная преобразования}
begin
s2:=’’; {вначале выходная строка пустая}
{Цикл посимвольного анализа исходной строки}
for i:=1 to Length(s1) do
begin
{Берем из входной строки очередной символ}
c:=s1[i];
{Проверяем символ на принадлежность к массиву}
if (c>=’a’) and (c<=’z’) then
c:=chr(ord(‘A’)+ord(c)-ord(‘a’));
s2:=s2+c;
end
end;
Var
Sinp, Sout:String; {Исходная и преобразованная строки}
Begin
Write(‘Введите строку’);
ReadLn(Sinp);
UpString(Sinp, Sout); {Преобразуем введенную строку к прописным б}
WriteLn(‘Результат’, Sout)
End.
Описание процедуры начинается словом Procedure за которым следует имя процедуры и список формальных параметров. Список параметров заключается в круглые скобки и содержит перечень параметров с указанием их типа. Перед параметром s2, с помощью которого в вызывающую программу возвращается результат преобразования, стоит зарезервированное слово Var. Именно таким способом компилятору указываются те параметры, в которых процедура возвращает вызвавшей ее программе результат своей работы. Procedure, имя и список параметров образуют заголовок процедуры. За заголовком следует тело процедуры, содержащее раздел описаний и раздел операторов.
Второй способ реализации данной программы – оформим алгоритм преобразования в виде функции.
Program CharConvert1;
Function UpString(s1:string):string;
Var
i:integer;
c:char;
s2:string {Результат преобразования}
begin
s2:=’’;
for i:=1 to Length(s1) do
begin
c:=UpCase(s1[i]);
s2:=s2+c;
end;
UpString:=s2 {Присваиваем значение функции UpString }
end;
Var
Sinp:String;
Begin
Write(‘Введите строку’);
ReadLn(Sinp);
WriteLn(‘Результат’, UpString(Sinp))
End.
Функции UpString используется в качестве параметра обращения к другой процедуре (WriteLn). В теле любой функции необходимо осуществлять присваивание ей вычисленного значения (UpString:=s2). В левой части оператора присваивания в этом случае указывается имя функции. С помощью стандартной функции UpCase преобразуется каждый очередной символ латинского алфавита.
ЗАПИСИ
Запись – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.
Структура:
<имя типа> = Record <список полей> End
Список полей – последовательность разделов записи, между которыми ставится точка с запятой. Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором ставится двоеточие и описание типа поля.
Type
BirthDay = Record
day, month : byte;
year: integer
End;
Var
a, b: BirthDay;
Тип BirthDay есть запись с полями day, month, year. Переменные a, b содержат записи типа BirthDay.
Значения переменных типа записи можно присвоить другим переменным того же типа:
a:=b;
К компонентам записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля
a.day:=27;
b.year:=1990;
Вложенные поля
Type
BirthDay = Record
day, month : byte;
year: integer
End;
Var
c:Record
name:string;
bd:BirthDay
end;
begin
…
if c.bd.year=1990 then
…
end.
Чтобы упростить доступ к полям записи, используется оператор присоединения With
With <переменная> Do <оператор>
With c.bd do month:=9;
Это эквивалентно
With c do with bd do month:=9; или
With c,bd do month:=9; или
c.bd.month:=9;
ФАЙЛЫ
Под файлом понимается либо именованная область внешней памяти компьютера (дискета, жесткий диск, CD), либо логическое устройство – потенциальный источник или приемник информации.
Любой файл имеет 3 характерные особенности.
У него есть имя, что дает возможность программе работать одновременно с несколькими файлами.
Он содержит компоненты одного типа. Типом компонентов может быть любой тип Турбо Паскаля, кроме файлов.
Дли файла не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.
Файловый тип или переменную файлового типа можно задавать одним из трех способов:
<имя> = File Of <тип>;
<имя> = Text;
<имя> = File;
Type
Text80=File of string [80];
Var
F1: file of char;
F2:text;
F3:file;
F4:text80; {типизированный}
В зависимости от способа объявления можно выделить 3 вида файлов:
Типизированные файлы (задаются File of)
Текстовые файлы (определяются типом Text)
Нетипизированные файлы (определяются типом File)
Файлы, а также логические устройства становятся доступны программе после выполнения процедуры открытия файла (лог.устройства). Это процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а также в указании направления обмена информацией: чтение из файла или запись в него.
Assing (<файловая переменная>, <имя файла или лог. устройства>);
Имя файла – выражение строкового типа, содержит до 8 разрешенных символов – прописные и строчные латинские буквы, цифры и символы ! @ # $ % ^ & () ~ - _`. За именем может следовать расширение – последовательность до 3 разрешенных символов. Расширение отделяется от имени точкой. Перед именем может указываться путь к файлу: имя диска, имя текущего каталога, имена каталогов вышестоящего уровня.
Var
finp:text;
fout:file of string;
consr
name=’c:\dir\subdir\out.text’;
begin
assign(finp,’123.dat’);
assign(fout,name);
end.
Инициировать файл означает указать для этого файла направление передачи данных. В Турбо Паскале можно открыть файл для чтения, для записи информации, а также для чтения и записи одновременно.
Для чтения файл инициируется с помощью стандартной процедуры
Reset(<файловая переменная>);
При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная – указатель, связанная с этим файлом, будет указывать на начало файла, т.е. на компонент с порядковым номером 0.
Var
f:file of char;
begin
assign(f, ‘file.dat’);
{$I-} {Отключаем контроль ошибок ввода-вывода}
reset(f)
{$I+} {Включаем контроль ошибок ввода-вывода}
if IOResult<>0 then
… {Файл не существует}
else
… {Файл существует}
end.
С помощью директивы компилятора {$I-} отключается автоматический контроль ошибок ввода-вывода. Если этого не сделать, то отсутствие файла приведет к аварийному завершению работы. Если делается попытка инициировать чтение из несуществующего файла, возникает ошибка, которая может быть сообщена программе ненулевым значением встроенной функции IOResult.
Разрешается обращаться к типизированным файлам, открытым процедурой Reset (для чтения) с помощью процедуры Write (для записи). Для текстовых файлов, открытых процедурой Reset, нельзя использовать процедуру Write или WriteLn.
Стандартная процедура
Rewrite (<файловая переменная>)
инициирует запись информации в файл. Данной процедурой нельзя инициировать запись информации в ранее существующий файл – старый файл уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации и его указатель принимает значение 0.
Процедура
Append (<файловая переменная>)
Инициирует запись в ранее существующий текстовый файл для его расширения. При этом указатель файла устанавливается в его конец. Ее нельзя применять для типизированных и нетипизированных файлов. Если текстовый файл ранее уже был открыт с помощью Reset или Rewrite, использование Append приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей.
Процедуры и функции для работы с любого вида файлами:
Close(<файловая переменная>) – закрывает файл.
Rename(<файловая переменная>, <новое имя>) – переименовывает файл.
Erase(<файловая переменная>) – уничтожает файл.
EOF(<файловая переменная>) – функция тестирующая конец файла. Возвращает истина, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении – что файл исчерпан.