
- •Глава 6. Симула - универсальный процессо-ориентированный язык моделирования
- •Классы и объекты
- •Декларации класса
- •Подклассы
- •Объекты. Создание и средства доступа к атрибутам объекта
- •2.3. Средства доступа е атрибутам объектов
- •Квазипараллельное выполнение
- •Оператор detach (открепить)
- •Оператор resume (возобновить)
- •Выход через «end» объекта
- •Операторы перехода
- •Обработка упорядоченных множеств
- •Планирование процессов. Системный класс simulation
- •Статистические аспекты языка симула
- •Общая структура программы моделирования
- •Программное моделирование работы карьера
- •Описание классов
- •Текст программы
- •Ввод-вывод в симула
- •Понятие текста
- •Text array таблица [1:n];
- •Создание текстовых объектов
- •Процедуры работы с частью текста
- •Процедуры обработки текстов
- •Взаимное преобразование текстовых и арифметических значений
- •Сравнение текстов
- •Организация ввода – вывода
- •Процедуры ввода
- •Процедуры вывода
- •Контрольные вопросы и задания Литература
Взаимное преобразование текстовых и арифметических значений
Данные процедуры позволяют прямые и обратные преобразования.
Процедура getint. Процедура разыскивает в текстовом значении первую запись целого числа, т.е. последовательность цифр, перед которой может стоять любое количество пробелов и знак. Если в тексте первой записью не является последовательность цифр, перед которой стоит любое количество пробелов и знак, то обращение к данной процедуре приведет к ошибке, указатель позиции принимает значение на единицу больше, чем последний символ найденной записи.
Процедура getreal. Данная процедура разыскивает в тексте запись целого или вещественного значения с десятичной точкой и/или с указанием порядка (порядок представляет с помощью символа Е).
Следующие процедуры служат обратной цели – преобразованию арифметических символов в текстовые. Процедуры заполняют указанный текст полученной записью числа, отредактированная запись числа выравнивается по правому краю, если в тексте слева остается свободное место, то оно заполняется пробелами. Указатель позиции после редактирования принимает значение t.length+1, если длина текста недостаточна, то выдается сообщение об ошибке.
Процедура putint. Процедура putint(k) преобразует целое число k в символьный вид целого числа.
Процедура putfix. Процедура putfix(r,n) преобразует число r в символьный вид числа с фиксированной точкой, число n указывает число символов после точки.
Процедура putreal. Процедура putreal(r,m) формирует запись числа следующего вида:
<знак>d.dd…ddE<знак>dd
Если m=0, то перед Е устанавливается знак числа только в том случае, если число отрицательное. Если m=1, то перед символом порядка ставится запись целого, состоящего из одной цифры, если m>1,то в дробной части записывается m -1 цифра.
text t1,t2,t3,t4,t5;
integer c;
real a,b;
t1 :- text(' -128,5+6,17e1')
t2 :- blanks(5);
t3 :- blanks(6);
t4 :- blanks(11);
t5 :- t1.sub(9,7);
c := t1.getint;
a := t1.getreal;
b := t5.getreal;
t2.putint(c);
t3.putfix(b,2);
t4.putreal(a,3);
В результате выполнения данного примера получим следующие значения: с=128; a=128,5; b=+6,17E1; t2=' -128'; t3='61,70'; t4=' -12,85E+01'.
Сравнение текстов
Текстовые значения можно сравнить между собой с помощью операции сравнения: <, <=, =. Cравнение текстовых значений основано на использовании отношения символов, составляющих тексты.
Два текста равны, если они либо оба пусты, либо являются экземплярами одной и той же последовательности литер.
Текстовое значение t1 является меньше, чем текстовое значение t2, только в том случае, если они не равны и выполнено одно из условий:
- t1 пусто;
- вся последовательность символов из t1 совпадает с началом последовательности символов t2, то в t2 есть хотя бы еще один символ;
- ранги первых k символов t1 и t2 равны, а ранг (k+1) - го символа из t1 меньше, чем ранг (k+1) - го символа из t2.
Рассмотрим процедуру, которая выделяет в текстовой строке все слова и переворачивает их. Cлова друг от друга отделяются пробелами.
begin
text a;
a :- text(''кот сон'');
procedure rep(t);
text t;
begin
text u; character c; integer k, k1, k2, k3, k4;
k3 := t.pos; u :- blanks(t.length);
t.setpos(1); u := t;
while u.more do
begin
c := u.getchar;
if c ='' '' then t.putchar (c)
else
begin
k1 := u.pos;
while u.more do
begin
c := u.getchar;
if c = '' '' then
begin
k2 := u.pos;
u.setpos(k2); k4 := k2 – 2;
while k4>(k1-2) do
begin
u.setpos(k4);
k4:=k4-1;
t.putchar (u.getchar);
end;
u.setpos(k2-1); goto m1;
end
end
m1: end
end;
t.setpos(k3);
end rep;
outtext(a);
outimage;
rep(a);
outtext(a);
outimage;
end;
Если текстовое выражение имеет значение 'кот сон', то в результате выполнения процедуры получим 'ток нос'.