- •9.1. Типы данных char и string
- •9.1.1. Символьный тип
- •9.1.2. Строковый тип
- •9.2. Операции над строками
- •9.2.2. Операции отношения
- •I Листинг 9.4. Слияние двух отсортированных массивов строк,
- •9.3. Строковые процедуры и функции
- •9.3.1. Процедуры удаления и вставки символов
- •9.3.3. Процедуры преобразования типов
- •9.3.2. Функции для работы со строками
- •9.4. Примеры программ обработки строк
- •9.4.1. Вставка, удаление
- •9.4.2. Преобразование строчных букв в заглавные
- •10.1. Понятие множества
- •10.2. Операции над множествами
- •10.3. Формирование
- •11.1. Определение и правила записи
- •11.2. Записи с вариантами
11.1. Определение и правила записи
Запись — это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, каждое поле имеет свое имя (а не номер, как элемент массива). Записи можно объявить следующим способом.
Сначала объявляется тип записи.
type
ИмяТипа = record
ИмяПоля!: ТипПоля!;
ИмяПоля2: ТипПоля2;
ИмяПоляЫ: ТипПоляЫ; end;
Затем объявляются переменные соответствующего типа.
var
ИмяПеременной: ИмяТипа;
Например:
type avto=record
number: integer; { номер автомобиля }
marka: string[20]; { марка автомобиля }
fio: string[40]; { фамилия, инициалы владельца }
address: string[60]; { адрес владельца } end; var m,v: avto;
Можно задать в программе типизированную константу типа записи, определив значения каждого из полей. Например, для типа avto можно объявить константу:
Значения полей записи могут использоваться в выражениях. Обращение к значению поля осуществляется с помощью имени переменной и имени поля, разделенных точкой. Такая комбинация называется составным именем. Например, чтобы получить доступ к полям записи avto, надо записать:
m.number, т.marka, т.fio, m.address
Составное имя можно использовать везде, где допустимо применение типа поля. Для присваивания полям значений используется оператор присваивания.
Например:
m.number:=1964; m,marka:='Audi — 100'; m.fio:= 'Федорова Н.В.'; m.address:='y^. Красина 53 к.1 — 73';
Составные имена можно использовать в операторах ввода/вывода:
readln(m.number,m.marka,m. fio,m.address) ;
write(m.number:4,m.marka:lO.ra.fio:13,m.address:23);
Обратите внимание — нельзя использовать в операторах ввода/вывода запись целиком (как и массив).
Например:
writeln(m) { ошибочная инструкция }
Однако допускается применение оператора присваивания к записям в целом, если они имеют один и тот же тип:
После выполнения этого оператора значения полей записи v станут равны значениям соответствующих полей записи т.
В ряде задач удобно пользоваться массивами из записей. Их можно описать, например, следующим образом:
type person = record
fio: string[20];
age: 1..99;
prof: string[30] ; end; var list :array [1 . . 50] of person;
Обращение к полям записи имеет несколько громоздкий вид. Для решения этой проблемы в языке Turbo Pascal имеется оператор with, в виде:
with ПеременнаяТипаЗапись do Оператор; { обычно составной оператор }
Один раз указав переменную типа запись в операторе with, можно работать с именами полей как с обычными переменными.
Например:
with m do
begin
number:=1964 ; marka:='Audi - 100';
address :='ул. Красина 53 к.1 — 73'; end;
Записи часто используются при работе с динамическими структурами данных и для организации файлов записей на дисках. Обо всем этом речь пойдет в следующих главах. Применение записей может улучшить исходный текст программы, если в ней используются переменные, которые можно объединить в группы по какому-либо признаку. Например, разумно использовать записи для описания комплексных чисел или координат точки на плоскости или в пространстве.
type complex=record
re:real; { действительная часть } ira:real; { мнимая часть } end;
var a,b,c: complex; { a,b,c — переменные типа complex } begin
a.re:=6.8; a.im:=l.6;
В данном случае можно было бы использовать две обычные переменные для хранения действительной и мнимой частей, однако использование записи делает текст программы более выразительным и понятным.
Записи часто применяются для работы с датами (день, месяц, год) или отрезками времени (часы, минуты, секунды). В большинстве современных языков программирования есть специальные типы данных для работы с датой и временем, однако в Turbo Pascal все действия с датой и временем приходится программировать вручную.
Рассмотрим пример использования массива записей. Составим программу, которая организует ввод данных об учащихся: имя, фамилия, возраст, школа, класс и записывает их в массив записей, а затем выводит сведения об учащихся по номеру записи и по номеру класса.
Для решения задачи введем тип записи pupil (ученик) для описания сведений об учащихся, а затем объявим массив а, состоящий из 10 записей типа pupil (листинг 11.1).
[Листинг 11.1. Пример использования массива записей
type pupil = record { описание типа записи } name: string[10]; { имя } surname: string[20]; { фамилия } school: integer; { школа } class: byte; { класс }
end;
v
ar
school:array[1.,10]of
pupil; n:
1
.. 10; с:byte;
procedure input_data;
{ процедура ввода данных — используем составные имена } begin
writeln('Введите данные №', п, ' :');
write('Ваше имя ?'); readln(school[n].name);
write (' Фамилия ?'); readln(school[n].surname);
write (' и класс ?'); readlnfschool[n].class);
writeln; end;
procedure write_data;
{ вывод на экран содержимого текущей записи — используем оператор with } begin
with school[n] do begin
writeln('Имя :',name); writeln('Фамилия: ',surname); writeln('Школа: ',school); writeln('Класс: ',class);
end; end; begin { основная программа }
for n:=l to 10 do input_data;
writeln;
writeln(' Вьшод данных о 5 ученике :');
writeln; n:=5; write_data;
writeln(' Вьшод данных по номеру класса :')/writeln;
writeln{' Задайте номер класса :'); readln(c);
for n:=l to 10 do if school[n].classic then write_data;
readln;
. end.
"
