Информационные технологии

Меню

Реклама
Похожие статьи:

Популярные записи

1

  • Буферизация екрана и клавиатуры

    Экран и клавиатура являются текстами, зв' язаними с файловыми переменными output и input. Для работы с ними также уживаются буферы.

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

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

    WriteE1, E2, . EN

    Выполняется как последовательность вызовов

    Write E1; write E2; .; write EN.

    Выполнение writeln отличается тем, что в буфер екрана добавляется Eol, и курсор переводится в следующую строку.

    Организация работы с клавиатурой намного сложнее. Символы, образованные нажатием клавиш, накапливаются в Буфере клавиатуры. Он умещает 15 символов. В этом можно убедиться, запустив программу

    Uses crt;

    Begin delay16000 End.

    При ее выполнении в течение 16 секунд нетрудно успеть нажать какую-то клавишу 16 раз и при последнем нажатии услышать звуковой сигнал комп' ютера, что свидетельствует о переповнення буфера клавиатуры. Буфер переполняется, поскольку за выполнение этой программы символы из него не переносятся во внутренний буфер. Кроме того, набранные дальше символы не отображаются на экране и вообще исчезают.

    Перенесение символов во внутренний буфер происходит за выполнение процедур чтения readln и read. Как и для других текстов, его размер 128 байтов. В этом можно убедиться, запустив программу

    Begin readln End.

    За ее выполнение комп' ютер начинает ожидать нажатий на клавиши. Каждое нажатие на клавишу кроме Enter приводит к появлению соответствующего символа в буфере клавиатуры. Этот символ сразу переносится в ее внутренний буфер и через экранный буфер без задержки отображается на экране. После того, как набрано 128 символов, следующий символ к внутреннему буферу не переносится и на экране не из' является. Зато можно услышать звуковой сигнал, который свидетельствует о переповнення внутреннего буфера.

    Нажатие на клавишу Enter ведет к появлению соответствующего символа в буфере клавиатуры и перевода курсора в новую строку екрана. Когда этот символ из' является во внутреннем буфере, строка в нем рассматривается как завершенный символом Eol.

    Завершенная строка во внутреннем буфере анализируется и за постоянными в нем вычисляются значения базовых типов и присваиваются переменным, указанным в вызове read readln. Если постоянных меньше, чем переменных в вызове, то выполнение продолжается, то есть внутренний буфер опоражнивается и начинается ожидание новых символов из клавиатуры.

    Когда в дежурной строке проанализирована последняя постоянная, текущим становится следующий за ней символ во внутреннем буфере. Выполнение процедуры read на этом заканчивается. При следующем выполнении процедуры чтения новые символы будут добавляться к содержанию внутреннего буфера, но поиск и анализ постоянных начнется от текущего символа буфера, который остался от предыдущего вызова read. Особенность процедуры readln заключается в том, что после анализа последней постоянной остальные символы во внутреннем буфере пропускаются вместе с ближайшим Eol, то есть фактически буфер смахивает.

    При вызове функции EOF анализируется внутренний буфер клавиатуры. Если он пуст, то выполнение программы останавливается к ближайшему нажатию клавиш. Тогда символы из буфера клавиатуры переносятся во внутренней к появлению Enter. При наличии символов во внутреннем буфере анализируется первый, текущий символ. Если он отвечает соединению клавиш Ctrl - Z, которым задается конец файла на клавиатуре, то из вызова eof возвращается значение True. При другом первом символе, то есть при нажатии клавиши, отличающейся от Ctrl, - Z, возвращается False.

    Пример. Пусть действует определение Var V: integer, а клавиши не нажимались к началу выполнения такого фрагмента программы :

    V:= 0;

    While Not eof Do

    Begin

    Write 'Задайте целое число'; read V

    End;

    Writeln 'V=', V :1

    При выполнении eof компьютер ожидает нажатий на клавиши. Приглашение к введению числа на экране еще не из' явилось. Если нажать Ctrl - Z и Enter, то из вызова eof возвращается False, и выполнение фрагмента заканчивается печатанием текста V=0. При нажатиях цифровых клавиш цифры отображаются на экране и накапливаются во внутреннем буфере клавиатуры. После нажатия на Enter выполнения eof заканчивается и возвращается значение False. После этого, то есть лишь после набора на клавиатуре первой постоянной ! выполняется тело цикла и появляется приглашение 'input number'.

    При выполнении read лишь анализируются символы, накопленные во внутреннем буфере за выполнение вызова eof. Если они образуют постоянную, то соответствующее значение присваивается переменной V, после чего повторяется вызов eof и тому подобное. Следовательно, Введение символов из клавиатуры в таком цикле происходит при вызовах eof, а не read! Таким образом, чтобы приглашение печаталось к началу введения первой постоянной, стоит перед циклом прибавить вызов write'input number'.

    Еще раз вернемся к применению процедуры readln вместо read. Если при выполнении приведенного цикла за дежурной постоянной после пропуска случайно набрать непустые символы, которые не задают постоянную, то они останутся во внутреннем буфере. Дальше из вызова eof вернется False, и анализ этих символов за выполнение read приведет к аварийному завершению программы. Если же вместо read записать readln, то после обработки постоянной эти символы пропускаются, потому что набираются перед Enter, и программа выполняется нормально.