Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
програмування.doc
Скачиваний:
13
Добавлен:
04.05.2019
Размер:
374.27 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

КРЕМЕНЧУЦЬКИЙ ДЕРЖАВНИЙ ПОЛІТЕХНІЧНИЙ УНІВЕРСИТЕТ

Програмування мовою pascal

МЕТОДИЧНІ ВКАЗІВКИ ДО ПРАКТИЧНИХ ЗАНЯТЬ,

ВИКОНАННЯ ЛАБОРАТОРНИХ РОБІТ

ТА САМОСТІЙНОЇ РОБОТИ

З ДИСЦИПЛІН

"ПРОГРАМУВАННЯ" ТА "АЛГОРИТМІЧНІ МОВИ ТА ПРОГРАМУВАННЯ"

ДЛЯ СТУДЕНТІВ ЗІ СПЕЦІАЛЬНОСТЕЙ:

7.091501-"Комп’ютерні системи та мережі",

7.091401-"Системи керування"

ДЕННОЇ ФОРМИ НАВЧАННЯ

(частина 2)

КРЕМЕНЧУК 2001

ПРОГРАМУВАННЯ МОВОЮ PASCAL методичні вказівки до практичних занять, виконання лабораторних робіт та самостійної роботи з дисциплін "Програмування" та "Алгоритмічні мови та програмування" для студентів зі спеціальностей 7.091501 "Комп’ютерні системи та мережі", 7.091401 "Системи керування" денної форми навчання

Укладач ст.викл. Ю. В. Лашко

Кафедра комп’ютерних та інформаційних систем

Затверджено методичною радою університету.

Протокол____від “____” __________2001р.

Голова методичної ради проф. В.В.Костін

Кременчук 2001

Лабораторна робота 1

Тема: Обробка символьної інформації.

Формування і використання текстових файлів

Теоретичні відомості щодо виконання лабораторної роботи

Тип даних String. Із символів складаються слова, з яких, у свою чергу, складаються речення (рядки) і так далі. Для опису символьної інформації у мові Pascal існує тип Char. Для опису даних рядкового типу в мові Pascal передбачено службове слово String, за яким у квадратних дужках вказується довжина рядка. Максимальна довжина рядка дорівнює 255 символів. Тобто біжуче значення довжини рядка може бути будь-яким - у межах від 0 до 255 символам. Якщо не зазначити довжину рядка, то за замовчанням довжина рядка стає максимальною.

Дані рядкового типу можуть бути описані у розділах Const, Type та Var.

П р и к л а д

Const

adress = 'Першотравнева, 20';

Type

Str_Type = String[20];

Var

s1 : Str_Type;

s2, s3: String[10];

s4 : String;

Слід зазначити, що в разі, коли поле (довжина рядка) менше від самого рядка, рядок укорочується праворуч таким чином, щоб він умістився в полі.

До символів, які складають рядок, можливий доступ як до елементів масиву.

Над рядками визначено всі операції відношення. Порівняння рядків виконується попарно для відповідних символів двох рядків - зліва направо. Наприклад, 'pascal' > 'Pascal' обумовлює результат True, а результат 'PASCAL' > 'pascal' - False, оскільки порядкові номери малих букв більші від великих. У рядках різної довжини кожний символ із довшого рядка, що не має відповідного символу в короткому, виробляє значення 'більше'.

Процедури та функцiї обробки рядків.

Функція Length(s:String):Integer - як аргумент дістає рядок s і повертає його довжину.

Слід зазначити, що перший символ рядкової змінної (індекс 0) містить динамічну довжину рядка. Таким чином, якщо s - змінна рядкового типу, то значення Length(s) завжди дорівнює Ord(s[0]).

Функція ConCat(s1, s2, …, sn):String - як аргументи дістає кілька рядків s1, s2, …, sn послідовно з’єднує їх і повертає результат. Альтернативою цій функції є операція '+'.

Функція Copy(s:String; Index:Integer; Count:Integer):String - дістає як аргументи рядок s, номер позиції Index і довжину підрядка Count. У результаті з рядка, починаючи з позиції Index, вилучається підрядок довжиною Count.

Функція Pos(SubStr:String; s:String):Byte - дістає як аргументи рядки SubStr і s та повертає позицію, з якої підрядок SubStr перший раз зустрічається в рядку s.

Процедура Delete(Var s:String; Index:Integer; Count:Integer) - видаляє з рядка s підрядок, починаючи з позиції Index довжиною Count символів.

Процедура Insert(Var Source:String; Var s:String; Index:Integer) - вставляє рядок Source у рядок s, починаючи з позиції Index.

Для перетворення чисел у рядки й навпаки призначені процедури Str і Val.

Процедура Str(x [:Width [:Decimals]]; Var s:String) - перетворює число х у рядок s. Параметри Width і Decimals виконують таку саму роль, що і в операторі Write. Квадратні дужки позначають необов’язковість того, що в них укладено.

Процедура Val(s:String; Var v; Code:Integer) - перетворює рядок s у значення числової змінної v. Рядок s повинен бути коректним записом числа. Якщо це так, змінна Code = 0 - перетворення виконано успішно. Якщо це не так змінна Code 0 - перетворення не виконано, а змінна Code має значення тієї позиції, в якій перетворення неможливе.

П р и к л а д

Program DemoWorkString;

{Програма демонструє використання процедур

та функцій при обробки символьної інформації }

Var

S,S1,S2,S3,S4,S5:String;

V:Real;

Begin

S1:='Мова ';S2:='Система';S3:='програмування ';

S4:='Turbo Pascal';

V:=7.0;

S5:=Copy(S4,Length(S4)-5,7);

WriteLn(S5); {'Pascal'}

Delete(S4,Length(S4)-5,7); {'Turbo '}

WriteLn(S4);

S:=ConCat(S1,S3,S5);

WriteLn(S); {'Мова програмування Pascal'}

S:=Copy(S,6,Length(S));

WriteLn(S); {'програмування Pascal'}

S:=S2+' '+S;

WriteLn(S); {'Система програмування Pascal'}

Insert(S4,S,Pos('P',S));

WriteLn(S); {'Система програмування Turbo Pascal'}

Str(V:4:1,S1);

S:=S+S1;

WriteLn(S); {'Система програмування Turbo Pascal 7.0'}

ReadLn;

End.

Загальні відомості застосування файлів. У мові Pascal підтримується три файлових типи:

  • текстові файли (тип Text);

  • типізовані файли (тип File of);

  • нетипізовані файли (File).

У програмі кожному зовнішньому файлу (файл на диску ніяк не описується, він має тільки ім’я) ставиться у відповідність (обов’язково описується у програмі) або явно в розділі змінних, або (ще краще) в розділі типів файлова змінна, певного типу:

або

Type <ім’я файлового типу> : <тип файлу>;

Var <ім’я файлової змінної> : < ім’я файлового типу >;

або

Var <ім’я файлової змінної> : <тип файлу>;

Наприклад,

Type

f_Txt: Text;

f_FileOf: File of Real;

f_File: File;

Var

f1 : f_Txt;

f2 : FileOf;

f3 : f_File;

f_int : File of Integer;

f_sym : Text;

Процедури загального використання для роботи з файлами будь-якого типу.

Assign(f, Name) - ставить у відповідність файловій змінній f зовнішній файл з іменем Name.

Reset(f) - відкриває вже існуючий файл f для читання та позиціонує покажчик файла на його початок.

Rewrite(f) - створює та відкриває новий файл f, покажчик файла встановлюється на його початок. Якщо цю процедуру застосувати до вже існуючого файлу, то вміст цього файлу зникне.

Close(f) - закриває файл (тобто операція "закрити" є логічним завершенням роботи з відкритим файлом, іншими словами - застосування процедури Close дозволяє усунути зв’язок файлової змінної із зовнішнім файлом, який встановлено процедурою Assign).

Erase(f) - знищує файл f, який перед тим треба закрити.

Rename(f, s) - перейменовує файл f в файл s, який перед тим треба закрити.

Текстові файли (тип Text). Текстовi файли - це файли, що являють собою послідовність символів, які розбиті на рядки. Кожний рядок закінчується маркером кінця рядка. Текстовi файли належать до файлів з послідовним доступом (більш подрібни відомості роботи з файлами наведені в наступній лабораторній роботі).

Для роботи з текстовим файлом необхідно, перш за все, описати відповідну файлову змінну або у розділі Type, або у розділі Var, наприклад:

Var <ім’я файлової змінної> : Text;.

Робота з текстовим файлом проводиться за схемою:

  • у відповідність файловій змінній ставиться ім’я зовнішнього файлу (процедура Assign);

  • відкривається новий текстовий файл (процедура Rewrite) або вже існуючий (процедура Reset). У кожний момент роботи з текстовим файлом допускається будь-який один тип операції: читання або запис;

  • обробка текстового файлу;

  • закриття файлу (процедура Close).

Для зчитування інформації з файлу (який відкритий процедурою Reset) використовуються процедури Read(f, <список вводу>) і ReadLn(f, <список вводу>). Тобто, якщо перед списком вводу стоїть файлова змінна, то дані вводяться не з клавіатури, а зчитуються з файлу. Різниця між Read і ReadLn в тому, що Read читає дані з файлу без переходу на наступний рядок, а процедура ReadLn забезпечує такий перехід.

П р и к л а д.

Var f : Text;

a, b, c : Integer;

…………………

Read(a, b, c); {ввід з клавіатури}

Read(f, a, b, c); {ввід (зчитування) з файлу}

Після відкриття покажчик файлу вказує на перший символ файлу. Зчитування чергової порції даних завжди виконується, починаючи з символу, на який вказує покажчик. Після зчитування покажчик файлу автоматично пересувається вперед на довжину прочитаної ділянки.

Запис у текстовий файл (який відкритий процедурою Rewrite) виконується процедурами Write(f, <список виводу>) і WriteLn(f, <список виводу>), в яких перед списком виводу стоїть файлова змінна. Процедура і WriteLn записує інформацію до поточного рядка з переходом у наступний.

П р и к л а д. Обчислити вираз на інтервалі з кроком при . Результати обчислень записати у текстовий файл "file.dat".

Program Example_1;

Const

a=0.5; b=1.2; {параметри, що входять у склад виразу}

tn=0; tk=2; h=0.2; {[tn, tk] - межі зміни аргументу виразу}

{h - крок, з яким змінюється аргумент}

NameFie='file.dat';

Var

f : Text;

t, y : Real; {значення аргументу та виразу}

Function Func(x:Real):Real;

Begin

Func:=a*Exp(Sin(b*x))

End;

Begin

Assign(f, NameFile); {якщо NameFile=' ' (-пусто) - вивід

на екран }

Rewrite(f);

t:=tn;

Repeat

WriteLn(f, t:3:1,' ':2, Func(t):8:4);

t:=t+h;

Until t>tk+h;

Close(f);

End.

Дані, які зберігаються у текстовому файлі "file.dat" (у вигляді двох стовпців) доступні для обробки не тільки Pascal-програмами, а й іншими пакетами.

При роботі з текстовими файлами дозволено використовувати процедуру Append(f), яка відкриває вже існуючий текстовий файл і позиціонує покажчик на кінець файлу. Після такого відкриття текстового файлу його можна тільки доповнювати інформацією, починаючи з кінця файлу.

Спеціальні функцій обробки інформації текстових файлів:

Eoln(f) - повертає значення True, якщо покажчик файлу вказує на кінець рядка (код #13#10), інакше - значення - False.

Eof(f) - повертає значення True, якщо покажчик файлу вказує на кінець файлу (код #26), інакше - значення - False.

IOResult(f) - перевіряє результат виконання останньої операції введення/виведення на наявність помилок. Функція повертає ціле значення, що є станом останньої виконаної операції введення/виведення.

Слід зазначити, що функцію IOResult, можна використовувати для перевірки існування файлу на диску. Тобто, при зчитуванні інформації з файлу (будь-якого, не тільки текстового) було б правильно переконатися (безпосередньо у програмі), що файл дійсно існує на диску і нормально відкритий. Для цього перед відкриттям файлу необхідно виключити директиву компілятора {$І+}, тобто необхідно вказати {$І-}. У цьому випадку функція IOResult, набуває значення 0 при успішному відкритті файлу і відмінне від нуля значення - код помилки, якщо файлу на диску немає або до нього немає доступу (вказано невірний шлях до нього).

П р и к л а д. Зчитування інформації з текстового файлу "file.dat" створеного програмою Example_1 і ввід її на екран дисплея.

Program Example_2;

Var f : Text;

t, y : Real;

Assign(f,'file.dat');

{$I-} {виключити обробник помилок}

Reset(f);

{$I+} {включити обробник помилок}

If IOResult=0 Then

Begin

WriteLn('Файл існує і нормально відкритий');

While Not Eof(f) do

Begin

ReadLn(f, t, y);

WriteLn(t:3:1,' ':2,y:8:4);

End;

Close(f);

End

Else WriteLn('Проблеми! Такого файлу на диску не знайдено');

End.

П р и к л а д. Даний текст. Визначити кількість слів тексту за умови, що одне слово від іншого можу бути відокремлене пробілом, комою чи крапкою. Всі роздільники слів замінити символом підкреслення. У новий файл вивести по 5 слів у рядку.

Program Example_3;

Var {кількість:}

iSymbol, {символів у слові}

iWord, {слів у тексті}

n:Integer; {слів у рядку}

s:Char; {введений символ}

str:String; {рядок, який формується}

f1,f2:Text; {файли: початковий, робочий, протоколу}

Begin

Assign(f1,'file.txt');Reset(f1);

Assign(f2,'file_r.txt');Rewrite(f2);

WriteLn(f2,'П О Ч А Т К О В Ы Й Ф А Й Л':30);

While Not Eof(f1) do {копіювання файлу f1 у файл f2}

Begin ReadLn(f1,str);WriteLn(f2,str); End;

iSymbol:=0;iWord:=0;n:=0;str:='';

WriteLn(f2,' О Б Р О Б Л Е Н И Й Ф А Й Л':30);

Reset(f1); {перевідкриття файлу f1}

While Not Eof(f1) do

Begin {читання з файлу f1}

Read(f1,s);

If (s=' ') And (iSymbol=0) Then Continue; {пропуск пробілів}

If EoLn(f1) Or (s In [' ', ',' , '.'])

Then

Begin {виявлено кінець рядка або слова}

If EoLn(f1) Then

Begin { виявлено кінець рядка }

str:=str+s; {приєднання останнього символу}

ReadLn(f1); {перехід на наступний рядок}

WriteLn(f2);

End;

str:=str+'_';Write(f2,str); {запис чергового слова}

n:=n+1; iSymbol:=0;str:='';iWord:=iWord+1;

If n=5 Then Begin n:=0; WriteLn(f2) End;

End

Else Begin str:=str+s;iSymbol:=iSymbol+1 End

End;{While}

WriteLn(f2,#10#13,'Кількість зчитаних слів = ',iWord,#10#13,);

Close(f1);Close(f2);Reset(f2);

While Not Eof(f2) do

Begin ReadLn(f2,str);WriteLn(str); End;

Close(f2);

End.

Контрольні питання

  1. Яка різниця між рядковою змінною та масивом символів?

  2. Як описуються рядкові змінні у програмі?

  3. Яка максимально допустима довжина рядка в мові Pascal?

  4. Які процедури та функції обробки рядків містить мова Pascal?

  5. Засоби виводу змінних рядкового типу.

  6. Які файли називаються текстовими? Принципи роботи з текстовими файлами.

  7. Що являє собою файлова змінна?

  8. Процедури та функції обробки текстових файлів. Особливості їх застосування.

  9. Як у програмі організувати перевірку результату відкриття існуючого файлу?

Завдання та пояснення щодо виконання до лабораторної роботи

Розробити функціональну схему, опис алгоритму і програму для символьної інформації відповідно до варіанту завдання.

В кожному завданні початковим є файл з текстом, що складається з декількох речень. Слова в реченні розділяються пробілами і розділовими знаками (наприклад, крапкою, комою, ?, !). Тексти початкових даних формуються самостійно, але так, щоб було можливо оцінити працездатність програми.

За кожнім варіантом завдання необхідно:

  • створити початковий текстовий файл (будь-яким чином) ;

  • згідно з варіантом завдання виконати обробку початкового файлу і зберегти отримані результати у новому текстовому файлі;

  • вивести дані з нового файлу з протоколом тестування (заголовки кожного етапу обробки даних, початкові та результуючі дані ).

Варіанти завдань

Варіанти обробки символьної інформації (текстів) дано у вигляді трьох груп (I, II, III) у порядку зростання їх складності.

Варіанти завдань групи I

  1. Визначити і вивести: а) кількість речень і слів кожного речення; б) текст кожного речення в окремому рядку.

  2. Дана літера. Визначити кількість слів у тексті, які починаються з цієї літери. Вивести ці слова і їх кількість.

  3. Даний підрядок з двох (трьох) символів. Підрахувати, скільки разів зустрічається у тексті цей підрядок. Вивести ці слова.

  4. Даний символ. Знайти і видалити його з усіх слів тексту. Текст, що залишився, "стиснути".

  5. Даний підрядок з двох (трьох) символів. Знайти у тексті заданий підрядок і видалити його з усіх слів тексту. Текст, що залишився, "стиснути". Визначити кількість видалених підрядків.

  6. Визначити кількість слів тексту, які починаються і закінчуються на одну й ту саму букву. Вивести ці слова та їх кількість.

  7. Дано 2 літери. Знайти у тексті перший заданий символ і замінити його другим заданим символом. Визначити кількість замін.

  8. Дано 2 підрядки, кожний з двох (трьох символів). Знайти у тексті слова, що мають підрядок, який співпадає з першим підрядком, і замінити його другим заданим підрядком.

  9. Дано 2 слова. Визначити, чи є вони у тексті й скільки разів кожне з них зустрічається у тексті. Якщо їх у тексті немає, дати відповідне повідомлення.

  10. Виділити з початкового тексту частини тексту, які укладені у круглі дужки, включаючи й їх; вкладених дужок немає. Визначити кількість таких частин тексту і в кожному з них кількість російських букв, кількість латинських букв і цифр.

  11. Сформувати "перевертиш" від кожного слова тексту із допомогою підпрограми.

Варіанти завдань групи II

  1. Визначити, скільки слів тексту мають довжину 1, 2, 3, …, 10 і більше 10 символів. Вивести ці слова у порядку зростання їх довжини.

  2. Дано символ. Визначити і вивести слова, у яких зустрічається цей символ, і номер позиції, в якій він розміщений у слові перший раз.

  3. Дано підрядок з двох (трьох) символів. Визначити і вивести слова, в яких зустрічається цей підрядок, і номери позицій слів тексту, починаючи з яких розміщується цей підрядок.

  4. Дано n і k - номера рядка і позиції у рядку. Дано рядок для вставки його у текст. Вставити заданий рядок у текст після k-го символу n-го рядка початкового тексту. Текст, який залишився, вивести з нового рядка.

  5. Виділити з тексту цілі числа й визначити їх кількість.

  6. Дана таблиця кодування символів. Зашифрувати посимвольно заданий текст. Вивести зашифрований текст. Ввести, розшифрувати зашифрований текст й вивести його.

  7. Визначити складність кожного речення й всього тексту. Складність речення оцінити за кількістю його слів і кількістю розділових знаків. Кожне речення вивести з нового рядка; після нього надрукувати (на екрані) характеристики його складності. Складність усього тексту визначити за кількістю його слів і за кількістю його речень.

  8. Дано 2 тексти (у двох різних файлах). Знайти у другому тексті всі "перевертиши" слів першого тексту.

  9. Дано список прізвищ з ініціалами. Визначити, чи є у списку однакові прізвища (ініціали не враховувати). Вивести список однакових прізвищ, кількість однофамільців з кожного прізвища і загальну кількість однофамільців.

Варіанти завдань групи III

  1. Визначити у тексті кількість попадань кожної голосної і кожної приголосної букви. Впорядкувати голосні й приголосні у порядку зменшення частоти (кількості) використання їх у тексті.

  2. Визначити, які символи і скільки разів зустрічаються у тексті. Впорядкувати їх у порядку зменшення частоти (кількості) використання їх у тексті.

  3. Визначити і вивести символи, з яких починаються слова у тексті в порядку частоти (кількості) вжитку їх у тексті.

  4. Визначити різні слова у тексту і кількість разів зустрічей кожного слова. Впорядкувати ці слова у порядку зменшення частоти (кількості) використання їх у тексті.

  5. Визначити різні слова тексту та їх кількість. Сформувати таблицю кодування слів випадковими цілими числами. Зашифрувати заданий текс за словами і вивести його у файл. Ввести, розшифрувати зашифрований текст й вивести його.

  6. Знайти у тексті слова, довжина яких більше 5 символів і які зустрічаються у тексті більше трьох разів, замінити їх кодом (спеціальним символом). У кожного слова повинен бути свій код. За рахунок заміни стиснути текст.