Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Турбо Паскаль.doc
Скачиваний:
17
Добавлен:
22.03.2016
Размер:
307.71 Кб
Скачать

Работа с текстовыми файлами

Для описания символьных (текстовых) файлов используется стандартный тип text. К текстовым файлам относятся стандартные файлы input и output. Их особенность:

  1. Такие файлы могут быть разбиты на строки с помощью специального символа, который не включен в стандартный тип char. Конкретная реализация этого символа зависит от типа машины и не имеет в данном случае значения.

  2. Конец строки определяется функцией 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.