- •64 Жегуло а.И. Компьютерные науки 2-й семестр 2011-2012 гг. Компьютерные науки Лекции для студентов 1 курса мехмата, 2011-2012 уч. Г.
- •2 Семестр
- •16.Модули
- •16.1.Модуль и модульное программирование
- •16.2.Структура модуля
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Initialization //Раздел инициализации
- •Пример модуля и его использования
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Заголовок модуля
- •Раздел интерфейса interface
- •Раздел реализации implementation
- •Раздел инициализации initialization
- •16.4.Использование объявленных в модуле объектов
- •17.Файлы
- •17.1.Файлы. Классификация файлов
- •17.2.Организация работы с файлами
- •17.3.Подпрограммы для работы с файлами любых типов Связывание файловой переменной с файлом
- •Запись в файл
- •17.5.Обработка ошибок ввода-вывода
- •17.6.Текстовые файлы
- •17.6.1.Структура текстового файла
- •17.6.2.Особенности открытия текстовых файлов
- •17.6.3.Особенности чтения и записи для текстовых файлов
- •17.6.7.Поэлементная обработка текстовых файлов, состоящих из строковых значений и чисел
- •17.7.Типизированные файлы
- •17.7.1.Описание и структура типизированного файла
- •17.7.5.Сравнение текстовых и типизированных файлов
- •17.7.6.Пример работы с типизированными файлами из записей
- •18.Процедурные типы
- •18.1.Назначение процедурных типов
- •18.2.Описание процедурных типов и процедурных переменных
- •18.3.Присваивание процедурным переменным. Вызов подпрограмм через процедурные переменные
- •18.4.Процедурные переменные в качестве параметров
- •19.Рекурсия
- •19.1.Что такое рекурсия
- •19.2.Рекурсивные подпрограммы
- •19.3.Прямая и косвенная рекурсия
- •19.4.Предварительное (опережающее) описание подпрограммы
- •19.5.Опасности рекурсии
- •19.5.1.Бесконечная рекурсия
- •19.5.2.Глубокая рекурсия
- •19.5.3.Итерация и рекурсия, необоснованное применение рекурсии
- •19.6.Когда использовать рекурсию
- •19.7.Формы рекурсивных подпрограмм
- •19.8.Примеры рекурсивных программ
- •19.8.1.Вывод цифр целого числа в прямом порядке
- •19.8.2.Поиск максимального элемента массива
- •19.9.Задача о Ханойских башнях
- •20.Указатели
- •20.1.Указательные типы
- •Описание типизированного указателя
- •20.2.Операции с указателями
- •20.3.Примеры присваивания для указателей
- •20.4.Статические и динамические переменные
- •Создание новой динамической переменной базового типа и установка на нее указателя
- •Уничтожение динамической переменной, на которую ссылается указатель
- •Проблема потерянных ссылок
- •21.Динамические структуры данных
- •21.1.Данные статической структуры и данные динамической структуры
- •21.2.Односвязные линейные списки
- •21.2.1.Структура односвязного линейного списка
- •Вставка элемента после заданного элемента
- •21.3.Стеки
- •21.3.1.Реализация стека через односвязный линейный список
- •21.3.2.Применение стеков
- •21.3.3.Реализация стека на основе массива
- •21.4.Деревья
- •21.4.1.Основные определения
- •Алгоритм построения идеально сбалансированного дерева
- •21.4.3.Способы обхода дерева
- •Деревья поиска
- •Построение дерева поиска
17.6.7.Поэлементная обработка текстовых файлов, состоящих из строковых значений и чисел
Пусть описаны переменные var F:text; s:string[15]; x:integer; а каждая строки файла F содержит текст и число. |
|
Оператор readln(F, s, x) прочитает в переменную s либо все символы строки файла вплоть до признака конца строки, либо столько, сколько в ней поместится. Чтение в переменную x закончится ошибкой ввода.
Если текст и число в строке файла поменять местами, то оператор readln(F, x, s) успешно выполнит чтение.
При необходимости читать в строковую переменную из начала или середины строки файла надо либо использовать посимвольный ввод, либо прочитать всю строку и посимвольно ее анализировать.
Таким образом, проблем при чтении в строковую переменную не будет, если строка файла читается целиком или строковая переменная является последней в списке оператора ввода.
17.7.Типизированные файлы
17.7.1.Описание и структура типизированного файла
Описание файловой переменной:
var F :file of тип_компонентов, где тип_компонентов не может быть файловым, не может быть динамической структурой. Т.е. при описании типа компонентов должен быть известен размер компонента в байтах.
Например:
type Matrix=array[1..10,1..15] of real;
Person=record
FIO:string[20];
group:1..12
end;
var FI: file of integer; //файл из целых чисел
FM: file of Matrix; //файл из двумерных массивов
FP: file of Person; //файл из записей
Cтруктура типизированного файла:
компонент |
компонент |
. . . |
компонент |
Eof |
Типизированные файлы напоминают массивы: все компоненты файла одного и того же типа, каждый компонент имеет номер, который используется для прямого доступа к этому компоненту. Нумерация начинается с 0.
17.7.2.Особенности типизированных файлов
Типизированные файлы двоичные, т.е. содержат машинное представление данных, поэтому они не могут быть созданы, в отличие от текстовых файлов, с помощью программы-редактора.
Типизированный файл можно одновременно и читать, и писать. Процедуры Reset и Rewrite открывают файл и на чтение, и на запись, устанавливая файловый указатель на 0-ой компонент.
17.7.3.Дополнительные подпрограммы для организации прямого доступа
Текущая позицию файлового указателя
function FilePos(F): int64
Возвращает текущую позицию файлового указателя.
После открытия файла FilePos(F)=0
После завершения чтения всего файла FilePos(F)=FileSize(F)
Количество компонентов файла
function FileSize(F): int64
Возвращает количество компонентов файла.
Установка файлового указателя
procedure Seek(F, n)
Устанавливает файловый указатель на компонент с номером n.
Установка на начало файла: Seek(F,0)
Установка на последний компонент: Seek(F,FileSize(F)-1)
Усечение файла
procedure Truncate(F)
Усекает файл, отбрасывая компоненты с позиции файлового указателя до конца файла.
Удаление всех компонентов: Seek(F,0); Truncate(F) или проще: Rewrite(F).
17.7.4.Типичные задачи для типизированных файлов
Дан файл целых чисел:
var F:File of integer; x:integer;
Чтение файла от начала до конца
Вариант 1
Reset(F);
while not Eof(F) do Read(F,x); //Пока не наступит конец файла
//Номер прочитанного компонента равен FilePos(F)-1
Вариант 2
Reset(F);
for i:=0 to Filesize(F)-1 do Read(F,x) //Для всех компонентов файла
//Номер прочитанного компонента равен i.
Чтение файла в обратном порядке (с конца до начала)
Reset(F);
for i:=Filesize(F)-1 downto 0 do //Для всех компонентов файла с номером i от последнего до 0-го
begin Seek(F,i); Read(F,x) end
Замена только что прочитанного компонента файла на новый компонент
Reset(F);
while not Eof(F) do
begin Read(F,x);
if (x надо заменить на xnew) then
begin Seek(FilePos(F)-1); //Возврат на позицию, откуда был прочитан x
write(F,xnew) //Запись нового компонента
end
end
Удаление компонента из типизированного файла
Вариант 1. Найти в файле удаляемый компонент, скопировать следующие за ним компоненты на одну позицию ближе к началу файла, затем удалить последний компонент/
for i:=p+1 to Filesize(F)-1 do //p – номер удаляемого компонента
begin
Seek(F,i);
read(F,x);
Seek(F,i-1);
write(F,x);
end;
Truncate(F); //Удаление последнего компонента
Вариант 2. Переписать в новый файл все компоненты, кроме удаляемого.
Rewrite(Fnew); //Открытие нового файла
Seek(F,p); //p – номер удаляемого компонента
while not Eof(F) do
begin
read(F,x);
if (FilePos(F)-1)<>p
then write(Fnew,x);
end;
Вариант 3. На место удаляемого компонента записать последний компонент файла, затем последний удалить. Преимущество – малое число операций. Недостаток – нарушается порядок компонентов файла.
Seek(F,Filesize(F)-1); //Установка указателя на последний компонент
Read(F,y); //Чтение последнего компонента
Seek(F,p); //p – номер удаляемого компонента
write(F,y);
Seek(F,Filesize(F)-1);
Truncate(F); //Удаление последнего компонента