
Posibnik_Pascal
.pdfФайлова змінна для текстового файлу оголошується за синтаксисом: var < ім’я файлової змінної >: text;
Після оголошення файлової змінної починається робота з файлом, і для цього використовуються наступні основні стандартні підпрограми:
1.Процедура Assign(f, s) – зв’язує файлову змінну f із фізичним файлом на диску. Ім’я фізичного файлу задається рядком s і це може бути повне ім’я.
2.Процедури відкриття файла:
a)Reset(f) – відкриття існуючого файлу, зв’язаного з файловою змінною f;
b)Rewrite(f) – створення і відкриття нового файлу, зв’язаного з файловою змінною f. Якщо файл існував до відкриття, то після відкриття його вміст знищується, і буде створений новий файл;
c)Append(f) – відкриття текстового файлу, зв’язаного з файловою змінною f, для добавлення у його кінець нового тексту. Використовується тільки для текстових файлів.
3.Основні підпрограми обробки файлів:
a)Write(f, < список виразів >) – процедура записує у файл f значення виразів, перерахованих у списку. Для текстових файлів вирази можуть бути лише символьного, рядкового, цілочислового або дійсного типів. Найчастіше список виразів є списком змінних або однією змінною;
b)Writeln(f, < список виразів >) – процедура аналогічна попередній, тільки після її виконання у файлі обов’язково встановлюється маркер кінця рядка і здійснюється перехід на новий рядок. Використовується тільки для текстових файлів;
c)Read(f, < список змінних >) – процедура зчитує з файлу f дані та заносить їх у змінні списку. Для текстових файлів змінні можуть бути лише символьного, рядкового, цілочислового або дійсного типів. Найчастіше список змінних є однією змінною;
d)Readln(f, < список змінних >) - процедура аналогічна попередній, тільки зчитує дані до маркера кінця рядка і здійснює перехід на новий рядок файлу. Використовується тільки для текстових файлів;
e)Eoln(f) – функція повертає значення true, якщо вказівник файлу f вказує на маркер кінця рядка (вказівник дійшов до кінця рядка). У іншому випадку повертає false. Використовується тільки для текстових файлів;
f)Eof(f) - функція повертає значення true, якщо вказівник файлу f вказує на маркер кінця файлу (вказівник дійшов до кінця файлу). У іншому випадку повертає false.
4.Процедура Close(f) закриває файл f.
Текстові файли не можна модифікувати. Процедура Reset відкриває їх тільки для читання, а процедури Rewrite, Append – тільки для запису. Будь-який файл може бути параметром підпрограми. Такий параметр повинен бути параметром-змінною.
Приклад
Створити текстовий файл. Вивести його на екран та підрахувати у ньому кількість ком.
Аналіз задачі
Створювати текстовий файл можна записуючи у нього символи або рядки. Доцільно створити окрему процедуру, яка буде створювати файл. Ми будемо записувати у файл символи до тих пір, поки не буде натиснута комбінація клавіш Ctrl+Z, яка формує ознаку кінця файлу. Для перевірки правильності створення файлу розробимо процедуру виведення вмісту файлу на екран. Нарешті, створимо процедуру обробки файлу. У ній послідовно читатимемо файл від початку до кінця і порівнюватимемо символи файлу з комою. Якщо зустрілася кома, то лічильник збільшуємо на 1. Перед читанням файлу початкове значення лічильника рівне 0.
Алгоритм розв’язування задачі полягає у послідовному виклику описаних процедур.
61
program demo; |
|
uses crt; |
|
var |
|
name:string; |
{змінна для рядка} |
f:text; |
{файлова змінна} |
k:integer; |
{змінна для кількості ком} |
{------------------------------------------------------------------------------------------------------------------ |
} |
procedure Init_file(var f:text); |
{процедура створення файлу} |
var x:char; |
|
begin |
|
checkeof:=true; {змінна checkeof використовується для контролю за натисненням комбінацій клавіш Ctrl + Z. Після натиснення формується маркер кінця файлу}
rewrite(f); {відкриття файлу для запису} writeln('Введіть дані у файл(кінець-^z)');
{занесення символів у файл}
while not eof do |
|
begin |
|
read(x); |
{зчитування символа з файла Input (клавіатури)} |
write(f,x); |
{запис символа у файл} |
end; |
|
close(f); |
{закриття файлу} |
end; |
|
{------------------------------------------------------------------------------------------------------------------ |
} |
procedure druk_file(var f:text); |
{процедура друкування файлу} |
var y:char; |
|
begin |
|
reset(f); |
{відкриття файлу для читання} |
while not eof(f) do |
|
begin |
|
read(f,y); |
{читання елемента з файлу} |
write(y,' '); |
{виведення його на екран} |
end; |
|
close(f); |
{закриття файлу} |
end; |
|
{------------------------------------------------------------------------------------------------------------------ |
} |
procedure obrobka_file(var ff:text ; var kol:integer); {процедура пошуку ком у файлі}
var a:char; |
|
begin |
|
reset(ff); |
{відкриття файлу для читання} |
kol:=0; |
{початкове значення лічильника ком} |
while not eof(ff) do |
|
begin |
|
read(ff,a); |
{читання елемента з файлу} |
if a=',' then kol:=kol+1; |
{знайдена кома, лічильник збільшуємо на 1} |
end; |
|
close(f); |
{закриття файлу} |
end; |
|
{------------------------------------------------------------------------------------------------------------------ |
} |
begin |
{основна програма} |
clrscr; |
|
writeln('Введіть ім’я файлу:'); |
|
readln(name); |
|
62
assign(f,name); |
{зв’язування файлової змінної з фізичним файлом з ім’ям name} |
Init_file(f); |
{створення файлу} |
writeln('Створений файл:'); |
|
Druk_file(f); |
{виведення файлу на екран} |
obrobka_file(f,k); |
{підрахунок ком у файлі} |
writeln('Кількість ком у файлі=',k); repeat until keypressed;
end.
☺ Завдання для виконання
Основний рівень
1.Дано текстовий файл. Надрукувати всі його рядки, що містять як фрагмент слово “кіт”.
2.Знайти в даному файлі слова паліндроми і записати їх у новий файл (паліндроми - слова, що читаються однаково зліва направо і справа наліво).
3.Дано текстовий файл. Надрукувати всі його рядки, які містять більше 10 символів.
4.Дано текстовий файл. Підрахувати кількість рядків, які починаються з букв “А” або “а”.
5.Дано текстовий файл. Знайти довжину найдовшого рядка.
6.Дано текстовий файл. Обчислити кількість порожніх рядків і записати всі непорожні рядки в новий файл.
7.Дано текстовий файл. Знайти кількість входжень символу @.
8.Дано текстовий файл. Підрахувати в ньому кількість речень (речення відокремлюються крапками).
9.Дано текстовий файл. Дописати до нього наступні дані: кількість символів у кожному рядку та кількість рядків.
10.Дано текстовий файл, елементами якого є цілі числа. Знайти максимальний елемент і підрахувати кількість таких елементів
11.Дано текстовий файл. З’ясувати, чи є в ньому рядок, що починається з букви “т”. Якщо так, то визначити номер першого з таких рядків.
12.Дано текстовий файл. Підрахувати, скільки разів у ньому зустрічається слово “мама”.
13.Дано текстовий файл. Надрукувати 1-й символ 1-го рядка, 2-й символ 2-го рядка і т.д.
14.Дано текстовий файл. Переписати в інший файл ті його рядки, у яких більше 30 символів.
15.Дано текстовий файл, який містить символьні рядки. Знайти кількість рядків, що починаються та закінчуються однаковими символами.
Підвищений рівень
1.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Створити файл, елементами якого будуть числа a1, a1+a2, a1+a2+a3, ..., a1+a2+...+an.
2.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Створити файл, елементами якого будуть числа a12, a1 a2, a1 a3, a1 a4, ..., a1 an.
3.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Створити файл,
елементами якого будуть числа a1, -a1 a2, a1 a2 a3, -a1 a2 a3 a4, ..., (-1)n+1a1 a2...an.
4.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3,..., an. Створити файл, у якому ці числа будуть розташовані в такому порядку a2, a3, ..., an, a1.
5.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Створити файл
дійсних чисел b1, b2, b3,..., bn, де bi |
= |
|
|
ai |
, i=1, 2, ..., n. |
|
+ (a1 |
+... + ai )2 |
|||
|
1 |
|
63
6.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3,..., an. Створити файл, елементами якого будуть “середні” значення даних елементів. “Середні” значення
отримують за формулою |
ai = |
ai−1 + ai + ai+1 |
, де i=2, 3, ..., n-1. |
|
|||
|
3 |
|
7.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Відомо, що a1>0, та серед a2, a3, ..., an є хоча б одне від’ємне число. Отримати суму елементів, які передують першому від’ємному числу.
8.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Відомо, що a1>0, та серед a2, a3, ..., an є хоча б одне від’ємне число. Створити текстовий файл, елементами якого будуть числа a1, a1 a2, a1 a2 a3, ..., a1 a2...ak, де a1, a2, a3...ak – елементи даного файлу до першого від’ємного числа.
9.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Створити файл,
елементи якого b1, b2, ..., bn отримані таким чином: b1=a1, bn=an, bi |
= |
ai+1 −ai |
, i=2, 3, ..., n. |
|
|||
|
3 |
|
10.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Створити файл, у якому елементи будуть розташовані в такому порядку a6, a7, ..., an, a1, a2, a3, a4, a5.
11.Дано текстовий файл, елементами якого є натуральні числа a1, a2, a3, ..., an. Створити два нових файли. У перший переписати з даного файлу всі парні числа, у другий – всі непарні.
12.Дано текстовий файл, елементами якого є дійсні числа a1, a2, a3, ..., an. Створити два нових файли. У перший переписати з даного файлу всі від’ємні числа, у другий – всі додатні.
13.Дано текстовий файл f цілих чисел. Отримати з f файл g, виключивши повторні входження чисел.
14.Дано текстовий файл f цілих чисел, що не дорівнюють нулю. Файл f містить однакову кількість додатних та від’ємних чисел. Використовуючи допоміжний файл h, переписати числа файлу f у файл g так, щоб спочатку були записані всі додатні, а потім усі від’ємні числа.
15.Дано текстовий файл f цілих чисел, що не дорівнюють нулю. Файл f містить однакову кількість додатних та від’ємних чисел. Використовуючи допоміжний файл h, переписати числа файлу f у файл g так, щоб не було двох сусідніх чисел з одним знаком.
Додаткові задачі
1.Задано текстовий файл, єдиний рядок якого містить 121 символ. Створити новий текстовий файл із символів першого файла за таким алгоритмом: 121 символ переписують у вигляді матриці з 11 рядками та 11 стовпцями. Потім кожний парний рядок записують у зворотному порядку; після цього у зворотному порядку записують кожний непарний рядок.
2.Користувачеві пропонується вводити з клавіатури дані у текстовий файл. Кожен рядок файла містить назву фірми, назву товару та ціну в доларах. Перерахувати ціни у гривні за поточним курсом та дописати до рядків отримані значення. Результати записати у новий текстовий файл.
3.У кожному рядку текстового файла знайти найдовшу послідовність цифр. Значення її довжини перетворити на рядок, який дописати на початку рядка вихідного файлу. Результати записати у новий файл.
64
4.Створити програму генерування текстового файлу, у якому міститься картинка, що зображає множення «стовпчиком» двох заданих натуральних чисел. Можливий приклад
39624 х 8503 118872
+ 198120 316992____
336922872
5.Дано текстовий файл із речень української мови. Написати програму, що аналізує текст і виводить таблицю про число входжень кожного символу алфавіту до тексту.
6.Дано текстовий файл із речень української мови. Написати програму, що аналізує текст і виводить таблицю про число входжень слів до тексту, які складаються з одного символа, двох символів, трьох символів і т. д.
7.Дано текстовий файл із речень української мови. Написати програму, що аналізує текст і виводить таблицю про число входжень кожного слова до тексту.
Питання для самоконтролю
1.Що таке текстовий файл? Як оголошується змінна для текстового файлу?
2.Які дані можуть бути елементами текстового файлу?
3.Як зв’язати файлову змінну з іменем файлу на диску?
4.У чому полягає різниця між процедурами Rewrite та Reset?
5.У яке місце текстового файлу можна добавити нові елементи : на початок, всередину, у кінець, куди завгодно, нікуди? Як це зробити?
6.Чи однаково “працюють” процедури Read та Readln при обробці текстового файлу?
7.Для чого призначена процедура Сlose?
8.Значення яких типів можуть бути прочитані процедурами Read та Readln?
9.Значення яких типів можуть бути виведені процедурами Write та Writeln?
10.Які основні способи створення текстових файлів?
11.Як можна швидко перейти на кінець рядка (файлу)?
65
Лабораторна робота № 12
Тема: Типізовані файли
Студент повинен знати: поняття фізичного та логічного файлів, типи файлів і оголошення файлових змінних, встановлення відповідності між фізичним і логічним файлами, стандартні процедури та функції для роботи з файлами, зчитування і запис типізованих файлів.
Теоретичні відомості
Теоретичний матеріал цієї лабораторної роботи в основному викладений у попередній роботі. Тому доповнимо його інформацією про типізовані файли.
У мові Паскаль бінарні файли є файлами прямого доступу, і вони поділяються на типізовані та нетипізовані. Типізовані файли є послідовністю однотипних компонентів, а нетипізовані - послідовністю байтів. Компоненти бінарного файлу нумеруються починаючи з нуля. Між компонентами не записуються жодні роздільники. Такого поняття, як рядок, а отже, і маркер кінця рядка, для бінарних файлів не існує.
Файлові змінні для типізованих і нетипізованих файлів оголошуються відповідно до синтаксису
var < ім’я файлової змінної >: file of < тип компонентів >; var < ім’я файлової змінної >: file;
Типізовані файли у загальному вважаються файлами записів. Для роботи з ними застосовують стандартні підпрограми Assign, Reset, Rewrite, Write, Read, Eof, Close, що розглянуті у попередній лабораторній роботі. Також можна застосовувати наступні підпрограми:
1.Процедура Seek(f, n) встановлює файловий вказівник на компонент із номером n. Файл f має бути відкритим;
2.Процедура Truncate(f) вилучає всі компоненти файлу f від поточної позиції файлового вказівника до кінця файлу;
3.Функція FilePos(f) повертає номер компонента файлу f, на який вказує файловий вказівник;
4.Функція FileSize(f) повертає кількість компонентів у файлі f.
Типізовані файли можна модифікувати. Процедура Seek дозволяє встановити файловий вказівник на необхідну компоненту і потім за допомогою Write змінити значення цієї компоненти.
Усі вказані у лабораторних роботах 11, 12 стандартні підпрограми містяться в модулі System. Крім них у цьому модулі містяться також підпрограми системного характеру для роботи з файлами та засоби введення/виведення для нетипізованих файлів.
Приклад
Створити файл записів із полями: прізвище та рік народження. Вивести інформацію про тих, хто народився в 1985 році.
Аналіз задачі
Створення файлу записів організуємо у вигляді процедури. У файл будемо заносити записи до тих пір, поки не зустрінеться запис, у якому прізвище рівне ’#’. Також створимо процедуру для виведення записів файлу на екран. Основною буде процедура пошуку у файлі людей, що народилися в 1985 році. Переглядатимемо послідовно записи файлу від початку до кінця. Якщо знайдемо запис про людину, що народилася у 1985 році, то виведемо його на екран та присвоїмо змінній l значення 1. Перед переглядом файлу ця змінна рівна 0. Вона використовується у ролі прапорця, та інформує про наявність чи відсутність у файлі потрібних записів. Якщо після перегляду файлу змінна l залишиться рівною 0, то у файлі немає записів про людей із роком народження 1985.
66
Алгоритм полягає у послідовному виклику вказаних підпрограм.
Program Example; |
|
|
uses crt; |
|
|
type |
zapis=record |
{тип запису} |
|
fio:string[20]; |
{поле для прізвища} |
|
rik:integer; |
{поле для року народження} |
|
end; |
|
|
tfile=file of zapis; |
{тип файлу записів} |
var |
f:tfile; |
{файлова змінна} |
|
filename:string; |
{ім’я фізичного файлу} |
{------------------------------------------------------------------------------------------------------------------- |
} |
procedure StvorZapis(var z : zapis); |
{Процедура створення запису} |
begin
with z do
begin |
|
write('Введіть прізвище:'); readln(fio); |
|
write('Введіть рік:'); readln(rik); |
|
end; |
|
end; |
|
{------------------------------------------------------------------------------------------------------------------- |
} |
procedure StvorFile(var f : tfile); |
{Процедура створення файлу} |
var z:zapis; |
|
begin |
|
clrscr;
writeln('Створення файлу записів:'); rewrite(f);
StvorZapis(z); while z.fio<>’#’ do begin
write(f, z);
StvorZapis(z);
|
end; |
|
|
end; |
close(f); |
|
|
|
|
|
|
{------------------------------------------------------------------------------------------------------------------- |
|
|
} |
procedure PrintFile(f : tfile); |
{Процедура друкування файлу} |
||
var |
z:zapis; |
|
|
begin |
clrscr; |
|
|
|
|
|
|
|
writeln('Перегляд файлу:'); |
|
|
|
reset(f); |
|
|
|
while not eof(f) do |
|
|
|
begin |
|
|
|
read(f,z); |
|
|
|
writeln(z.fio:20,' ':5,z.rik); |
|
|
|
end; |
|
|
end; |
close(f); |
|
|
|
|
|
|
{------------------------------------------------------------------------------------------------------------------- |
|
|
} |
procedure PoiskFile(f : tfile); |
{Процедура обробки даних} |
||
var |
z:zapis; |
l:integer; |
|
67
begin
reset(f); l:=0;
writeln('Список людей, що народилися у 1985 році'); while not eof(f) do
begin
read(f,z);
if z.rik=1985 then begin
l:=1;
writeln(z.fio:20,' ':5,z.rik);
end;
end;
writeln;
if l=0 then writeln('Таких людей немає '); close(f);
end; |
|
{------------------------------------------------------------------------------------------------------------------- |
} |
begin |
|
clrscr;
writeln('Введіть ім’я файлу:'); readln(filename); assign(f,name);
StvorFile(f);
PrintFile(f);
PoiskFile(f);
end.
☺
1.Інформація, що входить до файлу: ПІБ, номер телефону, адреса, вартість переговорів. Вивести інформацію про клієнтів із вказаним номером телефону.
2.Скориставшись інформацією з варіанта №1, вивести інформацію про клієнтів, прізвища яких починаються на «Шев».
3.Інформація, що входить до файлу: ПІБ автора, назва книги, видавництво, вартість. Вивести інформацію про книги зазначеного автора.
4.Скориставшись інформацією з варіанта №3, обчислити загальну вартість усіх книг.
5.Скориставшись інформацією з варіанта №3, вивести інформацію про всі книги зазначеного видавництва.
6.Інформація, що входить до файлу: ПІБ, адреса, місце роботи, зарплата. Вивести інформацію про всіх співробітників КДПУ.
7.Скориставшись інформацією з варіанта №6, вивести інформацію про співробітників КДПУ, зарплата яких не перевищує 400 грн.
8.Скориставшись інформацією з варіанта №6, вивести інформацію про співробітників із зазначеним прізвищем.
9.Інформація, що входить до файлу: розмір костюма, витрати тканини, вартість костюма, фірма. Вивести інформацію про всі костюми конкретного розміру.
10.Скориставшись інформацією з варіанта №9, вивести інформацію про вартість усіх костюмів.
68
11.Скориставшись інформацією з варіанта №9, вивести інформацію про костюми вартістю
300±10 грн.
12.Скориставшись інформацією з варіанта №9, вивести інформацію про костюми, пошитих зазначеною фірмою.
13.Інформація, що входить до файлу: номер рейсу, вага багажу, кількість речей. Визначити кількість пасажирів, вага багажу яких перевищує 30 кг .
14.Скориставшись інформацією з варіанта №13, визначити середню вагу багажу.
15.Скориставшись інформацією з варіанта №13, визначити загальну кількість речей.
Підвищений рівень
1.Дано символьний файл f. Подвоїти в ньому усі символи, що позначають голосні звуки англійської мови.
2.Дано файл f натуральних чисел. Записати у файл g усі прості числа з файлу f у порядку спадання.
3.Дано символьний файл f. Переписати у файл g символи, що зустрічаються у файлі f двічі (рівно два рази).
4.Дано файл f простих чисел, записаних у порядку зростання. Вилучити з нього усі числа з парною сумою цифр.
5.Дано файл f натуральних чисел. Вилучити з нього усі компоненти, що є числами Фібоначчі.
6.Дано файл f натуральних чисел. Вилучити з нього усі компоненти, номери яких є числами Фібоначчі.
7.Дано символьний файл f. Вилучити повторні входження символів (залишити тільки перші).
8.Дано файл f натуральних чисел. Вилучити з нього числа виду 4k+1.
9.Дано символьний файл f. Подвоїти в ньому усі цифри, які позначають парні числа.
10.Дано символьні файли f та g. Визначити, чи дійсно вони складаються з однакових символів. Якщо вони відрізняються хоча б одним символом, то вивести символи, якими вони відрізняються.
11.Дано символьний файл f. Підрахувати кількість входжень у файл кожної з літер a, b, c, d, e, f та вивести результат окремими рядками.
12.Дано файл f натуральних чисел, кожне з яких не більше за 255. Створити множину простих чисел, на які діляться числа файлу f.
13.Дано файл f натуральних чисел. Видрукувати усі різні елементи файлу у порядку спадання.
14.Дано два файли f та g натуральних чисел, які не містять повторних входжень однакових елементів. З’ясувати, чи правда, що вони відрізняються лише порядком слідування елементів.
15.Дано файл f однобайтових натуральних чисел, у якому записано у порядку зростання декілька простих чисел. Дописати у файл f решту простих чисел, що не перевищують максимального числа з файлу f, не порушуючи впорядкованості елементів.
Додаткові задачі
1.Створити два файли цілих чисел. Відсортувати їх вміст. Відсортовані файли об’єднати в один відсортований файл.
2.Інформація, що входить до файлу: ПІБ автора, назва книги, видавництво, вартість книги. Відсортувати файл за алфавітом прізвищ авторів, а за наявності книг одного автора додатково відсортувати за алфавітом назв книг. Вивести відсортований файл.
69
3.Створити базу даних «Студент», робота із якою виконувалася б у діалоговому режимі. При запуску програми на екрані повинно з’являтися меню такого вигляду:
1.Створити нову базу.
2.Відкрити існуючу базу.
3.Добавити запис.
4.Вилучити запис.
5.Сортування.
6.Пошук.
7.Друкування.
8.Вихід.
База містить записи з полями: ПІБ, стать, курс, вік, стипендія. Вказівка «Сортування» має підменю, що передбачає вибір варіантів сортування за ключами: прізвище, курс, вік. Вказівка «Пошук» теж має підменю, яке передбачає вибір варіантів пошуку за ключами: прізвище, вік, розмір стипендії.
Питання для самоконтролю
1.Які процедури призначені для відкриття файлів?
2.Який синтаксис оголошення файлових змінних бінарних файлів?
3.Яким може (не може) бути тип елементів типізованого файлу?
4.У чому полягає різниця між масивом та типізованим файлом?
5.Для чого призначена процедура Close?
6.За якими правилами виконується читання з типізованих файлів?
7.Для чого призначені функції FilePos, FileSize та процедура Seek?
8.Як працюють процедури BlockRead та BlockWrite, та які їх параметри?
9.Яке призначення стандартної функції IOresult? Як її використовувати?
10.Які є стандартні процедури для роботи з файлами усіх видів?
11.Чим типізовані файли відрізняються від нетипізованих?
70