Операторы ввода/вывода в Pascal

 

Начнем знакомство с оператора вывода. Данный оператор очень часто встречается в паскалевских программах. Оператор вывода существует в двух вариантах: write(<список выводимых значений>) и writeln(<список выводимых значений>).

Отличия одного оператора от другого заключается в том, что оператор write выводит данные и курсор оставляет после этих данных, (на той же строке, что и данные), а оператор writeln выводит данные, а курсор переносит в начало следующей строки.

 

Пример: рассмотрим программу, которая просто выводит на экран приветствие. Данную программу рассмотрим в двух вариантах: 1 вариант – вывод приветствия с использованием оператора write и 2 вариант – вывод приветствия с использованием оператора writeln.

 

1 вариант Program Pr1; Uses Crt; Begin ClrScr; {очистка экрана} Write(‘Привет’); {вывод приветствия} Readln; {задержка работы программы} End. 2 вариант Program Pr2; Uses Crt; Begin ClrScr; {очистка экрана} Writeln(‘Привет’); {вывод приветствия} Readln; {задержка работы программы} End.
Результат работы 1 – го варианта Результат работы 2 – го варианта

 

Следует отметить, что при написании программы был использован оператор ClrScr. Данный оператор очищает экран. Но чтобы использовать в программе данный оператор нужно указать в разделе Uses модуль Crt (данный модуль содержит в себе оператор ClrScr). Кроме оператора ClrScr в модуле Crt содержится множество других операторов. Среди них операторы задания цвета выводимых символов и цвета фона, на котором эти символы выводятся.

TextColor(Color : Byte); - устанавливает цвет выводимых символов. Цвет задается параметром Color. Color - целочисленное выражение в диапазоне 0 .. 15, соответствующий одной из констант цвета текстового режима, определенных в модуле Crt.

 

Константы цветов

 

Константа Числовое значение Цвет
Black Черный
Blue Синий
Green Зелёный
Cyan Циан
Red Красный
Magenta Фиолетовый
Brown Коричневый
LightGray Светло-серый
DarkGray Темно-серый
LightBlue Светло-синий
LightGreen Светло-зеленый
LightCyan Светло-циан
LightRed Светло-красный
LightMagenta Светло-фиолетовый
Yellow Желтый
White Белый

 

TextBackground(Color : Byte); - устанавливает цвет фона выводимых символов. Цвет фона задается параметром Color. Все символы, выводимые впоследствии, будут иметь цвет фона = Color.

 

Следует отметить, что в Pascal существует система предустановок используемых при определении цветов текста и фона. Это означает, что если вы хотите вывести приветствие зеленым цветом, то сначала нужно написать оператор TextColor(2); который устанавливает зеленый цвет текста, а только потом выводить приветствие оператором Write(‘Привет’); или Writeln(‘Привет’);. После установки зеленого цвета символов оператором TextColor(2); вся выводимая информация будет выводиться зеленым цветом до тех пор, пока оператором TextColor не будет установлен другой цвет. Точно также работает и оператор TextBackground.

 

При выводе данных в Pascal может быть использован и оператор GoToXY(X, Y : Integer);. Данный оператор перемещает курсор в заданную позицию экрана с координатами (X, Y). В текстовом режиме на экране помещается 80 символов по горизонтали и 25 символов по вертикали. Начало отсчета находится в левом верхнем углу экрана.

 

 

Если сравнить ширину и высоту выводимого символа, то можно заменить, что ширина в 2 раза меньше высоты.

Например, чтобы вывести приветствие зеленого цвета на синем фоне в центре экрана, нужно написать следующую программу:

 

Program Pr3;

Uses Crt;

Begin

ClrScr; {очистка экрана}

TextBackground(1); {установка синего цвета фона для выводимого текста}

TextColor(2); {установка зеленого цвета символов выводимого текста}

GoToXY(37,12); {переход примерно в середину экрана}

Write(‘Привет’); {вывод приветствия}

Readln; {задержка работы программы}

End.

 

Для демонстрации использования операторов TextBackground, TextColor, GoToXY и Write мы составим простую программу, которая выводит на экран изображение домика.

Сначала заготовим на листе бумаги сетку (удобно склеить 4 двойных листа бумаги в клеточку и разлинеить их так, чтобы получилась сетка, изображенная ниже):

 

 

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

 

После того, как картинка создана на бумаге, мы легко можем определить координаты клеток, и цвет, которым эти клетки нужно закрасить. Для установки нужного цвета будем использовать оператор TextBackGround, а для перехода в точку с нужными координатами – оператор GoToXY. Для вывода прямоугольника нужно вывести пробел. Для вывода нескольких идущих подряд по горизонтали прямоугольников – выведем столько пробелов, сколько прямоугольников. Составим данную программу.

 

Program Domik;

Uses Crt;

Begin

{Устанавливаем голубой цвет фона и очищаем экран. В результате

весь экран станет голубого цвета. Это будет небо.}

TextBackGround(3);

ClrScr;

 

{Устанавливаем зеленый цвет фона, и выводим на экран прямоугольники

зеленого цвета}

TextBackGround(2);

{Крыша домика}

GoToXY(13,7);

write(' ');

GoToXY(11,8);

write(' ');

GoToXY(9,9);

write(' ');

GoToXY(7,10);

write(' ');

GoToXY(5,11);

write(' ');

GoToXY(3,12);

write(' ');

GoToXY(17,8);

write(' ');

GoToXY(19,9);

write(' ');

GoToXY(21,10);

write(' ');

GoToXY(23,11);

write(' ');

GoToXY(25,12);

write(' ');

 

{Крона дерева}

GoToXY(48,6);

write(' ');

GoToXY(47,7);

write(' ');

GoToXY(45,8);

write(' ');

GoToXY(44,9);

write(' ');

GoToXY(43,10);

write(' ');

GoToXY(44,11);

write(' ');

GoToXY(44,12);

write(' ');

GoToXY(43,13);

write(' ');

GoToXY(42,14);

write(' ');

GoToXY(42,15);

write(' ');

GoToXY(43,16);

write(' ');

GoToXY(46,17);

write(' ');

 

{Трава}

GoToXY(1,24);

write(' ');

GoToXY(1,25);

write(' ');

 

{Устанавливаем красный цвет фона, и выводим на экран прямоугольники

красного цвета}

TextBackGround(4);

 

{Крыша домика}

GoToXY(13,8);

write(' ');

GoToXY(11,9);

write(' ');

GoToXY(9,10);

write(' ');

GoToXY(7,11);

write(' ');

GoToXY(5,12);

write(' ');

 

{Яблоки на дереве}

GoToXY(48,9);

write(' ');

GoToXY(45,12);

write(' ');

GoToXY(54,14);

write(' ');

GoToXY(47,16);

write(' ');

 

{Устанавливаем синий цвет фона, и выводим на экран прямоугольники

синего цвета}

TextBackGround(9);

 

{Домик}

GoToXY(5,13);

write(' ');

GoToXY(5,14);

write(' ');

GoToXY(5,15);

write(' ');

GoToXY(5,16);

write(' ');

GoToXY(5,17);

write(' ');

GoToXY(5,18);

write(' ');

GoToXY(5,19);

write(' ');

GoToXY(5,20);

write(' ');

GoToXY(5,21);

write(' ');

GoToXY(5,22);

write(' ');

GoToXY(5,23);

write(' ');

 

{Устанавливаем белый цвет фона, и выводим на экран окно}

TextBackGround(15);

GoToXY(11,14);

write(' ');

GoToXY(11,15);

write(' ');

GoToXY(11,16);

write(' ');

GoToXY(11,17);

write(' ');

GoToXY(11,18);

write(' ');

GoToXY(11,19);

write(' ');

 

{Устанавливаем серый цвет фона, и выводим на экран занавески на окне}

TextBackGround(7);

GoToXY(12,15);

write(' ');

GoToXY(12,16);

write(' ');

GoToXY(12,17);

write(' ');

 

{Устанавливаем желтый цвет фона, и выводим на экран свет в окне и солнышко}

TextBackGround(14);

{Свет в окошке}

GoToXY(14,15);

write(' ');

GoToXY(14,16);

write(' ');

GoToXY(13,17);

write(' ');

GoToXY(12,18);

write(' ');

 

{Солнышко}

GoToXY(70,2);

write(' ');

GoToXY(68,3);

write(' ');

GoToXY(67,4);

write(' ');

GoToXY(68,5);

write(' ');

GoToXY(70,6);

write(' ');

 

{Устанавливаем коричневый цвет и выводим ствол дерева}

TextBackGround(6);

{Свет в окошке}

GoToXY(49,18);

write(' ');

GoToXY(49,19);

write(' ');

GoToXY(49,20);

write(' ');

GoToXY(49,21);

write(' ');

GoToXY(49,22);

write(' ');

GoToXY(49,23);

write(' ');

 

readln; {задерживаем работу программы до нажатия на клавишу Enter}

End.

 

Задания для практической работы:

  1. Составить программу, которая в текстовом режиме выводит на экран изображение воздушного шара.
  2. Составить программу, которая в текстовом режиме выводит на экран изображение божьей коровки.
  3. Составить программу, которая в текстовом режиме выводит на экран изображение бабочки.
  4. Составить программу, которая в текстовом режиме выводит на экран изображение автомобиля.
  5. Составить программу, которая в текстовом режиме выводит на экран изображение корабля.
  6. Составить программу, которая в текстовом режиме выводит на экран изображение яблока.

и т.д.

 

Рассмотрим теперь операторы ввода данных read и readln. Каждый из этих операторов может содержать список переменных, в которые будут введены с клавиатуры некоторые значения. Переменные, в которые вводятся данные должны быть перечислены через запятую в скобках: read(<список переменных через запятую>) или readln(<список переменных через запятую>). Ввод данных в переменные во время работы программы осуществляется следующим образом: пользователь набирает на клавиатуре необходимые значения и нажимает клавишу Enter. После этого набранные значения будут помещены в переменные перечисленные через запятую в скобках в порядке их перечисления: первое значение – в первую по порядку переменную, второе значение – во вторую и т.д. Поясним сказанное на примере:

 

Пример:

 

readln(x); для ввода данных в переменную x нужно ввести с клавиатуры некоторое значение и нажать Enter.

 

readln(a,b,c); для ввода данных в переменные a, b и с можно поступить одним из следующих способов: 1) ввести через пробел в одну строку три значения, а потом нажать на клавишу Enter; 2) ввести одно значение, нажать Enter, после этого программа будет ожидать ввода следующего значения, поэтому нужно будет ввести следующее значение (можно вводить сразу несколько значений, но тогда их водят через пробел) и опять нажать Enter. И так до тех пор, пока не будут введены 3 значения.

 

read(y,z); оператор read не является исключением из описанного выше правила. Здесь также можно сразу ввести 2 значения через пробел или вводить их по одному, нажимая Enter для ввода каждого.

 

А теперь рассмотрим, в чем же заключается разница между операторами read и readln. Сначала попробуем рассмотреть разницу между данными операторами на примере.

 

Например, необходимо ввести значения трех переменных a, b, c, а потом значения еще двух переменных d и e. Введем эти значения с помощью оператора read

read(a,b,c);

read(d,e);

Когда будет выполнен первый оператор read, мы должны набрать на клавиатуре вводимые значения. Например, сразу наберем 5 чисел через пробел: 10 2 31 4 9. Тогда первый оператор read считает первых три числа 10 2 и 31 в переменные a, b и c, а второй оператор read дочитает оставшиеся два числа 4 и 9 в переменные d и e. Т.е. при вводе данных с использованием оператора read происходит последовательное считывание данных в соответствующие переменные, и если после считывания остались несчитанные данные (как в нашем примере после считывания трех значений 10 2 и 31 оператором read(a,b,c), остались еще два значения 4 и 9), то последующие операторы read просто дочитывают введенные данные на этой же строке.

Теперь рассмотрим как будет работать программа, если в той же ситуации вместо оператора read мы будем использовать оператор readln.

readln(a,b,c);

readln(d,e);

Когда будет выполнен первый оператор readln, мы должны набрать на клавиатуре вводимые значения. Опять сразу наберем 5 чисел через пробел: 10 2 31 4 9. Тогда первый оператор readln считает первых три числа 10 2 и 31 в переменные a, b и c, и после этого перейдет на следующую строку, игнорируя при этом оставшиеся два значения 4 и 9. И данные для второго оператора readln будут ожидаться на следующей строке. Но в самом начале мы оговорили предварительное условие: все 5 чисел набираем сразу в одной строке, а так как первый оператор readln после считывания первых трех значений перешел на новую строку, на которой нет никаких значений, то второй оператор readln будет попросту ожидать, когда пользователь введет оставшиеся два значения на новой строке и нажмет клавишу Enter.

 

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

 

Замечание. Если вы при программировании на Pascal хотите использовать оператор ввода для задержки работы программы, то корректно программа будет работать при использовании оператора readln.

 

Пример. Составим программу, которая ожидает ввода двух чисел, а после этого находит сумму этих чисел и выводит ее на экран.

 

Решение.

Составим словесный алгоритм решения данной задачи:

 

1. Вывести на экран подсказку «Введите значение переменной а:».

2. Ввести первое число в переменную a.

3. Вывести на экран подсказку «Введите значение переменной b:».

4. Ввести второе число в переменную b.

5. Вычислить c:=a+b;

6. Вывести c на экран.

7. Задержать работу программы до нажатия на клавишу Enter.

 

Из рассмотренного алгоритма следует, что в программе будут использоваться три переменные: a, b – переменные, в которые будут введены исходные числа, и c – переменная, в которую будет помещена сумма данных чисел. Перед вводом исходных значений экран желательно очистить. Несмотря на то, что команды очистки экрана нет в описанном выше словесном алгоритме, она подразумевается. В соответствии с рассмотренным выше алгоритмом и пояснениями к нему, мы получим следующую программу:

 

Program Summa;

Uses Crt;

Var a,b,c:real;

Begin

ClrScr; {Очистка экрана}

write('Введите значение переменной а: '); {Вывод подсказки}

readln(a); {Ввод значения в переменную а}

write('Введите значение переменной b: '); {Вывод подсказки}

readln(b); {Ввод значения в переменную b}

c:=a+b; {Нахождение суммы чисел а и b}

write('c=',c); {Вывод найденной суммы на экран}

readln; {Задержка работы программы до нажатия на клавишу Enter}

End.