|
Навигация:
Сайт колледжа »
Форум »
Раздел "Операционные системы, программирование" »
[Просмотр темы в подразделе "
Pascal"]
|
|
|
|
piople
|
Тема создана: 14 января 2010 в 13:17
:: изменено - 11.08.2010 в 14:48
|
Группа: супермодератор
ICQ: 112
Проживает: Красноярский край, Канск
|
Структурные типы данных
Структурные типы объединяют в себе один или несколько других типов, в том числе и структурных. К структурным типам относятся:
- строки;
- записи;
- массивы;
- файлы;
- множества;
- классы.
Рассмотрим подробнее перечисленные типы, кроме классов, которые будут изучены позже — после знакомства с подпрограмми и модулями.
подпись однак0
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Юридический и фактический адрес КГА ПОУ «Канский педагогический колледж»: 663606, Красноярский край, г. Канск, ул. 40 лет Октября, д. 65.
Если у вас есть замечания или предложения по нашему сайту, то просим сюда: piople@cross-kpk.ru
Публикация персональных данных, в том числе фотографий, производится в соответствии
с Федеральным законом РФ № 152-ФЗ "О персональных данных" от 27.07.2006 г. (с изм. и доп.)
|
| | | |