CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мысли о Паскале

Владислав ДЕМЬЯНИШИН nitromanit@mail.ru

(Продолжение, начало см. в МК № 46 (165), 51—52 (170—171))

Ограниченные типы

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

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

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

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

Замечу, что имена типов в приведенном примере начинаются с латинской буквы T неслучайно. Я как бы маркирую идентификаторы (имена), чтобы было видно, что эти имена являются именами типов, а не переменных или констант. Хоть впрочем, это дело вкуса — вы вольны называть свои типы как вам захочется.

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

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

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

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

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

Таким образом описан новый тип TTraffic_light и переменная Traffic_light этого типа, которая может принимать значения с именами Red, Yellow, Green, например:

Здесь переменной Traffic_light присваивается значение Red.

Сам же компилятор будет ассоциировать имена значений Red, Yellow, Green как числа 0, 1 и 2 соответственно.

Более простой пример. Если нужно, чтобы некая переменная отражала состояние телевизора или любого другого бытового прибора, т. е. включен или выключен прибор, то можно описать следующий тип и объявить переменную этого типа:

В данном случае описан новый тип TTVSet и переменная TVSet этого типа, которая может принимать значения с именами Off, On. Например:

Сам же компилятор будет воспринимать значения Off, On как числа 0 и 1 соответственно.

Для решения задачи с бытовым прибором можно было бы использовать переменную булевского (boolean) типа, но возможные значения такой переменной False/True не будут достаточно наглядными. Вот еще примеры перечислимых типов:

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

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

Недопустимо описание двух и более перечислимых типов с совпадающими константами. Например, описания вида

являются некорректными из-за повторного использования идентификатора Blue. Но почему? Да просто потому, что для типа TColor1 компилятор отметит себе, что константы Red, Yellow, Blue можно интерпретировать как числа 0, 1 и 2. А для типа TColor2 компилятор должен интерпретировать константы Green, Blue, Gray как числа 0, 1 и 2. Что же это? Неувязочка получается. Ведь для первого типа константа Blue = 2, а для второго Blue = 1 — это не серьезно, как говорил известный кино-герой.

Описание переменных, констант и типов

Описание переменных

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

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

Идентификатор (имя) переменной и ее тип разделяются в описании символом : (двоеточие); описание завершается разделителем ; (точка с запятой). Пример описания переменных:

Для переменных a, S и Sinus задан стандартный скалярный тип (соответственно, целый, символьный и вещественный). Тип переменной Index задан в виде ограничения целого типа диапазоном возможных значений от 0 до 5 включительно. Наконец, тип переменной Semaphore задан путем перечисления всех возможных значений (двух), которые обозначены идентификаторами Opened и Closed.

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

Используемая в языке Pascal форма описания переменных достаточно удобна и наглядна, однако страдает одним существенным недостатком, а именно: синтаксис описания переменной не позволяет задать ее начальное значение. Если смысл определяемой переменной предполагает некоторое конкретное начальное значение, то приходится использовать для его установки специальный оператор присваивания, что приводит к разрыву двух актуально связанных сегментов кода: объявления самой переменной и установки ее начального значения. Это снижает наглядность и читабельность программ и может вызвать появление ошибок, связанных с использованием неинициализированных переменных (начальное значение которых при запуске программы может оказаться произвольным). Частично этот недостаток может быть преодолен в Turbo Pascal’е за счет так называемых типизированных констант (читайте далее).

Для переменных, описанных в блоке, отводится определенный объем памяти, достаточный для размещения всех возможных значений этих переменных. Необходимо помнить, что на общее число глобальных переменных (т. е. переменных, описанных вне процедур и функций, включая глобальные переменные всех используемых модулей) в Turbo Pascal’е накладывается определенное ограничение. Оно состоит в том, что общий объем памяти, отведенный под эти переменные, НЕ ДОЛЖЕН ПРЕВЫШАТЬ 65520 байт (64 Кб). Ограничение связано с тем, что в этой системе под данные отводится один сегмент памяти. При необходимости можно обойти это ограничение, используя переменные ссылочных типов и механизм динамического распределения памяти (глава «Динамически распределяемая память»).

Каждая переменная, описанная в блоке, должна упоминаться в описаниях этого блока НЕ БОЛЕЕ ОДНОГО раза, при этом в таком блоке может быть еще несколько вложенных блоков, описания переменных которых могут содержать описания переменных с теми же именами, что и во внешнем блоке. Это относится не только к переменным, а вообще ко всем идентификаторам (констант, типов, меток, подпрограмм), которые объявляются в блоке. Такое правило не распространяется на имена полей комбинированных типов, которые могут совпадать с именами других объектов и с именами полей других комбинированных типов (см. раздел «Комбинированные типы (записи)»).

Описание констант

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

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

Описание констант начинается со служебного слова const, вслед за которым располагается последовательность описания констант. Описание каждой константы представляет собой пару «идентификатор = значение», разделителем пары служит символ = (равно). Каждая пара завершается символом ; (точка с запятой). Пример описания констант:

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

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

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

так же недопустим, как недопустима запись

Использование в программе имен констант вместо записи конкретных значений считается хорошим стилем программирования, так как делает программу более «читабельной» и способствует лучшему ее пониманию без какого бы то ни было снижения эффективности (в отношении быстродействия и объема занимаемой памяти). Кроме того, если некоторые важные для программы значения обозначены идентификаторами (например, границы массивов, показатели точности вычислений), то при необходимости их легко изменить, исправив описание соответствующих констант. В противном случае эти значения будут «растворены» в тексте программы, и придется просматривать ее целиком, чтобы провести нужные изменения. Хорошо, если можно будет ограничиться исправлением пары строк. А если нужное нам числовое или символьное значение употребляется многократно? Тогда лучше такое значение описать как константу с каким-нибудь именем, которое говорило бы само за себя — тогда вся рутина сведется к изменению одной строки, т. е. строки с писанием нашей константы.

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

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

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

Описание типов

В простейшем случае тип переменной указывается при ее описании явно, как, например, это было показано в предыдущем разделе. Однако Pascal допускает «отдельное» определение типа. Иными словами, можно сопоставить типу некоторое имя и в дальнейшем вместо явного указания типа использовать введенный для этого типа идентификатор-псевдоним.

Типы, аналогично переменным, определяются посредством описаний, которые начинаются со служебного слова type и содержит последовательность описаний типов. Каждое описание состоит из пары: имя типа и собственно тип. Имя типа обозначается идентификатором. Разделителем выступает символ = (равно). Каждая пара завершается символом ; (точка с запятой).

Примеры описания типов:

(Заметим, что описание типа Positive_Integer по существу выступает синонимом для стандартного скалярного типа word).

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

Таким образом, Pascal допускает как явное задание типа переменной, так и указание имени ранее определенного типа.

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov