Основы программирования (947332), страница 44
Текст из файла (страница 44)
Процедура ClrScr - очищает окно, выводя в него пробелы с текущиматрибутом. После этого курсор устанавливается в верхний левый угол окна.Если окно не установлено, то очищается весь экран. Эту процедуру обычноиспользуют после определения окна и атрибута его символов, чтобы обозначить окно на экране.5. Функция WltereX:word - возвращает координату х текущего положения курсора в окне.6. Функция WhereY:word - возвращает координату у текущего положения курсора в окне.7. Процедура GotoXY(x,y:word) - перемещает курсор на знакоместо с координатами X и у.Модуль ctr содержит также процедуры, работающие с текущей строкой(строкой, в которой стоит курсор).8.
Процедура DelLine - удаляет текущую строку.9. Процедура InsLine - вставляет строку, сдвигая остальные строкивниз.10. Процедура ClrEol - стирает часть строки справа от курсора.Пример 8.1. Разработать программу вычисления среднего арифметического заданного количества чисел п, где п<10. Реализовать оконный интерфейс, представленный на рис. 8.3.Верхнее окно интерфейса не зависит от исходных данных. Его нужноопределить, задать цвета символов и фона, очистить и вывести в него текст.Ввод ответа пользователя будет выполняться с того места, где окажется курсор.
Количество окон для ввода чисел зависит от введенного значения. Ихположение на экране необходимо рассчитать.2588. Управление техническими средствами и взаимодействие с MS DOSВведите количество чисел:51 '*'25!.57-483469- . ^:' ^^ - :-!-J'' ..' ', U.•'',,. s-s^^ir.jСреднее арифметическое =27.2,. ,',<**''Рис. 8.3. Интерфейс программы вычисления среднегоарифметическогоНижнее окно также не зависит от исходных данных. Его нужно определить и вьюести в него результат. Ниже представлена соответствующая программа с комментариями.Program ex;Uses Crt;Var a:array[L JO] of integer;XyClx,nJ:integer; s:real;BeginClrScr;{очищаем экран}Window(20,3,50,5); {вьзделяем окно ввода количества чисел}TexiAitr:=16+7; {определяем светло-серые символы на синем фоне}ClrScr;{вьщеляем окно ввода}GotoXY(2,2);{устанавливаем курсор для вывода запроса}Write(*Beedume количество чисел: *); {выводим запрос}ReadLn(n);{вводим ответ пользователя}dx:^(80'(n^l)*3)divn;х:=0;s:=0;TextAttr:=2*I6-^14; {желтые символы на зеленом фоне}for i:=I tondobegin х:-х+3;Window(x,7^+dx,9); {устанавливаем окно ввода данных}ClrScr;{вьщеляем это окно}259Часть I.
Основы алгоритмизации и процедурное программированиеGotoXY(2,2); {устанавливаем курсор для ввода данных}ReadLn(a[i]); {вводим число}s:=s+afij;x:=x-^dx;end;TextAttr:=4*16+14; {желтые символы на красном фоне}Window(18ylly53J3); {устанавливаем окно результата}ClrScr;{выделяем окно результата}GotoXY(3,2); {устанавливаем курсор для вывода результата}Write('CpedHee арифметическое = \s/n:5:2);ReadLn;{ожидаем нажатия клавиши Enter}Wmdow(l, 1,80,25); {восстанавливаем окно на весь экран}TextAttr:=7;{восстанавливаем стандартные цвета}ClrScr;{очищаем экран}End.8.2. Управление клавиатуройКлавиатура - достаточно сложное устройство, в состав которого входитмикропроцессор и память - буфер клавиатуры.
При нажатии и отпусканиилюбой клавиши в буфер клавиатуры записываются так называемые коды наэюатия/отпуекания, при этом микропроцессор клавиатуры отсекает дребезгклавиш - сигналы, полученные при неполном контакте в процессе нажатияи отпускания клавиши.Клавиши клавиатуры делят на буквенно-цифровые, специальные и клавиши смещения.К буквенно-цифровым относят клавиши букв, цифр, специальных знакови пробела. Их используют для ввода информации.Специальные клавиши - это клавиши управления курсором (<-, Т, ->, i .Home, End, Tab, Page up. Page down), удаления (Del, Backspace), клавиши переключения режимов (Ins, Caps lock, Num lock, Scroollock), функциональныеклавиши (Esc, Break, Fl, F2, F3, ..., FI2) и т.д.
Эти клавиши используют длявыполнения вспомогательных операций во время работы с компьютером.Клавиши смещения - это клавиши Shift, Ctrl и Alt. Их используют совместно с другими клавишами для изменения вводимых кодов. Так, если принажатии клавиши «а» формируется код строчной буквы а латинского алфавита, то нажатие Shift-a приведет к вводу кода заглавной буквы А латинскогоалфавита.Всего выделяют около 400 различных комбинаций, которые могут обрабатываться программой. Эти комбинации формируются на основании кодовнажатия/отпускания специальной программой BIOS (базовая система обработки ввода-вывода) и записываются в буфер BIOS клавиатуры.2608. Управление техническими средствами и взаимодействие с MS DOSИзначально считалось, что количество различных комбинаций не превысит 256, и, соответственно, для представления этой информации будет достаточно 1 байта (см.
приложение 2), но со временем количество комбинацийвозросло, и потребовалось использование второго байта.В настоящее время для представления комбинаций, не вошедших в таблицу ASCII, используют расширенные коды, состоящие из двух байт: первыйбайт равен О, а второй - содержит расширенный scan-код (см. приложение 3).Ввод буквенно-цифровых данных с клавиатуры осуществляется процедурами Read и ReadLn, при этом реально происходит чтение кодов ASCII избуфера BIOS клавиатуры. Считанные символьные коды преобразуются вовнутренний формат в соответствии с типом переменной.Процедуры Read и ReadLn обрабатывают только комбинации, соответствующие буквам и цифрам, а также некоторые специальные комбинации, например, маркер конца строки (комбинация символов #13, #10).Модуль crt содержит специальные функции управления клавиатурой,которые позволяют работать с расширенными кодами.1.
Функция KeyPressed: boolean - возвращает true, если нажата любаяклавиша, false - если буфер BIOS клавиатуры пуст; функция не извлекаетсимволы из буфера, не ожидает ввода;2. Функция ReadKey:char - извлекает очередной код из буфера BIOSклавиатуры и возвращает его как результат операции, ожидает ввода, но невысвечивает вводимого символа.Для чтения расширенного кода функцию ReadKey необходимо вызыватьдважды: первый раз она вернет О, а второй - расширенный scan-код:chl:=ReadKey; {читаем код}ifchl=#0 then ch2:=ReadKey; {если код=0, то читаем второй байт}Пример 8.2. Разработать программу определения кодов клавиш и ихкомбинаций.
Выход из цикла осуществлять по нажатию клавиши Esc.Program ex;Uses crt;Var cl,c2:char;Beginrepeat cl:=ReadKey;{вводим код}ifcl=W then{если расширенный код}beginc2:=ReadKey;{то читаем расширенный scan-код}WriteLn(ord(cl):5, ord(c2):5) {выводим расширенный код}endelse WriteLn(ord(cl):5){выводим код ASCII}until c7 =#27;{до нажатия Esc}End.261Часть 1. Основы алгоритмизации и процедурное программированиеПримечание. Функция ReadKeyобрабатывает коды из буфера BIOS клаНомервиатуры, поэтому с ее помощью нельзяСодержимоебитаполучить коды нажатия/отпускания отдельных клавиш, не преобразуемых в1 - включен режим вставкирасширенные scan-коды, например, кла1 - включен режим Caps Lock~"2 ~виш смещения, клавиш переключения1 - включен режим Num Lockрежимов.1 - включен режим Scroll LockСостояния клавиш смещения и1 - нажата клавиша Altклавиш переключения режимов BIOS1 - нажата клавиша Ctrlфиксирует в байте состояния клавиа1 - нажата клавиша левый Shift |туры (табл.
8.2), который расположен в1 - нажата клавиша правый Shift | оперативной памяти по адресу $0:$417.Для прямого обращения к этомубайту можно использовать стандартно объявленный массив Mem:array of byte, например:Mem[$0:$4J7], или наложить некоторую переменную на интересующий нас байт оперативнойпамяти;Т а б л и ц а 8.2Var KeyState.byte absolute $0:$417;... .8.3. Управление динамикомМодуль crt также содержит процедуры, обеспечивающие управление динамиком.\. Процедура Sound (f:word) - генерирует звук указанной частоты в Гц.Для справки, основной гамме соответствуют следующие частоты: нота «до»основной октавы - 330 Гц, далее - 349 Гц, 370 Гц, 392 Гц, 415 Гц, 440 Гц,466 Гц, 494 Гц, 523 Гц, 554 Гц, 588 Гц, 622 Гц и, наконец, нота «до» следующей октавы - 660 Гц.
Частоты нот других октав кратны частотам основной.2. Процедура NoSound - выключает динамик.3. Процедура Delay (Uword) - обеспечивает задержку на заданный интервал времени, мс.Поскольку к настоящему моменту времени быстродействие компьютеров существенно возросло и изменились некоторые принципы их построения, процедура Delay не всегда обеспечивает корректную задержку, как видно из последующей программы. В этих случаях для организации задержкицелесообразно использовать процедуру, которая читает реальное время.4.
Процедура GetTime (VarHour, Minute, Second, SeclOO:word) - возвращает текущее время суток. Определена в модуле Dos.Пример 8.3. Разработать программу проигрывания основной октавы.Проигрывание гаммы осуществляется включением и выключением динамика с разными частотами.2628.
Управление техническими средствами и взаимодействие с MS DOSProgram ex;Uses Crt;Const f: array[L.13] of word = (330, 349, 370, 392, 415, 440,466, 494, 523, 554, 588, 622, 660);Var i:byte;Begin for i:=l to 13 dobeginSound(f[i]);forf^lto 5000 do Delay(lOOO); {задержка ?!}NoSound;end;End.Чтобы не подбирать время задержки для конкретного компьютера, построим свою процедуру обеспечения требуемой задержки, использующуюпроцедуру GetTime:Program ex;Uses Crt, Dos;Procedure NewDelay(dTime:word);Var key:boolean;Hour, Min, Sec, SeclOO, MyHour, MyMin, MySec, MySeclOO: Word;BeginGetTime(Hour, Min, Sec, Sec100); {узнаем текущее время}{определяем время завершения задержки}MySeclOO:^SeclOO+dTime; MySec:=Sec+MySecl00 div 100;MySeclOOc^MySeclOO mod 100;MyMin:=Min-^MySec div 60;MySec:=MySec mod 60;MyHour:-Hour-^MyMin div 60; MyMin:=MyMin mod 60;key:=false;while not key do {цикл задержки}beginGetTime(Hour, Min, Sec, Seel00); {узнаем текущее время}{проверяем, наступил ли заданный момент}if (Ноиг>МуНоиг) or ((Ноиг=МуНоиг) and ((Min>MyMin) or((Min-MyMin) and ((Sec>MySec) or((Sec^MySec) and ((SeclOO>^MySeclOO)))))))then key:=true;endEnd;Const f array[L.13] of word = (330, 349, 370, 392, 415, 440,466, 494, 523, 554, 588, 622, 660);Var iibyte; j:integer;2638.
Управление техническими средствами- и взаимодействие с MS DOS{описываем массив окон пунктов меню}Const menu:array[L,4] ofwin=((xl:5:yl:4;x2:15;y2:4;text: 'new '),(xl:5;yl:5;x2:15;y2:5;text: 'open'),(xl:5;yl:6;x2:15;y2:6;text: save'),(xl:5;yl: 7;x2:15;y2:7;text: 'exit'));{процедура рисования пункта меню}Procedure DrawWin(w:win;attr:byte);Beginwith w dobeginTextAttr:=attr;{устанавливаем атрибут окна пункта}Window(xl,у1 ,х2,у2); {устанавливаем окно пункта}Clrscr;{высвечиваем окно пункта}GotoXY(2,l);{устанавливаем курсор}Write(text);{выводим название пункта}end;End;{процедура рисования меню с выделенным пунктом npos}Procedure DrawMenu(npos: integer);BeginClrscr;for i:=l to 4 doifi=npos then DrawWin(menu[i],94) {выводим выделенный пункт}else Draw Win (menufij, 30);{выводим невыделенный пункт}End;{основная программа}Beginnpos:=I; {выделенный пункт меню}DrawMenu(npos); {выводим меню}repeatchl: =ReadKey; ifchl =#0 then ch2: =ReadKey;case chl ofW: case ch2 of#72: begin{стрелка вверх}ifnpos>l then {если не верхний пункт}bemiDrawWin(menu[npos],30); {убираем выделение текущего пункта меню}npos:=npos-l; {переходим к предыдущему пункту}DrawWm(menu[npos]y94); {выделяем новый пункт}end;end;265Часть L Основы алгоритмизации и процедурное программированиеBegin for i:=l to 13 dobeginSound(f[i]):NewDelay(50);NoSound;end;End8.4.