Слайд 1Информатика и программирование
Лебедева Т.Ф.
КЕМЕРОВСКИЙ ИНСТИТУТ (филиал)
РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТОРГОВО-ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА
ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
Слайд 2 4 Программирование алгоритмов обработки сложных данных
1
Функции и процедуры: Рекурсия
Рекурсия — это такой способ организации вспомогательного
алгоритма (подпрограммы), при котором эта подпрограмма (процедура или функция) в ходе выполнения ее операторов обращается сама к себе. Вообще, рекурсивным называется любой объект, который частично определяется через себя.
Для того чтобы такое обращение не было бесконечным, в тексте подпрограммы должно быть условие, по достижению которого дальнейшее обращение к подпрограмме не происходит.
Приведём примеры рекурсивных определений.
Пример 1. Классический пример, без которого не обходятся ни в одном рассказе о рекурсии, — определение факториала.
С одной стороны, факториал определяется так:
n! = 1 * 2 * 3 *...* n.
Слайд 34 Программирование алгоритмов обработки сложных данных
2
С другой стороны,
Граничным условием в данном случае является n<=1.
Пример 1 рекурсивной функции вычисления факториала
Function factorial(N: integer) : longint;
Begin
If N= 0 then
Factorial := 1
Else Factorial := factorial(N-1) * N
End;
Слайд 4 4 Программирование алгоритмов обработки сложных данных
3
Пример 2. Выдать на печать в обратном порядке цифры
целого положительного числа N. Составим процедуру REVERSE.
PROCEDURE REVERSE (N: integer);
Begin
Write (N mod 10);
If (N Div 10)<>0 Then REVERSE (N Div 10)
END;
Рассмотрим работу этой процедуры для числа N = 153.
Оператор Write(N mod 10) выведет на экран остаток от деления 153 на 10, то есть 3.
Оператор IF (N DIV 10)<>0 Then REVERSE (N DIV 10) проверяет целую часть частного 153/10 = 15 на ноль. Если целая часть не ноль, то с этим значением (15) идет вновь обращение к процедуре REVERSE.
Оператор Write (N MOD 10) выводит на экран остаток от деления 15 на 10, т.е.5; затем со значением 15/10 = 1 идет обращение к REVERSE.
После вывода цифры 1 оператором Write (N MOD 10) проба N DIV 10 на ноль передает управление на конец процедуры. На экране будет записано число 351.
Таким образом, однократное обращение извне к процедуре REVERSE вызвало ее трехкратное срабатывание. Условие полного окончания должно находиться в самой процедуре, иначе произойдет зацикливание.
Функции и процедуры: Рекурсия
Слайд 5 4 Программирование алгоритмов обработки сложных данных
4
Функции и процедуры: Рекурсия
Рекурсивные процедуры и функции (подпрограммы) имеют
одну из двух форм: прямую рекурсию и косвенную рекурсию. В первом случае подпрограмма содержит оператор вызова этой же подпрограммы (как в примере с процедурой REVERSE). Во втором случае одна подпрограмма вызывает другую подпрограмму, которая либо сама, либо посредством других процедур или функций вызывает исходную подпрограмму.
Если А,В - имена подпрограмм, то схема вызова может быть такой: А-В-А. В случае косвенной рекурсии возникает проблема: как и где описать вызываемую подпрограмму. По правилам языка Паскаль каждая подпрограмма должна быть описана до её вызова.
Но если подпрограмма А вызывает В, а В вызывает А, то получается замкнутый круг. Для подобных ситуаций принято следующее правило: одна из рекурсивных подпрограмм, вызывающих друг друга, описывается предварительно следующим образом:
Слайд 6 4 Программирование алгоритмов обработки сложных данных
5
Функции и процедуры: Рекурсия
PROCEDURE P(); FORWARD; Здесь
P - имя процедуры, FORWARD - ключевое слово. Это описание указывает транслятору, что текст процедуры Р помещен ниже. Подобным же образом описывается функция: к оператору FUNCTION добавляется слово FORWARD. Список формальных параметров и тип результата (для FUNCTION) включается только в это предварительное описание и опускается в заголовке соответствующей функции.
Пример3. Пусть функция В при работе вызывает функцию А которая, в свою очередь, вызывает функцию В. Тогда эти модули можно описать так:
FUNCTION B(X: INTEGER): REAL; FORWARD;
FUNCTOIN A(Y: INTEGER): REAL;
BEGIN :. A:=B(I)+3.5; END;
FUNCTION B;
BEGIN .......... B:=A(D)-1.8; END;
Заголовок (FUNCTON B) перед текстом функции В содержит только имя функции, а список формальных параметров и тип функции не указываются.
Слайд 7 4 Программирование алгоритмов обработки сложных данных
6
Множества
Множество — это структурированный тип данных, представляющий собой набор взаимосвязанных
по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Каждый объект в множестве называется элементом множества.
Все элементы множества должны принадлежать одному из порядковых типов, содержащему не более 256 значений. Этот тип называется базовым типом множества. Базовый тип задается диапазоном или перечислением.
Область значений типа множество — набор всевозможных подмножеств, составленных из элементов базового типа. В выражениях на языке Паскаль значения элементов множества указываются в квадратных скобках: [1,2,3,4], ['а',‘b','с'], ['a'..'z'].
Если множество не имеет элементов, оно называется пустым и обозначается как [ ]. Количество элементов множества называется его мощностью.
Множество может принимать все значения базового типа. Базовый тип не должен превышать 256 возможных значений. Поэтому базовым типом множества могут быть byte, char, boolean и производные от них типы.
Множество в памяти хранится как массив битов, в котором каждый бит указывает является ли элемент принадлежащим объявленному множеству или нет. Максимальное число элементов множества 256, а данные типа множество могут занимать не более 32 байт.
Слайд 8 4 Программирование алгоритмов обработки сложных данных
7
Множества
Не имеет значения порядок записи элементов множества внутри конструктора.
Например, [1, 2, 3] и [3, 2, 1] — это эквивалентные множества.
Каждый элемент в множестве учитывается только один раз. Поэтому множество
[1, 2, 3, 4, 2, 3, 4, 5] эквивалентно [1..5].
Переменные множественного типа описываются так:
Var <идентификатор> : set of <базовый тип>;
Например:
Var A, D : Set Of Byte; B : Set Of 'a'..'z'; C : Set Of Boolean;
Нельзя вводить значения во множественную переменную процедурой ввода и выводить процедурой вывода.
Множественная переменная может получить конкретное значение только в результате выполнения оператора присваивания:
<множественная переменная> := <множественное выражение>;
Например:
A : = [50, 100, 150, 200];
B : = ['m', 'n', 'k'];
C : = [True, False]; D : = A;
Слайд 9 4 Программирование алгоритмов обработки сложных данных
8
Множества
Кроме того, выражения могут включать в себя операции над
множествами.
Операции над множествами
Объединением двух множеств A и B называется множество, состоящее из элементов, входящих хотя бы в одно из множеств A или B. Знак операции объединения в Паскале «+».
Примеры:
[1, 2, 3, 4] + [3, 4, 5, 6] => [1, 2, 3, 4, 5, 6]
2) [ ]+[‘a’..’z’]+[‘A’..’E’, ‘k’] => [‘A’..’E’, ‘a’..’z’]
3) [5<4, true and false] + [true] => [false, true]
А
В
Слайд 10 4 Программирование алгоритмов обработки сложных данных
9
Множества
Пересечением двух множеств A и B называется множество, состоящее из
элементов, одновременно входящих во множество A и во множество B.
Знак операции пересечения в Паскале «*»
Примеры:
[1, 2, 3, 4] * [3, 4, 5, 6] => [3, 4]
2) [‘a’..’z’]*[‘A’..’E’, ‘k’] => [‘k’]
3) [5<4, true and false] * [true] => [ ]
Разностью двух множеств A и B называется множество, состоящее из элементов множества A, не входящих во множество B.
Примеры:
1a) [1, 2, 3, 4] - [3, 4, 5, 6] => [1, 2]
1b) [3, 4, 5, 6] - [1, 2, 3, 4] => [5, 6]
2a) [‘a’..’z’]-[‘A’..’E’, ‘k’] => [‘a’..’j’, ‘i’..’z’]
2b) [‘A’..’E’, ‘k’] - [‘a’..’z’] => [‘A’..’E’]
3a) [5<4, true and false] - [true] => [false]
3b) [true] - [5<4, true and false] => [true]
Слайд 11 4 Программирование алгоритмов обработки сложных данных
10
Множества
Операция вхождения. Это операция, устанавливающая связь между множеством и
скалярной величиной, тип которой совпадает с базовым типом множества. Если x — такая скалярная величина, а M — множество, то операция вхождения записывается так: x in M.
Результат — логическая величина true, если значение x входит в множество M, и false — в противном случае.
Например, 4 in [3, 4, 7, 9] –– true, 5 in [3, 4, 7, 9] –– false.
Используя данную операцию, можно не только работать с элементами множества, но и, даже если в решении задачи явно не используются множества, некоторые логические выражения можно записать более лаконично.
Натуральное число n является двухзначным. Вместо выражения
(n >= 10) and (n <=99) можно записать n in [10..99].
2) Символ c является русской буквой. Вместо выражения (c >= ‘А’) and (c <= ‘Я’) or (c>=‘а’) and (c<=‘п’) or (c>=‘р’) and (c<=‘я’) пишем c in [‘А’.. ‘Я’, ‘а’.. ‘п’, ‘р’.. ‘я’]и т.д.
Слайд 12 4 Программирование алгоритмов обработки сложных данных
11
Записи
Запись – это структурированный тип данных, состоящий из фиксированного
числа компонент (полей) разного типа.
Запись представляет собой совокупность ограниченного числа логически связанных компонент, принадлежащих к разным типам. Компоненты записи называются полями, каждое из которых определяется именем. Поле записи содержит имя поля, вслед за которым через двоеточие указывается тип этого поля. Поля записи могут относиться к любому типу, допустимому в языке Паскаль, за исключением файлового типа.
Описание записи в языке ПАСКАЛЬ осуществляется с помощью служебного слова RECORD, вслед за которым описываются компоненты записи. Завершается описание записи служебным словом END.
Формат объявления записи:
Type
<имя типа> = record
<идентификатор поля>: <тип данных>;
[<идентификатор поля>: <тип данных>;]
end;
Var
<идентификатор> [,<идентификатор>] : <имя типа>;
Слайд 13 4 Программирование алгоритмов обработки сложных данных
12
Пример1 Записная книжка содержит фамилии, инициалы и номера
телефона, поэтому отдельную строку в записной книжке удобно представить в виде следующей записи:
type Row=Record
FIO: String[20];
TEL: String[7]
end;
var rec : Row;
Описание записей возможно и без использования имени типа, например:
var rec: Record
FIO: String[20];
TEL: String[7]
end;
Пример 2. Даты каких-либо событий можно описать следующим образом:
TYPE DATE=RECORD MONTH: 1..12; DAY: 1..31; YEAR: INTEGER; END;
VAR D: DATE;
В этом примере описан тип DATE и переменная D, принадлежащая этому типу. Переменная D описана как запись, состоящая из трех полей: MONTH, DAY и YEAR. Каждое поле содержит соответственно данные: целое число в пределах от 1 до 12 (номер месяца), целое число от 1 до 31 (число), целое число (год). Поле DAY переменной D записывается как D.DAY.
Например, чтобы заслать в D дату 12.01.2011, надо выполнить следующие операторы: D.MONTH:=1; D.DAY:=12; D.YEAR:=2011;
Слайд 14 4 Программирование алгоритмов обработки сложных данных
13
Обращение к записи в целом допускается только в операторах
присваивания, где слева и справа от знака присваивания используются имена записей одинакового типа. Во всех остальных случаях оперируют отдельными полями записей. Чтобы обратиться к отдельной компоненте записи, необходимо задать имя записи и через точку указать имя нужного поля, например:
rec.FIO, rec.TEL
Такое имя называется составным. Компонентой записи может быть также запись, в таком случае составное имя будет содержать не два, а большее количество имен.
Обращение к компонентам записей можно упростить, если воспользоваться оператором присоединения with.
Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения:
with rec do оператор;
Здесь rec - имя записи, оператор - оператор, простой или составной. Оператор представляет собой область действия оператора присоединения, в пределах которой можно не использовать составные имена. Например для нашего случая:
with rec do begin FIO:='Иванов А.А.'; TEL:='2223322'; end;
Такая алгоритмическая конструкция полностью идентична следующей:
rec.FIO:='Иванов А.А.'; rec.TEL:='2223322';
Слайд 15 4 Программирование алгоритмов обработки сложных данных
14
Пример 3 Описание анкеты студента в Паскале будет выглядеть
так:
Type anketa=record
fio: string[45];
pol: char;
dat_r: RECORD MONTH: 1..12; DAY: 1..31; YEAR: INTEGER; END;
adres: string[50];
curs: 1..5;
grupp: string[3];
end;
Var s: anketa;
Никаких ограничений на типы полей не накладывается, поэтому компонентой записи может быть любая структура данных.
Доступ к любому полю записи осуществляется путем указания имени переменной и имени поля, разделенных точкой.
Пример доступа к полям структуры описания студента:
Обращение к полям записи в многоуровневой структуре будет достаточно длинным, s.dat_r.year := 1992;
Чтобы не писать длинные адреса доступа к полям записей в языке Паскаль используется оператор WITH:
Слайд 16 4 Программирование алгоритмов обработки сложных данных
15
Пример упрощенного обращения к полям записи:
with s,
dat_r do
begin
fio := 'Иванов И.И.';
year := 1993;
curs:=3;
writeln ( fio, curs :3, ‘год рождения –’, year);
end;
Слайд 17 4 Программирование алгоритмов обработки сложных данных
16
Записи с вариантами
Записи, рассмотренные выше – это записи
с фиксированными частями. Они имеют в различных ситуациях строго определенную структуру. Соответственно записи с вариантами в различных ситуациях могут иметь различную структуру.
Предположим, что написана программа для введения списка библиографических ссылок. Если известно, что все входы в этом списке – ссылки на книги, то можно использовать следующее описание:
Const
Kol = 1000;
Type
Entry = Record
Autor, Title, Publisher, City : String;
Year : 1..2011;
End;
Var
List : Array[1..Kol] of Entry;
Слайд 18 4 Программирование алгоритмов обработки сложных данных
17
Что произойдет, если некоторые из входов не являются
ссылками на книги, а содержат ссылки на журнальные статьи. Если ограничиваться только записями с фиксированными частями, то следует описать различные массивы для каждого вида записей. Использование записей с вариантами позволяет образовать структуру, каждый вход которой соответствует содержанию записи. Опишем новый тип, в котором перечислены различные входы:
Type
EntryType = (Book, Magazine);
Теперь можно привести скорректированное описание Entry
Type
Entry = Record
Autor, Title : String;
Year : 1..2000;
Case TAG : EntryType of
Book : (Publisher, City : String);
Magazine : (MagName : String,
Volume, Issue : Integer)
End;
Слайд 19 4 Программирование алгоритмов обработки сложных данных
18
Это описание делится на две части: фиксированную и
вариантную.
Поля Autor, Title, Year составляют фиксированную часть. Оставшаяся часть описания Entry образует вариантную часть, структура которой, подобно хамелеону, может меняться в пределах двух альтернативных определений.
Значения TAG используются в качестве имен двух альтернатив определения записи. Когда эта компонента имеет значение Book, можно обращаться к следующим полям:
Autor, Title, Year, Publisher, City
С другой стороны, когда она принимает значение Magazine, то можно обращаться к таким полям:
Autor, Title, Year, MagName, Volume, Issue
Рассмотрите последовательность операторов, где в RefList[12] помещается ссылка на книгу:
RefList[12].TAG := Book;
RefList[12].Autor := 'Thomas Hobbes';
RefList[12].Title := 'Leviathan';
RefList[12].Year := 1651;
RefList[12].Publisher := 'Andrew Crooke';
RefList[12].City := 'London';
Слайд 20 4 Программирование алгоритмов обработки сложных данных
19
Для определения состояния записи с вариантами достаточно проверить
значение поля тега. Рассмотрим процедуру, выводящую на экран переданную ей запись.
Procedure PrintRef(Citation : Entry);
Begin
Writeln(Citation.Autor);
Writeln(Citation.Title);
Writeln(Citation.Year);
If Citation.TAG = Book
Then
Writeln(Citation.Publisher,', ',Citation.City)
Else
Begin
Writeln(Citation.MagName);
Writeln(Citation.Volume'–',Citation.Issue)
End;
End;
Слайд 214 Программирование алгоритмов обработки сложных данных
20
Файлы
При обработке больших массивов информации данные хранятся не
в ОП, а во внешней памяти в виде физических файлов.
Под физическим файлом понимаем поименованный набор данных на диске либо логическое устройство – потенциальный источник или приемник информации.
Характеристики физического файла:
Имя
Содержит компоненты одного типа
Размер не ограничен, определяется размером памяти на диске
Для работы с файлами в программе на Паскале необходимо:
Объявить переменную файлового типа в разделе VAR;
Связать ее с физическим файлом на диске;
Открыть файл для записи или чтения;
Выполнить необходимую обработку данных из файла;
Закрыть файл.
Слайд 22 4 Программирование алгоритмов обработки сложных данных
21
В Паскале можно использовать 3 типа файлов:
Текстовые
F: text;
Типизированные F: file of < тип >;
Не типизированные F: file;
Не типизированные файлы используются только для высокоскоростного копирования файлов из ОП во внешнюю память и обратно. Для них не указывается тип компонентов.
файл
ОП
read
write
Слайд 23 4 Программирование алгоритмов обработки сложных данных 22
1 Объявление
файлов
Выполняется в разделах TYPE или VAR
Примеры:
Type prod =
record
code: word;
name: string;
cost: real
end;
text80 = file of string[80];
Var f1: file of char;
f2: text;
f3: file;
f4: text80;
f5: file of prod;
Слайд 24 4 Программирование алгоритмов обработки сложных данных
23
Логические устройства – стандартные аппаратные устройства персонального компьютера (клавиатура, экран
монитора, принтер, каналы ввода-вывода) определяются в Паскале специальными именами, приведенными в таблице.
Стандартный модуль Printer, входящий в библиотеку Turbo.tpl , позволяет объявить имя файловой переменной LST и связать ее с устройством LPT1. это дает возможность использовать файл LST для печати результатов.
Слайд 25 4 Программирование алгоритмов обработки сложных данных
24
program zr;
Uses printer;
begin
write(LST ,‘Привет!’);
end.
Все операции по связыванию
файла LST с принтером и открытию файла выполняет модуль PRINTER.
2 Связывание файловой переменной с физическим файлом
Assign (F, Str) – сопоставляет файловой переменной F файл на диске, спецификация которого задана в строковой переменной Str.
Примеры: Assign (F1, ‘C:\student\pr.dat) ;
Assign (F2, ‘PRN’);
Assign (F3, ‘CON’);
write( ‘введите имя файла’); readln(name_f);
Assign (F4, name_f);
Слайд 26 4 Программирование алгоритмов обработки сложных данных 25
3
Открытие файлов
После связи файловой переменной с физическим файлом файл может
быть открыт только для чтения, только для записи, для чтения и дозаписи (в случае типизированных файлов).
Процедурами открытия или инициализации reset(f), rewrite(f), append(f) файл или логическое устройство подготавливается к выполнению нужного действия.
Reset (F); – открывает существующий файл для чтения данных. Файловый курсор устанавливается на начало файла. Чтение данных из файла осуществляется процедурами read, readln.
Только для типизированных файлов reset может использоваться и для дозаписи в файл, что позволяет дополнять и корректировать типизированные файлы.
При попытке открыть процедурой reset несуществующий файл или инициировать чтение из логического устройства вывода данных (например, PRN) возникает ошибка периода исполнения.
Слайд 27 4 Программирование алгоритмов обработки сложных данных
26
Rewrite(f); - открывает новый файл для записи данных
или инициирует логическое устройство вывода. Новый дисковый файл подготавливается к приему данных и его файловый курсор устанавливается в начало файла. Запись данных в файл осуществляется процедурами write, writeln.
При выполнении этой процедуры уничтожается старый файл с тем же именем, если он существовал. При этом никаких сообщений об ошибках не выдается.
Append(f) ; - открывает ранее созданный текстовый файл для его дополнения новыми записями. При этом курсор устанавливается в конец файла.
Любой программе без объявления, инициализации файловой переменной
и открытия доступны два файла со стандартными файловыми переменными:
INPUT - чтение со стандартного устройства ввода;
OUTPUT - вывод на стандартное устройство вывода.
Это текстовые файлы, используемые для выполнения элементарных
операций ввода-вывода.
4 Закрытие файлов
Close(f); - закрывает файл и обеспечивает сохранность записей в файле, но не разрывается связь файловой переменной и физического файла, установленную процедурой Assign (F, Str).
Поэтому один файл в программе можно многократно открывать и закрывать.
Слайд 28 4 Программирование алгоритмов обработки сложных данных
27
5 Стандартные процедуры и функции обслуживания файлов.
Для взаимодействия с
файловой системой MS DOS в Pascal определены стандартные процедуры и функции, которые применимы к файлам любых типов.
Процедура ReName(Var f; name:string) - осуществляет переименование файла, определенного файловой переменной f. Новое имя файла задается параметром name. Если в процессе работы программы требуется переименовать файл, открытый для чтения или записи, необходимо предварительно закрыть этот файл процедурой Close. При совпадении нового имени файла с каким-либо уже существующим выдается сообщение об ошибке.
Процедура Erase(Var f) - осуществляет удаление созданного или находящегося в процессе формирования файла. Перед уничтожением файл должен быть закрыт, так как разрешается удалять только закрытые файлы.
Слайд 29 4 Программирование алгоритмов обработки сложных данных
28
3. Процедура Truncate(Var f) - обрезает файл, оставляя
компоненты до
того, на который ссылается указатель файла (кроме текстовых файлов).
4. Процедура ChDir(path:string) - изменяет текущий каталог: назначает
текущим каталог, указанный параметром path.
5. Функция GetDir(drive:word: Var dir:string) - возвращает имя текущего каталога на указанном устройстве, где устройство drive: 0 – устройство по умолчанию; 1 - диск А; 2 - диск В и т.д.
6. Процедура MkDir(dir:string) - создает новый каталог. Строка dir определяет путь и новое имя.
7. Процедура RmDir (dir: string) - удаляет каталог с указанным именем. Каталог должен быть пустым.
Слайд 304 Программирование алгоритмов обработки сложных данных
29
8. Функция EOF(Var f):boolean - определяет конец файла. Размер
файла при его создании не фиксируется. Поэтому в процессе работы требуется проверка достижения конца файла. Функция принимает значение TRUE, если указатель стоит в конце файла (после последней записи). При этом, если производится чтение, то это означает, что файл исчерпан, а если идет запись, то новая запись дописывается в конец файла. Функция принимает значение FALSE, если конец файла еще не достигнут.
Примечание, Функция EOF по-разному работает с дисковыми файлами и логическими устройствами. Для логического устройства невозможно предвидеть, каким будет результат чтения очередного символа. Поэтому при работе с логическим устройством функция EOF возвращает TRUE, если последним символом был маркер конца файла, а при чтении с диска - если следующим считываемым символом будет маркер конца файла. Физически это выражается в том, что при выполнении функции EOF запрашивается ввод информации с клавиатуры.
В качестве маркера конца файла используется символ ASCII с кодом 26 (#26). При работе с клавиатурой этот код формируется при вводе комбинации CTRL-Z. Считается, что признак конца файла физически присутствует в файле, однако, как правило, такой символ в конце дискового файла отсутствует, и конец файла в системе определяется другим способом.
9. Функция IOResult(Var f): word - возвращает код правильности выполнения
операций ввода/вывода. Если ошибок не зафиксировано, то функция возвращает 0. Информация об ошибках может быть получена и обработана
в режиме компилятора {$I-}- отключение контроля ошибок ввода/вывода.
Слайд 314 Программирование алгоритмов обработки сложных данных
30
Текстовые файлы
Текстовый файл - это файл, компонентами которого являются символьные
строки
переменной длины, заканчивающиеся специальным маркером конца строки
Строка 1 Строка 2 Строка 3
Указатель файла Маркеры конца строки
Маркер конца файла
Рис. 1 - Структура текстового файла
Примечание, Маркер конца строки - это последовательность из двух специальных символов по таблице ASCII «#13, #10». Символ с кодом 13 интерпретируется в компьютере как команда установки курсора в начало строки, а символ с кодом 10 - как команда перехода на следующую строку. Такая комбинация кодов вводится при нажатии клавиши ENTER.
Слайд 32 4 Программирование алгоритмов обработки сложных данных
31
Текстовый файл можно открыть для записи, чтения и
добавления записей в конец.
Файл, открытый для записи, не может использоваться для чтения и наоборот. При открытии файла для добавления процедурой Append система проверяет, не был ли файл открыт для чтения или записи, и если такое открытие имело место, то производится сначала закрытие файла, а затем уже открытие для добавления.
Текстовые файлы используют для хранения и обработки текстовой информации: символов, строк, символьных массивов.
Логические и числовые данные при записи в текстовые файлы должны преобразовываться в символьные строки.
Следует иметь в виду, что при необходимости текстовый файл может быть создан или прочитан любым текстовым редактором, в том числе и текстовым редактором, входящим в состав среды Turbo Pascal.
Слайд 33 4 Программирование алгоритмов обработки сложных данных
32
Для работы с текстовыми файлами используют специальные процедуры
и функции.
1. Функция EOLn( [Var f]): boolean - возвращает TRUE, если во входном
текстовом файле достигнут маркер конца строки; при отсутствии файловой переменной проверяется стандартный файл INPUT, который обычно связан с клавиатурой.
Примечание, Функция EOLn, как и EOF, по-разному работает с дисковыми файлами и логическими устройствами. Для логического устройства невозможно предвидеть, каким будет результат чтения очередного символа. Поэтому при работе с логическим устройством функция EOLN возвращает TRUE, если последним считанным символом был символ #13. При работе с диском функция EOLN возвращает TRUE, если следующим считанным символом будет символ #13.
2. Процедура Read( [Var f:text;] vl, v2,... vn) - обеспечивает ввод символов, строк и чисел. Список ввода представляет собой последовательность из одной или более переменных типа CHAR, STRFNG, а также любого целого и вещественного типа. При отсутствии файловой переменной ввод осуществляется из стандартного файла INPUT. При вводе значений переменных типа CHAR выполняется чтение одного символа из файла, считанное значение присваивается очередной переменной из списка ввода. Символы вводятся подряд, а не через пробел, как числа. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ #13, а если был достигнут конец файла, то - символ #26.
Слайд 34 4 Программирование алгоритмов обработки сложных данных
33
При вводе переменных типа STRING количество считанных процедурой
и помещенных в строку символов равно максимальной длине строки, если раньше не встретились маркеры конца строки или конца файла, которые в строку не включаются. Символы, выходящие за размер максимальной длины строки, отбрасываются. Новое обращение к процедуре Read вернет пустую строку. Процедура Read не в состоянии читать последовательность строк, так как первая строка будет прочитана правильно, а все последующие окажутся пустыми.
При вводе числовых данных процедура Read пропускает все пробелы,
знаки табуляции и маркеры до первого значащего символа и читает строку до пробела, знака табуляции или маркера. Полученная подстрока преобразуется из символьного во внутреннее представление в соответствии с типом значения и присваивается следующей переменной из списка. Если нарушен формат, то фиксируется ошибка ввода-вывода. Если достигнут маркер конца файла, то переменной присваивается значение О, причем никаких сообщений в этом случае не выдается.
Ввод логических констант процедурами Read и ReadLn не предусмотрен.
3. Процедура ReadLn( [Var f;] vl,v2, ,..,vn ) - также обеспечивает ввод символов, строк и чисел. Процедура использует те же правила ввода, что и процедура Read, но после чтения последней переменной оставшаяся часть строки до маркера конца строки пропускается, так что следующее обращение к ReadLn или Read начнется с первого символа новой строки. Процедура может быть вызвана без указания списка ввода, что приведет к пропуску
всех символов текущей строки до маркера конца строки.
Процедуры Read и ReadLn могут использоваться без указания файловой переменной. Тогда операция чтения осуществляется из стандартного файла INPUT. Использование процедуры ReadLn без параметров после процедуры Read приведет к очистке буфера ввода. Применение этой же процедуры без предшествующей ей процедуры Read переводит программу в состояние ввода, т.е. выполнение программы приостанавливается до нажатия клавиши ENTER, что может использоваться для организации паузы на время просмотра содержимого экрана.
Слайд 35 4 Программирование алгоритмов обработки сложных данных
34
4. Процедура Write( [Var f;] v7,v2, ...,vn )
- обеспечивает вывод данных
в текстовый файл или передачу их на логическое устройство. Список вывода - последовательность из одного или более выражений типа CHAR,
STRING, BOOLEAN, а также целого или вещественного типов. При выводе
числовых значений последние преобразуются в символьное представление. При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно назначен на экран. Любой параметр из списка вывода может иметь формат:
<параметр> [: <целое1> [: < целое2> ]],
5. Процедура WriteLn( [Var f;] vl,v2, ...,vn ) ~ обеспечивает вывод информации в текстовый файл или ее передачу на логическое устройство вывода. При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно связан с дисплеем.
Процедура полностью идентична процедуре Write, за исключением того,
что выводимая строка символов завершается символами #13 и #10. При
вызове WriteLn допускается опускать список вывода, в этом случае в файл передается маркер конца строки (при выводе на экран это приведет к переводу курсора в начало следующей строки).
Слайд 36 4 Программирование алгоритмов обработки сложных данных
35
6. Процедура открытия файла для дополнения
append(f : Тext)
– процедура открывает существующий файл для присоединения. Если файл уже открыт, то он сначала закрывается, а затем открывается заново. Текущая позиция устанавливается на конец файла.
Рассмотрим несколько примеров
Пример 1 Считать и вывести на экран числовой массив из файла, созданного ранее посредством текстового редактора
Program TextFile1;
Const n=100;
Var f: text;
m:array[1..n] of real;
i : byte;
Begin
assign(f, ‘C:\STUDENT\PI104\Primer1' );
reset(f);{Открыть файл c файловой пер. f на чтение }
i:=1;
while Not Eof(f) and ( i <= n) Do
begin
read(f, m[i]); {Cчитываем из f в переменную m[i]}
writeln( m[i] :6:2);
Inc(i);
end;
close(t);{Закрытие файла Primer1}
End.
Слайд 37 4 Программирование алгоритмов обработки сложных данных
36
Пример2 Дан текстовый файл с программой на языке
Паскаль, причем каждый оператор – в одной строке. Проверить правильность расстановки круглых скобок
Program TextFile2;
Var
f : Тext; ch: char;
Put: string; k1, k2, n: integer; l,p: boolean;
Begin
n := 0; {Обнуляем счетчик строк}
Put := ‘C:\STUDENT\Pi104\Primer2.pas'; {Полный путь до файла }
assign(t, Put);
reset(f); {Открываем файл для чтения}
l:= true;
while Not Eof(f) do {Пока нет конца файла выполнить...}
begin
inc(n); k1:= 0; k2:= 0; {Обнуляем счетчики скобок}
p:= false;
while Not EoLn(f) do {Пока нет конца строки выполнить...}
begin
read(f, ch); {Считываем cимвол}
if ch = '(' {Если встретилась открытая скобка,}
then Inc(k1); {то счетчик увеличиваем на 1}
if ch = ')’ then if k1>k2 then Inc(k2) else p:= true ;{ ‘)’ раньше ‘(‘ }
end;
if ( k1<>k2 ) or p then begin writeln(‘ошибка в строке ’, n); l:= false end;
readln(f); {переходим на следующую строку}
end;
If l then writeln(‘скобки расставлены правильно’);
Close(f); readln;
End.
Слайд 38 4 Программирование алгоритмов обработки сложных данных
37
Пример 3 Дан текстовый файл, переписать его в
новый файл, исключив пробелы
Program TextFile3;
Var
f, t: text;
Put1, Put2,: string;
s : char;
Begin
Put1 := ‘C:\STUDENT\PI104\Primer1‘ ;{Путь до файла Primer на диске}
assign(f, Put1 );
reset(f);{Открыть файл c файловой пер. f на чтение }
Put2 :=‘C:\STUDENT\PI104\Primer2' ';{Путь где будет создан новый файл}
assign(t, Put2);
rewrite(t);{ Открыть файл c файловой пер. t на создание и запись }
while Not Eof(f) Do
begin
while Not Eoln(f) do
begin
read(f, s); {Cчитывать из f в переменную s}
if s<>‘ ‘ then write(t, s);{ Записывать в t значение s}
end;
readln(f); {Переходим к чтению следующей строки файла f}
writeln(t);{Переходим к записи следующей строки файла t}
end;
close(t);{Закрытие файла Primer1}
close(f);{Закрытие файла Primer2}
End.