Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр.на_ЯВУ_уч.пос.DOC
Скачиваний:
24
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Работа со звуком

В ПЭВМ есть возможность генерировать с помощью встроенного динамика звуковые сигналы частотой от 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.

§9.5. Модуль 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);

... ...