Курс лекций для специальности «Прикладная математика» Первый семестр

Вид материалаКурс лекций

Содержание


9.1 Текстовые файлы.
Var i, j : integer; s :string[100]; ch : char
9.2 Проект программы
9.3 Простейший сканер.
Начальное состояние
9.4 Копия любого файла
Подобный материал:
1   ...   5   6   7   8   9   10   11   12   13

Лекция 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:QVQ:




буква

цифра

разделитель

символ

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.