
- •Лекція №11. Записи і файли.
- •6.1. Записи.
- •Im: string[8];
- •Var k1,k2,k3:zap;
- •Im: string[8];
- •Var k1,k2,k3:zap;
- •With zap do оператор;
- •Im: string[8];
- •Var k1,k2,k3:zap;
- •Assign (f,’ff’);
- •Var f: file of integer;
- •Var t: text;
- •Var ff:file;
- •Var f:file;
- •Rewrite(ім’я_файлу);
- •Write (ім’я_файлу, список змінних);
- •Read(ім’я_файлової_змінної, список змінних);
- •Im:string[10];
- •Var s,s2:stud;
- •Var f1,f:file of real;
- •Тести для підсумкового контролю.
- •2. Чи вірно, що назви полів записів можуть співпадати з іменами змінних, констант та інших об’єктів програми, але не можуть співпадати з назвами полів інших записів?
- •X,y:real;
- •Var k:circ;
- •5. Чи можливо, прочитавши з файлу п’ятий елемент, зразу читати другий елемент?
Im:string[10];
pb:string[15];
gr:string[8];
oc:record
m,op,f,iu:byte;
end;
end;
Var s,s2:stud;
f:file of stud;
c:real;
t:byte;
begin
assign(f,'ff.dat');
reset(f);
clrscr;
t:=5; {виведення інформації буде починаться з 5 рядка екрану}
while not eof(f) do
begin
read(f,s);
gotoxy(5,t);
writeln(s.pr);
gotoxy(20,t);
writeln(s.im);
gotoxy(30,t);
writeln(s.pb);
gotoxy(40,t);
writeln(s.gr);
with s do
begin
c:=(oc.m+oc.op+oc.f+oc.iu)/4;{обчислюється середній бал успішності студента}
end;
gotoxy(50,t);
writeln(c:6:2);
t:=t+1; {перехід на новий рядок}
end;
readln;
end.
Взагалі до типізованих файлів звертаються тоді, коли треба не тільки зберегти інформацію та виконати пошук у файлі, але якимсь чином змінити її.
Над файлами дуже часто виконується операція впорядкування записів по зростанню або спаданню деякого ключа, в якості якого виступає самий запис або поле запису. Крім того виконуються операції включення запису в середину файлу або виключення запису. Це можливо виконувати за двома методами: за допомогою додаткового масиву або через організацію прямого доступу до даних файлу. Додатковий масив доцільно використовувати, якщо розмір файлу невеликий. Наприклад, з файлу, що містить список студентів, вилучити запис про студентів, які мають більш ніж дві незадовільні оцінки. Переглянемо заданий файл. Ті записи, які не відповідають поставленій умові, перепишемо в новий файл. Після цього старий файл вилучимо.
У зв’язку з тим, що елементи типізованого файлу мають сталий розмір, то можливо використати прямий доступ до даних. Для організації прямого доступу до даних файлу використовують наступні процедури:
seek(f, n); - переводить вказівку файлу на компоненту, яка має номер n.
truncate(f);- видаляється частина файлу, починаючи з поточної позиції.
Розглянемо декілька задач:
Приклад 6.1. Створити файл дійсних чисел.
Var f1,f:file of real;
x: real;
c:char;
begin
assign(f,'f.dat');
rewrite(f);
repeat
writeln('вв.число');
readln(x);
write(f,x);
writeln('вв.0,якщо треба припинити введення, інакше 1');
readln(c);
until c='0';
end.
Приклад 6.2. Із створенного файлу дійсних чисел вибрати непарні та записати їх в новий файл.
var f1,f:file of real;
x: real;
begin
assign(f,'f.dat');
reset(f);
assign(f1,'f1');{новий файл непарних чисел}
rewrite(f1);
while not eof(f) do
begin
read(f,x);
if x/2<>int(x/2) then
write(f1,x);
end;
close(f);
reset(f1);
while not eof(f1) do
begin
read(f1,x);
writeln(x);
end;
close(f1);
end.
Приклад 6.3. Впорядкувати файл дійсних чисел по зростанню його елементів. Спочатку використаємо додатковий масив дійсних чисел:
var f:file of real;
a:array [1..100] of real;
x: real;
c:char;
k,l,i:byte;
begin
assign(f,'f.dat');
reset(f);i:=0;
while not eof(f) do
begin
inc(i);
read(f,a[i]);{У масив зчитуємо елементи файлу}
end;
for k:=1 to i-1 do{Впорядковуємо масив}
for l:=k+1 to i do
if a[k]>a[l] then
begin
x:=a[k];
a[k]:=a[l];
a[l]:=x;
end;
rewrite(f);{У файл з самого початку переписуємо елементи масиву}
for k:=1 to i do
write(f,a[k]);
reset(f);
while not eof(f) do
begin
read(f,x);
writeln(x);
end;
end.
Приклад 6.4. Впорядкування файлу без використання додаткового масиву:
var f:file of real;
x,y: real;
k,i:byte;
begin
assign(f,'f.dat');
repeat
k:=0;
i:=0;
reset(f);
read(f,x); {зчитуємо перше число з файлу}
while i<filesize(f)-1 do
begin
inc(i);
read(f,y); {зчитуємо друге число з файлу}
if x>y then
begin
seek(f,i-1); {знаходимо попередній запис}
write(f,y);{запишемо менше число у файл}
seek(f,i);{знайдемо наступний запис}
write(f,x);{запишемо більше число у файл}
k:=1;{ознака того, що відбувалося перезапис елементів файлу, тому файл ще не впорядкований}
end
else
x:=y;{поточне число стає першим}
end;
until k=0;
reset(f);
while not eof(f) do
begin
read(f,x);
writeln(x);
end;
end.
Контрольні запитання.
Що таке змінна типу запису?
Як організований робота з елементом запису?
Що таке базовий тип?
Які операції дозволені над елементом запису?
Що таке оператор запису?
В яких структурах можна використовувати записи?
Як визначається розмір запису?
Що таке файлова змінна?
Які види файлових змінних Ви знаєте?
Що таке типізовані файли?
Який вид доступу до даних можливий для типізованих файлів?
Яким чином зв’язується файлова змінна з фізичним файлом?
Як файл готувати до запису даних?
Як файл готувати до зчитування даних?
Яким чином організується прямий доступ до даних?
Які основні операції виконують над файловою змінною?
Чи правильно, що елементи файлу повинні бути одного типу?
Чи правильно, що файл відрізняється від масиву тільки тим, що розмір файлу довільний, а розмір масиву фіксований?
Чи можна, прочитавши з файлу п’ятий елемент, далі зразу прочитати другий елемент? Якщо ні, то який можна?
В яке місце файлу можна добавляти новий елемент: в початок, в кінець, в середину, куди завгодно?
Якщо не переписувати файл заново, то значення яких елементів можна змінювати?
Чи можна порівнювати файлові змінні або присвоювати один файл другому?