Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дал У.И.Симула 67.doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
216.58 Кб
Скачать

Integer procedure pos;

Процедура X.pos доставляет в качестве своего значения текущее значение указателя позиции ссылки на текст X.

procedure setpos (/); integer /:

Действие процедуры X. setpos (i) состоит в том, что ука­зателю позиций ссылки на текст X присваивается значение /, если I находится в интервале [1, X. length + 1]. В противном случае присваивается значение X. length + 1.

Boolean procedure more;

Процедура X. more доставляет значение true, если указа­тель позиции ссылки X находится в интервале [Г, X. length]. В противном случае она имеет значение false,

character procedure getchar;

Процедура Л7, getchar доставляет в качестве своего значе­ния копию доступной в данный момент литеры текста X при условии, что значением Х.тоге является true. В противном случае выдается сообщение об ошибке. Если ошибки не про-. изошло, после выполнения копирования указатель позиции текста X увеличивается на единицу.

procedure putchar (с); character (с);

Действие процедуры Л7-putchar (с) состоит в том, что до­ступная в данный момент литера текста X заменяется копией литеры с при условии, что значением A".more является true. В противном случае выдается сообщение об ошибке. Если не произошло ошибки, после выполнения замены указатель по­зиции текста X увеличивается на единицу.

Пример:

т

procedure уплотнить (Т); text T; begin text U; character с;

Г.setpos (1); U :-T;

for с : = с while U . more do

begin с : = U . getchar ;

if с ф "_" then T . putchar (c)

end;

for c: = c while T.more do T. putchar ("Jf) end уплотнить;

Процедура переупорядочивает литеры текстового значе­ния, на которое ссылается параметр Г. Литеры, отличные отпробела, собираются в левой части текста, а оставшаяся часть, если таковая имеется, заполняется литерами пробела. Поскольку параметр вызывается по ссылке,' то его указательпозиции не меняется. Значением литерной константы "_" яв­ ляется литера пробела.

10.4. ПОРОЖДЕНИЕ ТЕКСТОВ

Для порождения объектов типа текст, в дальнейшем для краткости называемых просто текстами, имеются следующие основные процедуры. Эти процедуры в отличие от рассмо­тренных выше не локализовании в текстовых объектах.

text procedure blanks (n); integer n;

Эта процедура доставляет в качестве своего значения ссылку*на новый текстовый объект длины п, заполненный ли­терами пробела.

text procedure text (Г); value Г; text T;

Эта процедура доставляет в качестве своего значения ссылку на новый текстовый объект, являющийся копией тек­стового значения, на которое ссылается или которым является фактический параметр.

Пример:

оператор Г:—text ('ABC'), где Т есть текстовая перемен­ная, эквивалентен составному оператору

begin Г: —blanks (3); Г: =9АВС end :

10.5. ПРИСВАИВАНИЕ ТЕКСТОВЫХ ССЫЛОК

(Синтаксис см. разд. 6.1).

к

i

Результатом текстового присваивания ссылок является то, что присваиваемая ссылка становится новым содержимым ЛЧ. Это новое содержимое ЛЧ .является копией ссылки, по­лучающейся при вычислении ПЧ (см. .разд. 6.2). Присваивае­мая ссылка включает в себя также копию указателя пози-

Г.ии ПЧ. .■'"'*

Если X есть текстовая переменная, а У — ссылка на текст, то после выполнения присваивания ссылок X: — У оба отно­шения X = =У и X.pos = y.pos имеют значение true.

Ь 10.6. ПРИСВАИВАНИЕ ТЕКСТОВЫХ ЗНАЧЕНИЙ

^ (Синтаксис см. разд. 6.1).

Пусть значением ЛЧ присваивания текстового значения является текст длины Lt, а значением ПЧ — текст длины Lr. Если ПЧ сама является присваиванием текстового значения, то Lr по определению есть длина текста, присвоенного при выполнении этой ПЧ в качестве присваивания. Результат при­ сваивания текстового значения зависит от соотношения между LI и Lr. ■

LI = Lr: Литеры значения ПЧ переписываются последова­тельно в значение ЛЧ.

Ll> Lr. Литеры значения ПЧ переписываются последова­тельно в первые Lr позиции значения ЛЧ. -Остальные LI — Lr позиций значения ЛЧ запол­няются пробелами.

'LKLr- При исполнении такого присваивания выдается со- ] г . общение об ошибке.

г ™

1 ' Если ЛЧ и ПЧ ссылаются на пересекающиеся тексты, то результат присваивания текстового значения определяется-конкретной реализацией языка.

При выполнении присваивания текстового значения указа­тели позиций ЛЧ и ПЧ во внимание не принимаются и не из­меняются. ■

Если X и Y суть тексты одинаковой длины, то после ис­полнения присваивания текстового значения X: = У отноше­ние X = Y имеет значение true.

10.7. ПОДТЕКСТЫ

Имеются две процедуры для обращений к подтекстам: 1) text procedure sub (i,n)\ integer i,n;

Пусть / и п — такие целые числа, что /^ 1, пХ), и 7 + п<СХ.length + 1. Тогда выражение X.sub (i,n) ссылает­ся на ту часть текстового значения X, первая литера которой является t-й литерой значения X и которая содержит п после­дующих литер. Указатель позиции в получаемой ссылке на текст равен единице и определяет местную нумерацию литер в подтексте. Указатель позиции значения X во внимание не принимается и не изменяется. В особом случае, когда п = 0, получаемая ссылка есть notext. Если i и п не удовле­творяют указанным выше условиям, то при выполнении про­цедуры выдается сообщение в ошибке.

Логические выражения:

правилом действий, состоящим из правил действий класса и ' префикса. В результате указанного сочленения все понятия и операции, определенные в префиксе, становятся доступ­ными для объектов класса, имеющего этот префикс. * -

Пользователь может по своему усмотрению создавать структуры классов, соответствующие содержанию решаемых задач. Каждый из классов может иметь последовательность префиксов произвольной глубины. , " . ■ - '

С другой стороны, классы, используемые в качестве пре­фиксов, могут разрабатываться заранее и входить в язык как • его составные части. В этом случае пользователь получает возможность обращаться к понятиям и методам, описанным в таком «системном» классе, употребив его в качестве пре­фикса к своей программе или к ее части.

Содержание, таких системных классов может быть самым разнообразным: класс ПЛАНИМЕТРИЯ, класс БУХГАЛ­ТЕРСКИЙ УЧЕТ, класс МЕДИЦИНСКАЯ ДИАГНОСТИКА и т. п. Системный класс может описывать те или иные свой-ства» методы и понятия в терминах, принятых в соответствую­щей области, и представлять, таким образом, некоторый спе­циализированный язык. В результате программа, имеющая этот класс в качестве своего префикса, может быть также на­писана на специализированном языке.

Таким образом, введение классов позволяет не только опи­ сывать различные иерархически построенные структуры дан­ ных и правила действий, но и легко осуществлять специали­ зацию языка. ■ '

Читателю, возможно, известен язык СИМУЛА-1, предна­значенный для описания сложных систем с дискретными" событиями. Не будет преувеличением сказать, что до послед­него времени этот язык был наилучшим инструментом моде­лирования на ЭВМ, завоевавшим популярность в нашей стране и за рубежом.

Отрадно отметить, что все средства моделирования, соот- . ветствующие языку СИМУЛА-1 (параллельное функциони­рование объектов, управление последовательностью действий/ получение случайных чисел, обработка статистики и т. п.), являются частью языка СИМУЛА-67 и ими можно воспрль-р зоваться через системный класс МОДЕЛИРОВАНИЕ. ... ■■'■.

Введение в язык классов заставило разработать новые средства для ссылок на объекты. Предложенные авторами " решения этой проблемы привлекают своим удобством, на­глядностью и эффективностью с точки зрения их реализации., ■

■ Интересной особенностью языка является использование уац щзьщъщщ виртуальных велцчин^ которые сцецифици-

и

п Ф 0 :=э X. main = =X.sub(tt n).main

если они законны, оба имеют значение true.

2) text procedure strip ;

Выражение Л7, strip эквивалентно выражению X.sub (1, га), где п есть наибольшее целое число, такое, что литеры значе­ния X в позициях под номерами, большими п, если таковые имеются, все суть литеры пробела.

Пусть X и К —ссылки на текст. Тогда после присваива­ния значения X ;= У, если оно не приводит" к ошибке, отно: шение X . strip = У. strip имеет значение true.

10.8. ЧИСЛОВЫЕ ТЕКСТОВЫЕ ЗНАЧЕНИЯ

*. i

10.8.2. Семантика

*

Синтаксис, определенный в разд. 10.8.1, относится к после­довательностям литер, т.е. текстовым значениям.

Каждый ТЕРМИНАЛЬНЫЙ СИМВОЛ означает подходя­щую литеру из внешнего набора литер, определяемого кон­кретной реализацией. ПРОБЕЛ означает литеру пробела. РАЗДЕЛИТЕЛЬ означает некоторую литеру, определяемую реализацией. Эта литера может быть, например, пробелом или запятой. .

Запись числа — это последовательность литер, являю­щаяся продукцией понятия (ЗАПИСЬ ЧИСЛА).

Для преобразования арифметических значений в тексто­вые (являющиеся записями чисел) и обратно имеются про­цедуры редактирования и дередактирования.

10.9. ПРОЦЕДУРЫ ДЕРЕДАКТИРОВАНИЯ

Любая процедура дередактирования данной ссылки на текст X работает следующим образом:

1) разыскивается самая длинная запись числа (если та­ковая имеется) требуемого типа, содержащаяся в X и содер­жащая первую литеру текста X (заметим, что запись числа любого типа может начинаться с любого количества пробе­лов);

" 2) если такой записи числа нет, то выдается сообщение об ошибке.

в противном случае найденная запись числа интерпре­ тируется как число;

если это число выходит за пределы диапазона значе­ ний, определяемого реализацией, то выдается сообщение об ошибке;

в противном случае вычисляется арифметическое зна­ чение, которое равно или приближенно равно этому числу;

указатель позиции ссылки X становится на единицу больше,,чем номер последней литеры рассмотренной записи числа. с

Имеются три процедуры дередактирования:

1) integer procedure getint;

- Процедура разыскивает (ЗАПИСЬ ЦЕЛОГО). Значение, доставляемое этой процедурой-функцией, равно целому зна­чению, представляемому найденной записью целого.

2) real procedure getreal;

Процедура разыскивает (ЗАПИСЬ ВЕЩЕСТВЕННОГО). Значение, доставляемое этой процедурой-функцией, равно или приблизительно равно вещественному значению, пред­ ставляемому найденной записью вещественного. Если это значение целое и находится в пределах диапазона, допусти- могб в данной реализации для целых чисел, то преобразова­ ние происходит точно. ; 3) integer procedure getfrac ; .

'* Процедура разыскивает (ЗАПИСЬ ГРУППАМИ). При ин­терпретации записи группами процедура игнорирует любой (РАЗДЕЛИТЕЛЬ) или десятичную точку, если таковые имеются. Значение, доставляемое этой процедурой-функцией, равно получающемуся таким образом целому значению.

- /

10.10. ПРОЦЕДУРЫ РЕДАКТИРОВАНИЯ

4

Г

Процедуры редактирования данной ссылки на текст X служат для преобразования арифметических значений в за­писи чисел. После операции редактирования полученная за­пись числа (если таковая получена) выравнивается вправо в тексте X и ей предшествует столько пробелов, сколько необ­ходимо для заполнения всего текста. Окончательное значение указателя позиции ссылки Х- равно X. length + 1.

Положительное число редактируется без знака, отрица­ тельное число редактируется со знаком минус, который непо­ средственно предшествует следующей значащей литере. Ве­ дущие незначащие нули подавляются, кроме, быть может, нуля, непосредственно предшествующего первой значащей литере. ' ■ ■

Если X = notext, то выдается сообщение об ошибке. В про­ тивном случае, если - текстовое значение слишком коротко, чтобы вместить получающуюся запись числа, происходит «пе­ реполнение при редактировании» и в текст помещается не­ которая последовательность литер по правилам, определен­ ным реализацией языка. Кроме того, если в ходе выполнения программы произошло переполнение при редактировании, то по окончании выполнения программы выдается соответствую­ щее сообщение об этом факте.

Имеются четыре процедуры редактирования

1) procedure putint (/); integer /;

Значение параметра преобразуется в (ЗАПИСЬ ЦЕ­ЛОГО), обозначающую это значение.

2) procedure putfix (r, n)\ real r; integer n;

Получающаяся запись числа есть ЗАПИСЬ ЦЕЛОГО, если п = О, или ЗАПИСЬ МАНТИССЫ, у которой ЗАПИСЬ ДРОБИ содержит п цифр, если п > 0. Она обозначает число, равное или приближенно равное значению параметра л, пра­вильно округленному до я-го десятичного знака. Если п < 0, то выдается сообщение об ошибке.

„ 3) procedure putreal (г, п)\ real r; integer n\ ' Процедура формирует ЗАПИСЬ ВЕЩЕСТВЕННОГО, со­держащую ПОРЯДОК. Если п = 0, то эта запись веществен­ного имеет вид (ЗНАКОВАЯ ЧАСТЬ) (ПОРЯДОК); если п = 1, то вид (ЗАПИСЬ ЦЕЛОГО) (ПОРЯДОК), причем (ЗАПИСЬ ЦЕЛОГО) содержит точно одну цифру; если п> 1, то вид (ЗАПИСЬ МАНТИССЫ) (ПОРЯДОК), причем в дробной части мантиссы содержится ровно п— 1 цифр; если п < 0, то выдается сообщение об ошибке.

Сформированная запись вещественного обозначает число, представимое в указанной форме и ближайшее к значению параметра. ' ■

В случае когда имеется два таких числа, берется большее по модулю.

4) procedure putfrac (/, п); integer /, n;

Процедура формирует ЗАПИСЬ ГРУППАМИ без деся­тичной точки, если п = 0, и с десятичной точкой, за которой следует п цифр, если п > 0. Каждая группа за исключением, быть может, первой и последней (если она в дробной части), состоит из трех цифр. Сформированная запись числа является точным представлением числа i. 10n.

Процедуры редактирования и дередактирования предна­значены для обработки текстов «фиксированной длинЪ!».

Пример: " -,

text Tr, тип , количество , цена , сумма ;

integer сум, итого;

Гл: —blanks (80); тип: — Tr .sub (1,10);

количество : — Tr . sub (20,5); цена : — Tr. sub (30,6);

сумма : — 7V . sub (60,10):

if тип . strip = y заказ1 then

begin сум : = количество. getint X цена . getfгас;

итого : ~ итого + сум ;

.сумма .putfrac (сум, 2) end

11. ВВОД —ВЫВОД

Семантика средств языка, описывающих процессы ввода— вывода, основана на понятии «файл» (т. е. картотеки, набо­ров данных и т. п.). Файл представляет собой массив данных, внешних"* по отношению к программе. Мы будем .говорить

о «последовательном файле» или об «адресном файле» в за­висимости от его организации.

Примеры последовательных файлов:

пачка перфокарт,

последовательность печатных строк,

ввод с клавиатуры,

данные на ленте. *■

Примером. адресного файла является массив элементов информации на магнитном барабане или диске, когда каждый элемент обозначается посредством некоторого индекса.

Отдельные элементы информации, составляющие файл, будут называться «образами». Каждый «образ» является упо­рядоченной последовательностью литер. Средства для «без-форматного ввода — вывода» не являются частью базы языка СИМУЛА-67.

Средства языка, описывающие процессы ввода — вывода, вводятся посредством префиксов к блокам. В дальнейшем изложении такой набор средств будет описываться классом под названием BASICIO. Этот класс не может быть явно до­ступным для какой-либо программы пользователя. Про­грамма действует так, как если бы она была заключена в следующие блоки:

BASICIO (гс) begin