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

АтаП_лаб

.pdf
Скачиваний:
19
Добавлен:
23.02.2016
Размер:
557.11 Кб
Скачать

Phone : integer; end;

Var Klient : array[1..2*n] of abonent; i, kol : integer;

o, m : byte; Procedure NewKlient; begin

inc(kol);

write('Прiзвище нового абонента: '); readln(Klient[kol].FName);

write('Телефон нового абонента: '); readln(Klient[kol].Phone);

writeln;

end;

Procedure EditKlient; begin

write('Номер абонента по списку: '); readln(m);

if (m > kol) or (m<1) then writeln('Будьте уважнi!') else begin

write('Новий телефон абонента: '); readln(Klient[m].Phone);

end;

writeln;

end; Begin

for i := 1 to n do begin

Klient[i].Fname := Name[i]; Klient[i].Phone := Random(10001)+20001;

end;

kol := n; writeln; repeat

for i:=1 to kol do writeln(i:2,'. ',Klient[i].Phone,' - ',Klient[i].Fname);

writeln;

write('1-Новий абонент 2-Редагувати номер телефона 3- Закiнчити роботу');

readln(o);

if o = 1 then NewKlient; if o = 2 then EditKlient;

until o > 2;

end.

51

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

Мовою Pascal можна створювати три типи файлів: текстовий, типізований, нетипізований, які в програмі (у розділі VAR) визначаються наступним чином:

<файлова змінна> : text;

<файлова змінна> : file of < тип компоненти >; <файлова змінна> : file.

де <файлова змінна> - це логічне ім'я файлу, що використовується в програмі; <тип компоненти> - компонентом файлу може бути як змінна базового типу, так і структурного.

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

З цим ім'ям працює операційна система. Відповідність установлюється за допомогою процедури:

ASSIGN (< ф.з.>, < ім'я файлу>);

де < ф.з.> – файлова змінна; < ім'я файлу > - це повне ім'я файлу, яке містить у собі шлях доступу, безпосереднє ім'я файлу і розширення. Наприклад:

ASSIGN (F1, 'a:\Tp5\DAT\St629.DAT'); ASSIGN (F2, 'Dannye.DAT').

Як ім'я файлу в процедурі ASSIGN можна вказувати логічний пристрій з наступного списку: CON, PRN, AUX, де

CON – це ім'я консолі (клавіатура і дисплей); PRN – це стандартне ім'я принтера;

AUX – це ім'я комунікаційного порту.

Перш ніж почати обробку файла необхідно виконати деякі операції по роботі з пристроєм, на якому зберігається або буде зберігатися файл. Так, наприклад, під час створення файла необхідно: виділити область пам'яті на зовнішньому пристрої, у яку будуть записуватися дані файла; запам'ятати ім'я файла й адресу цієї області.

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

Ця сукупність операцій називається ініціалізацією файлу чи "відкриттям" файлу. Ініціюється файл за допомогою процедур Reset і ReWrite. За допомогою процедури Reset ініціюється, тобто відкривається раніше створений файл. За допомогою процедури ReWrite ініціюється файл для запису, тобто файл, що створюється.

Синтаксис:

Reset(< ф.з.> [,< розмір запису в байтах >]); ReWrite(< ф.з.> [,< розмір запису в байтах >]);

Другий аргумент вказується тільки для нетипізованих файлів. Текстові файли можна ініціювати також і процедурою Append:

Append(< ф.з.>);

52

У цьому випадку раніше створений файл відкривається для додавання даних у кінець файлу.

Завершивши роботу з файлом, необхідно його закрити. При закритті файлу ОС підраховує розмір файлу в байтах і запам'ятовує його. Крім того, запам'ятовується також інформація про дату і час створення файлу чи його останньої модифікації (коректування). Закриття файлу даних здійснюється процедурою Close:

Close(< ф.з.>);

При зчитуванні даних з раніше створеного файлу кінець файлу можна визначити з допомогою функції EOF: EOF(< ф.з.>);

Ця функція має значення TRUE у процесі зчитування маркера кінця файлу. В іншому випадку вона буде мати значення FALSE.

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

while not EOF(F1) do begin

...

< зчитування й обробка компонент файлу >

...

end;

Безпосереднє введення інформації здійснюється процедурами READ і READLN, а виведення (запис) інформації – WRITE і WRITELN. Особливістю їхнього застосування до файлу є обов'язковість вказівки файлової змінної як першого параметра у списку елементів:

Read(< файлова змінна >, < список введення >); ReadLn(< файлова змінна >, < список введення >); Write(< файлова змінна >, < список виводу >); WriteLn(< файлова змінна >,< список виводу >).

Текстовий файл – це сукупність рядків змінної довжини. Змінна довжина рядків визначає наявність маркерів, що визначають кінець рядка. Як маркери використовуються два керуючі символи "Перехід рядка" і "Повернення каретки", їх десяткові коди: #10, #13. Назви керуючих символів "Перехід рядка"(LF – Line Feed) і "Повернення каретки"(CR - Carriage Return) узяті за аналогією роботи з пишучою машинкою.

Кінець рядка можна визначити за допомогою функції EOLn:

EOLn(< ф.з.>);

Для запису даних у файл використовуються процедури WRITE і WRITELN:

Write(< ф.з.>, < список виводу >); Writeln(< ф.з.>, < список виводу >).

За процедурою WRITE значення даних зі списку запишуться у файл підряд без усяких роздільників. За процедурою WRITELN у файлі після кожного виведеного значення будуть записані ознаки кінця рядка.

53

Для читання даних з файлу використовуються процедури READ і READLN:

Read(< ф.з.>, < список вводу >); Readln(< ф.з.>, < список вводу >);

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

Приклад 9.1.

Var Fam, Otch : string[15]; Name : string[10];

i : integer; F : text;

Begin

Assign(F, 'St.DAT');

ReWrite(F); { відкриття файлу для запису } for і:=1 to 5 do

begin

Write('Прізвище: '); Readln(Fam); Write('Ім'я: '); Readln(Name); Write('По батькові: '); ReadLn(Otch); Write(F, Fam, Name, Otch);

end;

close(F);

WriteLn(' Прізвище Ім'я По батькові'); Reset(F); for i:=1 to 5 do

begin

Read(F, Fam, Name, Otch); Write(Fam:16, Name:11, Otch:15);

end;

close(F);

End.

Компоненти типізованого файлу можуть бути наступних типів:

-базового: byte, word, longint, integer, real, запис, char, string;

-структурного;

-регулярного.

При цьому усі компоненти файлу мають той самий тип. Це означає, що

довжина компоненти фіксована. Описується такий файл у програмі в такий спосіб :

Var

F1 : File of byte;

F2 : File of string[80];

F3 : File of real;

54

F1, F2, F3 – це файлові змінні, котрі вказують на файли, компоненти яких відповідно є типу byte, string, real. Читання компонентів файлу виконується процедурою:

Read(< ф.з.>, < список вводу >);

Запис компонентів у файл виконується за допомогою процедури:

Write(< ф.з.>, < список виводу >);

Приклад 9.2.

Var

X, Y : array[1..100] of integer; { масиви координат } F : file of real;

i : byte; Begin

< оператори по введенню 100 значень координат X, Y > . . .

Assign(F, 'Coor.dat'); { файл буде створюватися в поточному каталозі }

ReWrite(F); { відкриття файлу для запису } For і:= 1 to 100 do

Write(F, X[і], Y[і]); { запис координат у файл } Close(F);

End.

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

Типізовані файли мають компоненти фіксованої довжини, існує можливість організувати прямий доступ. Для організації прямого доступу до компонент файлу існують стандартні процедури Seek, FilePos, FileSize :

Seek(< файлова змінна >,< номер компоненти >); FilePos(< файлова змінна >);

FileSize(< файлова змінна >).

Процедура Seek здійснює прямий доступ до будь-якого компонента файлу. Тут < номер компоненти > - позиція покажчика компонент файлу. Вона може набувати наступних значеннь:

+1 – установити покажчик на наступну компоненту; -1 – установити покажчик на попередню компоненту; і – установити покажчик на i-ту компоненту.

Процедура FilePos визначає номер поточної позиції у файлі, а точніше номер поточної компоненти.

Процедура FileSize визначає розмір зазначеного файлу – кількість компонент. Нумерація компонент починається з нуля.

Відкриваючи типізований файл процедурою RESET, можна цей файл не тільки читати, але і записувати в нього нову інформацію. При цьому файл повинний уже існувати на диску.

55

Нетипізовані файли можуть містити у своєму складі будь-які типи компонент. При цьому правильність запису і зчитування цих компонентів цілком покладається на програміста. Довжина компонентів може бути різною.

Для відкриття нетипізованих файлів використовуються процедури

Reset, ReWrite:

Reset(< файлова змінна >, < max розмір буфера >); ReWrite(< файлова змінна >, < max розмір буфера >).

За одне звертання до нетипізованого файлу можна зчитувати не одну компоненту, а менше, і тому що довжини компонентів можуть бути різні, то в процедурах Reset і ReWrite указується максимальний розмір буфера введення-виведення в байтах.

Читання компонент з файлу і запис їх у файл виконується процедурами

BlockRead і BlockWrite:

BlockRead(< файлова змінна >, < буфер >,< компонент, що зчитуються за один раз >, [,< декілька компонентів

>]);

BlockWrite(< файлова змінна >,< буфер >,< компонент, що записується>, [,< компоненти, що записуються >]).

Четвертий параметр необов'язковий. Він формується системою і використовується для перевірки правильності завершення операцій читання або запису.

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

Приклад 9.3. Організувати збереження інформації про студентів так, щоб по кожному студенту фіксувались 4 основні характеристики: ім’я, рік народження, адреса и успішність. Вивести список студентів, прізвища яких починаються з літери «Г», и їх оцінки за весь час навчання.

PROGRAM LAB10_SEVEN; {Запис в файл}

 

 

USES CRT;

 

 

{ім’я студента}

TYPENAME1 = RECORD N : STRING[10];

FAM

: STRING[10];

{прізвище студента}

END;

HOUSENUM : INTEGER;

{номер будинку}

STR_ADD1 =RECORD

END;

STREET

: STRING[10];{назва вулиці}

 

 

 

 

ADDRESS1 = RECORD STR_ADD : STR_ADD1;

 

 

CITY

: STRING[10];{назва міста}

 

STATE

: STRING[15];{назва країни}

END;

ZIP

: INTEGER;

{індекс міста}

 

 

 

 

SUBJECT1 = RECORD

 

 

 

56

{кіл-сть предметів}

SUB : ARRAY[1..10] OF STRING[10]; {масив предметів}

BALL: ARRAY[1..10] OF INTEGER; {масив балів}

M1 : INTEGER;

END;

 

 

TEACH1 = RECORD

: STRING[4]; {рік вступу у внз}

YEAR

SUBJECT

: SUBJECT1;

{предмети}

MIDDLE

: REAL;

{середнє значення}

END;

 

 

STUDENT1 = ARRAY[1..25] OF RECORD

: NAME1;

 

NAME

 

YEARB

: STRING[4];

 

ADDRESS

: ADDRESS1;

END;

TEACH

: TEACH1;

 

 

LIBFILE = FILE OF STUDENT1;

 

VAR S: STUDENT1;

 

G1 : STUDENT1;

 

F : LIBFILE;

 

N, I, J : INTEGER;

 

PROCEDURE ENTER;

 

VAR P : REAL;

 

BEGIN

(F,'GFILE.DAT');

 

ASSIGN

 

REWRITE (F);

 

WRITELN ('Введіть кількість студентів в групі <= 25');

READLN

(N);

 

FOR I := 1 TO N DO BEGIN WITH S[I] DO BEGIN

WITH NAME DO BEGIN TEXTMODE(CO80);TEXTCOLOR(LIGHTBLUE);

WRITE ('Введіть прізвище ');TEXTCOLOR(MAGENTA); GOTOXY(35,1);

READLN (FAM);TEXTCOLOR(LIGHTBLUE);

WRITE ('Введіть ім’я '); TEXTCOLOR(MAGENTA); GOTOXY(35,2);

READLN (N);TEXTCOLOR(LIGHTBLUE); END;

WRITE('Введіть рік народження');TEXTCOLOR(MAGENTA);GOTOXY(35,3);

READLN (YEARB);TEXTCOLOR(LIGHTBLUE); WITH ADDRESS DO BEGIN

57

WITH STR_ADD DO BEGIN

WRITE('Введіть номер будинку

');TEXTCOLOR(MAGENTA);GOTOXY(35,4);

READLN (HOUSENUM);TEXTCOLOR(LIGHTBLUE);

WRITE ('Введіть назву вулиці ');TEXTCOLOR(MAGENTA); GOTOXY(35,5);

READLN (STREET);TEXTCOLOR(LIGHTBLUE); END;

WRITE ('Введіть назву міста ');TEXTCOLOR(MAGENTA); GOTOXY(35,6);

READLN (CITY);TEXTCOLOR(LIGHTBLUE);

WRITE('Введить назву області ');TEXTCOLOR(MAGENTA);

GOTOXY(35,7);

 

 

 

 

 

 

 

READLN (STATE);TEXTCOLOR(LIGHTBLUE);

 

('Введить

WRITE

 

 

 

 

 

 

індекс');TEXTCOLOR(MAGENTA);GOTOXY(35,8);

 

 

 

READLN (ZIP);TEXTCOLOR(LIGHTBLUE);

 

 

 

 

END;

 

 

 

 

 

 

 

 

WITH TEACH DO BEGIN

 

рік

вступу

у

ВНЗ

');

WRITE

('Введіть

TEXTCOLOR(MAGENTA); GOTOXY(35,9);

 

 

 

 

 

READLN (YEAR);TEXTCOLOR(LIGHTBLUE);

 

 

WITH SUBJECT DO BEGIN

 

 

 

предметів');

WRITE('Введіть

 

кількість

 

 

TEXTCOLOR(MAGENTA); GOTOXY(35,10);

 

 

 

 

 

READLN (M1);

 

 

 

 

 

 

 

P := 0;

 

 

 

 

 

 

 

 

FOR J := 1 TO M1 DO BEGIN

 

 

 

 

 

TEXTCOLOR(LIGHTBLUE); GOTOXY (1,11); CLREOL;

 

WRITE

('Введіть назву предмета ');

 

 

TEXTCOLOR (MAGENTA);

GOTOXY(40,11);

 

 

READLN (SUB[J]);

 

 

 

 

 

 

TEXTCOLOR(LIGHTBLUE); GOTOXY (1,12); CLREOL;

');

WRITE

('Введіть

результати

останньої

сесії

TEXTCOLOR (MAGENTA);

GOTOXY(40,12);

 

 

 

 

READLN (BALL[J]);

 

 

 

 

 

P := P + BALL[J];

END;

P := P / M1;

MIDDLE := P;

END; END; END;

WRITELN; END;

WRITE(F,S);

CLOSE (F);

58

TEXTCOLOR(LIGHTGRAY);

TEXTMODE(CO80+8*8);

END; PROCEDURE EX;

VAR K, L, H : INTEGER; BEGIN

H := 15; RESET (F);

IF IORESULT <> 0 THEN BEGIN CLOSE (F); HALT; END ELSE BEGIN WHILE NOT EOF (F) DO BEGIN

READ (F,G1); END; END;

L := 10;

TEXTCOLOR (LIGHTBLUE); GOTOXY (1,1); WRITELN ('Прізвище ');

WRITELN ('Ім’я');

WRITELN ('Дата народження: ');

FOR I :=

1 TO

N DO BEGIN

WITH

G1[I] DO BEGIN

 

IF

NAME.FAM[1] = 'Ѓ' THEN BEGIN

WITH

NAME

DO BEGIN

 

TEXTCOLOR

(MAGENTA);

GOTOXY (H

+ L,1);

WRITELN (FAM);

GOTOXY (H

+ L,2);

WRITELN (N);

END;

 

+ L,3);

WRITELN (YEARB);

GOTOXY (H

L := L +

20;

END; END;

 

WRITELN;

END;

 

READKEY;

 

 

 

CLOSE (F);

END;

BEGIN

CLRSCR;

ENTER;

EX;

END.

Завдання до лабораторної роботи

Завдання 1. Відповідно до варіанту скласти програму роботи з типізованим файлом.

1.Дано файл, який містить цілі числа. Визначити кількість парних елементів.

2.Дано файл, який містить цілі числа. Визначити суму додатних елементів.

3.Дано файл, який містить цілі числа. Визначити добуток квадратів елементів.

59

4.Дано файл, який містить цілі числа. Визначити суму модулів елементів з непарними номерами.

5.Дано файл, який містить цілі числа. Визначити середнє арифметичне найменшого та найбільшого елементів.

6.Дано файл з дійсними числами. Визначити найменший та найбільший елементи.

7.Дано файл з дійсними числами. Визначити найменший елемент серед елементів з парними номерами.

8.Дано файл з дійсними числами. Визначити різницю між першим та найменший елементом.

9.Дано файл з дійсними числами. Визначити яких елементів більше – від’ємних чи додатних.

10.Дано файл, елементами якого є цілі числа. Обчислити кількість непарних чисел.

11.Дано файл, елементами якого є цілі числа. Обчислити кількість елементів, значення яких збігаються з їх номерами.

12.Дано файл, елементами якого є цілі числа. Обчислити кількість елементів, значення модулів яких є квадратами їх номерів.

13.Дано файл, елементами якого є цілі числа. Обчислити кількість парних елементів, які мають парні номери.

14.Дано файл, елементами якого є цілі числа. Обчислити кількість елементів кратних 3, які мають парні номери.

15.Дано файл з дійсними числами. Визначити різницю між першим та найбільшим елементом.

Завдання 2. Відповідно до варіанту скласти програму роботи з текстовим файлом.

1.Дано текстовий файл f. Отримати всі рядки, які містять більше 50 символів.

2.Дано текстовий файл f. Переписати в файл g всі компоненти файла f замінюючи в них символ “0” на символ “1” і навпаки.

3.Дано текстовий файл f. Отримати найдовший рядок.

4.Дано текстовий файл f. Переписати в файл g всі компоненти файла f, додаючи на початку кожного рядка пробіл.

5.Дано текстовий файл f. Переписати в файл g всі компоненти файла f, замінюючи в них розділові знаки на символ “*”.

6.Дано текстовий файл f, рядок s. Отримати всі рядки файла f, які містять рядок s.

7.Дано текстовий файл f, рядок s. Отримати всі рядки файла f, які не містять рядок s.

8.Дано текстовий файл f. Отримати всі рядки, які починаються з символу “!”.

9.Дано текстовий файл f. Отримати всі рядки, які закінчуються символом “!”.

10.Дано текстовий файл f. Переписати в файл g всі компоненти файла f, вилучаючи пробіл в кінці кожного рядка.

11.Дано текстовий файл f. Переписати в файл g всі компоненти файла f, замінюючи в них символ “а” на символ “А” і навпаки.

60