Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Pascal.doc
Скачиваний:
16
Добавлен:
06.09.2019
Размер:
3.69 Mб
Скачать

Файловый тип данных

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

Файл - это область памяти на внешнем носителе, в которой хранится некоторая информация.

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

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

Зачем нужны файлы? Объем информации, которую можно сохранить в файле, очень велик. Он значительно больше, чем объем, который можно хранить в оперативной памяти, например, при использовании массивов.

Объявление файловой переменной в разделе описаний имеет вид:

VAR <имя файла>: FILE OF <тип элемента>

Например,

VAR FT: FILE OF INTEGER;

VAR M: FILE OF CHAR;

TYPE F=FILE OF REAL ИЛИ

VAR F1:FILE OF REAL

VAR F:TEXT;

Так как в описании указывается тип элементов, такие файлы называются типизированными. Все элементы файла пронумерованы, начиная с нуля.

Для установления связи между файловой переменной в программе и физическим файлом на внешнем устройстве используется процедура:

ASSIGN (назначить)

Формат процедуры:

ASSIGN (имя файловой переменной,'имя файла на диске')

assign(f1,'prog1.dat');

После установления такого соответствия все операции, выполняемые над переменной F1, будут выполняться над файлом, хранящимся на диске с и имеющим имя prog1.dat.

Файл в каждый момент времени может находиться в одном из двух состояний:

либо он открыт только для записи,

либо только для чтения.

Файл открывается с помощью процедуры RESET(имя файла) - для чтения.

Для записи файл открывается с помощью процедуры REWRITE(имя файла).

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

Процедура RESET так же устанавливает на начало и происходит считывание. Запись и чтение можно осуществить с помощью операторов READ, READLN,WRITE,WRITELN.

В этом случае используется такая форма записи:

READ (имя файла, имя переменной)

Процедура CLOSE(закрыть) используется для закрытия файла, когда все действия в нем закончены

CLOSE(имя файла)

Например,

CLOSE(F)

Стандартная функция EOF(имя файла) используется для определения, достигнут ли конец файла (принимает значение ложь или истина).

Элементы в файле хранятся по строкам. Для определения конца строки файла используется оператор цикла WHILE NOT EOLN(имя файла) do, а для перехода на новую строку файла - оператор readln(имя файла).

Пример 1 – Считывание данных из файла

На диске С находится файл с именем «data.dat». В нем находятся следующие числа – 123, 456, 789, 987, 654, 321. Причем первые три числа отделены друг от друга пробелами, а последние три - каждое стоит в отдельной строке. Если такого файла на диске нет – создайте его самостоятельно (Shift + F4).

Задание – вывести все данные из этого файла на экран компьютера.

Решение:

program proba1;

var

f:text; {объявляем файловую переменную}

x:integer; {сюда будем помещать значение из файловой переменной}

begin

assign(f,'c:\data.dat'); reset(f); {привязали к переменной конкретный файл, и открыли его для чтения}

while not eof(f) do {пока файл не закончится, выполнять}

begin

while not eoln(f) do {пока строка в файле не закончится, выполнять}

begin

read(f,x); {считываем очередное число в переменную х из файла}

writeln('То, что хранится в файле: ',x); {выводит это число на экран}

end;

readln(f); {переход на следующую строку файла}

end;

close(f);{закрыть файл после использования}

end.

Самостоятельно:

Создать с помощью DOS Navigator текстовый файл (Shift + F4) с именем «Familia.txt». Поместите в него через пробел 5 любых фамилий. Напишите программу, которая выведет эти фамилии на экран. Используйте переменную типа CHAR для записи в нее данных из файла. При выводе на экран фамилии выведутся побуквенно.

Решение:

program samost;

var f:text;

fam:char;

begin

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

while not eof(f) do

begin

while not eoln(f) do

begin

read(f,fam);

writeln('Что хранится в файле: ',fam); end;

readln(f);

end;

close(f);

end.

Измените программу – тип CHAR замените на STRING (это строковый тип). Строковый тип данный отличается от символьного тем, что переменные этого типа могут хранить набор символов (строку) вместо одного символа. При считывании в строковую переменную считывается вся строка из файла до конца строки (со всеми знаками препинания до символа перевода строки). Поэтому при выводе на экран в одной строке выведется сразу все пять фамилий.

Решение:

program samost;

var f:text;

fam:string;

begin

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

while not eof(f) do

begin

while not eoln(f) do

begin

read(f,fam);

writeln('Что хранится в файле: ',fam);

end;

readln(f);

end;

close(f);

end.

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

Решение:

program samost;

var f:text;

fam:string;

n:integer; {для нумерации строк}

begin

n:=0;

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

while not eof(f) do

begin

n:=n+1;

write('Строка № ',n);

while not eoln(f) do

begin

read(f,fam);

writeln(' Что хранится в файле: ',fam);

end;

readln(f);

end;

close(f);

end.

Пример 2 – Запись данных в файл

Написать программу, записывающую в файл «numbers.txt»в одну строку из 10 случайных чисел в диапазоне от 0 до 1000 через пробел. Выйти из среды ВР и просмотреть содержимое файла в DOS Navigator (F4).

Решение:

program samost2;

var f:text;

num:integer;

i:integer;

begin

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

for i:=1 to 10 do

begin

num:=random(1000);

write(f,num,' ');

end;

close(f);

end.

Самостоятельно:

Написать программу, записывающую введенную с клавиатуры фамилию, в файл «Fam.txt»

Решение:

program samost3;

var f:text;

fam:string;

begin

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

write('Введите фамилию для записи в файл: ');readln(fam);

write(f,fam);

close(f);

end.

Пример 3.

Пусть на диске имеется файл с именем d1.dat, в котором записаны данные (разделены пробелами):

0.54 1.7 4.56 0.2

1.32 1.524 18 0.98

5.6 7.7

Необходимо сделать эти данные доступными программе и вычислить их сумму.

Решение

program fff1;

var f1:text;l1:integer;

x,sum:real;

begin

sum:=0; l1:=1;

assign(f1,'c:d1.dat'); {привязали файловую переменную к файлу}

reset(f1); {открыли файл для чтения}

while not eof(f1) do {пока не встретится конец файла, выполнять}

begin

while not eoln(f1) do {пока не встретится конец текущей строки, выполнять}

begin

read(f1,x); {считать данное в переменную х}

sum:=sum+x;

end;

readln(f1); {переместиться на след. строку}

end;

write('сумма=',sum:8:3);

close(f1);

end.

Ответ: 42.124

Пример 4.

Пусть переменная a и b получают следующие значения: a=510, b=16.2. Требуется записать в файл с именем

d2.dat строку в виде: a=510 b=16.2

Решение.

program fff2;

var f2:text;l2,a:integer;

b:real;

begin

l2:=1;

assign(f2,'c:d2.dat');

a:=510;b:=16.2;

rewrite(f2);

write(f2,'a=',a:3,' ','b=',b:4:1);

close(f2);

end.

Пример 5.

Имеется электронная ведомость по результатам экзамена в группе.

Будем считать его входным файлом с именем vedom.dat:

-------------------------

предмет "физика"

группа т-12

-------------------------

Алексеев С.А. :5

Вертышев А.Ю. :4

Колдаев В.Д. :5

Петрова Н.Д. :4

Федоренко Р.Ф. :3

Шаронин А.В. :4

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

***************************

средний балл в группе 4.17

количество учащихся 6

Решение.

program fff3;

var

finp,fout:text;

l1,l2,n,c:integer;

sr,sum:real;

smb:char;

begin

l1:=1;assign(finp,'c:vedom.dat');

l2:=1;

assign(fout,'c:rez.pas');

reset(finp);

rewrite(fout);

n:=0;sum:=0;

while not eof(finp) do

begin

while not eoln(finp) do

begin

read(finp,smb); {посимвольное чтение файла}

write(fout,smb);

if smb=':' then

begin

read(finp,c); write(fout,c:3);

sum:=sum+c; {считаем оценки}

n:=n+1; {считаем учеников}

end;

end;

readln(finp); {на след. Строку для чтения}

writeln(fout); {на след. Строку для записи}

end;

sr:=sum/n;

writeln(fout,'***************************');

writeln(fout,'средний балл в группе',sr:5:2);

writeln(fout,'количество учащихся',n:4);

writeln('вычисления закончены,',' результаты смотрите в файле rez.pas');

close(fout);

close(finp);

end.

ОТВЕТ:

-------------------------

предмет "физика"

группа т-12

-------------------------

Алексеев С.А. : 5

Вертышев А.Ю. : 4

Колдаев В.Д. : 5

Петрова Н.Д. : 4

Федоренко Р.Ф. : 3

Шаронин А.В. : 4

***************************

средний балл в группе 4.17

количество учащихся 6

Пример 6.

В файле dan1.dat записаны целые числа в нескольких строках.

3 5 2

4 9 1

1 7 1

6 2 8

Вычислить сумму элементов каждой строки и результаты вместе с исходными данными поместить в файл с именем dan2.dat

Решение.

program fff4;

var f1,f2:text;lin1,lin2,x,sum:integer;

begin

sum:=0;

assign(f1,'c:dan1.dat');

assign(f2,'c:dan2.dat');

reset(f1);

rewrite(f2);

sum:=0;

while not eof(f1) do

begin

sum:=0;

while not eoln(f1) do

begin

read(f1,x);

write(f2,x:3);

sum:=sum+x;

end;

writeln(f2,' ':3,'сумма',sum:4);

readln(f1);

end;

writeln('Результат находится в файле dan2.dat');

close(f1);

close(f2);

end.

Ответ:

3 5 2 сумма 10

4 9 1 сумма 14

1 7 1 сумма 9

6 2 8 сумма 16

Самостоятельно:

Создайте файл кom1.dat, в котором хранится следующая информация:

КОРВЕТ : 48

УКНЦ : 96

ЯМАХА MSX-1 : 16

ЯМАХА MSX-2 : 128

БК-0010 : 16

IBM PC/XT : 256

IBM PC/AT : 512

Где указана видеопамять в кбайт. Необходимо создать файл с именем Ком2.dat, в котором должна быть представлена следующая информация:

  • Заголовок таблицы,

  • вся исходная информация,

  • объем видеопамяти в Кбайт и в мбайт.

Таблица должна иметь следующий вид:

НАЗВАНИЕ ЭВМ ВИДЕОПАМЯТЬ ВИДЕОПАМЯТЬ

(КБАЙТ) (МБАЙТ)

-------------------------------------------------------------------------------

КОРВЕТ : 48 ?

УКНЦ : 96 ?

ЯМАХА MSX-1 : 16 ?

ЯМАХА MSX-2 : 128 ?

БК-0010 : 16 ?

IBM PC/XT : 256 ?

IBM PC/AT : 512 ?

Самостоятельно:

Составить программу для следующей задачи:

Имеется ведомость по результатам сдачи экзамена по ОИВТ

_______________________________________

предмет информатика

класс 10-а

______________________________________

Иванов : 5

Ковалев : 5

Петров : 4

Сидоров : 3

Яковлев : 2

________________________________________

Составить программу, которая подсчитывает количество учащихся получивших 2, 3, 4, 5 и результаты помещает во внешний файл

_______________________________________

предмет информатика

класс 10-а

______________________________________

Иванов : 5

Ковалев : 5

Петров : 4

Сидоров : 3

Яковлев : 2

________________________________________

Количество “2” -

Количество “3 -

Количество “4 -

Количество “5 -