Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 6. Симула - универсальный процессо-ориент...doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
386.56 Кб
Скачать

Организация ввода – вывода

Ввод-вывод в языке СИМУЛА основан на понятии файла. В настоящее время система СИМУЛА позволяет работать с файлами последовательной структуры. Каждый файл состоит из записей фиксированной длины.

В языке определены три класса объектов infile, outfile, printfile, которые определяют понятие файла (см. приложение). Далее рассмотрены только процедуры ввода с экрана и вывод на экран.

Процедуры ввода

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

Процедура INIMAGE. Данная процедура помещает в буфер очередную запись и устанавливает указатель позиции буфера в 1.

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

Процедура INTEXT. Параметром процедуры является длина текста. Процедура служит для ввода текста длиной N, и, причем число N должно быть меньше или равно длине буфера, если значение N больше, чем длина подтекста, оставшегося в буфере (т.е. N>IMAGE.LENGTH – IMAGE.POS), то вводится новая запись в буфер. После чего производится ввод текста с нового значения буфера с первого символа.

Ввод целых и вещественных чисел осуществляется с помощью процедур ININT и INREAL.

Все эти процедуры производят поиск числа в подстроке буфера, начиная с текущего указателя позиции буфера. Если в подтексте буфера все символы являются символами пробела, то подтекст игнорируется, и значения буфера обновляются. Все символы, отличные от допустимых, для записи числа игнорируются.

Процедура ININT предназначена для ввода целых чисел. Данная процедура аналогична процедуре GETINT.

Процедура INREAL предназначена для ввода действительных чисел. Данная процедура аналогична процедуре GETREAL.

Процедуры вывода

Процедура outimage Данная процедура выводит принудительно содержимое буфера во внешний файл. При этом буфер заполняется пробелами, указатель позиции устанавливается в единицу.

Процедура OUTCHAR. Параметром данной процедуры является символ. Данный символ выводится в буфер данных, при этом указатель позиции увеличивается на единицу.

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

Процедура OUTINT. Параметрами данной процедуры являются целое число, предназначенное для вывода, и число символов для представления данного числа.

Процедура OUTFIX. Процедура OUTFIX (A, N, L) предназначена для вывода вещественного числа А. В зависимости от значения N формируется различная запись числа. Если N=0, то число А выводится как целое, если N>0, то N указывает число знаков после десятичной точки. Полученная запись округляется до N-го десятичного знака.

Процедура OUTREAL. Процедура OUTREAL (A, N, L) предназначена для ввода чисел, представленных в виде числа с плавающей точкой. Число (N - 1) задает число символов в мантиссе, L – общее число знаков числа.

Рассмотрим программу вывода графика функций. Будем предполагать, что исходные данные для функции хранятся во внешнем файле в следующем виде:

1 строка - <заголовок графика>

2 строка - <шаг вывода по оси Х> <символ обозначения графика> <начальное значение Х> <число точек>

3 строка - <значение Y> < значение Y > …

……………………….

……………………….

N строка < значение Y >

Размер блока файла – 80 байтов. Максимальное число точек – 100.

‘begin’

‘integer’ n, i; ‘ref’ (infile) vvod; ‘integer’ ‘array’ iy [1; 100];

‘text’ zag; ‘real’ ‘array’ y [1; 100];

‘real’ d.x0; ‘character’ c; ‘real’ ymin.ymax;

vvod:- ‘new’ infile (‘’graf’’);

vvod.open (blanks (80));

zag:- blanks (80);

zag:= vvod.intext(80);

d:= vvod.inreal;

c:= vvod.inchar;

x0:= vvod.inreal;

n:= vvod.inint;

‘for’ i:=1 ‘step’ 1 ‘until’ n

‘do’ y [i]:=vvod.inreal;

ymin:= y [1]; ymax:= y [1];

‘for’ i:=2 ‘step’ 1 ‘until’ n

‘do’

‘begin’

‘if’ y [i] > ymax ‘then’ ymax:= y[i];

‘if’ y [i] > ymin ‘then’ ymin:= y[i];

‘end’;

‘for’ i:=1 ‘step’ 1 ‘until’ n

‘do’

iy [i]:= y[i]/(ymax - ymin)*40;

‘comment’ вывод графика;

‘for’ i:=1 ‘step’ 1 ‘until’ n

‘do’

‘begin’

outfix (x0+d*(i -1),5,9);

outchar (“i”);

image.setpos (10+iy [i]);

outchar (c); outimage;

‘end’

‘end’

Исходные данные и результат работы программы приводится ниже:

ЗАГОЛОВОК

0.1* 0 10

0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

ЗАГОЛОВОК

0.00000I *

0.10000I *

0.20000I *

0.30000I *

0.40000I *

0.50000I *

0.60000I *

0.70000I *

0.80000I *

0.90000I *

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]