Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Работа с клавиатурой
Кроме стандартных процедур Read и Readln в модуле Crt есть две процедуры, расширяющие возможности работы с клавиатурой. Функция ReadKey:char; считывает один символ с клавиатуры. Его чтение не сопровождается эхо-отображением на экране, что используется в программах с меню и других, требующих постоянного управления с помощью клавиатуры. Более того, с ее помощью можно читать коды управляющих клавиш, чего нельзя сделать с помощью команды Read. Если нажата не символьная, а управляющая клавиша, то первое считанное число – 0, а код клавиши надо ввести еще раз. Пример: программа проверки нажатия функциональных клавиш F1-F10. Program DemoCode; { Демонстрационная программа проверки нажатия функциональных клавиш } Uses Crt; Const Esc=27; F1=59; F10=68; Var Ch:char; { символ, вводимый с клавиатуры } Priznak:boolean; Begin TextColor(Yellow); { Буквы желтые } TextBackGround(Blue); { Фон синий } ClrScr; Repeat Ch:=ReadKey; If Ord(Ch)=0 then Begin Ch:=ReadKey; { второй символ } If Ord(Ch) in [F1..F10] then Writeln( 'Нажата функциональная клавиша F',Ord(Ch)-58) else Writeln( 'Нажата управляющая клавиша с кодом ',Ord(Ch)) end else Writeln( 'Нажата символьная клавиша с кодом ', Ord(Ch)); Until Ord(Ch)=Esc; end. При обращении к функции KeyPressed:boolean; ожидания нажатия клавиши нет, она просто опрашивает буфер клавиатуры и выдает логический результат: True – если в буфере есть какой-либо символ и False – в противном случае. Работа со звуком В ПЭВМ есть возможность генерировать звуковые сигналы частотой от 37 Гц до 20 КГц с помощью встроенного динамика. Из программы на Паскале воспроизводятся только чистые тона без искажений. Сила, или громкость звука не регулируется. Стандартный звуковой сигнал длительностью 0,25 сек и частотой 800 Гц вызывается символом 7 кодовой таблицы, например: Writeln (‘Ошибка данных’,Chr(7)); Для управления частотой звука и его продолжительностью в модуле Crt предусмотрены следующие процедуры. Включение звука: Sound (Freq:word); Целый аргумент указывает частоту звучания в герцах. Звук будет продолжаться, пока не будет выключен. Отмена (выключение) звука: NoSound; Задержка по времени: Delay (ms:word); Целый аргумент указывает длительность в миллисекундах. Это универсальная процедура и может использоваться в самых различных целях. Но она использует встроенную схему таймера с интервалом 18,2 раз в секунду, поэтому для точного вычисления времени эту процедуру использовать нельзя. Таким образом, стандартный звуковой сигнал – это последовательность процедур, например: Sound (800); Delay (250); NoSound; С помощью этих процедур и операторов цикла можно создавать разнообразные звуковые эффекты, например, проиграть гамму: Program Gamma; { Пример проигрывания гаммы } Uses Crt; Const {Частоты нот гаммы от ДО октавы 1 до ДО октавы 2} Freq: Array[1..8] of word=(262,294,330,349,392,440,494,524); VAR i:integer; Begin Repeat For i:=1 to 8 do Begin Sound(Freq[i]); { Включение звука } Delay(500); NoSound; { Выключение звука } end Until KeyPressed; end. Модуль DOS В Паскале стандартные процедуры работы с файлами и системной информацией весьма ограничены: нет прямой возможности управления ресурсами компьютера и их контроля, например, получения значения текущего времени. Назначение же операционной системы – это управление ресурсами и процессами, в частности работа с файловой системой. В модуле Dos введены процедуры и функции, позволяющие получить доступ к некоторым ресурсам DOS.
Для поиска первого и следующего файла с заданным именем используются соответственно процедуры: FindFirst (Path:String; Attr:Word; Var S:SearchRec); FindNext (Var S:SearchRec); Здесь: Path – путь и имя искомого файла. При отсутствующем пути поиск производится в текущем каталоге, возможно использование шаблонов. Attr – задаваемые атрибуты файла. В качестве Attr можно использовать константу AnyFile, означающую любые атрибуты. S – возвращаемая переменная со следующей структурой: SearchRec=Record Fill: Array [1..21] of byte; Attr: byte; Time: LongInt; Size: LongInt; Name: String [12]; end; Здесь поле Fill содержит служебную информацию DOS. Attr – реальные атрибуты файла. Time – дата и время создания файла в упакованном виде. Size – размер файла в байтах. Name – имя найденного файла. Искомый файл может отсутствовать, поэтому после использования этих и некоторых следующих процедур анализируют системную переменную DosError, описанную выше. Для распаковки времени создания файла используется процедура: UnpackTime (Time:LongInt; Var DT:DateTime); Выходным параметром для неё является запись DT, имеющая следующую структуру: DateTime = Record Year, Month, Day, Hour, Min, Sec: Word end; Пример: вывод списка файлов из текущего каталога, содержащих тексты программ на языке Паскаль. Program FindPas; { Поиск файлов с Паскаль-программами } Uses Dos; Var DT:DateTime; S:SearchRec; Begin Writeln; FindFirst ('*.pas',AnyFile,S); While DosError=0 do Begin UnpackTime (S.Time,DT); WriteLn(' Файл ',S.Name,' создан ', DT.Day,'.',DT.Month,'.',DT.Year, ' время: ',DT.Hour,':',DT.Min,':',DT.Sec, ' размер ',S.Size,' байт'); FindNext (S); end end. Если необходимо искать файлы не в одном, а в нескольких каталогах, то используют функцию FSearch (Path:PathStr; DirList:String): PathStr; Тип PathStr является предопределенным: PathStr=String [79]; Здесь: Path – имя искомого файла, может быть составным. DirList – список каталогов, в которых будет производиться поиск, каталоги разделяются точкой с запятой, например: S:= FSearch ('EDIT.EXE','C:\DOS;C:\NC;C:\NU'); В текущем каталоге поиск производится автоматически. В случае удачного поиска переменной присваивается строка, содержащая составное имя файла, в случае неудачи – пустая строка. Список каталогов используется аналогично принятым правилам в DOS. Обычно в файле автозапуска AUTOEXEC.BAT содержится команда PATH, присваивающая этой переменной окружения имена каталогов, в которых находятся наиболее часто используемые файлы. В этом случае поиск файлов из среды DOS производится не только в текущем и корневом каталогах, но и в каталогах, указанных в этой команде. Чтобы воспользоваться этой переменной, в модуле DOS введена функция GetEnv (EnvVar:String):String; где в качестве аргумента используется имя переменной окружения. Так, если в файле автозапуска указана команда PATH C:\DOS;C:\WINDOWS;C:\NC, то после выполнения S:= GetEnv ('PATH'); S примет значение C:\DOS;C:\WINDOWS;C:\NC, что может являться аргументом функции FSearch.
Из составного имени файла можно отдельно выделить полный путь, чисто имя и расширение процедурой FSplit (Path:PathStr; Var Dir:DirStr; Var Name:NameStr; Var Ext:ExtStr); Типы определены как DirStr = String [67]; NameStr = String [8]; ExtStr = String [4]; Пример поиска файла. Program PoiskFile; { Пример программы поиска файла } Uses Dos; Var NameIn,NameFul:PathStr; { входное и составное имя файла } Dir:DirStr; Name:NameStr; Ext:ExtStr; Begin Writeln(' Введите имя искомого файла: '); Readln(NameIn); NameFul:=FSearch(NameIn,GetEnv('PATH')); If NameFul='' then Writeln('Файл ',NameIn,' не найден') else Begin FSplit(NameFul,Dir,Name,Ext); Writeln('файл ',Name,' с расширением ',Ext, ' найден в каталоге ',Dir) end end. При создании новых файлов часто необходимо знать, достаточно ли места на диске. Для этого можно воспользоваться функциями DiskSize (Drive:Byte):LongInt; – определение общего объема указанного логического устройства (диска) в байтах; DiskFree (Drive:Byte):LongInt; – определение количества свободных байт на диске. Номер диска задается как: 0 – текущий, 1 – А, 2 – С и т.д.
Для работы с текущей датой и временем используются процедуры: GetDate (Var Year,Month,Day,Day_of_week: Word); – определяет текущую системную дату. Здесь Day_of_week определяет порядковый день недели от 0 до 6, причем 0 означает воскресенье. Аналогично для установки новой даты: SetDate (Year,Mount,Day:Word); Процедура для определения системного времени: GetTime (Var Hour,Minute,Second,Hund:Word); Здесь Hund — сотые доли секунды со значением от 0 до 99. Они определяются приблизительно, так как внутренний генератор переключается 18,2 раза в секунду. Для установки системного времени применяется процедура SetTime (Hour,Minute,Second,Hund:Word); Но бо́льшие возможности дает работа непосредственно с процедурами операционной системы и внешними устройствами.
Для работы с прерываниями в модуле DOS предусмотрены две процедуры вызова прерываний. Intr (IntNo:Byte; Var Regs: Registers); Здесь: IntNo – номер прерывания; Regs – содержимое регистров процессора следующего типа: Registers = Record Case integer of 0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:Word); 1: (AL,AH,BL,BH,CL,CH,DL,DH:Byte); end; То есть поля записи соответствуют либо шестнадцатиразрядным, либо восьмиразрядным регистрам процессора. Например, установка графического режима 640х480 точек, 16 цветов: Var R:Registers; ...... R.AH:=0; R.AL:=$12; Intr ($10,R); Так как очень часто используется вектор прерывания DOS 21H, то добавлена специальная процедура для работы только с этим прерыванием: MSDos (Var Regs:Registers); полностью эквивалентная Intr ($21,Regs); Например, определение версии DOS: Uses Dos; Var R:Registers; ...... R.AH:=$30; MSDos (R); Writeln ('MS-DOS ',R.AL,'.',R.AH); ...... Date: 2016-07-22; view: 326; Нарушение авторских прав |