Главная  Терминология Хоора 

1 2 3 4 [ 5 ] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

J.2. Концепция типа для данных 19

оостых, неструктурированных типов. Самый простой метод исания простого типа - это перечисление значений этого °ипа Например, в программе, связанной с плоскими геомет-ическими фигурами, может описываться простой тип, называемый фигурой, значения которого задаются идентификато-оами прямоугольник, квадрат, эллипс, круг. Но кроме типов, задаваемых программистом, нужно иметь некоторые стандартные типы, которые называются предопределенными. Они обычно включают числа и логические переменные. Если значения некоторого типа упорядочены, то такой тип называется упорядоченным или скалярным. В Паскале предполагается, что все неструктурированные типы упорядочены, в случае когда значения явно перечисляются, считается, что они упорядочены в порядке перечисления.

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

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

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



typer==(c С2, с„) (1-1)

Кардинальное число Т есть card(T) = п. Примеры:

type фигура={прямоугольник, квадрат, эллипс, круг) type цвет={красный, желтый, зеленый) type пол - {мужской, женский) type Boolean = {false, true)

Фортран и ПЛ/1, которые используют знак равенства в качестве оператора присваивания):

Проверка равенства: х = у Присваивание: х:-у

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

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

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

1.3. простые типы данных

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

.. , Сп



1.3. Простые типы данных 21

. Qgfib = {понедельник, вторник, среда, четверг, пятница, . суббота, воскресенье)

tvoe валюта = {франк, марка, фунт, доллар, шиллинг,

лира, гульден, крона, рубль, крузейро, иена) tvpe обитель {ад, чистилище, рай)

tvpe транспорт = {поезд, автобус, автомобиль, пароход, самолет)

tvpe звание = {рядовой, капрал, сержант, лейтенант, капитан, майор, полковник, генерал)

type объект = {константа, тип, переменная, процедура, функция)

type структура = {файл, массив, запись, множество) type состояние -{выключено, пустое, ошибка, перекос)

При определении таких типов вводится не только новый идентификатор типа, но одновременно - множество идентификаторов, соответствующих значениям этого типа. Эти идентификаторы могут затем использоваться в программе как константы, при этом программа становится намного понятней. Если, например, мы определим переменные s, d, г я b

vars: пол vard: день varr: звание \&тЬ: Boolean

то возможны следующие операторы присваивания;

S := мужской d :~ воскресенье г := майор Ь := true

Очевидно, что они намного более информативны, чем операторы

s:=l d:=7 r:=6 b:=2

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

s:=s+ 1

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




1 2 3 4 [ 5 ] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133