МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
РОБОТА З ТЕКСТОВИМИ ФАЙЛАМИ.
СИМВОЛЬНІ ТА РЯДКОВІ ЗМІННІ
ІНСТРУКЦІЯ ДО ЛАБОРАТОРНОЇ РОБОТИ № 4
З КУРСУ “АЛГОРИТМІЧНІ МОВИ І ПРОГРАМУВАННЯ”
для студентів спеціальності
6.0914 “Комп’ютеризовані системи, автоматика і управління” та
6.1601 “Інформаційна безпека”
Затверджено на засiданнi кафедри “Автоматика і
телемеханiка”, протокол
№___ від __.__.200__ р.
Львів – 2006
Робота з текстовими файлами. Символьні та рядкові змінні: інструкція до лабораторної роботи №4 з курсу “Алгоритмічні мови і програмування” для студентів спеціальності 6.0914 “Комп'ютеризовані системи, автоматика і управління” та 6.1601 “Інформаційна безпека” / Укл.: ____________, Б.Д.Будз, О.І.Гарасимчук - Львів: НУЛП, 2006.- 16 с.
Укладачі: ______________________________,
Б.Д. Будз, асистент,
О.І. Гарасимчук, асистент.
Відповідальний за випуск:
__________________________________.
Рецензент: __________________________________.
Мета роботи - вивчити види файлів, стандартні процедури і функції мови Турбо-Паскаль для роботи з файлами, навчитися складати та відлагоджувати програми для роботи з тестовими файлами. Навчитись використовувати символьні і рядкові змінні для роботи з текстовими файлами.
1. ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
В тих випадках, коли даних багато або їх треба довго зберігати, застосовують файли.
1.1. Файл – це сукупність даних будь-якого типу. Таке визначення збігається з визначенням масиву, але, на відміну від останнього, файли розташовані на зовнішньому носії, кількість даних у файлі при його описуванні не вказується, елементи файлу не мають індексів, що ускладнює роботу з ними.
Файл повинен мати ім’я. За іменем може іти розширення – послідовність до трьох дозволених символів. Розширення, якщо воно є, відділяється від імені крапкою. Якщо файл, який ви бажаєте редагувати вашою програмою, не знаходиться з нею в одній директорії, то для звернення до файлу перед його іменем необхідно вказати шлях до нього. Максимальна довжина імені разом з шляхом складає 79 символів.
В мові Turbo Pascal є три види файлів: типовані, текстові та нетиповані. Кожен з них має свою область використання і свої особливості.
1.2. Файловий тип даних описують у розділі описів типів так:
type <ім’я типу> = file of <базовий тип>;
або безпосередньо у розділі оголошення змінних
var <список змінних> : file of <базовий тип>;
Приклад:
Type f1 = file of integer;
f2 = file of string [20];
var file1, file2: f1; file3:f2;
zminni: file of Boolean;
1.3. Текстові файли.
Текстові файли відрізняються від типованих тим, що їх можна редагувати або переглядати за допомогою звичайного текстового редактора.
Такі файли описують одним словом Text, наприклад:
var ft: text;
Елементами текстового файлу є символи, організовані в рядки в загальному випадку різної довжини. В кінці кожного рядку стоїть ознака “кінець рядку”, а в кінці файлу – “кінець файлу”.
Ознакою кінця рядку є символ #13 (це один з перших 32 символів таблиці ASCII, він має визначення CR). Він може бути об’єднаний з символом перенесення рядку #10 (його визначення LF). При введенні даних з клавіатури символ CR вводиться при натисканні клавіші Enter.
Ознакою кінця файлу є символ #26. При введенні даних з клавіатури, цей символ записується при одночасному натисненні клавіш CTRL/Z.
Ознака “кінець файлу” розпізнається функцією Eof, яка виробляє значення True, якщо досягнуто символу #26, в протилежному випадку вона виробляє значення False.
Кінець рядку розпізнається функцією Eoln (скорочено від End of Line). Вона виробляє значення True, якщо досягнуто ознаки кінця рядку, в протилежному випадку – значення False.
Файлова змінна текстового типу зв’язується з конкретним файлом на диску оператором Assign. Щоб записати інформацію в текстовий файл, його треба відкрити процедурою Rewrite, а процедура Reset відкриває його для читання.
Для запису символів у файл використовують оператори Write або Writeln.
Для читання інформації з текстового файлу використовують оператори Read та Readln, при цьому Read читає дане з файлу без переходу на наступний рядок, а оператор Readln забезпечує такий перехід.
Особливістю роботи з текстовими файлами є те, що параметри, значення яких вводяться та виводяться з допомогою процедур Read або Write, можуть бути не обов’язково типу Char чи String, а й інших простих типів (цілих, дійсних типів при вводі; цілих, дійсних типів, типу Boolean – при виведенні). Ці процедури можуть також працювати і з ASCIIZ-стрічками.
Текстовий файл можна створювати декількома способами, наприклад: посимвольно, використовуючи готові рядки (дані String) або їх можна створювати у будь-якому текстовому редакторі, тобто не програмним шляхом, а обробляти в самій програмі. Більш того, в такий файл можна записати числа і використовувати їх у програмі.
Приклад програми посимвольного формування рядків файлу:
uses crt;
const n=5;
var f1:text;
i:integer; symb:char;
Begin
assign (f1, ‘G:\User\text.txt’);
rewrite (f1); {відкрити файл для редагування}
for i:=1 to n do
begin
repeat
read (symb); {вводимо символ з клавіатури}
write (f1, symb); {записуємо у файл f1}
until (sim=#13); {до клавіші Enter}
end;
close (f1); {закрити файл f1}
reset (f1); {відкрити файл для читання}
while not eof (f1) do begin
while not eoln(f1) do begin
read (f1, symb);
write (symb);
end;
readln(f1);
writeln;
end;
End.
1.4. Основні процедури та функції для роботи з текстовими файлами.
Процедури:
Assign(F,<ім’я файлу>) – зв’язує логічний файл F з фізичним файлом, повне імя якого задано в рядку ,<ім’я файлу>.
Reset (F) – відкриває логічний файл F для читання даних
Rewrite(F) – відкриває логічний файл F для запису даних.
Close(F) – закриває відкритий до цього логічний файл F. Виклик процедури Close необхідний при завершені роботи з файлом. Якщо по будь-якій причині процедура Close не буде виконана, файл все ж буде створений на зовнішньому пристрої, але вміст останнього буфера в нього не буде перенесено. Для вхідних файлів використання оператора закриття файлу не є обов’язковим.
Rename(F, <нове ім’я файлу>) – дозволяє перейменувати фізичний файл на диску, зв’язаний з логічним файлом F. Перейменування можливе після закриття файлу.
Erase(F) – знищує фізичний файл на диску, який був зв’язаний з файловою змінною F, файл до моменту виклику процедури Erase повинен бути закритий.
Append(F) – відкриває файл для додавання в кінець файлу інформації. Відкривається існуючий файл, з яким зв’язана файлова змінна F, і вказівник поточної компоненти файлу встановлюється на кінець файлу.
Read (F,<список вводу>) – читання інформації з файлу F. З файлу, з яким зв’язана файлова змінна F, читаються значення для однієї або декількох змінних списку вводу.
Readln (F,<список вводу>) – читання рядку з файлу F. Те ж, що і процедура Read, але не прочитана частина рядка, включаючи ознаку кінця рядка, пропускається.
Write (F,<список виводу>) – запис інформації у файл F. У файл з яким з яким зв’язана файлова змінна F, записуються значення виразів списку виводу.
Writeln (F,<список виводу>) – запис рядка у файл F. Те ж що і процедура Write, але інформація що виводиться завершується ознакою кінця рядка.
Функції:
Eof(F) – логічна функція, яка повертає значення true коли при читанні досягнутий кінець файлу. Це означає, що вже прочитаний останній елемент у файлі або файл після відкриття виявився пустим.
Eoln(F) – логічна функція, яка повертає значення true коли при читанні досягнутий кінець рядка файлу;
1.5. Символьні змінні.
Символьний тип Char (від character - символ) – це тип змінних (даних), які складаються лише з одного символу (знаку, букви, цифри). Як і всі змінні, символьні змінні оголошуються в розділі Var:
…
Var
Ch_1, Ch_2: Char;
…
В тілі програми їм можна присвоювати значення відповідного типу:
…
Ch_1:=’A’;
Ch_2:=’?’;
Ch_3:=’7’;
…
Кожному символу в комп’ютері відповідає одне ціле число з діапазону 0..255. це число, виражене в двійковій формі, є кодом машинного представлення символу. Всі символи зведені в таблицю кодів. Для кодування використовується стандартний американський код для обміну інформації – ASCII (American Standart Code for Information Interchange). Перша половина згаданої таблиці символів з кодами 0..127 відповідає стандарту ASCII. Друга половина символів таблиці – це національні алфавіти.
Визначити номер будь-якого символу (або літери) в його десятковій формі можна за допомогою стандартної функції Ord:
Ord(‘A’) = 65; Ord(‘a’) = 97;
Функція Chr перетворює десятковий код символу в сам символ:
Chr(65) = ‘A’; Chr(97) = ‘a’;
Цю функцію можна замінити символом «#» (знак дієза):
#65 = ‘A’;
#97 = ‘a’;
Тип змінних Char відносяться до порядкового типу. Дані порядкового типу мають кінцеве число можливих значень, ці значення певним чином впорядковані і кожен з них має свій порядковий номер. Для змінних цього типу застосовуються функції Pred і Succ:
Pred(‘b’)=’a’; Pred(‘3’)=’2’; Pred(3)=2;
Succ(‘a’)=’b’;` Succ(‘3’)=’4’; Succ(3)=4.
Змінні цього типу можуть використовуватись також, наприклад, в циклі for:
For Ch_1:=’a’ to ‘z’ do
Writeln(‘Код літери’, Ch_1,’рівний’, Ord(Ch_1));
Дуже часто в задачах по обробці символів дуже ефективно застосовувати так звані множинні константи. Не будемо детально пояснювати їх властивості і спосіб задання, відмітимо лише що множини – це набір однотипних елементів порядкового типу, номер якого у відповідному типі не виходить за границі діапазону 0..255. Будь яка множинна змінна зберігає не самі значення її елементів, а всього лиш інформацію про те, чи є конкретний елемент в заданій множині чи його там нема. Як і у всіх змінних, в множинних є свої константи, вони визначаються шляхом перелічення в квадратних дужках через кому або з використанням інтервалу всіх елементів множини.
В програмі можна, наприклад, так перевірити належність вибраного еклементу даній множині:
…
if ‘Ch’ in [‘a’..’p’,’r’,’s’,’u’,’w’]
then
…
if x in [9,4..6]
then
…
тут «in» - службове слово-оператор.
1.6. Рядкові змінні.
Рядкові змінні – це одномірні упаковані масиви символів, для опису яких в Turbo Pascal введений тип String. Довжина рядка не може містити більше ніж 255 символів.
Наприклад, якщо рядок містить до 30 символів, його тип буде визначений як:
type s= String[30];
Рядок змінної довжини буде описуватись так:
type s= String;
Особливістю рядкових змінних є те, що до них можна звертатися як до скалярних змінних, так і як до масивів. У другому випадку застосовується конструкція “змінна з індексом”, що забезпечує доступ до окремих символів рядка, при цьому нижня границя індексу рівна 1. Окремі символи рядка сумісні з типом Char.
В пам’яті ЕОМ рядок займає на кількість байтів, на 1 більше її довжини. Нульовий байт рядка містить її довжину. Для рядків визначені операції присвоєння, злиття і порівняння. Для порівняння рядків застосовуються всі операції відношення. Порівняння рядків відбувається посимвольно, починаючи з першого символу. Рядки рівні, якщо мають одинакову довжину і посимвольно еквівалентні.
Рядки можуть бути елементами списку вводу-виводу, при цьому записується ім’я рядка без індексу. При вводі рядкових змінних кількість вводимих символів може бути менше. Ніж довжина рядка. В цьому випадку символи які вводяться розміщуються з початку рядка, а решту байтів заповнюються пробіли. Якщо кількість символів які вводяться перевершує довжину рядка, зайві символи відкидаються.
Наведемо приклади оголошення типу string:
…
Var
Str_1: String; {Рядок з максимальною довжиною в 255 літер}
Str_2: String[3]; {Змінна, в якій може містити до трьох символів}
Text_Isx: Array of Str_1; {Вихідний текст – масив рядків, кожен з яких
може містити до 255 символів}
…
Після оператора присвоєння
Str_1:=’Весна!’
довжина рядка Str_1 автоматично зменшиться з 255 до 6 символів – фактичної довжини рядка. Але після цього рядку Str_1 можна присвоїти рядок з любою довжиною до 255 символів:
Str_1:=’Прийшла весна!’
В результаті присвоєння
Str_2:=’Весна!’
в змінній Str_2 будуть знаходитись лише перші три символи слова Весна!.
Доступ до окремих символів змінних типу string здійснюється так як і в масивах:
Str_2[2]:=’у’; Str_2[3]:=’з’;
Writeln(Str_2);
до останнього в змінній Str_2 знаходилось слово «Вес», тому після заміни другої і третьої літери на «у» і «з» відповідно на екран дисплею виведеться слово «Вуз».
Злиття рядків здійснює оператор кон’юнкції «+» або функція Concate:
Str_1+Str_2+…+Str_n=Concate(Str_1,Str-2,…,Str_n);
Стандартні процедури та функції для обробки рядків:
Length(<рядкова змінна>) – функція, яка визначає довжину рядка.
Pos(Str_1,Str_2) – функція, яка визначає номер першого символу рядка Str_1 при його першому появлені в рядку Str_2. Якщо Str_1 відсутній в Str_2, то функція повертає нуль.
Copy(Str_x,p,n) – функція, яка копіює n символів рядка Str_x, починаючи з позиції p.
Delete(Str_x,p,n) – процедура, яка видаляє n символів рядка Str_x починаючи з позиції p.
Insert(Str_1,Str_2,p) – процедура, яка вставляє рядок Str_1 в рядок Str_2, починаючи з позиції p.
Str(x[:<ширина>[:<дріб>]],Str_x) – процедура, яка перетворює число x в рядок, де <ширина> - ширина поля для всього числа, <дріб> - число знаків після десяткової коми.
Val(Str_x,x,<помилка>) – процедура, яка здійснює перевід рядка Str_x в цілі або дійсні числа x, де <помилка> - змінна, в яку буде записано 0, якщо перетворення неможливо, і номер першого символу, який не може бути символом числа, в протилежному випадку.
Кодова таблиця ASCII
2. ЗАВДАННЯ
2.1. Домашня підготовка до роботи
1. Ознайомитися з основними типами файлів і їх описом.
2. Вивчити основні процедури і функції для роботи з текстовими файлами.
3. Ознайомитись зі символьними і рядковими змінними.
4. Вивчити основні процедури та функції для роботи із символьними і рядковими змінними.
5. Дано текстовий файл, в якому міститься програма мовою Турбо Паскаль (Лабораторна робота №3). Скласти блок-схеми алгоритмів та програми мовою Турбо-Паскаль для обробки текстового файлу з використанням розроблених процедур та функцій для роботи зі стрічками. Оформити виконання одного із завдань у вигляді підпрограми. Словами є слова в коментарях, назви ідентифікаторів, зарезервовані слова, які розділяються між собою згідно із синтаксисом мови Турбо Паскаль. Дані для роботи беруться з табл.1 за вказівкою викладача.
Таблиця 1
№ п/п
Завдання
1
Сформувати і вивести на екран текстовий файл, в якому вилучити символи “(” і “)”. Знайти кількість приголосних літер у кожному рядку.
2
Сформувати і вивести на екран текстовий файл, в якому всі символи “;” замінюються символом “!”. Обчислити суму цифр які зустрічаються в тексті.
3
Сформувати і вивести на екран текстовий файл, в якому містяться слова які починаються на голосні літери. Підрахувати кількість слів, в яких кількість символів більша трьох.
4
Сформувати і вивести на екран текстовий файл, в якому всі складені оператори “Begin” і “End” замінюються на “{” і “}” відповідно. Підрахувати кількість операторів циклу for і умовних операторів if.
5
Сформувати і вивести на екран текстовий файл, в якому після кожного рядка буде виведена цифра яка міститиме значення кількості літер в рядку. Замінити всі символи “(” і “)” на “[” і “]” відповідно.
6
Сформувати і вивести на екран текстовий файл, в якому символ “:=” замінити на символ “=”. Вивести список всіх зарезервованих слів використаних в програмі (без повторень).
7
Сформувати і вивести на екран текстовий файл, в якому пробіли замінюються символом підкреслення. Підрахувати кількість арифметичних операцій (+,-,*,/) у файлі.
8
Сформувати і вивести на екран текстовий файл, в якому символи “[” і “]” замінити на “(*” і “*)”. Вивести на екран номера рядків, в яких зустрічаються оператори циклів і умовний оператор.
9
Сформувати і вивести на екран текстовий файл, в якому залишити лише в одній кількості зарезервовані слова, решту замінити на символ “***”. Вивести на екран номери рядків, в яких зустрічаються цифри.
10
Сформувати і вивести на екран текстовий файл, в якому усі символи замінити на їх числове представлення в таблиці ASCII. Знайти суму усіх символів в кожному рядку.
11
Сформувати і вивести на екран текстовий файл зі стрічок, в яких вилучаються слова “for” та “then”. Вивести на екран номера рядків, в яких зустрічаються слова “PROCEDURE” та “FUNCTION”.
12
Сформувати і вивести на екран текстовий файл в якому не зустрічаються слова “for”, “then”, “іf”, “else”. Підрахувати кількість рядків, в яких кількість приголосних літер парна.
13
Сформувати і вивести на екран текстовий файл в якому усі голосні літери замінити на символ “*”. Вивести на екран кількість літер в кожному рядку файлу.
14
Сформувати і вивести на екран текстовий файл що містить лише послідовності символів, які містяться всередині операторних дужок “BEGIN” – “END”. Перевести в цих рядках символи в їх числове представлення і підрахувати їх суму.
15
Сформувати і вивести на екран текстовий файл в якому вилучити слова “do”, “to”, “for”. Вивести на екран рядки в яких містяться цифри і в кінці рядка дописати їх суму.
16
Сформувати і вивести на екран текстовий файл в якому всі приголосні літери замінити символом “@”. Вивести на екран рядки з парною кількістю символів.
17
Сформувати і вивести на екран текстовий файл в якому символи “+” замінюються словом “SUMA”, символи “-” замінюються символом “MULT”, символи “/” – замінюються символом “DIV”. Підрахувати і вивести на екран кількість символів “:=” у кожному рядку.
18
Сформувати і вивести на екран текстовий файл, в якому є лише слова які починаються на голосні літери. Вивести на кран всі числа які зустрічаються у файлі.
19
Сформувати і вивести на екран текстовий файл в якому голосні літери замінити на символ “1” а приголосні на симврол “0”. Підрахувати і вивести на екран кількість символів, які не являються символом “1” і “0”.
20
Сформувати і вивести на екран текстовий файл в якому видалити операторні дужки “BEGIN” і “END”. Підрахувати і вивести на екран кількість голосних і кількість приголосних літер в рядку.
21
Сформувати і вивести на екран текстовий файл в якому кожне число домножене на 10. Вивести на екран рядки з непарною кількістю літер.
22
Сформувати і вивести на екран текстовий файл в якому символи “;” замінені на “END_LINE”. Підрахувати кількість великих і малих літер у кожному рядку.
23
Сформувати і вивести на екран текстовий файл в якому усі літери які зустрічаються замінити послідовно на літери в алфавітному порядку. Вивести на екран непарні рядки файлу.
24
Сформувати і вивести на екран текстовий файл в якому симсвол “:=” замінити на “= =”. Підрахувати кількість непарних чисел у кожному рядку.
25
Сформувати і вивести на екран текстовий файл в якому замінити всі символи на їх числове значення в таблиці ASCII. Знайти і вивести на екран суму всіх чисел в кожному рядку.
26
Сформувати і вивести на екран текстовий файл в якому усі символи “+”, “-“, “*”, “/” замінити на числа в порядку зростання їх значень. Підрахувати і вивести на екран кількість літер в кожному рядку.
27
Сформувати і вивести на екран текстовий файл в якому видалити всі голосні літери. Підрахувати і вивести на екран кількість арифметичних операцій (+, -, *, /) у кожному рядку.
28
Сформувати і вивести на екран текстовий файл в якому присутні лиш стрічки з ключовими словами “FOR” і “THEN”. Підрахувати і вивести на екран кількість голосних літер в кожному рядку.
29
Сформувати і вивести на екран текстовий файл в якому усі малі літери замінити на великі. Підрахувати і вивести на екран кількість символів, які не є літерами у кожному рядку.
30
Сформувати і вивести на екран текстовий файл у якому вилучені рядки з парною кількістю символів. Вивести на екран суму усіх чисел у файлі.
31
Сформувати і вивести на екран текстовий файл в якому пробіл замінити символом “_”. Вивести на екран рядки з непарною кількістю символів.
32
Сформувати і вивести на екран текстовий файл в якому вилучені ключові слова “IF”, “THEN”, “FOR”. Вивести в кінці кожного рядка кількість голосних літер.
33
Сформувати і вивести на екран текстовий файл в якому видалити всі рядки, в яких непарна кількість символів. Вивести на екран суму голосних і суму приголосних літер в кожному рядку.
34
Сформувати і вивести на екран текстовий файл в якому видалити слово “FUNCTION” і “PROCEDURE”. Вивести на екран лише голосні літери в кожному рядку.
35
Сформувати і вивести на екран текстовий файл в якому заміть символів вивести їхнє числове представлення в таблиці ASCII. Вивести на екран кількість голосних і приголосних літер в кожному рядку.
2.2. Робота в лабораторії
1. Ввести в комп'ютер програми, написані мовою Турбо-Паскаль згідно з отриманим завданням.
2. Відлагодити програми. При необхідності скоригувати блок-схеми алгоритмів та програми у відповідності з виявленими логічними та синтаксичними помилками.
3. Остаточні версії блок-схем, програм та отримані результати занести у звіт з лабораторної роботи.
4. Здати звіт з лабораторної роботи.
3. ЗМІСТ ЗВІТУ
1. Номер і назва лабораторної роботи.
2. Повний текст завдання.
3. Остаточні версії блок-схем алгоритмів.
4. Список ідентифікаторів констант, змінних, процедур і функцій, використаних у блок-схемах алгоритмів і програм, та їх пояснення.
5. Остаточні версії програм.
6. Результати роботи програм.
4. КОНТРОЛЬНІ ЗАПИТАННЯ
СПИСОК ЛІТЕРАТУРИ
Фаронов В.В. Программироаание на персональних ЗВМ а среде Тур-бо-Паскаль.- 2-е изд. - М.: Изд-во МГТУ, 1992.
Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка.- М.: Финансы и статистика, 1982.
3. Сердюченко В.Я. Розробка алгоритмів та програмування на мові Turbo Pascal: Навчальний посібник для техн. вузів - X.: ВКП "Парітет" ЛТД, 1995.
Навчальне видання
Робота з текстовими файлами. Символьні та рядкові змінні: інструкція до лабораторної роботи №4 з курсу “Алгоритмічні мови і програмування” для студентів спеціальності 6.0914 “Комп'ютеризовані системи, автоматика і управління” та 6.1601 “Інформаційна безпека”
Укладачі: ______________________________,
Б.Д. Будз, асистент,
О.І. Гарасимчук, асистент.