http://sulfurzona.ru/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Wing-Thunder Game (fly simulator)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
Скачать игру Крыло-Гром (Wing-Thunder) бесплатно
 
 

Паскаль для новичков (часть 3)

 

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

 
Автор: Владислав Демьянишин
 
Паскаль для новичковСтандартные скалярные типы, перечисленные выше, являются предопределенными в языке Turbo Pascal; их смысл в языке фиксирован. На основе стандартных типов программист может определить новые, собственные скалярные типы, руководствуясь несколькими простыми правилами.
 
Самым простым способом образования новых типов из уже существующих является ограничение (а именно, сужение) допустимого диапазона значений некоторого стандартного скалярного типа. Это ограничение определяется заданием минимального и максимального значений диапазона, например:
 
type
TOneTen = 1..10;
TNewShortInt = -100..100;
TNewChar = ‘a’..’z’;
 
В данном примере показано определение трех новых типов значений. Первые два типа образованы ограничениями диапазона некоторого целого типа. Введенный таким образом тип можно обозначить именем и использовать для описания переменных, а также строить с его помощью другие типы.
 
Допускается создание ограниченных типов из дискретных типов, т.е. из всех скалярных типов кроме вещественных. Ограниченный тип наследует все свойства базового типа (в частности, набор допустимых операций).
Замечу, что названия типов, которые я только что привел, начинаются с латинской буквы T не случайно. Я как бы маркирую идентификаторы (имена) моих типов, чтобы было видно, что эти имена являются именами типов, а не переменных или констант. Хотя это дело вкуса, и Вы вольны называть свои типы как Вам захочется.
 

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

 
Скалярные типы, описанные выше, в целом не выходят за рамки интуитивно понятной трактовки типа как множества традиционных (целых, вещественных или символьных) значений из определенного диапазона перечислимые типы вводят некоторое простое обобщение такой трактовки посредством абстрагирования от “физической” природы значений.
Т.е. можно описать новый тип путем явного перечисления всех возможных его значений, причем каждое такое значение будет определяться только именем этого значения. Лучше всего пояснить это на примере.
 
Пусть необходимо разработать программу управления уличным светофором. Ясно, что эта программа будет моделировать светофор с помощью указания его текущего состояния, т.е. включенного в данный момент света. Таким образом, переменная программы, представляющая светофор, может принимать одно из трех значений, соответствующих красному, желтому и зеленому цветам. Можно было бы описать для этого переменную целого типа и установить, что, например, значения 1, 2, 3 соответствуют указанным цветам.
 
Однако очевидно, что числа, кодирующие цвета, не имеют прямого отношения к решаемой задаче и, следовательно, усложняют программу и затемняют ее смысл. Поэтому наиболее естественным решением в данном случае будет описание перечислимого типа из трех значений, обозначаемых именами Red, Yellow, Green, и переменной этого типа:
 
type
TTraffic_light = ( Red, Yellow, Green );
var
Traffic_light: TTraffic_light;
 
Таким образом описан новый тип TTraffic_light и переменная Traffic_light этого типа, которая может принимать значения с именами Red, Yellow, Green, например:
 
Traffic_light := Red;
 
Здесь переменной Traffic_light присваивается значение Red.
Сам же компилятор будет ассоциировать имена значений Red, Yellow, Green как числа 0, 1 и 2 соответственно.
Более простой пример. Если нужно чтобы некая переменная отражала состояние телевизора или любого другого бытового прибора, т.е. включен или выключен прибор, то можно описать следующий тип и объявить переменную этого типа:
 
type
TTVSet = ( Off, On );
var
TVSet: TTVSet;
 
В данном случае описан новый тип TTVSet и переменная TVSet этого типа, которая может принимать значения с именами Off, On например:
 
TVSet := On;
 
Сам же компилятор будет ассоциировать имена значений Off, On как числа 0 и 1 соответственно.
Для решения задачи с бытовым прибором можно было бы использовать переменную булевского (boolean) типа, но тогда возможные значения такой переменной False/True не будут достаточно наглядными. Вот еще примеры перечислимых типов:
 
type
TDay = ( Monday, Tuesday, Wednesday, Thursday, Friday, Seturday, Sunday );
TWay = ( Left, Up, Right, Down );
 
Перечислимые типы считаются дискретными типами. Над значениями перечислимых типов определены операции сравнения (считается, что значения перечислимого типа указаны в списке в порядке возрастания от 0 ). Кроме того, допускается образование ограниченных типов из перечисленных по тем же правилам, например:
 
type
TWorkDay = Monday..Friday;
TOneWay = Left..Up;
 
Имена из списка перечисленного типа считаются константами соответствующего перечислимого типа. Эти идентификаторы должны быть уникальны (не должны повторятся) в пределах блока (подробнее о блоках будет сказано в главе “Операторы”);
Недопустимы описания двух и более перечислимых типов с совпадающими константами. Например, описания вида
 
type
TColor1 = ( Red, Yellow, Blue );
TColor2 = ( Green, Blue, Gray );
 
являются некорректными из-за повторного использования идентификатора Blue. Но почему? Да просто потому, что для типа TColor1 компилятор отметит себе, что константы Red, Yellow, Blue можно интерпретировать как числа 0, 1 и 2. А для типа TColor2 компилятор должен интерпретировать константы Green, Blue, Gray как числа 0, 1 и 2. Что же это? Неувязочка получается. Ведь для первого типа константа Blue = 2, а для второго Blue = 1, это не серьезно, как говорил известный кино-герой.
 

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

 

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

 
В программе Pascal любая используемая переменная, за исключением системных (предопределенных), должна быть определена (описана), причем определение переменной должно текстуально предшествовать первому ее использованию. Область известности (“видимости”) переменной ограничивается блоком, в котором она определена (подробнее о блоках будет сказано в главе “Операторы”). Переменные определяются посредством специальной конструкции, называемой описанием переменных. Описание переменных начинается со служебного слова var, вслед за которым располагается последовательность самих определений переменных.
 
Описание переменной должно содержать два элемента: имя переменной и ее тип. Так как Pascal является языком со статическими типами, то соответствие между именем переменной и ее типом остается неизменным (статическим) во всей области ее определения (блоке). Имя переменной задается с помощью идентификатора.
Идентификатор (имя) переменной и ее тип разделяются в описании символом “:” (двоеточие); описание завершается разделителем “;” (точка с запятой). Пример описания переменных:
 
var
a : integer;
Index : 0..5;
S : char;
Sinus : real;
Semaphore : ( Opened, Closed );
 
Для переменных a, S и Sinus задан стандартный скалярный тип (соответственно, целый, символьный и вещественный). Тип переменной Index задан в виде ограничения целого типа диапазоном возможных значений от 0 до 5 включительно. Наконец, тип переменной Semaphore задан путем перечисления всех возможных значений (двух), которые обозначены идентификаторами Opened и Closed.
 
Если необходимо ввести несколько переменных одного и того же типа, то можно воспользоваться сокращенной формой записи, в которой перед двоеточием записывается сразу несколько определяемых переменных. В этом случае в качестве разделителя идентификаторов в списке используется символ “,” (запятая). Примеры:
 
var
x, y, z : real;
Ind1, Ind2 : 1..100;
Det_1, Det_2, Det_3 : ( Wood, Steel, Glass );
 
Используемая в языке Pascal форма описания переменных достаточно удобна и наглядна, однако страдает одним существенным недостатком, а именно: синтаксис описания переменной не позволяет задать ее начальное значение. Если смысл определяемой переменной предполагает некоторое конкретное начальное значение, то приходится использовать для его установки специальный оператор присваивания, что приводит к текстуальному разрыву двух внутренне связанных действий: объявления самой переменной и установки ее начального значения. Это снижает наглядность и читабельность программ и может вызвать появление ошибок, связанных с использованием неинициализированных переменных (начальное значение которых при запуске программы может оказаться произвольным). Частично этот недостаток может быть преодолен в Turbo Pascal’е за счет так называемых типизированных констант (читайте далее).
 
Для переменных, описанных в блоке, отводится определенный объем памяти, достаточный для размещения всех возможных значений этих переменных. Необходимо помнить, что на общее число глобальных переменных (т.е. переменных, описанных вне процедур и функций, включая глобальные переменные всех используемых модулей) в Turbo Pascal’е накладывается определенное ограничение. Оно состоит в том, что общий объем памяти, отведенный под эти переменные, НЕ ДОЛЖЕН ПРЕВЫШАТЬ 65520 байт (64Кб). Ограничение связано с тем, что в этой системе под данные отводится один сегмент памяти. При необходимости можно обойти это ограничение, используя переменные ссылочных типов и механизм динамического отведения памяти (глава “Динамически распределяемая память ”).
 
Каждая переменная, описанная в блоке, должна упоминаться в описаниях этого блока НЕ БОЛЕЕ ОДНОГО раза, при этом в таком блоке может быть еще несколько вложенных блоков, описания переменных которых могут содержать описания переменных с теми же именами, что и во внешнем блоке. Это относится не только к переменным, а вообще ко всем идентификаторам (констант, типов, меток, подпрограмм), которые объявляются в блоке. Такое правило не распространяется на имена полей комбинированных типов, которые могут совпадать с именами других объектов и с именами полей других комбинированных типов (см. раздел “Комбинированные типы (записи)”).
 

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

 
Переменные в Pascal-программе являются информационными объектами, предназначенными для хранения значений определенного типа. В рамках заданного типа переменная может принимать (хранить, содержать) любое значение, которое изменяется (может изменяться) в процессе выполнения программы.
Pascal допускает введение в программы объектов, внешне похожих на переменные, но которые, в отличие от них, не могут изменять свое значение. Такие объекты называются константами. Можно сказать, что имя константы является синонимом некоторого определенного значения, которое сопоставляется с ее именем при описании этой константы.
 
Описание констант начинается со служебного слова const, вслед за которым располагается последовательность описания констант. Описание каждой константы представляет собой пару “идентификатор = значение”, разделителем пары служит символ ‘=’ (равно). Каждая пара завершается символом ‘;’ (точка с запятой). Пример описания констант:
 
const
One = 1;
HighLimit = 1000;
LowLimit = -HighLimit;
MaxReal = 1.7e38;
Separator = ‘***************’;
 
Обратите внимание, что в описаниях констант не указан тип значения. Считается, что значение, сопоставленное идентификатору константы, является единственно возможным для данной константы, поэтому ее тип однозначно определяется по тому конкретному, значению, которое сопоставляется с идентификатором.
Будучи определенной в программе, любое имя константы может входить во все конструкции, в которых может присутствовать связанное с ним значение, например, в выражения:
 
Diap := (HighLimit-X)/2 + One;
 
Естественно, не допускается ситуация, когда константе предлагается изменить значение, например оператор:
 
HighLimit := (X+Y)*2;
 
так же недопустим, как недопустима запись
 
1000 := (X+Y)*2;
 
Использование в программе имен констант вместо записи конкретных значений считается хорошим стилем программирования, так как делает программу более “читабельной” и способствует лучшему ее пониманию без какого бы то ни было снижения эффективности (в отношении быстродействия и объема занимаемой памяти). Кроме того, если некоторые важные для программы значения обозначены идентификаторами (например, границы массивов, показатели точности вычислений), то при необходимости их легко изменить, исправив описание соответствующих констант.
 
В противном случае эти значения будут “растворены” в тексте программы и придется просматривать ее целиком, чтобы провести нужные изменения. Хорошо, если понадобится исправлять пару строк. А если нужное нам числовое или символьное значение употребляется многократно. И вдруг нам понадобилось его изменить, то это превратится в рутину. Тогда лучше такое значение описать как константу с каким-нибудь именем, которое говорило бы само за себя, и вся рутина сводится к одному – изменению одной строки, т.е. строки с писанием нашей константы.
 
Допускается в качестве значений констант при их описании целые и вещественные числа (положительные и отрицательные), строки символов, а также имена других констант (возможно, со знаком). Еще допускается в правой части так называемое константное выражение. Константное выражение строится по тем же правилам, что и обычное выражение (см. главу “Выражения”), но его операндами могут быть числа, строки и имена констант. Кроме того, возможно использование некоторых стандартных функций, а именно:
 
Abs
Chr
Hi
Length
Lo
Odd
Ord
Pred
Ptr
Round
SizeOf
Succ
Swap
Trunc
 
Иными словами, структура константного выражения должна обеспечивать вычисление его значения без выполнения программы, т.е. при компиляции.
Примеры использования константных выражений при описании констант:
 
const
Min = 0;
Max = 100;
Center = (Max-Min) div 2;
Message = ‘Out of memory’;
ErrorTxt = ‘Error:’ + message + ’.’;
ErrorPos = 80 – Length(Errortxt) div 2;
Ln10 = 2.30258509299409955684;
Ln10R = 1/Ln10;
 

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

 
В простейшем случае тип переменной указывается при ее описании явно, как, например, это было показано в предыдущем разделе. Однако Pascal допускает “отдельное” определение типа. Иными словами, можно сопоставить типу некоторое имя и в дальнейшем вместо явного указания типа использовать введенный для этого типа идентификатор-псевдоним.
 
Типы, аналогично переменным, определяются посредством описаний, которые начинаются со служебного слова type и содержит последовательность описаний типов. Каждое описание состоит из пары: имя типа и собственно тип. Имя типа обозначается идентификатором. Разделителем выступает символ ‘=’ (равно). Каждая пара завершается символом ‘;’ (точка с запятой).
Примеры описания типов:
 
type
Days = ( Monday, Tuesday, Wednesday, Thursday, Friday,
Saturday, Sunday );
WorkingDays = Monday.. Friday;
Diapason = 1..20;
Letters = ‘a’..’z’;
Positive_Integer = word;
 
(Заметим, что описание типа Positive_Integer, по существу, вводит синоним для стандартного скалярного типа word).
Итак, наряду с именами стандартных типов (которые не нуждаются в специальных определениях), программист может определить и использовать свои собственные типы, расширяя тем самым исходный набор типов языка Pascal применительно к потребностям решаемой задачи. Далее приводится пример использования определенных выше типов:
 
var
Birthday, Current_Day : Days;
Index : Diapason;
First_Letter : Letters;
LoopCount : Positive_Integer;
 
Таким образом, Pascal допускает как явное задание типа переменной, так и указание имени ранее определенного типа.
 
Продолжение следует…
 
© Владислав Демьянишин
 
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ.
 

Журнал > Программирование > Паскаль для новичков (Turbo Pascal, Assembler) > Паскаль для новичков (часть 3). Описание переменных, констант и типов Pascal
 
 
 
 
 
 
На главную страницу На предыдущую страницу На начало страницы