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

24

Тема 16. Структурированные типы данных

Содержание:

16.1. Строки и средства их обработки 1

16.1.1. Процедуры и функции типа String 3

16.2. Записи 4

16.2.1. Записи с вариантами 6

16.2.2. Оператор присоединения 8

16.3. Множества 10

16.4.Файлы 12

16.4.1. Текстовые файлы 15

16.4.2. Компонентные файлы 16

16.4.3. Бестиповые файлы 17

16.4.4. Последовательный и прямой доступ 17

16.4.5. Основные задачи обработки файлов 19

 16.4.6. Сортировка файлов 20

16.4.7. Задача корректировки файла 23

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

Стандартные типы

Типы, определяемые программистом

Integer;

Перечисляемый тип;

Real;

Скалярный тип.

Char;

Boolean.

С понятием простого типа связаны:

    • имя типа;

    • множество допустимых значений типа;

    • набор операций, определенных на типе;

    • набор отношений, определенных на типе;

    • набор функций, определенных или принимающих значения на типе;

Из данных простых типов можно конструировать данные сложных типов. Единственным (пока изученным) примером сложных структурированных типов являются регулярные типы (значения – массивы). С понятием сложного типа связаны:

    • имя типа;

    • способ объединения данных в данное сложного типа;

    • способ доступа к данным, образующим сложное данное типа.

Так, определение

Type Vector = array [1..N] of Integer;

Var X : Vector;

задает N целых чисел, объединенных в единое целое – массив c именем X. Доступ к компоненте массива осуществляется по его имени X и значению индексного выражения X[i].

Кроме регулярных типов, в языке определены еще некоторые сложные типы. Каждое такое определение задает свой, характерный механизм объединения данных в единое целое и механизм доступа к данным – компонентам сложного данного.

Это – строка символов, комбинированный тип (записи), файловый тип (файлы), множественный тип (множе­ст­ва) и ссылочный тип (ссылки).

16.1. Строки и средства их обработки

Особое место в языке Паскаль занимают массивы символов. Стандартный Паскаль допускает два способа хранения символьных массивов в памяти ЭВМ: распакованный и упакованный. Распакованные массивы символов хранятся в памяти ЭВМ по одному символу в машинном слове, упакованные – по одному символу в байте. При описании упакованного массива символов используют служебное слово packed, например:

var mas: packed array[1..20] of char;

Описание распакованного массива символов имеет вид:

var m: array[1..20] of char;

Для преобразования символьного массива из распакованной формы в упакованную и наоборот, из упакованной в распакованную, в язык Паскаль введены две стандартные функции pack, unpack.

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

Строковые переменные – это одномерные упакованные массивы символов, для описания которых в Turbo Pascal введен тип string. Длина строки не может содержать более 255 символов. Значением строкового типа данных являются строки. Стандарт языка предусматривает использование строк только как констант, используемых в операторах вывода Write, Writeln. В расширении языка Turbo Pascal строковый тип данных определен гораздо полнее. Определение строкового типа следует диаграмме:

Здесь целое принадлежит диапазону 1..255 и означает максимальное количество символов в строке этого типа. Если описание типа String используется без указания максимального ко­ли­чества символов, это означает, что под этот тип по умолчанию резервируется 255 сим­волов. Тип string без указания длины совместим со всеми типами строк.

Например:

Type Name = String[20]; { строки из 20–ти символов }

Post = String; { строки из 255–ти символов }

Особенностью строковых переменных является то, что к ним можно обращаться как к скалярным переменным, так и к массивам. Во втором случае применяется конструкция "переменная с индексом", что обеспечивает доступ к отдельным символам строки. При этом нижняя граница индекса равна 1. Отдельный символ строки совместим с типом char.

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

Инициализация строк может производиться как с помощью типизированных констант:

const sname: string[9]= 'ibm pc/at';

так и с использованием второй разновидности функции fillchar:

fillchar( var v; nbytes: word; c: char );

Например:

fillchar(a, sizeof(a), '0');

Строки могут быть элементами списка ввода–вывода, при этом записывается имя строки без индекса. При вводе строковых переменных количество вводимых символов может быть меньше, чем длина строки. В этом случае вводимые символы размещаются с начала строки, а оставшиеся байты заполняются пробелами. Если количество вводимых символов превышает длину строки, лишние символы отбрасываются. Для ввода нескольких строковых данных следует пользоваться оператором Readln, так как оператор Read в этих случаях может вести себя непредсказуемо.

Для строк определены операции присваивания, слияния (конкатенации) и сравнения.

Над строками определена операция конкатенации "+", результат которой – строка, в которой операнды соединены в порядке их следования в выражении. Например:

'Turbo' + 'Pascal' = 'TurboPascal';

'Turbo_' + 'Pascal ' + 'System' = 'Turbo_Pascal System';

Поэтому результатом выполнения серии операторов

X := 'Пример'; Y := 'сложения'; Z := 'строк';

Writeln(X + Y + Z); Writeln(Y + ' ' + Z + ' ' + X);

будут выведенные на экран строки

Примерсложениястрок

сложения строк Пример

Тип String допускает и пустую строку – строку, не содержащую символов: EmptyStr := '' {подряд идущие кавычки}. Она играет роль нуля (нейтрального элемента) операции конкатенации: EmptyStr + X = X + EmptyStr = X.

Для сравнения строк применяются все операции отношения. Сравнение строк происходит посимвольно, начиная с первого символа. Строки равны, если имеют одинаковую длину и посимвольно эквивалентны.

Над строками определены также отношения (операции логического типа): =, <>, <, >, <=, >=.

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

а) порядок на строках согласован с порядком, заданным на символьном типе (Char);

б) сравнение двух строк осуществляется посимвольно, начиная с первых символов;

в) если строка A есть начало строки B, то A < В;

г) пустая строка – наименьший элемент типа.

Например:

а) 'с' < 'k', так как Ord(‘c’) < Ord(‘k’);

б) 'abс' < 'abk', так как первые два символа строк совпадают, а сравнение третьих дает Ord(‘c’) < Ord(‘k’);

в) 'abс' < 'abkd', так как первые два символа строк совпадают, а сравнение третьих дает Ord(‘c’) < Ord(k);

г) 'ab' < 'abсd', так как строка 'ab'– начало строки 'abсd'.

Для работы со строками в Turbo Pascal включены процедуры и функции, которые обеспечивают редактирование и преобразование строк.

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