Модульное программирование. Функции, проверяющие состояние диска. Процедуры для работы с датой и временем

Работа добавлена на сайт сайт: 2016-03-30

">Учебная практика 2.

">Системный модуль " xml:lang="en-US" lang="en-US">DOS ">, " xml:lang="en-US" lang="en-US">WinDOS ">.

">Файлы в Паскале

Основные процедуры и функции для работы с файлами

">1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:

">Assign(<файловая_переменная>, <имя_дискового_файла>)

">Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла – строковая величина, т.е. должна быть заключена в апострофы. Например " xml:lang="en-US" lang="en-US">:

">Пример " xml:lang="en-US" lang="en-US"> ">процедуры " xml:lang="en-US" lang="en-US"> Assign ">в " xml:lang="en-US" lang="en-US"> ">Паскале " xml:lang="en-US" lang="en-US">

" xml:lang="en-US" lang="en-US"> Assign (chf, "G:\Home\ Student\ Lang\ Pascal\ primer.dat");

">Если путь не указан, то программа будет искать файл в своем рабочем каталоге и по указанным путям в autoexec.bat.

">Вместо имени дискового файла можно указать имя логического устройства, каждое из которых имеет стандартное имя:

">CON – консоль, т.е. клавиатура-дисплей;

">PRN – принтер. Если к компьютеру подключено несколько принтеров, доступ к ним осуществляется по именам LPT1, LPT2, LPT3.

">Не разрешается связывать с одним физическим файлом более одной файловой переменной.

">2.После окончания работы с файлами на Паскале, они должны быть закрыты.

">Close(<список файловых переменных>);

">При выполнении этой процедуры закрываются соответствующие физические файлы и фиксируются сделанные изменения. Следует иметь в виду, что при выполнении процедуры close связь файловой переменной с именем дискового файла, установленная ранее процедурой assign, сохраняется, следовательно, файл можно повторно открыть без дополнительного использования процедуры assign.

">Работа с файлами заключается, в основном, в записи элементов в файл и считывании их из файла. Для удобства описания этих процедур введем понятие указателя, который определяет позицию доступа, т.е. ту позицию файла, которая доступна для чтения (в режиме чтения), либо для записи (в режиме записи). Позиция файла, следующая за последней компонентой файла (или первая позиция пустого файла) помечается специальным маркером, который отличается от любых компонент файла. Благодаря этому маркеру определяется конец файла.

">3.Подготовка к записи в файл Паскаля

"> Rewrite(<имя_ф_переменной>);

">Процедура Rewrite(f) (где f – имя файловой переменной) устанавливает файл с именем f в начальное состояние режима записи, в результате чего указатель устанавливается на первую позицию файла. Если ранее в этот файл были записаны какие-либо элементы, то они становятся недоступными. Результат выполнения процедуры rewrite(f); выглядит следующим образом:

">4.Запись в файл Паскаля

">Write(<имя_ф_переменной>, <список записи>);

">При выполнении процедуры write(f, x) в ту позицию, на которую показывает указатель, записывается очередная компонента, после чего указатель смещается на следующую позицию. Естественно, тип выражения х должен совпадать с типом компонент файла.

">Для типизированных файлов выполняется следующее утверждение: если в списке записи перечислено несколько выражений, то они записываются в файл, начиная с первой доступной позиции, а указатель смещается на число позиций, равное числу записываемых выражений.

">5.Подготовка файла к чтению Паскаля

">Reset(<имя_ф_переменной>);

">Эта процедура ищет на диске уже существующий файл и переводит его в режим чтения, устанавливая указатель на первую позицию файла.

">Если происходит попытка открыть для чтения не существующий еще на диске файл, то возникает ошибка ввода/вывода, и выполнение программы будет прервано.

">6.Чтение из файла в Паскале

">Read(<имя_ф_переменной>,<список переменных>);

">Для типизированных файлов при выполнении процедуры read() последовательно считывается, начиная с текущей позиции указателя, число компонент файла, соответствующее числу переменных в списке, а указатель смещается на это число позиций.

">В большинстве задач, в которых используются файлы, необходимо последовательно перебрать компоненты и произвести их обработку. В таком случае необходимо иметь возможность определять, указывает ли указатель на какую-то компоненту файла, или он уже вышел за пределы файла и указывает на маркер конца файла.

">7.Функция определения достижения конца файла в Паскале

">Eof(<имя_ф_переменной>);

">Название этой функции является сложносокращенным словом от end of file. Значение этой функции имеет значение true, если конец файла уже достигнут, т.е. указатель стоит на позиции, следующей за последней компонентой файла. В противном случае значение функции – false.

">8.Изменение имени файла в Паскале

">Rename(<имя_ф_переменной>, <новое_имя_файла>);

">Здесь новое_ имя_ файла – строковое выражение, содержащее новое имя файла, возможно с указанием пути доступа к нему.

">9.Уничтожение файла в Паскале

">Erase(<имя_ф_переменной>);

">Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

">10.Уничтожение части файла от текущей позиции указателя до конца в Паскале

">Truncate(<имя_ф_переменной>);

">11.Файл Паскаля может быть открыт для добавления записей в конец файла

">Append(<имя_ф_переменной>);

">Типизированные файлы Паскаля. Длина любого компонента типизированного файла строго постоянна, т.к. тип компонент определяется при описании, а, следовательно, определяется объем памяти, отводимый под каждую компоненту. Это дает возможность организовать прямой доступ к каждой компоненте (т.е. доступ по порядковому номеру).

">Перед первым обращением к процедурам ввода/вывода указатель файла стоит в его начале и указывает на его первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные и выражения в списках ввода и вывода в процедурах read() и write() должны иметь тот же тип, что и компоненты файла Паскаля. Если этих переменных или выражений в списке несколько, то указатель будет смещаться после каждой операции обмена данными на соответствующее число позиций.

">Для облегчения перемещения указателя по файлу и доступа к компонентам типизированного файла существуют специальные процедуры и функции:

">fileSize(<имя_ф_переменной>) – функция Паскаля, определяющая число компонентов в файле;

">filePos(<имя_ф_переменной>) – функция Паскаля, значением которой является текущая позиция указателя;

">seek(<имя_ф_переменной>,n) – процедура Паскаля, смещающая указатель на компоненту файла с номером n. Так, процедура seek(<имя_ф_переменной>,0) установит указатель в начало файла, а процедура seek(<имя_ф_переменной>, FileSize(<имя_ф_переменной>)) установит указатель на признак конца файла.

">Текстовые файлы Паскаля. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. Процедуры и функции seek, filepos, filesize к ним не применяются. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN(<имя_ф_переменной>), которая принимает значение true, если конец строки достигнут.

">Форма обращения к процедурам write и read для текстовых и типизированных файлов одинакова, но их использование принципиально различается.

">В списке записываемых в текстовый файл элементов могут чередоваться в произвольном порядке числовые, символьные, строковые выражения. При этом строковые и символьные элементы записываются непосредственно, а числовые из машинной формы автоматически преобразуются в строку символов.

">Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.

" xml:lang="en-US" lang="en-US">DOS

">С помощью модулей Dos и WinDos реализуется целый ряд программ операционной системы и программ обработки файлов. Ни одна из программ модуля Dos не определена в стандартном Паскале, поэтому они помещаются в отдельный модуль.

">Более полное описание операций DOS приведено в руководствах по DOS фирмы IBM.

">Основное различие модулей Dos и WinDos состоит в том, что процедуры и функции модуля Dos используют стандартные строки Паскаля, а процедуры и функции модуля WinDos - строки с завершающим нулем. Стандартная строка Паскаля - это байт длины, за которым следует последовательность символов. Строка с завершающим нулем - это последовательность ненулевых символов с завершающим символом NULL (#0).

">Процедуры и функции модуля " xml:lang="en-US" lang="en-US">Dos ">.

Функция DiskFree

"> Возвращает количество свободных байтов указанного диска.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DiskFree(Drive: Byte): Longint;

">Замечания:

"> Функция DiskFree может оказаться полезной для определения наличия свободного места на диске.

Функция DiskSize

"> Возвращает общий размер свободного места на диске, в байтах.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DiskSize(Drive: Byte): Longint;

" xml:lang="en-US" lang="en-US"> ">Переменная Drive – это диск для проверки, где A = 1, B = 2 и т.д. Если Drive = 0, то используется текущий диск.

Функция DosExitCode

"> Возвращает код выхода из подпроцесса.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DosExitCode: Word;

Функция DosVersion

" xml:lang="en-US" lang="en-US"> ">Возвращает " xml:lang="en-US" lang="en-US"> ">версию " xml:lang="en-US" lang="en-US"> DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DosVersion: Word;

Функция EnvCount

">Возвращает количество строк, содержащихся в системном окружении.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function EnvCount: Integer;

Функция EnvStr

" xml:lang="en-US" lang="en-US"> ">Возвращает указанную строку окружения.

">Объявление:

" xml:lang="en-US" lang="en-US">function EnvStr(Index: Integer): string;

">Замечания:

"> Переменная Index – это номер переменной окружения, например, первая переменная – это 1, вторая – 2 и т.д. Неправильный индекс возвращает пустую строку.

"> Функция EnvStr возвращает строку в форме (VarName=String). Если порядок переменных системного окружения неизвестен, то используют функцию GetEnvto для поиска переменной по имени.

Процедура Exec

"> Выполняет указанную программу с указанной командной строкой.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure Exec(Path, CmdLine: string);

">Замечания:

"> Переменная Path – это диск, директория и имя программы для выполнения. Переменная CmdLine содержит аргументы командной строки.

"> Процедура Exec передает управление программе, указанной в переменной Path. При этом распределение памяти не изменяется. После завершения процедуры Exec используйте функцию DosExitCode для определения кода выхода из программы. Процедура Exec также устанавливает значение переменной DosError, если случается ошибка.

"> Процедура Exec не выполняет программы, которые требуют Блок Управления Файлом - File Control Blocks (FCB).

Функция FExpand

"> Преобразует имя файла в полный путь к файлу.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function FExpand(Path: PathStr): PathStr;

Процедура FindFirst

"> Ищет указанный каталог для соответствующего файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure FindFirst(Path: PChar; Attr: Word; var F: TSearchRec);

">Замечания:

"> Переменная Path – это диск и каталог, в котором будет выполняться поиск и имя файла для поиска. Шаблоны следующие, например, "MYFILE??.*".

"> Переменная Attr содержит атрибуты файла для включения в поиск в добавление ко всем нормальным файлам.

"> Процедура FindFirst используется совмествно с процедурой FindNext. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.

Процедура FindNext

"> Находит следующее вхождение, которое соответствует имени и атрибутам, указанным в предварительно вызванной процедуре FindFirst.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure FindNext(var F: TSearchRec);

">Замечания:

"> Процедура FindNext используется совместно с процедурой FindFirst. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска, предварительно определенных для процедуры FindFirst. Переменная F должна быть той же самой переменной, которая была использована для ввода в FindFirst. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.

Функция FSearch

"> Поиск файла.

">Объявление:

" xml:lang="en-US" lang="en-US">function FSearch(Path: PathStr; DirList: string): PathStr;

">Замечания:

"> Переменная Path имеет тип PathStr, который определен в модуле DOS. Переменная DirList – это список директорий, разделенных точкой с запятой (;), которые будут включены в поиск.

"> Функция FSearch возвращает каталог и имя файла, если файл существует. Если файл, указанный в переменной Path, не найден в списке директорий, то возвращается пустая строка. Функция FSearch всегда начинает поиск с текущей директории, а затем проверяет директории, перечисленные в переменной DirList в том порядке, в котором они перечислены.

Процедура FSplit

"> Разделяет имя файла на три компонента.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure FSplit(Path: PathStr; var Dir: DirStr; var Name: NameStr; var Ext: ExtStr);

">Замечания:

"> Используйте эту процедуру для разделения полного имени файла на три компонента: путь, имя файла и расширение файла. Переменная Path имеет тип PathStr, который определен в модуле DOS. Переменная Dir возвращает путь или часть переменной Path, которая содержит каталог (или каталоги). Переменная Name возвращает фактическое имя файла без расширения. Переменная Ext возвращает расширение файла, которому предшествует точка (.).

"> Возможно, что один или более компонентов вернутся пустыми. Это может случиться, если переменная Path не содержит этих компонентов. Например, в том случае, если в переменной Path указан пустой каталог.

Процедура GetCBreak

"> Возвращает состояние проверки Ctrl-Break в DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetCBreak(var Break: Boolean);

">Замечания:

"> Возвращает TRUE, если Ctrl-Break включена, иначе возвращает FALSE.

"> С включенной проверкой Ctrl-Break c все вызовы ввода/вывода (консоль, принтер и коммуникации) являются проверяемыми. Чтобы выключить Ctrl-Break, используйте процедуру SetCBreak.

Процедура GetDate

"> Возвращает текущую дату, установленную в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetDate(var Year, Month, Day, DayOfWeek: Word);

Функция GetEnv

"> Возвращает значение указанной переменной окружения.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function GetEnv(VarName: string): string;

">Замечания:

">VarName – имя переменной для поиска. Если VarName не существует как переменная окружения, то возвращается пустая строка.

">Функция GetEnv возвращает строку, назначенную для переменой окружения.

Процедура GetFAttr

">Возвращает атрибуты файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetFAttr(var F; var Attr: Word);

">Замечания:

">F – это файловая переменная, а также типизированный, нетипизированный или текстовый файл, который не открыт. Переменная Attr содержит атрибуты файла.

"> Файл, связываемый с переменной F, должен быть закрыт. Переменная Attr должна сравниваться с одной из констант атрибутов, которые определены в модуле DOS, с помощью ЛОГИЧЕСКОГО И (AND).

"> Ошибки записываются в переменную DosError, которая определена в модуле DOS. Для большей информации о файловых атрибутах обращайтесь к справочному руководству по вашей DOS.

Процедура GetFTime

">Возвращает дату и время последнего изменения файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetFTime(var F; var Time: Longint);

">Замечания:

"> Файл, связанный с переменной F должен быть открыт. Время может быть распаковано с помощью процедуры UnPackTime. Ошибки записываются в переменную DosError, которая определена в модуле DOS.

">Процедура GetIntVec

">Возвращает адрес, записанный в указанном векторе прерывания.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetIntVec(IntNo: Byte; var Vector: Pointer);

" xml:lang="en-US" lang="en-US">procedure GetIntVec(IntNo: Byte; var Vector: FarPointer);

">Замечания:

"> Учтите, что процедура GetIntVec возвращает адрес прерывания защищенного режима. Чтобы получить вектор прерывания реального режима, используйте процедуру GetRealIntVec. Прерывания могут происходить в защищенном или реальном режиме.

Процедура GetTime

">Возвращает текущее время, установленное в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetTime(var Hour, Minute, Second, Sec100: Word);

">Замечания:

"> Диапазоны возвращаемых значений следующие: Hour (Час) , Minute (Минута) , Second (Секунда) и Sec100 (сотая доля секунды) .

Процедура GetVerify

"> Возвращает состояние проверочного флага в DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetVerify(var State: Boolean);

">Замечания:

">State = TRUE, если проверочный флаг DOS включен, иначе FALSE.

"> С включенным проверочным флагом DOS все выводимые на диск данные проверяются на целостность. Иначе выводимые данные не проверяются. Чтобы установить состояние проверочного флага DOS, используйте процедуру SetVerify.

Процедура Intr

"> Выполняет указанное программное прерывание.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure Intr(IntNo: Byte; var Regs: TRegisters);

">Замечания:

"> Перед вызовом процедуры Intr, загрузите переменную Regs соответствующими параметрами, необходимыми для прерывания. Переменная Regs возвращает значения регистров после вызова прерывания. Вызовы, которые используют регистры ESP и SS не могут быть выполнены. Более подробную информацию о программных прерываниях ищите в руководствах на ваши BIOS и DOS.

"> Учтите, что все сегментные регистры (DS,ES,FS,GS) должны содержать допустимые значения сегментных дескрипторов или быть установлены в ноль перед вызовом процедуры Intr. Все прерывания, вызов которых требует анализа смещения, должны использовать 32-битное смещение.

Процедура Keep

">Эта процедура является только составляющей частью и всегда выдает сообщение об ошибке во время выполнения.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure Keep(ExitCode: Word);

Процедура MsDos

" xml:lang="en-US" lang="en-US"> ">Выполняет вызов функции DOS.

">Объявление:

" xml:lang="en-US" lang="en-US">procedure MsDos(var Regs: TRegisters);

">Замечания:

"> Загрузите переменную Regs соответствующими параметрами перед вызовом MS-DOS. Переменная Regs возвращает значения регистров после вызова прерывания. Учтите, что тип TRegisters позволяет доступ к 32-битным регистрам. Вызовы DOS, которые используют регистры ESP и SS не могут быть выполнены. Для прерывания, отличного от $21, используйте процедуру Intr. Более подробную информацию о программных прерываниях DOS ищите в руководствах на вашу DOS.

"> Учтите, что все сегментные регистры (DS,ES,FS,GS) должны содержать допустимые значения сегментных дескрипторов или быть установлены в ноль для использования MS-DOS.

Процедура PackTime

"> Преобразует запись " xml:lang="en-US" lang="en-US">DateTime ">.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure PackTime(var T: DateTime; var Time: Longint);

">Замечания:

"> Процедура PackTime может быть использована совместно с процедурой SetFTime. Для распаковки 4-х байтового пакета дата/время в запись DateTime используйте процедуру UnpackTime.

Процедура SetCBreak

"> Устанавливает состояние проверки Ctrl-Break.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetCBreak(Break: Boolean);

">Замечания " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US"> ">С включенной проверкой Ctrl-Break, проверяются все вызовы операций ввода/вывода (консоль, принтер и коммуникации). Чтобы получить состояние Ctrl-Break, используйте процедуру GetCBreak.

Процедура SetDate

"> Устанавливает текущую дату в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetDate(Year, Month, Day: Word);

">Замечания:

"> Неправильная дата игнорируется операционной системой. Для получения текущей даты используйте процедуру GetDate.

Процедура SetFAttr

"> Устанавливает атрибуты файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetFAttr(var F; Attr: Word);

">Замечания:

"> Файл, связанный с переменной F должен быть закрыт. Переменная Attr должна быть сформирована с помощью операции ЛОГИЧЕСКОЕ ИЛИ (OR) между этой переменной и одной из констант файловых атрибутов. Эти константы определенны в модуле DOS.

"> Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию о файловых атрибутах ищите в руководствах на вашу DOS.

">Процедура " xml:lang="en-US" lang="en-US">SetFTime

"> Устанавливает дату и время последнего изменения файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetFTime(var F; Time: Longint);

">Замечания: Файл, связанный с переменной F должен быть открыт. Упакованный формат дата/время может быть создан с помощью процедуры PackTime. Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию об упакованном формате дата/время ищите в руководствах на вашу DOS.

Процедура SetIntVecs

"> Устанавливает указанный вектор прерывания для указанного адреса.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetIntVec(IntNo: Byte; Vector: Pointer);

" xml:lang="en-US" lang="en-US">procedure SetIntVec(IntNo: Byte; Vector: FarPointer);

">Замечания:

"> Прерывания могут происходить в защищенном или реальном режиме.

Процедура SetTime

"> Устанавливает текущее время в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetTime(Hour, Minute, Second, Sec100: Word);

">Замечания:

"> Неправильное значение игнорируется. Для получения текущего времени операционной системы используйте процедуру GetTime.

Процедура SetVerify

"> Устанавливает состояние флага проверки в DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetVerify(Verify: Boolean);

Процедура SwapVectors

" xml:lang="en-US" lang="en-US"> ">Процедура SwapVectors ничего не делает и предоставляется только для совместимости с Borland Pascal.

">Объявление: procedure SwapVectors;

Процедура UnpackTime

"> Преобразует переменную типа Longint в запись.

">Задание для самостоятельной работы.

">1. Написать программу для работы с файлами. При запуске программа должна выдавать главное меню с выбором команд.

  1. ">При выборе команды 1 происходит создание файла с расширением " xml:lang="en-US" lang="en-US">txt "> и добавление в файл определенного количества строк.
  2. ">При выборе команды 2 происходит удаление файла.
  3. ">При выборе команды 3 на экран консоли происходит вывод содержимого из файла, а так же при необходимости происходит добавление информации в файл.
  4. ">При выборе команды 4 на экран выводится дата и время создания файла.
  5. ">При выборе команды 5 происходит вывод атрибутов файла.
  6. ">При выборе команды 6 программа завершает свою работу.

">2. Написать программу-таймер. В программе необходимо реализовать несколько режимов работы таймера.

  1. ">При выборе команды 1 отображается режим таймера для отсчета до Нового года.
  2. ">При выборе 1 – отображается полное количество месяцев, дней, часов, минут и секунд, оставшихся до Нового года.
  3. ">При выборе 2 – отображается количество дней, оставшихся до Нового года.
  4. ">При выборе 3 – отображается количество часов, оставшихся до Нового года.
  5. ">При выборе 4 – отображается количество минут, оставшихся до Нового года.
  6. "> При выборе 5 – отображается количество месяцев, оставшихся до Нового года.
  7. ">При выборе 6 – отображается количество секунд, оставшихся до Нового года.
  1. ">При выборе команды 2 отображается оставшееся время до окончания учебной практики. Учебная практика заканчивается 26 декабря в 13:15.
  2. ">При выборе команды 3 отображается оставшееся до конца пары время. Программа должна автоматически определять, какая пара сейчас идет, и выводить оставшееся до звонка время. Если в момент запуска программы идет перемена, то программа должна вывести соответствующее сообщение. Если текущее время до 8:30, то программа выдает сообщение о том, что учебный день еще не начался. Если текущее время больше 13:15, то необходим вывод сообщения, что первая смена уже закончена.
  3. ">При выборе команды 4 программа прекращает работу. Необходимо реализовать программу таким образом, что выход из программы может осуществляться только выбором команды 4.

">Индивидуальное задание:

">Добавить пятый пункт в главное меню. При выборе пункта 5 программа начинает отсчитывать время до Вашего дня рождения.

">3. Добавить к программе 1 навигацию посредством стрелок. Пункты меню должны выбираться перемещением стрелок. Подтверждение выбора осуществляется клавишей " xml:lang="en-US" lang="en-US">

Модули.

Описание модулей.

В Паскале под модулем понимают чаще всего подразумевают комплекс подпрограмм, который находится в отдельном файле и может быть использован другими программами.

Модуль состоит из заголовка, интерфейсной части , исполнительной части и секции инициализации .

Заголовок модуля похож на заголовок программы, однако вместо слова program ставится зарезервированное слово unit.

Модуль должен находится в файле, имя которого совпадает с именем в заголовке, файл должен иметь расширение .pas .

Интерфейсная часть служит для взаимодействия основной программы с модулем. Она начинается с зарезервированного слова interface. В ней должны быть указаны константы, типы данных, переменные, процедуры и функции, которые может использовать основная программа, вызывающая этот модуль. Если модуль использует еще какие-то модули, то они должны быть указаны в интерфейсной части следующим образом: пишется зарезервированное слово uses, затем перечисляются необходимые модули (заметим, что так же обозначаются и модули в разделе описания основной программы). Цепочка используемых модулей может быть сколь угодно длинной, однако она не может содержать циклы. Например, допустима цепочка:

А цепочка

недопустима, поскольку она содержит цикл A uses B uses A.

Процедуры и функции тоже объявляются в интерфейсной части модуля, но при этом разрешено лишь перечислять их заголовки, подобно предварительному объявлению с директивой forward.

В исполнительной части модуля содержаться процедуры и функции модуля. Здесь могут быть так же и локальные типы, константы, метки или переменные. Исполнительная часть начинается с зарезервированного слова implementation, далее следует описания локальных констант, типов данных и переменных, а затем обычное описание процедур и функций, но с использованием сокращенных заголовков, т.е. без указания в них параметров.

Иногда при вызове модуля следует произвести некоторые действия, например инициализировать какие-либо переменные, установить какие-либо связи и т.д. Все эти действия указываются в секции инициализации , которая выглядит, как обычное тело программы: между словами begin и end с точкой находятся операторы. Если при вызове модуля никаких подобных действий производить не нужно, то секция инициализации состоит лишь из слова end с точкой.

Чтобы использовать процедуры, функции и другие объекты модуля в основной программе, необходимо написать зарезервированное слово uses, затем имя модуля. После этого объекты модуля можно использовать так, как если бы они были описаны в основной программе.

Рассмотрим теперь модули, которые поставляются в стандартном комплексе Turbo Pascal, но функции и процедуры которых не являются стандартными.

Модуль CRT.

Модуль Crt содержит процедуры, функции и константы для работы с экраном в текстовом режиме, работы с клавиатурой и генерации звука.

Подпрограммы этого модуля позволяют управлять текстовыми режимами экрана, использованием цветов и окнами, яркостью свечения символов, а также расширенными кодами клавиатуры и звуком.

В текстовом режиме весь экран разбивается на строки (их, как правило, 25), а каждая строка - на отдельные позиции (их обычно по 80 в каждой строке) находится в левом верхнем углу экрана.

Модуль DOS.

Здесь собраны процедуры и функции (а также переменные и константы), позволяющие из программ получать доступ к средствам MS DOS и управлять файлами.

Модуль GRAPH.

Содержит множество подпрограмм, а также констант, типов и переменных, предназначенных для управления графическим режимом экрана. Ресурсы модуля позволяют обратится к любому пикселю экрана и управлять его свечением.

Запустить программу, использующую модуль GRAPH, без графического драйвера (одного или нескольких - это файла с расширением.BGI) не удастся. Указанные драйверы не входят в состав модуля, но поставляются с Turbo Pascal (они содержаться в каталоге BGI). А если в программе используются векторные шрифты, в дополнение е драйверам потребуются также файлы шрифтов (файлы с расширением.CHR).

Тот самый Turbo Pascal, с которого многие начинали.

Язык программирования Pascal был создан Никлаусом Виртом. Назван в честь французского философа и математика XVII века Блеза Паскаля. В то время Вирт был профессором информатики в Федеральном техническом университете в Швейцарии и нуждался в языке, с помощью которого можно было обучать студентов навыкам программирования. Концепция Паскаля была разработана Н. Виртом примерно в 1970 году и Паскаль быстро получил широкое распространение благодаря легкости его изучения, наглядности составленных на нем текстов программ. Поскольку Паскаль послужил основой для разработки других языков программирования, таких как Ада и Модула-2, и поскольку многие языки содержат аналогичные Паскалю структуры, знание Паскаля является солидной базой для изучения других языков программирования. В середине 70-х годов была создана попытка разработать международный стандарт на Паскаль. В результате в 1982 году появился стандарт ISO 7185. Язык Паскаль стараниями Андерса Хейлсберга превратился в мощную профессиональную систему программирования Turbo Pascal. Появление инструментальных средств Borlаnd Pascal with Objects и Delphi для разработки программ в среде Windows лишний раз показала, какие неисчерпаемые возможности таит в себе Паскаль. Borland Pascal и используемый в Delphi язык Object Pascal основываются на Turbo Pascal и развивают его идеи. Delphi - компилятор языка Pascal. Delphi 1 был первым инструментарием разработки Windows приложений, объединившим в себе оптимизирующий компилятор, визуальную среду программирования и мощные возможности работы с базами данных. Годом позже Delphi 2 предложил все то же, но на новом уровне современной 32-битной операционной системы Windows 95 и Windows NT. Кроме того, Delphi 2 предоставил программисту 32-битовый компилятор, создававший более быстрые и эффективные приложения, мощные библиотеки объектов. Продолжительная работа команды разработчиков Delphi привела к появлению в третьей версии продукта расширенного набора инструментов для создания приложений, возможности использования технологий COM для разработки приложений WWW и многих других современных технологий программирования. Delphi 4 является очередным шагом в эволюции компиляторов Паскаля с тех времен, когда более 16 лет назад Андерс Хейлсберг создал первый компилятор Turbo Pascal.

Добавлено--

про "Error 200".

RTL выпуска до 1994-го года ещё не содержала в модуле CRT этой ошибки.
Она появилась после обновления RTL 1994-го года и позднее.

Если использовать даже непропатченную оригинальную RTL 1994-го года с этим багом, но в программе не подключать юнит CRT, то никакой "Error 200" в программе не будет.

И наоборот, стоит только написать в программе "uses crt;", как файл окажется неработоспособен на быстрых машинах, потому что ошибка в том модуле CRT проявлялась уже во время автоматической инициализации библиотеки CRT при старте программы.

3.1 Процедуры для работы с датой и временем.

Процедура

Описание

Возвращает текущую дату, установленную в операционной

Возвращает дату и время последней записи файла.

Возвращает текущее время, установленное в операционной

Преобразует запись DateTiме в четырехбайтовое упакован-

ное символьное представление даты и времени длинного цело-

го типа, которое используется в процедуре SetTiме . Поля за-

писи DateTiме не проверяются на допустимость границ.

Устанавливает для операционной системы текущую дату.

Устанавливает время и дату последней записи файла.

Устанавливает в операционной системе текущее время.

Преобразует четырехбайтовое упакованное символьное пред-

ставление даты и времени длинного целого типа, возвращаемо-

го процедурами GetFTiме ,FindFirst ,FindNext в распа-

кованную запись DateTiме .

Функции, проверяющие состояние диска.

Фуннкция

Описание

Возвращает число свободных байт на диске в заданном диско-

Возвращает полный объем в байтах заданного диска.

Процедуры обработки файлов.

Процедура

Описание

Воспринимает имя файла и возвращает полное уточненное имя

(диск, каталог, расширение).

Ищет файл в списке каталогов.

Производит поиск в заданном (или текущем) каталоге записи,

содержимое которой совпадает с заданным именем файла и ат-

рибутами.

Возвращает следующую запись, имя файла и атрибуты в кото-

рой совпадают с теми, которые были заданы при предыдущем

обращении к процедуре FindFirst .

Возвращает атрибуты файла.

Устанавливает атрибуты файла.

3.4 Функции управления операционной средой.

Описание

Возвращает число строк, содержащихся в операционной среде

Возвращает заданную строку операционной среды.

Возвращает значение заданной переменной операционной сре-

3.5 Прочие процедуры и функции.

3.6 Переменные и константы модуля.

Многими подпрограммами модуля Dos для сообщения об ошибке используется переменная

Константы возвращаемые DosError.

Значение

Описание

Файл не найден

Путь к файлу не найден

В доступе отказано

Ошибочный заголовок

Not enough memory

Недостаточно памяти

Invalid environment

Ошибочное окружение

Ошибочный формат

Нет файлов

Константы атрибутов файла . Используется для построения атрибутов файлов при работе с процедурамиGetFAttr ,SetFAttr ,FindFirst иFindNext .

Константа

Значение

Описание

Только для чтения

Системный

Метка тома

Архивный

Любой файл

Константы являются аддитивными, так что оператор:

FindFirst("*.*", ReadOnly + Directory, S);

будет находить все обычные файлы, а также файлы, доступные только для чтению и подкаталоги текущего каталога. Константа AnyFile представляет собой просто сумму атрибутов.

3.7 Предопределенные типы.

В модуле Dos определяются следующие типы:

Тип DateTime . Используется подпрограммамиUnpackTime иPackTime для проверки и построения 4-байтовых упакованных значений даты и времени, которые используются вGetTime ,SetFTime ,FindFirst иFindNext .

Описание: type

DateTime = record

Year, Month, Day, Hour, Min, Sec: Word; end ;

Примечания: Допустимыми значениями являются для Year − 1980..2099 , для

Month − 1..12, для Day− 1..31, для Hour− 0..23, для Min− 0..59, для Sec− 0..59.

Тип FileRec . Определение записи, предназначенное для внутреннего использо-

вания в Borland Pascal.

Описание: type

FileRec = record Handle: Word; Mode: Word; RecSize: Word;

Private: array of Byte; UserData: array of Byte; Name: array of Char;

end;

Тип SearchRec . ПроцедурыFindFirst иFindNext используют переменные типаSearchRec для просмотра каталогов.

Описание: type

SearchRec = record

Fill: array of Byte; Attr: Byte;

Size: Longint; Name: string;

end;

Информация о каждом файле, найденном в одной из этих процедур, записывается в SearchRec . ПолеAttr содержит атрибуты файла (построенные из констант− атрибутов),Time содержит упакованную дату и время (для распаковки этого значения используетсяUnpackTime ),Size содержит размер в байтах, аName содержит его имя. ПолеFill резервируется DOS и не должно модифицироваться.

Типы работы со строками . Строковые типы используются различными проце-

Модуль (unit) представляет собой набор констант, типов данных, переменных, процедур и функций. Каждый модуль аналогичен отдельной программе на Паскале: он может иметь основное тело, которое вызывается перед запуском Вашей программы и осуществляет необходимую инициализацию. Короче говоря, модуль представляет собой библиотеку описаний, которую можно вставить в свою программу и которая позволит разбить программу на части, компилируемые отдельно.

Турбо-Паскаль обеспечивает Вам доступ к большому числу встроенных констант, типов данных, переменных, процедур и функций. Некоторые из них специфичны для Турбо-Паскаля; другие специфичны для персонального компьютера РС фирмы IBM (и совместимых с ним компьютеров) или для операционной системы MS-DOS. Их количество велико, однако, в своей программе Вы редко используете их все сразу. Поэтому они разделены на связанные группы, называемые модулями. В этом случае Вы можете использовать только те модули, которые необходимы в программе.

Структура модуля

Модуль обеспечивает набор средств благодаря процедурам и функциям при поддержке констант, типов данных и переменных, однако действительная реализация этих средств скрыта в силу того, что модуль разделен на две секции: интерфейса и реализации. Если программа использует модуль, то все описания модуля становятся доступными этой программе, как если бы они были определены в ней самой.

Структура модуля аналогична структуре программы, однако есть несколько существенных различий. Например, рассмотрим модуль:

unit <идентификатор>; interface uses <список модулей>; {Необязательный} {открытые описания} implementation {закрытые описания процедуры и функции } begin {код инициализации } end .

Заголовок модуля начинается зарезервированным словом unit, за которым следует имя модуля (идентификатор) точно так же, как и в случае имени программы. Следующим элементом в модуле является ключевое слово interface. Оно обозначает начало секции интерфейса модуля - секции, видимой всем другим модулям или программам, в которых он используется.

Модуль может использовать другие модули, для этого они определяются в предложении uses. Предложение uses, если имеет место, то следует сразу после ключевого слова interface. Отметим, что здесь выполняется общее правило использования предложения uses: если модуль, имя которого указано в предложении uses, использует другие модули, то имена этих модулей также должны быть указаны в предложении uses, причем до того, как они будут использованы.

Стандартные модули

Файл TURBO.TPL содержит все стандартные пакеты, кроме Graph и пакетов совместимости (Graph3 и Turbo3): System, Overlay, Crt, Dos и Printer. Эти пакеты загружаются в память вместе с Турбо-Паскалем и всегда вам доступны. Обычно файл TURBO.TPL хранят в одном каталоге с TURBO.EXE (или TPC.EXE). Вы можете хранить его и в другом каталоге, если он описан как каталог Турбо-Паскаля. Для этого необходимо с помощью TINST.EXE установить этот каталог в файле TURBO.EXE.

Используемые пакеты: нет

System содержит все стандартные и встроенные процедуры и функции Турбо-Паскаля. Любая подпрограмма Турбо-Паскаля, не являющаяся частью стандартного Паскаля и не находящаяся ни в каком другом модуле, содержится в System. Этот модуль присоединяется ко всем программам.

Используемые пакеты: нет

DOS определяет многочисленные паскалевские процедуры и функции, которые эквивалентны наиболее часто используемым вызовам DOS, как например, GetТime, SetТime, DiskSize и так далее. Кроме того, он определяет две программы низкого уровня МsDos и Intr, которые позволяют активизировать любой вызов MS-DOS или системное прерывание. Registers представляет собой тип данных для параметра в МsDos и Intr. Кроме того, определяются некоторые другие константы и типы данных.

Используемые пакеты: нет

Overlay - содержит инструменты для создания оверлейных программ. Программа OVERKAY - программа, которая загружается не вся, а по частям.

Используемые пакеты: нет

Crt обеспечивает набор специфичных для РС описаний констант, переменных и программ для операций ввода/вывода. Последние можно использовать для работы с экраном (задание окон, непосредственное управление курсором, цвет текста и фона). Кроме того, Вы можете осуществлять "необработанный" ввод с клавиатуры и управлять платой генерации звукового сигнала персонального компьютера. Этот модуль обеспечивает множество подпрограмм, которые были стандартными в версии 3.0.

Используемые пакеты: Crt

В модуле Printer дано описание переменной текстового файла Lst, которая связывается с драйвером устройства, позволяющим направлять стандартный для Паскаля вывод на печатающее устройство с помощью Write и Writeln. Например, включив Printer в свою программу, Вы можете сделать следующее:

Write (Lst,"Сумма " ,A:4 ," и " ,B:4 ," равна " ) ; C:=A + B; Writeln (Lst,C:8 ) ;

Используемые пакеты: Crt

Graph3 поддерживает полный набор графических подпрограмм для версии 3.0 - для обычной, расширенной графики и графики, использующей относительные команды. Они идентичны по имени, параметрами функции подпрограммам версии 3.0.

Используемые пакеты: Crt

Этот модуль содержит две переменные и несколько процедур, которые больше не поддерживаются Турбо-Паскалем. Они включают встроенную файловую переменную Кbd, булеву переменную CBreak и первоначальные целочисленные версии MemAvail и MaxAvail (которые возвращают размер свободной памяти в параграфах, а не в байтах, как это делают настоящие версии).

Используемые пакеты: Crt

Graph обеспечивает набор быстродействующих, эффективных графических подпрограмм, которые позволяют использовать в полной мере графические возможности Вашего персонального компьютера.

Этот модуль реализует независимый от устройства графический драйвер фирмы "Борланд", позволяющий поддерживать графические адаптеры типа СGА, ЕGА, Hercules, АТТ 400, МСGА, 3270 РС и VGА.

Написание собственных модулей

Допустим, Вы написали модуль IntLib, записали его в файл INTLIВ.PAS и оттранслировали на диск; получившийся в результате код находится в файле INTLIВ.ТРU. Для использования этого модуля в программе необходимо включить в нее оператор uses, указывающий компилятору, какой модуль используется. Ваша программа может выглядеть следующим образом:

program MyProg; uses IntLib;

Отметим, что Турбо-Паскаль предполагает, что файл, в котором находится модуль, имеет такое же имя, что и сам модуль. Если имя Вашего модуля МyUtilities, то Турбо-Паскаль будет искать файл с именем МYUTILIТ.PAS.

Компиляция модуля

Модуль компилируется точно так же, как компилируется программа: он создается с помощью редактора, а затем вызывается команда Соmpile/Соmpile (Компилировать/ Компилировать) (или нажимаются клавиши Аlt-С). Однако, вместо файла с расширением.ЕХЕ Турбо-Паскаль создает файл с расширением.ТРU (Turbо Раscal Unit - модуль Турбо-Паскаля). После этого Вы можете оставить этот файл как есть или же вставить его в ТURВО.TPL с помощью TPUMOVER.ЕХЕ.

В любом случае имеет смысл переслать файлы с расширением *.ТРU (вместе с исходными файлами) в каталог модулей, который определен с помощью команды О/D/Unit directories (Каталоги модулей). В одном исходном файле может находиться только один модуль, поскольку компиляция прекращается, как только обнаружен завершающий оператор end.

Пример :

Напишем небольшой модуль. Назовем его IntLib и вставим в него две простые подпрограммы для целых чисел - процедуру и функцию:

unit IntLib; interface procedure ISwap(var I,J: integer ) ; function IMax(I,J: integer ) : integer ; implementation procedure ISwap; var Temp: integer ; begin Temp:=I; I:=J; J:=Temp end ; {конец процедуры ISwap } function IMax; begin if I > J then IMax:=I else IMax:=J end ; {конец функции IMax } end . {конец модуля IntLib }

Введем эту подпрограмму, запишем ее в файл INTLIВ.PAS, а затем оттранслируем на диск. В результате получим код модуля в файле INTLIВ.ТРU. Перешлем его в каталог модулей. Следующая программа использует модуль IntLib:

program IntTest; uses IntLib; var A,B: integer ; begin Write ("Введите два целочисленных значения: " ) ; Readln (A,B) ; ISwap(A,B) ; Writeln ("A=" ,A," B=" ,B) ; Writeln ("Максимальное значение равно " ,IMax(A,B) ) ; end . {конец программы IntTest }

Все описания внутри модуля связаны друг с другом. Например, модуль Crt содержит все описания, необходимые для подпрограмм работы с экраном на Вашем персональном компьютере.