
9. ТИПЫ ДАННЫХ, ЗАДАВАЕМЫХ ПОЛЬЗОВАТЕЛЕМ
Кроме рассмотренных ранее предопределенных типов данных программист может использовать и данные, тип которых он может задать самостоятельно в соответствии с особенностями решаемой задачи. Речь идет о множествах и записях.
Рассмотрим их.
9.1. МНОЖЕСТВА
Термин "множество" в программировании используется аналогично его математическому пониманию. Отличие состоит в том, что в Турбо Паскале множества могут включать элементы только порядковых (перечислимых) типов. Элементы какого-либо конкретного множества (переменной или типизированной константы) должны принадлежать одному типу, который называется базовым типом. Максимальное количество значений базового типа множества называется его мощностью.
В Турбо Паскале в качестве базовых могут использоваться порядковые типы, мощность которых не превышает 256-ти значений. Кроме того, порядковые значения верхней и нижней границы базового типа не должны выходить за пределы диапазона от 0 до 255. Поэтому, в качестве базовых типов множеств не могут использоваться Shortint, Integer, Longint, Word.
Операции, допустимые для работы с множествами приведены в таблице:
Обозначение в Паскале |
Действие |
Тип результата |
* |
Пересечение |
Множество |
+ |
Объединение |
Множество |
– |
Разность |
Множество |
in |
Принадлежность элемента множеству |
boolean |
<= |
Является подмножеством |
boolean |
>= |
Включает подмножество |
boolean |
Более подробную информацию о множествах в Паскале можно найти в рекомендованной литературе.
Множества представляют собой гибкий и наглядный механизм для решения многих задач. В частности, их удобно использовать при обработке символьной информации.
В качестве примера рассмотрим следующую задачу: Подсчитать в строке отдельно количество цифр и латинских букв.
Program
TestSets;
CharSet
= set
of
Char; Digits
: Charset = [’0’.. ’9’]; Letters:
CharSet = [’a’..’z’,’A’..’Z’]; var
CountDig,
{количество
цифр} st
: string; i
: integer; begin st
:= ’Apache
on Win32 has not yet been optimized’; for
i:=1 to
Length(st) do if
(st[i] in
Digits) then CountDig
:= CountDig + 1
else
if
(st[i] in
Letters) then CountLet
:= CountLet + 1; {end
if} {end
for}
{Результат
: CountDig
= 2
CountLet
= 33} end.Type
Const
CountLet : word;{количество букв}
И
Letters
:= SmallLetters + BigLetters;
В
SmallLetters
:= Letters - [’A’..’Z’]; BigLetters
:= Letters - [’a’..’z’];
9.2. ЗАПИСИ
Запись (в ряде языков программирования ее называют структурой), в отличие от массивов и множеств, является составной структурой данных. Если отдельно взятые массив или множество всегда включают элементы одинакового типа, то записи могут объединять в единое целое любое количество структур данных разных типов: простых переменных, массивов, множеств и записей.
В языке Турбо-Паскаль различают фиксированные (обычные) и вариантные записи. В данной главе мы рассмотрим только фиксированные записи. После получения опыта их использования, читатель может самостоятельно ознакомиться по литературе и с вариантными записями.
Обычная фиксированная запись состоит из одного или нескольких полей, для каждого из которых при объявлении (в секции Type) указывается имя (идентификатор) и тип.
В
type
TStudent:=record
{запись} {Список
полей:} Name:string[20]
{имя и тип поля} Age:integer;{возраст
от 1 до 250} Sex:Char;
{’м’/’ж’} Phone:string[9]; MathAnal
: byte; {Мат.
анализ} LinAlg
: byte; {Лин. алгебра} Prog
: byte; {Программирование} Phys
: byte; {Физика} end;
В приведенной записи есть группа полей, несущих одинаковую смысловую нагрузку (MatAnal, LinAlg, Prog, Phys). С точки зрения удобства работы с текстом программы и удобства выполнения групповых операций, такие поля целесообразно объединить в отдельную структуру данных типа record.
В
type
TStudent:=record
{запись} {Список
полей:} Name:string[20]
{имя и тип поля} Age:integer;{возраст
от 1 до 250} Sex:Char;
{’м’/’ж’} Phone:string[9]; Marks
= record MathAnal
: byte; {Мат.
анализ} LinAlg
: byte; {Лин алгебра} Prog
: byte; {Программирование} Phys
: byte; {Физика} end; end;
А
type
TMarks
= record MathAnal
: byte; {Мат.
анализ} LinAlg
: byte; {Лин алгебра} Prog
: byte; {Программирование} Phys
: byte; {Физика} end; TStudent:=record
{запись} Name:string[20]
{имя и тип поля} Age:integer;{возраст
от 1 до 250} Sex:Char;
{’м’/’ж’} Phone:string[9]; Marks
: TMarks; {оценки
за семестр} end;
В программе обращение к полям записей выполняется с помощью квалифицируемых (уточненных) идентификаторов, в которых указывается вся цепочка имен от идентификатора переменной типа record до идентификатора требуемого поля. Имена полей в такой записи разделяются точками.
П
Type TGrouup
= array[1..25]
of
TStudent; var Group
: TGroup; begin .
. . Group[1].Name
:= ’Андреев
А.Б.’;
Group[1].Age := 18; Group[1].Sex
:= ’м’; Group[1].Phone
:= ’’; {Пустая
строка} Group[1].Marks.Prog
:= 4; {Присвоить
значение полю Prog,
входящему в состав структуры Marks, в
свою очередь входящую в состав структуры типа
Tstudent, являющейся 1-м элементом массива
Group} .
. .
9.3. ОПЕРАТОР WITH
Для упрощения работы с записями и придания тексту программы большей наглядности в Турбо Паскале имеется специальный оператор присоединения with. С использованием этого оператора приведенный выше фрагмент присвоения значений полям первого элемента массива Group будет иметь следующий вид:
with
Group[1] do
begin Name
:= ’Андреев
А.Б.’;
Age := 18; Sex
:= ’м’; Phone
:= ’’; {Пустая
строка} Marks.Prog
:= 4;
end;
П
readln(Group[i].Name,
Group[i].Marks.Prog); или with
Group[i] do readln(Name,
Marks.Prog);
К переменным типа «запись» могут в особых случаях применяться и групповые операции присваивания, когда одновременно присваиваются новые значения всем внутренним полям. Это, в частности, имеет место при работе с типизированными файлами (будет рассматриваться отдельно).
Пример использования переменной типа «запись» будет приведен в разделе «Динамические структуры данных».
ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
-
Как задать множество?
-
Каковы особенности работы с множествами?
-
Что такое запись?
-
Для чего используются уточненные идентификаторы?
-
Зачем используется оператор присоединения with ?
-
Каковы особенности ввода с клавиатуры значений для полей записи?