Смекни!
smekni.com

Програмування в середовищі Pascal (стр. 14 из 16)

2 REWRITE(F) – створює і відкриває новий файл з ім'ям, пов'язаним із змінною F процедурою ASSIGN. Якщо файл з заданим ім'ям існує, він

знищується (стирається ) і замість нього створюється новий порожній файл. Якщо файл з таким ім'ям відкритий, він закривається, знищується і створюється заново. Покажчик поточної позиції файла встановлюється в початок порожнього файла (на ознаку кінця файла). Функції EOF(F) привласнюється значення TRUE.

3 WRITE(F,A) – записує значення змінної А у файл F на місце поточного компонента і просуває покажчик поточної позиції файла на наступний компонент. Змінна А повинна бути того ж типу, що і компонент файла. Якщо EOF(F)=TRUE, в кінець файла додається новий компонент. Інакше здійснюється заміна (коректування) поточного компонента.

4 RESET(F) – відкриває існуючий файл з ім'ям, пов'язаним із змінною F. Файл з таким ім'ям повинен існувати. Якщо файл вже відкритий, він спочатку закривається, а потім відкривається знову. Покажчик поточної позиції файла встановлюється в початкове положення.

5 READ(F,A) – прочитує з файла поточний компонент, привласнює його значення змінній А і просуває покажчик поточної позиції файла на наступний компонент. Змінна А повинна бути того ж типу, що і компонент файла. Якщо EOF(F)=TRUE, то при спробі читання виникає помилка. 6SEEK(F,n) – переміщає покажчик поточної позиції файла на компонент з номером n. Перший компонент файла має номер 0. Для переміщення на кінець файла можна використовувати процедуру Seek (F, FileSize (F)).

7CLOSE(F) – закриває відкритий файл, пов'язаний із змінною F.

При роботі з файлами можна використовувати наступні стандартні функції:

1 EOF(F) – повертає статус кінця файла. Результат функції TRUE

(істина), якщо покажчик поточної позиції файла знаходиться на ознаці кінця файла, тобто за останнім компонентом файла, і FALSE (брехня) – інакше.

2 FILESIZE(F) – повертає поточний розмір файла, тобто кількість компонентів у файлі. Якщо файл порожній, FileSize(F)=0.

3 FILEPOS(F) – повертає поточне значення покажчика файла. Якщо

поточне значення покажчика відповідає початку файла FilePos повертає 0, якщо кінцю файла (тобто EOF(F)=True), то FilePos(F) = FileSize(F).

Функцію EOF можна використовувати в умовному операторі IF або в операторі циклу WHILE. Для перевірки того, що файл не закінчений (готовність до читання), можна застосовувати, наприклад, наступну конструкцію:

while not EOF(F) do begin

...

READ (F,A);

...

end ;

У цій конструкції здійснюється послідовне читання (і обробка) компонентів файла до тих пір, поки покажчик поточної позиції указує на черговий компонент (тобто у файлі є ще не оброблені компоненти). Цикл завершиться, як тільки покажчик поточної позиції просунеться за кінець файла (тобто будуть оброблені всі компоненти файла).

На практиці дуже часто компонентами файла є записи.

Запис – це структурований тип даних, що складається з фіксованої кількості компонентів, які називаються полями. В одному полі дані мають один і той же тип, а в різних полях можуть мати різні типи. Тому записи називають комбінованими типами даних.

У записі кожне поле має своє ім'я (ідентифікатор). Кількість полів, тип і ідентифікатор кожного поля фіксуються у визначенні типа, до якого відноситься запис. Визначення починається з ключового слова RECORD, за яким слідує перелік всіх полів з вказівкою через двокрапку їх типів. Поля відділяються один від одного крапкою з комою. Поля запису можуть бути будь-якого типу. Якщо декілька полів мають один і той же тип, то імена полів можна перелічувати через кому і потім вказати загальний тип.

Завершує визначення типу запису ключове слово END.

Загальний вид опису типу-запису:

Type T=RECORD

I1:T1;

I2:T2;

...

IN:TN end;

Після введення типу запису можна задати змінні цього типу:

var A,B:T;

де T - ідентифікатор типу;

Ik - ім'я поля або список розділених комами імен полів;

Tk - типи полів;

А, В - ідентифікатори (імена) змінних типу запису.

Приклад. Запис має чотири поля: місто, вулиця, номер будинку і номер квартири, тобто запис є адресою. Тоді адресу можна визначити таким чином:

Type ADRES=RECORD

G,U:STRING[15]; D,K:integer end;

Запис типу DATA включає рік, місяць, день, описується таким чином:

Type DATA=RECORD

YEAR, MONTH, DAY:INTEGER

end;

Змінні А типу ADRES і D1,D2 типу DATA задаються таким чином: var А:ADRES; D1,D2:DATA;

Доступ до полів змінних типу запису здійснюється вказівкою імені змінної і імені поля, записуваного через крапку.

Наприклад, щоб заслати у визначену вище змінну А адреса: "м. Краматорськ, вул. Кришталева, будинок 52, кв.128", треба виконати наступні оператори привласнення:

А.G:=’Краматорськ’;

А.U:=’Кришталева’;

А.D:=52;

А.K:=128;

Для запису в змінну D1 дати 25.10.1996 р. слід виконати оператори:

D1.DAY:=25;

D1.MONTH:=10;

D1.YEAR:=1996;

Можна звертатися не тільки до окремого поля запису, але і до запису в цілому, використовуючи оператор привласнення. Наприклад, щоб переслати дату із змінної D1 в D2 можна виконати один оператор: D2:=D1

Дія цього оператора рівнозначна дії групи операторів:

D2.YEAR:=D1.YEAR;

D2.MONTH:=D1.MONTH;

D2.DAY:=D1.DAY;

Іншими словами, звернення до змінної типу запису – це звернення одночасно до всіх полів цієї змінної: виконання якихось дій над змінноюзаписом – це виконання даних дій над кожним її полем.

Для того, щоб не записувати кожного разу ім'я змінної при зверненні до полів запису, можна використовувати оператор над записами WITH. У цьому випадку можна указувати тільки поле змінної. Наприклад, для занесення в змінну А адреси замість наведеного раніше фрагмента програми можна використовувати наступний:

with А do begin

G:=’Краматорськ’;

U:=’Кришталева’;

D:=52; K:=128 end;

Тип запису можна вводити безпосередньо при визначенні змінних. Наприклад, визначити наведені вище змінні типу запису А, D1 і D2 можна так:

var А: record G,U:string[15]; D,K:integer end;

D1,D2:record

YEAR, MONTH, DAY:integer

end;

Як наголошувалося вище, поля запису можуть бути будь-якого типу, у тому числі записами або масивами, наприклад:

type STRUCT=record

FIO:string[13]; KOL:integer;

А:ARRAY[1.10] integer end;

У свою чергу, тип запису можна задавати не тільки для окремих змінних, але і для компонентів масиву. Іншими словами, можна визначати масиви, компонентами якого є записи. Наприклад, після введення вищенаведеного типу запису ADRES можна визначити наступну змінну типу

«масив» (для створення масиву адресів):

var MAS=ARRAY[1..20] ADRES;

Доступ до полів в цьому випадку здійснюється так, як мовилося вище. Проте в цьому випадку після імені змінної слід вказати ще і її індекс, наприклад:

MAS[7].G:='Краматорськ’;

MAS[7].U:=’Шкадінова’;

Використовування оператора WITH дозволяє спростити це звернення :

with MAS[7] do begin

G:='Краматорск’;

U:=’Шкадинова’;

end;

8.2 Приклад виконання лабораторної роботи 5

Скласти програму формування на магнітному диску телефонного довідника, кожний рядок (компонент) якого складається з наступних полів:

прізвище;
ім'я;

вулиця;
будинок;
квартира;
телефон.

У цій програмі передбачити друкування довідника осіб, прізвища яких починаються на задані букви.

При написанні цієї програми її краще розбити на дві. Перша призначена для введення даних та формування файла. Друга – виконує обробку файла.

Нижче наведено текст першої програми.

program lab5а; uses CRT;

Type ADRES=record

F,I,U:string[15];

D,K:integer; TEL:string[8]; end;

Type FIL1=file of ADRES; Var FF:FIL1; vv:integer;

A:ADRES; st:string[5];

{------------------------------------------------} begin assign (FF,'ADRESA.DAT');

{---------- Створення файла ---------------------} rewrite (FF); with А do repeat clrscr; write ('фамилия '); readln (F); if F <> '*' then begin

write ('имя '); readln (I); write ('улица '); readln (U); write ('дом '); readln (D); write ('квартира '); readln (K); write ('телефон '); readln (TEL); write (FF,A); end; until F='*'; close (FF) end.

Треба відмітити, що при кожному запуску цієї програми файл, створений при попередньому запуску програми, знищується і на його місці створюється новий. Таким чином, файл кожний раз формується заново. Дозапис в файл неможливий. Для забезпечення такої можливості треба замість процедури rewrite (FF); використати процедури:

reset (FF); seek(ff,FileSize(ff));

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

program lab5а; uses CRT;

Type ADRES=record

F,I,U:string[15];

D,K:integer; TEL:string[8]; end;

Type FIL1=file of ADRES; Var FF:FIL1; vv:integer;

A:ADRES; st:string[5]; cc:char;

{------------------------------------------------} begin assign (FF,'ADRESA.DAT');

{------------- Обробка файла --------------------} repeat clrscr; write ('Введите перші символи або ''*''. '); readln (ST); if ST <> '*' then begin reset (FF); vv:=0; while not eof (FF) do begin read (FF,a); if (copy(A.F,1,length(ST))=ST) then begin with A do

writeln(F:15,' ',I:15,' ',U:15,' ',d:3,k:4,' ',TEL); vv:=vv+1; end end; writeln; if (vv=0) then

writeln('Нема прізвищ, що починаються з ',ST); writeln;

writeln ('Нажмите будь-яку клавішу');

CC:=ReadKey; end; until ST='*';

{-----------------------------------------------} close (FF) end.

8.3 Варіанти завдань до лабораторної роботи 5

Створити файл і виконати його обробку відповідно до табл. 13. Обробка полягає у виборі з файла і видачі на екран інформації, що вимагається. Варіанти структури файла наведені в табл. 14.