- •Содержание
- •Часть 1. Основные понятия программирования §1.1. Этапы разработки программного обеспечения
- •§1.2. Основные сведения об алгоритмах Понятие алгоритма
- •Свойства алгоритма
- •Формы записи алгоритмов
- •Блок-схемы алгоритмов
- •§1.3. Языки программирования
- •§1.4. Паскаль и Object Pascal, Турбо-Паскаль и Delphi
- •Контрольные вопросы
- •Язык, оболочка и интегрированная среда разработки
- •Часть 2. Общие сведения о языке Паскаль §2.1. Алфавит и служебные слова
- •Описание общих конструкций языка
- •§2.2. Структура программы
- •§2.3. Разделы описаний Описание меток
- •Определение констант
- •Определение типов
- •Описание переменных
- •Контрольные вопросы
- •Часть 3. Простые типы данных Иерархия типов
- •§3.1. Целые типы
- •§3.2. Вещественные типы
- •§3.3. Логический тип
- •§3.4. Литерный тип
- •§3.5. Перечисляемый тип
- •§3.6. Диапазоны (интервальный тип)
- •Дополнительные типы в Delphi
- •Контрольные вопросы
- •Глава 4. Операторы языка Паскаль Выражения
- •§4.1. Оператор присваивания
- •§4.2. Ввод-вывод данных
- •§4.3. Составной оператор
- •§4.4. Пустой оператор
- •§4.5. Безусловный оператор перехода
- •§4.6. Условный оператор
- •§4.7. Оператор цикла с параметром for
- •§4.8. Оператор цикла с предусловием while
- •§4.9. Оператор цикла с постусловием repeat
- •§4.10. Оператор выбора case
- •Контрольные вопросы
- •Глава 5. Процедурное программирование §5.1. Функции
- •Параметры – значения
- •Параметры – переменные
- •Бестиповые параметры
- •§5.2. Процедуры
- •Правила использования подпрограмм
- •Рекурсия
- •Директивы
- •Процедурные типы
- •Пример использования подпрограмм
- •Контрольные вопросы
- •Глава 6. Структурированные типы данных
- •§6.1. Массивы
- •§6.2. Строки
- •§6.3. Записи
- •§6.4. Множества
- •Пример использования множеств
- •§6.5. Файлы
- •Установочные и завершающие операции
- •Операции ввода-вывода
- •Перемещения по файлу
- •Пример работы с файлом
- •Обработка ошибок ввода-вывода
- •Специальные операции
- •Пример объединения двух файлов
- •Текстовые файлы
- •Стандартные текстовые файлы
- •Файлы без типа
- •Контрольные вопросы
- •Глава 7. Динамические структуры данных §7.1. Динамические переменные
- •§7.2. Указатели
- •Работа с динамическими переменными
- •Пример двухсвязанного циклического списка
- •Указатели без типа
- •Контрольные вопросы
- •Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
- •§8.2. Доступ к аппаратуре Доступ к памяти
- •Доступ к портам ввода-вывода
- •Работа по прерываниям
- •Контрольные вопросы
- •Глава 9. Модули §9.1. Основные понятия
- •§9.2. Использование модулей
- •§9.3. Стандартные модули
- •§9.4. Модуль Crt
- •Работа с экраном в текстовом режиме
- •Работа с клавиатурой
- •Работа со звуком
- •§9.5. Модуль dos
- •§9.6. Графический режим монитора
- •Контрольные вопросы
- •Глава 10. Введение в объектно-ориентированное программирование §10.1. История развития программирования
- •Понятие объекта
- •§10.2. Свойства объектов
- •Раннее и позднее связывание
- •§10.3. Виртуальные методы
- •Конструкторы и деструкторы
- •§10.4. Динамические объекты
- •Скрытые поля и методы
- •Контрольные вопросы
- •Литература
Работа со звуком
В ПЭВМ есть возможность генерировать с помощью встроенного динамика звуковые сигналы частотой от 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);
... ...
