Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LABs1-10a.doc
Скачиваний:
6
Добавлен:
17.11.2019
Размер:
833.54 Кб
Скачать

Лабораторная работа n 5. Ввод/вывод на языке программирования Паскаль

=============================================

Цель и задача работы : целью работы является ознакомление с про-

---------------------- цедурами ввода/вывода. В данной работе

требуется написать программу, которая при-

нимает данные с клавиатуры и печатает их

на экран дисплея.

Теоретические положения.

------------------------

Идея построения совершенно независимой от внешнего мира прог-

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

рамма более реалистична (и более полезна), если некоторые значения

разрешено указывать в ходе ее выполнения. Ввод делает программу бо-

лее гибкой, благодаря чему ее можно использовать не только для вы-

полнения какой-то конкретной задачи, но и для решения большого чис-

ла задач данного типа. Для того чтобы узнать результаты работы прог-

раммы,данные нужно вывести на какое-либо устройство (например,дис-

плей).

Процедура ввода отвечает за ввод с указанного устройства и пе-

ревод данных, представленных в приемлемой для программиста форме,

т.е. в виде символов и цифр, в двоичный код в виде нулей и единиц -

информацию понятную компьютеру. Для того чтобы программист мог уви-

деть результат работы какой-либо программы, нужно перевести двоич-

ный код в приемлемую для человека форму и вывести эти данные куда

он укажет. Этим занимается процедура ввода.

Для определения конструкций языка используется метаязык, осно-

ванный на металингвистических формулах бекуса-наура, приведенный в

таблице:

+----------------------+-------------------------------+

I метасимвол I значение I

+----------------------+-------------------------------+

I = I определяет "быть" I

+----------------------+-------------------------------+

I ! I альтернатива I

+----------------------+-------------------------------+

I . I конец определения I

+----------------------+-------------------------------+

I [X] I 0 или 1 появление X I

+----------------------+-------------------------------+

I (*X*) I 0 или более повторений X I

+----------------------+-------------------------------+

I (X!Y!...!Z) I группирование: любой из X,Y,Z I

+----------------------+-------------------------------+

I "XYZ" I терминальный символ XYZ I

+----------------------+-------------------------------+

I имя-из-строчных-букв I нетерминальный символ I

+----------------------+-------------------------------+

Для удобочитаемости нетерминальные символы разделены дефисами.

Для осуществления ввода/вывода на языке программирования пас-

каль, существуют специальные процедуры ввода/вывода : READ, READLN,

WRITE, WRITELN, а также процедуры работы с файлами GET и PUT, кото-

рые будут рассмотрены в соответствующей лабораторной работе.

Ввод: GET +

I> (F);

вывод: PUT +

если параметр F не задан, то подразумевается ввод (вывод) из

(в) стандартного (стандартный) файл ввода (вывода) INPUT (OUTPUT),

обычно с клавиатуры (на экран дисплея), этот файл имеет тип TEXT.

Процедуры ввода (READ, READLN) считывают одно или более значе-

--------------- ний из файла F в одну или более переменных.

Формат процедуры:

список-параметров-READ = "(" [переменная-файл ","] переменная

(*"," переменная*) ")".

Список-параметров-READLN = "(" [переменная-файл ","] перемен-

ная (*"," переменная*) ")".

Если параметр переменная-файл не задан, то подразумевается ввод

из стандартного файла ввода INPUT , обычно с клавиатуры, этот файл

имеет тип TEXT.

Если в одной процедуре ввода присутствуют несколько переменных,

то возникает ряд трудностей,связанных с тем, что при вводе значения

должны разделяться друг от друга разделителями. Вид этих разделите-

лей зависит от конкретной реализации языка программирования в конк-

ретной операционной системе. Обычно при вводе числовых значений в

качестве разделителей выступает пробел (обычно количество пробелов

может быть любым). Особый случай, если наряду с числовыми перемен-

ными указаны символьные переменные. В этом случае пробел может быть

воспринят как разделитель или как значение символьного типа, кото-

рое вводится. Обычно пробел остается разделителем, но тогда если за

числом вводится литера пробел, то между ними должна присутствовать

дополнительная литера пробел, выполняющая роль разделителя. Из фай-

ла INPUT можно вводить следующие типы значений : CHAR, REAL и

INTEGER. Ввод значений остальных типов (в том числе и стандартного

типа BOOLEAN) осуществляется программно с помощью значений указанных

типов, чаще всего на базе типа CHAR.

Процедуры вывода (WRITE, WRITELN) записывают одно или более зна-

чений переменных или строковых констант в файл.

Формат процедуры:

список-параметров-WRITE = "(" [переменная-файл ","] параметр-

WRITE (*"," параметр-WRITE*) ")"

параметр-WRITE = выражение [":" выражение [":" выражение ]].

Список-параметров-WRITELN = "(" [переменная-файл ","] параметр-

WRITE (*"," параметр-WRITE*) ")".

Если параметр переменная-файл не задан, то подразумевается вы-

вод в стандартный файл вывода OUTPUT, на экран дисплея, этот файл

имеет тип TEXT.

Элемент вывода может иметь один из трех видов : V, V:M, V:M:N.

При выводе можно управлять размещением данных по позициям строки.

Элемент вида V.

При обработке элемента вывода в свободные позиции буфера заносится

группа литер, которая представляет собой выводимое значение, задан-

ное элементом V:

- если V строковая константа, то такой группой литер является пос-

ледовательность литер в этой константе, заключенная в апострофы,

т.е. если V костанта 'F(X)=2X-1', то в буфер будет занесено 9

литер F(X)=2X-1;

- если V выражение типа CHAR, то в буфер будет занесена единствен-

ная литера, в зависимости от выражения V;

- если V логическое выражение, то в буфер заносится четыре литеры

TRUE или пять литер FALSE, в зависимости от значения выражения V;

- если V выражение типа INTEGER, то его целочисленное значение

преобразуется из внутреннего представления в последовательность

литер, представляющих запись этого числа в десятичной форме;

- если V выражение типа REAL, то ненулевое значение представляется

в десятичной системе счисления в форме с плавающей точкой.

Формат числа с плавающей точкой:

число-с-плавающей-точкой = [знак] целое-без-знака "." Дробная-

часть ["E" парядок] ! целое-без-знака "E" порядок

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

дробная-часть = послеовательность-цифр

порядок = целое-со-знаком

целое-со-знаком = знак целое-без-знака

знак = "+" ! "-".

Элемент вида V:M.

Здесь значение выражения M задает ширину поля (число позиций в

строке буфера), в котором должно быть размещено выводимое значение.

Значение размещается,начиная с правых позиций поля.

Пусть D число литер, изображаюших значение V:

а) M>D - свободными оказываются M-D левые позиции и они заполня-

ются пробелами;

б) M<D - ширина поля принимается автоматически в точности равной

числу литер D.

Элемент вида V:M:N.

Такой элемент используется,только если V выражение типа REAL, при-

чем M общая ширина поля, а N ширина поля под дробную часть числа.

Процедуры WRITELN и READLN отличаются от WRITE и READ тем, что

после выполнения процедуры ввода/вывода произойдет переход к началу

новой записи.

При заданном параметре переменная-файл (кроме файла типа TEXT),

элементы списка ввода/вывода должны иметь тот же тип, что и пере-

менная-файл. Если файл типа TEXT, то элементы списка ввода/вывода

могут иметь разный тип.

Типы переменных :

-----------------

INTEGER (Числа с фиксированной точкой)

диапазон представления чисел : -32768..+32767

В памяти занимает 2 байта.

REAL (Числа с плавающей точкой)

диапазон представления чисел : 1.E-38 .. 1.E+38 (По модулю)

в памяти занимает 4 байта.

CHAR (Символьный тип)

все символы таблицы кои-7

в памяти занимает 1 байт.

BOOLEAN (Логический тип)

значениями этого типа могут быть константы : FALSE и TRUE

в памяти занимает 1 байт.

Пример : ввести с клавиатуры два числа (целого и вещественного

типа), вывести на экран дисплея : целое в поле шириной

7, а вещественное в поле шириной 7 и под дробную часть

поле шириной 5.

PROGRAM PRIMER;

VAR I: INTEGER; X: REAL;

BEGIN

WRITE('Введите первое число (целое) :'); READ(I);

WRITE('Введите второе число (вещественное) :'); READ(X);

WRITELN('Вы ввели : I=',I,' X=',X);

WRITELN('Первое число : ',I:7); (* V:M *)

WRITELN('Второе число : ',X:7:5); (* V:M:N *)

END.

Варианты заданий :

------------------

Ввести значения переменных по шаблону, представленному в табли-

це, и вывести их по другому шаблону с тремя различными полями (см.

Примечание)

+-----------+-----------------------+-----------------------+

I I последовательность I поля I

I номер I ввода/вывода данных +-----------------------+

I +-----------------------+ M I N I

I варианта I ввод I вывод +---+---+---+---+---+---+

I I I I 1 I 2 I 3 I 1 I 2 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 1 I R I R C C I C C R I R I 3 I 3 I 6 I 2 I 0 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 2 I R C I R I I C I R I R I 5 I 4 I 3 I 2 I 1 I 1 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 3 I C I R I R I R I C I R I 4 I 7 I 8 I 2 I 5 I 5 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 4 I C I C I R I I I C R C I 5 I 6 I 9 I 0 I 1 I 7 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 5 I C R R I C I R R C I C I 2 I 8 I 5 I 1 I 4 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 6 I C C R I I I C R I I C I 4 I 4 I 4 I 1 I 2 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 7 I R I C R C I I R C R C I 4 I 5 I 6 I 1 I 2 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 8 I R I C I C I I I C C R I 4 I 5 I 6 I 2 I 4 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 9 I I C R C R I C R R C I I 7 I 5 I 5 I 1 I 0 I 4 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 10 I I C R I C I C R I C I I 5 I 7 I 8 I 2 I 2 I 2 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 11 I R I C R C I R C I C R I 4 I 5 I 6 I 3 I 2 I 1 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 12 I C C R R I I I C C R R I 3 I 5 I 4 I 0 I 0 I 1 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 13 I R C R C I I I C R C R I 4 I 5 I 6 I 1 I 3 I 2 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 14 I C R I R C I C I R C R I 7 I 7 I 9 I 2 I 2 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 15 I R C C I C I C C R I C I 3 I 4 I 3 I 2 I 2 I 1 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 16 I I R C C R I C R I R C I 4 I 2 I 1 I 2 I 0 I 0 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 17 I C R I R C I I R C C R I 4 I 1 I 3 I 1 I 0 I 2 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 18 I I I C R R I I R C R I I 4 I 2 I 9 I 2 I 1 I 5 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 19 I I R C R I I I I C R R I 4 I 5 I 3 I 1 I 2 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 20 I R I C I R I I R I C R I 2 I 5 I 7 I 1 I 2 I 6 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 21 I R C I C R I C R C I R I 8 I 6 I 2 I 3 I 3 I 0 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 22 I C R C I R I R C I C R I 3 I 4 I 1 I 1 I 1 I 0 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 23 I C R C I I I I I R C C I 2 I 2 I 3 I 1 I 0 I 2 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 24 I R R I C C I R I C R C I 3 I 7 I 4 I 2 I 6 I 1 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 25 I R C I C C I C I C R C I 2 I 4 I 4 I 1 I 2 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 26 I C C I R I I R I I C C I 3 I 7 I 6 I 1 I 3 I 5 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 27 I R C I C R I I C C R R I 8 I 2 I 4 I 1 I 2 I 1 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 28 I C I I R C I C I C I R I 1 I 6 I 5 I 1 I 2 I 3 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 29 I C I R C I I I C R I C I 8 I 5 I 7 I 1 I 4 I 6 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 30 I R I C C R I I R C R C I 6 I 9 I 4 I 5 I 9 I 2 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 31 I C I I C R I R C I I C I 4 I 9 I 8 I 3 I 8 I 7 I

+-----------+-----------+-----------+---+---+---+---+---+---+

I 32 I R I R C C I C C R I R I 8 I 5 I 9 I 7 I 4 I 9 I

+-----------+-----------+-----------+---+---+---+---+---+---+

примечание : R C I C R - означает,что данные присваиваются

------------ соответственно переменным типа REAL,потом CHAR,

INTEGER, CHAR, REAL. При выводе сначала выводятся

соответственно значения переменных типа REAL,

INTEGER, CHAR, REAL. Ввод/вывод осуществляется

в одной процедуре ввода/вывода.

Вывести с тремя различными полями означает, что в программе присут-

вуют три процедуры вывода, в каждой из которых данные выводятся с

размещением по позициям строки (элементы вида V:M и V:M:N).

Пример : вывести числа 6 и 4.67

--------

+-----------------------+

I Поля I

+-----------+-----------+

I M I N I

+---+---+---+---+---+---+

I 1 I 2 I 3 I 1 I 2 I 3 I

+---+---+---+---+---+---+

I 5 I 6 I 7 I 3 I 2 I 3 I

+---+---+---+---+---+---+

в данном случае : WRITELN(6:5,4.67:5:3);

WRITELN(6:6,4.67:6:2);

WRITELN(6:7,4.67:7:3);

Приложение

Cредства обмена данными.

Основа ввода и вывода составляют текстовые файлы, которые передаются как

параметры. Вычислительный процесс выполняет преобразование текстового файла

называемого INPUT в текстовый файл называемый OUTPUT. Оба эти файла в языке

стандартные и служат параметрами для программы. Для управления текстовыми

файлами вводятся четыре стандартные процедуры READ , WRITE , READLN , и

WRITELN в дополнении к процедурам GET и PUT.

Эти процедуры позволяют использовать для переменных большее количество

параметров. Параметры не обязательно должны быть типа CHAR. Разрешаеются

типы , для которых передача данных совмещена с опеациями по их неявному

преобразованию. Если первый параметр - это переменная-файл, то этот файл

читается или пишется. В противном случае стандартные файлы INPUT и OUTPUT

автоматически предпологаются как значения по умолчанию в случае чтения или

записи.

Текстовые файлы - это специалный случай типа FILE, когда текст подразде-

ляется на строки с помощью маркеров строк. Если во время чтения текстового

файла позиция файла достигает маркера конца строки, следующего за последней

литерой строки, то значение буферной переменной F^ становится равным пробелу,

а стандартная функция EOLN(F) принимает значение TRUE.

Продвижение позиции файла еще дальше вызывает то, что EOF(P) становится

равным TRUE или F^ присваивается первая литера следующей строки и EOLF(F) и

принимает значение FALSE (если только следующая строка не состоит из нуля

литер). Маркеры строк не принадлежат типу CHAR и могут быть сгенерированы

только процедурой WRITKLN.

4.1. Процедура READ

формат процедуры:

список параметров -READ = '(' [переменная-файл ','] переменная [',' пере-

менная] ');

для процедуры справедливо следующее:

1) READ(V1...VN) Эквивалентно READ( INPUT , V1...VN);

2) READ(F,V1...,VN) Эквивалентно

BEGIN

READ(F,V1); ...; READ(F,VN);

END.

3)Если V - переменная типа CHAR или интервального типа CHAR , то READ(F,V)

эквивалентно

BEGIN

V:=F^ GET(F)

END.

4)Если V - переменная типа INTEGER (или его интервал), то READ(F,V) читает

читает из F последовательности литер,которые образуют целое со знаком в

соответствии с синтаксисом. Значение целого числа присваивается переменной

V , если оно совместимо по присваиванию с типом переменной V. Предшеству-

ющие пробелы и маркеры строк пропускаются. Чтение прекращается, как только

в буферной переменной файла F^ пояфляется литера,которая не является частью

целого со знаком .

Процедура READ может быть использована для чтения из файла F, который

не есть текстовый файл.

READ(F,X) Эквивалентно

BEGIN

X:=F^; GET(F);

END.

Примечание. В подразделе обозначено:

V1,V2,...,VN - Переменные типа CHAR, INTEGER,REAL;

F - текстовый файл

4.2 Процедура READLN

поцедура READLN используется для перехода к началу следующей строки.

Формат процедуры:

список-параметров-READLN=['('переменная-файл I переменная) (','переменная')']

для процедуры справедливо следующее :

1)READLN(F,V1,...,VN); Эквивалентно

BEGIN READ(F,V1,...,VN); READLN(F); END.

2)READLN(F); Эквивалентно

BEGIN WHILE NOT EOLN (F) DO GET (F); GET(F); END.

Примечание. В подразделе обозначено:

V1,...VN - Переменные типа CHAR , INTEGER , REAL;

F - текстовый файл.

4.3.Процедура WRITE

формат процедуры:

список-параметров-WRITE = выражение [':' выражение [':' выражение]]

для процедуры справедливо следующее:

1)WRIE (P1,P2,...,RN) Эквивалентно

BEGIN WRITE(F,P1);...; WRITE(F,PN); END.

2)Параметр P может иметь следующий вид:

E:M

E:M:N

E.E

Где E - выражение, значение которого должно быть записано в файл F ;

оно может быть числовым (целым или вещественным), литерным, логичес-

ким или строковым.

M И N - целые значения, являющиеся параметрами ширины поля; ровно M

литер выводится (включая необходимое число пробелов слева в представ-

лении E ), за исключением случая, когда E является числовым значением

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

Процедура WRITE(F,E) эквивалентна WRITE(F,E:M), использующей значе-

ние по умолчанию для M , которое зависит от типа E: для типов INTEGER,

BOOLEAN и REAL это значение определяется при реализации. Процедура

WRITE(F,E:M:N) применима, только если е имеет тип REAL;

3)если е имеет тип CHAR, то значение м по умолчанию есть единица;

4)если е имеет тип INTEGER, то в файл F выводится десятичное представ-

ление числа E. Если P - положительное число, определяемое как

IF E=0

THEN P:=1

ELSE определит P так, что

10**(P-1)<=ABS(E)<10**P,

то представление числа E имеет следующий вид:

- если M больше или равно P+1, то (M-P-1) пробелов;

знак ('-'), если E<0, в противном случае пробел, P цифр;

- если м<P+1, то P литер, если E=>Q ,и (P+1) литера , если E<0

5) если число е имеет тип реал , то в файл F выводится десятичное пред-

ставление числа E , округленное с указанным числом значащих цифр или деся-

тичных позиций.

WRITE (F,E:M) Выводит E в форме числа с плавающей точкой.

Если D - значение , определенное при реализации (представляющее число

цифр , выводимых как экспонента), а неотрицательное число ER и целое число

P определяется как

IF E=0.0

THEN BEGIN ER:=0.0; P:=1 END

ELSE

BEGIN

ER:=ABS (E);

Определить P так , что 10**(F-1)<=10*P;

ER=ER+0.5*(10**(P-M+D+4));

ER Округляется до (M-D-4) значащих десятичных цыфр

END;

то представление числа E имеет следующий вид:

- если M больше или равно D+6 , то знак ('-', если E< и ER<=>,в про-

тивном случае пробел)

начальные цифры ER,

литера '.'

Следующие (M-D-5) цыфр ER,

литера 'E',

знак числа (F-1)('+' или '-'),

D - цифр для (P-1) ( с ведущими нулями);

- если M меньше D+6 , то (D+6) литер , включая одну чифру после деся-

тичной точки.

WRITE (F,E:M:N) Выводит E в форме числа с фиксированной точкой. Если

неотрицательное число ER и положительное число P определяются как

IF E=0.0

THEN ER:=0.0

ELSE

BEGIN

ER:=ABS (S);

ER:=ER+0.5*10**(-N);

ER Округляется до N десятичных позиций

END;

IF

TRUNC (ER)=0

THEN P:=1

ELSE определить P так, что 10**(P-1)<=TRUNC(ER)<10**P

то представление числа E имеет вид :

- если M больше или равно P+M+2 , то (M-P-N-2) пробелов,

знак ('-' если ER<=>0 , в противонм случае пробел),

первые P цыфр ER,

- если M меньше P+N+2 , то (P+N+2) литер;

6) если E имеет тип BOOLEAN , то в файл F выводится представление слова

TRUE или слова FALSE. Это эквивалентно

WRITE (F, 'TRUE' *M или WRITE (F, 'FALSE':M);

7)если E имеет строковый тип , то в файл F выводится значение E, которому

предшествует (M-N) пробелов, если M>=N.

Если M<N,то выводятся символы строки с 1 по M включительно .

Если M опущено ,то значение по умолчанию есть M.

Процедура WRITE может быть использована для записи в файл,

который не является текстовым .

WRITE (F,X) Эквивалентно

BEGIN F^:=X; PUT (F) END.

4.4 Процедупа WRITELN

формат процедуры:

список-параметров - WRITELN = ['('( переменная-файл параметр WRITE) [','

параметр - WRITE ]')]

для процедуры справедливо следующее:

1) WRITELN (F,P1,...,PN); WRITELN (F) END;

BEGIN WRITE (F,P1,...,PN); WRITELN (F) END;

2) WRITELN (F) Приписывает маркер строки к файлу F.

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