Оператор 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