Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Аннотированный вывод и эхо ввода.




 

Аннотированный вывод – размещение в 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

SHUFFLED DATA

 

INPUT:BARE

OUTPUT:INPUT DATA

BARE

SHUFFLED DATA

BEAR

 

Условное выполнение

 

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

 

Новые идеи: предшествование (precedes), следование (succeedes), условия, оператор IF, оператор BEGIN, список операторов, пустой оператор, максимальный символ, минимальный символ.

 

Многие известные процедуры в жизни содержат условные инструкции. Например, если Вы набрали на вступительных экзаменах в среднем более 70 баллов, то, скорее всего вы будете учиться на ПС бесплатно, в противном случае Вам придется платить за обучение.

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

 

Условия

 

Из школьной программы нам известно, что числа можно упорядочить по возрастанию или убыванию:

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
    Yes
    No

 

Условия также могут быть построены на проверке равенства двух символов, используя знак равенства (=), как в следующей таблице.

 

Ch1 Ch2 Ch1 = Ch2
A B No
A A Yes
    No

 

Значение знака следования (>) противоположно значению знака предшествования.

Если Ch1 > Ch2, значит Ch2 < Ch1.

 

Ch1 Ch2 Ch1 > Ch2
C D No
Z A Yes
    No

 

Предшествование или следование могут быть объединены с равенством, как в вопросе «правда ли, что Ch1 предшествует или равно Ch2»: Ch1 <= Ch2

 

Ch1 Ch2 Ch1 <= Ch2
A B Yes
B A No
A A Yes
    Yes

 

Ch1 Ch2 Ch1 >= Ch2
A B No
B A Yes
A A Yes
    Yes

 

Двойной символ <> означает неравенство, как в следующей таблице:

 

Ch1 Ch2 Ch1 <> Ch2
A A No
A B Yes
B A Yes

 

Двойные символы <=, >=, <> не содержат пробелов и не могут меняться местами. Символы =>, =< не имеют смысла в Паскале.

 

Оператор 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 A ZURE AZ U RE     AZ U RE AZ U RE AZURE ? A     A A ? Z     Z Z ? ?     Z Z  

 

Оператор IF в этой таблице отсутствует потому, что он ее выполнялся. Значения не показаны в тех строках таблицы, где они не могут быть изменены.

 

Оператор ELSE может быть пропущено в операторе IF, в таком случае он будет записываться в следующей форме:

 

IF условие

THEN

оператор THEN

 

В данном случае, если условие в выражении IF не выполняется, Паскаль-машина ничего не делает. Программа MaxTwo выполняет ту же работу что и программа MaxChar, но с использованием оператора IF без выражения ELSE.

 

PROGRAM MaxChar (INPUT, OUTPUT);

{Копирует наибольший из первых двух символов из INPUT в OUTPUT}

VAR

Ch1, Ch2: CHAR;

BEGIN

READ(Ch1, Ch2);

WRITELN(‘MAX OF ’, Ch1, ‘, ‘, Ch2, ‘ IS ‘);

IF Ch1 < Ch2

THEN

Ch1:= Ch2;

ELSE

Max:= Ch2;

WRITELN(Ch1, ‘.’);

END.

 

INPUT: AZURE

OUTPUT: MAX OF A, Z IS Z.

 

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

 

Список операторов внутри оператора 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

 

Циклическое выполнение

 

Компьютерным программам необходимо циклически повторять выполнение операторов. Повторение выполнения управляется условием, которое должно выполняться для продолжения цикла.

 

Новые идеи: циклы (итерации), оператор WHILE, оператор DO, прекращение выполнения, символ конца данных, бесконечное выполнение.

 

Одним из основных преимуществ компьютерных вычислений является способность повторять простые операции много раз с большой скоростью. Повторения также называются итерациями. Как правило, итерации используются тогда, когда нужно обработать некоторое количество, возможно большое однотипных объектов данных. Например, выполнить начисление зарплаты 200 000 сотрудников или рассчитать орбиту спутника в 1 000 000 шагов.

Компьютеры способны выполнять миллионы операторов в секунду, человек трудно писать операторы с такой скоростью, поэтому было изобретены циклы, где оператор будучи записан один раз выполняется многократно.

 

Оператор 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 A BC# A B C#     AB C #   ABC # ABC#_ ABC# _     A_   AB_   ABC_   ABC/_ ABC ? A     B   C     #

 

Бесконечное выполнение

 

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

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...