Оператор READ(Ch); изменяет состояние INPUT и переменной Ch. В переменную Ch загружается из INPUT символ в позиции курсора (‘A’) и курсор в INPUT перемещается на одну позицию.
Оператор WRITELN выводит содержимое переменной Ch (‘A’) в OUTPUT и перемещает курсор на одну позицию. После выполнения последней строки курсоры в INPUT и OUTPUT пропадают, переменная Ch уничтожается.
Результаты выполнения программы – это изменение INPUT и OUTPUT. Конечно, в INPUT нет новых данных, но OUTPUT содержит результат выполнения программы. Переменная Ch не оставила никаких следов, потому что она существует только во время выполнения программы.
Попробуем проследить несколько вариантов выполнения CopyChar с различным входными данными.
INPUT: ABC
OUTPUT: A
INPUT: A
OUTPUT: A
INPUT: XAABB
OUTPUT: X
Теперь попробуем поменять местами предложения READ и WRITELN
PROGRAM Garbage (INPUT, OUTPUT);
{Писать ничего не прочитав - ошибка}
VAR
Ch: CHAR;
BEGIN
WRITELN(Ch);
READ(Ch)
END.
INPUT: ABC
OUTPUT: ?
INPUT: A
OUTPUT: ?
INPUT: XYZ
OUTPUT: ?
Символ знака вопроса в OUTPUT означает, что результат не определен и в OUTPUT может оказаться любой символ, поскольку при выполнении оператора WRITELN значение переменной Ch еще не определено. Неопределенные данные обычно называются мусором (Garbage).
Таблица выполнения для программы Garbage
INPUT | OUTPUT | Ch | |
PROGRAM Garbage (INPUT, OUTPUT) VAR Ch: CHAR BEGIN WRITELN(Ch) READ(Ch) END. | ABC ABC ABC ABC ABC | _ _ ?/_ ?/_ ? | ? ? A |
Ошибочная программа Garbage преподает нам очень важный урок. Паскаль-программа выполняет инструкции именно в той последовательности, в которой они написаны и программист должен быть аккуратен, чтобы данные не были использованы неправильно или потеряны, как в данном случает, где мы потеряли данные в INPUT и вывели ошибочные данные в OUTPUT.
Программа CopyTwice дает нам еще один пример работы Паскаль-машины, вроде бы как она должна копировать два символа из INPUT в OUTPUT, но этого не происходит.
PROGRAM CopyTwice (INPUT, OUTPUT);
{Ошибочная попытка скопировать два символа из INPUT в OUTPUT}
VAR
Ch: CHAR;
BEGIN
READ(Ch);
READ(Ch);
WRITE(Ch);
WRITELN(Ch)
END.
INPUT: ABC
OUTPUT: BB
INPUT: XXY
OUTPUT: XX
Если построить таблицу выполнения для программы CopyTwice, мы увидим, что первый символ из INPUT считанный в переменную Ch перекрывается вторым символом, считываемым второй инструкцией READ в ту же переменную, поэтому в OUTPUT дважды выводится одно и то же значение – второй символ в INPUT.
PROGRAM Copy2 (INPUT, OUTPUT);
{Копирует первые два символа из INPUT в OUTPUT}
VAR
Letter: CHAR;
BEGIN
READ(Letter);
WRITE(Letter);
READ(Letter);
WRITELN(Letter)
END.
INPUT: ZZ
OUTPUT:ZZ
INPUT:AZURE
OUTPUT:AZ
INPUT:3.14
OUTPUT:3.
В переменной Letter размещаются различные значения в разное время, и не всегда буквы, поэтому она демонстрирует не очень удачный подход к именованию переменных.
Программы могут использовать несколько переменных.
PROGRAM CopyReversed (INPUT, OUTPUT);
{Копирует первые два символа из INPUT в OUTPUT в обратном порядке}
VAR
Ch1, Ch2: CHAR;
BEGIN
READ(Ch1, Ch2);
WRITELN(Ch2, Ch1)
END.
INPUT:ZA
OUTPUT:AZ
INPUT:AZURE
OUTPUT:ZA
Когда в операторах READ WRITE встречается более чем один элемент данных, эти предложения ведут себя как последовательность операторов READ и WRITE с одним элементом данных. Вариантов компоновки операторов WRITE и READ может быть множество.
READ(Ch1, Ch2) эквивалентно READ(Ch1); READ(Ch2)
WRITELN(Ch1, Ch2) эквивалентно WRITE(Ch1); WRITE(Ch2); WRITELN
1.3.2. Оператор присвоения.
До этого момента переменные использовались для того, чтобы сохранять данные, прочитанные из INPUT. Единственный способ использования этих данных – вывод значения переменной в OUTPUT. Значения также могут быть скопированы из одной переменной в другую. Процесс копирования также называется присвоением и записывается с помощью оператора присвоения, который имеет следующую форму:
Name1 := Name2
Name1 := ‘x’
Где Name1 и Name2 переменные типа CHAR, описанные в разделе декларативной части программы, а ‘x’ – любой символ. Специальный сдвоенный символ := называется оператором присвоения.
В первой форме оператора присвоения значение переменной справа (Name2) становится новым значением переменной слева (Name1). Выполнение присваивания никак не влияет на значение переменной Name2.
Во второй форме оператора присваивания переменной Name1присваивается значение символьного литерала ‘x’.
Оператор присвоения не определен для файлов, текст
OUTPUT := INPUT
не имеет смысла и не является оператором присвоения.
Используя оператор присвоения мы можем предложить еще один вариант программы CopyReversed
PROGRAM CopyReversedTwo (INPUT, OUTPUT);
{Копирует первые два символа из INPUT в OUTPUT в обратном порядке}
VAR
In1, In2, Out1, Out2: CHAR;
BEGIN
READ(In1, In2);
Out1 := In2;
Out2 := In1;
WRITELN(Out1, Out2)
END.
INPUT:AZURE
OUTPUT:ZA
Таблица выполнения для программы CopyReversedTwo
INPUT | OUTPUT | In1 | In2 | Out1 | Out2 | |
PROGRAM CopyReversedTwo (INPUT, OUTPUT) VAR In1, In2, Out1, Out2: CHAR BEGIN READ(In1, In2) Out1 := In2 Out2 := In1 WRITELN(Out1, Out2) END | AZURE AZURE AZURE AZURE AZURE AZURE AZURE AZURE | _ _ _ _ _ ZA/_ ZA | ? A A A A | ? Z Z Z Z | ? ? Z Z Z | ? ? ? A A |
Аннотированный вывод и эхо ввода.
Аннотированный вывод – размещение в OUTPUT текста, поясняющего выходные данные программы.
Эхо ввода – копирование введенных данных из INPUT в OUTPUT, чтобы пользователь мог дополнительно проконтролировать корректность ввода.
Использование этих двух подходов является хорошим стилем программирования, потому что позволяет упростить использование программы и сделать его более наглядным.
PROGRAM CopyAndShuffle (INPUT, OUTPUT);
{Копирует первые пять символов U, V, N, X, Y из INPUT в OUTPUT
в порядке U, X, V, Y, M}
VAR
In1, In2, In3, In4, In5: CHAR;
BEGIN
READ(In1, In2, In3, In4, In5);
WRITELN(‘INPUT DATA’);
WRITE(‘ ’);
WRITELN(In1, In2, In3, In4, In5);
WRITELN(‘SHUFFLED DATA’);
WRITE(‘ ’);
WRITELN(In1, In4, In2, In5, In3);
END.
INPUT :12345678
OUTPUT :INPUT DATA
12345
SHUFFLED DATA
14253
INPUT :BARE
OUTPUT :INPUT DATA
BARE
SHUFFLED DATA
BEA R
1.4. Условное выполнение
Выбор из двух альтернатив – одна из основных концепций в программировании. Сивольная переменная может быть сравнена с символьной переменной или символьным литералом и результаты этого сравнения могут быть использованы для того, чтобы указать Паскаль-машине выполнить один из двух преложенных операторов.
Новые идеи: предшествование (precedes), следование (succeedes), условия, оператор IF, оператор BEGIN, список операторов, пустой оператор, максимальный символ, минимальный символ.
Многие известные процедуры в жизни содержат условные инструкции. Например, если Вы набрали на вступительных экзаменах в среднем более 70 баллов, то, скорее всего вы будете учиться на ПС бесплатно, в противном случае Вам придется платить за обучение.
Ситуации с условным выполнением встречаются в большинстве программ, и включены практически во все языки программирования. Паскаль-программы также поддерживают условное выполнение - способность принимать решение о выполнении того или иного оператора в зависимости от результатов проверки.
1.4.1. Условия
Из школьной программы нам известно, что числа можно упорядочить по возрастанию или убыванию:
1 < 2 < … < 9
В Паскаль-машине алфавитные символы упорядочены, порядок задается знаком предшествования (<) и соответствует порядку, принятому в латинском алфавите. Символы в верхнем и нижнем регистре имеют разные порядковые номера.
‘A’ < ’B’ < … < ‘Z’
‘a’ < ‘b’ < … < ‘z’
Как расположены символы в верхнем и нижнем регистре относительно друг друга зависит от конкретной реализации Паскаль-машины, но, как правило, справедливо следующее:
‘A’ < ‘a’, ‘B’ < ‘b’ и т. д.
Для двух данных символьных переменных Ch1 и Ch2 мы можем построить условие в виде вопроса: предшествует ли значение переменной Ch1 значению переменной Ch2? Ответ зависит от того, какие значения принимают эти переменные.
Ch1 | Ch2 | Ch1 < Ch2 |
A | B | Yes |
B | A | No |
A | A | No |
1 | 2 | Yes |
3 | 2 | No |
Условия также могут быть построены на проверке равенства двух символов, используя знак равенства (=), как в следующей таблице.
Ch1 | Ch2 | Ch1 = Ch2 |
A | B | No |
A | A | Yes |
1 | 2 | No |
Значение знака следования (>) противоположно значению знака предшествования.
Если Ch1 > Ch2, значит Ch2 < Ch1.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


