bobalo(1)
.pdfтипу ST програма для розв’язання попереднього прикладу матиме такий вигляд:
PROGRAM STROK;
VAR ST:STRING[80];
S1, S2:STRING[3]; S3:STRING[4]; I, K:INTEGER;
BEGIN READLN(ST); K:=0;
S1:=COPY(ST, 1, 3);
S2:=COPY(ST, 78, 3); IF(S1=’IN ’)THEN K:=K+1; IF(S2=’ IN’)THEN K:=K+1; FOR I:=1 TO 76 DO
BEGIN
S3:=COPY(ST, i, 4);
IF S3=’ IN ’ THEN K:=K+1; END;
WRITELN(’Кількість слів IN=’, K) END.
3.КОНТРОЛЬНІ ЗАПИТАННЯ
1.Як описуються символьні масиви?
2.Що таке упакований символьний масив?
3.Які особливості опису рядка символів у мові Turbo Pascal?
4.Як здійснюється введення і виведення елементів рядкового типу?
5.Які операції можна виконувати над змінними рядкового типу?
6.Що означає стандартна функція EOLN?
7.Яка максимальна розмірність рядка символів, описаних типом
STRING?
8.Для чого потрібно задавати довжину змінної рядкового типу?
9.Як резервується пам’ять під змінну рядкового типу?
4.ЛАБОРАТОРНЕ ЗАВДАННЯ
1.Ознайомитись із типами даних, які вживаються у мові Паскаль, і особливостями застосування змінних рядкового типу.
2.Одержати індивідуальне завдання (див. додаток).
121
3.Скласти блок-схему алгоритму і написати дві програми мовою Паскаль для реалізації поставленого завдання. Використати опис рядка як масив символів і опис рядкового типу STRING з використанням стандартних функцій
іпроцедур.
4.Виконати обчислення за програмою.
5. ЗМІСТ ЗВІТУ
1.Мета роботи .
2.Короткий опис особливостей застосування рядкового типу.
3.Індивідуальне завдання.
4.Блок-схема алгоритму для обчислення за індивідуальним завданням.
5.Два тексти програм мовою Паскаль.
6.Результати обчислень за програмою.
7.Аналіз результатів, висновки.
122
Додаток
1.Ввести з клавіатури два рядки ST1 та ST2 завдовжки до 70 символів. Видалити із рядка ST2 всі слова, які входять в рядок ST1.
2.Ввести з клавіатури рядок S завдовжки до 50 символів. Вивести його на друк подвоївши пробіли між словами.
3.Ввести рядок завдовжки до 50 символів, вивести на друк найдовше слово цього рядка.
4.Ввести з клавіатури два рядки ST1 та ST2. Якщо в рядку ST2 є слова SIN та COS, перенести їх в рядок ST1.
5.Ввести рядок завдовжки до 70 символів, поміняти в ньому всі слова “FO” на
“UFO”.
6.Ввести рядок завдовжки до 80 символів. Якщо в рядку зустрічається два подвоєння літери “Т”, то логічний змінній В присвоїти значення TRUE, якщо ні –
FALSE.
7.Ввести рядок завдовжки до 70 символів. Визначити, скільки слів з чотирьох літер входять в цей рядок.
8.Ввести рядок завдовжки до 50 символів. Вивести на друк всі слова, які починаються літерами “I” або “Н”.
9.Ввести з клавіатури рядок S завдовжки до 80 символів з літер латинського та українського алфавітів. В рядок SL перенести всі літери латинського алфавіту, а в рядок SU – всі літери українського алфавіту.
10.Ввести рядок, який містить 12 слів, що є назвами місяців року. Відсортувати ці слова за алфавітом.
11.Ввести рядок до складу якого можуть входити літери, цифри і знаки арифметичних операцій. Перенести в рядок SZ – знаки арифметичних операцій, якщо таких знаків немає, то логічній змінній L присвоїти значення TRUE.
12.Якщо в рядок завдовжки до 70 символів входить однакова кількість слів “END” та ”BEGIN”, то логічній змінній В присвоїти значення TRUE, якщо не однакова
-FALSE.
13.Ввести з клавіатури рядок ST1 завдовжки до 70 символів. В рядок SТ2 перенести всі слова, довжина яких більша 5 символів.
14.Ввести з клавіатури два рядки ST та ST1 завдовжки до 60 символів. В рядок ST2 записати всі слова, які входять в обидва рядки ST та ST1. Якщо однакових слів немає, то логічній змінній L присвоїти значення FALSE.
15.Ввести рядок S завдовжки до 70-ти символів. В рядок S3 записати всі слова рядка S, в яких кількість літер кратна трьом.
16.Якщо рядок завдовжки до 60 символів починається словом ”BEGIN”, закінчується словом “END” і більше в рядку цих слів немає, то логічний змінній В присвоїти значення TRUE, у протилежному випадку – FALSE.
17.У рядку завдовжки до 50 символів визначити кількість входження слова “FOLIO”. Якщо кількість входжень – число парне, то логічній змінній Т присвоїти значення TRUE, якщо ні – FALSE.
123
18.Ввести рядок завдовжки до 70 символів. Вивести на друк всі слова, в яких зустрічається подвоєння першої літери. Якщо таких слів немає, то логічний змінній L1 присвоїти значення TRUE.
19.Ввести з клавіатури рядок S1 завдовжки до 70 символів. Якщо перше слово рядка довше семи символів, то логічній змінній L присвоїти значення TRUE, якщо ні –
FALSE.
20.Ввести з клавіатури рядок S1 завдовжки до сімдесяти символів. В рядок S2 перенести всі слова, які мають подвоєння літер.
21.Ввести рядок S завдовжки до 50 символів, замінити в ньому всі літери “Р” на буквосполучення “PU”.
22.Якщо в рядок завдовжки до 70 символів входить парна кількість слів, що складаються з чотирьох літер, то змінній логічного типу L присвоїти значення TRUE.
23.Перенести в рядок S2 із рядка S1 завдовжки до 60-ти символів всі слова, які закінчуються буквою “К” і містять не менше трьох літер.
24.Видалити з рядочка S1 завдовжки до 40 символів всі слова, які починаються
із цифри.
25.Ввести рядок S завдовжки до 60 символів. Якщо цей рядок закінчується словом “STOP”, логічний змінній присвоїти значення TRUE, якщо не закінчується цим словом, то дописати його в кінці рядка.
26.Ввести рядок завдовжки до 50 символів. Якщо в рядку кількість слів кратна числу 7, то змінній логічного типу В, присвоїти значення TRUE, якщо ні – FALSE.
27.Визначити найкоротше слово рядка завдовжки якого до 70 символів. Якщо таких слів є два, логічний змінній L присвоїти значення TRUE, якщо ні – FALSE.
28.Визначити, чи виконується баланс круглих дужок в операторі присвоєння завдовжки до 40-ка символів.
29.Ввести рядок S1 завдовжки до 70 символів. Видалити всі зайві голосні літери (a, o, u, i, j, e), які дублюються в цьому рядку.
30.Ввести рядки: S1 завдовжки до 50 символів та S2 завдовжки до 40 символів.
Урядок S3 перенести всі слова завдовжки 4 символи, які входять в рядок S1 і не входять в S2.
124
Лабораторна робота № 7
ФАЙЛОВІ ТИПИ У МОВІ ПАСКАЛЬ. ПРОЦЕДУРИ ВВЕДЕННЯ– ВИВЕДЕННЯ.
ТЕКСТОВІ ФАЙЛИ
125
1. МЕТА РОБОТИ
Мета роботи – ознайомитись з файловим типом даних та застосуванням процедур введення–виведення у мові Паскаль.
2.ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1.ФАЙЛОВІ ТИПИ
Важливою властивістю всіх розглянутих раніше типів даних є присутність у них конкретної, наперед заданої кількості компонентів. Але існують задачі, де кількість компонентів визначити наперед неможливо. Вони формуються у процесі виконання завдання. Тому виникає необхідність формування спеціального типу даних, які є послідовністю елементів одного і того самого типу, довжина якої наперед не визначається. Такий тип називається файловим.
Файловий тип потрібен для зберігання інформації на зовнішніх запа- м’ятовувальних пристроях і доступу до цієї інформації.
Під файлом у мові Паскаль розуміють область пам’яті на зовнішньому запам’ятовувальному пристрої, яка може зберігати деяку інформацію. У цій області можна як розмістити конкретні дані, так і отримати їх з неї. Ці дії
називаються введенням–виведенням інформації.
Опис змінної файлового типу може мати кілька варіантів. Змінні файлового типу можна описувати або у розділі опису типу, або у розділі опису
змінних.
Конструктор файлового типу:
TYPE
<ім’я типу> = FILE OF <базовий тип>;
Синтаксична діаграма опису файлового типу:
FILE |
OF |
Базовий тип |
Рис.1. Синтаксична діаграма опису файлового типу
Тип елементів файла (базовий тип) може бути довільним, але не може бути файловим.
TYPE
F = FILE OF INTEGER; VAR F1, F2 : F;
126
Або можна описати змінні одразу в розділі опису змінних:
VAR
F1, F2 : FILE OF INTEGER;
Такий опис означає, що під іменем F1 та F2 є список невизначеної кількості цілих чисел, розміщених на якомусь зовнішньому пристрої (наприклад, на магнітному диску). Оскільки файли – це засіб “спілкування” програми із зовнішніми пристроями, то ім’я такого файла повинно бути зв’язане із фізичним іменем файла на диску.
У стандарті мови Паскаль це робиться внесенням імені файла в заголовок програми:
PROGRAM TEST (INPUT, OUTPUT, F1, F2);
Файли, імена яких введені в заголовок програми, називаються зовнішніми. Вони існують поза межами програми. Зовнішні файли можуть формуватися (заповнюватися) в одній програмі, а виконуватися в іншій.
Отже, у пам’яті машини виділяється місце на два файли з іменами F1 та F2, елементами яких будуть цілі числа.
F1.DAT та F2.DAT
Файли, які містять числову інформацію, матимуть розширення імені файла “*.DAT”. Якщо імена файлів не внесені у список заголовка програми, то вони називаються внутрішніми та існують лише під час виконання програми. Під час виконання програми різниці між внутрішніми та зовнішніми файлами немає. Різниця проявляється тільки після закінчення виконання програми: внутрішні файли не запам’ятовуються, а зовнішні файли зберігаються на зовнішніх носіях. Внутрішні файли мають допоміжний характер.
У версії Turbo Pascal приєднання файла здійснюється за допомогою процедури ASSIGN.
Структура команди:
ASSIGN ( <ім’я файла>, <фізичне ім’я файла на диску>);
Приклади опису:
ASSIGN (F1, ’C:\FL-11\MYF1.DAT’);
ASSIGN (F2, ’C:\KN-16\STUD.DAT’);
Фізичне ім’я файла – це ім’я файла на зовнішньому носії, яке записується в одинарних лапках: ’C:\FL-11\MYF1.DAT’, тобто файл з назвою “MYF1” з розширенням “DAT”, з каталогу (директорії) “FL-11” на диску “С”.
2.2. ПРОЦЕДУРИ РОБОТИ З ФАЙЛОВИМ ТИПОМ ДАНИХ
Над файлами можна виконувати дві дії:
1)запис у файл;
2)зчитування з файла.
127
2.2.1. Операції зчитування з файла
Для здійснення доступу до окремих елементів файла у мові Паскаль виконуються спеціальні стандартні процедури:
RESET (F1) – підготовка файла до читання. Маркер (вказівник на елемент файла) ставиться на початок файла F1.
↓
F1 |
|
f1 |
f2 |
f3 |
… |
fk |
… |
READ (F1, V); – оператор процедури введення. Присвоює змінній V значення поточної компоненти файла F1 та пересуває маркер файла на наступну позицію.
Розглянемо для прикладу ситуацію, коли маркер файла (↓) вказує на компонент файла із значенням “Х”. До виконання процедури READ значення змінної V було невизначене:
↓
F1 f1 f2 f3 ... X fi … fk …
V ?
Після виконання процедури READ – маркер файла (↓) вказує на наступний елемент і змінній V присвоєне значення “Х”:
|
|
|
|
|
|
↓ |
|
|
|
F1 |
f1 |
f2 |
f3 |
... |
X |
fi |
… |
fk |
… |
V |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
Читати з файла F1 за допомогою процедури READ можна лише після виконання оператора процедури RESET (F1), тобто відповідно після встановлення маркера файла на початок файла (в режим читання).
Процедура RESET може бути використана до одного і того самого файла довільну кількість разів. При цьому вміст файла F1 не змінюється.
2.2.2. Запис у файл
REWRITE (F2) – підготовка файла F2 до запису. Встановлює файл з іменем F2 у початкове положення, маркер файла встановлюється на першу позицію файла. Якщо у файлі були записані якісь елементи, то вони стають недоступними, іншими словами, знищуються. Файл стає пустим.
128
↓
F2 |
|
|
|
… |
|
… |
WRITE (F2, X); – записує у файл (в ту позицію, на яку вказує маркер файла) чергову компоненту, що дорівнює значенню Х, при цьому маркер файла переміщується на наступну позицію:
|
|
↓ |
|
F2 |
Х |
… |
… |
Тип виразу, або змінної Х повинен збігатися з типом компонентів файла F2 (тобто з базовим типом).
Процедура REWRITE може бути використана до одного і того самого файла довільну кількість разів, але при цьому попередня інформація, що міститься у файлі F2, знищуватиметься.
Необхідно пам’ятати, що робота з кожним файлом може виконуватись або тільки в режимі запису в нього компонент, або в режимі читання цих компонент. Використовувати один і той самий файл одночасно для запису і для читання не можна.
У визначений момент можна прочитати лише одну компоненту файла і присвоїти її значення конкретній змінній.
Доступ до будь-якої компоненти файла здійснюється через його початок послідовним перебором всіх компонент, які передують потрібній. Для того, щоб знати, чи не вийшли ми за межі файла, існує стандартна функція EOF (F1) “End Of File”. Аргументом функції EOF є ім’я файла. Значення цієї функції - TRUE, якщо ми вийшли на кінець файла, і FALSE - якщо кінця файла ще не досягнуто.
Для прикладу роботи з файлами напишемо програму. У файлі F1 записано одномірний масив А із 20 елементів. Відсортувати елементи масиву А за зростанням і відсортований масив записати у файл F2.
PROGRAM SORT (INPUT, OUTPUT, F1, F2);
VAR
A : ARRAY [1..20] OF INTEGER;
F1, F2 : FILE OF INTEGER;
I, J, R : INTEGER;
BEGIN
RESET(F1);
FOR I:=1 TO 20 DO
READ(F1, A[I]);
FOR I:=2 TO 20 DO
BEGIN
FOR J:=20 DOWNTO I DO
129
IF A[J-1]>A[J] THEN
BEGIN
R:= A[J-1];
A[J-1]:=A[J];
A[J]:=R
END;
END;
REWRITE(F2);
FOR I:=1 TO 20 DO
WRITE(F2, A[I]);
FOR I:=1 TO 20 DO
WRITE(A[I]:3);
CLOSE(F1);
CLOSE(F2)
END.
Після використання файли треба закрити за допомогою процедури
CLOSE(< ім’я файла >);
Наприклад: CLOSE(F1); CLOSE(F2);
2.3. БУФЕРНІ ЗМІННІ В СТАНДАРТІ МОВИ ПАСКАЛЬ
Як зазначалось вище, процедура читання з файла READ(F1, V) складається з двох дій:
1)копіювання значення компоненти файла, на яку вказує маркер, і присвоєння цього значення змінній V;
2)зсув маркера на наступну позицію.
Удеяких завданнях виникає потреба ці два етапи розділити. Для цього
доцільно використати буферну змінну. Буферною змінною називають конструкцію F1↑ (до імені файлової змінної додається стрілка “↑”). Буферну змінну F1↑ не потрібно описувати у розділі опису змінних, вона визначається автоматично з введенням файлової змінної. Тип буферної змінної збігається з типом
компоненти файла.
Із значенням цієї буферної змінної можна виконувати всі операції, які допустимі у базовому типі, тобто типі компонентів файла.
Для пересування маркера на наступну позицію файла використовується стандартна процедура GET (<ім’я файла>); Параметром її є ім’я файлової змінної.
Отже, процедуру READ(F1, Х); можна замінити складеним оператором:
130
