Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
30.04.2013
Размер:
87.55 Кб
Скачать

99

9. ТИПЫ ДАННЫХ, ЗАДАВАЕМЫХ ПОЛЬЗОВАТЕЛЕМ

Кроме рассмотренных ранее предопределенных типов данных программист может использовать и данные, тип которых он может задать самостоятельно в соответствии с особенностями решаемой задачи. Речь идет о множествах и записях.

Рассмотрим их.

9.1. МНОЖЕСТВА

Термин "множество" в программировании используется аналогично его математическому пониманию. Отличие состоит в том, что в Турбо Паскале множества могут включать элементы только порядковых (перечислимых) типов. Элементы какого-либо конкретного множества (переменной или типизированной константы) должны принадлежать одному типу, который называется базовым типом. Максимальное количество значений базового типа множества называется его мощностью.

В Турбо Паскале в качестве базовых могут использоваться порядковые типы, мощность которых не превышает 256-ти значений. Кроме того, порядковые значения верхней и нижней границы базового типа не должны выходить за пределы диапазона от 0 до 255. Поэтому, в качестве базовых типов множеств не могут использоваться Shortint, Integer, Longint, Word.

Операции, допустимые для работы с множествами приведены в таблице:

Обозначение в Паскале

Действие

Тип результата

*

Пересечение

Множество

+

Объединение

Множество

Разность

Множество

in

Принадлежность элемента множеству

boolean

<=

Является подмножеством

boolean

>=

Включает подмножество

boolean

Более подробную информацию о множествах в Паскале можно найти в рекомендованной литературе.

Множества представляют собой гибкий и наглядный механизм для решения многих задач. В частности, их удобно использовать при обработке символьной информации.

В качестве примера рассмотрим следующую задачу: Подсчитать в строке отдельно количество цифр и латинских букв.

Program TestSets;

Type

CharSet = set of Char;

Const

Digits : Charset = [’0’.. ’9’];

Letters: CharSet = [’a’..’z’,’A’..’Z’];

var

CountDig, {количество цифр}

CountLet : word;{количество букв}

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.

И

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;

результате тип TStudent примет такой вид:

А

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}

. . .

окажем это на примере, в котором используется приведенное выше объявление записи TStudent.

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);

ри заполнении информацией структур данных типа record необходимо помнить, что с клавиатуры и из текстовых файлов допускается вводить данные только некоторых стандартных типов данных. Поэтому, в операторах Read и Readln могут располагаться только идентификаторы самых внутренних полей, которые имеют допустимые для ввода типы, например:

К переменным типа «запись» могут в особых случаях применяться и групповые операции присваивания, когда одновременно присваиваются новые значения всем внутренним полям. Это, в частности, имеет место при работе с типизированными файлами (будет рассматриваться отдельно).

Пример использования переменной типа «запись» будет приведен в разделе «Динамические структуры данных».

ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ

  1. Как задать множество?

  2. Каковы особенности работы с множествами?

  3. Что такое запись?

  4. Для чего используются уточненные идентификаторы?

  5. Зачем используется оператор присоединения with ?

  6. Каковы особенности ввода с клавиатуры значений для полей записи?

Соседние файлы в папке лекции