- •Основні стандартні функції мови Pascal. Навести приклади виразу деяких функцій користувача через основні функції в програмах мовою Pascal.
- •16.Використання в програмах мовою Pascal складеної команди та команди безумовного переходу. Наведіть приклади їх використання.
- •18.Організація циклічного обчислювального процесу в програмах мовою Pascal. Наведіть приклади блок-схем таких алгоритмів.
- •21.Організація масивів даних(види масивів, операції з масивами). Опис та використання їх в програмах (навести приклади).
- •23.Підпрограми, їх призначення та види підпрограм в мові Pascal.
- •26.Рекурсивні функції та їх використання.
- •27.Поняття модулів. Їх види та використання в програмах.
- •28.Модулі користувача (правила створення).
- •30.Поняття файлу. Програмна модель файлу. Типи файлів. Способи доступу.
- •32.Стандартні процедури і функції для файлів прямого доступу
- •32.Використання текстових файлів в програмах. Обробка текстового файлу в програмах мовою Pascal.
- •34.Поняття динамічної пам’яті, вказівники та динамічні змінні. Поняття стека та черги.
- •35.Загальна характеристика типів даних мови Паскаль
- •36.Використання графіки в програмах мовою Pascal.
- •37.Стандартні процедури та функції для графічних побудов. Наведіть приклади їх використання в програмах мовою Pascal.
32.Стандартні процедури і функції для файлів прямого доступу
Seek(< ФЗ >, N )
Процедура переміщує файловий покажчик з поточної позиції на вказану компоненту з номером N (значення N типу longint).
Filepos (< ФЗ >) :longint
Функція повертає номер компоненту файлу, на який встановлений файловий покажчик.
Filesize (< ФЗ >) :longint
Функція повертає розмір файлу, що вимірюється не в байтах, а в компонентах (кількість компонент).
IOResult(< ФЗ >): integer
функція повертає номер помилки, яка виникла при звернені до файлу. Якщо помилок не було, то повертається 0.
Цю функцію зручно використовувати для “тихої” обробки помилок, які можуть виникнути при роботі з файлом. Під тихою обробкою розуміється, що користувач програми не буде отримувати системне повідомлення про помилку, яка може бути усунута самою програмою (якщо не усунута, то з обійдена з найменшими втратами для честі і гідності програміста).
Для того щоб відключити видачу стандартного повідомлення про помилку необхідно дати директиву компілятору {$I-}. Якщо на початку в тексті програми задати цю директиву, то під час виконання не будуть видаватися повідомлення про помилку.
Для того щоб все повернути назад у програмі треба вказати директиву {$I+}.
Стандартні процедури і функції для текстових файлів
ЕOLN (<ФЗ>) : boolean
Функція повертає значення true, якщо досягнутий кінець рядка (або кінець файлу) або false у протилежному випадку.
SeekEOLN (<ФЗ>);
Пересуває файловий покажчик на кінець рядка.
SeekEOF (<ФЗ>);
Пересуває файловий покажчик на кінець файлу.
Стандартні процедури і функції зчитування/ запису даних
Для зчитування і запису даних у типізованих та текстовий файлів використовується процедури Read та Write.
Read (< ФЗ >, < список введення > );
Write (< ФЗ >, < список виведення > );
Першим параметром вказується файлова змінна, далі слідує список змінних значення яких необхідно прочитати з файлу або записати в файл.
Для текстових файлів можливо використання процедур
ReadLn (< ФЗ >, < список введення > );
WriteLn (< ФЗ >, < список виведення > );
при використанні яких з файлу відбувається по-рядкове зчитування (при зчитуванні з файлу береться послідовність символів, що починається з поточної позиції файлового покажчика та закінчується ознакою EOLN) або запис (при записі після виведення останньої змінної до файлу додається ознака EOLN).
Особливості використання текстового файлу
Як вже було сказано вище текстовий файл містить набір рядків символів. Здавалось би, що це накладає певні обмеження на тип інформації, що передається з файлу та в файл (тобто передаються тільки рядки символів). Але для текстового файлу такого обмеження не існує!
При виконанні операцій зчитування та запису текстового файлу дозволяється передача даних чисельних і нечисельних типів без попередньої конвертації (перетворення) у рядок. Таке перетворення відбувається автоматично при передачі даних.
Але при зчитуванні треба бути певними, що дані, які містить файл дійсно відповідають тим типам змінних, які будуть зчитуватися.
Розглянемо приклад: скласти програму для обчислення
,
де a, b – цілі, x – дійсне зберігаються у файлі.
Враховуючи те, що з файлу необхідно прочитати дані різних типів, типізований файл використовувати неможна. Крім того цілочисельні та дійсні змінні мають різний розмір, що ускладнює використання нетипізованого файлу (неможна призначити блок одного розміру). Найпростішим та найзручнішим у цьому випадку буде використання текстового файлу.
Var
a, b: integer;
y, x: real;
f: text;
begin
{відкриття файлу}
Assign (f, ‘c:\datafile.dat’);
Reset (f);
{зчитування змінних}
Read (f, a, b, x);
y:=srt ( abs(a+b*x) );
WriteLn(‘y=’, y:9:4);
Close (f);
end.
При зчитуванні вважається, що файл містить всю необхідну інформацію, яка подана у форматі, що відповідає типу заданих змінних, тобто для правильного виконання процедури Read (f, a, b, x) у файлі f записані два цілочисельних значення (для змінних a і b) та одне дійсне для змінної x. Ці значення вказуються у файлі через прогалину. Наприклад, якщо файл містить таку послідовність:
5 5 4.0
то змінна а дорівнюватиме 5, b теж дорівнюватиме 5, а х=4.0. Тоді значення у буде 5.0.
Для нетипізованих файлів використовуються процедури:
BlockRead (< ФЗ >, Buf, N, Result);
яка зчитує з файлу, з яким пов’язана файлова змінна < ФЗ > N блоків і записує їх в змінну Buf. Вважається, що змінна Buf достатня за розміром і у файлі вистачить даних. Змінна Result не є обов’язковим параметром. Якщо вона використовується, то повертає кількість реально зчитаних блоків. Після виконання операції зчитування файловий покажчик пересувається на відповідну кількість блоків.
Для запису даних у нетипізований файл використовується процедура:
BlockWrite (< ФЗ >, Buf, N, Result);
яка записує в файл, з яким пов’язана файлова змінна < ФЗ > N блоків зі змінної Buf. Змінна Result також не є обов’язковим параметром. Якщо вона використовується, то повертає кількість реально зчитаних блоків.
Розглянемо приклад: зчитати з нетипізованого файлу ‘c:\DataFile.dat’ цілочисельні дані для масиву А(100). Звести елементи масиву в квадрат та записати знову до файлу.
Var
F: file;
A: array [1..100] of integer;
i: byte;
begin
{зв’язування файлу з ФЗ}
Assign (F, ‘c:\DataFile.dat’);
{відкриття файлу для зчитування}
Reset (F, SizeOf(A));
{зчитування даних з файлу до масиву А}
BlockRead (F, A, 1);
Close (F); {закриття файлу}
{обробка елементів масиву}
for i:=1 to 100 do
A[i]:=sqr(A[i]);
{відкриття файлу для запису}
Rewrite(F, SizeOf(A));
{запис даних з масиву А до файлу}
BlockWrite(F, A, 1);
Close(F); {закриття файлу}
end.
На початку програми нетипізований фай відкривається для зчитування (дивися розд. “Відкриття нетипізованого файлу”). Другим параметром процедури Reset є розмір блока файла. Для зручності розмір блока файла призначається рівним розміру масиву А.
Функція SizeOf (Х) повертає розмір заданого аргументу Х, яким може бути будь-яка змінна або тип даних.
Після зчитування файл закривається та у циклі виконуються необхідні дії над масивом. Після закінчення циклу файл відкривається, але вже для запису, проводиться запис масиву у файл і виконується закриття файлу.
Закриття файлу
Після закінчення роботи необхідно закрити файл процедурою:
close (<ФЗ>);
Якщо файл не закрити, то можна втратити інформацію, особливо якщо проводився запис даних у файл.
Після закриття файлу, у разі необхідності, файлова змінна може бути зв’язана з іншим файлом.
