Последовательное выполнение
На предыдущей лекции мы рассмотрели такие понятии как Паскаль-машина, Паскаль-программа, рассмотрели программу 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 для данных являющимися результатами выполнения программы. Мы будем изображать 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
Программа VerticalGreeting выводит более одной строчки в OUTPUT PROGRAM VerticalGreeting(INPUT, OUTPUT); BEGIN WRITELN(‘HELLO’); WRITELN(‘THERE’) END.
Таблица выполнения для программы VerticalGreeting
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 и значение переменной 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
Ошибочная программа 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
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|