|
|||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Урок № 11. Структурные типы данных: строки, массивы, множества
Данные структурного типа состоят из данных других типов, в том числе и структурного. К данным структурного типа относятся: - Строки - Массивы - Множества - Записи - Файлы - Классы 1. Строки. Строки (строковые типы) представлены тремя физическими типами. Данные типа ShortString представляют собой строку, которая фактически является массивом из 256 элементов. Этот тип введен для совместимости с предыдущими версиями языка. Данные типов AnsiString и WideString представляют собой динамические массивы, максимальная длина которых фактически ограничена размером основной памяти компьютера. Данные типа AnsiString кодируются в коде ANSI, а типа WideString - в коде Unicode. Общим типом является тип string, который может, соответствовать типу ShortString или AnsiString, что определяется директивой компилятора $РРHhhhhH. По умолчанию используется {$H+} и тип String равен типу AnsiString.
Массивы. Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указывается имя этого массива и номер элемента, заключенный в квадратные скобки, например, а[4,35]. Количество индексных позиций определяет размерность массива (одномерный, двумерный и т. д). Различают массивы статические и динамические. Статический массив представляет собой массив, границы индексов и размеры которого задаются при объявлении, т. е. они известны до компиляции программы. Формат описания статического массива: Array [Тип индексов] of <Тип элементов>; Пример. Объявление статических массивов Type tm = Array[l.. 10, 1.. 100] of real; Var arrl,arr2: tm; arr3: Array[20.. 100] of char; arr4: Array['a’.. 'z'] of integer; Динамический массив представляет собой массив, для которого при объявлении указывается только тип его элементов, а размер массива определяется при выполнении программы. В Delphi использование динамических массивов стало возможным, начиная с версии 4 Формат описания типа динамического массива: Array of <Тип элементов>; Задание размера динамического массива во время выполнения программы производится процедурой SetLength (S, L), которая для динамического массива s устанавливает новый размер, равный L – целое число. Выполнять операции с динамическим массивом и его элементами можно только после задания размеров этого массива. Для работы с массивами используются следующие функции: Length() – определение длинны массива; Low() – минимальный номер элементов; High() – максимальный номер элементов. Нумерация элементов динамического массива начинается с нуля, поэтому функция low () для него всегда возвращает значение ноль. Пример. Описание одномерного динамического массива: var n: integer; m: array of real; ... SetLength(m, 100); for n=0 to 99 do m[n]:=n; SetLength (m, 200); Для описания типа многомерного динамического массива (например, двумерного) используется конструкция: Array of Array of <Тип элементов>;
Пример. Описание двухмерного динамического массива: var A: array of array of Integer: // Двумерный динамический массив begin // Устанавливаем длину первого измерения (количество столбцов): SetLength(A,3); // Задаем длину каждого столбца: SetLength(A[0],3): SetLength(A[l],3); SetLength(A[2],3): end; Действия над массивом обычно выполняются поэлементно, в том числе операции ввода и вывода. Поэлементная обработка массивов производится, как правило, с использованием циклов. 3.Множества Множество представляет собой совокупность элементов, выбранных из предопределенного набора значений. Все элементы множества имеют порядковый тип, количество элементов множества не может превышать 256. Формат описания множественного типа: Set of <Тип элементов>; Значения множественного типа заключаются в квадратные скобки. Пустое множество обозначается "[]". Операции, допустимые над множествами:
Также имеется операция in(x, s) – определение принадлежность выражения порядкового типа (х) множеству (s). Результат операции будет типа Boolean и иметь значение True, в случае соблюдения принадлежности значения множеству. Пример. Использование множеств. type dCh = set of '0'..'9'; d = set of 0..9; var Sl,s2,s3: dCh; s4,s5,s6: d; begin s1: = ['1’, '2', '3']; s2: = ['3’, '2', '1']; S3: = ['2', '3']; s4: = [0..3, 6]: S5: = [4, 5]; s6: = [3..9]; end: В этом примере множества S1 и S2 эквивалентны, а множество S3 включено в множество S2, но не эквивалентно ему. В Delphi множественные типы используются, например, для описания типа кнопок или типа параметров фильтра. Урок №12. Структурные типы данных: Записи, файлы, вариантные, классы памяти. Записи. Записи. Запись — это структура данных, состоящая из фиксированного количества компонентов, называемых полями записи. В отличие от массива компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.Имя поля должно быть уникальным в пределах записи. Структура объявления типа записи такова: имя_типа = record список_полей end; Здесь имя_типа — правильный идентификатор; record, end — зарезервированные слова (запись, конец); список__полей — последовательность разделов записи, между которыми ставится точка с запятой. Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором (идентификаторами) ставится двоеточие и описание типа поля (полей), например: type Data = record Day, Month: Byte; Year: Word; end; var a,b: Data; Различают фиксированные и вариантные записи. Фиксированная запись состоит из конечного числа полей, ее объявление имеет следующий формат: Record <Имя поля1>: <Тип поля>; ... <Имя поляN>: <Тип поля>; end; Вариантная запись, так жекак и фиксированная, имеет конечное число полей, однако предоставляет возможность по-разному интерпретировать области памяти, занимаемые полями. Все варианты записи располагаются в одном месте памяти и позволяют обращаться к ним по различным именам. type Forma = record Name: String; case byte of 0: (BirthPlace: String [40]): 1: (Country: String [20]: EntryPort: String [20]: Date1: 1..31; Date2: 1..31) end: Для обращения к конкретному полю необходимо указывать имя записи и имя поля, разделенные точкой. Пример. Использование записи. var Man: record Name: string; Salary: real; Note: string; end; ... Man.Name:='Иванов M.P.'; Man.Salary:=500; ... 2. Файлы Под файлом понимается именованная область внешней памяти компьютера (жесткого или гибкого диска, компакт-диска и т. п.). Файловый тип можно задать одним из трех способов: имя = File of тип; имя = TextFile; имя = File; Здесь имя — имя файлового типа (правильный идентификатор); File, of — зарезервированные слова (файл, из); TextFi1е — имя стандартного типа текстовых файлов; тип — любой тип Object Pascal, кроме файлов, объектов, вариантов, интерфейсов и динамических массивов. Пример: type Product = record Name: String; Code: Word; Cost: Comp; end; Text80 = File of String[80]: var F1: File of Char; F2: TextFile; F3: File; F4: Text80; F5: File of Product; В зависимости от способа объявления можно выделить три вида файлов: - типизированные файлы (задаются предложением File of...); - текстовые файлы (определяются типом TextFile); - нетипизированные файлы (определяются типом File). В наших примерах: F1, F4 и F5 — типизированные файлы, F2 — текстовый файл, F3 — нетипизированный файл. 3.Вариантные типы Вариант — это тип Variant, разработанный специально для тех случаев, когда на этапе компиляции программист не может сказать, какого типа данные будут использоваться в выражении или в параметрах вызова подпрограмм. В переменную-вариант можно поместить: · целое или вещественное число; · логическое значение; · строку; · время и/или дату; · OLE-объект; · массив произвольной размерности и длины, содержащий элементы одного из перечисленных выше типов: Все эти типы считаются совместимыми с типом variant и в случае необходимости преобразования типов выполняются автоматически. Для вариантной переменной определены два специфических значения: - unassigned - назначается переменной при ее описании и указывает, что значение переменной пока не присвоено и не определено; - Null — указывает, что переменная содержит значение неопределенного типа или что значение было потеряно.
4.Указатели Оперативная память компьютера представляет собой совокупность ячеек для хранения информации — байтов, каждый из которых имеет собственный номер. Эти номера называются адресами, они позволяют обращаться к любому байту памяти. Object Pascal предоставляет в распоряжение программиста гибкое средство управления динамической памятью — так называемые указатели. Указатель — это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой из известных в Object Pascal типов данных. Лишь некоторые из них (Byte, Char, Short I nt, Boolean) занимают во внутреннем представлении один байт, остальные — несколько смежных. Поэтому на самом деле указатель адресует лишь первый байт данных. Различают указатели типизированные и нетипизированные. Типизированный указатель может ссылаться на данные определенного типа, который задается при объявлении указателя или описании типа указателя. При этом используется значок ^перед именем типа адресуемых данных. Формат описания типа для типизированного указателя: Туре <Тип указателя> = ^<Тип адресуемых данных> Нетипизированный указатель имеет тип Pointer и может ссылаться на данные любого типа. С помощью указателя можно получить доступ к значению адресуемых данных. Для этого используется разыменовывание указателя — справа от имени указателя приписывается значок ^. Для определения адреса объекта, к которому можно обратиться с помощью указателя, используется операция @, записываемая перед именем этого объекта Пример. Использование указателя var p: ^integer; p1:point; n, k: integer; ... p:=@n; n:=100; k:=p^+10; ... После выполнения операторов значение переменной k будет равно 110. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.015 сек.) |