В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 31
Текст из файла (страница 31)
Однако это вовсе не обязательно. Если, например, в программе используется вектор, компоненты которого представляют собойчисленность населения города Москвы в отдельные годы, то нумерациюкомпонент удобнее начинать с целого числа 1147 — года основанияМосквы. Пусть последняя компонента этого вектора имеет номер 1999 —предпоследний год нашего столетия. Тогда этот вектор может быть заданследующим образом:a r r a y С 1 1 4 7 .
. 1 9 9 9 3 of i n t e g e rЕсли же в программе обрабатывается численность населения города Римадо нашей эры, то удобно ввести целочисленный вектор с нумерацией компонент, начиная с отрицательного целого числа —754 (года основания Рима) до — 1 (последнего года исчисления до нашей эры). Задать такой вектор можно следующим образом:array С-754..-13 of integerКаждому задаваемому регулярному типу можно дать имя с помощьюописания типа, так что указанные выше регулярные типы можно ввестив употребление с помощью следующего фрагмента программы:typeГраницы>°1.
. 100;Вектор"array [границы] of r e a l ;чМосквы-array С 1 1 4 7 . . 1 9 8 8 1 of i n t e g e r ; .чРима=аггау С - 7 5 4 . . - 1 3 o f i n t e g e r ;Переменные регулярного типа рассмотренных видов вводятся вупотребление обычным способом, с помощью соответствующего описанияв разделе переменных. Если нужный тип был описан (т.е. ему было данои м я ) , то в описании переменных достаточно указать имя типа:varА,В: Вектор;c , d : чМосквы;Регулярный тип можно задать и непосредственно при описании переменных:varr , t : a r r a y Страницы] o f r e a l ;s , q : array C1147..19883 of i n t e g e r ;g , h : array С-754..-13 of integer;k,m: a r r a y C I .
. 503 of (шар, куб, пирамида);122Предыдущие примеры убеждают нас, что, используя лишь ограниченныйцелый тип в качестве типа индекса, мы получаем довольно большие возможности для задания одномерных массивов.Множество значений перечислимого типа также образует ограниченноеперенумерованное множество. Следовательно, перечислимый тип такжеможет быть использован в качестве типа индексов. Действительно, значенияперечислимого типа упорядочены (порядок задается порядком перечисления имен, являющихся значениями этого типа) и число их конечно (определяется количеством имен в этом типе).
Нетрудно представить и случай,когда в качестве индексов удобно использовать именно значения перечислимого типа. Действительно, пусть в какой-то задаче используется массивиз двенадцати вещественных компонент, являющихся среднемесячнымитемпературами воздуха в году. Конечно, можно в качестве типа индексаиспользовать и ограниченный целый тип 1 . . 12. Но тогда программапроигрывала бы в наглядности и понятности: ведь двенадцатиэлементныйвектор из вещественных чисел может представлять в общем случае чтоугодно. Поэтому введем перечислимый тип, состоящий из имен —названий месяцев года, и назовем его Месяц:t y p e Месяц=(январь, Февраль, март, апрель,май, июнь, июль, а в г у с т , сентябрь,октябрь, ноябрь, декабрь);Тогда переменные регулярного типа, являющиеся по своему смыслу векторами среднемесячных температур, можно определить следующим образом:vart,rtarray [Месяц]of real;Частичные переменные, обозначающие температуру конкретного месяца,выглядят следующим образом: t [январь], t [февраль], t [март] и т.д.Если в программе введена в употребление переменная типа Месяц,напримерvarmonth: Месяцто эту переменную можно использовать в качестве индекса:tCmonthJКонкретная компонента вектора t, обозначаемая этой частичной переменной, будет определяться текущим значением переменной month.В предыдущей главе отмечалось, что тип boolean является стандартнымперечислимым типом, а следовательно и его значения могут быть использованы в качестве значений индекса.
Соответственно, индексные выражениямогут представлять собой логические выражения.При введении стандартного типа char подробно обсуждался вопрос обупорядоченности значений этого типа. В главе 2 говорилось о влиянии конкретной реализации на способ упорядочения значений этого типа.Сейчас же нам важно, что при любой реализации значения стандартного типа char образуют ограниченное перенумерованное множество, а значитмогут быть использованы в качестве индексов. Ниже приведены примерырегулярных типов, у которых в качестве типа индекса указаны стандарт123ные типы boolean и char:typeп р и з н а к = а г г а у [boolean]of integer;к о д с и м в о л а = а г г а у [char J o-f integer;varks признак;s: кадсимвола;Примеры частичных переменных с постоянными значениями индексов:k [ false ]к [ true ]s [' d ' ]s [' h ' ]и с переменными значениями индексов ( b , d — логические переменные;sym — литерная переменная):k[ b ]к [ b or d ]s[ sym ]s [ succ(sym) ]7.2.2.
Использование значений регулярного типаД л я ссылки на конкретный массив к а к единое целое используется полнаяпеременная, т.е. имя переменной соответствующего регулярного типа.Например, если в программе было определено значение вектора А(т.е.
всем его компонентам были присвоены конкретные значения),то для присваивания полной переменной В точно такого же значения достаточно выполнить оператор присваивания (при наличии в программе приведенного ранее описания переменных А и В одного и того же регулярноготипа):В := АТакое присваивание возможно, поскольку переменные А и В имеютв точности один и тот же тип с именем Вектор. Над значениями регулярноготипа в паскале не определено каких-либо операций — не только аналоговарифметических операций над значениями типа real или integer, но дажеопераций сравнения. А если учесть, что в паскале нет констант и функцийрегулярных типов (за исключением строковых констант), то "регулярнымвыражением"может быть только переменная регулярного типа.Так что если в левой части оператора присваивания указана переменнаякакого-либо регулярного типа, то в правой его части может фигурироватьтолько переменная того же самого типа.Обратим внимание и на то обстоятельство, что полная переменнаярегулярного типа не может быть операндом арифметического (логического) выражения — даже в том случае, если массив, являющийся значениемпеременной регулярного типа, состоит из единственной компонентыарифметического (логического) типа.
Например, при наличии в программеописаний переменныхvarх: real;у: a r r a y С1..1] of real;недопустимы операторы присваиваниях:=у; у:=х; х:=у+0.5; у:=3.14;124В общем случае значения полных переменных одного и того же регулярного типа могут быть использованы только в операторах присваивания.Нельзя использовать значения полных переменных в качестве аргументоварифметических операций.Для ссылок на отдельные компоненты векторов используется переменная с индексом.
Выражение, задающее индекс, должно определять значениетого же типа, что и указанный при задании массива тип индекса. Например,при обращении к компонентам векторов А и В в качестве индексного выраженияможноиспользовать любое арифметическоевыражение,значением которого является целое число из диапазона 1 . . 100:А [ 56 ]В[ i+4]A [ i div ( j + 6 ) ](при условии, что текущие значения i и j таковы, что значения выражений, записанных в квадратных скобках, находятся в диапазоне 1 . . 100;в противном случае будет зафиксирована ошибка). Ниже приведены примеры переменных с индексами, использование которых недопустимо( m l и ш2 — логические переменные, х — вещественная переменная,описания переменных А и В приведены ранее) :A [ m l or ш 2 ] {индексное выражение типа boolean, тогда к а к вописании типа с именем Вектор, который предписан переменной А, в качестве типа индекса указан ограниченный целый тип};В [х] { индексное выражение типа real, которое вообще недопустимо} ;А [ 1988] {значение индекса выходит за пределы допустимого диапазона} .П р и м е р 7.1.
Вычислить значения двух полиномов Р(х)и Q(x) видаР(х)Q(x)=а0х30+а1х2д+ ...+а2дх+а}0= b0x30 + blx29 + ... +b29x +b30 'при заданном целочисленном значении х. Коэффициенты полинома Р(х)получить из заданной последовательности целых чисел, преобразовав еегак, чтобы в начале находились неотрицательные числа (в порядке их следования в исходной последовательности), а за ними все отрицательные числа(также в порядке их следования в исходной последовательности).Коэффициенты полинома 0 ( х ) получить из той же заданной последовательности целых чисел, преобразовав ее так, чтобы в начале находились все отрицательные числа, а за ними все неотрицательные числа (в порядке их следования в исходной последовательности).Выберем следующий метод решения задачи.
При вводе заданной последовательности целых чисел будем записывать все неотрицательные числа —в порядке их следования — в последовательные компоненты одномерногомассива А, а отрицательные числа — гоже в порядке их следования —в последовательные компоненты одномерного массива В. Затем все отрицательные компоненты массива В перенесем в конец массива А, а неотрицательные компоненты массива А — в конец массива В. Таким образом полу125чим коэффициенты полиномов Р(х) и Q(x). Вычисление значений этих полиномов в точке х произведем по схеме Горнера.{Пример 7.1.
Гуляев А.В. Ф-т ВМиК МГУ 3.3.87г.Ввод и определение коэффициентов полиномов.Вычисление значений полиномов по схеме Горнера}{Использование одномерных массивов}program ПОЛИНОМ (input., output);constверхнгр=30;typeвект=аггау CO. . верхнгр 3 o-f integer;var4HC,i,j,k,x:integer;A,В: вект;begin{ввод заданной последовательности целых чисел,занесение неотрицательных чисел в массив А, аотрицательных — в массив В}j:=0;к:=0;•for i : =0 to верхнгр dobegin read(чис);if чис<0 thenbeginВСкЗ:=чис; k:=k+l endel sebegin АСэЗ:=чис;j:=j+l endend;{неотрицательные числа в векторе А в позициях от 0 'j-1; отрицательныечисла в векторе В в позициях от 0 доk—1}{перенос отрицательных чисел из пассива В в массив А}for i:=0 to к—1 doACj + i3:=BCi 3;{перенос неотрицательных чисел из массива А вВ}for i:-0 to j-1 doBCk + i 3:=ACi 3;{ввод значения x'}read(x) ;{вычисление значений полиномов по схеме Горнера}u:=АС03; v:=BC03;for i:=l to верхнгр do126доbegin u:=u*x+ACi3; v:=v*>:+BCi3 end;(выеол результатов)writeln ( ' P (x ) = ' ,u, '; _G (") ••= ' , v > ;end.В приведенном выше примере описана целая константа верхнгр, равная 30, которая затем используется при задании типа индекса в регулярномтипе с именем вект.
Таким образом, количество компонент в массивес именем вект определяется статически, то есть до исполнения программы.Может возникнуть вопрос: существует ли в паскале возможность задатьрегулярный тип таким образом, чтобы количество компонент в значенииэтого типа определялось в процессе исполнения программы, например,при присваивании (или при вводе) значения определенной целой переменной? Иначе говоря, существует ли возможность задания динамического регулярного типа? В паскале такая возможность отсутствует. Количествокомпонент массива, их упорядоченность и тип должны задаваться явно, т.е.быть определенными до начала выполнения программы.