Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

Операторы Ввода и Вывода

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

Функция - это подпрограмма, которая принимает n - ое количество переменных и возвращает только одну (при этом переменные, которые ей передаются могут меняться). То есть функции имеют вид:

a:=Function(x1,x2,x3,...,xn);

Где

a - переменная, в которую возвращается главное значение функии

x1,x2,...xn - набор переменных, необходимых подпрограмме, но основании которых подпрограмма возвращает свое главное значение (при этом все эти переменные могут иметь разные типы данных и функция может (!) изменить одно или несколько из этих значений.)

Процедура - вид подпрограммы, которая принимает n переменных, которые она может изменить при необходимости, и ничего не возвращает. То есть она имеет вид:

procedure (x1,x2,x3,...,xn);

При всем этом процедуры и функии очень похожи. Поскольку не всегда нам важен результат функции (поскольку функция, как процедура может менять значения передаваемых переменных), то его можно опустить и писать просто:

function(x1,x2,...xn);

При этом ее результат "канет в небытии".

С этими подпрограммами мы познакомимся чуть позже, а сейчас перейдем к Вводу - Выводу информации.

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

Для начала рассмотрим окно Pascal ABC.NET. Оно разделено на две части: это ввод кода программы и лог работы программы (то, что выдает программа в ходе своей работы).

 

Окно логов программы равносилно коммандной строке в операционной системы Windows, только программы, запущенные через коммандную строку, контролируются операционной системой, а программы, запущенное через Pascal, контролируются PascalABC.NET. Это упрощяет поиск ошибок в коде, поскольку PascalABC.NET отслеживает ход работы программы и, при возникновении ошибок, он предупреждает нас об этом и указывает строку с ошибкой, чего О.С. не сделает (она просто завершит вашу программу).

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

Таким образом окно вывода программы можно представить как текстовый документ, который печатаете не Вы, а Ваша программа.

В паскале есть 4 основных процедуры вывода информации, каждая из которых принимает переменное количество переменных (то есть то количество переменных, которое Вам нужно в данный момент. Она может хоть вообще ничего не принимать, хоть принимать очень большое количество переменных). Это:

writeln(params);

write(params);

print(params);

println(params);

(params означает переменное количество переменных).

Комманды Writeln и write между собой очень похожы. Каждая из них выводит на экран ровно то, что ей было передано (не добавляет ничего лишнего, при этом разделители (пробелы, запятые или что Вам нужно вам нужно ей передавать как переменные)), только отличие между ними в том, что writeln после того, как выведет на экран то, что ей передали, переставит "курсор" вывода на новую строку (иными словами после этой команды все что будет печататься после, будет печататься с новой строки. Чтобы Вам стало более понятно расмотрим коды:

 

 
begin 

 
              write('я','люблю'); 

 
              write('Pascal ABC.Net','!'); 

 
end. 

 

В результате выполнения мы получим: "ялюблюPascal ABC.NET!".

 

 
begin 

 
              writeln('Я ','люблю'); 

 
              writeln('Pascal', ' ', 'ABC.NET'); 

 
end.  
 

 

В результате будет напечатано:

"Я люблю

Pascal ABC.NET"

Теперь рассмотрим процедуры print и println. Они очень похожи на предыдущие процедуры, но их отличие в том, что между переданными им переменными они ставят разделитель - пробел автоматически, в отличие от комманды wire и writeln. Что бы Вы лучше поняли, рассмотрим пример:

 

 
begin 

 
              print('Я','люблю'); 

 
              print('Pascal', 'ABC.NET'); 

 
end. 

 

В результате будет напечатано "Я люблюPascal ABC.NET". Схожим с writeln работает процедура println. (после ввывода она ставит символ перехода на новую строку и весь далбнейший ввод-ввывод будет осуществляться с новой строки).

Теперь перейдем к вводу. Для ввода данный в Паскале есть 2 основных процедуры. Это read и readln.

read(params);

readln(params);

Они также принимают переменное количество переменных, которое нужно ввести.

Рассмотрим, как осуществляется ввод. При необходимости (как только в ходе выполнения программа встретила процедуру ввода) программа останавливает свое выполнение и начинает ждать, когда ей будут введены необходимые данные (пока пользователь что-то напечатает и нажмет на клавишу Enter). При этом все, что пользователь введет (а пользователь может набор цифр, предложений, да и вообще непонятно что (при программировании для публики это нужно учитывать (но об этом чуть позже))). После этого процедура ввода начинает анализировать введенные данные (при этом процедура обычно считает, что значения переменных разделены пробелом). Если мы дали комманду ввести несколько переменных, то программа пытается перевести в нужный тип данных соответствующее по номеру значение. Чтобы Вы лучше поняли рассмотрим пример с обьяснениями:

 

 
begin 

 
  var i:integer; 

 
  var r:real; 

 
  read(i,r); 

 
end. 

 

Предположим в консоль программы я ввел "3 3.14". Тогда процедура read считывает всю эту строку и начинает ее анализировать. Она сразу же замечает, что введено 2 значения это "3" и "3.14". (Эсли бы я ввел, например, строку "3 3.14 2015", то процедура бы выделила бы 3 значения). После этого она начинает работать с переданными ей переменными. Она определяет, что тип данных первой переменной это integer. После этого она пытается преобразовать строку "3" к типу данных integer (в случае, если бы я ввел строку "3.14 3", то программа при попытке привести строку "3.14" к целому зноковому типу выдалабы ошибку и перестала бы работать). Если у нее это получилось, то она в переменную i записывает получившееся значение. Аналогичным способом программа поступает с числом "3.14". Единственное, что она пытается его привести к числу с точкой.

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

Рассмотрим пример:

 

 
begin 

 
  var i:integer; 

 
  var r:real; 

 
  readln(i,r); 

 
end. 

 

Предположим я программе ввел значения "3 3.14" и с новой строки "Я программист". Что будет делать процедура readln. Она считает все эти две строки (Если бы я передал подпрограмме большее кол-во переменных, то было бы большее кол-во строк). И начинает анализировать каждую из этих строк. По первой переменной, переданной ей, она считает, что в первой строке должно быть целое знаковое число. А поскольку я ввел числа "3" и "3.14", то она берет только первое число "3" и пытается его привести к целому знаковому типу integer. Если ей это удалось, то она спокойно переходит к распознанию слудующей строки, забывая о том, что в этой строке еще содержиться число "3.14". Процедура о нем забывает и это число называется утерянным. В следующей строке содержится "Я программист". И процедура пытается его привести к вещественному типу real. Естественно у нее это не получиться, поэтому она просто-напросто выдаст ошибку и прекратит свою работу.

Помимо read u readln есть еще некоторые функции ввода данных это readinteger(), readreal(), readchar(), readstring(). Это все функции, которые не принимают никаких параметром.Они основаны на процедурах read u readln. Каждая из этих функций возвращает только одно значение. Следующий код паказывает, как ими правильно пользоваться:

 

 
begin 

 
  var i:integer:=readinteger(); 

 
end.