yandex rtb 1
ГоловнаЗворотній зв'язок
yande share

Основы программирования

10. ФАЙЛЫ

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

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

Файл - это совокупность данных, размещенных на внешнем носителе. Данные в файле называются элементами. Количество данных в файле, в отличие от массива, в описании файла не указывают. Элемент файла не имеет индекса. Тип элементов может быть как простым, так и сложным, но не может быть файлом.

Файловый тип данных описывают в разделе описания типов так:

type <имя типа> = file of <базовый тип>;

или непосредственно в разделе объявления переменных

var <список переменных> -file of <базовый тип>;

Пример.

type                myfile = file of integer;

list = file of string[20];

var                  filel, file2: myfile; druzia: list;

komanda: file of boolean;

2. Действия с файлами. Чтобы найти нужный элемент файла, необходимо последовательно просмотреть все предыдущие элементы. Это называется последовательным доступом к файлу.

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

Для определения конца файла существует стандартная логическая функция

eof (<имя файла>);

Значение этой функции будет true, если достигнут конец файла.

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

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

assign(<имя файла>, <внешнее имя>) — обеспечивает связь между файловой переменнойи файлом на внешнем носителе;

reset (<имя файла>) — открывает файл для чтения из него данных;

read(<имя файла>, <имя переменной>) - читает (вводит) данные из файла в оперативную память;

сlозе(<имя файла>) - закрывает файл;

rewrite(<имя файла>)  —  открывает файл для записи в него данных;

write(<имя файла>, <имя переменной>) - записывает (выводит) данные в файл.

Здесь <имя файла> - имя, заданное в разделе объявления переменных, <внешнее имя> - имя файла данных на внешнем носителе, взятое в кавычк,и, например, 'd:\gruppal\labl.pas'.

Задача 1. Создать файл записей с информацией о компьютерах: марка (marka), объём винчестера (hdd), объём оперативной памяти (ram) и быстродействие (speed). Вывести содержимое файла на экран.

program Computer!;

uses Crt;

type comp = record                          {Описываем тип - запись с }

marka : string[15];     {характеристиками}

hdd, ram : real;           {компьютера}

speed : integer;

end;

myfile = file of comp;

var fl : myfile;

i, n : integer;

cl : comp;

begin

clrscr;

writeln('Введите количество компьютеров');

readln(n);

assign(fl, 'd:\computer');

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

rewrite(fl);

for i:=l to n do

begin

writeln('Введите марку компьютера:');

readln(c1. marka);

writeln(‘Введите объёмы его HDD и RAM:’);

readln(cl.hdd, cl.ram);

writeln('Введите быстродействие:');

readln(cl .speed);

{Записываем введённые данные в файл f1}

write(fl, cl);

end;

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

writeln(' Марка        Объём винчестера

RAM       Быстродействие');

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

reset(fl);

for i:=l to n do                       {Выводим содержимое}

begin                                      {файла на экран}

{Считываем очередные данные из файла}

read(fl, cl);

write(cl.marka: 15, cl.hdd:10, cl.ram:7, cl.speed:8);

writeln;

end;

    readln

end.

Задание 1. Пусть количество данных заранее неизвестно. Модифицируйте программу, используя при вводе данных команду while с условием конца ввода. При считывании данных из файла употребите функцию eof.

Задание 2. Решите задачу № 19 своего варианта.

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

program Computer;

uses Crt;

type comp = record

marka : string[15];

hdd, ram : real;

speed : integer;

end;

myfile = file of comp;

var fl : myfile;

i, n : integer;

cl : comp;

begin

clrscr;

assign(fl, 'd:\computer');

{Открываем файл для считывания данных)

reset(fl);

while not eof(fl) do     {Выполняем цикл, пока не }

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

read(fl, cl);                  {Считываем данные с файла}

if cl.speed > 166 then

writeln(cl.marka:15, cl.hdd:8:2, cl.ram:8:2);

end;

readln

end.

Задание 3. Решите задачу № 20 своего варианта.

Замечание. Кроме файлов последовательного доступа можно создавать и обрабатывать файлы прямого доступа. Отличие следующее: перед выполнением команд read или write следует обеспечить доступ к k-му элементу файла (нумерация элементов начинается с нуля) с помощью команды

seek(<имя файла>, k);

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

Элементами текстовых файлов являются строки (последовательности символов: букв, цифр, знаков и пропусков). Такой файл можно создавать и править текстовым редактором. Разделителем между данными является пропуск. Ввод каждой строки заканчивается нажатием клавиши Enter. Для проверки наличия символов в строке используют функцию,

еоlп(<имя файла>);

которая принимает значения true, если достигнут конец строки.

Текстовые файлы описывают в разделе объявления переменных так:

var <список имен переменных> : text;

Данные из текстового файла можно считывать с помощью команд

read(<имя файла>, <список параметров>);

readln(<имя файла>, <список параметров>);

действие которых было описано выше. Различие между этими командами такое: во время выполнения команды readln лишние данные в строке игнорируются и следующая команда read или readln будет считывать данные со следующей строки.

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

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

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

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

append(<имя файла>);

Задача 3. Пусть некоторым текстовым редактором создан файл reki.txt, в котором содержится информация о длинах рек в километрах и площадях их бассейнов в квадратных километрах:

Нил                            6671    2870000

Миссисипи               6420    3238000

Амазонка                   6280    6915000

Обь                             5410    2990000

Амур                          4416    1855000

Лена                           4400    2490000

Конго                         4320    3690000

Нигер                         4160    2092000

Волга                         3531    1360000

Выведите все данные с файла на экран, определите названия самой длинной реки и реки с самым большим бассейном.

program Textfile;

uses Crt;

type reka = record

name : string[10];

dl : integer;

pi : longint

end;

var myfile : text;

myzap : reka;

namemax, nameplmax : string[ll];

dlmax : integer;

plmax : longint;

begin

clrscr;

dlmax := 0;

plmax := 0;

writeln('Название реки, Длина (км),   Бассейн (кв.км)');

assign(myf ile,' d: \reki. txt');

reset(myfile);

while not eof(myfile) do

with myzap do

begin

readln(myfile, name, dl, pi);

writeln(name:10, dl:10, pl:15);

if dl > dlmax then

begin

dlmax := dl;

namemax := name

end;

if plmax < pi then

begin

plmax := pi;

nameplmax := name

end;

end;

writeln('Самая длинная река - ', namemax);

writeln('Самый большой бассейн реки ', nameplmax);

readln

end.

Задание 3. Решите задачу № 21 своего варианта.

4. Сортировка данных. Задачи сортировки и поиска нужной информации в файлах или массивах имеют важное значение. Рассмотрим алгоритм сортировки элементов по возрастанию методом обмена. Этот метод заключается в следующем: рассматривают набор данных и первую пару элементов. Если первый элемент больше второго, то их меняют местами. Второй элемент сравнивают с третьим и, если нужно, меняют их местами и т.д. Максимальный элемент окажется в конце набора, то есть там, где необходимо. Теперь рассматриваем снова набор данных, но уже без последнего элемента, и применяем к нему метод обмена — второй по величине элемент окажется в конце набора на предпоследнем месте и т.д. Если в наборе п элементов, то метод необходимо применить п — 1 раз, каждый раз всё к меньшему количеству элементов. Отсортированные элементы будут в конце набора.

Задача 4. Пусть некоторым текстовым редактором создан файл reki.txt, в котором содержится информация о длинах 9 рек в ки­лометрах и площадях их бассейнов в квадратных километрах (см. задачу 3). Вывести данные из файла на экран. Занести файл в оперативную память в структуру данных массив. Отсортировать данные по алфавиту и вывести их на экран.

program Textfile 1;

uses Crt;

type reka = record

name : string[10];

dl : integer;

pi : longint

end;

const k=9;

var       myfile : text;

myzap : reka;

i, j : integer;

mas: array [1 .. k] of reka;

begin

clrscr;

assign(myfile,'d:\reki.txt');

reset(myfile);

writeln('            Данный файл');

writelnf Название реки, Длина (км),   Бассейн (кв.км)');

while not eof(myfile) do

begin

readln(myfile,myzap.name, myzap.dl, myzap.pl);

writeln(myzap.name:10, myzap.dl:10, myzap.pl:15);

mas[k]:=myzap;

end;

close(myfile);

for i:=l to k-1 do

for j:=l to k-i do

begin

if mas[j].name > mas[j+l].name then

begin

myzap:=mas[j];

mas[j]:=mas[j+l];

mas[j+l]:=myzap;

end;

end;

writeln(' Новый файл');

writeln('Название реки, Длина (км),  Бассейн (кв.км)');

for i:=l to k do

with mas[i] do

writeln(name:10, dl:10, pl:15);

            readln

end.

Задание 4. Решите задачу № 22 своего варианта, используя структуру данных массив записей.

 

 

18