Сделай Сам Свою Работу на 5

Ввод-вывод целочисленных значений.





 

Вывод в CountingBlanksInText выглядит несколько ст ранно – множество пробелов отделяет конец строки. Количество пробелов зависит от выведенного целочисленного значения.

Когда целые значения выводятся в файлы типа TEXT, они преобразуются в символы и выравниваются по правой границе строки с фиксированной длиной (обычно длиной 10 символов). Лидирующие нули удаляются. Существует разница между операторами WRITE(‘5’) и WRITE(5). Первый добавляет строку †5† в OUTPUT, тогда как второй добавляет строку † 5†, потому что это были константы типов CHAR и INTEGER соответственно.

Паскаль имеет возможность управлять размером поля, в котором печатается значение типа INTEGER. Любые целые выражения в операторе WRITE могут быть дополнены двоеточием и целочисленным выражением которое обозначает размер поля для выражения. Например, если X и Y целые переменные со значениями 123 и 5, соответственно, тогда оператор WRITE(X:Y) добавляет строку † 123† в OUTPUT.

Новые синтаксические правила для оператора WRITE:

 

<список параметров WRITELN> ::= (<файловая переменная>)|<список параметров WRITE>|

<список параметров WRITE> ::= (<список элементов WRITE>)



<список элементов WRITE> ::= <файловая переменная> <параметры WRITE>

| <параметры WRITE>

<параметры WRITE> ::= <параметры WRITE> <параметр WRITE>

| <параметр WRITE>

<параметр WRITE> ::= <выражение>:<выражение> | <выражение>

 

Последовательные целочисленные значения могут быть считаны из файла типа TEXT если они разделены пробелами или маркерами строк. Если Int1 целочисленная переменная, выражение READ(Int1) будет ожидать последовательность символов в INPUT, которая образует знаковое целое. Строка символов будет преобразована в целое значение перед сохранением в Int1. Синтаксис таких последовательностей символов в INPUT такой же как синтаксис констант типа INTEGER в Паскаль-программах.

<знаковое целое> ::= <знак><беззнаковое целое>| <беззнаковое целое>

<знак> ::= + | –

<беззнаковое целое> ::= <последовательность цифр>

<последовательность цифр> ::= <последовательность цифр><цифра> | <цифра>

<цифра> ::= 0|1|2|3|4|5|6|7|8|9

Когда целочисленная переменная появляется в операторе READ, пробелы и маркеры, если необходимо, пропускаются пока не будет встречен непробельный символ. Оператор READ принимает те символы, которые могут быть частью целочисленной константы включая предшествующие знаки и останваливается перед первым символом, который не может быть частью этой константы. Целочисленное значение, соответствующее принятым символам сохраняется в переменной.



Например, для данной строки в INPUT:

† -12 3/32/†

где / представляет маркер конца строки, и программного фрагмента

VAR

I1, I2, I3 : INTEGER;

BEGIN

READ(I1, I2, I3);

выполнение оператора READ произведет состояние выполнения со следующим частичным содержанием:

{I1·-12, I2·3, I3·32}

При чтении файла типа TEXT, содержащего неизвестное количество целых чисел, финальный маркер конца строки остается за последним считанным целым числом. Таким образом, EOF не может быть использован для определения завершения, как по ошибке пытается делать программа ReadInts:

PROGRAM ReadInts(INPUT, OUTPUT);

{Ошибочная попытка считать все целые числа в INPUT}

VAR

Val: INTEGER;

BEGIN {ReadInts}

WHILE NOT EOF

DO

BEGIN

READ(Val);

WRITELN(Val)

END

END. {ReadInts}

После того как последнее целое будет считано, остается маркер конца строки и EOF будет все еще FALSE, поэтому программа пытается считать снова когда целых чисел уже нет, значение оператора READ неопределено.

Следующий вариант лучше:

PROGRAM ReadInts2(INPUT, OUTPUT);

{Читать файл с целыми числами обращая внимание

на последний маркер конца строки }

VAR

Val: INTEGER;

BEGIN {ReadInts2}

WHILE NOT EOF

DO

BEGIN

IF EOLN

THEN

READLN;

IF NOT EOF

THEN

BEGIN

READ(Val);

WRITELN(Val)

END

END

END. {ReadInts2}

Однако и эта программа выдаст ошибку, если финальный маркер конца строки не следует непосредственно за последним числом, например для строки †123x† или †123 †. Легче читать целые числа из файла типа TEXT с использованием охраняющего значения для обозначения, когда входные данные закончились (например –99999 или 0, какое-то значение, которое недопустимо в данном файле).



Для иллюстрации вычислений с целыми числами, следующая программа получает целое число N из входного файла, потом вычисляет сумму первых N целых чисел:

PROGRAM Sum (INPUT, OUTPUT);

{(N >= 0 -> I, S := N+1, 1+2+…+ N)}

VAR

I, N, S: INTEGER;

BEGIN {Sum}

READ(N);

S := 0;

I := 1;

WHILE I <= N

DO

BEGIN

S := S+I;

I := I+1;

END;

WRITELN(‘Сумма первых’, N:2

‘ положительных целых чисел’, S:3 )

END. {Sum}

 

Выполнение:

INPUT: 6

OUTPUT: Сумма первых 6 положительных целых чисел 21

 

Переполнение.

 

Целочисленные операции Паскаля производят корректные результаты только тогда, когда операнды и результа этих операций находится в пределах [-MAXINT, MAXINT]. Для операции сложения, график показывает пунктиром область корректности результатов для X + Y.

 

 

 
 

 

 


За пределами границ обозначенных MAXINT, сложение не производит корректных результатов. Из графика видно, что для двух произвольно выбранных целых чисел в одном случае из четырех результат для целочисленных операций моежт оказаться некорректным – ¼ часть области ограниченной +/- MAXINT не производит корректные результаты.

Аналогично для корректных результатов операции X-Y показанных на следующем графике.

 

 

 


Снова здесь вероятность ¼ что произойдет переполнение с двумя произвольными целыми числами.

Поскольку умножение может произвести большие знаечния легче, чем сложение и вычитание, вероятность преполнения здесь выше. Область корректных результатов для операции X*Y представлена на графике ниже.

 

 
 

 


Границы области представлены гиперболами, график выполнен с искажением масштаба. На самом деле площадь области корректных результатов существенно меньше. В одном квадранте, площадь подкривой Y = MAXINT/X задается:

 

= MAXINT + MAXINT ln MAXINT – MAXINT ln 1

 

Таким образом, площадь подкривой будет MAXINT + MAXINT ln MAXINTб тогда как площадь области ограниченной операндами MAXINT2, поэтому в случае произвольного выбора операндов, переполнение не произойдет с вероятностью:

 

=

 

Для MAXINT = 216 = 65535, вероятность не переполнения в случае произвольного выбора операндов будет:

 

или менее 2 на 10000.

 

В противоположность сложению, вычитанию и умножению, DIV и MODне производят переполнения:

 

Очевидно, что тип INTEGER представляет только небольшую, частичную модель математических целых чисел. При соблюдении ограничений операции будут отлично выполняться, но Паскаль-машина не занимается соблюдением таких ограничений, это должен делать программист.

Реализация работы с MAXINT зависит от реализации Паскаль-машины. То, что значение MAXINT может быть определено опытным путем на каждой машине можно скорее отнести к недостаткам Паскаля.Поэтому для разработки стабильного кода нужно быть внимательным. На некоторых машина вычисления останавливаются при переполнении, поэтому его можно безопасно игнорировать, пока программа не начнет давать сбои. Однако на большистве машин результат просто не будет соотвествтвовать значению соотвествующей арифметической операции.

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.