TURBO PASCAL |
Новости
|
Порядковые типы
К порядковым типам относятся (см. рис.4.1) целые, логический, символьный, перечисляемый и тип-диапазон. К любому из них применима функция ORD(X), которая возвращает порядковый номер значения выражения X. Для целых типов функция ORD(X) возвращает само значение X, т.е. ORD(X) = X для X, принадлежащего любому шелому типу. Применение ORD(X) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 155 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ORD(X) зависит от свойств этого типа. К порядковым типам можно также применять функции: PRED (X) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру ORD(X)- 1), т.е. ORD(PRED(X)) = ORD(X) - 1; SUCC (X) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ORD(X) +1, т.е. ORD(SUCC(X)) = ORD(X) + 1. Например, если в программе определена переменная var с : Char; begin с := '5' ; end. то функция PRED(C) вернет значение '4', а функция SUCC(C) - значение '6'. Если представить себе любой порядковый тип как упорядоченное множество значий, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция PRED(X) не определена для левого, a SUCC(X) - для правого конца этого отрезка. Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта. В табл. 4.1 приводится название целых типов, длина их внутреннего представления в байтах и диапазон возможных значений. Таблица 4.1
При использовании процедур и функций с целочисленными параметрами следует руководствоваться «вложенностью» типов, т.е. везде, где может использоваться WORD, допускается использование BYTE (но не наоборот), в LONGINT «входит» INTEGER, который, в свою очередь, включает в себя SHORTINT. Перечень процедур и функций, применимых к целочисленным типам, приведен в табл.4.2. Буквами b, s, w, i, l обозначены выражения соответственно типа BYTE, SHORTINT, WORD, INTEGER и LONGINT, x - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр. Таблица 4.2
При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам, - типу того операнда, который имеет максимальную мощность (максимальный диапазон значений). Возможное переполнение результата никак не контролируется, что может привести к недоразумениям, например: var а : Integer; х, у : Real; begin а := 32767; {Максимально возможное значение типа INTEGER} х := а + 2; {Переполнение при вычислении этого выражения!} у := LongInt(а)+2; {Переполнения нет после приведения переменной к более мощному типу} WriteLn(x:10:0, у:10:0) end. В результате прогона программы получим -32767 32769 Логический тип. Значениями логического типа может быть одна из предварительно объявленных констант FALSE (ложь) или TRUE (истина). Для них справедливы правила: ord(False) = 0; ord(True) = 1; False < True; succ(False)= True; pred(True) = False. Поскольку логический тип относится к порядковым типам, его можно использовать в операторе счетного типа, например: var 1 : Boolean; begin for 1 := False to True do .... Символьный тип. Значением символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне 0...255. Это число служит кодом внутреннего представления символа, его возвращает функция ORD. Для кодировки используется код ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией). Это 7-битный код, т.е. с его помощью можно закодировать лишь 128 символов в диапазоне от 0 до 127. В то же время в 8-битном байте, отведенном для хранения символа в Турбо Паскале, можно закодировать в два раза больше символов в диапазоне от 0 до 255. Первая половина символов ПК с кодами 0...127 соответствует стандарту ASCII (табл. 4.3). Вторая половина символов с кодами 128...255 не ограничена жесткими рамками стандарта и может меняться на ПК разных типов (в прил.2 приведены некоторые распространенные варианты кодировки этих символов). Таблица 4.3
Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами. При использовании их в операциях ввода-вывода они могут иметь следующее самостоятельное значение:
К типу CHAR применимы операции отношения, а также встроенные функции: СНR(В) - функция типа CHAR; преобразует выражение В типа BYTE в символ и возвращает его своим значением; UPCASE(CH) - функция типа CHAR; возвращает прописную букву, если СН -строчная латинская буква, в противном случае возвращает сам символ СН, например: var cl,c2: Char; begin cl := UpCase('s') ; c2 := UpCase ('Ф') ; WriteLn(cl,' ',c2) end. Так как функция UPCASE не обрабатывает кириллицу, в результате прогона этой программы на экран будет выдано S ф Перечисляемый тип. Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например: typе colors =(red, white, blue); Применение перечисляемых типов делает программы нагляднее. Если, например, в программе используются данные, связанные с месяцами года, то такой фрагмент программы: type ТипМесяц=(янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек); var месяц : ТипМесяц; begin ....... if месяц = авг then WriteLn('Хорошо бы поехать к морю!'); ....... end. был бы, согласитесь, очень наглядным. Увы! В Турбо Паскале нельзя использовать кириллицу в идентификаторах, поэтому мы вынуждены писать так: type TypeMonth=(jan,feb,mar,may,jun,jul,aug,sep,oct,nov,dec); var month: TypeMonth; begin ....... if month = aug then WriteLn('Хорошо бы поехать к морю!'); ....... end. Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т.д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа WORD и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями О, 1 и т.д. Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. Пусть, например, заданы такие перечисляемые типы: type colors = (black, red, white); ordenal= (one, two, three); days = (monday, tuesday, Wednesday); С точки зрения мощности и внутреннего представления все три типа эквивалентны: ord(black)=0, ..., ord(white)=2, ord(one)=0, ...ord(three)=2, ord(monday)=0, ...ord(Wednesday)=2. Однако, если определены переменные var col :colors; num :ordenal; day : days; то допустимы операторы col := black; num := succ(two); day := pred(tuesday); но недопустимы col := one; day := black; Как уже упоминалось, между значениями перечисляемого типа и множеством целых чисел существует однозначное соответствие, задаваемое функцией ORD(X). В Турбо Паскале допускается и обратное преобразование: любое выражение типа WORD можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощное1™ перечисляемого типа. Такое преобразование достигается применением автоматически объявляемой функции с именем перечисляемого типа (см. п. 4.4). Например, для рассмотренного выше объявления типов эквивалентны следующие присваивания: col := one; col := colors(0); Разумеется, присваивание col := 0; будет недопустимым. Переменные любого перечисляемого типа можно объявлять без предварительного описания этого типа, например: var col: (black, white, green); Тип-диапазон. Тип-диапазон есть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона. Тип-диапазон задается границами своих значений внутри базового типа: <мин.знач.>..<макс.знач.> Здесь <мин.знач. > - минимальное значение типа-диапазона; <макс.знач.> - максимальное его значение. Например: type digit = '0'..'9'; dig2= 48..57; Тип-диапазон необязательно описывать в разделе TYPE, а можно указывать непосредственно при объявлении переменной, например: var date : 1..31; month: 1. .12; Ichr : 'A'..'Z';. При определении типа-диапазона нужно руководствоваться следующими правилами:
type days = (mo,tu,we,th,fr,sa,su); WeekEnd = sa .. su; var w : WeekEnd; begin ..... w := sa; ..... end; то ORD(W) вернет значение 5 , в то время как PRED(W) приведет к ошибке. В стандартную библиотеку Турбо Паскаля включены две функции, поддерживающие работу с типами-диапазонами: НIGН(Х) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная X; LOW(X) -возвращает минимальное значение типа-диапазона. Следующая короткая программа выведет на экран строку -32768...32767 var k: Integer; begin WriteLn(Low(k),'..',High(k)) end.
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |