- •Программирование на Турбо Паскале
- •Вещественный тип данных
- •Символы и строки.
- •Операции и их приоритет
- •Процедура ввода
- •Процедура вывода
- •Оператор варианта
- •Процедуры и функции
- •Массивы
- •Упакованные массивы
- •Множества
- •Файловые типы данных
- •Операции ввода-вывода
- •Перемещения по файлу
- •Специальные операции
- •Работа с текстовыми файлами
- •Комбинированный тип данных
- •Оператор with
- •Переменная структура записи
Работа с текстовыми файлами
Для описания символьных (текстовых) файлов используется стандартный тип text. К текстовым файлам относятся стандартные файлы input и output. Их особенность:
-
Такие файлы могут быть разбиты на строки с помощью специального символа, который не включен в стандартный тип char. Конкретная реализация этого символа зависит от типа машины и не имеет в данном случае значения.
-
Конец строки определяется функцией eoln (f); f – файловая переменная. Она принимает значение true, если конец строки достигнут и – false в противном случае. При достижении конца строки значение буферной переменной файла соответствует значению пробела.
Примеры:
1. Создать файл Spidor содержащий записи с порядковым номером и фамилиями и инициалами студентов. Порядковый номер целое число, фамилия и инициалы – содержат 16 символов максимум. Список будет содрежать 25 человек.
Program grup (input, output, spisok);
Const
Maxd = 16;
K=25;
Type
Name = record
N: integer
Sname: packed array [1..maxd] of char;
End;
Var
Vn: name;
Spisok: text;
I:1..maxd;
J: integer;
Begin
J:=1;
Assign (spisok,’gruppa’);
Rewrite (spisok); {rewrite, т.к. открывает несуществующий файл}
Repeat
For i:= 1 to maxd do
Read (vn. Sname [i]); {чтение фамилии}
Vn.n:= j;
Writeln (spisok, vn.n, vn.sname);
Inc(j);
Until j>k;
Close (spisok);
End.
2. Прочитать созданный файл и распечатать список студентов.
Program grup1 (input, output, spisok);
Const
Maxd = 16;
Type
Name = record
N: Integer;
Sname: packed array [1..maxd] of char;
End;
Var
Vn: name;
Spisok:text;
j:= j + 1; {формирование длины строки}
nd; {while} {прочитаны строки текста}
k:=1; {начальное значение указателя символа b}
repeat
with tt do
case st1 [k] of
‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’:
begin
i:= wd;
n:=0;
repeat
n:=n+1;
c [n]:=st1[k];
k:=k+1;
end;
‘,’, ‘.’, ‘:’, ‘;’:
Begin
i:= pun;
simb:= st1[k];
end;
‘ ‘: k:=k+1;
end; {оператора case}
end; {оператора with}
until k>j; {конец оператора repeat}
end.
В результате работы программы в записи tt 0. Содержаться сведения об одном из видов считанной информации: о слове или о знаке препинания. Для обработки другого вида информации данная программа не предназначена.
Комбинированный тип данных
Комбинированный тип данных или записи позволяют объединять значения различных типов данных (символьные, целые, вещественные, например данные о человеке: фамилия, пол, инициалы).
Такая разнородная, но логически связанная информация не может идентифицироваться (обозначаться) порядковыми номерами, как в массивах, поэтому для обозначения различных составляющих записи используются идентификаторы – поля.
Т. о. запись будет иметь какое-то имя, а затем после ключевого слова record перечисляются все имена полей, входящий в эту запись, с указанием их типов. Заканчивается запись ключевым словом end.
Например:
Словарь содержит исходные данные слова и их значения (перевод), поэтому каждую строку словаря можно представить в виде следующей записи.
Type
Wd = record
W: packed array [1..16] of char;
M: packed array [1..20] of char;
End;
Var
Wr: wd;
Имена w и m – это идентификаторы поля переменной w2, имеющей комбинированный тип wd. Переменную wr можно описать без использования раздела type:
Var
Wr: record
W: packed array [1..16] of char;
M: packed array [1..20] of char;
End.
Более сложная запись будет о книгах, помещенных в каталогах:
Type
Book = record
Ch: integer;
Author: packed array [1..18] of char; {автор}
Title: packed array [1..20] of char; {издательство}
Year: 1900…1996; {год издания}
End;
Var
Textbook, monogr, spav: book; {учебник, монография, справочник}
Записи представляют собой структуры с прямым методом доступа, т.е. можно выбрать любое поле записи без перебора предыдущих полей. Уникальность имен полей требуется только внутри одной записи. Идентификаторы полей могут совпадать с идентификаторами полей других записей или просто с другими именами переменных. Это возможно потому, что идентификатор поля используется только в паре с именем записи, т.е. обращение к полям осуществляется с помощью конструкции, называемой селектором записи, имеющей следующий вид:
Z, p;
где z – переменная комбинированного типа (имя записи);
p - идентификатор поля.
Например:
Для словаря справедлива запись:
Wr.w:= ‘table’;
Wr.m = ‘стол’;
Данные о монографии в каталоге могут быть следующими:
Monogr.ch:= 2212;
Monogr.author:= ‘К.Йенсен, Н.Вирт’;
Monogr.title:= ‘Паскаль’;
Monogr.publish:= ‘Финансы и статистика’;
Monogr.year:= 1982;
Если все данные о монографии, необходимо поместить в переменную textbook, имеющую тот же комбинированный тип данных, что и monogr, то это можно сделать одним оператором присваивания:
Textbook:= monogr;
Такое обращение к записи в целом возможно только в операторе присваивания, где слева и справа используются записи одинакового типа. Во всех остальных случаях оперируют отдельными полями записей.
Комбинированные типы можно использовать для построения более сложных структур, например, массивов, состоящих из записей:
Например: англо-русский словарь может быть описан следующим образом:
Type
Wd = record
W: packed array [1..16] of char;
M: packed array [1..20] of char;
End;
Book = array [1..3000] of wd;
Var
Er: book; {словарь}
Переменная er – это массив из 3000 записей, содержащих английские слова и их русские значения. Доступ к полям записей, составляющих массив er, производится следующим образом:
Er[i].w:= ‘pencil’;
Er[i].m:= ‘карандаш’;
Комбинированные типы данных могут также иметь структуру, в которой содержаться поля, имеющие также тип записи.
Например:
Данные о каждом человеке могут иметь информацию такую: имя, отчество, фамилия – это строковые данные; пол – женский или мужской; специальность – целое число; данные о дате рождения – запись, содержащая сведения о дне, месяце и годе рождения.
Тогда запись, содержащая сведения о человеке будет иметь вид:
Type
Date = record {дата рождения}
Month: (Jan, Feb, Mar, Apr, May, June, July, Aug, Sept, Oct, Nov, Decem);
Day: 1..31;
Year: 1900…1996;
End;
Person = record
Name, SecondName, Surname: string[20]; {имя, отчество, фамилия}
Sex: (male, Female); {пол}
Speciality: word; {специальность}
BirthDay: date; {дата рождения}
End;
Var
Child: person;
Доступ к полям любой записи осуществляется по общим правилам, например:
Child.name:=
Child. Secondname:= ‘Александр’;
Child. Surname:= ‘Николаевич’;
Child. Sex:= male;
Child. Speciality:= 1204;
Child. BirthDay. Day:= 1;
Child. BirthDay. Month:= Feb;
Child. BirthDay. Year:= 1980;
Таким образом, необходимо помнить слева от символа ‘.’ всегда должна находиться переменная типа запись, а справа идентификатор поля этой записи.
Пример:
Англо-русский словарь содержит 3000 слов. Найти заданное слово в словаре и определить его значение. Каждая строка словаря занимает одну строку файла input.
Program mer;
Const
Amount = 3000; {количество слов}
Type
Wd = record {строка словаря}
W: string [16];
M: string [20];
End;
Book = array [1…amount] of wd; {словарь}
Var
Er: book;
Wr: wd; {запись слова}
Z: string [16]; {заданное слово}
I: 1…amount;
K: 1..16;
J: 1..20;
Begin
For i:= to amount do
Begin
Read (wr.w); {ввод слова}
Read (wr.m); {ввод перевода]
Readln; {формирование словаря}
Er[i]:= w;
End;
Read (z); {чтение заданного слова}
For i:= 1 to amount do {перебор слов}
If z = er [i]. w then {нашли слово в словаре}
Writeln (er [i].m); {печать перевода слова}
End.