- •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.Текстовые файлы
17.6.1.Структура текстового файла
строка |
Eoln |
строка |
Eoln |
...... |
строка |
Eof |
Текстовый файл – это последовательность строк различной длины. Каждая строка состоит из кодов символов, заканчивается признаком конца строки Eoln (End of line, это символ #13 «возврат каретки» и символ #10 «перевод строки»). В конце файла признак конца файла Eof (End of file). Если два признака Eoln или Eoln и Eof идут подряд, это воспринимается как пустая строка. Например, текст
|
в текстовом файле будет представлен в следующем виде: |
|
В строке файла отдельные слова и символьные представления чисел разделены пробельными символами: символом пробела #32 и символом табуляции #9.
17.6.2.Особенности открытия текстовых файлов
Для одного текстового файла нельзя одновременно читать и писать:
Reset открывает текстовый файл только для чтения;
Rewrite открывает новый (пустой) файл только на запись;
Append открывает файл для записи в конец файла.
procedure Append(F)
Процедура применима только для текстовых файлов. Файл должен быть закрыт.
Файловый указатель устанавливается на конец файла. Если файл не существует, он создается.
Таким образом, писать можно либо в пустой текстовый файл, либо в конец существующего файла после уже имеющихся в файле данных. При необходимости изменить характер работы с текстовым файлом (например, после записи в файл прочитать его содержимое) надо его закрыть и заново открыть процедурой Reset.
17.6.3.Особенности чтения и записи для текстовых файлов
Особенности состоят в следующем:
Процедуры Read и Readln допускают чтение из файла значений только целых, вещественных, символьных и строковых типов. При чтении очередная часть строки файла интерпретируется как символьное представление значения, тип которого определяется типом переменной, в которую это значение должно быть прочитано. При несовместимости по присваиванию возникает ошибка ввода.
Процедуры Write и Writeln допускают запись в файл значений только целых, вещественных, символьных, строковых и булевских типов. При записи числовых значений они предварительно преобразуются в символьное представление, а логические значения – в строковые аналоги TRUE или FALSE. При записи нескольких значений в одну строку файла их надо разделять пробельными символами.
Для записываемого значения любого типа можно указать ширину поля вывода, т.е. количество символов в символьном представлении, например, write(x:6). Если ширина поля больше количества символов в представлении, слева добавляются пробелы. При записи вещественных чисел можно указать ширину поля вывода и количество знаков после десятичной точки: например, write(x:8:5), выводимое число округляется.
Только для текстовых файлов можно использовать процедуры Readln и Writeln. Процедура Readln после чтения пропускает оставшиеся непрочитанными символы текущей строки файла до конца строки, признак конца строки Eoln и устанавливает файловый указатель после Eoln (на начало следующей строки или на признак Eof конца файла). Процедура Writeln после выведенных символов записывает признак конца строки Eoln (символы #13 и #10) и устанавливает файловый указатель после него на конец файла.
Пример. Пусть имеются переменные следующих типов, которым присвоены значения:
Тип переменной |
i:integer |
b:boolean |
c:char |
r:real |
Значение переменной |
i:=123 |
b:=true |
c:=’+’ |
r:=45.678 |
Количество байт памяти |
4 байта |
1 байт |
1 байт |
8 байт |
После записи оператором writeln(F,i,b,c,r:7:2) в файле F получим следующую строку:
1 |
2 |
3 |
t |
r |
u |
e |
+ |
#32 |
#32 |
4 |
5 |
. |
6 |
8 |
#13 |
#10 |
Значение r занимает 7 байтов, согласно формату вывода слева добавлено два пробела и произошло округление.
В памяти числовые и логические значения занимают фиксированное количество байтов независимо от количества цифр в числах и логического значения. В текстовом файле количество байтов зависит от количества цифр и формата вывода.
17.6.4.Дополнительные подпрограммы, учитывающие наличие строк и пробельных символов
Проверки конца строки
function Eoln(F):boolean
Возвращает значение True, если файловый указатель находится на признаке конца строки файла.
В противном случае возвращает False.
Поиск конца строки
function SeekEoln(F):boolean
Происходит поиск признака конца строки, при этом пропускаются пробельные символы. Файловый указатель устанавливается либо на первом значащем символе, либо на конце строки, в последнем случае функция возвращает True.
Поиск конца файла
function SeekEof(F):boolean
Пропускаются пробельные символы и признаки конца строк, файловый указатель устанавливается либо на первом значащем символе, либо на конце файла, в последнем случае функция возвращает True.
17.6.5.Построчная обработка текстовых файлов
При построчной обработке строка файла целиком считывается из файла оператором Readln(F,s) в строковую переменную. Для проверки конца файла используется функция Eof. Чтение оператором Read(F,s) приводит к зацикливанию, т.к. не происходит перехода к новой строке файла.
17.6.6.Поэлементная обработка текстовых файлов, состоящих из чисел
Числа в текстовых файлах разделяются пробельными символами и признаками конца строк. При организации ввода из файла надо учитывать различные варианты наличия или отсутствия:
пробельных символов за последним числом в строке;
строк только из пробельных символов (без чисел);
признака конца последней строки непосредственно перед признаком конца файла.
Использование функций SeekEoln и SeekEof позволяет учесть все эти варианты в одной программе. Эти функции как раз и предназначены для пропуска пробельных символов. Замена их на Eoln и Eof в разных сочетаниях приводит либо к зацикливанию программы, либо к ошибке ввода.
Пример. В редакторе БЛОКНОТ подготовлен текстовый файл matr.txt из нескольких строк. В начале строк, между числами и в конце строк есть пробелы и/или табуляция. Выдать номера строк и количество чисел в каждой строке.
var F: text; i,j,x: integer;
begin
Assign(F, 'matr.txt');
Reset(F);
i:=0; //Счетчик строк
while not SeekEof(F) do //Внешний цикл до конца файла
begin
i:=i+1;
j:=0; //Счетчик чисел в строке
while not SeekEOLn(F) do //Внутренний цикл до конца строки
begin
read(F, x);
j:=j+1
end;
writeln('Строка ',i, ', чисел ',j)
end;
Close(F); end.
Если не надо учитывать разбиение чисел по строкам файла, внутренний цикл не нужен. Все числа вводятся в цикле:
while not SeekEof(F) do //Цикл до конца файла
begin
read(F, x);
. . . //Обработка числа
end;