Версия для слабовидящих
Навигация:  Сайт колледжа » Форум » Раздел "Операционные системы, программирование" » [Просмотр темы в подразделе " Pascal"]
piople
  Тема создана: 14 января 2010 в 13:17 :: изменено - 11.08.2010 в 14:48
Горбунов Александр Валерьевич

Группа: супермодератор
ICQ: 112
Проживает:
 Красноярский край, Канск

Структурные типы данных

Структурные типы объединяют в себе один или несколько других типов, в том числе и структурных. К структурным типам относятся:

  • строки;
  • записи;
  • массивы;
  • файлы;
  • множества;
  • классы.

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


подпись однак0
Страницы: (1) - : [1] :
piople
 Сообщение #1: 14 января 2010 в 13:22 :: изменено - 14.01.2010 в 14:17
К теме
Горбунов Александр Валерьевич

Группа: супермодератор
ICQ: 112
Проживает:
 Красноярский край, Канск

Строки

Строки (строковые типы) представлены тремя физическими (табл. 2.4) и одним общим типами.

 

Таблица 2.4. Физические строковые типы

Обозначение Максимальная длина, символов Память
 ShortString  255  2 байта .. 256 байт
 AnsiString  примерно 2x1031  4 байта .. 2 Гбайта
 WideString  примерно 2x1030  4 байта .. 2 Гбайта

 

 Тип Shortstring представляет собой строку, которая фактически является массивом из 256 элементов - array [0 .. 255]. Нулевой байт этого массива (строки) указывает длину строки. В ранних версиях языка подобная строка обозначалась типом string, тип shortstring введен в Object Pascal для обеспечения совместимости с этими версиями.

 

Типы Ansistring и WideString представляют собой динамические массивы, максимальная длина которых фактически ограничена размером основной памяти компьютера. В типе Ansistring символы кодируются в коде ANSJ, а в типе WideString - в коде Unicode.

 

Общим типом является тип string, который может соответствовать как типу Shortstring, так и типу Ansistring, что определяется директивой компилятора $н. По умолчанию используется {$н+}, и тип string равен типу Ansistring. В файле параметров проекта знак "+" директивы (а также других директив) соответствует записи н=1, а знак "-" - записи н=о. Разработчик обычно управляет интерпретацией типа string через окно параметров проекта, включая или отключая флажок Huge strings (Большие строки).

 

Так как строки фактически являются массивами символов, то для обращения к отдельному символу строки достаточно указать название строковой переменной и номер (позицию) этого символа в квадратных скобках, например, strName[l].

 

Кроме рассмотренных, в языке имеется еще тип pchar, представляющий так называемую строку с нулевым окончанием - в ее конце стоит код #о. Максимальная длина этой строки ограничена размером основной памяти компьютера.


подпись однак0
piople
 Сообщение #2: 14 января 2010 в 14:14 :: изменено - 14.01.2010 в 14:39
К теме
Горбунов Александр Валерьевич

Группа: супермодератор
ICQ: 112
Проживает:
 Красноярский край, Канск

Массивы

Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указывается имя этого массива и номер (номера) элемента, заключенный в квадратные скобки, например, аrrl[З, 35], arrl[3] (35] или аrrl[7).

 

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

 

Различают массивы статические и динамические. Статический массив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т. е. они известны еще до компиляции программы. Формат описания типа статического массива: Array [Тип индексов) of <Тип элементов>;

Например,

Type

tm = Array[l .. 10, 1 .. 100] of real;

...

Var

arrl, arr2: tm;

arr3: Array[20 100] of char;

arr4: Arrayl'a' .. '2'] of integer;

 

Переменные arrl и arr2 являются двумерными массивами по юоо элементов - ю строк и юо столбцов. Каждый элемент этих массивов представляет собой число типа real. Для объявления массивов arrl и агг2 введен специальный тип tm. Переменные аггЗ и агг4 являются одномерными массивами длиной в 81 символ и 26 целых чисел, соответственно.

 

Динамический массив представляет собой массив, для которого при объявлении указывается только тип его элементов, а размер массива определяется при выполнении программы. В Delphi использование динамических массивов стало возможным, начиная с версии 4. Формат описания типа динамического массива:

 

Array of <Тип элементов>;

 

Задание размера динамического массива во время выполнения программы производится Процедурой SetLength {var S; NewLength: Integer), которая для динамического массива s устанавливает новый размер, равный NewLength. Выполнять операции с динамическим массивом и его элементами можно только после задания размеров этого массива.

 

После задания размера динамического массива для определения его длины, а также минимального и максимального номеров элементов используются функции Length о, Low() и High о, соответственно. Нумерация элементов динамического массива начинается с нуля, поэтому функция LOW о для него всегда возвращает значение 0.

Приведем пример использования динамического массива.

var

n: integer;

m: array of real;

...

SetLength(m, 100);

for n:=0 to 99 do m[n] :=n;

SetLengthtm, 200); 

Здесь после описания динамического массива, состоящего из вещественных чисел, определяется его размер, равный ста. Каждому элементу присваивается значение, равное номеру этого элемента в массиве. Так как нумерация элементов массива начинается с нуля, то номер последнего из них равен не 100, а 99. После завершения цикла размер массива увеличивается до двухсот.

 

Для описания типа многомерного динамического массива, например двумерного, используется конструкция

Array of Array of <Тип элементов>;

 

Для многомерного, в частности двумерного, динамического массива установка новых размеров с помощью Процедуры SetLength (var S; NewLengthl, NewLength2: Tnteger) выполняется для каждого индекса.

 

Действия над массивом, в том числе и операции ввода/вывода, обычно производятся поэлементно. Поэлементная обработка массивов происходит, как правило, с помощью циклов. Массив в целом, т. с. как единый объект, может участвовать только в операциях отношения и в операторе присваивания, причем массивы должны быть полностью идентичными по структуре, т. е. иметь одинаковые типы индексов и одинаковые типы элементов.


подпись однак0
piople
 Сообщение #3: 14 января 2010 в 14:47 :: изменено - 14.01.2010 в 14:47
К теме
Горбунов Александр Валерьевич

Группа: супермодератор
ICQ: 112
Проживает:
 Красноярский край, Канск

Множества

Множество представляет собой совокупность элементов, выбранных из за­ранее определенного набора значений. Все элементы множества принадле­жат одному порядковому типу, число элементов в множестве не может пре­вышать 256. Формат описания множественного типа:

Set of <Тип злементов>;

  

Переменная множественного типа может содержать любое количество эле­ментов своего множества — от нуля до максимального. Значения множест­венного типа заключаются в квадратные скобки. Пустое множество обозна­чается как [].

  

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

 

Операция Наименование Тип результата Результат
+ Объединение множеств set of Неповторяющиеся элементы первого и второго множества
- Разность множеств set of Элементы первого множества, не принадлежат второму
* Пересечение множеств set of Элементы, общие для обоих множеств
= Эквивалентность boolean True, если множества эквивалентны
<> Неэквивалентность boolean True, если множества не эквивалентны
<= Проверка вхождения boolean True, если первое множество входит во второе
>= Проверка включения boolean True, если первое множество включает второе

 

Кроме того, имеется операция in (проверка членства), которая определяет принадлежность выражения порядкового типа (первого операнда) множест­ву (второму операнду). Результат операции имеет тип boolean и значение True в случае, если значение принадлежит множеству.

Пример использования множеств:

Type MonthDays = Set of 1 .. 31;

var Color:    Set of (Red, Blue, White, Black);

Day:     MonthDays;

Color:=[Blue1;

Color:=Color - [Blue, Red, White];

Color:=Color + [Black];

Color:=Color + [Black);

Day: = [] ;

Day:= Day -[1];

Day:=(2,   4};

Day:-Day + [5, 12, 1];

Day:=Day - [1];

Здесь определяется множественный тип MonhtDays и объявляются две пере­менные color и Day множественного типа, над которыми выполняются опе­рации объединения и вычитания. В четвертом операторе присваивания к множеству Color повторно добавляется значение Black. Такое присваивание корректно, однако значение множества при этом не изменяется. В шестом операторе присваивания из пустого множества Day вычитается элемент, в результате выполнения этого оператора значение множества также не из­меняется.

 

В Delphi множественые типы используются, например, для описания типа кнопок в заголовке окна TBordericons или типа параметров фильтра TFiltecOptions:

 

type TBorderlcon = (biSystemMenu, biMinimize, biMaximize, biHelp);

TBorderlcons = set of TBorderlcon;

type TFilterOption = (foCaselnsensitive, foNoPartialCompare);

TFilterOptions = set of TFilterOption;

Приведенные описания типов содержатся в исходных модулях Forms и Db, соответственно.


подпись однак0
piople
 Сообщение #4: 14 января 2010 в 14:49
К теме
Горбунов Александр Валерьевич

Группа: супермодератор
ICQ: 112
Проживает:
 Красноярский край, Канск

Записи

Записи объединяют фиксированное число элементов данных других типов. Отдельные элементы записи имеют имена и называются полями. Имя поля должно быть уникальным в пределах записи. Различают фиксированные и вариантные записи. Фиксированная запись состоит из конечного числа по­лей, ее объявление имеет формат:

Record 

<Имя поля1> : <Тип поля>;

<Имя поляП> : <Тип поля>;

end;

  

Вариантная запись, как и фиксированная, имеет конечное число полей, од­нако предоставляет возможность по-разному интерпретировать области па­мяти, занимаемые полями. Все варианты записи располагаются в одном месте памяти и позволяют обращаться к ним по различным именам. Отме­тим, что в данном случае термин "вариантный" не имеет ничего общего с типом variant. Формат объявления вариантной записи:

Record 

case <Признак> : <Тип признака> of <Вариант1> :   (<Описание варианта1>);

 

<Варианты> :   (<Описание вариантаы>);

end;

 

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

Пример использования записи:

var Man: record 

Name:     string; Salary: real; Note:     string; end;

 

Маn.Nате: = 'Иванов M.P. ';

Man.Salary:=500;

 

Переменная Man является фиксированной записью и имеет поля имени (Name), оклада (salary) и примечания (Note), каждое своего типа.

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

type TPoint = record

X: Longint;

Y: Longint; end;

TRect = record case Integer of

0:   (Left, Top, Right, Bottom: Integer); 1:   (TopLeft, BottomRight: TPoint);

end;

Здесь тип TPoint является фиксированной записью, а тип TRect — вариант­ной записью.

В варианте 0 запись трактуется как состоящая из четырех отдельных полей типа integer, в варианте 1 — как состоящая из двух полей типа TPoint.


подпись однак0
piople
 Сообщение #5: 14 января 2010 в 14:52 :: изменено - 14.01.2010 в 14:52
К теме
Горбунов Александр Валерьевич

Группа: супермодератор
ICQ: 112
Проживает:
 Красноярский край, Канск

Файлы 

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

 

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

 

В зависимости от типа элементов различают текстовые, типированные и нетипированныс файлы. Текстовый файл содержит строки символов пере­менной длины, типированный файл составляют элементы указанного типа (кроме файлового), а в нетипированном файле находятся элементы, тип ко­торых не указан. Описание файловой переменной, предназначенной для работы с файлом, должно соответствовать типу элементов файла.

 

Например:

Var fl: TextFile;

f2: File of integer;

f3: File of real; f

4: File;

Здесь переменная fl предназначена для работы с текстовыми файлами. Пе­ременные f2 и f3 служат для работы с типированными файлами, содержа­щими целые и вещественные числа, соответственно. Переменная f 4 предна­значена для работы с нетипированными файлами.

 

Замечание

В языке Object Pascal описателем текстовых файлов служит слово Text. В Delphi многие компоненты имеют одноименное свойство, поэтому при описании тек­стовых файлов этот описатель в чистом виде использовать нельзя: текстовый файл определяется как TextFile или system.Text (описатель Text из мо­дуля System).

 

Для непосредственной работы с файлами многие компоненты (объекты) предоставляют соответствующие методы, например, LoadFromFiie   (constFileName:   String) — загрузить из файла или SaveToFile   (const FileName:string) — сохранить в файле. В таких методах файловая переменная не нужна, и в параметре FileName указывается просто имя файла.

 

Подробнее работа с файлами рассматривается в отдельной теме.


подпись однак0
Страницы: (1) - : [1] :
  Юридический и фактический адрес КГА ПОУ «Канский педагогический колледж»: 663606, Красноярский край, г. Канск, ул. 40 лет Октября, д. 65.
  Если у вас есть замечания или предложения по нашему сайту, то просим сюда: piople@cross-kpk.ru
Публикация персональных данных, в том числе фотографий, производится в соответствии с Федеральным законом РФ № 152-ФЗ "О персональных данных" от 27.07.2006 г. (с изм. и доп.)