Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка Паскаль

.pdf
Скачиваний:
101
Добавлен:
30.04.2015
Размер:
592.26 Кб
Скачать

{ б) поиск в файле студентов заданного года рождения }

Write (‘Задайте нужный год рождения ’);

Readln (x);

{ вводим год для поиска }

Reset (f);

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

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, fam); { читаем из файла фамилию и символ Eoln } Readln (f, year);{ читаем из файла год рождения и символ Eoln}

If year = x then { если год рождения очередного студента ра-

вен требуемому }

Writeln (fam) { выводим фамилию на экран }

End;

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

{ в) дополнение файла данными о новом студенте }

Write (‘Введите фамилию нового студента ’);

Readln (fam);

Write (‘Введите год его рождения ’);

Readln (year);

Append (f);

{ открываем файл для дополнения }

Writeln (f, fam);

{ дописываем в файл новую фамилию (и Eoln) }

Writeln (f, year);

{ дописываем в файл год рождения (и Eoln) }

Close (f);

{ закрываем файл }

Readln

 

 

End.

Примечание. В приведенном примере программы при дополнении файла данными о новом студенте не производится проверка условия, что ин-

формация о новом студенте уже есть в файле.

81

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

Записи типизированного (структурированного) файла имеют одинако-

вый тип (а значит, имеют одинаковый размер – именно поэтому к ним и возможен прямой доступ). Структуру типизированного файла представлена на Рис. 7.

Запись 0

Запись 1

Запись 2

Запись 3

Eof

Рис. 7. Структура типизированного файла

Записи файла пронумерованы. Нумерация начинается с нуля. В конце файла записан специальный неотображаемый символ Eof («End of file» - ко-

нец файла).

Для работы с типизированными файлами в языке Паскаль используют-

ся следующие команды, описания и функции: 1. Описание файловой переменной:

Var f : File Of <тип записи файла>;

где f – имя файловой переменной.

Файловая переменная – это переменная-указатель, посредством кото-

рой идет взаимодействие программы (чтение/запись данных) с внешним файлом.

Записи файла могут иметь любой из рассмотренных выше типов (как стандартный, так и сконструированный в блоке Type).

Например:

Type Stud = Record

Name : String;

Group : Integer;

82

Rating : Real

End;

 

Var f1 : File of Stud;

{ записями файла f1 являются записи (Record)

из трех полей }

f2 : File Of Integer; { записи файла f2 – целые числа }

2. Связывание файловой переменной с конкретным именем внешне-

го файла:

Assign ( f, <имя файла> );

где f – имя файловой переменной, <имя файла> - строковая константа или переменная. Например, выполнение команды Assign ( f, ’c:\tp70\data’ ) свя-

жет файловую переменную f с файлом «data», который расположен на диске

C: в папке с именем «tp70». После записи такой команды в тексте программы нигде далее не будет указываться имя файла, с которым работает программа.

3. Открытие файла для записи данных:

Rewrite (f);

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

4. Открытие файла для чтения данных:

Reset (f);

Для чтения можно открыть только существующий файл. Указатель ус-

танавливается на первую запись (т.е. на первый символ первой строки) фай-

ла.

5. Запись данных в файл:

Write ( f, <имя переменной> );

Тип переменной должен совпадать с типом записей файла. 6. Чтение данных из файла:

Read ( f, <имя переменной> );

7. Закрытие файла:

Close ( f );

8. Функция FileSize( f ) возвращает количество записей в файле. 83

9.Функция FilePos ( f ) возвращает номер текущей записи, т.е. той записи файла, на которую указывает указатель.

10.Команда Seek ( f , n ) устанавливает указатель на запись файла с номером n. Например, команда Seek ( f , FileSize( f ) ) установит указатель

после последней записи файла. Это позволяет, в частности, дописывать дан-

ные в конец типизированного файла.

Примеры решаемых задач Пример 1. Составить программу, которая:

а) запишет в файл Price список товаров (название и цена);

б) обработает файл Price следующим образом:

-выведет на экран прайс-лист;

-изменит цену товара с заданным наименованием;

-допишет в файл данные о новом товаре (предварительно проверив,

что в файле информации о таком товаре нет).

Программы:

Program A;

Uses Crt;

Type tovar = Record

name : String; price : Real

End;

Var t : tovar; { переменная t для хранения информации об очередном товаре }

f : File Of tovar; { f – файловая переменная } k, n : Integer;

Begin

Clrscr;

Assign (f, ’Price’); { связывание файловой переменной f с файлом

‘Price’, который будет создан в текущей папке }

84

Rewrite(f);

{ открыли файл для записи }

Write (‘Введите количество товаров в списке ‘);

Readln (n);

 

 

For k:=1 To n Do

 

Begin

 

 

Write (‘Введите наименование ’,k,’-го товара ’);

Readln (t.name);

{ запросили значение первого поля записи }

Write (‘Введите цену товара ’);

Readln (t.price);

{ запросили значение второго поля записи }

Writeln (f, t)

{ записали в файл запись t }

End;

 

 

Close (f);

{ закрыли файл }

Writeln (‘Файл создан’); { вывели на экран поясняющее сообщение} Readln

End.

Program B;

Uses Crt;

Type tovar = Record

name : String; price : Real

End;

Var t : tovar; { переменная t для хранения информации об очередном товаре }

f : File Of tovar; { f – файловая переменная } k, n : Integer;

nt : String; new_price : Real; new_t : tovar;

Begin

Clrscr;

85

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

Assign (f, ’Price’); { связывание файловой переменной f с файлом

 

 

‘Price’, который будет создан в текущей папке }

{ вывод на экран содержимого файла }

Reset (f);

{ открыли файл }

Writeln (‘Прайс – лист: ‘);

While Not Eof (f) Do

{ пока не достигнут конец файла }

Begin

 

 

Readln (f, t);

{ прочитали из файла очередную запись в пе-

 

 

ременную t }

Writeln (t.name:20, t.price:10:2) { вывели на экран значения

 

 

полей записи – наименование и цену товара }

End;

 

 

Close (f);

{ закрыли файл }

{ изменение цены отдельного товара }

Reset (f);

{ открыли файл }

Write (‘Введите наименование товара, у которого меняется цена ‘); Readln (name_t);

Write (‘Введите новую цену ‘);

Readln (new_p);

While Not Eof (f) Do

Begin

Readln (f, t);

If t.name = nt

Then Begin

t.price := new_price; { меняем цену товара в записи t }

86

Seek (f, FilePos (f) -1); { устанавливаем указатель обратно на ту запись в файле, у которой из-

менили цену}

Write (f, t) { записываем переменную t с изменен-

ным значением поля price в файл }

End

End;

Close (f); { закрыли файл }

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

Write (‘Введите наименование нового товара ‘);

Readln (new_t.name);

Write (‘Введите цену ‘);

Readln (new_t.price);

Reset (f); { открыли файл }

{ проверим, есть ли данные о таком товаре в файле }

flag := false; { сначала считаем, что такого товара в файле нет }

While Not Eof (f) Do

{ пока не достигнут конец файла }

Begin

 

Readln (f, t);

{ прочитали из файла очередную запись в пе-

 

ременную t }

If t.name = new_t.name { если прочитанное из файла наиме-

 

нование товара совпадает с тем, который

 

хотим дописать в файл}

Then Flag := True { запоминаем, что данные о таком

 

товаре есть в файле}

End;

 

If Not flag { если данных о новом товаре в файле не найдено (т.е.

значение переменной flag осталось равным false) } Then Begin

87

Seek (f, FileSize (f) ); { устанавили указатель в конец файла }

Write (f, new_t) { записали в файл данные о новом товаре}

End;

Close (f); { закрыли файл }

Writeln (‘Новые данные дописаны в файл’);

Readln

End.

Примечание. При проверке, есть ли в файле данные о новом товаре или нет,

правильнее заголовок цикла While записать в виде:

While (Not Eof (f)) And (Not Flag)Do …

т.е. «пока не конец файла и товар не найден». Это означает, что просмотр файла будет выполняться либо до конца файла, либо до тех пор, пока в файле не будет найден новый товар.

Контрольные задания

13.1.Составить две программы. Первая из них записывает в текстовый файл N строк текста. Вторая должна выводить текст из файла на экран в виде строк заданной длины.

13.2.«Роза ветров». Файл содержит информацию о том, направлении ветра в течение каждого для прошедшего года в некотором населенном пунк-

те. Составить программу, которая определяет, в каком направлении от города нужно строить металлургический комбинат. Файл должен создаваться вспо-

могательной программой.

13.2. «База данных». Составить программу, которая создает и обраба-

тывает базу данных о a.) книгах;

b.) товарах на складе;

88

c.) кинофильмах; d.) школах города;

e.) факультетах университета; f.) сотрудниках фирмы.

Информация об объекте в базе данных должна представлять собой со-

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

лагать пользователю следующие режимы работы:

1.Ввод данных.

2.Вывод данных на экран.

3.Дополнение базы данных.

4.Редактирование базы данных.

5.Поиск данных.

6.Сортировка данных.

7.Завершение работы.

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

тель не выберет режим «Завершение работы».

89

Тема 14. Динамические переменные в языке Паскаль

Краткое изложение теоретического материала Статические и динамические переменные

Переменные в тексте программы описываются в разделе описания пе-

ременных. Например:

Var a, b : integer; s : string;

m : array [1..100] of real;

Такие «обычные» статические переменные располагаются в части оперативной памяти компьютера, называемой сегментом данных (64 Кб).

Перед исполнением программы в сегменте данных резервируются участки памяти, размер которых соответствует типу переменных, описанных в разде-

ле описания переменных (VAR).

Кроме того, программист имеет возможность использовать в своей программе динамические переменные, память для которых резервируется уже в процессе исполнения программы и затем, если в них больше нет необ-

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

ляемая память называется кучей (Heap-областью).

Необходимость в использовании динамических переменных возникает

вследующих случаях:

1.Программа должна обрабатывать большие объемы данных (более 64

Кб).

2. Программа должна обрабатывать данные, объем памяти для хране-

ния которых заранее неизвестен.

3.Тип обрабатываемых данных заранее неизвестен.

4.Программа использует динамические структуры данных (стек, оче-

редь, двунаправленный список, дерево, граф и т.п.).

90