Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Delphi_part2

.pdf
Скачиваний:
9
Добавлен:
01.03.2016
Размер:
951.59 Кб
Скачать

Продолжение таблицы 10.1

Содержание записей проекта и требования к обработке

4

Номер комнаты в общежитии, жилая площадь, число жильцов,

 

наличие балкона.

 

Сортировка выбором по номеру комнаты. Комплексная сортировка

 

по наличию балкона + по площади, приходящейся на одного жильца.

 

Выборка комнат, где площадь на одного жильца меньше

 

санитарной нормы.

 

Подсчет количества жильцов в общежитии.

5

Номер корпуса, номер аудитории, количества мест, наличие

 

экрана.

 

Комплексная сортировка вставкой по номеру корпуса + номер

 

аудитории. Комплексная сортировка по наличию экрана + количество

 

мест.

 

Выборка аудиторий с ТСО с числом мест не менее заданного.

 

Подсчет общего количества мест в заданном корпусе.

6

Фамилия спортсмена, результат на 100-метровке, результат по

 

прыжкам в длину, результат по прыжкам в высоту.

 

Сортировка обменом по каждому виду и определение места

 

спортсмена в данном виде.

 

Сортировка по сумме мест во всех видах.

7

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

 

атмосферное давление, влажность.

 

Сортировка выбором по дате. Комплексная сортировка по

 

температуре + по давлению + по влажности.

 

Определение среднего арифметического для температуры

 

заданного месяца.

 

Вывод дней месяца, когда температура превышала среднее

 

значение.

8

Фамилия больного, номер палаты, температура, давление, пульс.

 

Сортировка вставкой по фамилии. Комплексная сортировка по

 

палате + по температуре + по давлению + по частоте пульса.

 

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

 

Вывод списка больных с давлением выше допустимого.

9

Группа, фамилия старосты, количество контрактников, количество

 

бюджетников.

 

Сортировка обменом по группам. Комплексная сортировка по

 

общему количеству студентов в группе + по количеству бюджетников.

 

Вывод перечня групп с общим количеством студентов.

 

Подсчет общего количества контрактников и бюджетников.

71

10.4 СОДЕРЖАНИЕ ОТЧЕТА

Наименование работы.

Цель работы.

Краткая характеристика типа «Запись».

Интерфейс созданного проекта.

Текст модуля проекта с пояснениями в виде комментариев.

Результаты тестирования проекта в виде копий окон.

Выводы.

КОНТРОЛЬНЫЕ ВОПРОСЫ

Характеристика типа «Запись». Описание типа, доступ к полям. Операции над записями.

Работа с массивами записей.

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

Написать процедуру для реализации запроса к массиву записей по указанию преподавателя.

Написать процедуру для реализации сортировки массива записей по правилу, заданному преподавателем.

72

11 ЛАБОРАТОРНАЯ РАБОТА № 11. РАБОТА С ТИПИЗИРОВАНЫМИ ФАЙЛАМИ

Цели работы:

Ознакомиться с принципами организации записей и хранением информации в типизированных файлах.

Познакомиться со способами описания типизированных файлов в

Object Pascal.

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

Освоить алгоритмы обработки типизированных файлов.

11.1 КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Под файлом понимается именованная область внешней памяти ПК (жесткого диска, гибкой дискеты, диска CD), представляющая собой последовательность байтов.

Любой файл имеет такие характерные особенности:

у него есть имя, что дает возможность программе работать одновременно с несколькими файлами;

файл не знает, то есть не содержит информацию о том, какого типа данные в нем находятся. Интерпретация последовательности байтов в файле зависит от программы, которая обрабатывает файл.;

длина файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Файл содержит специальный признак конца файла.

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

Типизированный файл - это последовательность данных одного типа. Каждую единицу данных файла в типизированном файле называют

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

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

11.1.1 Объявление файловой переменной

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

73

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

Объявление типа для файловой переменной выглядит так:

Type

<имя типа> = file of <тип записи>;

Рисунок 11.1 – Структура описания типа файловой переменной

Ниже приводится несколько примеров описания таких типов.

type

TMyCharFile = file of char; // файл символов

TMyRealFile = file of real; // файл вещественных чисел

TMyIntFile = file of integer; // файл целых чисел

Файловая переменная объявляется так же, как и любая другая переменная, например, так:

var f1: TMyIntFile; f2: TMyCharFile;

ObjectPascal позволяет объявлять файловые переменные и без введения соответствующего типа, то есть допустимо такое описание:

var f1: file of integer; f2: file of char;

Но приведенный вариант описания применять нецелесообразно, так как переменные, объявленные таким образом в разных местах, будут считаться несовместимыми, несмотря на идентичность типов данных. Кроме того, такое указание типа недопустимо при описании формальных параметров в процедурах и функциях

11.1.2 Назначение файла файловой переменной

Объявление файловой переменной задает только тип элементов файла. Для того чтобы программа могла выводить данные в файл или считывать данные из файла, необходимо связать файловую переменную с именем конкретного файла. Такая связь устанавливается с помощью процедуры

AssignFile.

Обращение к этой процедуре выглядит так:

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

Имя файла задается в виде строки символов, согласно принятым в Windows правилам. Оно может быть полным, т. е. состоять не только непосредственно из имени файла, но и включать путь к файлу (имя диска, каталогов и подкаталогов).

74

Ниже приведены примеры вызова процедуры AssignFile:

AssignFile (f1, 'a:\result.txt') ;

AssignFile (f2, '\students\ivanov\komi .txt') ; fname := 'otchet.txt') ; AssignFile[ft,fname) ;

Обратите внимание, процедура AssignFile устанавливает связь между файловой переменной и именем файла и безразлична к тому, существует ли файл с указанным именем или нет.

11.1.3 Открытие файла

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

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

Реализуется такой способ открытия файла процедурой Rewrite. Обращение к этой процедуре выглядит так:

Rewrite ( <файловая переменная>);

Ниже приведен пример вызова процедуры Rewrite:

Rewrite (f1) ;

Второй способ открытия файла, предполагает, что файл существует, и будет обрабатываться.

Реализуется такой способ открытия файла процедурой Reset. Обращение к этой процедуре выглядит так:

Reset ( <файловая переменная>);

Ниже приведен пример вызова процедуры Reset:

Reset (f1) ;

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

Если попытаться с помощью процедуры Reset открыть несуществующий файл, то возникнет исключительная ситуация и выполнение программы будет прервано. Прерывания программы можно избежать, если воспользоваться конструкцией try … except … end.

Ниже приводится пример, в котором производится попытка открыть файл ’someFile.dat’ с помощью процедуры Reset, но если возникает исключительная ситуация, то такой файл создается с помощью процедуры Rewrite.

75

assignFile(f1,’someFile.dat’);

try Reset(f1); except rewrite(f1); end;

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

assignFile(f1,’someFile.dat’); {$I-} Reset(f1) ; {$I+};

if IOResult <> 0 then rewrite(f1);

В приведенном примере для анализа успешности завершения операции связанной с вводом–выводом используется функция IOResult, которая возвращает ноль при успешном завершении операции. Особенность применения этой функции состоит в том, что на время выполнения контролируемой операции должен быть отключен контроль системы за выполнением контролируемой операции. Это делается с помощью директив компилятору {$I-} и {$I+}.

11.1.4 Текущая позиция файла

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

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

Обращение к этой процедуре выглядит так:

Seek ( <файловая переменная>, <номер записи>);

Ниже приведены примеры вызова процедуры Rewrite.:

Seek(f1,0); // установка файла в начало

Seek (f1,10); // переход к записи файла с номером 10

Seek (f1, FileSize(f1)-1); // переход к последней записи файла

Seek (f1, FileSize(f1)); // переход к концу файла

В последних примерах для определения номера последней записи используется функция FileSize, возвращающая количество записей в файле. Так как номера записей начинаются с 0, то номер последней записи на единицу меньше количества записей в файле.

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

Обращение к этой функции выглядит так:

FilePos ( <файловая переменная>);

76

11.1.5 Чтение данных из файла

Чтение из файла выполняется при помощи процедуры read. Обращение к этой процедуре выглядит так:

Read ( <файловая переменная>, <переменная>);

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

После считывания записи из файла текущая позиция файла увеличивается на единицу, как бы готовя файл к считыванию следующей записи. После считывания последней записи файла, текущая позиция файла выходит за его пределы. В этом случае фиксируется ситуация «конец файла». Отследить эту ситуацию можно с помощью функции eof. Значение этой функции равно false, если прочитанный элемент данных не является последним в файле, т.е. возможно дальнейшее чтение. Если прочитанный элемент данных является последним, то значение eof равно true.

Обращение к этой функции выглядит так:

Eof(<файловая переменная>);

Значение функции eof можно проверить сразу после открытия файла. Если при этом оно окажется равным true, то это значит, что файл не содержит ни одного элемента данных, т.е. является пустым (размер такого файла равен нулю).

11.1.6 Запись данных в файл

Запись данных в файл осуществляется с помощью процедуры write. Обращение к этой процедуре выглядит так:

write ( <файловая переменная>, <переменная>);

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

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

11.1.7 Обрезка “хвоста” файла

Файл можно не только расширять, путем создания дополнительных записей, но и сокращать, удаляя последние записи. Для этого используется процедура truncate.

Обращение к этой процедуре выглядит так:

truncate ( <файловая переменная >);

Эта процедура удаляет все записи файла, начиная с текущей позиции и до

77

конца файла, то есть она как бы переносит конец файла в текущую запись.

11.1.8 Закрытие и удаление файлов

После окончания работы с файлом, его следует закрыть. Для закрытия используется процедура Close.

Обращение к этой процедуре выглядит так:

CloseFile ( <файловая переменная >);

При необходимости файл можно удалить. Для этого используется процедура Erase.

Обращение к этой процедуре выглядит так:

Erase ( <файловая переменная >);

11.2 ПЕРЕЧЕНЬ ОСНОВНЫХ ПРОЦЕДУР И ФУНКЦИЙ ДЛЯ РАБОТЫ С ТИПИЗИРОВАННЫМИ ФАЙЛАМИ

Таблица 11.1 – Основные процедуры, обеспечивающие работу с файлами

Назначение операции

Синтаксис операции

Определение имени

AssignFile( <файловая переменная>, <имя файла> )

Создание (очистка)

Rewrite( <файловая переменная > )

Установка в начало

Reset( <файловая переменная > )

Закрыть файл

CloseFile ( <файловая переменная > )

Удалить файл

Erase( <файловая переменная > )

Размер файла

FileSize(<файловая переменная >)

Номер текущей записи

FilePos(<файловая переменная >)

Перейти к записи

Seek( <файловая переменная >, <номер записи> )

Записать в текущую

Write(<файловая переменная >, <переменная соотв.

файловую позицию

типа>)

Читать из текущей

Read(<файловая переменная >, <переменная соотв.

файловой позиции

типа>

Обрезать «хвост»

Truncate(<файловая переменная >)

Конец файла

Eof( <файловая переменная > )

11.3 СОЗДАНИЕ ПРОЕКТА «РЕЗУЛЬТАТЫ АТТЕСТАЦИИ»

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

78

Реализация проекта находится в папке kid\pub\subject\1_kurs\ projectToLection\.To_lection_18_19.

Данный проект можно рассматривать как пример выполнения задания к самостоятельной работе. Точного следования этому образцу от студента не требуется.

11.3.1 Требования к проекту

Проект должен обеспечить:

Просмотр записей файла в StringGrid.

Добавление группы записей из StringGrid к файлу.

Поиск записи по заданной фамилии .

Удаление записи.

Подсчет количества отличников в файле.

Сохранение файла под другим именем.

Сортировку файла по фамилиям и по результатам успеваемости.

Вставку записи в упорядоченный файл.

Удаление записи из упорядоченного файла.

11.3.2 Интерфейс пользователя для проекта

Интерфейс разрабатываемого проекта представлен на рисунке 11.2. Интерфейс проекта предполагает, что исходная информация, которую необходимо добавить к файлу, будет храниться в ячейках компонента StringGrid1. Содержимое файла будет отображаться в компоненте StringGrid2. Результаты сортировки файла и результаты обработки отсортированного файла будут записываться в компонент StringGrid3.

StringGrid1

 

StringGrid2

 

StringGrid3

 

 

 

 

 

gridMenu

openDialog

fileMenu

saveDialog

sortMenu

Рисунок 11.2 – Интерфейс проекта

79

Каждый из этих компонентов имеет встроенное меню (popupMenu), которое будет появляться при нажатии правой кнопки мышки, если курсор находится в поле компонента. Компонент PopupMenu расположен на закладке Standard палитры компонентов. Он видим только во время конструирования формы, и может располагаться где угодно. Для того чтобы связать это меню с каким-то компонентом, следует настроить свойство PopupMenu этого компонента, выбрав нужное меню из списка. Во избежание путаницы, следует внимательно подходить к наименованию меню. В нашем проекте будут использоваться названия для меню компонентов StringGrid и их функций приведенные в таблице 11.2.

Таблица 11.2 – Названия пунктов меню интерфейса пользователя

Компонент

Имя

Назначение пункта меню

Имя (Name)

 

PopupMenu

(Caption)

 

пункта меню

StringGrid1

gridMenu

Добавить строку к StringGrid1

mnuAddRow

 

 

Удалить текущую

строку из

mnuDelRow

 

 

StringGrid1

 

 

StringGrid2

fileMenu

Показать файл

 

mnuShowFile

 

 

Добавить в файл из StringGrid1

mnuAddToFile

 

 

Найти запись по фамилии

mnuFindFam

 

 

Удалить запись по фамилии

mnuDelFam

 

 

Подсчет количества отличников

mnuCalc5

 

 

Сохранение файла

под другим

mnuSaveAs

 

 

именем

 

 

StringGrid3

sortMenu

Упорядочить по фамилии

mnuSortFam

 

 

Найти по фамилии

 

mnuFindInSort

 

 

Удалить запись

 

mnuDelInSort

 

 

Добавить записи из StringGrid1

mnuAddToSort

Для того чтобы настроить нужные функции меню следует сделать двойной щелчок по пиктограмме меню и в появившемся диалоге выделить свободную строку для пункта меню. Затем в инспекторе объектов настроить свойства Caption и Name.

Каждый пункт в PopupMenu является объектом, поэтому с ним связаны не только свойства Caption и Name но и событие onClick. Шаблон функции обработки этого события можно создать, используя закладку Events инспектора объектов.

Для удобства выбора имени файла в конструкторе формы, показанном на рисунке 11.2, предусмотрены компоненты OpenDialog и SaveDialog которые можно найти на закладке Dialogs палитры компонентов. Первый из них будет вызываться при нажатии кнопки «Имя файла» для выбора имени файла при его открытии, а второй при вызове функции меню «Сохранение файла под другим именем».

80

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]