Ch1 | Ch2 | Ch1 > Ch2 |
C | D | No |
Z | A | Yes |
9 | 0 | No |
Предшествование или следование могут быть объединены с равенством, как в вопросе «правда ли, что Ch1 предшествует или равно Ch2»: Ch1 <= Ch2
Ch1 | Ch2 | Ch1 <= Ch2 |
A | B | Yes |
B | A | No |
A | A | Yes |
1 | 1 | Yes |
Ch1 | Ch2 | Ch1 >= Ch2 |
A | B | No |
B | A | Yes |
A | A | Yes |
1 | 1 | Yes |
Двойной символ <> означает неравенство, как в следующей таблице:
Ch1 | Ch2 | Ch1 <> Ch2 |
A | A | No |
A | B | Yes |
B | A | Yes |
Двойные символы <=, >=, <> не содержат пробелов и не могут меняться местами. Символы =>, =< не имеют смысла в Паскале.
1.4.2. Оператор IF
Условное выполнение задается с помощью оператора IF – выражения со стандартными словами IF, THEN, ELSE в следующей форме:
IF условие
THEN
оператор THEN
ELSE
оператор ELSE
Где оператор THEN и оператор ELSE – операторы языка Паскаль, например, оператор присваивания. Если условие выполняется, тогда Паскаль-машина выполняет оператор THEN, в противном случае - оператор ELSE.
Как правило, оператор IF записывается в вышеприведенной форме, IF, THEN и ELSE на отдельных строках, оператор THEN и оператор ELSE сдвинуты на два символа для лучшей читаемости программы.
PROGRAM MaxChar (INPUT, OUTPUT);
{Копирует наибольший из первых двух символов из INPUT в OUTPUT}
VAR
Ch1, Ch2, Max: CHAR;
BEGIN
READ(Ch1, Ch2);
IF Ch1 > Ch2
THEN
Max := Ch1;
ELSE
Max := Ch2;
WRITELN(‘MAX OF ’, Ch1, ‘, ‘, Ch2, ‘ IS ‘, Max, ‘.’);
END.
INPUT : AZURE
OUTPUT : MAX OF A, Z IS Z.
INPUT : 1234
OUTPUT : MAX OF 1, 2 IS 2.
INPUT : 77
OUTPUT : MAX OF 7, 7 IS 7.
Вышеприведенная программа также демонстрирует нам эхо ввода и аннотированный вывод.
Частичная таблица выполнения для программы MaxChar
Условие | INPUT | Ch1 | Ch2 | Max | |
BEGIN READ(Ch1, Ch2) IF Ch1 > Ch2 ELSE Max := Ch2 WRITELN(Max) END | No | AZURE AZURE AZURE AZURE AZURE | ? A A A | ? Z Z Z | ? ? Z Z |
Оператор IF в этой таблице отсутствует потому, что он ее выполнялся. Значения не показаны в тех строках таблицы, где они не могут быть изменены.
Оператор ELSE может быть пропущено в операторе IF, в таком случае он будет записываться в следующей форме:
IF условие
THEN
оператор THEN
В данном случае, если условие в выражении IF не выполняется, Паскаль-машина ничего не делает. Программа MaxTwo выполняет ту же работу что и программа MaxChar, но с использованием оператора IF без выражения ELSE.
PROGRAM MaxTwo (INPUT, OUTPUT);
{Копирует наибольший из первых двух символов из INPUT в OUTPUT}
VAR
Ch1, Ch2: CHAR;
BEGIN
READ(Ch1, Ch2);
WRITE(‘MAX OF ’, Ch1, ‘, ‘, Ch2, ‘ IS ‘);
IF Ch1 < Ch2
THEN
Ch1 := Ch2;
WRITELN(Ch1, ‘.’);
END.
INPUT : AZURE
OUTPUT : MAX OF A, Z IS Z.
1.4.3. Оператор BEGIN
В операторе IF выражение THEN и выражение ELSE могут быть расширены при использовании оператора BEGIN, который задает последовательность операторов заключенных между стандартными словами BEGIN и END и разделенными точкой с запятой. Внутри стандартных слов BEGIN и END могут встречаться любые операторы, в том числе – операторы BEGIN.
В условном операторе оператор BEGIN либо выполняется полностью, либо не выполняется вообще, в зависимости от результатов проверки условия.
PROGRAM MaxMin (INPUT, OUTPUT);
{Копирует из INPUT в OUTPUT наибольший из
первых двух символов, затем - наименьший}
VAR
Ch1, Ch2: CHAR;
BEGIN
READ(Ch1, Ch2);
WRITELN(‘MAX OF ’, Ch1, ‘, ‘, Ch2);
IF Ch1 > Ch2
THEN
BEGIN
WRITELN(Ch1);
WRITELN(Ch2)
END
ELSE
BEGIN
WRITELN(Ch2);
WRITELN(Ch1)
END
END.
INPUT : AZURE
OUTPUT : MAX OF A, Z
Z
A
INPUT : 1234
OUTPUT : MAX OF 1, 2
2
1
Список операторов внутри оператора BEGIN может быть пустым. В таком случаем говорят, что внутри оператора BEGIN присутствует пустой оператор. Пустой оператор ситуация довольно часто встречается в Паскаль-программах.
Если рассмотреть внимательно следующий фрагмент кода
BEGIN
Ch1 := Ch2;
END
Оператор присваивания заканчивается точкой с запятой, которая является разделителем. Следовательно, в операторе BEGIN два оператора: оператор присваивания и пустой оператор после точки с запятой.
В примере ниже выражение THEN содержит пустой оператор
IF Ch1 < Ch2
THEN
ELSE
Ch1 := Ch2
Внутри выражения THEN или выражения ELSE может быть использован оператор IF. В случае вложенности операторов IF Паскаль-машина ассоциирует выражение ELSE c ближайшим оператором IF.
PROGRAM Max3 (INPUT, OUTPUT);
{Копирует из INPUT в OUTPUT наибольший из
первых трех символов}
VAR
Ch1, Ch2, Ch3: CHAR;
BEGIN
READ(Ch1, Ch2, Ch3);
WRITELN(‘MAX OF ’, Ch1, ‘, ‘, Ch2, ‘, ‘, Ch3, ‘ IS ‘);
IF Ch1 > Ch2
THEN
IF Ch1 > Ch3
THEN
WRITE(Ch1)
ELSE
WRITE(Ch3)
ELSE
IF Ch2 > Ch3
THEN
WRITE(Ch2)
ELSE
WRITE(Ch3)
WRITELN(‘.’)
END.
INPUT : AZURE
OUTPUT : MAX OF A, Z, U IS Z
INPUT : 1234
OUTPUT : MAX OF 1, 2, 3 IS 3
1.5. Циклическое выполнение
Компьютерным программам необходимо циклически повторять выполнение операторов. Повторение выполнения управляется условием, которое должно выполняться для продолжения цикла.
Новые идеи: циклы (итерации), оператор WHILE, оператор DO, прекращение выполнения, символ конца данных, бесконечное выполнение.
Одним из основных преимуществ компьютерных вычислений является способность повторять простые операции много раз с большой скоростью. Повторения также называются итерациями. Как правило, итерации используются тогда, когда нужно обработать некоторое количество, возможно большое однотипных объектов данных. Например, выполнить начисление зарплаты 200 000 сотрудников или рассчитать орбиту спутника в 1 000 000 шагов.
Компьютеры способны выполнять миллионы операторов в секунду, человек трудно писать операторы с такой скоростью, поэтому было изобретены циклы, где оператор будучи записан один раз выполняется многократно.
1.5.1 Оператор WHILE
Циклическое выполнение задается с помощью оператора WHILE – выражения со стандартными словами WHILE и DO в следующей форме:
WHILE условие
DO
оператор DO
Если условие выполняется, Паскаль-машина выполняет оператор DO , после чего выполнение всего выражения WHILE повторяется до тех пор, пока выполняется условие.
Как правило, оператор WHILE записывается в вышеприведенном стиле, WHILE и DO на отдельных строках, оператор DO сдвинут вправо на два пробела. Это стандартный стиль написания программ, который облегчает их чтение.
Программа Copy использует оператор WHILE для любого количества символов из INPUT в OUTPUT. Символ # используется как маркер конца входных данных для остановки процесса копирования.
PROGRAM Copy (INPUT, OUTPUT);
{Копирует все символы, предшествующие #
из INPUT в OUTPUT}
VAR
Ch: CHAR;
BEGIN
READ(Ch);
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(Ch);
READ(Ch)
END;
WRITELN
END.
INPUT : ABC#
OUTPUT : ABC
INPUT : Red#AZURE
OUTPUT : Red
Второй вариант выполнения программы показывает, что любые данные следующие за символом # не будут выведены в OUTPUT. Следовательно, маркер конца данных не может быть использован как данные.
Часть выполнения программы Copy для входных данных ABC# показана в таблице выполнения ниже. Значения не показаны в тех строках таблицы, где они не могут быть изменены.
Частичная таблица выполнения для программы Copy
Условие | INPUT | OUTPUT | Ch | |
BEGIN READ(Ch) WHILE Ch <> ‘#’ DO BEGIN WRITE(Ch) READ(Ch) END WHILE Ch <> ‘#’ DO BEGIN WRITE(Ch) READ(Ch) END WHILE Ch <> ‘#’ DO BEGIN WRITE(Ch) READ(Ch) END WHILE Ch <> ‘#’ WRITELN END. | Yes Yes Yes No | ABC# ABC# ABC# ABC# ABC#_ ABC# | _ A_ AB_ ABC_ ABC/_ ABC | ? A B C # |
1.5.2. Бесконечное выполнение
Оператор WHILE может войти в бесконечное выполнение если он написан неправильно. Например, если будет пропущен оператор READ в программе Copy.
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(Ch)
END
Таким образом, условие в предложении WHILE должно контролировать выполнение и гарантировать завершение цикла.
1.5.3. Программы MaxOfAll и CopyOdds
Программа MaxOfAll определяет максимальный символ в INPUT предшествующий #. Предложение IF выводит в OUTPUT различные сообщения в зависимости от того, обнаружены ли там какие-либо данные. Значение переменной Max – найденный на текущий момент максимум. Концепция сохранения результата проверок в той переменной, которой выполняется сравнение, часто используется в программах. Когда выполнение оператора WHILE завершится, в переменной Max будет находиться максимальное из прочитанных значений.
PROGRAM MaxOfAll (INPUT, OUTPUT);
{Считывает символы, предшествующие #
из INPUT, наибольший выводится в OUTPUT}
VAR
Ch, Max: CHAR;
BEGIN
READ(Ch);
IF Ch = ‘#’
THEN
WRITELN(‘NO DATA’);
ELSE
BEGIN
WRITE(‘INPUT DATA IS ’);
Max := Ch;
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(Ch);
IF Ch > Max
THEN
Max := Ch;
READ(Ch)
END;
WRITELN;
WRITELN(‘MAX OF ALL IS ’, Max);
END
END.
INPUT : AZURE#
OUTPUT : INPUT DATA IZ AZURE
: MAX OF ALL IS Z
INPUT : A#
OUTPUT : INPUT DATA IZ A
: MAX OF ALL IS A
INPUT : #AZURE
OUTPUT : NO DATA
Программа CopyOdds копирует символы из INPUT в OUTPUT через один. Программа использует переменную Next для того, чтобы отслеживать четность/нечетность очередного прочитанного символа.
Поскольку эта программа сложнее предыдущих, комментарии в ней встречаются чаще.
PROGRAM CopyOdds (INPUT, OUTPUT);
{Копирует через один символы, предшествующие #
из INPUT в OUTPUT}
VAR
Ch, Next: CHAR;
{Next – преключатель между нечетными (Odd-‘O’)
и четными (Even-‘E’)}
BEGIN
Next := ‘O’
READ(Ch);
WHILE Ch <> ‘#’
DO
BEGIN
IF Next = ‘O’
THEN {Копирование нечетных символов}
WRITE(Ch);
READ(Ch);
{Переключение Next}
IF Next = ‘O’
THEN
Next := ‘E’ {Even}
ELSE
Next := ‘O’
END;
WRITELN
END.
INPUT : AZURE#
OUTPUT : AUE
INPUT : A#BC
OUTPUT : A
INPUT : 123456789#
OUTPUT : 13579
INPUT : SEE CAR EAT#
OUTPUT : SECRET
Рассмотрим второй оператор IF внутри оператора WHILE
IF Next = ‘O’
THEN
Next := ‘E’ {Even}
ELSE
Next := ‘O’
Next может принимать только значения ‘O’ или ‘E’. Если текущее значение ‘O’ значением становится ‘E’, если текущее значение ‘E’ значением становится ‘O’. Таким образом, данный оператор IF заставляет работать переменную Next как переключатель ‘O’/’E’ (“flip-flop”).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


