Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль_для_математиков.DOC
Скачиваний:
12
Добавлен:
04.05.2019
Размер:
3.05 Mб
Скачать

4. Операторы ввода-вывода

Простейший оператор ввода в Паскале - оператор Read, он записывается в виде :

Read(имя,имя,...);

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

ReadLn(имя,имя,...);

Различие между операторами Read и ReadLn заключается в следующем: оператор Read вводит данные, указанные в его списке ввода, рассматривая символ Enter (конец строки) как обычный разделитель, последний из нажатых символов Enter не считывается и остается в буфере клавиатуры. Оператор ReadLn при вводе числовых данных также рассматривает Enter как разделитель, но после того, как все данные введены, считывается и символ конца строки, при этом все данные, располагающиеся во входном потоке до ближайшего конца строки, пропускаются. Пусть, например, программа вводит с клавиатуры числа a,b,c,d,e,f.

Begin

Read(a,b,c);

ReadLn(d);

ReadLn(e);

ReadLn(f);

End.

Мы хотим ввести значения 1,2,3,4,5 и 6 и набираем на клавиатуре следующую последовательность символов: 1 2 3 4 5 6 Enter , но программа по-прежнему ждет ввода данных - почему? Оператор Read(a,b,c) успешно ввел значения 1,2,3, оператор ReadLn(d) ввел значение 4 и прочитал символ Enter, а значения 5 и 6 были пропущены, теперь оператор ReadLn(e) ждет вводимого значения, а входной поток пуст. Правильный входной поток для этой программы может быть, например, таким: 1 2 3 4 Enter 5 Enter 6 Enter , или таким: 1 Enter 2 Enter 3 Enter 4 Enter 5 Enter 6 Enter . Если программа вводит только числовые значения, то лучше всегда использовать операторы Read, а не ReadLn, так как в этом случае данные во входном потоке могут располагаться как угодно - все данные в одной строке, или каждое значение в новой строке, или любым другим способом.

Оператор ReadLn; без списка в скобках можно использовать для организации задержки в работе программы - он будет ожидать нажатия клавиши Enter.

При неправильном вводе числовых данных (нечисловая константа или константа, не соответствующая типу вводимой переменной) происходит аварийное завершение программы: выводится сообщение “Error 106 : Invalid numeric format”, и выполнение программы прекращается. Несколько позже мы обсудим способы предотвращения таких ситуаций. При отладке программы всегда бывает полезно задавать опцию компилятора {$D+} - “включить режим отладки”. При аварийном завершении программы, откомпилированной в таком режиме, не только выводится сообщение об ошибке, но и указывается курсором строка, где эта ошибка произошла.

Простейший оператор вывода записывается в виде :

Write(выражение,выражение,...);

или

WriteLn(выражение,выражение,...);

Вывести можно любое выражение, если необходимо вывести текст, он заключается в апострофы. Оператор WriteLn отличается от оператора Write тем, что после вывода осуществляется переход на новую строку. Можно использовать оператор WriteLn; без списка вывода для пропуска строки. Запишем пример программы, осуществляющей ввод и вывод:

Var i : Integer;

w : Word;

r : Real;

Begin

WriteLn;

{------------- ввод -------------}

Write('Введите целое число ');

Read(i);

WriteLn;

Write('Введите натуральное число ');

Read(w);

WriteLn;

Write('Введите вещественное число ');

Read(r);

WriteLn;

{------------- вывод -------------}

WriteLn('Вы ввели : ',i,' ',w,' ',r,' их сумма=',i+w+r);

WriteLn('Нажмите Enter для выхода');

ReadLn;

End.

Впервые записав осмысленную программу, остановимся и обсудим ее внешний вид. Даже на таком тривиальном примере мы можем понять некоторые основные правила оформления программы.

1. Организация диалога с пользователем. Прежде чем записать оператор Read, вы обязаны записать хотя бы один Write, который выведет на экран приглашение "Введите ...", причем из этого приглашения пользователь должен понять, какие именно данные ему следует ввести. Так, в нашем примере операторы Write('Введите i '); Read(i); были бы неуместны, так как пользователю неизвестно, что такое i, и он мог бы ввести, например, вещественное число, что привело бы к аварийному завершению программы.

2. Оформление текста программы. Хорошо оформленная программа (чаще говорят - хорошо структурированная программа) легко читается и быстрее отлаживается, всегда следует стремиться к “прозрачности” текста, но не к некоторой вполне субъективной “красоте”; так, скажем, операторы, выполняющиеся последовательно, следует и записывать строго друг под другом, но не “елочкой” или какой-либо другой фигурой. Средства, используемые для структурирования текста, крайне просты и доступны всякому - это пробелы, пустые строки и комментарии.

При выводе чисел можно их форматировать, т.е. управлять формой их представления. Для этого в списке вывода после выводимого выражения можно указывать модификаторы: “: L : d для вещественных значений и “:L” для вещественных и целых. L и d - произвольные целочисленные выражения, первое из них определяет, сколько всего позиций отводится для выводимого числа на экране, а второе - сколько выводится цифр после десятичной точки. Если при выводе вещественного числа задан модификатор “: L : d, то оно выводится с фиксированной точкой, если же задан модификатор “: L” или он отсутствует - то с плавающей точкой. Пусть значение переменной X равно 123.45678, тогда оператор

Write(X); выведет " 1.2345678000E+02"

Write(X:8:2); выведет " 123.46"

Write(X:10:5); выведет " 1.235E+02"

Write(X:10); выведет " 1.235E+02"

Write(X:8); выведет " 1.2E+02"

Write(X:1); выведет " 1.2E+02"

По умолчанию значения выводимые оператором Write не разделяются пробелами, поэтому если вы выводите подряд несколько чисел, вам нужно позаботиться об их правильном расположении на экране. Так, оператор WRITE(1,2,3); выведет на экран “123”, чтобы вывести три отдельных числа, необходимо выполнить оператор WRITE(1, ’ ‘ , 2 , ’ ‘ , 3); или оператор WRITE(1, 2:2, 3:2);