Н.П. Трифонов, В.Н. Пильщиков - Задания практикума на ЭВМ (972293), страница 5
Текст из файла (страница 5)
Поэтому при использовании этого сценария необходимо заранее продумать реакцию системы на подобные ситуации.4.3. ЛИТЕРАТУРА[1]. Абрамов В.Г., Трифонов Н.П., Трифонова Г.Н. Введение в язык Паскаль. — М.:Наука, 1988.[2]. Епанешников А.М., Епанешников В.А. ПрограммированиеPascal 7.0 — М.: «ДИАЛОГ-МИФИ», 2000.18всредеTurboМетодическое пособие4.4. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИМодули CRT и CRT1Для реализации подсистемы интерфейса следует использовать возможности, которыепредоставляют стандартный модуль CRT системы программирования Турбо Паскаль7.0 и модуль CRT1, специально созданный для данного задания (ниже процедуры ифункции из модуля CRT1 помечены звездочкой).
Для того чтобы можно было воспользоваться процедурами, константами и т.п. из этих модулей, следует в начале текстапрограммы сразу за ее заголовком поместить строкуuses crt, crt1;Работа с окнами и цветомОкном называется прямоугольный участок экрана. Установка окна (с помощью процедуры window) не вызывает никаких изменений на экране, но означает, что все последующие действия с экраном ведутся только в рамках окна, как будто бы и нет инойчасти экрана.
В частности, все координаты позиций отсчитываются от левого верхнегоугла окна; исключение составляет обращение к процедуре window, координаты для которой всегда задаются как абсолютные, т.е. отсчитываются от верхнего левого угла экрана. В начале работы программы текущим окном является весь экран.Координаты позиций на экране (в текущем окне) задаются парой (x, y), где x означаетномер колонки экрана (окна), а y — номер строки. Отсчет координат ведется от левоговерхнего угла экрана (окна), который имеет координаты (1,1). Правый нижний уголвсего экрана имеет координаты (80,25).При высвечивании любого символа на экране используются два цвета: фоновый цвет,которым закрашивается тот участок экрана, где показывается символ, и передний цвет,которым высвечивается сам символ.
Все допустимые цвета (их всего 16) нумеруютсяцелыми числами от 0 до 15. При этом передний цвет может быть любым, а фоновыйцвет должен иметь номер от 0 до 7. Для более наглядного обозначения цветов в модулеCRT описаны следующие константы:black=0;{черный}darkgray=8;{темно-серый}blue=1;{синий}lightblue=9;{светло-синий}green=2;{зеленый}lightgreen=10;{салатовый}cyan=3;{сине-зеленый}lightcyan=11;{голубой}red=4;{красный}lightred=12;{светло-красный}magenta=5;{малиновый}lightmagenta=13; {светло-малиновый}brown=6;{коричневый}yellow=14;{желтый}white=15;{белый}lightgray=7; {серый}Рекомендуется использовать эти названия вместо числовых кодов цветов; например,вместо textcolor(14) лучше писать textcolor(yellow).Для работы с окнами и цветом в модулях CRT и CRT1 имеются следующие процедуры(тип byte обозначает целые числа от 0 до 255):textmode(3)процедура при фактическом параметре 3 устанавливает цветной текстовый режимработы с экраном из 80 колонок и 25 строк; с обращения к этой процедуре надоначинать работу подсистемы интерфейса;19Трифонов Н.П., Пильщиков В.Н.
Практикум на ЭВМwindow(x1,y1,x2,y2:byte)процедура объявляет прямоугольную часть экрана с левым верхним углом в точке(x1, y1) и правым нижним углом в точке (x2, y2) текущим окном; все координатыздесь — абсолютные, т.е. отсчитываются от левого верхнего угла всего экрана;windcoord(var x1,y1,x2,y2:byte)процедура присваивает своим параметрам (абсолют-ные) координаты текущегоокна;textcolor(fc:byte)процедура делает цвет с номером fc (от 0 до 15) цветом символов (передним цветом) для всех последующих выдач на экран, осуществляемых стандартной процедурой вывода write;textbackground(bc:byte)процедура делает цвет с номером bc (от 0 до 7) фоновым цветом для всех последующих выдач на экран, осуществляемых процедурой вывода write;getcolors(var fc,bc:byte)процедура присваивает параметрам fc и bc номера текущих переднего и фоновогоцветов, соответственно;clrscrпроцедура очищает текущее окно (записывает во все его позиции пробелы), закрашивая его текущим фоновым цветом.Работа с курсоромКурсор всегда показывает позицию на экране, в которую будет помещен очереднойсимвол, вводимый с клавиатуры стандартной процедурой ввода read или выводимыйстандартной процедурой вывода write.Для работы с курсором полезны следующие процедуры из модулей CRT и CRT1:gotoxy(x,y:byte)процедура перемещает курсор в позицию (x, y) текущего окна;wherexy(var x,y:byte)процедура присваивает своим параметрам координаты текущей позиции курсора;crsoffпроцедура делает курсор невидимым на экране;crsonпроцедура восстанавливает видимость курсора;Непосредственный доступ к экрануВывод на экран можно осуществлять без обращения к стандартной процедуре выводаwrite.
В этом случае используется тот факт, что информация, отображаемая на экране,хранится в специальном месте оперативной памяти, называемом видеопамятью. Каждую секунду видеопамять многократно просматривается и ее содержимое отображаетсяна экране, поэтому любая запись в нее означает вывод на экран.
Чтение же из ячеек ви20Методическое пособиедеопамяти позволяет узнать текущее содержимое экрана. (Замечание: в этих операцияхположение курсора не учитывается и не меняется.)Каждый элемент видеопамяти состоит из двух байтов: один — это кода символа, который сейчас высвечивается в соответствующей позиции экрана, а другой — так называемый цветовой атрибут, указывающий фоновый и передний цвета, которые используются при высвечивании символа в этой позиции экрана, и признак «мерцания» символа.
Более точно, цветовой атрибут — это величина fc + 16 bc + 128 blink, где fc — номер переднего цвета, bc — номер фонового цвета, а blink равен 1, если символ долженмерцать на экране, и равен 0 в противном случае. Например, атрибут «белый символ насинем фоне, без мерцания» задается так: white + 16 blue (или 15+16*1).Для работы с видеопамятью в модуле CRT1 имеются следующие процедуры и функции:putch(x,y:byte; c:char)процедура записывает символ c в позицию (x, y) текущего окна, не меняя цветовой атрибут в этой позиции;putattr(x,y:byte; a:byte)процедура меняет цветовой атрибут позиции (x, y) текущего окна на новое значение a, не меняя сам символ в этой позицииgetch(x,y:byte):charзначением функции является символ, высвечиваемый в данный момент в позиции(x, y) текущего окнаgetattr(x,y:byte):byteзначением функции является цветовой атрибут позиции (x, y) текущего окнаВвод с клавиатуры «без эха»Использовать в задании для ввода длин и элементов (дат) сортируемых последовательностей стандартную паскалевскую процедуру read нельзя: она не учитывает границыполя ввода, трактует даты как неправильные числа и т.д.
Поэтому ввод длины и дат (свозможностью редактирования вводимой информации) необходимо реализовать иначе,используя так называемый ввод «без эха».Когда на клавиатуре нажимается клавиша (вводится символ), то данный символ автоматически не высвечивается на экране — это дополнительное действие, которое можетбыть выполнено, а может быть и не выполнено. В связи с этим различаются два видаввода — «с эхом», когда введенный символ тут же высвечивается на экране (именнотак работает процедура read, которая сама и высвечивает символ), и «без эха», когдасимвол не высвечивается. Во втором случае вопрос о том, высвечивать символ или нет,а если высвечивать, то в какой позиции экрана, должен решаться дополнительно. Например, если нажата управляющая клавиша (типа Enter или ←), то на экране обычноничего не высвечивается, а если нажата клавиша с обычным символом, то этот символ,как правило, надо выводить на экран.
Такое отделение операции ввода от операции вывода на экран позволяет запрограммировать свой редактор ввода, который «в темную»вводит символ за символом и определяет, что делать с каждым из них.Для ввода «без эха» можно использовать следующую процедуру из модуля CRT1:inkey(var c:char; var spec:boolean)21Трифонов Н.П., Пильщиков В.Н. Практикум на ЭВМпроцедура вводит «без эха» символ первой из клавиш, нажатых на клавиатуре, иприсваивает его параметру c (если никакая клавиша еще не была нажата, процедура ждет нажатия первой же клавиши); при нажатии клавиши с обычным символом параметру spec присваивается значение false, при нажатии управляющей клавиши — значение trueЗамечание.
Количество символов, которые можно ввести с клавиатуры (с учетомуправляющих клавиш и комбинаций типа Ctrl+Shift), столь велико, что для них нехватает имеющихся 256 кодов. Поэтому все эти символы разделены на две группы, в одну из которых включены обычные символы (буквы, цифры, знаки операций и т.п.), а в другую — управляющие символы (и их комбинации). При этом вкаждой группе символы имеют одни и те же коды — от 0 до 255 (например, код83 имеет и буква 'S', и клавиша Del), поэтому знание только кода еще не определяет символ. Именно из-за этого процедура inkey и сообщает через свой параметрspec, символ из какой группы был введен.Ниже приведены (десятичные) коды некоторых управляющих символов, выдаваемые процедурой inkey:↑72↓80←→7Enter13Del83Backspace 8Ins82Esc27Tab9HomeEnd79F159F260...F10687571Рекомендуется ввести в программе константы с подходящими именами, например:constEnter = #13;Left= #75;EndKey = #79;F3= #61;...и уже ими пользоваться.Другие процедуры модуля CTR1В модуле CRT1 имеются также следующие две процедуры без параметров:waitожидать нажатия на клавиатуре любой клавиши (введенный символ «глотается»)bellподача звукового сигналаРабота с полями и окнамиНа основе процедур и функций из модулей CRT и CTR1 рекомендуется реализовать более крупные операции для работы с экраном.