Простые типы определяют различные множества неделимых значений. Структурированные (составные, структурные) типы данных задают множества значений, каждое из которых является совокупностью значений другого или других типов. Можно сказать, что составные типы определяют некоторый способ образования новых типов из уже имеющихся. Таким образом, допускается образование структур данных произвольной сложности.
§6.1. Массивы
Массив – это упорядоченная совокупность однотипных элементов, названных одним именем и различающихся индексами. Таким образом, доступ к элементам производится указанием общего имени и порядкового номера, то есть индекса или индексов, необходимого элемента.
Определение массива имеет вид:
Type <имя> = array [T1] of [T2];
Var <имя>[, …] : array [T1] of [T2];
Здесь Т1 обозначает тип индексов массива, Т2 – тип элементов массива. В качестве типа индекса можно использовать любой дискретный тип, кроме Longint, в основном используются диапазоны. Элементами массива могут быть значения любого типа, кроме файлового.
Пример:
Type
M2 = array [1..100] of real;
Z = array [boolean] of integer;
Количество индексов у элемента массива может быть и более одного, то есть могут использоваться не только вектора, но и матрицы, кубические матрицы и т.д. Таким образом, количество индексов у элемента массива определяет его размерность, а количество элементов, то есть произведение элементов в каждой размерности, определяет размер массива.
Так как в качестве элементов массива могут выступать значения любого типа, например другие массивы, то в общем случае типы индексов у элемента могут не совпадать:
Var Mass: array [1..10] of array [char] of array [boolean] of byte;
Соответственно, пример обращения к элементу массива, где в качестве индексов используются выражения соответствующего типа:
Mass[i+5]['A'][True]
Так как индексы могут вычисляться, то при обращении к элементам массива они являются арифметическими выражениями. Этот пример является полной формой записи, в основном же используют краткую форму:
Var Mass: array [1..10,char,boolean] of byte
например, с таким обращением
Mass[x+1,gamm,bool2]
В конкретной реализации Турбо-Паскаль, работающей в ОС MS DOS, есть ограничение на общее количество элементов одного массива, связанное с сегментной организацией памяти: максимальный размер 216 = 64Кбайт.
§6.2. Строки
Массивы, содержащие в качестве элементов символы, являются особенными. Если с обычными массивами обработка идет поэлементно, с использованием операций, разрешенных для элементов, то элементы текста взаимосвязаны, и, соответственно, используются специальные процедуры и функции.
В стандартном Паскале для строковых массивов были введены некоторые дополнительные правила, в Турбо-Паскале такие массивы выделены в отдельный тип – строки.
Строки описываются следующим образом:
Type <имя> = string [[<длина>]];
Var <имя>[, ...] : string [[<длина>]];
Здесь необязательный параметр <длина> указывает максимальное количество символов в строке. Если длина не задана, то по умолчанию (автоматически) принимается максимально возможная длина 255. Это связано с тем, что один байт как раз и указывает на длину строки, но в сам текст строки не включается.
Строка в Турбо Паскале трактуется как цепочка символов. К любому символу в строке можно обратиться точно так же, как к элементу одномерного массива ARRAY [0..N] OF CHAR: указывается имя и в квадратных скобках позиция символа. Например:
var
st: String;
begin
…
if st[5] = 'A' then…
…
В дополнение к операциям, применимым к переменным типа Char, введены групповые операции сцепления (конкатенации, объединения) нескольких строк с использованием знака «+». При этом длина итоговой строки увеличивается, и это главное отличие строк от массивов. Элементы строки нумеруются, начиная с единицы, отсутствие элементов – строка нулевой длины. Запись константы имеет вид строки, в следующем примере объединяются три константы:
Writeln(' Это'+' – '+'строка');
Результат: вывод строки «Это – строка»
Для работы со строками используются следующие стандартные процедуры и функции.
Функцию Concat (<строка> [, …]) можно использовать вместо операции сцепления. Тогда пример сцепления строк будет выглядеть как:
Writeln(Concat(' Это',' – ','строка');
Функция Length (<строка>) позволяет определить не предельную, а фактическую длину строки. Результат – целое число. Например:
If Length(st)<>0 then …
Функция UpCase (<символ>) позволяет преобразовать символ любой латинской буквы из строчной в прописную.
Функция Copy (<строка>, <номер первого символа>, <количество символов>) позволяет копировать или выделять фрагмент строки, например:
Writeln(Copy('Выводятся символы этой строки', 11,7));
Результат: вывод строки «символы».
Функция Pos (<искомая подстрока>, <строка>) позволяет произвести поиск определенного фрагмента в некоторой строке и определить номер символа, с которого начинается вхождение подстроки. Например:
Writeln(Pos('сл','Поиск слова');
Результат: вывод числа 7.
Процедура Insert (<вставляемая подстрока>, <строка>, <номер символа в строке>) вставляет в исходную строку, начиная с указанной позиции, другую строку. Например:
Insert('важного ','Поиск слова',7);
Результат – строка (второй аргумент) изменится на «Поиск важного слова».
Процедура Delete (<строка>, <номер первого удаляемого символа>, <количество символов>) удаляет в исходной строке фрагмент определенной длины:
Delete('Это – строка',4,2);
Результат – строка (первый аргумент) изменится на «Это строка». Удаляются 2 символа, так как пробел – тоже символ.
Процедура Val (<строка>, <переменная>, <код ошибки>) преобразует строку символов во внутреннее представление целой или вещественной переменной, которое определяется типом этой переменной. Третий параметр содержит ноль, если преобразование прошло успешно, и тогда переменной присваивается результат преобразований, в противном случае код ошибки содержит номер позиции в строке, где обнаружен ошибочный символ, и в этом случае содержимое переменной не меняется. Например:
VAL ('135.67',x,cod)
Результат: значение переменных х=135.67 (1.3567102), cod=0.
Достарыңызбен бөлісу: |