Курс лекций для специальности «Прикладная математика» Первый семестр
Вид материала | Курс лекций |
Содержание9.1 Текстовые файлы. Var i, j : integer; s :string[100]; ch : char 9.2 Проект программы 9.3 Простейший сканер. Начальное состояние 9.4 Копия любого файла |
- Курс лекций для специальности Прикладная математика и информатика, 774.04kb.
- Календарный план лекций по курсу «математический анализ» Для специальности «Математика», 39.98kb.
- Рабочая программа, 160.99kb.
- Рабочая программа, 182.62kb.
- Цифровая обработка сигналов, 137.86kb.
- Курс лекций (28 часов) канд филос наук О. В. Аронсон Курс лекций «Математика и современная, 27.49kb.
- Урс «Численное решение обыкновенных дифференциальных уравнений» читает кафедра фн-2, 24.78kb.
- Курс IV семестр 8 Всего аудиторных занятий 52 Лекций, 117.53kb.
- Курс лекций в электронной форме содержит все лекции предусмотренные программой дисциплины, 32.88kb.
- Календарный план учебных занятий по обязательной дисциплине «Дискретная математика, 109.62kb.
Лекция 9
9.1 Текстовые файлы.
Текстовый файл (описатель text в отличие от типизированного файла file of char) представляет собой файл символов, сгруппированных в строки. Разбиение на строки обеспечивается признаком (комбинаций символов) конца строки. Для текстовых файлов существует специальный вид операций чтения и записи (read, write, readln, writeln), который позволяют считывать и записывать значения, тип которых отличается от символьного типа (это действительные, целочисленные типы и строки, выводить можно также и данные булевского типа). Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i - переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности как десятичного числа, и сохранению его в i. Предопределены две стандартные переменные типа text – это Input и Оutput. Стандартная файловая переменная Input – это доступный только для чтения файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Оutput – это доступный только для записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы файлы Input и Оutput автоматически открываются, как если бы были выполнены следующие операторы:
Assign(Input,'con'); Reset(Input);
Assign(Output,'con'); Rewrite(Output);
После завершения работы программы эти файлы автоматически закрываются.
Обращение к процедурам ввода и вывода для текстовых файлов организуется так:
Read(f,<список элементов ввода>),
write(f,<список элементов вывода>),
readln(f,<список элементов ввода>),
writeln(f,<список элементов вывода>)
f – имя файловой переменной. Список элементов ввода представляет собой список имен переменных символьного, целочисленного, действительного или строкового типа через запятую. Данные в строке читаемого текстового файла трактуются как символьное представление данных соответствующего типа.
- Данные целого типа читаются с текущего символа, пропуская лидирующие пробелы, до первого символа, синтаксически не совместимого с представлением целого числа, либо до конца строки файла.
- Переменная типа CHAR принимает значение текущего символа.
- Переменная-строка принимает символы, пока не будет достигнута ее максимальная длина, либо конец строки файла.
- Данные вещественного типа читаются последовательно из строки файла, пока не будет достигнут символ, синтаксически не совместимый с представлением вещественного числа, либо конец строки файла.
Пример:
VAR I, J : INTEGER; S :STRING[100]; CH : CHAR;
...
READ(f, I, J, CH, S);
Пусть читаемые данные: 36 24 ABCDEFGHIJKLMNOPQRSTUVWXYZ.
После выполнения процедуры READ:
I =36, J = 24, CH = ' ', S = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
При завершении операции ввода данных во все переменные списка элементов ввода процедура readln осуществляет переход на новую строку текстового файла. В ТР, начиная с седьмой версии, при достижении конца строки чтение данных из текстового файла продолжается со следующей строки, если список ввода не исчерпан. Однако, с целью сохранения мобильности и читабельности программы, не следует пользоваться этим при проектировании ввода данных. Рекомендуется осуществлять переход на другую строку явным образом. Вот два примера:
program ReadEoln {Плохое решение};
var c:char; f:text;
begin
assign(f,'text.txt');
reset(f); {Нужно использовать шаблон безопасного открытия}
while not(eof(f)) do
begin
read(f,c);
write(c);
end;
close(f);
writeln;
readln;
end.
program Copy {хорошее решение, шаблон!};
var c:char; f:text;
begin
assign(f,'text.txt');
reset(f){Нужно использовать шаблон безопасного открытия};
while not(eof(f)) do
begin while not(eoln(f)) do
begin
read(f,c);
write(c);
end;
readln(f);
writeln;
end;
close(f);
writeln;
readln;
end.
Список элементов вывода представляет собой список выражений (в частности, переменных и констант) символьного, строкового, целочисленного действительного и булевского типа. После каждого выражения может указываться через двоеточие характеристика длины, а для выражений действительного типа еще и характеристика точности. При завершении операции вывода данных процедура writeln осуществляет переход на новую строку текстового файла.
Вот два примера работы с текстовыми файлами (предложены Путинцевым А).
{Добавление записей в файл данных о дневной температуре воздуха}
program aprec;
var
DayTemp:record {дневная темперарура}
day:integer; {число}
month:integer; {месяц}
temper:integer; {температура}
end;
f:text;{ файл дневной температуры}
begin
assign(f,'a:\temperat.txt');
append(f); {открываем файл для добавления записи}
{Нужно использовать шаблон безопасного открытия}
write('Введите в одной строке, разделяя пробелами');
writeln(' число, номер месяца и температуру');
write('->');
with DayTemp do
begin
readln(day,month,temper);
writeln(f,day,' ',month,' ',temper);
{Следовало бы указать характеристики длины}
end;
close(f);
writeln('Данные добавлены');
end.
{Чтение записей из файла}
program readrec;
var
DayTemp:record {дневная температура}
day:integer; {число}
month:integer; {месяц}
temper:integer; {температура}
end;
f:text; {файл дневной температуры}
mes:integer;{номер месяца}
n:integer;{кол-во дней месяца, о которых есть данные в файле}
summ:integer; {сумма температур месяца}
sredn:real; {средняя температура}
begin
n:=0;
summ:=0;
writeln('Вычисление среднемесячной температуры.');
write('Месяц->');
readln(mes);
assign(f,'a:\temperat.txt');
reset(f);{Нужно использовать шаблон безопасного открытия}
while NOT EOF(f) do begin
with DayTemp do readln(f,day,month,temper);
{Область действия оператора with}
if DayTemp.month=mes
then begin
n:=n+1;
summ:=summ+DayTemp.temper;
end;
end;
close(f);
if n<>0 then begin
sredn:=summ/n;
writeln('Средняя температура:',sredn:6:3);
end
else writeln('Данных о температуре за',mes:3,' месяц нет.');
end.
9.2 Проект программы:
- Точная формулировка задачи
- Типы данных
- Структуры данных
- Процедуры и функции
- Алгоритм
9.3 Простейший сканер.
Формулировка задачи: Программа читает текстовый файл, выделяет слова и распознает идентификаторы. Имя текстового файла запрашивается. На экран выдается список слов по одному слову в строку, идентификаторы помечаются символом *. Разделителем не является признак конца строки.
Спецификации (типы данных и структуры данных):
Определяются три состояния чтения текста:
- ident – подозрение на идентификатор,
- news – начало чтения нового слова,
- ordin – читаемое слово не идентификатор.
Состояния объединены в перечислимый тип status.
chars – множество всех символов, letter, digit и separ - подмножества букв, цифр и разделителей слов, соответственно.
Процедуры и функции - нет.
Алгоритм: Чтение (из файла) посимвольно. Определяется изменение состояния в зависимости от состояния s и вновь прочитанного символа c. Начальное состояние - news.
Входной алфавит V – буква, цифра, разделитель, символ.
Алфавит состояний Q – News, Ident, Ordin.
Функция переходов f:QVQ:
| буква | цифра | разделитель | символ |
News | Ident | Ordin | News | Ordin |
Ident | Ident | Ident | News | Ordin |
Ordin | Ordin | Ordin | News | Ordin |
Начальное состояние – News
Множество заключительных состояний – {}
{Symplest scaner}
program Symplest_Scanner;
{Программа читает текстовой файл,
выделяет слова и распознает идентификаторы}
type
status=(ordin,ident,news);
chars=set of char;
var
letter,digit,separ:chars;
anytxt:string;
s:status;
i:integer;
c:char;
F:text;
begin
letter:=['A'..'Z','a'..'z'];
digit :=['0'..'9'];
separ :=[' '];
repeat
writeln(' Введите имя обрабатываемого файла');
readln(anytxt);
assign(F,anytxt);
{$I-} reset(F); {$I+}
i:=IOResult;
if i<>0 then
writeln(' Ошибочка ',i:3,' , попробуйте еще раз');
until i=0;
s:=news;
while not eof(F) do
begin
while not eoln(F) do
begin
read(F,c);
write( c);
case s of
news : if c in letter then s:=ident
else if not(c in separ) then s:=ordin;
ident: if c in separ then
begin s:=news; writeln('*') end
else
if not((c in letter) or (c in digit))
then s:=ordin;
ordin: if c in separ
then begin s:=news; writeln end;
end;
end;
if s=ordin then begin s:=news; writeln end;
if s=ident then begin s:=news; writeln(' *') end;
readln(F);
end;
end.
9.4 Копия любого файла
program Copy;
var c:byte;
f,g:file of byte;
begin
assign(f,'file.abc');
assign(g,’file_copy.abc’);
reset(f); rewrite(g);
while not(eof(f)) do
begin
read(f,c);
write(g,c);
end;
close(f);
end.