Обробка
послідовних файлів у програмі b>
p>
Кузнецова В. С., викладач інформатики,
МОУ
міжшкільний навчальний комбінат № 2, м. Хабаровськ p>
Одним
з важких для учнів і викладачів розділів програмування є
програмування обробки файлів. У Хабаровському міжшкільному навчальному комбінаті
№ 2 накопичено певний досвід з навчання школярів прийомам програмування,
в тому числі, при роботі з файлами. Пропонуємо увазі читачів матеріал на
цю тему, підготовлений В.С. Кузнєцової. P>
В
розділі алгоритмізація та програмування ми працюємо в основному з простими
типами даних і лише одним зі складних (структурних) типів даних - масивами,
при цьому опускається робота з файлами даних. Це пов'язано з тим, що у навчальному
плані мало навчальних годин відводиться на даний розділ. Незважаючи на брак
часу, бажано в кінці розділу розглянути тему "Обробка
послідовних файлів у програмі ". Учні вже повинні знати, що таке
файл. Тому заняття необхідно почати з відновлення опорних знань: p>
Що
таке файл? p>
Якими
способами можна створити файл? p>
Яким
способом вводили дані в програму? p>
Яким
способом виводили дані з програми? p>
Які
оператори при цьому використовували? p>
До
даними, записаним на диску можна звернутися прямим методом доступу або
послідовним методом доступу. При послідовному доступі дані повинні
читатися з файлу в тому порядку, в якому вони були записані. Прямий доступ до
файлу дозволяє читати й оновлювати записи незалежно від їх положення в файлі, без
перебору. p>
Послідовні
файли слід розглядати як альтернативу екрана та клавіатури. Все, що
відображалося на екран, у такому вигляді і за такими ж правилами виводиться в
послідовний файл, а все, що вводилося з клавіатури, вводиться з
послідовного файлу. p>
Нехай
дані записані на диску у файлі File1.dat. Як до них звернутися з програми?
Для цього необхідно в програмі передбачити: p>
Зв'язок
імені файлу з каналом введення - виведення та оголосити його відкритим. p>
Оголосити
спосіб доступу до файлу (послідовний або прямий). p>
Переслати
дані. p>
Закрити
канал введення - виведення, пов'язаний з файлом. p>
Розглянемо
оператори, за допомогою яких здійснюється ця робота на мовах
програмування Бейсік і Паскаль. p>
На
мовою програмування Бейсік. p>
Оператор
OPEN "відкриває" файл, тобто робить файл на диску відомим програмі,
зв'язує ім'я файлу на диску з номером каналу введення - виведення в програмі і
показує режим роботи з файлом. p>
Формат: p>
Open
"назва файлу" [for режим] as # номер каналу [len = строка] p>
Режими
для послідовних файлів: p>
INPUT - для читання p>
OUTPUT - для запису p>
APPEND - для додавання даних у файл. p>
Приклад: p>
Open "File1.dat" for input as
# 1 p>
Оператор
PRINT # призначений для виведення даних у файл. P>
Формат:
PRINT # номер каналу, ім'я змінної p>
Приклад: p>
Print # 1, fam $ (i), sum (i) p>
Оператор
INPUT # призначений для введення змінних з файлу (так само як це робить
оператор INPUT при їх введення з клавіатури). p>
Формат:
INPUT # номер каналу, список змінних p>
Приклад: p>
Input # 1, fam $ (i), kol (i) p>
Функція
EOF дозволяє визначити кінець файлу. P>
Формат:
EOF (номер каналу) p>
Оператор
CLOSE # "закриває" файл, тобто від'єднує його від програми і
звільняє в ній канал введення - виведення. p>
Формат:
CLOSE # номер каналу p>
Завдання:
Розрахувати зарплату на кожного члена бригади і записати у файл File2.dat дані
прізвище члена бригади і його зарплату з урахуванням прибуткового податку. Дані щодо
кожному члену бригади (прізвище та кількість зроблених виробів) містяться в
фото File1.dat. Примітка: кількість членів бригади, вартість виробу і
відсоток на зарплату від прибутку ввести з клавіатури. p>
Input
"Кількість членів бригади"; n p>
Input
"Вартість вироби"; r p>
Input
"Відсоток на зарплату від прибутку"; p p>
p
= P/100 p>
Dim
fam (n), kol (n), sum (n) p>
Open "File1.dat" for input
as # 1 p>
for i = 1 to n p>
Input # 1, fam $ (i), kol (i) p>
sum (i)
= Kol (i) * r * p * 0.13 p>
next
i p>
Close
# 1 p>
Open "File2.dat" for
output as # 1 p>
for i = 1 to n p>
Print # 1, fam $ (i), sum (i) p>
next
i: Close # 1 p>
На
мовою програмування Паскаль. p>
В
Турбо Паскалі розрізняють текстові файли, типізовані файли і
нетипізовані файли. При роботі з файлами ключовим поняттям є поняття
змінної файлового типу або файлової змінної і описується вона в розділі
змінних в залежності від класу файлу. Для текстових файлів файлова
мінлива належить стандартного типу Text. Файлова змінна (Ф.П.)
зв'язується з ім'ям файлу за допомогою оператора ASSIGN. p>
Формат: p>
Assign
(<Ф.П.>, '<шлях до файлу> <ім'я файлу >'); p>
Він
повинен бути першим серед операторів, що працюють з файлом. Перш, ніж почати
працювати з файлом його потрібно "відкрити". Оператор RESET відкриває вже
існуючий файл, а оператор REWRITE відкриває новий файл або файл, вміст
якого повністю замінюється. p>
Формати: p>
Reset
(<Ф.П. >); p>
Rewrite
(<Ф.П. >); p>
Для
читання даних з файлу використовуються процедури READLN, READ, BLOCKREAD. p>
Формат: p>
Readln
(<Ф.П. "," мінлива >); p>
Для
запису даних у файл використовуються процедури WRITELN, WRITE, BLOCKWRITE. p>
Формат: p>
Writeln
(<Ф.П. "," мінлива >); p>
Після
завершення роботи з файлом, його необхідно "закрити" оператором Close.
p>
Формат:
Close (<Ф.П. >); p>
Знищити
непотрібний файл оператором Erase (<Ф.П.>), а перейменувати файл --
оператором Rename (<Ф.П.>, <рядок>), де рядок представляє нове
назва файлу. p>
Текстовий
файл трактується в Турбо Паскалі як сукупність рядків змінної довжини. Доступ
до кожного рядка послідовний, починаючи з першого. У кінці кожного рядка
ставиться маркер EOLN (End Of Line - кінець рядка), а в кінці всього файлу
маркер EOF (End Of File - кінець файлу). p>
Розглянемо
роботу з файлами на прикладах. p>
Приклад
1. p>
На
диску а: записаний файл posl.txt, в кожному рядку якого записано прислів'я.
Визначити скільки букв в кожній прислів'ї і вивести результат обчислення на
екран. p>
program
texst; p>
var
f: text; (* файлова мінлива *) p>
s:
integer; (* кількість літер
*) p>
sim:
char; (* символ
*) p>
begin p>
Assign
(f, 'a: posl.txt'); p>
reset
(f); (* відкриття файлу *) p>
while
not eof (f) do (* перевірка
кінця файлу *) p>
begin p>
s: = 0; p>
while
not eoln (f) do (* перевірка кінця рядка *) p>
begin p>
read (f,
sim); p>
if
(sim <> '') or (sim <>',') then s: = s +1; p>
end; p>
writeln ( 'число
букв у прислів'ї ', s); p>
readln (f); (*
перехід на новий рядок *) p>
end; p>
Close (f)
{**} p>
end. p>
Приклад
2. P>
В
існуючому файлі dan1.dat записана матриця з цілих чисел. У новий файл
dan2.dat переписати цю матрицю і додати в кожну рядок слово
"сума =" і результат обчислення суми чисел у цьому рядку. p>
Program
matrica; p>
var f1, f2: text; p>
x, s: integer; p>
begin p>
Assign
(f1, 'dan1.dat'); p>
Reset
(f1); (* відкриття файлу для читання *) p>
Assign
(f2, 'dan2.dat'); p>
Rewrite
(f2); (* відкриття файлу для запису *) p>
While
not eof (f1) do p>
begin p>
s: = 0; p>
While not eoln (f1) do
p>
begin p>
Read (f1, x); p>
Write (f2, x); p>
s: =
s + x; p>
end; p>
Writeln (f2, '', 'сума =', s); p>
Readln (f1); p>
end; p>
close (f1);
close (f2); p>
Writeln
( 'Робота завершена, файл створений на диску'); p>
end. p>
При
виконання операцій вводу-виводу даних за замовчуванням автоматично виробляється
перевірка на виникнення помилки. При виявленні помилки виконання програми
припиняється. Але в програмі можна передбачити власну реакцію на
помилкові ситуації. Для цього на початку "небезпечного" фрагмента
відключається автоматична перевірка ($ I-). При виникненні помилки формується
код, який обробляється функцією IOResult. Функція IOResult повертає в
програму код помилки, обнуляє цей код, тому подальші звернення до цієї
функції не будуть давати нульовий результат, поки яка-небудь операція не закінчиться
аварійно. p>
Приклад: p>
Assign
(f, 'file1.dat'); p>
($ I-) (* відключаємо автоматичну перевірку *) p>
Reset
(f); p>
code: =
IOResult; (* отримали код результату *) p>
if
code <> 0 then p>
begin (* виникла помилка *) p>
write
( 'Помилка при відкритті файлу'); p>
case
code of p>
1:
write ( 'файл не знайдено'); p>
3:
write ( 'маршрут не знайдений'); p>
4:
write ( 'занадто багато відкритих файлів'); p>
5:
write ( 'заборону доступу до файлу'); p>
12:
write ( 'некоректний код доступу до файлів'); p>
else p>
... ... .. p>
end p>
end; p>
($ I-) (*
включаємо автоматичну перевірку *) p>
... ... ... ... ... ... ... .... p>
Після
розглянутих прикладів можна запропонувати завдання для самостійної роботи. p>
Завдання
1. Дані про абітурієнтах (прізвище, ім'я, по батькові, середній бал атестата)
містяться у файлі F1.txt. Напишіть програму, яка запрошувала б позначки
всіх зданих іспит кожного абітурієнта та формувала новий файл F2,. txt в
якого увійшли б такі відомості про абітурієнтах: прізвище, ім'я, по батькові,
середній бал атестата, отметка1, отметка2, отметка3. p>
Завдання
2. Дані про платників податків (прізвище, ім'я, по батькові, адреса) знаходяться в
фото F1.txt. Написати програму, яка виводила ці відомості до таблиці: p>
Прізвище, ім'я, по батькові p>
адреса p>
дохід p>
податок p>
Дохід
ввести з клавіатури. Податок розрахувати 15% від доходу. Дохід і податок вивести в
таблицю. p>
Завдання
3. Скласти програму обробки психологічного тесту. Питання, відповіді і
бали за кожне питання містяться в послідовному файлі. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://www.khspu.ru
p>