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

Паскаль для новичков (часть 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 и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ. Предлагаю также посетить Марья искусница - сайт о рукоделии (http://mariya-iskusnica.ru).
 

Журнал > Программирование > Паскаль для новичков (Turbo Pascal, Assembler) > Паскаль для новичков (часть 3). Описание переменных, констант и типов Pascal
 
 
 
6085
 
ВКонтакте
Facebook
 
 
 
На главную страницу На предыдущую страницу На начало страницы
 
 
Украинский портАл Украина онлайн Рейтинг@Mail.ru Рейтинг Сайтов YandeG Rambler's Top100