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

Последовательное выполнение





 

На предыдущей лекции мы рассмотрели такие понятии как Паскаль-машина, Паскаль-программа, рассмотрели программу PrintHello и начали рассматривать последовательное выполнение Паскаль-программ.

 

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

 

Новые идеи: оператор WRITE, таблица выполнения, продолжение печати на той же строке, новые строки, печать псевдографики.

 

На прошлом занятии мы рассмотрели программу PrintHello. Сегодня Вам предлагается ее модифицированная версия PrintHelloTwo

 

PROGRAM PrintHelloTwo(INPUT, OUTPUT);

BEGIN

WRITE(‘HE’);

WRITE(‘L’);

WRITELN(‘LO’)

END.

 

Данная программа демонстрирует последовательное выполнение, он выводит слово ‘HELLO’ по один-два символа. В программе встречается новое стандартное слово WRITE, с помощью которого задаются операторы WRITE. Оператор WRITE выводит данные в OUTPUT, но не закрывает строку текста, тогда как оператор WRITELN, рассмотренный нами на предыдущей лекции, выводит данные с закрытием строки, после предложения WRITELN данные будут выводиться на новой строке.

Шаги выполнения программы разделены точкой с запятой, этого достаточно, но мы разместили каждый оператор на отдельной строке для читаемости. Стандартные слова BEGIN и END не отделяются точкой с запятой от предложений заключенных внутри.

 

Опробуем определить OUTPUT для различных точек в последовательности выполнения программы:

WRITE(‘HE’);

OUTPUT: HE

WRITE(‘L’);

OUTPUT: HEL

WRITELN(‘LO’)

OUTPUT: HELLO

 

Одним иp способов описания последовательного выполнения программы является таблица выполнения, построим ее для программы PrintHelloTwo

В таблице показаны строки программы, поэтому мы не пишем разделители.

 

  OUTPUT
PROGRAM PrintHelloTwo(INPUT, OUTPUT) BEGIN WRITE(‘HE’) WRITE(‘L’) WRITELN(‘LO’) END. _ _ HE_ HEL_ HELLO/_ HELLO

 

После выполнения первой строчки программы создается OUTPUT для данных являющимися результатами выполнения программы. Мы будем изображать OUTPUT как строку символов, заканчивающуюся символом курсора, указывающего место, где будет напечатан следующий символ.



· В начале выполнения OUTPUT пуст, курсор в начале строки.

· Вторая строка со словом BEGIN не изменяет OUTPUT, как мы уже говорили, оператор BEGIN служит для задания границ выполнения.

· Третья строка с помощью оператора WRITE выводит символы ‘HE’ в OUTPUT в позицию курсора и сдвигает курсор на две позиции.

· Четвертая строка выводит в OUTPUT ‘L’ и сдвигает курсор на одну позицию.

· Аналогично, пятая строка выводит в OUTPUT ‘LO’ и закрывает строку и передвигает курсор. Закрытие строки мы показываем с помощью символа / - так будет изображаться в таблице выполнения маркер конца строки. Маркер конца строки – невидимый символ, результатом вывода которого в OUTPUT является появление новой строки.

· Последняя строка программы, слово END, прекращает выполнение программы и возможность вывода данных в OUTPUT. Курсор и маркер конца строки пропадают, в OUTPUT остается строка HELLO как результат выполнения программы.

Мы можем поместить другие строки внутри предложений WRITE и WRITELN и, соответственно, получим другой OUTPUT

 

PROGRAM PrintGreeting(INPUT, OUTPUT);

BEGIN

WRITE(‘HELLO’);

WRITE(‘ ’);

WRITELN(‘THERE’)

END.

 

OUTPUT: HELLO THERE

 

Кому-то может показаться странным, но пробел является таким же символом как, например ‘L’ и он может быть напечатан в OUTPUT. Построим таблицу выполнения для программы PrintGreeting

 

  OUTPUT
PROGRAM PrintGreeting(INPUT, OUTPUT); BEGIN WRITE(‘HELLO’); WRITE(‘ ’); WRITELN(‘THERE’) END. _ _ HELLO_ HELLLO _ HELLO THERE/_ HELLO THERE

 

Программа VerticalGreeting выводит более одной строчки в OUTPUT

PROGRAM VerticalGreeting(INPUT, OUTPUT);

BEGIN

WRITELN(‘HELLO’);

WRITELN(‘THERE’)

END.

 

Таблица выполнения для программы VerticalGreeting

  OUTPUT
PROGRAM VerticalGreeting(INPUT, OUTPUT) BEGIN WRITELN(‘HELLO’) WRITELN(‘THERE’) END   _ _ HELLO/_ HELLO/THERE/_ HELLO THERE

 

OUTPUT в данном случае имеет два маркера конца строки, поскольку оператор WRITELN переводит курсор в начало новой строки, и он был использован дважды. После первого оператора WRITELN нет никакой возможности произвести вывод данных на первую строку, где напечатано HELLO.

 

Оператор WRITELN может быть использован без данных для того чтобы закрыть строку в OUTPUT. Таким образом с помощью оператора WRITELN мы можем разметить данные в OUTPUT на нескольких строках.

 

Символьные данные

 

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

 

Новые идеи: оператор READ, VAR, символьные переменные, идентификаторы, декларативная часть, INPUT, оператор присваивания, оператор присваивания, символьные литералы, комментарии, аннотированный вывод, эхо ввода.

 

Переменная с символьным значением может быть описана в декларативной части программы. Декларативная часть программы – начинается заголовком, который содержит стандартное слово VAR (VARiables). Далее следуют описания переменных, которые состоят из идентификаторов и стандартного слова CHAR, которое описывает тип данных переменной. Точка с запятой отделяет декларативную часть от предложения BEGIN.

 

Например:

 

VAR

Ch:CHAR;

 

Описывает декларативную часть где идентификатор Ch. Ch – переменная, CHAR – ее тип данных, в данном случае символьный. Обычно говорят, что в декларативной части мы описали переменную Ch типа CHAR.

 

Рассмотрим программу CopyChar

 

Вторая строка программы заключена в фигурные скобки. Это комментарий, он никак не влияет на выполнение программы Паскаль-машиной. Обычно в комментариях располагается информация, необходимая для понимания программы, например, другими программистами.

Наличие грамотных комментариев в программе является элементом хорошего стиля программирования.

 

PROGRAM CopyChar (INPUT, OUTPUT);

{Выводит первый символ из INPUT в OUTPUT}

VAR

Ch: CHAR;

BEGIN

READ(Ch);

WRITELN(Ch)

END.

 

INPUT: ABC

OUTPUT: A

 

В символьную переменную Ch могут быть загружены данные размером в один символ, не более. В программе CopyChar используется оператор READ, который загружает данные из INPUT в переменную Ch. Другими словами, в предложении READ переменной Ch присваивается значение первого доступного символа в INPUT.

Следующее далее оператор WRITELN помещает значение переменной Ch в OUTPUT. Как мы видим, оператор WRITELN способен выводить значение переменных в OUTPUT. В предыдущих примерах оператор WRITELN выводил символьные строки, заметьте, что Ch не заключено в апострофы.

 

Таблица выполнения для программы CopyChar

 

  INPUT OUTPUT Ch
  PROGRAM CopyChar (INPUT, OUTPUT) VAR Ch: CHAR BEGIN READ(Ch) WRITELN(Ch) END.   ABC ABC   ABC   ABC ABC   _   _   _ A/_ A   ?   A A

 

Таблица имеет новые столбцы, показывающие данные в INPUT и значение переменной Ch.

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

Переменная Ch не существует до выполнения третьей строки программы, содержащей объявление переменной Ch. После выполнения третьей строчки программы переменная Ch создается, но ее значение неопределенно, там может быть любое символьное значение, поэтому мы обозначим его знаком вопроса. Почему так происходит, мы поговорим позднее. Это не означает, что Ch принимает значение '?', мы используем знак вопроса как специальный символ аналогично специальному символу / для маркера конца строки.

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

 

Оператор присвоения.

 

До этого момента переменные использовались для того, чтобы сохранять данные, прочитанные из 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  

 





Рекомендуемые страницы:

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



©2015- 2021 megalektsii.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.