Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИНФОРМАТИКА 2-15.doc
Скачиваний:
21
Добавлен:
26.10.2018
Размер:
804.35 Кб
Скачать

5. Структурированные типы данных и работа с ними.

В нашем курсе рассматриваются четыре структурированных типа: массивы, строки, записи и файлы. Вне рассмотрения остались множества (как тип данных) и два очень интересных, но, к сожалению, мало применимых типа: перечисляемый и ограниченный (причина этой самой «малой применимости», на мой взгляд, кроется в том, что для этих двух типов не реализованы функции ввода-вывода значений).

Итак, что же есть структурированный тип данных? Переменная любого структурированного типа содержит в себе некоторое количество компонентов. Каждый компонент, в свою очередь, может быть простого типа или, в более сложном случае, структурированного.

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

Так как в структурированных данных под одним именем «скрывается» множество элементов, появляется необходимость каким-то образом обращаться к каждому элементу. В массивах этой цели служат индексы, например, пятый элемент массива day будет обозначаться day[5] (в математике такой элемент обозначался бы day5). Если в математике мы привыкли нумеровать элементы массива с 1, то в программировании возможна нумерация с любого номера: с 1, с 0, с -10, с 23…

Таким образом, при объявлении массива в разделе VAR необходимо указать имя массива, его размерность (номера начального и конечного индексов), тип его элементов:

day: array [1..31] of integer; — вот так объявляется одномерный массив из 31 элемента целого типа.

А вот так можно объявить массив, элементами которого являются другие массивы:

day: array [1..31] of array [0..3] of integer;

или: day: array [1..31,0..3] of integer;

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

  • количество элементов в массиве-строке (иначе говоря, количество символов в строке) ограничено числом 255, тогда как количество элементов в массиве практически не ограничено (точнее, ограничено типом переменной-индекса);

  • индекс одномерного массива может изменяться в любых пределах, в том числе и быть отрицательным, тогда как индексы символов строк не могут выходить за пределы [1..255];

  • соответственно, при объявлении массива необходимо указывать полные границы индексов (a: array [4..27] of integer), при объявлении же строки́ можно эти границы вообще не указывать (a: string — в этом случае строка может содержать до 255 символов), а можно в целях экономии памяти указать ограничение (a: string[50] — в этом случае в строку будут помещаться только первые 50 символов);

  • массив всегда имеет объявленную длину, даже если вы заполнили только некоторые из его элементов (например, объявлен массив a: array[1..10] of integer, а значения присвоены только первым трём элементам — остальные элементы при этом существуют и просто равны нулю). Строка же может иметь длину, меньшую заявленной (строка объявлена так: s: string[10], а в программе ей задано такое значение: s:='Привет!' — в этом случае s[8] не существует, равно как и s[9], и s[10]). Длину строки можно узнать с помощью функции length, либо просто прочитав значение нулевого символа: s[0]=length(s);

  • для строкового типа данных создано большое количество процедур и функций, которые позволяют удалять часть строки, вставлять подстроку в указанную позицию строки, выполнять множество других операций; для массивов все подобные операции программисту приходится выполнять самостоятельно. Посмотрите, например, как выполняются операции удаления пары элементов (пусть это будут, например, 5 и 6 элементы) для строки и для массива:

Строка

Массив

VAR   s:string; BEGIN …   delete(s,5,2); …

VAR   a: array [1..20] of integer; BEGIN …   for i:=7 to 20 do   begin     a[i-2]:=a[i];     a[i]:=0;   end; …

Итак, строка — это массив символов; проявляется её «массивность» в том, что к её элементам (то есть, символам) можно обращаться по индексам, можно перебирать множество символов строки в цикле так же, как и обычный массив. Однако стоит помнить, что для работы со строками реализовано множество процедур и функций, поэтому не стоит изобретать велосипед и пытаться обрабатывать строки как обычные массивы.

Записи. Изначально записи были созданы для хранения баз данных. В отличие от массива, элементами записей (их называют полями) могут быть даные различных типов. Именно поэтому при объявлении записи для каждого элемента указывается его тип. Например, так создаётся тип, в котором будет храниться дата (день, месяц, год):

TYPE   dateR=record     day:byte;     month:string[10];     year:integer;   end;

Переменная для хранения даты объявляется таким образом:

VAR a:dateR; …

Теперь в программе можно обращаться к полям переменной a. Для этого имя поля записывают через точку после имени переменной:

a.day:=7; a.month:='апрель'; a.year:=2000;

Элементы (компоненты) записи могут быть массивами или записями. Так, мы можем создать запись, которая позволит хранить данные студента, следующим образом:

TYPE   dateR=record     day:byte;     month:string[10];     year:integer;   end;   student=record     name:string[30];     bd:dateR;     grade:array[1..12]of byte;   end;

Тогда переменная, в которой эти данные будут храниться, будет объявлена следующим образом:

VAR   st:student;

А так можно обратиться к полям записи:

BEGIN …   st.name:='Василий Петров';   st.dateR.day:=23;   st.dateR.month:='март';   st.dateR.year:=1995;   st.grade[1]:=4;   st.grade[2]:=5; …

Поскольку обычно записи используют для хранения баз данных, то часто объявляют не «одиночную» переменную такого типа, а массив записей:

VAR   st:array[1..125] of student;

Обратиться к элементам такого массива можно будет так:

st[5].dateR.month:='март'; {месяц рождения пятого студента} st[5].grade[3]:=4;         {третья оценка пятого студента}  

Конец формы

Множества. К сожалению, из-за недостатка времени в курсе «Основы алгоритмизации и программирование на языке Pascal» не рассматривается этот очень интересный тип данных. Однако множества в курсе используются, хоть и не названные своим именем. Так, для проверки принадлежности значения переменной некоторому отрезку «правильно» использовать логическое выражение:

if (k>=2) and (k<=15) then …

Однако намного более эффективно воспользоваться операциями над множествами:

if k in [2..15] then …

Такая запись условия не только более наглядна, она быстрее выполнится при работе программы. А проблемам оптимизации программного кода в курсе уделено большое внимание.

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

  • объявление файловой переменной в разделе VAR: f: file of <тип данных> или f: text;

  • ассоциирование файловой переменной с файлом на диске — это делается с помощью процедуры assign(f,'name');

  • открытие файла для чтения или записи (в зависимости от типа файла — типизированный или текстовый — и выполняемого действия используются процедуры reset(f), rewrite(f) или append(f));

  • собственно чтение данных из файла или запись данных в него (команды Write(f,…) и Read(f,…), для текстовых файлов можно использовать также команды WriteLn(f,…) и ReadLn(f,…));

  • закрытие файла командой Close(f).

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

Type Colors = (Red,Green,Blue);

Numbers = (Zero,One,Two,Three,Four,Five);

var c:Colors; n:Numbers;

Тип-Диапазон:

Тип-диапазон также называют ограниченным или интервальным типом. Он является подмножеством своего базового типа, в качестве которого может выступать любой порядковый тип кроме типа-диапазона. Тип-диапазон наследует все свойства своего базового типа. Имеются две стандартные функции, работающие с этим типом: High(x)- возвращает максимальное значение типа-диапазона, к которому принадлежит переменная x; Low(x) - возвращает минимальное значение.

type Abc = 'A' .. 'z'; {все английские буквы : диапазон на базе типа Char}

Digits = 0 .. 9; {цифры}

var n:Num; c,d:Abc; x:integer;