В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 29
Текст из файла (страница 29)
Одним из типичных случаев является вычисление таблично заданной функции, если тип аргумента функции допускает его использованиев качестве селектора оператора варианта.112Пусть, например, значением литерной переменной t является один иззнаков арифметической операции, т.е. одна из литер ' + ', ' — ' , ' * ' , ' / ',и требуется вычислить ранг г операции, знак которой является текущимзначением переменной t (будем считать, что ранг операций сложения ивычитания равен 1, а ранг операций умножения и деления равен 2 ) .Ясно, что здесь речь идет о таблично заданной функции, и вычисление значения переменной г можно просто и компактно задать с помощью оператораварианта:case t of' + ' , г : = 1 j' * ' , ' / ' : г:=2endОператор варианта можно использовать и для вывода значений перечислимых типов в форме, наиболее удобной для их использования вне машины. Если, например, переменная ДЕНЬ имеет тип НЕДЕЛЯ, описание которого было приведено выше, то текущее значение этой переменной можновывести на печать с помощью оператора варианта:case ДЕНЬ ofNH:write< ' ПОНЕДЕЛЬНИК ' )вт:wr i te ('ВТОРНИК');ср:wri te <'СРЕДА');чтв:wri te('ЧЕТВЕРГ'>;гттн: write ( 'ПЯТНИЦА' ) ;сб:wri te('СУББОТА'>;вскр:wri te( ВОСКРЕСЕНЬЕ')endЧто касается ввода значений перечислимых типов, то в паскале эта задачаболее трудная, и оператор варианта здесь непосредственно использоватьнельзя.
Для решения этой задачи придется зафиксировать внешнее представление каждого такого значения в виде литерной строки, в программепредусмотреть ее ввод с последующим анализом введенной строки, и наосновании этого анализа присвоить переменной соответствующее значениеперечислимого типа в его внутреннем представлении, т.е. в виде определенной в программе константы данного перечислимого типа. Более подробнона этом вопросе мы остановимся в следующей главе, при рассмотрениилитерных строк.Использование перечислимых типов и оператора варианта проиллюстрируем на конкретном примере. Поскольку к-настоящему времени рассмотрены далеко не все возможности языка, то мы вынуждены ограничитьсяпримером учебного характера, хотя приводимые ниже программы можнодовести до их выполнения на машине.Пример6.1.
Составить программу для подведения итогов соревнования за пятидневную рабочую неделю среди рабочих бригады, занятыхизготовлением некоторых деталей. Исходными данными для программыявляется последовательность пятерок целых чисел, представляющих собой8. В.Г. Абрамов113к о л и ч е с т в о деталей, и з г о т о в л е н н ы х о ч е р е д н ы м р а б о ч и м з а к а ж д ы й и з пяти р а б о ч и х дней недели (считается, что рабочие у п о р я д о ч е н ы по их фамил и я м в л е к с и к о - г р а ф и ч е с к о м п о р я д к е ) . П р о г р а м м а д о л ж н а в ы д а т ь фамил и ю п о б е д и т е л я с у к а з а н и е м его недельной в ы р а б о т к и .Р а д и п р о с т о т ы б у д е м считать, что п о б е д и т е л ь о п р е д е л я е т с я однозначно,т.е.
н е б у д е м р а с с м а т р и в а т ь случай, к о г д а м а к с и м а л ь н о й в ы р а б о т к ид о с т и г л и сразу н е с к о л ь к о рабочих. П р е д п о л о ж и м , что в бригаде шесть рабочих: А н т и п о в , Б е л о в , Г у с е в , Е р ш о в , П е т р о в и С е д о в .{Пример 6.1. Черняховский В.В. ЛьвовГУ 5.12.86г>{Итоги соревнования.Пречислимыв типы в циклах}program БРИГАДА(input,output);{опишем два перечислимых типа}typeФамилия=(Антипов,Белов,Гусев,Ершов,Петров,Седов);неделя=(пн,вт,ср,чтв,птн);{введем в употребление нужные переменнь(е}varпобедитель,рабочий:Фамилия;день: неделя; k,m,ma>:: integer;begin{подготовка к циклу по рабочим}та>!: = - 1 ;writeln( ВЫРАБОТКА РАБОЧИХ:');{цикл учета всех рабочих}•for рабочий: =Антипов to Седов do{учет очередного рабочего}beginm: =0;{ввод и учет выработки.рабочего по днян недели}•for день: =пн to птн dcbegin read(k); write(k); m:=m+k end;{корректировка максимальной выработки и победителя}if m>ma>: thenbegin победитель:=рабочий;max:=m end;writelnend;{вывод результата}writeln('_ ПОБЕДИТЕЛЬ СОРЕВНОВАНИЯ:_') ;114case победитель ofЕриюв: wr i te <|" ЕРЫОВ ' > ;Петров:write<'ПЕТРОВ');Антипов:wr i te <'АНТИПОВ');Белов:write('БЕЛОВ');Гусев:wri te('ГУСЕВ'> ;Седов:wri te < 'СЕДОВ')end;writeln('_ С ВЫРАБОТКОЙ_, max,ДЕТАЛЕЙ'>end.Из приведенной программы видно, как ее можно модифицировать длялюбого конкретного состава бригады.6.3.
Ограниченные типыВ паскале значительное внимание уделено вопросу повышения надежностипрограмм, т.е. своевременному выявлению различного рода ошибок в программе и таких ситуаций, которые могут привести к неопределенным илиошибочным результатам ее выполнения.Например, паскаль требует явного описания всех используемых в программе переменных и указания типа каждой из них. При этом запрещаетсяприсваивать переменной значение, тип которого отличается от типа этойпеременной, поскольку, например, не имеет смысла присваивать логической переменной значение вещественного типа.
Требование явного указания типа любой переменной, возможность установления типа любых констант по их записи и четкое определение типа результата каждой используемой в языке операции позволяют однозначно определить тип значения,правила вычисления которого задаются тем или иным выражением, ипроверить правомочность присваивания этого значения некоторой переменной. И даже в том случае, когдк различие этих типйв может быть допустимопо смыслу решаемой задачи, например в, случае, когда требуемое целочисленное значение невозможно получить точно и мы вынуждены получать этозначение приближенно, в виде вещественного числа, паскрль требует отпрограммиста явного задания правил его преобразования в целое число —то ли путем простого отбрасывания дробной части этого вещественногочисла, то ли путем его округления до ближайшего целого числа.Ясно, что выбор того или иного способа преобразования может быть сделанразумно только с учетом сути решаемой задачи, поэтому нужное преобразование должно быть задано явно.
Именно по этой причине решение указанного вопроса и возлагается на программиста.Однако в ряде случаев указанных выше мер контроля оказывается явнонедостаточно. Действительно, пусть переменная п в программе представляет текущее число какого-либо месяца. Ясно, что эта переменнаядолжна принимать целочисленные значения. Но если мы предпишем ейтип integer, то этой переменной правомерно присваивать любое целочисленное значение. Однако очевидно, что по существу решаемой задачи имеют8*115смысл только такие значения переменной п, которые принадлежат отрезку [1,31], и потому хотелось бы выявлять случаи присваивания этой переменной значений, не принадлежащих указанному диапазону, поскольку этосвидетельствует либо о неправильном задании правил вычисления такогозначения, либо об ошибочном его задании в качестве исходных данныхпрограммы.На самом деле при решении любой конкретной задачи относительно ряда(или даже всех) переменных мы располагаем информацией о том, какимдиапазонам могут принадлежать осмысленные значения этих переменных.Такурз информацию естественно передать транслятору для того ..чтобы онсмог предусмотреть в программе контроль за корректностью присваиваниязначений этим переменным.Для достижения этих и некоторых других целей в паскале служат ограниченные типы (типы диапазона).
Каждый такой тип задается путем накладывания ограничений на уже заданный (или стандартный) тип, множествозначений которого является перенумерованным — этот тип в таком случаеназывают базовым типом. Таким образом, в качестве базовых могут использоваться стандартные типы char и boolean, перечислимые типы, заданные в программе, а также тип integer. Обратим внимание на то, что типreal не может фигурировать в качестве базового типа, поскольку множество значений этого типа в паскале не является перенумерованным.Упомянутое выше ограничение выражается в том, что из всего множества значений базового типа берется некоторый диапазон, который и принимается в качестве допустимого множества значений вновь определяемоготипа (поэтому ограниченные типы и называют иначе типами диапазона).Этот диапазон задается дйумя константами базового типа, отделеннымидруг от друга двумя точками:< задание ограниченного типа > ::= < константа 1 > .
. < константа2 >где <константа1 > и <константа2 > — константы того базового типа, на основе которого вводится в употребление данный ограниченный тип, причемпервая из этих констант должна быть не больше второй. Первая константазадает минимальное, а вторая — максимальное значение упомянутого вышедиапазона.Примеры заданий ограниченных типов:1 .
. 20(ограничение на тип integer);пн . . птн(ограничение на перечислимый тип);' А ' . .' Z ' (ограничение на базовый тип char).Естественно, прежде чем вводить в употребление ограниченный тип,должен быть введен в употребление соответствующий базовый тип, еслион не является стандартным типом. Например, задание типа пн .. птн бессмысленно, если до этого не был введен в употребление одним из рассмотренных выше способов соответствующий базовый тип, например с помощью задания перечислимого типа(пн, вт, ср чтр, птн, сб, вскр)ибо без определения базового типа невозможно сказать, сколько значений икакие именно значения входят в определяемый ограниченный тип.116Как и в случае перечислимых типов, ограниченный тип может быть определен (введен в употребление) либо с помощью описания типа в разделе типов, где новому типу дается свое имя, либо с помощью описания переменных, где и задается этот тип.Примеры определения ограниченных типов:typeнеделя=(пн,вт,ор, чтв,птн,сб,вокр);Фигура= (пешка , конь ,слон, ладья , Ферзь ,король > ;легкаяФигура=пешка..олон!рабочиедни=пн.-пти;индекс=-10..20;varx,y,z: real; день: неделя; i,j: integer; is индеко;деньработы: рабочиедни; деньотдыха: об..вскр;плод:(малина,клюква,черника,смородина,яьлоко,груша,персик);ягода:малина..смородина;Поскольку множество значений ограниченного типа принадлежит множеству значений базового типа, то к этим значениям применимы все операциии функции, которые определены над значениями базового типа, и значенияограниченного типа могут использоваться везде, где могут использоватьсязначения базового типа.