В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 53
Текст из файла (страница 53)
Поэтому можно ограничиться рассмотрением оператора видаигi te <х>Элемент вывода х может иметь один из трех видов:ее : те : т : пгде е — выражение (типа char, integer, real, boolean), строковая константаили строковая переменная (рассмотренные в главе 7), а т и— выражения, которые должны принимать положительные целочисленные значения.Элемент вида е. Напомним прежде всего, что в файл output выводятсяпоследовательности литер, которые разбиваются на строки фиксированнойдлины: при выводе на экран дисплея строки содержат 80 позиций,а на АЦПУ — 128 позиций. Для вывода используется буфер, в которомпредварительноформируетсястрока литер, подлежащаявыводу.К началу выполнения программы этот буфер очищается, т.е.
все его позиции заполняются пробелами. При обработке элемента вывода в каком-либооператоре процедуры write в очередные свободные позиции буфера заносится группа литер, которая представляет собой выводимое значение,заданное элементом е:— если е есть строковая константа, то такой группой литер является последовательность литер в этой константе, заключенная в апострофы (если,например,е есть строковая константа ' f ( x ) = ' , T O в очередные свободныепозиции буфера будет занесено пять литер f ( x ) = ) ;— если е — выражение типа char, то в буфер заносится единственная литера, являющаяся значением этого выражения;— если е - логическое выражение, то в буфер заносится четыре литерыtrue или пять литер false, в зависимости от значения этого выражения;— если е — выражение типа integer, то его целочисленное значение предварительно преобразуется из внутреннего (машинного) представления в последовательность литер, представляющих запись этого числа в десятичнойсистеме счисления:ftcO^-l • • • «lttoгде Р х - знак числа (литера+ или - ) , a a, (i = 0, 1к) - десятичные цифры.Количество / позиций, отводимых для представления числа (/ = к +2),фиксировано и определяется реализацией (в большинстве известных реализаций 1 = 8 ) .
При этом знак числа помещается непосредственно перед старшей значащей цифрой (знак + может заменяться пробелом), а в случаенеобходимости недостающие слева позиции заполняются пробелами.Например, при выполнении операторов (/ — переменная типа integer)is=243; write(i)в очередную восьмерку позиций буфера будет занесена группа литер+ 243 (или группа литер243).226Если е — выражение типа real, то его ненулевое значение представляетсяв десятичной системе счисления в форме с плавающей точкойе = т * 10 Ргде т (0.1 < | т | < 1 ) — мантисса, а р — порядок числа, и изображаетсяв видеM . a i a 2 • • • otrEppPiP!где (Зх - знак числа, | т \ = 0.
cnjO^ ... аг , /Зр — знак порядка, | р \ = р г р\(при этом исходное значение е, естественно, округляется соответствующимобразом). Значение г фиксировано и определяется реализацией (мы будемсчитать, что г = 6), а знак + числа может заменяться пробелом. Для значения е = 0 принимается т = 0 и р = 0. Таким образом, для изображения вещественного числа отводится I = г + 1 позиций.Например, по операторам (х — вещественная переменная)х1-0.0025$write(х/10)в очередные 13 позиций буфера (при г = 6) будет занесена последовательность литер (с точностью до округления)+ 0.244999Е —03(или _ 0 . 2 4 4 9 9 9 Е - 0 3 ) .Итак, при обработке элементов вывода в очередные свободные позициибуфера последовательно заносятся литеры, полученные по указанным вышеправилам. Как только в этом процессе буфер окажется заполненным(очередная подлежащая выводу литера будет занесена в последнюю егопозицию), сформированная в буфере строка литер выводится на очереднуюстроку экрана дисплея или печатается в очередную строку бумаги на АЦПУ,буфер очищается и в нем начинается формирование следующей подлежащейвыводу строки литер.Как видно, если значение, задаваемое элементом вывода е, представляется более, чем одной литерой, то буфер может оказаться заполненным ив тот момент, когда в него занесена лишь часть той группы литер, котораяизображает выводимое значение.
В этом случае начало изображения значения окажется в конце одной строки, а его продолжение — в начале следующей строки экрана дисйлея или бумаги АЦПУ. Это обстоятельство оченьнеудобно при выводе чисел, поэтому в некоторых реализациях сначалапроверяется, может ли изображение выводимого числа полностью разместиться в свободных позициях буфера, и если нет, то оставшиеся позициизаполняются пробелами (что влечет за собой вывод содержимого буфера),а изображение выводимого числа размещается в начале освободившегосябуфера.Итак, при выполнении процедуры write с использованием элементовсписка вывода вида е правила размещения выводимых данных к а к построкам, так и по позициям отдельных строк жестко зафиксированов каждой реализации языка, что может затруднить получение такого формата выдачи, который обеспечивал бы хорошую наглядность полученныхрезультатов и удобство последующего их использования человеком.Для устранения этих неудобств в паскале предусмотрена возможностьуправления форматом выдачи со стороны программиста, т.е.
в языкеимеются средства, с помощью которых программист может управлятьразмещением данных как по строкам, так и по позициям отдельнойстроки.Управление размещением данных по строкам. С возможностями, предоставляемыми языком в этом отношении, мы уже знакомы — средством такого управления является процедура writeln.
Обращение к этой процедуреможет производиться с помощью оператора процедуры без фактическихпараметров. В этом случае назначение процедуры состоит просто в заполнении всех оставшихся свободными позиций буфера литерой пробела,после чего, как обычно, сформированная в буфере строка литер выводитсяи буфер очищается. Таким образом, по оператору writeln осуществляетсяпринудительный вывод текущего содержимого буфера и переход на новуюстроку экрана дисплея или бумаги АЦПУ. В частности, если к моменту выполнения оператора writeln буфер был пуст, то осуществляется выводстроки, содержащей литеру пробела во всех ее позициях (пустой строки).Для большего удобства использования этой процедуры к ней разрешается обращение и с фактическими параметрами, причем оператор процедурывидаwriteln<х1,х2,...,хп>эквивалентен последовательности операторовwrite(х1,х2,...
,хп); writelnЗаметим, что процедурой writeln мы широко пользовались во всех приведенных ранее примерах.Управление размещением данных по позициям строки. Как мы ужезнаем, по элементу вывода вида е для каждого типа выводимого значенияотводится свое, вполне определенное число позиций в строке, что не всегдаудобно.Например, по операторама:=58;Ь:=324;write('a+b=',а+Ь,'a=',a);при выводе на АЦПУ будет получена распечатка (ниже приводится соответствующий ее фрагмент).
. . а +Ь =382а =58в то время как более удобной для восприятия была бы, например, распечатка. . . а + b = 382 _ а = 58 . . . .Дня достижения этих целей и служат элементы вывода вида е : т ие : т : п. Рассмотрим оба эти вида элементов.Элемент вида е:т. Здесь значение выражения т задает ширину поля(число очередных позиций в строке буфера), в котором должно быть размещено выводимое значение е, причем это значение размещается в правыхпозициях заданного поля. Здесь возможны два случая, в зависимости от228соотношения заданного значения т и числа d литер, изображающих выводимое значение е.При m>d оказывающиеся свободными т — d левые позиции заданногополя заполняются пробелами, а при m<d ширина поля принимается в точности равной числу d литер, с помощью которых изображается значение е,без лишних пробелов слева и (или) справа от него.Так, если приведенный выше фрагмент программы записать в видеа:=58;b:=324;write<'a+b=',а+Ь!1,'_a',a:1>;то в результате получится желаемая более наглядная распечатка:.
. . а + b = 3 8 2 _ а = 58 . . .Задание значения m>d позволяет более простым и компактным способом разместить выводимые группы литер по нужным позициям строки.Пусть, например, выводимой на печатьтаблице значений аргумента х и соответствующих им значений функций sin (х), cos (л:) и ех надо предпослатьстроку, в которой содержатся заголовки соответствующих столбцов значений, причем литера X должна быть отпечатана в 7-й позиции строки,а группы литер SIN (X), COS(X) и ЕХР(Х) должны быть размещены в полях, кончая позицией 25, 43 и 67 соответственно. Для печати такой строкис использованием элемента вывода вида е в качестве такого элементапришлось бы задать строковую константу, состоящую по крайней мереиз 67 литер, которая содержала бы в соответствующих позициях литерупробел.
С использованием элементов вывода вида е : т требуемую строкуможно отпечатать с помощью оператора выводаw r i t e l n < ' Х ' : 7 , 'SIN(X) ' : 1 8 , 'COS(X) ': IB, 'ЕХР(Х) ':24>Аналогичным образом можно обеспечить печать значений аргумента х ивычисляемых значений функции по колонкам, каждая из которых занимаетопределенное поле очередной строки.Элемент вида е : m : п. Такой элемент можно использовать только в томслучае, когда е является выражением типа real, и он означает, что вещественное значение е должно быть представлено в форме с фиксированнойточкой, причем в дробной части числа должно содержаться п цифр(параметр m имеет описанный выше смысл) . Например, операторwri t e ( 3 .