- •Указания по выполнения практических и лабораторных работ
- •Языки программирования
- •Трансляторы
- •Язык программирования Паскаль
- •Использование среды программирования турбо паскаль
- •Типы вычислительных процессов
- •Блок-схемы алгоритмов
- •Примеры составления блок-схемы алгоритма
- •Основные файлы пакета Турбо Паскаль
- •Запуск интегрированной среды программирования Турбо Паскаль
- •Работа с меню ис
- •Меню File
- •Меню Run
- •Меню Compile
- •Меню Debug
- •Меню Tools
- •Меню Options
- •Меню Window
- •Меню Help
- •Процедуры ввода-вывода
- •Оператор записи WriteLn аналогичен процедуре Write, но после вывода последнего в списке значения для текущей процедуры WriteLn происходит перевод курсора к началу следующей строки.
- •Пример программы с использованием процедур ввода-вывода данных с различными форматами выводимых данных
- •Операторы языка Паскаль
- •Оператор присваивания
- •Оператор безусловного перехода (go to)
- •Оператор выбора case
- •Оператор повтора for
- •Примеры программ с использованием оператора for
- •Оператор повтора Repeat
- •Пример программы с использованием оператора repeat
- •Пример программы с использованием операторов присваивания, повтора и выбора
- •Пример программы с использованием оператора повтора while
- •Примеры описания одномерных и двумерных массивов
- •Действия над массивами
- •Действия над элементами массива
- •Ввод-вывод элементов массива
- •Пример программы ввода-вывода одномерного массива
- •Пример программы ввода-вывода двумерного массива
- •Пример программы нахождения в одномерном массиве максимального элемента
- •Порядок выполнения работы
- •Порядок выполнения работы
- •Основные логические структуры:
- •Встроенные функции и процедуры
- •Арифметические процедуры и функции
- •Скалярные процедуры и функции
- •Функции преобразования типов
- •Процедуры управления программой
- •Специальные процедуры и функции
- •Вызов стандартной процедуры или функции
- •Пример программы с использованием функции, определенной пользователем
- •Пример программы с использованием процедуры, определенной пользователем
- •Механизм передачи параметров
- •Нетрадиционное использование подпрограмм. Косвенная рекурсия
- •Линейный поиск
- •Линейный поиск в упорядоченном массиве данных
- •Бинарный (двоичный) поиск
- •Пример программы с использованием алгоритма бинарного поиска
- •Методы внутренней сортировки
- •Сортировки включением
- •Сортировка выбором
- •Реализация алгоритмов обменных сортировок при написании программы на Паскале
- •Шейкерная сортировка
- •Пирамидальная сортировка
- •Обменная сортировка разделением
- •Естественное слияние
- •Многопутевое слияние
- •Пример разработки собственного модуля
- •Скалярные процедуры и функции
- •Процедуры управления программой
- •Специальные процедуры и функции
- •Вызов стандартной процедуры или функции
- •Формат описания строкового типа
- •Фрагмент описания строковых данных
- •Стандартные строковые процедуры и функции
- •Пример программы работы со стандартными строковыми процедурами и функциями Порядок выполнения работы
- •Примеры программ работы со строковыми переменными
- •Пример программы работы с записями
- •Пример программы работы с записями
- •Операции над множествами
- •Объединение Пересечение Разность
- •Формат описания файлового типа
- •Средства обработки файлов
- •Текстовые файлы
- •Пример программы работы с текстовым файлом
- •Средства работы с типизированными файлами
- •Пример программы работы с типизированным файлом
- •Средства работы с нетипизированными файлами
- •Пример программы для работы с типизированными файлами
- •Распределение памяти при выполнении программы
- •Пример программы распределения памяти и получения доступа к полям psp.
- •Статические и динамические переменные
- •Указатели
- •Типизированные указатели
- •Нетипизированный указатель (pointer)
- •Доступ к переменной по указателю
- •Управление динамической памятью
- •Процедуры динамического распределения
- •Пример программы с использованием динамической памяти
- •Пример программы создания и использования связанного списка
- •Параметр процедурного типа
Средства работы с типизированными файлами
Для работы с файлами прямого доступа дополнительно можно использовать следующие средства:
Truncate(var F);
Процедура уничтожает все компоненты файла F, начиная с места текущего положения файлового указателя.
FilePos(var F) : Longint
Функция возвращает для файла F текущую файловую позицию (номер записи, на которую она установлена) в виде значения типа Longint
FileSize(var F) : Longint
и его размер (количество записей) в виде значения типа Longint.
Для пустого файла вызов FileSize возвращает значение 0. Локализация ошибок при обращении к внешним носителям для обоих функций производится через IOresult.
Для того чтобы очередная запись могла быть записана в конец типизированного файла, необходимо перевести текущую файловую позицию в конец файла. Когда создается новый файл, это происходит автоматически после формирования каждой очередной записи. Если файл уже создан и файловая позиция, установленная по Seek, находится где-нибудь в начале файла (FilePos(F) < FileSize(F)), то в конец файла ее позволяет перевести вызов
Seek(F, FiieSize(F));
В каждом файле число логических и физических записей совпадает, а при позиционировании номер физической записи на единицу меньше номера логической записи.
Когда записи располагаются в неотсортированном по фамилиям порядке, поиск необходимо осуществлять последовательно по всему файлу. Такое расположение записей требует значительных расходов ресурсов системы для поиска нужной записи. Любая программная система по манипулированию базами данных всегда имеет в своем составе средства упорядочения записей по ключу.
Ключом называется совокупность знаков, идентифицирующая запись в файле. Ключ сортировки — одно или несколько полей в записи файла, по содержимому которых осуществляется упорядочение его записей, например список учащихся в классном журнале отсортирован по ключу фамилия.
На практике это выражается в создании так называемых индексных файлов по отношению к главному файлу данных. Индексные файлы содержат номера записей главного файла, отсортированных по конкретному ключу. Такое построение позволяет экономить время обращения к внешним носителям, так как во всех перемещениях при сортировке участвуют записи малой длины, содержащие номера записей главного файла в соответствии с ключом сортировки.
Пример программы работы с типизированным файлом
Пусть требуется составить программу, которая создает на диске файл данных “Телефонного справочника”, обеспечивает ввод и изменение данных, поиск номера телефона по фамилии абонента.
Program BookPhone; {Телефонный справочник}
Uses Crt;
Type
StFio=string[20];
StPhone=string[10];
RecBook=record {Запись сведений об абоненте}
FIO:StFio;
Phone:StPhone;
End;
Var
BookFile:file of RecBook; {Переменная для файла с записями RecBook}
Work:RecBook; {Переменная для доступа к записям}
Vid:byte;
End_Menu:boolean;
Name:String[12];
Procedure Name_File; {Ввод имени файла данных}
Begin
Write(‘Введите имя файла данных телефонного справочника’);
Readln(Name);
End;
Procedure AddRec; {Добавление записи в файл}
Begin
Writeln(‘Ввод записи № ’, FilePos(BookFile)+1); {+ 1 - указывает номер физической записи (к номеру логической записи добавляется 1) }
With Work do
Begin
Writeln(‘Введите фамилию ’);
Readln(FIO);
Write(‘Введите номер телефона ’);
Readln(Phone);
Write(BookFile,Work); {Записать в файл значение переменной Work: фамилию и номер телефона}
End;
End;
Procedure Create_Book_Phone; {Создание нового файла данных}
Var
Ind,Count:integer;
Begin
Name_File;
Assign(BookFile, Name); {Открыть новый файл для записи}
Rewrite(BookFile);
Writeln(‘Создание записей файла ’, Name);
Write(‘Введите число записей в справочнике’);
Readln(Count);
For Ind:=1 to Count do
AddRec;
Writeln(‘Создание фала завершено’);
Writeln(‘Файл данных имеет , FileSize(BookFile), записи’);
Close(BookFile);
End;
Procedure OutputRec; {Вывод текущей записи на экран}
Begin
Read(BookFile,Work);
With Work do
Begin
Write(‘Запись № ’,FilePos(BookFile),’:’);
Writeln(‘ФИО: ’, Fio, ‘телефон: ’,Phone);
End;
End;
Procedure OutputAllRec; {Вывод всех записей файла на экран}
Begin
Name_File;
Assign(BookFile,Name);
{$I-}
Reset(BookFile);
{$I+}
if IOResult=0 then
begin
Seek(BookFile,0); {Установка на первую запись}
Writeln(‘Вывод телефонного справочника из файла’, Name);
While (not EOF(BookFile)) do
OutPutRec;
End
Else
Writeln(‘Файла с именем ’ +Name+’ на диске нет’);
End;
Procedure UpdateRec;
Var
NumRec: LongInt;
Begin
Name_File;
Assign(BookFile,Name); {Открыть новый файл для записи}
{$I-}
Reset(BookFile);
{$I+}
if IOResult=0 then
begin
Write(‘Укажите номер изменяемой записи’);
Readln(NumRec);
Seek(BookFile,NumRec-1); {Установка файловой позиции по указанному номеру записи}
Writeln(‘–Старое значение записи:’);
OutputRec; {Вывод записи и переход на следующую}
Seek(BookFile,NumRec-1); {Возврат на прежнюю позицию}
Writeln(‘Задаем новое значение ’, NumRec, ‘записи’);
AddRec;
Close(BookFile);
End
Else
Writeln(‘Файла с именем ’+Name+’ на диске нет’);
End;
Procedure AddRecToEnd; {добавление записи в конец файла}
Begin
Name_File;
Assign(BookFile,Name);
{$I-}
Reset(BookFile);
{$I+}
if IOResult=0 then
begin
Seek(BookFile,FileSize(BookFile)); {Установка текущей позиции в конец файла}
AddRec;
Writeln(‘Измененный файл данных имеет’, FileSize(BookFile),’записи’);
Close (BookFile);
End
Else
Writeln(‘Файла с именем ’+Name+’ на диске нет);
End;
Procedure FindFio; {Поиск номера телефона по фамилии абонента}
Var
BookFile:file of RecBook;
Work:RecBook;
Maska:StFio;
Rez_Find:boolean;
CountRec:integer;
Begin
Name_File;
Assign(BookFile,Name);
{$I-}
Reset(BookFile);
{$I+}
if IOResult=0 then
begin
Write(‘Введите фамилию для поиска’);
Readln(Maska);
RezFind:=False;
CountRec:=0;
While(not Eof(BookFile)) do {Просмотреть все записи до конца файла}
Begin
Read(BookFile,Work);
With Work do
If Pos(Maska,Fio)<>0 then{Найдена запись абонента с указанной фамилией}
Begin
Rez_Find:=True;
Inc(CountRec);
Writeln(‘Фамилия ’, Fio,’телефон ’,Phone);
End;
End;
If Rez_Find then
Writeln(‘Число записей для ’, Maska,’=’,CountRec)
Else
Writeln(‘В справочнике нет абонентов с фамилией ’, Maska);
Close(BookFile);
End
Else
Writeln(‘Файла с именем ’+Name+’ на диске нет’);
End;
{Основная программа}
Begin
ClrScr;
End_Menu:=False;
Repeat {Повторять показ меню, пока End_Menu=False}
Writeln(‘Телефонный справочник ’);
Writeln(‘Выберите вид работы ’);
Writeln(‘1-создание нового файла ’);
Writeln(‘2-просмотр списка справочника ’);
Writeln(‘3-изменение записи’);
Writeln(‘4-дополнение справочника’);
Writeln(‘5-поиск абонента ’);
Writeln(‘0-завершение работы ’);
Write(‘Ваш выбор ’);
Readln(Vid);
Case Vid of {Вызов разных процедур в зависимости от вида работы}
1: Create_Book_Phone;
2:OutPutAllRec;
3:UpdateRec;
4:AddRecToEnd;
5:FindFio;
0:End_Menu:=True;
end;
Writeln(‘Нажмите клавишу Enter’);
Readln;
ClrScr;
Until End_Menu; {Больше не выводить меню)
End.
В начале программы очищается экран, переменной End_Menu присваивается значение False, и затем на него с помощью оператора повтора repeat выводится текст меню из шести пунктов. В заключение списка вариантов меню выводится запрос и считывается значение переменной Vid, задаваемое пользователем в соответствии с избранным видом работы со справочником.
В зависимости от значения селектора Vid оператор выбора case осуществляет выбор, т. е. выбирают соответствующую значению константы выбора процедуру (например, если Vid=2, то вызывается процедура OutputAllRec для вывода всего содержимого справочника). После выполнения процедуры управление программой передается в конец оператора case, и, так как значение переменной End_Menu не равно True, оператор повтора repeat выполняется вновь, очищая экран и выводя список меню, и так до тех пор, пока пользователь выберет завершение работы. В результате этого переменной Vid будет присвоено значение 0, из-за чего в операторе case переменной End_Menu будет присвоено значение True, и цикл repeat завершится.
В начале процедуры создания нового файла данных справочника записан вызов процедуры задания имени файла данных Name_File. Процедура Name_File записана выше по тексту программы. Создание нового файла данных производится с использованием стандартной процедуры Rewrite. Ввод записей об абонентах описывается с использованием оператора повтора for, параметр Ind которого, изменяясь от 1 до числа записей Count, будет указывать порядковый номер записи с данными абонента в файле. Добавление одной записи в файл данных сделанов виде процедуры AddRec, которая также записана выше в тексте программы.
В окончании процедуры организуется вывод сообщения о результатах создания файла. Для измерения размера файла в записях используется функция FileSize.
Для сокращения записи при обращении к полям Fio и Phone переменной типа запись Work используется предложение with Work do.
Для вывода на экран всех записей файла сначала, используется функция IOresult, выполняется проверку, есть ли данный файл на диске. Если функция IOresult возвращает значение, отличное от 0, то на экран выводится сообщение о том, что данного файла на диске нет, иначе позиционируется указатель на первую запись Seek(BookFile, 0), а затем, используя оператор повтора while, записывается вызов процедуры вывода на экран одной записи OutputRec. Условием окончания цикла while будет выражение Eof(BookFile). Как только оно выполнится, цикл завершится. Данные всех записей файла выведены на экран.
В процедуре поиска номера телефона описаны локальные переменные: Maska типа StFio, которая будет принимать значение фамилии искомого абонента; Rez_Find типа boolean, которая будет принимать значения True или False в зависимости от результатов поиска; CountRec типа integer, значение которой будет равно числу записей с такой фамилией.
После записи запроса имени файла данных справочника и проверки есть ли он на диске, в случае если файл есть, записывается запрос о фамилии искомого абонента. Перед поиском присвоено значения Rez_Find:=False и CountRec:=0. Просмотр всех записей файла данных при поиске записан, используя оператор повтора while. Условие завершения поиска- Eof(BookFile) - достижение конца файла. Если значение поля Fio очередной записи совпадает со значением переменной Maska, то переменной Rez_Find присваивается значение True (абонент найден), значение переменной CountRec увеличивается на 1 и печатается сообщение о фамилии и номере телефона найденного абонента.
Порядок выполнения работы
Изучить теоретические сведения по теме “ Разработка программы для работы с типизированным файлом”.
Получить у преподавателя индивидуальное задание и разработать программу для работы с типизированным файлом согласно заданному варианту.
Показать работающую программу преподавателю.
Ответить на контрольные вопросы.
Контрольные вопросы
Понятие типизированного файла.
Средства работы с типизированными файлами.
Пример программы для работы с типизированными файлами.
Лабораторная работа № 30
Разработка программы для работы с нетипизированным файлом
Цель работы: формирование знаний и умений по работе с нетипизированными файлами.
Краткие теоретические сведения
Нетипизированные файлы
Файлами, поддержка которых осуществляется с максимально возможной скоростью являются нетипизированные файлы. Введение таких файлов в систему Турбо Паскаль было вызвано стремлением повысить эффективность программ, участвующих в интенсивном обмене с внешними наборами данных. Эти файлы в отличие от текстовых и типизированных не имеют строго определенного типа.
Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Представление Char или Byte не играет никакой роли, а важно лишь относительно объема занимаемых данных. Для определения в программе нетипизированного файла служит зарезервированное слово File:
Var
UntypedFile : File;
Внутренняя поддержка таких файлов выглядит наиболее близкой к аппаратной поддержке работы с внешними носителями. За счет этого достигается максимально возможная скорость доступа к наборам данных. Для нетипизированных файлов не нужно терять время на преобразование типов и поиск управляющих последовательностей, достаточно считать содержимое файла в определенную область памяти. Нетипизированный файл является файлом прямого доступа, что говорит о возможности одновременного использования операций чтения и записи. Для таких файлов самым важным параметром служит длина записи в байтах. Открытие нетипизированного файла с длиной записи в 1 байт можно выполнить следующим образом:
Rewrite(UntypedFile, 1) ; или
Reset(UntypedFile, 1) ;
Второй параметр, предназначенный только для использования с нетипизированными файлами, задает длину записи файла на сеанс работы.
Особенность аппаратной поддержки заключается в том, что при обращении к внешнему устройству минимально возможным объемом для считывания являются 128 байт. В стремлении добиться наибольшей эффективности файловых операций в Турбо Паскале принято соглашение, по которому длина записи нетипизированного файла по умолчанию составляет 128 байт. Поэтому после открытия файла с помощью вызовов:
Rewrite(UntypedFile) ; или
Reset(UntypedFile) ;
все процедуры и функции, обслуживающие файлы прямого доступа, работают с записями длиной 128 байт. Каждый пользователь для своих программ может выбрать наиболее подходящий размер записи.
Используя для базовых операций ввода-вывода с нетипизированными файлами стандартные процедуры Read и Write, нельзя добиться большой эффективности в скорости передачи данных. Поэтому только для данного типа файлов в Турбо Паскаль введены две новые процедуры, поддерживающие операции ввода-вывода с более высокой скоростью.