Мегаобучалка Главная | О нас | Обратная связь


Область видимости идентификаторов



2015-12-04 541 Обсуждений (0)
Область видимости идентификаторов 0.00 из 5.00 0 оценок




Процедуры или функции, как выше сказано, могут содержать внутри себя описание других переменных. Более того, процедуры и функции могут содержать внутри себя описание других процедур и функций, а те в свою очередь – описания других переменных, процедур и функций и т.д. Отсюда возникает проблема определения области действия переменных. Дадим определение: область действия описания конкретного идентификатора называют его областью видимости. Приведем следующие правила определения области видимости идентификаторов (переменных).

1. Глобальными переменными называются переменные, описанные в головной программе. Они доступны в любом ее месте и во всех ее подпрограммах.

2. Подпрограмма описывается в некотором описательном разделе назовем его внешним и сама имеет описательный раздел - назовем его внутренним. Локальные переменные - это переменные, описанные в процедурах и функциях, они доступны во всех частях данной подпрограммы и в любых внутренних описательных разделах, но недоступны в тех блоках программы, которые соответствуют внешним описательным разделам.

На рисунке 17.1 приведена структура программы с вложенными подпрограммами: в головную программу вложена процедура 1 и процедура 2. В свою очередь в процедуру 1 вложена функция 1.

Во всех процедурах и функциях этой программы будут видны, а также можно использовать глобальные

Рис. 17.1

 

переменные головной программы. Локальные переменные функции 1 и процедуры 2 не будут видны в процедуре 1 и в головной программе. Однако локальные переменные, описанные в процедуре 1, будут видны, также как и глобальные переменные, в функции 1 (она вложена в процедуру 1).

В следующем примере процедура prog1 вложена в головную программу p34. В эту процедуру вложена, в свою очередь, процедура prog2.

Пример:

 

program p34;

var х: Integer ; { глобальная переменная }

 

procedure prog1; { Начало описания процедуры prog1}

var у: Integer; { локальная переменная }

 

procedure prog2; { Начало описания процедуры prog2 }

var z: Integer; { локальная переменная }

begin

{ Тело процедуры ргоg2: доступны переменные х, у, z }

…………..

end;

 

begin

{ тело процедуры prog1: доступны переменные х, у }

………………

end;

 

begin

{ тело головной программы: доступна переменная х }

…………..

end.

 

Задача: написать функцию для возведения целых чисел в натуральную степень.

 

program рЗ6;

{ Описание процедуры Istep }

procedure Istep(x, n: integer ; Var p: Longint);

{ x - целое число, n - натуральная степень, р – результат

выполнения процедуры, т.е. х в степени n. Этот параметр передаётся по ссылке }

var i : integer; { локальная переменная }

begin

p : = x ;

for i: = 2 to n do p := p * x;

end; { конец процедуры Istep }

 

var { описание глобальных переменных }

k: Longint;

begin { тело головной программы }

Istep(3, 3, k); { обращении к процедуре Istep. Первые два

фактических параметра равны 3. Фактическая

переменная k, передаваемая в процедуру по ссылке,

после выполнения процедуры будет содержать

результат: 3 в степени 3. }

Writeln( ‘3 в степени 3=’ , k);

pstep (5, 6, k) ; { обращении к процедуре Istep }

Writeln(‘5 в степени 6=’ , k);

pstep (7, 4, k); { обращении к процедуре Istep }

Writeln(‘7 в степени 4=’ , k);

end.

 

Файлы

Основные понятия

Файлы в программе – это каналы, по которым можно выполнять передачу данных. Под файлом понимают набор данных, которые считываются или записываются на внешние устройства.

В языке Паскаль имеются три вида файлов: текстовые, типизированные и нетипизированные.

Файловая система Паскаля — это часть DOS (дисковой операционной системы). Она имеет древовидную структуру.

Корневой каталог, например диска С (логические диски имеют идентификаторы соответствующие буквам английского алфавита - А, В, С, D... ) может содержать подкаталоги, в которых возможно находятся другие подкаталоги и т. д. В корневом каталоге и во всех подкаталогах содержатся файлы.

Любой файл характеризуется основным именем и расширением, которые разделяются точкой. Основное имя состоит максимум из восьми символов, а расширение - максимум из трех символов. Расширение, как правило, указывает на предназначение файла. Например, pas - текст программы на Паскале, txt - текстовый файл, dat - файл с данными и т. п.

Примеры:

turbo.ехе

met_pas.pas

tools.с

gol_txt

autoexec.bat

Каким образом программы, работающие с файлами, знают где находятся необходимые файлы, в каком именно подкаталоге? Для решения этой проблемы при передаче программе или подпрограмме "местонахождения" файла можно воспользоваться понятием - путь к файлу. В Паскале путь к файлу - это символьная строка, заключенная в апострофы. Она формируется из имени логического диска и имен системы вложенных подкаталогов, последним из которых является тот, где непосредственно находится файл. В строке имена подкаталогов разделяются символом "\" (обратный слэш).

Пример файловой системы:

С: TURBO

BIN

BGI

EXAMPLE

UNIT

TOOLS

ARC

SYS

MOUSE

DRIVERS

 

Примеры:

'C:\TURBO\BGI'

‘D:V’

‘D:\ARM\BLM\STOP'

'C:\TOOLS\MOUSE’

 

Файлом (файловой переменной) в Паскале является объект типа file.

При использовании файловой переменной необходимо учитывать следующие ограничения:

1.Файловой переменной не разрешается присваивать другое значение.

2.Если требуется передать файловую переменную в процедуру или функцию, то соответствующий параметр передают по ссылке, т.е. используют ключевое слово Var.

Типизированные файлы

Типизированный файл состоит из последовательности однотипных или одинаковых компонент и может содержать различное их число (возможно ни одной).

Тип компонент файла практически любой, но он не должен содержать внутри себя других файлов. Определяются файловые переменные следующим образом:

 

<список идентификаторов - имен файловых переменных>:

File of <тип компонентов файла>;

Примеры:

var

fl : File of Byte;

f2 : File of Char;

f3, f4: File of Integer;

f5 : File of RJon;

 

Файловая переменная связывается с именем файла на логическом диске. Для этого используют следующую процедуру Assign с двумя параметрами:

Assign ( fl1, St);

Здесь fl1- файловая переменная, передаваемая по ссылке;

S — путь и/или полное имя файла.

Примеры:

assign(f, 'с:\turbo\bgi\bgi.scr’);

assign(fl, 'c:\arm.txt');

assign (f 2, 'd:\pols\data\car.dat');

assign(f3, 'mytext');

 

В операционной системе есть понятие - текущего подкаталога или буквально — подкаталога, на котором находится указатель операционной системы. Все файловые операции, при которых явно не указывается путь к файлу, происходят именно в текущем подкаталоге. В Паскале для работы с файлами из текущего каталога достаточно при вызове процедуры assign указать только полное имя файла (последний пример из выше приведённых).

Чтобы начать работу с файлом, требуется его открыть. Попытка работы с неоткрытым файлом приведет к ошибке.

Существует две процедуры для открытия файла. Первая – Reset с одним параметром. Обращение к ней:

Reset( F);

Здесь F – файловая переменная. Эта процедура открывает существующий файл, связанный с файловой переменной F. Работая с файлами, приходится опираться на понятие - указателя в файле или файлового указателя. При открытии файла указатель устанавливается перед его первой компонентой. Вторая процедура Rewrite также с одним параметром. Обращение к ней:

Rewrite(F);

Она создаёт и открывает новый файл, связанный с файловой переменной F. Если файл с указанным именем уже существует, то старый файл будет стёрт и создан новый пустой файл. Текущий указатель файла устанавливается в его начало.

В программе любой файл (файловая переменная) может быть открыт повторно, т. е. файл, первоначально открытый для чтения, может быть открыт для записи и наоборот. Одна и та же файловая переменная может быть связана с различными физическими файлами ( но не одновременно).

Пример:

program p43;

var

f: file of byte;

begin

assign(f, 'c:\pols.txt');

rewrite (f) ;

{...}

close (f);

assign(f, 'c:\news.txt');

reset (f) ;

{...}

close (f) ;

end.

Часто важно знать находится ли указатель в конце файла (за последней компонентой)? В этом случае можно воспользоваться логической функцией Eof, которая возвращает значение true - если указатель в конце файла и false - если нет. Её параметром является файловая переменная.

Примеры фрагментов с использованием функции Eof:

t:= Eof(fl);

if Eof(f1) then...

While not Eof (f2) do....

 

Указатель файла можно воспринимать как обычный номер текущей компоненты, которые нумеруются начиная с нуля. Таким образом, типизированные файлы являются структурой данных прямого доступа по номеру его компоненты.

Чтение из типизированного файла осуществляется процедурой Read.

Read(<файловая переменная>, <список переменных>);

Примеры:

Read(f , a);

Read, (f, a, b, с) ;

Переменные считываются из файла и после выполнения каждой операции считывания указатель файла перемещается на следующую компоненту.

program р44;

var

f: file of byte;

a, b, c: byte;

begin

assign(f, 'dospl. pas');

reset (f);

read(f, a, b, c);

writeln{'a= ', a, ' b= ', b, ' c= ', c);

close(f);

end.

Запись в файл осуществляется с помощью процедуры Write.

Write(<файловая переменная>,<список переменных>);

 

Переменные записываются в файл и после каждой записи указатель в файле перемещается за последнюю компоненту.

Для перемещения указателя по файлу можно использовать процедуру Seek. Обращение к ней:

Seek( f; n);

После вызова процедуры указатель файла f перемещается на компоненту с номером n. Например, вызов Seek(f, FileSize(f)); приведет к перемещению указателя в самый конец файла (за последнюю компоненту).

Для определения номера компоненты, на которой находится указатель файла используют функцию FilePos.

Обращение к ней: FilePos( f) .

Функция возвращает целое число - номер текущей компоненты (тип Longint). Если процедура FilePos возвратила значение 0, то указатель стоит в самом начале файла перед первой компонентой. Если функции FilePos и FileSize возвращают одинаковые значения, то указатель находится в самом конце файла. Обращение к последней функции также содержит только файловую переменную. Результат выполнения функции FileSize - длинное целое число размер файла или количество его компонент (тип Longint). Если функция возвращает ноль, то файл пуст.

После работы с файлом (файловой переменной) или перед повторным открытием для корректного взаимодействия с операционной системой его необходимо закрыть. С этой целью используют процедуру Close. Обращение к ней содержит только один параметр – файловую переменную.

Примеры:

program p45;

{ открываем файл для записи с именем file.int, компонентами которого являются целые числа. Записываем в файл квадраты натуральных чисел от 1 до 100 }

var

f: file of Integer; {описываем файловую переменную}

i, t: integer;

begin

Assign(f, 'file.int'); {связываем файловую переменную

с именем файла на диске}

Rewrite(f); {открываем файл для записи}

for i :=1 to 100 do

begin

t:= sqr(i);

Write (f, t);{выводим в файл квадраты целых чисел}

end;

Close(f); {закрываем файл}

end.

 

program p46;

{открываем созданный предыдущей программой файл для

чтения и выводим его содержание на экран}

var

f: file of Integer; {описываем файловую переменную}

i, t: integer;

begin

Assign (f, ' file.int' ) ; { связываем файловую

переменную с именем файла на диске}

Reset(f); {открываем файл для чтения}

While not Eof(f) do begin

Read(f, t); {читаем очередную компоненту из

файла и..}

Write(t, ‘ ‘); {выводим ее на экран}

end;

Close{f); {закрываем файл}

end.

Когда приходится хранить в файле информацию о множестве объектов, у каждого из которых много различных признаков (значений различного типа), компонентами типизированных файлов можно делать записи.

Задача. Создать программу, записывающую в файл данные о книгах, хранящихся в библиотеке. Для каждой книги требуется следующая информация: номер, фамилия и. о. автора, название книги, количество страниц и год издания.

program p47;

type

Books = record

N: Integer;

Avtor: String[45];

Nazv: String[70];

Str: Integer;

God: Integer;

end;

var

bf: file of Books;

r: Books;

n, i: integer;

begin

Writeln('Введите количество книг ');

Readln(n);

Assign(bf, 'bibl. dat');

Rewrite(bf);

for i: = 1 to n do

begin

r. n:= i;

Write('введите фамилию и. о. автора ');

Readln(r. avtor);

Write('введите название книги ');

Readln(r. nazv);

Write('введите количество страниц ');

Readln(r.str) ;

Write('введите год издания ');

Readln(r. god) ;

Write(bf, r);

end;

Close(bf);

end.

Задача. В файле, компонентами которого являются записи - точки плоскости (record х, у: real; end;), выбрать только те, которые находятся в первой и третьей координатных четвертях и записать их в другой файл. Вывести на экран размеры первого и второго файлов.

program p48;

type

points= record

х, у: real;

end;

var

fl, f2: file of points;

p: points;

s1, s2: String;

i, nl, n2: Longlnt;

begin

Write('введите имя исходного файла ');

Readln(sl);

Write('введите имя результирующего файла ');

Readln(s2) ;

Assign(fl,s1);{связываем файловые переменные}

Assign(f2, s2); {с введенными именами файлов)

Reset (fl); {первый файл открываем для чтения}

Rewrite(f2); {а второй для записи}

While not Eof (fl) do

begin

Read(fl,p);{читаем очередную запись из первого

файла}

if ((р. х > 0) and (p. у > 0))

or ((р. х < 0) and (p. у < 0)) then

{если точка принадлежит первой или третьей

четверти, то выводим ее во второй файл; данное

условие можно было записать проще, но менее

понятно: if p.x*p. y>0 then... }

Write(f2, p);

end;

nl:=FileSize(f1); {получаем объем первого файла} n2:=FileSize(f2); {... второго}

Writeln('nl= ', nl, ' n2 = ', n2);

Close(fl); {закрываем файлы}

Close (f2) ;

end.

Если мы открываем файл в программе, то неплохо бы предвидеть различные аварийные ситуации: отсутствует файл с таким именем, не вставлен диск в дисковод и др. При возникновении подобных ситуаций в обычном режиме программа прерывается по ошибке. Но существует возможность избежать этого: директива компилятору {$i-} выключает режим проверки и реакции на ошибки ввода/вывода, а директива {$i+} включает. Однако продолжить выполнение программы в аварийной ситуации недостаточно, важно запрограммировать реакцию на нее - обработать ошибку. Для этого предназначена функция IOResult (результат выполнения операции ввода/вывода).

function IOResult: Integer;

Функция возвращает целое значение. Если операция ввода/вывода не привела к ошибке, то ее значение ноль, в противном случае функция возвращает номер ошибки. Если ошибка произошла, то все последующие операции ввода/вывода игнорируются до тех пор, пока не будет вызвана функция IOResult.

Номера ошибок:

100 Disk read error (ошибка диска при чтению);

101 Disk write error (ошибка диска при записи);

102 File not assigned (файловая переменная не связана

с физическим файлом);

103 File not open (файл не открыт);

104 File not open for input (файл не открыт для ввода);

105 File not open for output (файл не открыт для вывода);

106 Invalid numeric format (недопустимый числовой

формат).

Задача. Проверить существует ли файл с введенным с клавиатуры именем. Если существует, то получить файл с новым именем, в котором порядок следования компонент - байт, изменен на обратный.

program p4 9;

var

fl, f2: file of byte;

b: byte ;

sl, s2: String;

n, i: Longint;

begin

Write('введите имя исходного файла ');

Readln(sl);

Write('введите имя результирующего файла ');

Readln(s2);

Assign(fl,s1);{связываем файловые переменные с }

Assign{f2,s2);{введенными именами файлов}

{$i-} {- отключаем контроль ошибок в/в}

Reset (f1); {первый файл открываем для чтения)

if IOResult <> 0 then

begin

Writeln('Произошла ошибка, файл ', s1,'не существует');

Halt; {прерываем программу}

end;

{$I+} {- включаем контроль ошибок в/в }

Rewrite(f2); { второй файл для записи}

n:= FileSize (f1);

for i:= n - 1 downto 0 do

begin

Seek(fl, i); {- устанавливаем указатель на i-ую

компоненту первого файла}

Read(fl, b); {- читаем эту компоненту}

Write(f2, b); {и записываем во второй файл}

end;

Close(fl); {закрываем файлы}

Close (f2) ;

End.

Задача. Создайте программу, осуществляющую поиск по начальной части фамилии автора и выводящую на экран подходящие записи из файла о книгах (программа р47).

program p50;

type

Books = record

N: Integer;

Avtor: String[45];

Nazv: String[70];

Str: Integer;

God: Integer;

end;

var

bf: file of Books;

r: Books;

i: integer;

s: String;

begin

Writeln('Введите начальную часть фамилии автора'); Readln(s);

Assign(bf, 'bibl.dat’);

{Si-} {- отключаем контроль ошибок в/в}

Reset(bf); {файл открываем для чтения}

if IOResult <> 0 then

begin

Writeln('Произошла ошибка, файл bibl.dat не

существует');

Halt; (прерываем программу}

end;

{$I+} {- включаем контроль ошибок в/в}

While not Eof(bf) do

begin

Read(bf, r);

{ Функция Pos(SubS, S: String): Byte возвращает позицию, начиная с которой в строке S располагается подстрока SubS (0 - S не содержит SubS).}

if pos(s, r. avtor) = 1 then Writeln(r. n: 3, r. avtor: 12,

r. nazv: 14, r. str: 6, r. god: 8) ;

end;

Close(bf) ;

end.

Для работы с файловой системой нам могут понадобиться следующие процедуры из модуля System:

procedure ChDir(s: string);

Процедура изменяет текущий каталог. Здесь s-выражение, содержащее путь к новому каталогу.

Пример:

program p51;

Var

S: String;

begin

Write('Введите путь к каталогу');

Readln(S);

{$i-}

ChDir(S);

if IOResult <> 0 then

Writeln('Данный каталог отсутствует');

end.

Следующая процедура

procedure GetDir(d: byte; var s: string);

- возвращает имя текущего каталога для заданного логического диска. Здесь d – выражение целого типа; s -параметр переменная. (d=0 - означает текущий логический диск, d=1 - диск A, d=2 - диск В и т. д.)

Пример:

program p52 ;

var

s: String;

begin

GetDir (0, s) ;

Writeln (' текущий каталог ', s);

end.

Процедура

procedure MkDir(s: string);

создает новый каталог. Здесь s - строковое выражение, содержащее путь и имя каталога. Следующая процедура

procedure RmDir(s; string);

удаляет пустой каталог. Здесь s - путь и имя каталога.

Пример:

program р53;

var

S: String;

begin

S : = ' ABCD ' ;

{создаем новый каталог}

MkDir(S) ;

{ . . . и сразу его удаляем}

RmDir (S) ;

end.

Процедура

procedure Erase(var j);

удаляет файл. Здесь f- переменная файлового типа, связанная с именем внешнего файла с помощью процедуры Assign.

Пример:

program p54;

var

F: file;

Ch : Char ;

S: String;

begin

Write (' Введите имя удаляемого файла ')/'

Readln(S);

Assign(F, S) ;

{Si-}

Reset (F) ;

if lOResult <> 0 then

Writeln (' файл ' , S, ' отсутствует')

else

begin

Close (F) ;

Write ( 'Удалять ', S, '? (y/no) ' ) ;

Readln(Ch) ;

{Function UpCase(C: char): Char Преобразует латинскую букву в заглавную.}

if UpCase(Ch) = 'Y' then Erase (F) ;

end;

end.

Процедура

procedure Rename(var f; newname: string);

переименовывает файл. Здесь f - переменная файлового типа; newname - строка, содержащая новое имя внешнего файла.

Пример:

program p55;

var

f: file;

S1, S2: String;

begin

Write('Введите имя файла');

Readln(S1);

Write('Введите новое имя файла ');

Readln(S2);

Assign(f, S1);

Writeln{'Файл ', S1, ' переименован в ', S2);

Rename(f, S2} ;

end.

Текстовые файлы

В DOS текстовые файлы физически не отличаются от любых других, но в Паскале различия существенны. Элементами текстовых файлов являются символы, объединенные в строки, но текстовый файл это не file of Char или file of String. Каждая строка заканчивается в текстовом файле символом возврата каретки CR=#13 и перевода строки LF=#10. Заканчивается текстовый файл признаком конца файла SUB=#26. Работа с текстовыми файлами очень напоминает работу с консолью. Чтение из текстовых файлов очень похоже на ввод с клавиатуры, а запись в файл напоминает вывод на экран. Указатель в текстовом файле имеет много общего с текстовым курсором.

Доступ к элементам текстового файла организуется последовательно. Указатель при считывании очередного элемента файла перемещается к следующему элементу. Для записи в текстовый файл или чтения их него можно использовать процедуры Read, Readln, Write, Writeln. В качестве первого параметра в этих процедурах указывается файловая переменная, например:

Read(fp, a, s);

Здесь происходит присваивание переменным a и s значений двух очередных элементов их файла, связанного с файловой переменной fp.

При выполнении программы на Паскале автоматически открываются два стандартных файла текстового типа. Стандартные файлы имеют имена файловых переменных Input и Output. Стандартная файловая переменная Input представляет собой доступный только для чтения файл для ввода символов с клавиатуры. Вторая файловая переменная Output связана с доступным только для записи стандартным устройством вывода символов и графических элементов на экран монитора. Обращение к файлам Input и Output.происходит автоматически, без каких-либо дополнительных средств с помощью операторов Read, Readln, Write, Writeln. Имя файла в этих процедурах не указывается, если работа ведётся со стандартным файлом.

Приведём пример переназначения стандартных файлов (т.е. ввод с клавиатуры и вывод на экран) дисковым файлам.

program p73;

var

N, M: longint;

……….

begin

assign(Input, 'c:\test.txt');

reset (Input) ;

…………….

Read(N, M);

……………..

close (Input);

…………………

assign(Output, 'c:\test_rez.txt');

rewrite(Output) ;

………..

Write(N, M);

……………….

close (Output) ;

end.

Таким образом, эта программа введёт значения переменных N и M из текстового файла test.txt и выведёт результаты работы (значения переменных N и M) в файл test_rez.txt .

Файловая переменная для текстового файла описывается следующим образом:

<список идентификаторов - имен файловых переменных>:Text;

При работе с текстовым файлом, файловую переменную связывают с именем файла, обращаясь к процедуре Assign, а открывают для чтения и записи процедурами Reset и Rewrite соответственно. Процедура Reset открывает текстовый файл только для чтения. Открытый файл закрывается с помощью процедуры Close.

В текстовый файл, как и на экран, мы можем выводить значения выражений практически любого типа. При выводе значений операторами Write и WriteLn можно пользоваться стандартными средствами форматирования данных.

Примеры:

Write(f, x: 6: 4);

Writeln(g, 'Т= ' , f 5: 2) ;

После вывода оператором Write указатель текстового файла остается в конце выведенной строки, a WriteLn - переходит на начало следующей.

Примеры:

program p56;

{Программа выводит в текстовый файл матрицу n*m}

const

n= 3;

m= 4 ;

var

Т: array[1.. n, 1.. m] of real;

f: Text; {описываем файловую переменную}

S: String;

i, j: integer;

begin

Writeln('введите элементы матрицы ', n, '*', m) ;

For i:= 1 to n do

for j : = 1 to m do

begin

Write ('T[' , i, *, ' , j, '] = ') ;

Readln(T[i, j ] ) ;

end;

Writeln('введите имя файла');

Readln(s);

Assign(f, s); {связываем файловую переменную с

именем файла}

{$i-}

Rewrite(f); {открываем текстовый файл для записи}

If IOResult <> 0 then

begin

Writeln('Ошибка при открытии файла');

Halt;

end;

{$i+}

for i:= 1 to n do

begin

for j:= 1 to m do

Write(f, T[i, j] : 8: 3) ;

Writeln(f) ;

end;

Close (f);

end.

 

program p57;

{Программа читает матрицу n*m из текстового файла}

const

n= 3;

m= 4;

var

Т: array[1.. n, 1.. m] of real;

f: Text;

S: String;

i, j: integer;

begin

Writeln('введите имя файла');

Readln(s);

Assign(f, s);

{$i-}

Reset(f); {открываем текстовый файл для чтения}

if lOResult <> 0 then

begin

Writeln('Ошибка при открытии файла'};

Halt;

End;

{$i+}

for i:= 1 to n do

begin

for j:= 1 to m do

begin

Read(f, T[i, j] ) ;

Write(T[i, j] : 8: 3);

end;

Writeln;

End;

Close(f);

end.

 

Задача. Дан текстовый файл, создать второй текстовый файл, уплотнив первый, заменяя в каждой строке серии из двух или более пробелов (32 - ASCII) одним пробелом.

program р58;

var

fl, f2: Text;

S: String;

Sl, S2: String;

{функция параметром получает неуплотненную строку,

а возвращает уплотненную}

function Uplot(S: String): String;

var

Z: boolean;

begin

Z:= false;

repeat

if pos(' ', S) <> 0 then Delete (S, pos (' ', S) , 1)

else Z:= true;

Until Z;

Uplot:= S;

end;

 

begin

Write ('введите имя исходного файла ');

Readln(sl);

Write('введите имя файла с результатом');

Readln(s2);

Assign(fl, s1);

Assign(f2, s2) ;

{$i-}

Reset(fl);

if lOResult <> 0 then

begin

Writeln('Произошла ошибка, файл ', s1, 'не

существует');

Halt ;

end;

{$i+}

Rewrite(f2);

While not Eof(fl) do

begin

Readln(fl, S);

Writeln(f2, Uplot(S));

end;

Close(fl) ;

Close(f2) ;

end.

 

Задача. Даны два текстовых файла. Вывести на экран количество строк в первом и во втором файлах. Если количество строк одинаковое, то вывести на экран те строки второго файла, которые отличаются от соответствующих строк первого.

program p59;

const

Namel = 'filel. txt';

Name2= ‘file2. txt';

var

fl, f2: Text;

L, K: Integer;

S1, S2: String;

begin

Assign(fl, Namel);

Assign(f2, Name2);

{$i-}

Reset(fl) ;

Reset(f2) ;

if IQResult <> 0 then

begin

Writeln('Ошибка при открытии файлов');

Halt;

end;

{находим количество строк в первом файле}

L:= 0;

While not Eof(fl) do

begin

Readln(fl);

inc(L);

end;

{находим количество строк во втором файле}

К:= 0;

While not Eof(f2) do

begin

Readln(f2);

inc(K);

end;

Close (fl) ;

Close (f 2) ;

Reset (fl) ;

Reset (f2) ;

if К <> L then

begin

Writeln('файл ', namel, ' - ', L, ' строк' );

Writeln('файл ', namе2, ' - ', К, ' строк’ );

end

else

begin

K:= 0;

While not Eof(fl) do

begin

Readln(fl, SI) ;

Readln(f2, S2); Inc(K);

if S1 <> S2 then

begin

Writeln(' (' , K, '): ' , S1) ;

Writeln(' (', K, ') : ' , S2) ;

end;

end;

end;

Close (fl) ;

Close (f2);

end.

Иногда необходимо открыть текстовый файл для записи, и, не удаляя находящуюся в нем информацию, дописать что-то в его конец.

procedure Append(var f: Text);

Процедура Append открывает текстовый файл для дозаписи. Если файл с именем, указанным в Assign, не существует, то вызов процедуры Append приведет к ошибке.

Пример:

program р60;

{Программа дописывает в текстовый файл с матрицей новую матрицу - результат транспонирования первой}

Const

n = 3;

m = 4;

var

Т: array[1..n, 1.. m] of real;

ТТ: array[1.. m, 1.. n] of real;

f: Text;

S: String;

i, j: integer;

begin

Writeln('введите имя файла');

Readln(s);

Assign(f, s);

{$i-}

Reset (f) ;

if IOResult <> 0 then

begin

Writeln('Ошибка при открытии файла');

Halt;

end;

for i : = 1 to n do

for j := 1 to m do

begin

Read(f, T[i, j] );

TT[j, i] := T[i, j] ;

end;

Close (f); {закрываем файл}

{и повторно открываем его для до записи}

Append ( f ) ;

{выводим в файл пустую строку разделитель матриц) Writeln(f ) ;

for i:= 1 to m do

begin {выводим матрицу}

for j := 1 to n do

Write (f , TT[i, j] : 8: 3) ;

Writeln(f) ;

end;

Close (f) ;

end.

 

Полезны для работы с текстовыми файлами три стандартные логические функции (ниже f - файловая переменная):

· EOLN(f) – возвращает значение true, если в файле достигнут конец строки, false – в противном случае;

· SEEKEOLN(f) – пропускает пробелы и знаки табуляции до конца строки или до первого значащего символа и возвращает значение true, если достигнут конец строки, false – в противном случае;

· SEEKEOF(f) – пропускает все пробелы, знаки табуляции и маркеры конца строки до конца файла или до первого значащего символа и возвращает значение true, если достигнут конец файла, false – в противном случае.



2015-12-04 541 Обсуждений (0)
Область видимости идентификаторов 0.00 из 5.00 0 оценок









Обсуждение в статье: Область видимости идентификаторов

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (541)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.01 сек.)