Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум10.doc
Скачиваний:
52
Добавлен:
14.02.2016
Размер:
296.96 Кб
Скачать

Курс «основы алгоритмизации и программирования»

ЛЕКЦИЯ № 21.

Тема: «структурированные типы данных»

Типы данных, которые рассматривались ранее (за исключением массивов), имеют два характерных свойств: неделимость и упорядоченность их значений, и называются скалярными. Например, каждое значение типаinteger(т.е. каждое целое число) есть объект, не распадающийся на отдельные компоненты (цифры). С другой стороны, множество целых чисел упорядочено. Следовательно, совершенно бессмысленна попытка оперировать с некоторойi-й цифрой (компонентом) целого числа.

Если же целое число рассматривать как последовательность десятичных цифр, то можно говорить об i-й цифре этого числа. В данном случае множество элементов (десятичных цифр) имеет коллективное имя – целое число. Эта возможность давать коллективное имя всему множеству элементов имеет большое значение в программировании и обработке данных. Такие множества с одним общим именем называютсяструктурированными(сложными) типами данных. Существуют различные методы структурирования данных, отличающихся способом объединения отдельных компонентов в общую структуру и, следовательно, способом обращения к отдельным компонентам структуры.

В языке Паскаль имена, обозначающие различные структуры данных, называются структурированными переменными. При определении типа (диапазона значений) структурированной переменной необходимо описать:

  • способ объединения отдельных компонентов в структуру;

  • тип (типы) компонентов этой структуры.

Классификация типов данных, используемых в программах на языке паскаль

По способу организации и типу компонентов в сложных типах данных выделяют регулярный тип (массивы), комбинированный тип (записи), файловой тип (файлы), множественный тип (множества), строковый тип, представляющий собой описание специальным образом организованных символьных массивов. Регулярный и файловый типы определяют упорядоченные наборы однотипных компонентов с произвольным (для массивов) и последовательным (для файлов) способом доступа. Комбинированный тип – упорядоченный программистом набор компонентов разных типов с произвольным доступом, а множественный тип – неупорядоченный набор компонентов некоторого базового типа. Особое место среди типов данных Паскаля занимают тип объекта, на базе которого строится специальное направление объектно-ориентированного программирования, тесно примыкающий к нему процедурный и ссылочные типы.

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

1. Строковый тип данных

1.1. Базовый тип

Символьный тип данных является базовым типом при формировании структурированного строкового типа, поэтому напомним основные сведения и сделаем ряд предварительных замечаний именно по символьному типу.

В большинстве применений ЭВМ алфавитно-цифровая информация используется наряду с числовой информацией. Для ее представления в языке Паскаль предусмотрен тип данных char. Так же как переменная типаintegerможет хранить только одно целое число, переменная типаcharможет хранить одну литеру. Если, например, переменнаяchописана как переменная типаchar, то имеют смысл следующие операторы присваивания:

ch:=’P’;

ch:=’+’;

ch:=’3’;

Первый оператор присваивания делает значение переменной chравным литереР. Второй делаетchравным литере плюса (+). Третий делаетchравным литере 3. (Следует отметить, что литера 3 отличается от целого числа 3. Когда цифра 3 заключена в апострофы, то 3 – такая же литера, как и любая другая. Таким образом,chне может быть использована в арифметических выражениях, даже если ее значение случайно изображает цифру).

Набор значений типа char, доступных на данной ЭВМ, называетсямножеством литерэтой ЭВМ. Множество литер обычно включает в себя прописные и строчные буквы, цифры от 0 до 9 и ряд других символов. ЭВМ, на которых устанавливается компилятор с языка Паскаль, обычно используют код, называемыйASCII(американский стандартный код обмена информацией). Все литеры упорядочены таким образом, что соблюдаются следующие отношения:

A’<’B’<’C’< … <’X’<’Y’<’Z

0’<’1’<’2’< … <’7’<’8’<’9’

Для проверки равенства или неравенства переменных типа charмогут использоваться операции сравнения.

Так как char– порядковый тип, то функцииpred, succ, ordприменимы к значениям типаchar. Например, функцииSuccиPredвозвращают следующий и предшествующий символы литерного множества. Так,succ(‘0’)равен‘1’, потому что‘1’следует за‘0’. Порядковый номер значения типаcharназывается такжекодом литеры. Например, вASCIIкод литерыAравен 65, а код литеры‘3’равен 51. Функцияordвозвращает значение кода литеры для любого значения типаchar. Например, если переменнаяAlphaтипаcharимеет значение, равноеA, тоord(Alpha)=ord(‘A’)=65.

В языке Паскаль имеется функция chr, которая получает целочисленный аргумент и возвращает соответствующую литеру. На ЭВМ, использующей кодASCII,chr(65)равенA. Так как функцияchrявляется обратной по отношению кord, тоchr(ord(Alpha))=Alpha. Если вызватьchrс целым аргументом, который не является правильным кодом литеры, то это вызовет ошибку.

В языке Паскаль отсутствуют функции преобразования типов, которые преобразуют величины типа integerнепосредственно в значение типаcharи наоборот. Однако переменнаяcountявляется целым значением от 0 до 9 включительно, можно преобразовать его в значение типаcharс помощью следующего оператора присваивания:

Alpha:=chr(count+ord(‘0’))

И обратно, если Alphaсодержит цифровую литеру, можно преобразовать ее в значение типаinteger, записав

count:=ord(Alpha)-ord(‘0’)

Тот факт, что charявляется порядковым типом, означает, что переменная типаcharможет быть управляющей переменной для циклаforили селектором в оператореcase.

Пример 1.

{Распределение частот появления букв}

program LetterFreq;

var letters:array[‘A’..’Z’] of integer; {частоты появления букв}

symbol: char; {входная литера}

index: char; {индекс цикла}

begin

while not EOF do

begin

read(symbol);

if (symbol>=’A’) and (symbol<=’Z’) then inc(Letters[symbol])

end;

writeln(Index, Letters[Index}:15))

end.

Данная программа использует массив, тип индекса которого является интервалом типа char. Эта программа определяет частоту, с которой буквы алфавита появляются в тексте. После считывания текста каждый компонент массива содержит число появлений соответствующей литеры, причем в качестве индекса элемента используется сама литера.

Подобно другим типам данных, тип charможет быть использован в определениях констант. Рассмотрим пример определения символических констант типаchar:

const blank=’ ‘;

plus=’+’;

minus=’-‘;

Идентификаторы blank, plusиminusтеперь определены так, как если бы это были определяющие их литеры. Определять константы типаcharв особенности полезно, если некоторая литера выбрана в качестве указателя специфического условия. Например, в программеLetterFreqлитера‘@’может быть использована для указания конца вводимого текста. Для наглядности литере «конец текста» можно присвоить смысловое имя. Таким образом,

const

finished=’@’;

. . .

read(symbol);

while symbol <> finished do

begin

if (symbol>=’A’) and (symbol<=’Z’) then inc(letters[symbol]);

read(symbol)

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]