Реферат

Реферат Типы данных в языке Паскаль

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 9.11.2024





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

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

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

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

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

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

Несколько особняком стоят объектные типы, или объекты. Являясь, с формальной точки зрения, обобщением комбинированных типов (записей), они позволяют радикально изменить подход к разработке программ, предлагая так называемый объектно-ориентированный стиль программирования.

I. Простые типы: порядковые, вещественные, дата-время.

Порядковый тип в свою очередь делится на:

1. целые типы;

2. логический тип или булевский тип;

3. символьный тип;

4. перечисляемые типы;

5. ограниченные типы или тип-диапазон.

На основе стандартных скалярных типов имеется возможность образовывать пользовательские скалярные типы. Есть два способа порождения новых скалярных типов - ограниченные и перечислимые типы.

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

1. Целые типы

Эта группа типов обозначает множество целых чисел в различных диапазонах. Имеется пять целых типов, различающихся допустимым диапазоном значений и размером занимаемой памяти. Целые типы обозначаются идентификаторами Integer, Byte, ShortInt, Word, LongInt; их характеристики приведены в таблице 1.

Таблица 1

Тип

Диапазон значений

Размер памяти

ShortInt

-128..127

1 байт

Integer

-32768..32767

2 байта

LongInt

-2147483648..2147483647

4 байта

Byte

0..255

1 байт

Word

0..65535

2 байта



Значения целых типов могут изображаться в программе двумя способами: в десятичном виде и в шестнадцатеричном коде. В последнем случае в начале такого кода ставится символ ‘$’.

Примеры:

123

-1

$F1 (десятичное представление 241)

0$B80

2. Булевский (логический) тип

К логическим относятся типы Boolean, ByteBool, Bool, wordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта.

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

true (истина)

false (ложь).

3. Символьный тип

Значениями символьного типа являются символы из множества ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией). Это множество состоит из 256 различных символов, упорядоченных определенным образом, и содержит символы заглавных и строчных букв, цифр и различных других символов, включая специальные управляющие символы. Допускаются некоторые отклонения от стандарта ASCII, в частности, при наличии соответствующей системной поддержки это множество может содержать буквы русского алфавита.

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

‘*’ ‘a’ ‘X’ ‘:’ ‘’’’

Для представления самого апострофа его изображение удваивается.

Если символ, который нужно изобразить, не имеет графического представления, то можно воспользоваться следующей эквивалентной формой записи, состоящей из символа ‘#’ (решетка, диез) и целочисленного кода символа (от 0 до 255):

#10 #$A

4. Перечислимые типы

Скалярные типы, введенные ранее, в целом не выходят за рамки интуитивно понятной трактовки типа как множества традиционных (целых, вещественных или символьных) значений из определенного диапазона. Перечислимые типы вводят некоторое простое обобщение такой трактовки посредством абстрагирования от “физической” природы значений.

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

Например: Пусть необходимо разработать программу управления уличным светофором. Ясно, что программа будет моделировать светофор с помощью указания его текущего состояния, т.е. включенного в данный момент света. Таким образом, переменная программы, представляющая светофор, может принимать одно из трех значений, соответствующих красному, желтому и зеленому цветам. Можно было бы ввести для этого переменную целого типа и установить, что, например, значения 1, 2, 3 соответствуют указанным цветам. Однако очевидно, что числа, кодирующие цвета, не имеют прямого отношения к решаемой задаче и, следовательно, усложняют программу и затемняют ее смысл. Поэтому наиболее естественным решением в данном случае будет введение перечислимого типа из трех значений, обозначаемых именами Red, Yellow, Green, и переменной этого типа.

Синтаксис определения перечислимого типа:

(идентификатор 1, идентификатор 2,...,идентификатор N)

Примеры перечислимых типов:

(Red, Yellow, Green)

(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)

(On, Off)

(Left, Up, Right, Down)

Перечислимые типы считаются дискретными типами. Над значениями перечислимых типов определены операции сравнения (считается, что значения перечислимого типа указаны в списке в порядке возрастания). Кроме того, допускается образование ограниченных типов из перечислимых по обычным правилам, например:

Monday..Friday

Left..Up

Имена из списка перечислимого типа считаются константами соответствующего перечислимого типа. Эти идентификаторы должны быть уникальны в пределах блока; недопустимы описания двух и более перечислимых типов с совпадающими константами.

5. Ограниченные типы (тип-диапазон)

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

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

Синтаксис определения такого типа:

минимальное_ значение..максимальное_значение

Например:

1..10

-100..100

‘a’..’z’

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

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

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

6. Вещественные типы

Эта группа типов обозначает множества вещественных значений в различных диапазонах Паскаль поддерживает четыре различных вещественных типа. Они именуются идентификаторами Real, Single, Double, Extended и Comp и имеют характеристики, представленные в таблице 2.


Таблица 2

Вещественный тип

Диапазон значений

Число цифр мантиссы

Размер памяти

Real

2.9 E-39..1.7E38

11-12

6 байт

Single

1.5E-45..3.4E38

7-8

4 байта

Double

5.0E-324..1.7E308

15-16

8 байт

Extended

3.4E-4932..1.1E493

19-20

10 байт

Comp

-2E+63..+2E+63-1



8 байт



Примечания

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

2.                  Все вещественные типы, кроме Real, могут использоваться в программе, вообще говоря, только если сделаны соответствующие опции компилятора. Для корректной компиляции программы, использующей эти типы, можно также применить директиву компилятора {+N}.

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

17.384

0.5

Вещественное число в форме с плавающей точкой записывается как пара вида:

<мантисса>Е<порядок>

Такое обозначение понимается как “мантисса, умноженная на 10 в степени, равной порядку”. Например:

7Е-2 эквивалентно 7· 10-2

12.25 Е+6 или 12.25 Е6 эквивалентно 12.25· 106

7. Дата/время

Тип дата-время определяется стандартным идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Во внутреннем представлении он занимает 8 байт и подобно currency представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной - время. Дата определяется как количество суток, прошедших с 30 декабря 1899 года, а время - как часть суток, прошедших с 0 часов, так что значение 36444,837 соответствует дате 11.10.1999 и времени 20:05. Количество суток может быть и отрицательным, однако значения меньшие -693594 (соответствует дате 00.00.0000 от Рождества Христова) игнорируются функциями преобразования даты к строковому типу.

II. Составные типы: структурированные типы, указатели, строки, процедурные, объекты, классы, варианты.

Структурированные типы в свою очередь делятся на:

1. регулярные типы (массивы);

2. комбинированные типы (записи);

3. множественные типы;

4. файловые типы;

Простые типы, описанные выше, определяют различные множества атомарных (неразделимых) значений. Составные, или структурные типы, в отличие от простых, задают множества «сложных» значений; каждое значение из такого множества образует некоторый агрегат (совокупность) нескольких значений другого типа (или других типов). Можно сказать, что составные типы определяют некоторый способ образования новых типов из уже имеющихся, причем отдельные элементы составных значений могут иметь любой, в том числе составной, тип. Таким образом, Паскаль допускает образование структур данных произвольной сложности, позволяя тем самым достичь адекватного представления в программе тех данных, с которыми она оперирует.

1. Регулярные типы (массивы)

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

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

Определение массива имеет следующий общий вид:

Type

A = array [T1] of T2;

Здесь:

Array, of – служебные слова;

Т1 – тип индекса массива;

Т2 – тип компонент массива.

В дальнейшем идентификатор этого типа может быть использован в описании переменных.

В качестве типа индекса может выступать любой дискретный тип, кроме LongInt и ограниченных типов, построенных из типа LongInt, в частности, допустимы ограниченные и перечислимые типы. Элементами массива могут быть переменные любого типа.

Ниже приведены описания различных массивов:

Type

M1 = array [1..100] of real;

M2 = array [char] of boolean;

Matrix = array [ 1..10 ] of array[1..20] of integer;

Database = array [1..MaxF] of file of Person;

Var

Vector: M1;

Sym_Table: M2;

Arr1, Arr2: Matrix;

S: array [Red, Yellow, Green] of boolean;

Примечания

1.                  Число элементов в массиве всегда должно быть фиксировано.

2.                  Для задания количества элементов массива используется тип; число элементов определяется количеством возможных значений указанного типа, что отличает язык Паскаль от многих других языков, в которых размер массива задается либо целым числом (или выражением целого типа), либо диапазоном целых чисел. Это придает Паскалю дополнительную гибкость, позволяя «нумеровать» элементы массива не только целыми числами, но и значениями произвольного целого типа.

3.                  В качестве элементов массива могут выступать значения любого типа; в частности, ими могут быть значения любых составных типов, например, массивы:

Var

V2: array[1..10] of array [1..20] of byte;

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

Var

V2: array [ 1..10, 1..20 ] of of byte;

Число индексов в определении (т.е. размерность массива) в языке не ограничивается.

4.                  Турбо Паскаль допускает единственное возможное действие над массивом в целом: использование его в операторе присваивания, например:

Vect1:=Vect2;

причем типы обоих массивов должны быть эквивалентны.

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

Пример:

V2 [ i, j ]:= V2 [ i, j-1 ] + 1;

Sym_Table [ ‘z’ ]:= Switch and Sym_Table [ ‘a’ ];

2. Комбинированные типы (записи)

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

Запись состоит из фиксированного числа компонентов, называемых полями записи. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.

Структура объявления типа записи такова:

<имя типа> = RECORD <список полей> END

Здесь:

<имя типа> - правильный идентификатор;

RECORD, END - зарезервированные слова (запись, конец);

<список полей> - этот список представляет собой последовательность разделов записи, между которыми ставится точка с запятой.

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором (идентификаторами) ставится двоеточие и описание типа поля (полей). Например:

Type

Birthday = record

day, month: byte;

year: word

end;

Var

a, b: Birthday;

.........

В этом примере тип Birthday (день рождения) содержит три поля с именами DAY, MONTH и YEAR (день, месяц, год); переменные A и B содержат записи типа Birthday.

Как видно из примера, распространенным случаем употребления записи является необходимость описать атрибуты (характеристики) некоторого объекта, представляемого и обрабатываемого в программе. Например, для описания объекта “человек” могут понадобиться следующие характеристики:

·                     фамилия, имя, отчество (символьные массивы или строки);

·                     пол (перечислимый тип из двух значений);

·                     индекс специальности (целое) и т.д.

В этом случае описание комбинированного типа Person (человек) может выглядеть следующим образом:

Type

Person =record

Name, SecondName, SurName: string [20];

Sex: (Male, Female);

Speciality: Word

end;

Имея в программе вышеприведенное описание, можно определить переменные данного типа, например:

Var Sasha, Masha, Natasha: Person;

Примечания

1.                  В пределах одной записи имена полей должны быть уникальны.

2.                  Имена полей могут совпадать с другими идентификаторами в пределах текущего блока, а также с именами полей в других записях.

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

Пример:

Type

Date = Record

Month: (Jan,Feb,Mar,Apr,May,June,July,Aug, Sept, Oct, Nov, Decem);

Day: 1..31;

Year: 1900..2000

end;

Person = Record

Name, SecondName, SurName: string [20];

Sex: (Male, Female);

Speciality: Word;

Birthday: Date

end;

Доступ к полям из элемента Birthday производится по общим правилам, например:

Sasha. Birthday. Year:= 1970;

Masha. Birthday. Month:= May;

3. Множественные типы

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

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

Синтаксис описания некоторого множественного типа имеет вид:

Type

<имя типа> = set of <базовый тип>;

Здесь:

<имя типа> - правильный идентификатор языка;

set, of - зарезервированные слова (множество, из);

<базовый тип> - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме WORD, INTEGER, LONGINT (т.е. типы BYTE и CHAR, перечислимые типы, а также ограниченные типы, образованные из них).

Пример:

Type

digitChar = set of ‘0’..’9’;

digit = set of 0..9;

elemColor = (Red, Yellow, Blue);

color = set of Color;

Var

s1, s2, s3: digitChar;

s4, s5, s6: digit;

myColor: Color;

Примечания

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

Например, не может быть множества: 1, 2, 2.

2.                  Порядок “расположения” элементов в множестве не имеет значения.

Множества:

1, 2, 3

3, 2, 1

одинаковы.

Это соответствует принятой в математике трактовке множества как бесповторной неупорядоченной совокупности объектов.

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

Например:

s6:= [1, 2, 3];

s4:= [ 0, 1, 2, 3+4 ];

s5:= [ 0..3, 6 ]; {эквивалентно множеству [0, 1, 2, 3, 6]}

s1:= [ ‘0’..’5’ ];

s2:= []; {пустое множество}

myColor:= [ Red ];

4. Файловые типы

Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Object Pascal, кроме файлов. Иными словами, нельзя создать “файл файлов”. В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Файловый тип можно задать одним из трех способов:

<имя> = File of <тип>;

<имя> = TextFile;

<имя> = File;

Здесь <имя> - имя файлового типа (правильный идентификатор);

File, of - зарезервированные слова (файл, из); TextFile - имя стандартного типа текстовых файлов; <тип> - любой тип Object Pascal, кроме файлов.

5. Указатели

Object Pascal предоставляет в распоряжение программиста гибкое средство управления динамической памятью - так называемые указатели. Указатель - это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой из известных в Object Pascal типов данных. Лишь некоторые из них (Byte, Char, ShortInt, Boolean) занимают во внутреннем представлении один байт, остальные - несколько смежных. Поэтому на самом деле указатель адресует лишь первый байт данных.

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

var

p1: ^Integer;

р2: ^Real;

6. Строковые типы

Тип STRING (строка) в Паскале широко используется для обработки текстов. Он во многом похож на одномерный массив символов ARRAY [0..N] OF CHAR, однако, в отличие от последнего, количество символов в строке-переменной может меняться от 0 до N, где N - максимальное количество символов в строке. Значение N определяется объявлением типа STRING[N] и может быть любой константой порядкового типа, но не больше 255.

Паскаль разрешает не указывать N, в этом случае длина строки принимается максимально возможной, а именно N=255.

Строка в Паскале трактуется как цепочка символов. К любому символу в строке можно обратиться так же, как к элементу одномерного массива ARRAY [0..N] OF CHAR, например:

Var

st: string;

.........

if st [5] = ‘A’ then.....

Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки. Первый значащий символ строки занимает второй байт и имеет индекс 1. Над длиной строки можно осуществлять необходимые действия и таким образом изменять длину.

Значение текущей длины строки можно не только извлекать из первого байта самой строки, но и получать с помощью функции LENGTH (st).

Например:

Var

st: string;

.........

write (‘Введите строку: ’);

readln (st);

writeln (‘Текущая длина строки - ’,Length(st));

........

Данный фрагмент программы распечатает текущую длину введенной строки.

К строкам можно применять операцию “+” - сцепление, например:

st:= ‘a’ + ‘b’;

st:= st + ‘c’; {st содержит “abc”}

Если длина сцепленной строки превысит максимально допустимую длину N, то “лишние” символы отбрасываются.

Операции отношения =, <>, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением CHR(0).

Следующие операции отношения дадут значение TRUE:

‘A’ > ‘1’

‘Turbo’ < ‘Turbo Pascal’

Паскаль’ >‘Turbo Pascal’

Все остальные действия над строками и символами реализуются с помощью встроенных процедур и функций.

7. Процедурные типы

Основное назначение процедурных типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.

Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:

type

Proc1 = Procedure (a, b, с: Real; var d: Real); Proc2 = Procedure (var a, b);

РгосЗ = Procedure;

Func1 = Function: String;

Func2 = Function (var s: String): Real;

Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.

8. Объекты

Тип данных Object является базовым в Visual Basic.NET. Это означает, что все типы данных и типы объектов являются производными от него либо непосредственно, либо косвенно. Это означает также, что любой другой тип данных, простейший или составной, может быть преобразован в Object. Если параметр Option Strict выключен, тип Object может быть использован в качестве универсального типа данных.

9. Классы

Классами в Object Pascal называются специальные типы, которые содержат поля, методы и свойства. Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называются объектами. Важным отличием классов от других типов является то, что объекты класса всегда распределяются в куче, поэтому объект-переменная фактически представляет собой лишь указатель на динамическую область памяти. В основе классов лежат три фундаментальных принципа, которые называются инкапсуляция, наследование и полиморфизм.

Пример:

type

TMyClass = class(TObject) Field: Integer;

end;

var

MyClass: TMyClass;

10. Варианты

Вариант (в Delphi 1 он отсутствует) - это тип variant, разработанный специально для тех случаев, когда на этапе компиляции программист не может сказать, какого типа данные будут использоваться в выражении или как параметры вызова подпрограмм. Переменная-вариант занимает в памяти дополнительные 2 байта, в которые помещается информация о действительном типе переменной. Эта информация позволяет компилятору создать код, который будет осуществлять необходимое преобразование типов на этапе прогона программы.

В переменную-вариант можно поместить:

·                     целое или вещественное число;

·                     логическое значение;

·                     строку;

·                     время и/или дату;

·                     OLE-объект;

·                     массив произвольной размерности и длины, содержащий элементы одного из перечисленных выше типов.

Варианты могут участвовать в целочисленных, вещественных, логических и время-дата выражениях при условии корректности соответствующих преобразований. Например, если варианту v присвоена строка '1.0', то выражение 1+v будет правильным вещественным значением 2,0. Однако если v:= 'текст', выражение 1+v вызовет исключение EVariantError.


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

История


Ещё в 1960-х гг. Р. Хиндли (Roger Hindley) исследовал типизацию в комбинаторной логике. Его проблемной областью была типизация в языках, основаных на теории лямбда-исчисления. Позднее, в конце 1960-х годов, тот же учёный исследовал полиморфные системы типов. Позже, в 1970-х годах, Робин Милнер предложил практическую реализацию расширенной системы полиморфной типизации для языка функционального программирования ML.

Определение


Тип (сорт) — относительно устойчивая и независимая совокупность элементов, которую можно выделить во всём рассматриваемом множестве (предметной области).[1]

Полиморфный тип — представление набора типов как единственного типа.

Математически тип может быть определён двумя способами:
  1. Множеством всех значений, принадлежащим типу.
  2. Предикатной функцией, определяющей принадлежность объекта к данному типу

Необходимость использования типов данных


Типы данных различаются начиная с нижних уровней системы. Так, например, даже в Ассемблере х86 различаются типы «целое число» и «вещественное число». Это объясняется тем, что для чисел рассматриваемых типов отводятся различные объёмы памяти, используются различные регистры микропроцессора, а для операций с ними применяются различные команды Ассемблера и различные ядра микропроцессора.

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

Практическое применение


Как правило, типы в языках программирования не всегда строго соответствуют подобным типам в математике. Например, тип «целое число» большинства языков программирования не соответствует принятому в математике типу «целое число», так как в математике указанный тип не имеет ограничений ни сверху, ни снизу, а в языках программирования эти ограничения есть. Как правило, в языках и системах имеется множество целых типов, отличающихся допустимым диапазоном значений (определяемым объёмом занимаемой памяти). Стоит отметить, что в большинстве реализаций языков и систем выход за границу целого типа (переполнение) не приводит к исключительной ситуации.

Современные языки программирования (включая Ассемблер) поддерживают оба способа задания типа (см. Определение). Так, в С++ тип enum является примером задания типа через набор значений. Определение класса (если рассматривать класс как тип данных) фактически является определением предиката типа, причём возможна проверка предиката как на этапе компиляции (проверка соответствия типов), так и на этапе выполнения (полиморфизм очень тесно связано с полиморфными типами). Для базовых типов подобные предикаты заданы создателями языка изначально.

Языки без типов


Теоретически не может существовать языков, в которых отсутствуют типы (включая полиморфные). Это следует из того, что все языки основаны на машине Тьюринга или на лямбда-исчислении. И в том, и в другом случае необходимо оперировать как минимум одним типом данных — хранящимся на ленте (машина Тьюринга) или передаваемым и возвращаемым из функции (лямбда-исчисление).

Языки программирования по способу определения типов данных


Ниже перечислены языки программирования по способу определения типов данных:

1) Языки с полиморфным типом данных. Одни языки не связывают переменные, константы, формальные параметры и возвращаемые значения функций с определёнными типами, поддерживая единственный полиморфный тип данных. В чистом виде таких языков не встречается, но близкие примеры — MS Visual Basic — тип variant, Пролог, Лисп — списки. В этих языках переменная может принимать значение любого типа, в параметры функции можно передавать значения любых типов, и вернуть функция также может значение любого типа. Сопоставление типов значений переменных и параметров с применяемыми к ним операциями производится непосредственно при выполнении этих операций. Например, выражение a+b, может трактоваться как сложение чисел, если a и b имеют числовые значения, как конкатенация строк, если a и b имеют строковые значения, и как недопустимая (ошибочная) операция, если типы значений a и b несовместимы. Такой порядок называют «динамической типизацией» (соответствует понятию полиморфизм в ООП, полиморфный тип в теории типов). Языки, поддерживающие только динамическую типизацию, называют иногда «бестиповыми». Это название не следует понимать как признак отсутствия понятия типов в языке — типы данных всё равно есть.

2) Языки с неявным определением типов. Казалось бы, BASIC является примером языка без типов. Однако это строго типизированый язык: в нём различаются строковые типы (добавляется символ $), массивы (добавляется []) и числовые типы (ничего не добавляется).

3) Языки с типом, определяемым пользователем. Также хорошо известны языки, в которых типы данных определяются автоматически, а не задаются пользователем. Каждой переменной, параметру, функции приписывается определённый тип данных. В этом случае для любого выражения возможность его выполнения и тип полученного значения могут быть определены без исполнения программы. Такой подход называют «статической типизацией». При этом правила обращения с переменными, выражениями и параметрами разных типов могут быть как очень строгими (С++), так и весьма либеральными (Си). Например, в классическом языке Си практически все типы данных совместимы — их можно применять совместно в любых выражениях, присваивать значение переменной одного типа переменной другого почти без ограничений. При таких операциях компилятор генерирует код, обеспечивающий преобразование типов, а логическая корректность такого преобразования остаётся на совести программиста. Подобные языки называют «языками со слабой типизацией». Противоположнось им — «языки с сильной типизацией», такие как Ада. В них каждая операция требует операндов строго заданных типов. Никакие автоматические преобразования типов не поддерживаются — их можно выполнить только явно, с помощью соответствующих функций и операций. Сильная типизация делает процесс программирования более сложным, но даёт в результате программы, содержащие заметно меньше труднообнаруживаемых ошибок.

На практике языки программирования поддерживают несколько моделей определения типов одновременно.

Базовые типы


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

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

  • Надёжность. Типы данных защищают от трёх видов ошибок:
  1. Некорректное присваивание. Пусть переменная объявлена как имеющая числовой тип. Тогда попытка присвоить ей символьное или какое-либо другое значение в случае статической типизации приведёт к ошибке компиляции и не даст такой программе запуститься. В случае динамической типизации код программы перед выполнением потенциально опасного действия сравнит типы данных переменной и значения и также выдаст ошибку. Всё это позволяет избежать неправильной работы и «падения» программы.
  2. Некорректная операция. Позволяет избежать попыток применения выражений вида «Hello world» + 1. Поскольку, как уже говорилось, все переменные в памяти хранятся как наборы битов, то при отсутствии типов подобная операция была выполнима (и могла дать результат вроде «ello worldǼ»). С использованием типов (см. далее «Контроль типов») такие ошибки отсекаются опять же на этапе компиляции.
  3. Некорректная передача параметров. Если функция «синус» ожидает, что ей будет передан числовой аргумент, то передача ей в качестве параметра строки «Hello world» может иметь непредсказуемые последствия. При помощи контроля типов такие ошибки также отсекаются на этапе компиляции.
  • Стандартизация. Благодаря соглашениям о типах, поддерживаемых большинством систем программирования, сложилась ситуация, когда программисты могут быстро менять свои рабочие инструменты, а программы не требуют больших переделок при переносе исходных текстов в другую среду. К сожалению, стандартизации по универсальным типам данных ещё есть куда развиваться.
  • Документация. Использование того или другого типа данных объясняет намерения программиста. Например, enum и bool в языке не обязательны и вместо них может быть int — но оба они означают, что перед нами не целая величина, а одно из нескольких предопределённых значений.

Классификация типов данных


Типы данных бывают следующие:
  • Простые.
    • Перечислимый тип. Может хранить только те значения, которые прямо указаны в его описании.
    • Числовые. Хранятся числа. Могут применяться обычные арифметические операции.
      • Целочисленные: со знаком, то есть могут принимать как положительные, так и отрицательные значения; и без знака, то есть могут принимать только неотрицательные значения.
      • Вещественные: с запятой (то есть хранятся знак и цифры целой и дробной частей) и с плавающей запятой (то есть число приводится к виду m*be, где m — мантисса, b — основание показательной функции, e — показатель степени (порядок) (в англоязычной литературе экспонента), причём в нормальной форме 0<=m<b, а в нормализованной форме 1<=m<b, e — целое число и хранятся знак и числа m и e).
      • Числа произвольной точности, обращение с которыми происходит посредством длинной арифметики. Примером языка с встроенной поддержкой таких типов является UBASIC, часто применяемый среди криптографов.
    • Символьный тип. Хранит один символ. Могут использоваться различные кодировки.
    • Логический тип. Имеет два значения: истина и ложь, при троичной логике может иметь и третье значение — «не определено» (или «неизвестно»). Могут применяться логические операции. Используется в операторах ветвления и циклах. В некоторых языках является подтипом числового типа, при этом ложь=0, истина=1.
    • Множество. В основном совпадает с обычным математическим понятием множества. Допустимы стандартные операции с множествами и проверка на принадлежность элемента множеству. В некоторых языках рассматривается как составной тип.
  • Составные (сложные).
    • Массив. Является индексированным набором элементов одного типа. Одномерный массив — вектор, двумерный массив — матрица.
      • Строковый тип. Хранит строку символов. Аналогом сложения в строковой алгебре является конкатенация (прибавление одной строки в конец другой строки). В языках, близких к бинарному представлению данных, чаще рассматривается как массив символов, в языках более высокой абстракции зачастую выделяется в качестве простого.
    • Запись (структура). Набор различных элементов (полей записи), хранимый как единое целое. Возможен доступ к отдельным полям записи. Например, struct в C или record в Pascal.
    • Файловый тип. Хранит только однотипные значения, доступ к которым осуществляется только последовательно (файл с произвольным доступом, включённый в некоторые системы программирования, фактически является неявным массивом).
    • Класс.
  • Другие типы данных. Если описанные выше типы данных представляли какие-либо объекты реального мира, то рассматриваемые здесь типы данных представляют объекты компьютерного мира, то есть являются исключительно компьютерными терминами.
    • Указатель. Хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило — указатель на переменную.
    • Ссылка.

Контроль типов и системы типизации


Процесс проверки и накладывания ограничений типов — контроля типов, может выполняться во время компилирования (статическая проверка) или во время выполнения (динамическая проверка).
  • Статическая типизация — контроль типов осуществляется при компиляции.
  • Динамическая типизация — контроль типов осуществляется во время выполнения.

Контроль типов также может быть строгим и слабым.
  • Строгая типизация — совместимость типов автоматически контролируется транслятором:
    • Номинативная типизация (англ. nominative type system) — совместимость должна быть явно указана (наследована) при определении типа.
    • Структурная типизация (англ. structural type system) — совместимость определяется структурой самого типа (типами элементов, из которых построен составной тип).
  • Слабая типизация — совместимость типов никак транслятором не контролируется. В языках со слабой типизацией обычно используется подход под названием «утиная типизация» — когда совместимость определяется и реализуется общим интерфейсом доступа к данным типа.

[править] См. также

  • Венгерская нотация
  • Динамическая идентификация типа данных
  • Отражение (программирование)
  • Приведение типа
  • Алгебраический тип данных
  • Область определения
  • Система отсчёта



1. Реферат Двумерный оптический сигнал и его информационная структура
2. Реферат Научная революция
3. Реферат на тему Theodore Roosevelt And Woodrow Wilson Essay Research
4. Реферат Решение управленческих задач
5. Реферат Анализ состояния и эффективности использования основных производительных фондов
6. Курсовая на тему Державна підтримка сільського господарства та її форми в Україні
7. Реферат на тему History Of Xander Harris Essay Research Paper
8. Реферат Учет реализации продукции, работ, услуг
9. Сочинение на тему Булгаков м. а. - Москва в изображении м. булгакова
10. Реферат на тему Romanticism Entrance To A Wood Essay Research