
Практичні роботи з Інформатики
ПРАКТИЧНА РОБОТА №1 Структура програми. Стандарні типи даних. Стандартні та означувальні типи. Вирази. 3
ОСНОВНІ ПОНЯТТЯ АЛГОРИТМІЧНОЇ МОВИ 3
ОСНОВНІ СИМВОЛИ 3
EЛЕМЕНТАРНІ КОНСТРУКЦІЇ 4
КОНЦЕПЦІЯ ТИПУ ДЛЯ ДАНИХ 5
СТАНДАРТНІ ТИПИ ДАНИХ 6
КОНСТАНТИ. ЗМІННІ. ІНЦІЛАЛІЗАЦІЯ ЗМІННИХ 7
ВИРАЗИ. ОПЕРАТОР ПРИСВОЮВАННЯ 8
ОПЕРАТОРИ ВВОДУ І ВИВОДУ 8
СТРУКТУРА ПРОГРАМИ 10
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ 11
ПРАКТИЧНА РОБОТА №2 Оператори мови Паскаль. Умовний оператор. Повна і скорочена форма запису оператора. Оператор переходу. Оператор варіанту. Оператори циклу. Оператор циклу з передумовою (поки). Оператор циклу з післяумовою (до). Оператор циклу з параметром. 12
ОПЕРАТОР БЕЗУМОВНОГО ПЕРЕХОДУ 12
EЛЕМЕНТИ СТРУКТУРНОГО ПРОГРАМУВАННЯ НА БАЗІ PASCAL 12
СЛІДУВАННЯ 12
РОЗГАЛУЖЕННЯ 13
ЦИКЛ З ПЕРЕДУМОВОЮ 13
ЦИКЛ З ПОСТУМОВОЮ 13
ЦИКЛ З ПАРАМЕТРОМ 13
ОПЕРАТОРИ ДОСТРОКОВОГО ВИХОДУ З ЦИКЛІВ 13
ОПЕРАТОР ВАРІАНТУ 13
ЗАВДАННЯ ДО РОЗ’ЯЗАННЯ 13
ПРАКТИЧНА РОБОТА №3 Допоміжні алгоритми. Процедури та фукнції. Фактичні та формальні параметри. Глобальні та локальні змінні. Опис їх мовою Паскаль 14
СТРУКТУРА ПРОЦЕДУР І ФУНКЦІЙ 14
ОБЛАСТЬ ДІЇ (СФЕРА ВИДИМОСТІ) ІДЕНТИФІКАТОРІВ ПРИ ВИКОРИСТАННІ ПРОЦЕДУР І ФУНКЦІЙ 15
Контрольні питання 22
ПРАКТИЧНА РОБОТА №4 Масиви. Опис масивів. Алгоритми пошуку та сортування масивів. 23
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ 23
ПРАКТИЧНА РОБОТА №5 Рядкові величини 24
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ 24
ПРАКТИЧНА РОБОТА №6 Множини. Опис множин, операції над множинами. 25
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ 26
ПРАКТИЧНА РОБОТА №7 Записи. Опис комбінованих типів. Записи з варіантами. 27
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ 28
ПРАКТИЧНА РОБОТА № 8. ФАЙЛИ 28
ФАЙЛИ 28
ТЕКСТОВІ ФАЙЛИ 29
КОМПОНЕНТНІ ФАЙЛИ 31
БЕЗТИПОВІ ФАЙЛИ 31
ПОСЛІДОВНИЙ І ПРЯМИЙ ДОСТУП 32
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ 33
ПРАКТИЧНА РОБОТА № 9. МОДУЛІ 34
Модулі. Структура модуля. 34
ТЕОРЕТИЧНІ ПИТАННЯ 34
ПРАКТИЧНІ ЗАВДАННЯ 34
ЛІТЕРАТУРА 34
ПРАКТИЧНА РОБОТА № 10. МОДУЛЬ ГРАФІКИ. 35
ТЕОРЕТИЧНІ ПИТАННЯ 35
ПРАКТИЧНІ ЗАВДАННЯ 35
ЛІТЕРАТУРА 35
ПРАКТИЧНА РОБОТА № 11. ВКАЗІВНИКИ. ОПИС ДИНАМІЧНИХ ТИПІВ. ОПЕРАЦІЇ НАД ВКАЗІВНИКАМИ. 36
ТЕОРЕТИЧНІ ПИТАННЯ 36
ЗАВДАННЯ ДЛЯ РОЗВ’ЯЗАННЯ 36
ЛІТЕРАТУРА 36
ДОМАШНЄ ЗАВДАННЯ 36
ПРАКТИЧНА РОБОТА №1
Структура програми. Стандарні типи даних. Стандартні та означувальні типи. Вирази.
ОСНОВНІ ПОНЯТТЯ АЛГОРИТМІЧНОЇ МОВИ
СКЛАД МОВИ. Звичайна розмовна мова складається з чотирьох основних елементів: сим¬волів, слів, словосполучень і речень. Алгоритмічна мова містить подібні елементи, тільки слова називають елементарними конструкціями, словосполучення-виразами, речення-опера-то¬ра¬ми. Символи, елементарні конструкції, вирази й оператори складають ієрархічну струк-ту¬ру, оскільки елементарні конструкції утворяться з послідовності символів, вирази – це по-слі¬довність елементарних конструкцій і символів, а оператор – послідовність виразів, еле-мен¬тар¬них конструкцій і символів.
ОПИС МОВИ є опис чотирьох названих елементів. Опис символів полягає в пере-раху¬ван¬ні припустимих символів мови. Під описом елементарних конструкцій розуміють правила їхньо¬го утворення. Опис виразів – це правила утворення будь-яких виразів, що мають зміст у даній мові. Опис операторів складається з розгляду усіх типів операторів, припустимих у мові. Опис кожного елемента мови задається його СИНТАКСИСОМ і СЕМАНТИКОЮ. Син¬так¬сичні визначення встановлюють правила побудови елементів мови. Семантика визначає зміст і правила використання тих елементів мови, для яких були дані синтаксичні визначення.
СИМВОЛИ мов – це основні неподільні знаки, якими пишуться всі тексти мовою.
ЕЛЕМЕНТАРНІ КОНСТРУКЦІЇ – це мінімальні одиниці мови, що мають самостій-ний зміст. Вони утворяться з основних символів мови.
ВИРАЗ в алгоритмічній мові складається з елементарних конструкцій і символів, воно задає правило обчислення деякого значення.
ОПЕРАТОР задає повний опис деякої дії, що необхідно виконати. Для опису складної дії може знадобитися група операторів. У цьому випадку оператори поєднуються в СКЛАДЕНИЙ ЧИ ОПЕРАТОРИЙ БЛОК.
Дії, задані операторами, виконуються над ДАНИМИ. Речення алгоритмічної мови, у яких даються відомості про типи даних, називаються ОПИСАМИ операторів, які не вико¬ну-ють¬ся.
Об'єднана єдиним алгоритмом сукупність описів і операторів утворює ПРОГРАМУ алго¬ритмічною мовою.
У процесі вивчення алгоритмічної мови необхідно відрізняти алгоритмічну мову від тієї мови, за допомогою якої здійснюється опис досліджуваної алгоритмічної мови. Звичайно досліджувана мова називається просто мовою, а мова, у термінах якої дається опис дослід¬жу-ва¬ної мови – МЕТАМОВОЮ.
Синтаксичні визначення можуть бути задані формальними чи неформальним способами. Існують три формальних способи:
– металінгвістична символіка, названа Бекуса-Наура формулами;
– синтаксичні діаграми;
– дужкові конструкції.
В наступному викладі будемо користатися неформальним способом.
ОСНОВНІ СИМВОЛИ
Основні символи мови – букви, цифри і спеціальні символи – складають його алфавіт. ТУРБО ПАСКАЛЬ включає наступний набір основних символів:
1) 26 латинських великих і 26 латинських малих букв:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h і j k l m n o p q r s t u v w x y z
2) _ підкреслення
3) 10 цифр: 0 1 2 3 4 5 6 7 8 9
4) знаки операцій:
+ - * / = <> < > <= >= := @
5) обжувачі:
. , ' ( ) [ ] (. .) { } (* *) .. : ;
6) специфікатори:
^ # $
7) службові (зарезервовані) слова:
ABSOLUTE EXPORTS LIBRARY SET
ASSEMBLER EXTERNAL MOD SHL
AND FAR NAME SHR
ARRAY FILE NIL STRING
ASM FOR NEAR THEN
ASSEMBLER FORWARD NOT TO
BEGIN FUNCTION OBJECT TYPE
CASE GOTO OF UNIT
CONST IF OR UNTIL
CONSTRUCTOR IMPLEMENTATION PACKED USES
DESTRUCTOR IN PRIVATE VAR
DIV INDEX PROCEDURE VIRTUAL
DO INHERITED PROGRAM WHILE
DOWNTO INLINE PUBLIC WITH
ELSE INTERFACE RECORD XOR
END INTERRUPT REPEAT
EXPORT LABEL RESIDENT
Крім перерахованих, у набір основних символів входить пробіл. Пробіли не можна використовувати всередині здвоєних символів і зарезервованих слів.
EЛЕМЕНТАРНІ КОНСТРУКЦІЇ
Елементарні конструкції мови ПАСКАЛЬ містять у собі імена, числа і рядки.
Імена (ідентифікатори) називають елементи мови – константи, мітки, типи, змінні, процедури, функції, модулі, об'єкти. Ім'я – це послідовність букв і цифр, що починається з букви. В іменах може використовуватись символ _ підкреслення. Ім'я може містити довільну кількість символів, але значущими є 63 символи.
Не дозволяється в мові ПАСКАЛЬ використовувати як імена службові слова і стандартні імена, якими названі стандартні константи, типи, процедури, функції і файли.
Для поліпшення наочності програми в неї можуть вставлятися пробіли. Принаймні один пробіл потрібно вставити між двома послідовними іменами, чи числами службовими і стандартними іменами. Пробіли не можна використовувати всередині імен і чисел.
Приклади імен мови ПАСКАЛЬ:
A b12 r1m SIGMA gamma I80_86
Числа в мові ПАСКАЛЬ звичайно записуються в десятковій системі числення. Вони можуть бути цілими і дійсними. Позитивний знак числа може бути опущений. Цілі числа записуються у формі без десяткової крапки, наприклад:
217 -45 8954 +483
Дійсні числа записуються у формі з десятковою крапкою чи у формі з використанням десяткового порядку, що зображується буквою Е:
28.6 0.65 -0.018 4.0 5Е12 -1.72Е9 73.1Е-16
ПАСКАЛЬ допускає запис цілих чисел і фрагментів дійсних чисел у формі з порядком у шістнадцятковій системі числення:
$7F $40 $ABC0
Рядки в мові ПАСКАЛЬ – це послідовність символів, записаних між апострофами. Якщо в рядку в якості змістовного символа необхідно вжити сам апостроф, то слід записати два апострофа. Приклади рядків:
'РЯДОК' 'STRING' 'ПРОГРАМА' 'АД''ЮТАНТ'
КОНЦЕПЦІЯ ТИПУ ДЛЯ ДАНИХ
У математиці прийнято класифікувати змінні відповідно до деяких важливих харак¬те-ри¬стик. Виробляється строге розмежування між речовинними, комплексними і логічними змін¬ними, між змінними, що представляють окремі значення і безліч значень і так далі. При обробці даних на ЕОМ така класифікація ще більш важлива.
У будь-якій алгоритмічній мові кожна константа, змінна, вираз чи функція мають визначений типу.
У мові ПАСКАЛЬ існує правило: тип явно задається в описі змінних чи функцій, що передує їхньому використанню. Концепція типу мови ПАСКАЛЬ має наступні основні властивості:
– будь-який тип даних визначає множина значень, до якої належить константа, що може приймати змінна чи вираз, операція чи виробляти функція;
– тип значення, що задається константою, змінною чи виразом, можна визначити по їх виду чи опису;
– кожна операція чи функція вимагає аргументів фіксованого типу і видає результат фіксованого типу.
Звідси випливає, що транслятор може використовувати інформацію про тип для пе¬ре-вір¬ки обчислення і правильності різних конструкцій.
Тип визначає:
– можливі значення змінних, констант, функцій, виразів, належних до даного типу;
– внутрішню форму представлення даних в ЕОМ;
– операції і функції, що можуть виконуватися над величинами, належними до даного типу.
Обов'язковий опис типу приводить до надмірності в тексті програм, але така над¬мір-ність є важливим допоміжним засобом розробки програм і розглядається як необхідна влас-ти¬вість сучасних алгоритмічних мов високого рівня. У мові ПАСКАЛЬ існують скалярні і струк¬ту¬ро¬вані типи даних.
До скалярних типів відносяться стандартні типи і типи, визначені користувачем.
Стандартні типи включають цілі, дійсні, символьні, логічні й адресні типи. Типи, визначені користувачем, – перелічувальні і інтервальні.
Структуровані типи мають чотири різновиди: масиви, множини, записи і файли.
Крім перерахованих, TURBO PASCAL включає ще два типи – процедурний і об'єкт-ний.
З групи скалярних типів можна виділити порядкові типи, які характеризуються на¬ступ-ними властивостями:
– усі можливі значення порядкового типу являють собою обмежену упорядковану безліч;
– до будь-якого порядкового типу може бути застосована стандартна функція Ord, що як результат повертає порядковий номер конкретного значення в даному типі;
– до будь-якого порядкового типу можуть бути застосовані стандартні функції Pred і Succ, що повертають попереднє і наступне значення відповідно;
– до будь-якого порядкового типу можуть бути застосовані стандартні функції Low і High, що повертають найменше і найбільше значення величин даного типу.
У мові ПАСКАЛЬ введені поняття еквівалентності і сумісності типів.
Два типи Т1 і Т2 є еквівалентними (ідентичними), якщо виконується одне з двох умов:
– Т1 і Т2 являють собою те саме ім'я типу;
– тип Т2 описаний з використанням типу Т1 за допомогою чи рівності послідовності рівностей. Наприклад:
type
T1 = Integer;
T2 = T1;
T3 = T2;
Менш строгі обмеження визначені сумісністю типів. Наприклад типи є сумісними, якщо:
• вони еквівалентні;
• є обоє або цілими, або дійсними;
• один тип – інтервальний, інший - його базовий;
• обоє інтервальні з загальним базовим;
• один тип – рядковий, інший – символьний.
У ТУРБО ПАСКАЛЬ обмеження на сумісність типів можна обійти з допомогою приведення типів. Приведення типів дозволяє розглядати ту саму величину в пам'яті ЕОМ як належну різним типам.
Для цього використовується конструкція
Ім'я_Типу(змінна чи значення).
Наприклад, Integer('Z') є значення коду символу 'Z' у двохбайтному значенні цілого числа, а Byte(534) дасть значення 22, оскільки ціле число 534 має тип Word і займає два байти, а тип Byte займає один байт, і в процесі приведення старший байт буде відкинутий.
СТАНДАРТНІ ТИПИ ДАНИХ
До стандартних відносяться цілі, дійсні, логічні, символьний і адресний типи.
ЦІЛІ типи визначають константи, змінні і функції, значення яких реалізуються мно¬жи-ною цілих чисел, допустимих у даній ЕОМ.
Тип діапазон значень необхідна пам'ять
Shortint -128 .. 127 1 байт
Integer -32768 .. 32767 2 байта
Longint -2 147 483 648..2147483647 4 байта
Byte 0 .. 255 1 байт
Word 0 .. 65535 2 байта
ДІЙСНІ типи визначають ті дані, що реалізуються підмножиною дійсних чисел, до¬пус-ти¬мих у даній ЕОМ.
Тип діапазон значень Кількість цифр мантиси необхідна пам'ять
Real 2.9e-39 .. 1.7e+38 11 6
Single 1.5e-45 .. 3.4e+38 7 4
Double 5.0e-324 .. 1.7e+308 15 8
Extended 3.4e-4932 .. 1.1e+4932 19 10
Comp -9.2e+18 .. 9.2e+18 19 8
ЛОГІЧНИЙ тип (Boolean) визначає ті дані, що можуть приймати логічні значення TRUE і FALSE.
До булевих операндів застосовні наступні логічні операції: not and or xor.
Логічний тип визначений таким чином, що FALSE < TRUE. Це дозволяє застосовувати до булевих операндів всі операції відносини.
У ТУРБО ПАСКАЛЬ введені ще різновиди логічного типу: ByteBool, WordBool і LongBool, що займають у пам'яті ЕОМ один, два і чотири байти відповідно.
СИМВОЛЬНИЙ тип (Char) визначає упорядковану сукупність символів, допустимих у данії ЕОМ. Значення символьної змінної чи константи – це один символ із допустимого набору.
Символьна константа може записуватися в тексті програми трьома способами:
• як один символ, укладений в апострофи, наприклад: 'A' 'a' 'Ю' 'ю';
• за допомогою конструкції виду #K, де K ¬- код відповідного символа, при цьому значення K повинне знаходитися в межах 0..255;
• за допомогою конструкції виду ^C, де C - код відповідного керуючого символу, при цьому значення C повинне бути на 64 більше коду керуючого символу.
АДРЕСНИЙ тип (Pointer) визначає змінні, котрі можуть містити значення адрес чи даних фрагментів програми. Для збереження адреси вимагаються два слова (4 байти), одне з них визначає сегмент, друге – зміщення.
Робота з адресними змінними (покажчиками) буде розглянута пізніше, зараз відзна¬чи-мо, що для одержання значення адреси який-небудь змінної введена унарна операція @.
КОНСТАНТИ. ЗМІННІ. ІНЦІЛАЛІЗАЦІЯ ЗМІННИХ
Тип констант у мові ПАСКАЛЬ визначається по їхньому виду: константи цілого типу – це цілі числа, що не містять десяткової крапки, константи дійсного типу - дійсні числа, логічні константи логічні значення TRUE і FALSE, символьні константи – або рядок довжиною в один символ, або конструкції виду #K чи ^K.
Тип змінних визначається користувачем у розділі опису змінних.
В даний час у професійному програмуванні прийнято записувати імена змінних з використанням так званої угорської нотації.
Угорська нотація – це угода про найменування змінних і функцій. Угода широко викори¬сто¬вується при програмуванні на мовах PASCAL, C і в середовищі WINDOWS.
Угорська нотація ґрунтується на наступних принципах:
– імена змінних і функцій повинні містити префікс, що описує їхній тип;
– імена змінних і функцій записуються повними чи словами словосполученнями чи їх-ні¬ми скороченнями, але так, щоб по імені можна було зрозуміти призначення змінної чи дії, ви¬конувана функцією.
Префікси записуються малими буквами, перша буква кожного слова – велика, префікси і слова записуються або разом, або через символ _ (підкреслення).
Для мови PASCAL можуть бути рекомендовані наступні префікси для скалярних змін-них і функцій:
Префікс Тип
By Byte
Sh Shortint
I Integer
W Word
L Longint
R Real
Si Single
D Double
E Extended
C Comp
Ch Char
B Boolean
P Pointer
x,у Координати символу чи крапки на екрані
Для величин структурованого типу можуть бути використані слідуючі префікси:
Префікс Тип
A Array
S String
Sz Stringz
Se Set
Re Record
F File
T Text
Наприклад: rV, arVector[1..20], sName, iCount.
У відкомпільованій програмі для всіх змінних відведене місце в пам'яті, і всім змінним привласнені нульові значення.
Для завдання початкових значень змінним (ініціалізації змінних) TURBO PASCAL дозволяє привласнювати початкові значення змінним одночасно з їхнім описом. Для цього використовується конструкція
ім'я змінної: тип = значення;
яка повинна бути розміщена в розділі опису констант, наприклад:
const rWeight: Real = 0.4;
ВИРАЗИ. ОПЕРАТОР ПРИСВОЮВАННЯ
Вирази складаються з констант, змінних, покажчиків функцій, знаків операцій і ду-жок. Вираз задає правило обчислення деякогого значення. Порядок обчислення визна¬ча¬єть-ся старшинством (пріоритетом) операцій, що містяться в ньому. У мові ПАСКАЛЬ прийнятий на¬ступний пріоритет операцій:
1. унарна операція not, унарний мінус –, взяття адреси @
2. операції типу множення * / div mod and shl shr
3. операції типу додавання + - or xor
4. операції відносини = <> < > <= >= in
Вирази входять до складу багатьох операторів мови ПАСКАЛЬ, а також можуть бути аргументами убудованих функцій.
В операторі присвоювання тип змінної і тип виразу повинні збігатися крім випадку, коли вираз відноситься до цілого типу, а змінна – до дійсного. При цьому відбувається перетворення значення виразу до дійсного типу.
ОПЕРАТОРИ ВВОДУ І ВИВОДУ
Розглянемо організацію введення і висновку даних з термінального пристрою. Тер¬мі-наль¬ний пристрій – це пристрій, з яким працює користувач, звичайно це екран (дисп¬лей) і клавіатура.
Для введення і висновку даних використовуються стандартні процедури введення і вис¬нов¬ку Read і Write, що оперують стандартними послідовними файлами INPUT и OUTPUT.
Ці файли розбиваються на рядки змінної довжини, відокремлювані один від одного ознакою кінця рядка. Кінець рядка задається натисканням клавіші ENTER.
Для уведення вихідних даних використовуються оператори процедур уведення:
Read(A1,A2,...AK);
ReadLn(A1,A2,...AK);
ReadLn;
Перший з них реалізує читання K значень вихідних даних і присвоювання цих значень змінним А1, А2, ..., АK. Другий оператор реалізує читання K значень вихідний даних, пропуск інших значень до початку наступного рядка, присвоювання значень змінних А1, А2, ..., АК. Третій оператор реалізує пропуск рядка вихідних даних.
При введенні вихідних даних відбувається перетворення із зовнішньої форми пред-ста⬬лення у внутрішнім, обумовленим типом змінних. Змінні, що утворюють список введен-ня, можуть належати або до цілого, або до дійсного, або до символьного типам. Читан¬ня вихід¬них даних логічного типу в мові ПАСКАЛЬ неприпустимо.
Оператори введення при читанні значень змінних цілого і дійсного типу пропускає про¬біли, що передують числу. У той же час ці оператори не пропускають пробілів, що пере-дують значенням символьних змінних, тому що пробіли є рівноправними символами рядків. Приклад запису операторів введення:
Var rV, rS: Real;
iW, iJ: Integer;
chC, chD: Char;
................
Read(rV, rS, iW, iJ);
Read(chC, chD);
Значення вихідних даних можуть відокремлюватися один від одного пробілами і натисканням клавіш табуляції і Enter.
Для виведення результатів роботи програми на екран використовуються оператори:
Write(A1,A2,...AK);
WriteLn(A1,A2,...AK);
WriteLn;
Перший з цих операторів реалізує виведення значень змінних А1, А2,...,АК у рядок екрана. Другий оператор реалізує виведення значень змінних А1, А2, ..., АК і перехід до початку наступної рядка. Третій оператор реалізує пропуск рядка і перехід до початку наступної рядка.
Змінні, у списоку виведення, можуть відноситись до цілого, дійсного, символьному чи булевого типу. У якості елемента списку виведення крім імен змінних можуть використо-вува¬тися вирази і рядки. Виведення кожного значення в рядок екрана відбувається відпо¬від-но із шириною поля виведення, обумовленою конкретною реалізацією мови.
Форма представлення значень у полі виведення відповідає типу змінних і виразів: величини цілого типу виводяться як цілі десяткові числа, дійсного типу – як дійсні десяткові числа з десятковим порядком, символьного типу і рядка – у виді символів, логіч-но¬го типу – у виді логічних констант TRUE і FALSE.
Оператор висновку дозволяє задати ширину полючи висновку для кожного елемента списку висновку. У цьому випадку елемент списку висновку має вид А:K, де А – вираз чи рядок, K – вираз або константа цілого типу.
Якщо виведене значення займає в поле виведення менше позицій, чим ДО, то перед цим значенням розташовуються пробіли. Якщо виведене значення не міститься в ширині поля K, то для цього значення буде відведена необхідна кількість позицій. Для величин дійсного типу елемент списку виведення може мати вид А:K:М, де А – змінна чи вираз дійсного типу, K – ширина поля виведення, М - число цифр дробової частини виведеного значення. K і М – цілого типу. У цьому випадку дійсні значення виводяться у формі десяткового числа з фіксованою крапкою.
Приклад запису операторів виведення:
. . . . . . . . . . . .
var rA, rB: Real; iP,iQ:Integer;
bR, bS: Boolean; chT, chV, chU, chW: Char;
. . . . . . . . . . . .
WriteLn(rA, rB:10:2);
WriteLn(iP, iQ:8);
WriteLn(bR, bS:8);
WriteLn(chT, chV, chU, chW);
СТРУКТУРА ПРОГРАМИ
Програма мовою ПАСКАЛЬ складається з заголовка, розділів описів і розділ операторів.
Заголовок програми містить ім'я програми, наприклад:
Program PRIM;
Описи можуть містити в собі розділ бібліотек, що підключаються, (модулів), розділів опису міток, розділів опису констант, розділ опису типів, розділ опису змінних, розділ опису процедур іь функцій.
Розділ опису модулів визначається службовим словом USES і має імена модулів, що підключаються, (бібліотек) як вхідних до складу системи TURBO PASCAL, так і написаних користувачем. Розділ опису модулів повинний бути першим серед розділів описів. Імена модулів відокремлюються один від одного комами: uses CRT, Graph;
Будь-який оператор у програмі може бути позначений міткою. У якості мітки використовуються довільні цілі без знака, що містять не більш чотирьох цифр, або імена. Мітка ставиться перед оператором і відокремлюється від нього двокрапкою. Усі мітки, використовувані в програмі, повинні бути перераховані в розділі опису міток, наприклад: label 3, 471, 29, Quit;
Опис констант дозволяє використовувати імена як синоніми констант, їх необхідно визначити в розділі описів констант: const K= 1024; MAXIM= 16384;
У розділі опису змінних необхідно визначити тип усіх змінних, використовуваних у про¬гра¬мі:
var P,Q,R: Integer; A,B: Char; F1,F2: Boolean;
Опис типів, прцедур і функцій буде розглянуто нижче. Окремі розділи описів можуть бути відсутні, але варто пам'ятати, що в ПАСКАЛЬ – програмі повинні бути обов'язково опи¬сані усі компоненти програми.
Розділ операторів являє собою складений оператор, що містить між службовими словами
begin.......end
послідовність операторів. Оператори відокремлюються один від одного символом ;.
Текст програми закінчується символом крапка.
Крім описів і операторів ПАСКАЛЬ – програма може містити коментарі, що являють собою довільну послідовність символів, розташовану між відкриваючою дужкою коментарів { і закриваючою дужкою коментарів }.
Текст ПАСКАЛЬ – програми може містити ключі компіляції, які дозволяють керувати режимом компіляції. Синтаксично ключі компіляції записуються як коментарі. Ключ компіляції містить символ $ і буква-ключ з наступним знаком + (включити режим) чи - (виключити режим). Наприклад:
{$E+} – емулювати математичний співпроцесор;
{$F+} - формувати далекий тип виклику процедур і функцій;
{$N+} - використовувати математичний співпроцесор;
{$R+} - перевіряти вихід за границі діапазонів.
Деякі ключі компіляції можуть містити параметр, наприклад:
{$I ім'я файлу} - включити в текст компілюючої програми названий файл.
Приклад запису простої програми:
Program TRIANG;
var A, B, C, S, P: Real;
begin
Read(A,B,C);
WriteLn(A,B,C);
P:=(A+B+C)/2;
S:=Sqrt(P*(P-A)*(P-B)*(P-C));
WriteLn('S=',S:8:3)
end.
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ
1) Дана довжина ребра куба. Знайти об’єм куба і площу його бічної поверхні.
2) Дані катети прямокутного трикутника. Знайти його гіпотенузу і площу.
3) Дано x, y, z .Обчислити b, якщо
b=x(arctg z + e-(x+3))
4) Дано дійсні числа x і y. Одержати
5) Три опори з’єднані паралельно. Знайти опір з’єднання.
ПРАКТИЧНА РОБОТА №2
Оператори мови Паскаль. Умовний оператор. Повна і скорочена форма запису оператора. Оператор переходу. Оператор варіанту. Оператори циклу. Оператор циклу з передумовою (поки). Оператор циклу з післяумовою (до). Оператор циклу з параметром.
ОПЕРАТОР БЕЗУМОВНОГО ПЕРЕХОДУ
Як правило оператори в програмі виконуються в тому порядку, у якому вони записані. Оператор безумовного переходу перериває природний порядок виконання програми і вказує, що подальше виконання повинно продовжуватися, починаючи з оператора, позначеного міткою, що зазначена в операторі переходу. Приклад запису оператора переходу:
Goto 218;
EЛЕМЕНТИ СТРУКТУРНОГО ПРОГРАМУВАННЯ НА БАЗІ PASCAL
Структуризована програма (або підпрограма) - це програма, складена з фіксованої множини базових конструкцій.
Розглянемо основні визначення і засоби утворення цих конструкцій у схемах алгоритмів. Мінімальними “цеглинками” виступають операції, розвилки, злиття.
З операцій, розвилок і злить будуються базові конструкції: слідування, розгалуження, цикл. Застосовуючи тільки ці три конструкції, можна реалізувати алгоритм рішення будь-якої задачі.
Конструкція, що поєднує у собі послідовне виконання двох або більш операцій, називається слідуванням.
Конструкція, що складається з розвилки, двох операцій і злиття, називається розгалуженням. Одна з операцій може відсутня.
Конструкція, що має лінії керування, що ведуть до операцій, що передують даним операціям, або до розвилок, називається циклом.
Конструкції слідування, розгалуження і цикл можна уявити як операції, тому що вони мають єдиний вхід і єдиний вихід. Довільну послідовність таких операцій можна уявити як одну операцію.
Операція може бути реалізована будь-яким оператором мови ПАСКАЛЬ (простим або складеним), або групою операторів, за винятком оператора переходу goto.
У мові ПАСКАЛЬ кількість базових конструкцій збільшене до шести, це:
слідування;
розгалуження;
цикл із передумовою;
цикл із постумовою;
цикл із параметром;
варіант.
Далі розглянемо, як ці базові конструкції реалізуються в мові ПАСКАЛЬ.
СЛІДУВАННЯ
Слідування у мові Паскаль представляється за допомогою послідовності інших операторів, розміщених між операторними дужками begin та end;.
РОЗГАЛУЖЕННЯ
Розгалуження реалізується через умовний оператор, який у короткій формі працює за правилом: “Якщо булевий вираз B істинний, то виконується оператор OP1, далі виконується оператор, що слідує за умовним. Якщо булевий вираз В хибний, то одразу буде виконуватися оператор, що слідує за цим умовним оператором. (if B then OP1)”.
У довгій формі працює за правилом: “Якщо булевий вираз В істинний, то виконується оператор ОР1, а, якщо B - хибний, то виконується оператор ОР2. Далі виконується оператор, що слідує за умовним. (if B then OP1 else OP2).”
ЦИКЛ З ПЕРЕДУМОВОЮ
Цикл з передумовою реалізується через Pascal-оператор while B do ОР1, який працює за правилом: “Якщо булевий вираз В істинний, то виконується оператор(и) ОР1. Якщо булевий вираз В – хибний, то виконання операторів ОР1 припиняється.”
ЦИКЛ З ПОСТУМОВОЮ
Цикл з постумовою реалізується через Pascal-оператор repeat ОР1 until В, який працює за правилом: “Якщо булевий вираз В хибний, то виконується оператор(и) ОР1. Якщо булевий вираз В істинний, то виконання операторів ОР1 припиняється.”
ЦИКЛ З ПАРАМЕТРОМ
Цикл з пареметром реалізується через Pascal-оператори for ... to ... do та for ... downto ... do. Дія цих операто¬рів відбувається певну кількість разів. Ця кількість залежить від початкових і кінцевих значень. В загальному випадку для першої форми кількість повторень (ітерацій) є різниця між кінцевим і початковим значенням, а для другої -навпаки.
ОПЕРАТОРИ ДОСТРОКОВОГО ВИХОДУ З ЦИКЛІВ
Для всіх операторів циклу вихід із циклу здійснюється як наслідок природного закінчення оператора циклу, так і за допомогою операторів безумовного переходу і виходу з циклу. Починаючи з версії ТУРБО ПАСКАЛЬ 7.0 визначені стандартні процедури Break і Continue. Процедура Break: виконує безумовний вихід із циклу. Процедура Continue забезпечує перехід до початку нової ітерації циклу.
ОПЕРАТОР ВАРІАНТУ
Ряд умовних операторів, що містять булеві операції з одним об’єктом можна об’єднати в один оператор варіанту. На мові Паскаль від реалізується через оператор case…of …end
If х=2 then у:=3; Case x of
If х=4 then у:=х+2; 2: y:=3;
If х=5 then y:=3*х; 4: y:=x+2;
If х=90 then у:=sqrt(х); 5:y:=3*x;
90: y:=sqrt(x);
end;
ЗАВДАННЯ ДО РОЗ’ЯЗАННЯ
1) Дано два дійсних числа. Вивести перше число, якщо воно більше другого, і обидва, якщо це не так.
2) Дано два дісних числа. Вибрати з них ті, які належать інтервалу (1,3).
3) Дані три дійсні числа. Піднести до квадрату ті з них, значення яких не від’ємні.
4) Дані дійсні числа a, b, c. Перевірити, чи виконуються нерівності a<b<c.
5) Дано дійсні числа x,y (x≠y). Менше з цих двох чисел замінити іх півсумою, а більше – їх подвійним добутком.
ПРАКТИЧНА РОБОТА №3
Допоміжні алгоритми. Процедури та фукнції. Фактичні та формальні параметри. Глобальні та локальні змінні. Опис їх мовою Паскаль
СТРУКТУРА ПРОЦЕДУР І ФУНКЦІЙ
При створенні програми для рішення складної задачі виконується декомпозиція (поділ) цієї задачі на підзадачі, підзадачі – на ще менші підзадачі і так далі, до легко програмованих елементарних підзадач.
Borland Pascal має різні засоби для розподілу програми на частини. На верхньому рівні поділу (великих задач) – це модулі, на нижньому рівні (елементарні підзадачі) – це найчастіше процедури і функції. Об’єктно-оріентована методологія охоплює як верхній, так і нижній рівень розробки програм.
Процедури і функції є важливим засобом у більшості мов програмування. З їхньою допомогою можна скомпонувати групу операторів для виконання деякої єдиної дії. Процедуру (функцію) можна викликати з різних місць програми, вона може повертати обчислені результати, і їй можна передавати інформацію, що вона використовує для виконання обчислень. Для того щоб процедура (функція) початку роботу, її потрібно викликати (активізувати).
Процедури і функції складаються з операторів, локальних даних і внутрішніх процедур і функцій. Структура опису процедури та функції має наступний вид.
procedure Ім'я (Список_Формальних_Параметрів);
label
const – Опис локальних меток, констант, типів і змінних
type
var
procedure (function)– Опис внутрішніх процедур і функцій
begin
– Оператори
end;
function Ім'я (Список Формальних параметрів): Тип результату;
label
const – Опис локальних міток, констант, типів і змінних
type
var
procedure – Опис внутрішніх процедур і функцій
function
begin – Оператори, серед яких повинний бути хоча б один,
який привласнює імені функції значення результату.
end;
Відмінності в описі функції і процедури стосуються тільки заголовку та розделі операторів Для демонстрації цих відмінностей приведемо два рішення однієї задачі, одне з яких виконано за допомогою процедури, а друге – за допомогою функції.
Задача. Дано два дійсні числа. Знайти максимальне з двох чисел.
Програма, що використовує для рішення процедуру має наступний вид.
program PMax;
var a, b, m:integer;
procedure Max (x,y:integer; var res:integer);
begin
if x>y then res:=x else res:=y;
end;
begin
writeln (’Задайте два числа:’);
readln (a,b);
{-------------------------------------------------}
{Виклик процедури виконується окремим оператором!}
max(a,b,m);
{-------------------------------------------------}
writeln(“max=”,m);
end.
Програма, що використовує для рішення функцію має наступний вид.
program PMax;
var a, b, m:integer;
function Max (x, y: integer):integer;
begin
if x>y then Max:=x else Max:=y;
end;
begin
writeln (’Задайте два числа:’);
readln (a,b);
{-------------------------------------------------}
{Виклик функції виконується окремим оператором!}
m:=max(a,b,m);
{-------------------------------------------------}
writeln(“max=”,m);
end.
ОБЛАСТЬ ДІЇ (СФЕРА ВИДИМОСТІ) ІДЕНТИФІКАТОРІВ ПРИ ВИКОРИСТАННІ ПРОЦЕДУР І ФУНКЦІЙ
Областю дії (сферою видимості) ідентифікатора називається частина програми, де він може бути використаний.
Область дії ідентифікаторів визначається місцем их оголошення. Якщо ідентифікатори допускається використовувати тільки в рамках однієї чи процедури функції, то такі ідентифікатори називаються локальними. Якщо дія ідентифікаторів поширюється на несколько вкладених (не менш однієї) процедур і/чи функцій, то такі ідентифікатори називаються глобальними.
Помітимо, что поняття "глобальні" і "локальні" варто розуміти відносно – стосовно конкретної чи процедури функції.
Продемонструємо це наступним прикладом.
program Scope;
var А0, B0, C0 : Integer;
procedure P1;
var A1, B1, C1 : Integer;
procedure P2;
var A2, B2, C2 : Integer;
begin
Припустимо використання как глобальних А0,B0,C0,
А1,B1,C1, так і локальних А2,B2,C2
end;
begin
Припустимо використання как глобальних A0,B0,C0 так і локальних А1,B1,C1
end;
begin
Припустимо використання только A0,B0,C0
end.
У даному прикладі А0, B0, C0 будуть глобальними для всіх процедур і функцій, використовуваних у програмі.
А1, B1, C1 будуть глобальними для всіх процедур і функцій, описаних усередині процедури Р1 (у даному прикладі для процедури P2), і одночасно локальними для самої процедури Р1.
Дані А2, B2, C2, оголошені в самій внутрішній процедурі P2, будуть тільки локальними.
Сформулюємо правила визначення області дії для ідентифікаторів процедур і функцій:
• діють всі ідентифікатори, визначені усередині процедури (функції);
• діють всі ідентифікатори навколишнього контексту, якщо їхні імена відрізняються від імен, оголошених всередині процедури (функції);
• локальні ідентифікатори процедури(функції) у зовнішнім оточенні діяти не будуть ніколи;
• у випадку збігу імен глобального і локального ідентифікаторів діяти буде тільки внутрішній локальний ідентифікатор.
Якщо перших три правила пояснюються розглянутим прикладом, то для пояснення четвертого приведемо ще один приклад.
program EqualNames;
var А,B,C : Integer;
procedure P1;
var А,B,C : Real;
procedure P2;
var А, B, C : Char;
begin
А,B,C доступні, як символьні змінні
end;
begin
A,B,C доступні, як дійсні змінні
end;
begin
A,B,C доступні, як цілі змінні
end.
Тобто, оголошення у внутрішній процедурі даних з ідентифікаторами, що збігаються по імені з даними зовнішніх процедур, скасовує дія зовнішніх ідентифікаторів і уводить свої локальні описи, незалежно від того збігаються вони по типі, чи немає.
Локальні дані створюються при виклику процедури (функції) і існують тільки під час її виконання. Виділення пам'яті для локальних даних відбувається автоматично на початку виконання процедури(функції), а звільнення цієї пам'яті – как только виконання процедури(функції) закінчується.
Оператори, розташовані в тілі процедури(функції) можуть звертатися до її локальним даної (констант і змінним) і змінювати їхнього значення. Однак варто пам'ятати, що значення локальних даних існують поки процедура(функція) працює.
Как только вона закінчується, усі зміни значень локальних даних, зроблені операторами процедури(функції), зникнуть разом зі звільненням пам'яті.
КЛАСИФІКАЦІЯ СПОСОБІВ ПЕРЕДАЧІ ПАРАМЕТРІВ
При активізації процедури(функції) їй можна передавати параметри. При передачі необхідно стежити, щоб в операторі виклику были зазначені всі параметри, описані в заголовку процедури(функції).
Параметри, що вказуються в заголовку процедури(функції) при її описі, називаються формальними параметрами.
Параметри, що вказуються при виклику процедури(функції), називаються фактичними параметрами.
Коректність передачі параметрів ґрунтується на їхньому порядку перерахування в заголовку процедури і сумісності по присвоюванню між відповідними фактичними і формальними параметрами. Сфера дії імен параметрів такая ж, як і локальних даних.
Багато процедур мають кілька параметрів. Задача програміста – переконатися, що параметри, що він указує при виклику (фактичні параметри), відповідають за змістом формальним параметрам. Компілятор може перевірити тільки очевидні випадки — неправильне число чи параметрів несумісність типів.
Розглянемо класифікацію способів передачі параметрів, реалізація яких можлива в мовах програмування.
Оборотний увага читача, что це загальна класифікація, а не класифікація параметрів у Borland Pascal. Уведені для класифікації позначення value, addr, in, out, incut, у Borland Pascal не використовуються.
Параметри розрізняються:
1. По механізму передачі:
а) передача за значенням (value);
б) передача за адресою (по посиланню) (addr).
2. По взаємодії зухвалої і викликуваної процедур(функцій):
а) только как вхідний параметр (in);
б) только как вихідний параметр (out);
в) как вхідний, так і как вихідний параметр (inout).
Відповідно цим розходженням теоретично можливі 6 способів передачі параметрів:
1) value in;
2) value out;
3) value inout;
4) addr in;
5) addr out;
6) addr inout.
Незважаючи на те, що можливо шість способів передачі параметрів, в існуючих мовах програмування, як правило, використовується не більш двох-трьох способів.
У Borland Pascal реалізовані перший (value in), четвертий (addr in) і шостий (addr inout) способи передачі параметрів.
Розглянемо коротко суть кожного із шести способів передачі параметрів. Помітимо, що при конкретній реалізації в якій-небудь мові програмування, можуть бути деякі відмінності від описаного.
Параметри value in (у Borland Pascal реалізовані)
1. При виклику процедури(функції):
а) виконується виділення пам'яті під формальні параметри і локальні дані (у
чи стеці в спеціальній області пам'яті для локальних даних);
б) виконується копіювання значень фактичних параметрів у пам'ять, виділену
для формальних параметрів.
2. Під час роботи процедури(функції):
а) зміна значень формальних параметрів не робить ніякого впливу на
уміст комірок пам'яті фактичних параметрів.
3. При закінченні процедури(функції):
а) пам'ять, виділена під формальні параметри і локальні дані, очищається;
б) нові значення формальних параметрів, отримані в процесі роботи
процедури, губляться разом з очищенням пам'яті.
Параметри value out
1. При виклику процедури (функції):
а) виконується виділення пам'яті для значень формальних параметрів і локальних
даних, а також для збереження адрес фактичних параметрів (у чи стеці в
спеціальної області пам'яті для локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
в) значення формальних параметрів безпосередньо після виклику не визначені;
г) використовувати як фактичні параметри константи заборонено.
2. Під час роботи процедури(функції):
а) забороняється використовувати значення формальних параметрів доти, поки не
буде виконане первісне присвоювання якого-небудь значення;
б) зміна значень формальних параметрів не викликає одночасного
зміни відповідних фактичних параметрів.
3. При закінченні процедури(функції):
а) спочатку використовуючи скопійовані адреси фактичних параметрів виконується
запис результуючих значень формальних параметрів у комірки пам'яті
фактичних параметрів;
б) пам'ять, виділена для роботи процедури(функції), очищається.
Параметри value inout
1. При виклику процедури(функції):
а) виконується виділення пам'яті для значенні формальних параметрів і локальних
даних, а також для збереження адрес фактичних параметрів (у чи стеці в
спеціальної області пам'яті для локальних даних);
б) виконується копіювання як адрес фактичних параметрів, так і їхніх значень у
виділену для них пам'ять;
в) використовувати як фактичні параметри константи заборонено.
2. Під час роботи процедури(функції):
а) допускається як використовувати, так і змінювати значення формальних параметрів;
б) зміна значень формальних параметрів не викликає одночасного
зміни відповідних фактичних параметрів.
3. При закінченні процедури(функції):
а) спочатку, аналогично параметрам value out, використовуючи скопійовані адреси
фактичних параметрів виконується запис результуючих значень формальних
параметрів у комірки пам'яті фактичних параметрів;
б) пам'ять, виділена для роботи процедури(функції), очищається.
Параметри addr in (у Borland Pascal реалізовані)
1. При виклику процедури(функції):
а) виконується виділення пам'яті тільки для локальних даних і для збереження
адрес фактичних параметрів (у чи стеці в спеціальній області пам'яті для
локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
2. Під час роботи процедури(функції):
а) заборонена зміна значень формальних параметрів;
б) використовувати значення формальних параметрів дозволено тільки в якості
вихідних даних;
в) значення формальних параметрів, використовуючи скопійовані адреси, вибираються
безпосередньо з пам'яті фактичних параметрів.
3. При закінченні процедури(функції):
а) вплив викликуваної процедури(функції) на зухвалу через такі параметри
отсутствует;
б) пам'ять, виділена для роботи процедури(функції) очищається.
Параметри addr out
1. При виклику процедури(функції):
а) виконується виділення пам'яті тільки для локальних даних і для збереження
адрес фактичних параметрів (у чи стеці в спеціальній області пам'яті для
локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
в) значення формальних параметрів безпосередньо після виклику не визначені;
г) використовувати як фактичні параметри константи заборонено.
2. Під час роботи процедури(функції):
а) забороняється використовувати значення формальних параметрів доти, поки не
буде виконане первісне присвоювання якого-небудь значення;
б) зміна значень формальних параметрів, використовуючи скопійовані адреси,
виконується безпосередньо на комірках пам'яті відповідних фактичних
параметрів;
3. При закінченні процедури(функції):
а) спеціального копіювання результатів не потрібно, оскільки результат відразу
виходить у комірках пам'яті фактичних параметрів.
б) пам'ять, виділена для роботи процедури(функції), очищається.
Параметри addr inout (у Borland Pascal реалізовані)
1. При виклику процедури(функції):
а) виконується виділення пам'яті тільки для локальних даних і для збереження
адрес фактичних параметрів (у чи стеці в спеціальній області пам'яті для
локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
в) використовувати як фактичні параметри константи заборонено.
2. Під час роботи процедури(функції):
а) ніяких обмежень на використання параметрів даного виду не накладається;
б) зміна значень формальних параметрів, використовуючи скопійовані адреси,
виконується безпосередньо на комірках пам'яті відповідних фактичних
параметрів.
3. При закінченні процедури(функції):
а) спеціального копіювання результату не потрібно, оскільки всі дії з
формальними параметрами виконувалися безпосередньо над комірками пам'яті
фактичних параметрів;
б) пам'ять, виділена для роботи процедури(функції), очищається.
ПЕРЕДАЧА ПАРАМЕТРІВ У Borland Pascal
У Borland Pascal реалізовано три з вищеописаних шести способів передачі параметрів:
1. Параметри виду value in.
У Borland Pascal такі параметри називаються параметрами-значеннями. При описі заголовків процедур/функцій перед ідентифікаторами параметрів-значень додаткові ключові слова не ставляться.
2. Параметри виду addr inout.
У Borland Pascal такі параметри називаються параметр-змінними. При описі заголовків процедур/функцій перед ідентифікаторами парамет-ров-переменных ставиться ключове слово var.
3. Параметри виду addr in.
У Borland Pascal такі параметри називаються параметрами-константами. При описі заголовків процедур/функції перед ідентифікаторами параметрів-констант ставиться ключове слово const.
Перших два різновиди параметрів (параметри-значення і парі-метрі-змінні) є стандартними для всех реалізації і версій мови Pascal. Третій різновид (параметри-константи) є нововведенням мови Borland (Turbo) Pascal версії 7.0.
Параметра-значення
Заголовок процедури з описаними параметрами-значеннями має такий вид:
procedure MyProc ( Parl, Par2 : Typel; РагЗ, Раг4 : Турі2 ) ;
Механізм роботи параметрів-значень упрощенно можна представити такою схемою:
Як фактичне параметр-значення можуть використовуватися як змінні, так і константи різних типів. Не допускаються тільки файлові типи і типи, що спираються на файловий.
Параметр-змінні
Заголовок процедури з описаними параметр-змінними має такий вид:
procedure MyProc ( var Parl, Par2 : Typel; таг РагЗ, Раг4 : Турі2 );
Механізм роботи параметр-змінних упрощенно можна представити такою схемою:
У якості фактичного параметр-змінної можуть використовуватися змінні будь-яких типів, включаючи файлові й опирающиеся на файловий, але зате використання констант не допускається.
Параметра-константи
Заголовок процедури з описаними параметрами-константами має такий вид:
procedure MyProc (const Parl, Par2 : Type1; const РаrЗ, Раr4 : Турі2 );
Механізм роботи параметрів-констант упрощенно можна представити такою схемою:
Як фактичну параметр-константу можуть використовуватися як змінні, так і константи різних типів. Не допускаються тільки файлові типи і типи, що спираються на файловий. Крім того, забороняється виконувати присвоювання формальним параметрам-константам і формальним параметрам-константам не можуть передаватися як фактичні параметри іншим процедурам/функціям.
Параметра-константи доцільно використовувати у випадках, якщо потрібно передавати структури даних, що займають великий розмір пам'яті, але змінювати вихідні значення параметрів з алгоритмічної точки зору недопустимо. У результаті ощадливо використовується оперативна пам'ять і одне тимчасово гарантується цілісність вихідних даних.
Бестиповые параметри
Бестиповые параметри можуть передаватися тільки за адресою, тобто як параметрі-змінні чи як параметра-константи. Головною особливістю бестиповых параметрів є відсутність указівки типу параметра в заголовку процедури.
Заголовок процедури з описаними бестиповыми параметрами при різних способах передачі має такий вид:
procedure МуРгос (var Par1, Par2; const Par3,Par4 );
Однак варто пам'ятати, що унаслідок відсутності типу, не можна використовувати бестиповые формальні параметри так само, як і типизованные. Перед використанням потрібно виконати приведення формального бестипового параметра до якого-небудь типу.
Бестиповые параметри більш гнучкі в роботі, чим типизованные, але відповідальність за їхнє коректне застосування покладається на програміста, тому що компілятор не може перевірити сумісність типів.
Як приклад розглянемо програму, у якій використовуються універсальні процедури введення, висновку і сортування одномірних масивів будь-якої розмірності, елементи якого можуть бути будь-як типу, що є поддиапазоном типу Byte.
При цьому кожен масив займає в пам'яті рівно стільки місця, скільки йому потрібно.
Більш того, процедура SortVector може з успіхом використовуватися для сортування масивів типу Char, тому що коди символів ASCII не виходять за межі значень типу Byte. Процедури InpVector і PrintVector для символьних масивів не підходять тому, что вони орієнтовані на введення-висновок числових значень, що виконується інакше, чим уведення-висновок символів.
Відкриті параметри-масиви
У заголовку процедури відкриті параметри-масиви описуються в такий спосіб:
procedure Open Vector ( Vector: array of Type Vector );
Відкритий параметр-масив може бути параметром-значенням, чи константою параметр-змінної.
Передані фактичні параметри повинні по типі збігатися з описаним типом Type Vector, але по розмірності вони можуть бути різними: как простий змінний типу Турі Vector, так і масивом будь-якої розмірності.
Гнучкість при передачі масивів різної розмірності отримана за рахунок однаковості представлення цих масивів как формальних параметрів. Усі формальні відкриті параметри-масиви в рамках процедури автоматично описуються як масиви з нульовою базою (нульовою нижньою границею) зазначеного в заголовку типу:
array [ 0..N-1 ] of TypeVector;
де N – число елементів у фактичному параметрі.
Іншими словами, щирий діапазон зміни індексу фактичного параметра-масиву відображається в діапазон зміни індексу від 0 до N–1.
Для визначення характеристик переданого фактичного параметра-масиву в тілі процедури використовуються стандартна функція Low, що завжди повертає 0, стандартна функція High, що повертає індекс останнього елемента у формальному параметрі-масиві, і функція SizeOf, що повертає розмір фактичного параметра-масиву.
За допомогою відкритих параметрів-масивів можна вирішувати проблеми, аналогічні розглянутий у попередньому прикладі. Однак відкриті параметри-масиви мають меншу гнучкість, чим бестиповые параметри, оскільки в даному випадку як фактичні параметри можуть бути масиви только одного типу.
Для порівняння з використанням безтипових параметрів, приведемо для відкритих параметрів-масивів таку ж програму, як у попередньому прикладі.
ПРОЦЕДУРНІ ДИРЕКТИВИ
Директиви near і far
Директиви near і far вказують компілятору відповідно до якої моделі виклику процедур – ближньої (near) чи далекої (far) – потрібно генерувати вихідний код. При ближній моделі виклик виконується швидше, при далекої — повільніше. Однак область дії ближніх викликів обмежена рамками только того модуля, у якому описана викликувана процедура.
Директиви near і far вказуються в описі процедури(функції) перед ее блоком.
Function SH( X: Real): Real; far;
begin
SH:= (Exp(X)-Exp(-X)) / 2;
end;
Керувати генерацією вихідного коду відповідно до зазначених моделей викликів можна також директивою компілятора {$F+}. Процедури і функції, компилируемые в стані {$F+}, завжди будуть мати далекий тип виклику (far), а в стані {$F-} компілятор автоматично вибирає коректну модель. За замовчуванням використовується директива {$F-}.
Директива forward
Директива forward використовується для, так називаного, випереджального опису процедур і функцій, що використовується для реалізації взаємної рекурсії двох процедур, а також для поліпшення структурованості тексту і підвищення его читабельності.
Директива interrupt
Директива interrupt складе для опису процедур переривання. У заголовку процедури переривання як параметри повинні бути описані імена регістрів.
Procedure Intrpt (Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt;
Якщо деякі з параметрів у процедурі не використовуються, то вони можуть бути опущені. Однак змінювати взаиморасположение імен регістрів у списку параметрів не допускається.
Директива export
Директива export описує чи процедуру функцію как експортовану.
Директива external
Директива external призначена для зв'язування окремо скомпільованих процедур і функцій, що написані мовою ассемблера, а також для опису процедур, імпортованих з динамічно компонуемых бібліотек.
Директива assembler
Директива assembler також, як і директива external, використовується для опису процедур мовою ассемблера. На відміну від її директива assembler не використовується в описах динамічно компонуемых бібліотек.
Директива inline
Директива inline надає програмісту можливість записувати команди безпосередньо в машинному коді.
Контрольні питання
1. Який вид має структура опису процедури і функції?
2. У чому складається відмінність опису процедури і функції?
3. Що таке область дії ідентифікаторів?
4. Які основні правила визначення області дії для ідентифікаторів процедур і функцій?
5. Які параметри називаються формальними і які — фактичними?
6. По яких ознаках розрізняються параметри?
7. Які способи передачі параметрів теоретично припустимі?
8. Які способи передачі параметрів реалізовані в Borland Pascal?
9. Які правила передачі параметрів-значень?
10. Які правила передачі параметр-змінних?
11. Які правила передачі параметрів-констант?
12. У чому особливості бестиповых параметрів?
13. У чому розходження відкритих параметрів-масивів і бестиповых параметрів?
14. Для чого призначені директиви near і far?
15. У чому особливості використання директиви forward?
16. Яка директива призначена для опису процедур переривання?
17. Які директиви використовуються для опису процедур мовою ассемблера?
18. Що дозволяє директива inline?
ПРАКТИЧНА РОБОТА №4
Масиви. Опис масивів. Алгоритми пошуку та сортування масивів.
Масиви являють собою обмежену упорядковану сукупність однотипних величин. Кожна окрема величина називається компонентом масиву. Тип компонентів може бути кожним, прийнятим у мові ПАСКАЛЬ, крім файлового типу. Тип компонентів називається базовим типом.
Уся сукупність компонентів визначається одним ім'ям. Для позначення окремих компонентів використовується конструкція, названа змінною чи індексом :
A[5] S[k+1] B[3,5].
Як індекс може бути використаний вираз. Тип індексів може бути тільки інтервальним чи що перелічується. Дійсний і цілий типи неприпустимі. Індекси інтервального типу, для якого базовим є цілий тип, можуть приймати негативні, нульове і позитивні значення. В операторній частині програми один масив може бути привласнений іншому, якщо їхні типи ідентичні . наприклад:
R1:=Z.
Для введення виведення масиву в список чи виведення висновку міститься змінна з індексом, а оператори чи уведення висновку виконуються в ициклі.
Перший індекс визначає номер рядка, другий - номер стовпця.
Двовимірні масиви зберігаються в пам'яті ЕОМ по рядках.
Ініціалізація масивів (присвоєння початкових значень усіх компонентів масивів) здійснюється двома способами.
Перший спосіб - з використанням типізованих констант, наприклад:
type Dim10= Array[1..10] of Real;
const
raM10: Dim10 = ( 0, 2.1, 4, 5.65, 6.1, 6.7, 7.2, 8, 8.7, 9.3 );
При ініціалізації двовимірних масивів значення компонент кожного з вхідних у нього одномірних масивів записується в дужках:
type Dim3x2= Array[1..3,1..2] of Integer;
const
iaM3x2: Dim3x2= ( (1, 2)
(3, 4)
(5, 6) );
Другий спосіб ініціалізації - використання різновиду процедури FillChar:
FillChar( var V; NBytes: Word; B: Byte );
Ця процедура заповнює ділянку пам'яті однобайтовим значенням. Наприклад, для обнулюння масиву A[1..10] of Real можна записати:
FillChar(A, 40, 0); чи FillChar(A, SizeOf(A), 0);
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ
1. Дано натуральне число n, дійсна матриця розміру n9. Знайти середнє арифметичне кожного рядка.
2. Дана дійсна матриця розміру 18n. Знайти значення найбільшого за модулем елемента матриці, а також індекси якого-небудь елемента за знайденим значенням модуля.
3. Дана дійсна матриця розміру mn. Знайти суму найбільших значень елементів її рядків.
4. Дана дійсна матриця розміру mn. Переставити рядки матриці за зростанням сум елементів рядків.
5. Дана дійсна матриця розміру mn. Переставити стовпці матриці за спаданням значень перших елементів стовпців.
ПРАКТИЧНА РОБОТА №5
Рядкові величини
Рядкові змінні – це одномірні масиви символів, для опису яких у TURBO PASCAL введений тип String.
Наприклад, якщо рядок містить до 30 символів, її тип буде визначений як type s= String[30];
Довжина рядка не може містити більш, ніж 255 символів.
У TURBO PASCAL визначене поняття рядка змінної довжини, у цьому випадку її опис задається як type s= String;
Тип String без вказівки довжини сумісний з усіма типами рядків.
Особливістю рядкових змінних є те, що до них можна звертатись як до скалярної змінної, так і до масивів. В іншому випадку застосовується конструкція "змінна з індексом", що забезпечує доступ до окремих символів рядка. При цьому нижня границя індекса дорівнює 1. Окремий символ рядка має тип Char.
У пам'яті ЕОМ рядок займає кількість байтів, на одиницю більше її довжини. Нульовий байт рядка містить її довжину.
Для рядків визначені операції присвоювання, злиття (конкатенації) і порівняння.
Для порівняння рядків застосовуються всі операції відношень. Порівняння рядків відбувається посимвольно, починаючи з першого символу. Рядки рівні, якщо мають однакову довжину і посимвольно еквівалентні.
Рядки можуть бути елементами списку введення - виведення, при цьому записується ім'я рядка без індексу.
При введенні рядкових змінних кількість символів, що вводяться, може бути менше, ніж довжина рядка. У цьому випадку символи, що вводяться, розміщуються з початку рядка, а байти, що залишилися, заповнюються пробілами. Якщо кількість символів, що вводяться, перевищує довжину рядка, зайві символи відкидаються.
Ініціалізація рядків може вироблятися як за допомогою типізованих констант:
const sName: String[9]= 'IBM PC/AT';
так і з використанням другого різновиду функції FillChar:
FillChar( var V; NBytes: Word; C: Char );
наприклад:
FillChar(A, SizeOf(A), '0');
Для роботи з рядками в TURBO PASCAL включені процедури і функції, що забезпечують редагування і перетворення рядків Copy, Concat, Delete, Insert, Length, Pos.
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ
1. Дано символи S1,…, Sn. Видалити з даної послідовності всі групи букв виду abcd.
2. Дано символи S1,…, Sn. Перетворити послідовність S1,…, Sn, замінивши в ній всі знаки оклику крапками.
3. Дано символи S1,…, Sn. Підрахувати скільки разів серед даних символів зустрічається символ “+” і скільки разів символ “*”.
4. Дано символи S1,…, Sn, серед яких є двокрапка. Підрахувати всі символи, розміщені після першої двокрапки.
5. Дано символи S1,…, Sn. Перетворити послідовність S1,…, Sn, видаливши кожний символ “*” і повторивши кожен символ, відмінний від “*”.
ПРАКТИЧНА РОБОТА №6
Множини. Опис множин, операції над множинами.
Поняття множнин в мові ПАСКАЛЬ ґрунтується на математичному уявленні про множини: це обмежена сукупність різних елементів. Для по¬бу¬до¬ви конкретного множинного типу використовується, перелічуваний чи ін¬тер¬вальний тип даних. Тип елементів, з яких складається множина, називається ба¬зо¬вим типом.
Множинний тип описується за допомогою службових слів Set of, наприклад:
type M= Set of B;
Тут М – множинний тип, B – базовий тип.
Приклад опису змінної множинного типу:
Type M= Set of 'A'..'D';
Var MS: M;
Приналежність змінних до множинного типу може бути визначена прямо в розділі опису змінних:
var C: Set of 0..7;
Константи множинного типу записуються у виді вкладеної в квадратні дужки по¬слі-дов¬ності елементів чи інтервалів базового типу, розділених комами, наприклад: ['A', 'C'], [0, 2, 7], [3, 7, 11..14].
Константа виду [ ] означає порожню підмножину.
Множина містить у собі набір елементів базового типу, усі підмножини даної множини, а також порожня підмножину. Якщо базовий тип, на якому будується множина, має K елементів, то число підмножин, що входять у цю множину, дорівнює 2k . Нехай є змінна Р інтервального типу: var P: 1..3;
Ця змінна може приймати три різних значення – або 1, 2, або 3.
Змінна Т множинного типу var T: Set of 1..3; може приймати вісьмох різних значень:
[ ] [1] [2][3][1,2][1,3][2,3] [1,2,3]
Порядок перерахування елементів базового типу в константах безладний.
Значення змінної множинного типу може бути задане конструкцією виду [T], де T – змін¬на базового типу.
До змінного і константам множинного типу застосовні операції присвоювання(:=), об'єд¬нання(+), перетин(*) і різниця (-):
['A','B'] + ['A','D'] дасть ['A','B','D']
['A'] * ['A','B','C'] дасть ['A']
['A','B','C'] - ['A','B'] дасть ['C'].
Результат виконання цих операцій є величина множинного типу.
До множинних величин застосовні операції: тотожність (=), нетотожність (<>), міс¬тить-ся в (<=), містить (>=). Результат виконання цих операцій має логічний тип, наприклад:
['А','В'] = ['А','С'] дасть FALSE
['А','В']<>['А','С'] дасть TRUE
['В']<=['В','С'] дасть TRUE
['С','D']>=['А'] дасть FALSE.
Крім цих операцій для роботи з величинами множинного типу в мові ПАСКАЛЬ ви¬ко-ри¬стовується операція in – приналежність елемента, що перевіряється, базового типу, стоїть лі¬во¬руч від знака операції, до множини, що стоїть праворуч від знака операції. Результат ви-ко¬нан¬ня цієї операції – булевий. Операція перевірки належності елемента множині часто ви-ко¬ристовується замість операцій відношень, наприклад:
A in ['А', 'В'] дасть TRUE,
2 in [1, 3, 6] дасть FALSE.
При використанні в програмах даних множинного типу виконання операцій відбувається над бітовими рядками даних. Кожному значенню множинного типу в пам'яті ЕОМ відповідає один двійковий розряд. Наприклад, множина
['А','В','С','D'] представлена в пам'яті ЕОМ бітовим рядком 1 1 1 1.
Підмножини цієї множини представлені рядками:
['A','B','D'] 1 1 0 1
['B','C'] 0 1 1 0
['D'] 0 0 0 1
Величини множинного типу не можуть бути елементами виведення.
У кожній конкретній реалізації транслятора з мови ПАСКАЛЬ кількість елементів ба-зо¬вого типу, на якому будується множина, обмежена. У TURBO PASCAL кількість базових еле¬ментів не повинна перевищувати 256.
Ініціалізація величин множинного типу виробляється за допомогою типізованих кон-стант:
const seLit: Set of 'A'..'D'= [];
Проілюструємо застосування даних множинного типу на прикладі.
Приклад. Скласти програму, що виконує і виводить на екран дисплея набори ви¬пад¬ко-вих чисел для гри в "Спортлото 5 з 36".
Для заповнення кожної картки спортлото необхідно одержати набір з п'яти випадкових ч謬сел. До цих чисел пред'являються дві вимоги:
– числа повинні знаходитися в діапазоні 1..36;
– числа не повинні повторюватися.
Program Lotto;
Var nb, k: Set of 1..36;
kol, l, i, n: Integer;
begin
Randomize;
WriteLn('Задайте kol');
ReadLn(kol);
nb:=[1..36];
for i:=1 to kol do
begin
k:=[];
for l:=1 to 5 do
begin
repeat
n:=Random(36)
until (n in nb) and not (n in k);
k:=k+[n]; Write(n:4)
end;
WriteLn
End
end.
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ
1. З рядка тексту вилучити символи r,m,d,w;
2. Визначити чи виграли картки „Спортлото”, якщо вони подані масивом
array [1..5,1..20] of integer;
3. З рядка тексту відібрати голосні літери.
4. З масиву цілих чисел відібрати прості сформувати з них множину.
5. З масиву дійсчних чисел відібрати цілі сформувати з них множину.
ПРАКТИЧНА РОБОТА №7
Записи. Опис комбінованих типів. Записи з варіантами.
Запис – це сукупність обмеженого числа логічно зв'язаних ком¬понентів, що належать до різ¬них типів. Компоненти запису називаються по¬лями, кожне з яких визначається ім'ям. Поле за¬пису містить ім'я поля, слідом за яким через двокрапку вказується тип цього поля. Поля за¬пису можуть відноситися до будь-якого типу, що допускається в мові Паскаль, за винятком фай¬лового типу.
Опис запису в мові ПАСКАЛЬ здійснюється за допомогою службового слова RECORD, слідом за яким описуються компоненти запису. Завершується опис запису службовим сло¬вом END.
Наприклад, записна книжка містить прізвища, ініціали і номери телефонів, тому кож-ний окремий рядок у записній книжці зручно представити у вигляді наступноого запису:
type row=record
FIO: string[20];
TEL: string[7]
end;
var str:row;
Опис записів можливий і без використання імені типу, наприклад:
var str: record
FIO: string[20];
TEL: string[7]
end;
Звертання до запису в цілому допускається тільки в операторах при¬свою¬ван¬ня, де ліво-руч і праворуч від знака присвоювання використовуються імена зବписів однакового ти¬пу. У всіх інших випадках оперують окремими полями за¬пи¬сів. Щоб звернутися до ок¬ре¬мо¬го ком-по¬нента запису, необхідно задати ім'я запису і через крапку вказати ім'я потрібного поля, на¬приклад:
str.FIO, str.TEL
Таке ім'я називається складеним. Компонентом запису може бути також запис, у такому випадку складене ім'я буде містити не два, а більшу кількість імен.
Звертання до компонентів записів можна спростити, якщо користуватися оператором приєднання with. Він дозволяє замінити складені імена, що характеризують кожне поле, на прості імена полів, а ім'я запису визначити в операторі приєднання:
with M do OP;
Тут М – ім'я запису, ОР – оператор, простий чи складений.
Оператор ОР являє собою область дії оператора приєднання, у межах якої можна не використовувати складені імена.
Ініціалізація записів здійснюється за допомогою типізованих констант:
type
RecType= Record
x,y: Word;
ch: Char;
dim: Array[1..3] of Byte
end;
const
Rec: RecType= ( x: 127; y: 255; ch: 'A'; dim: (2, 4, 8) );
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ
1. Інформація про пісні подана у вигляді: назва, виконавець, час. Скласти програму, яка впорядковує дані за вибором користувача по полям, а також за спаданям чи зростанням.
2. Відомості про студента складаються з його імені і прізвища і та номера групи, в якому він навчається. З'ясувати, чи є студенти, що мають однакові прізвища і надукувати їх, вказуючи групу.
3. type dekart=record x,y:real end;
polar=record r,f:real end; {r.0,p<f<p}
Описати процедуру DP(d,p), що перетворює координати точки на площині з декартових d в полярні p, PD(p,d), що виконує зворотнє перетворення.
4. Скласти програму друку документу "Екзаменаційна відомість" (предмет, номер групи, дата екза¬мену, 25 рядків з полями: прізвище студента, номер залікової книжки, оцінка за екзамен).
ПРАКТИЧНА РОБОТА № 8. ФАЙЛИ
ФАЙЛИ
Введення файлового типу в мову ПАСКАЛЬ викликано необхідністю за¬безпечити можливість роботи з периферійними (зовнішніми) пристроями ЕОМ, призначеними для введення, виведення і збереження даних.
Файловий тип чи даний файл визначає впорядковану сукупність довільно¬го числа однотипних компонентів.
Загальна властивість масиву, множини і запису полягає в тім, що кількість їхніх компонентів визначено на етапі написання програми, тоді як кількість компонентів файлу в тексті програми не визначається і може бути довільним.
Поняття файлу досить широке. Це може бути звичайний файл на диску, ко-мунікаційний порт ЕОМ, пристрій друку, чи клавіатура або інші пристрої.
При роботі з файлами виконуються операції введення-виведення. Операція введення означає перепис даних із зовнішнього пристрою (із вхідного файлу) в основну пам'ять ЕОМ, операція виведення - це пересилання даних з основної пам'яті на зовнішній пристрій (у вихідний файл).
Файли на зовнішніх пристроях часто називають фізичними файлами. Їхні імена визначаються операційною системою. У програмах мовою Пас¬каль імена файлів задаються за допомогою рядків. Наприклад, ім’я файлу на диску може мати вид: "C:\ A", "A:\ Lab1.DAT', "В:\С150\pr.раs", "lаb3.раs".
Операційна система МS-DОS не робить особливого розходження між фай¬лами на дисках і стрічках і пристроями ЕОМ і портами комунікацій. У ТURВО РАSСАL можуть використовуватися імена пристроїв і портів, визначенні в МS-DОS, наприклад: "СОN", "LРТ1", "РRN", "СОМ1", "АUХ", "NUL".
З файловою системою ТURВО РАSСАL зв'язане поняття буфера введення-виведення. Введення і виведення даних здійснюється через буфер. Буфер — це область у пам'яті, що виділяється для кожного файлу. При записі в файл вся інформація спочатку направляється в буфер і там накопичується доти, поки весь обсяг буфера не буде заповнений. Тільки після цього чи після спеціальної ко¬манди скидання відбувається передача даних на зовнішній пристрій. При чи¬танні з файлу, дані спочатку зчитуються у буфер, причому даних зчитується не стільки, скільки запитується, а скільки поміститься в буфер.
Механізм буферизації дозволяє більш швидко й ефективно обмінюватись інформацією з зовнішніми пристроями.
Для роботи з файлами в програмі необхідно визначити файлову змінну. ТURВО РАSСАL підтримує три файлових типи: текстові файли, компонентні файли, безтипові файли.
Опис змінних файлів текстового типу здійснюється за допомогою службо¬вого слова Техt, наприклад:
vаr tStоrу : Теxt;
Опис компонентних файлів має вид:
vаr fСоmр : File оf Т; де Т - тип компонента файлу.
Приклади опису файлової змінної компонентного типу:
tуре М = аrrау [1..500] оf LоngInt;
vаr f1 : Filе оf Rеаl;
f2 : File оf Integer;
fLі: File оf М;
Безтипові файли описуються за допомогою службового слова File:
vаr f: File;
Файлові змінні, котрі описані в програмі, називають логічними файлами. Всі основні процедури і функції, що забезпечують введення-виведення даних, працюють тільки з логічними файлами. Фізичний файл повинний бути зв'язаний з логічним до виконання процедур відкриття файлів.
TURBO PASCAL вводить ряд процедур і функцій, застосованих для будь-яких типів файлів: Assign, Reset, Rewrite, Сlose, Rename, Еrase, Еоf, IOResult.
Процедура Assign (var f; FileName:String) зв'язує логічний файл f з фізичним файлом, повне ім'я якого задано в рядку FileName.
Процедура Reset(var f) відкриває логічний файл f для наступного читання даних чи, як говорять, відкриває вхідний файл. Після успішного виконання про¬цедури Reset файл готовий до читання з нього першого елемента.
Процедура Rewrite(var f) відкриває логічний файл f для післязапису, що дає, дані (відкриває вихідний файл). Після успішного виконання цієї процедури файл готовий до запису в нього першого елемента.
Файл до моменту виклику процедури Erase повинний бути закритий. Про¬цедура С1оsе(var f) закриває відкритий до цього логічний файл. Виклик проце¬дури Сlose необхідний при завершенні роботи з файлом.
Якщо з якоїсь причини процедура Сlose не буде виконана, файл усе ж буде створений на зовнішньому пристрої, але вміст останнього буфера в нього не бу¬де перенесено. Для вхідних файлів використання оператора закриття файлу не¬обов'язково.
Логічна функція ЕОF(var f:Вооlеаn) повертає значення ТRUE, коли при читанні досягнутий кінець файлу. Це означає, що вже прочитаний останній еле¬мент чи файл після відкриття виявився порожній.
Процедура Rеnаmе(var f; NewName:String) дозволяє перейменувати фізичний
файл на диску, зв'язаний з логічним файлом f. Перейменування можливо
після закриття файлу.
Процедура Erase(var f) знищує фізичний файл на диску, який був зв'язаний з файловою змінною f.
Функція ІОResult:Integer повертає ціле число, що відповідає коду остан¬ньої помилки введення-виведення. При нормальному завершенні операції функція поверне значення 0. Значення функції ІОResult необхідно привласнити змінній, тому що при кожному виклику функція обнуляє своє значення. Функція IOResult працює тільки при виключеному режимі перевірок помилок введення чи виведення з ключем компіляції {$I-}.
ТЕКСТОВІ ФАЙЛИ
Особливе місце в мові ПАСКАЛЬ займають текстові файли, компоненти, яких мають символьний тип. Для опису текстових файлів у мові визначено стандартний тип Техt:
vаr ТF1, ТF2: Техt;
Текстові файли являють собою послідовність рядків, а рядки — послідов¬ність символів. Рядки мають змінну довжину, кожен рядок завершується оз¬накою кінця рядка.
З ознакою кінця рядка зв'язана функція ЕОLn (vаr Т:Техt):Вооlеаn, де Т — ім'я текстового файлу. Ця функція приймає значення True, якщо досягнути кінець рядка, і значення False, якщо кінець рядка не досягнутий.
Для операцій над текстовими файлами, крім перерахованих, визначенні також оператори звертання до процедур:
Readln(T)- пропускає рядок до початку наступного;
Writeln(Т)-завершує рядок файла, у якому відбувається запис, є ознакою кінця рядка і переходить до початку наступного.
Для роботи з текстовими файлами введена розширена форма операторів введення і виведення. Оператор Read(Т,Х1,Х2,...ХК) еквівалентний групі опера¬торів:
begin
Read(T,X1);
Read(T,X2);
............
Read(T,XK);
end;
Тут Т-текстовий файл, а змінні X1, Х2,...ХК можуть бути змінними цілого, дійсного чи символьного типу, або рядком. При зчитуванні значень змінних з файлу вони перетворюються з текстового представлення в машинне.
Оператор Write(Т,Х1,Х2,...ХК) еквівалентний групі операторів:
begin
Write(T,X1);
Write(T,X2);
............
Write(T,XK);
end;
До текстових файлів відносяться стандартні файли INPUT, ОUTPUТ. Розглянуті раніше оператори введення-виведення є часткою операторів об¬міну з текстовими файлами, коли використовуються стандартні файли введення-виведення Input, OutPut.
Робота з цими файлами має особливості:
- імена цих файлів у списках введення-виведення не вказуються;
- застосування процедур Reset, Rewrite і Сlоsе до стандартних файлів введення-виведення заборонено;
- для роботи з файлами Input, Оutput введений різновид функції EOln без параметрів.
TURBO PASCAL вводить додаткові процедури і функції, застосовні тільки до текстових файлів, це SetTextBuf, Арреnd, Flush, SeekЕOln, SеекЕОF.
Процедура SetTextBuf (var f: Техt; var Вuf; ВufSize:Word) служить для збільшення чи зменшення буфера введення-виведення текстового файлу f. Зна¬чення розміру буфера для текстових файлів за замовчуванням дорівнює 128 байтів. Збільшення розміру буфера скорочує кількість звертань до диска. Рекомендується змінювати розмір буфера до відкриття файлу. Буфер файлу почнеться з першого байта змінної Вuf. Розмір буфера задається в необов'язковому
параметрі ВufSize, а якщо цей параметр відсутній, розмір буфера визначається довжиною змінної Вuf.
Процедура Append (var: Теxt) служить для спеціального відкриття вихід¬них файлів. Вона застосовна до вже існуючих фізичних файлів і відкриває для запису файл в кінці.
Процедура Flush(var f:Техt):Boolean застосовується до відкритих вихідних файлів. Вона примусово записує дані з буфера у файл незалежно від ступеня його заповнення.
Функція SeekEOLn(var f:Text) повертає значення Тrue, якщо до кінця рядка залишилися тільки пробіли.
Функція SeekEOF(vаr f: Техt):Вооlеаn повертає значення Тrue, якщо до кінця файлу залишилися рядки, заповнені пробілами.
КОМПОНЕНТНІ ФАЙЛИ
Компонентний чи типізований файл —це файл з оголошеним типом його компонентів. Компонентні файли складаються з машинних представлених значень змінних, вони зберігають дані в тім же виді, що і пам'ять ЕОМ. Опис величин файлового типу має вигляд:
Tуре М= File of T; де М - ім'я файлового типу, Т-тип компонента.
Наприклад:
Type
FIO= String[20];
SPISOK=File оf FIО;
var
STUD, РRЕР: SРІSОК;
Тут STUD, РRЕР імена файлів, компонентами яких є рядки. Опис файлів можна задавати в розділі опису змінних:
vаr
fs imv: File of Char;
fr: File оf Rеаl;
Компонентами файлу можуть бути всі скалярні типи, а із структурованих - масиви, множини, записи. Практично у всіх конкретних реалізаціях мови ПАСКАЛЬ конструкція "файл файлів" неприпустима.
Всі операції над компонентними файлами виробляються за допомогою стандартних процедур: Reset, Rewrite, Read, Write, Сlose.
Для введення-виведення використовуються процедури:
Read(f, X);
Write(f, X);
де f — ім'я логічного файлу, X - або змінна, або масив, або рядок, або множина, або запис з таким же описом, який має компоненти файлу.
Виконання процедури Read(f,Х) складається з читання з зовнішнього пристрою однієї компоненти файлу і запису її в X. Повторне застосування процедури Read(f,Х) забезпечить читання наступного компонента файлу і запис її в Х.
Виконання процедури Write(f,Х) складається з запису X на зовнішній пристрій як однієї компоненти. Повторне застосування цієї процедури забезпечить запис X як наступного компонента файлу.
Для роботи з компонентними файлами введена розширена форма операторів введення і виведення:
Read(f,X1,Х2...ХК)
Write(f,Х1,X2,...ХК)
Тут f- компонентний файл, а змінні XI, Х2,...ХК повинні мати ж тип, що й оголошений тип компонентів файлу f.
БЕЗТИПОВІ ФАЙЛИ
Безтипові файли дозволяють записувати на диск довільні ділянки пам’яті ЕОМ і зчитувати їх з диска в пам'ять. Операції обміну з безтиповим й файлами здійснюється за допомогою процедур BlockRead і ВІоскWrite. Крім того, вводиться розширена форми процедур Reset і Rewrite. В іншому принципи роботи залишаються такими ж, як і з компонентними файлами.
Перед використанням логічний файл
vаr f: File;
повинний бути зв'язаний з фізичним за допомогою процедури Assign. Далі файл повинний бути відкритий для читання чи для запису процедурою Reset чи Rewrite, а після закінчення роботи закритий процедурою Сlоsе.
При відкритті файлу довжина буфера встановлюється за замовчуванням у 128 байт. Turbo Pascal дозволяє змінити розмір буфера введення -виведення, для чого варто відкривати файл розширеним записом процедур
Reset(var f: File; BufSize:Word)
чи
Rewrite(vаr f: Fі1е; BufSize: Word)
Параметр ВufSize задає число байтів, що зчитуються з файлу, що записані у нього за одне звертання. Мінімальне значення BufSize - 1 байт, максимальне - 64 Кбайт.
Читання даних з безтипового файлу здійснюється процедурою
ВlockRead(var: File; vаr Х; Соunt: Word; vаr QuantВІоск: Word );
Ця процедура здійснює за одне звертання читання в змінну X кількості блоків, задана параметром Соunt, при цьому довжина блоку дорівнює довжині буфера. Значення Count не може бути менше 1. За одне звертання не можна прочитати більше, ніж 64 Кбайт.
Необов'язковий параметр QuantВІоск повертає число блоків (буферів), прочитаних поточною операцією ВlockRead. У випадку успішного завершення операції читання QuantВlоск = Соunt, у випадку аварійної ситуації параметр QuantBlock буде містити число вдало прочитаних блоків. Звідси випливає, що за допомогою параметру QuantВІоск можна контролювати правильність виконання операції читання.
Запис даних у безтиповий файл виконується процедурою:
ВlоскWrite ( var f: File; var Х, Соunt:Word; var QuantBlock: Word);
яка здійснює за одне звертання запису з змінної Х кількість блоків, задане параметром Соunt, при цьому довжина блоку дорівнює довжині буфера.
Необов'язковий параметр QuantBlock повертає число блоків (буферів X записаних успішно поточною операцією В1оскWrite.
ПОСЛІДОВНИЙ І ПРЯМИЙ ДОСТУП
Зміст послідовного доступу полягає в тім, що в кожен момент часу доступний лише один компонент із усієї послідовності. Для того, щоб звернутися (одержати доступ) до компонента з номером K+1, необхідно переглянути від початку файлу K-1 попереднього компоненту. Після звертання до компонента з номером K можна звертатися до компонента з номером K+1. 3відси випливає, що процеси формування (запису) компонентів файлу і перегляду (читання) не можуть довільно чергуватися. Таким чином, файл спочатку будується за допомогою наступного додавання компонентів у кінець, а потім може послідовно проглядатися від початку до кінця.
Розглянуті раніше засоби роботи з файлами забезпечують наступний доступ. Turbo Pascal дозволяє застосовувати до компонентного і безтипового файла, записані на диску, способи прямого доступу. Прямий доступ дає можливість заздалегідь визначити у файлі блок, до якого буде застосовано операцію введення -виведення. У випадку безтипового файлу блок дорівнює розміру буфера, для компонентних файлів блок - це одна компонента файлу.
Прямий доступ припускає, що файл являє собою лінійну послідовність блоків. Якщо файл містить n блоків, то вони пронумеровується від 1 через 1 до n. Крім того, вводиться поняття умовної границі між блоками, при цьому
умовна границя з номером 0 розташована перед блоком з номером 1, границя з номером 1 розташована перед блоком з номером 2 і, нарешті, умовна границя з номером n знаходиться після блоку з номером n+1.
Реалізація прямого доступу здійснюється за допомогою функцій і процедур FileSize, FilePos, Seek і Truncate.
Функція FileSize (vаr f: LongInt) повертає кількість блоків у відкритому файлі f.
Функція FilePos(vаr f: LongInt) повертає поточну позицію в файлі f. Позиція у файлі —це номер умовної границі. Для, тільки що, відкритого файлу поточною позицією буде границя з номером 0. Це означає, що можна записати чи прочитати блок з номером 1. Після читання чи запису першого блоку поточна позиція переміститься на границю з номером 1, і можна буде звертатися до блоку з номером 2. Після прочитання останнього запису значення FilePos дорівнює значенню FileSize.
Процедура Sеек (vаr f, N:LongInt) забезпечує призначення поточної позиції у файлі (позиціонування). У параметрі N повинен бути заданий номер умовної границі, що передує блоку, до якого буде приводитися наступне звернення. Наприклад, щоб працювати з блоком 4, необхідно задати значення N, рівне 3. Процедура Sеек працює з відкритими файлами.
Процедура Truncate (var f) встановлює в поточній позиції ознаку кінця файлу і знищує усі наступні блоки.
Приклад. Нехай на НМД є текстовий файл ID.DAT, що містить числові значення дійсного типу по два числа в кожному рядку — значення аргументу і функції відповідно. Кількість пар чисел не більш 200. Скласти програму, що читає файл, значення аргументу і функції записує в одномірні масиви, підраховує їхню кількість, виводить на екран дисплея і записує у файл компонентного типу RD.DАТ.
Рrogram F;
var rArg, rF: Array[1..200] of Real;
inf : Техt;
outf: file of Real;
n,I : Integer:
begin
Assign(inf, ‘ID.DAT’);
Assign(outf, ’RD.DAT’);
Reset(inf);
Rewrite(outf)
n:= 0
while not EOF(inf) do
begin
n:=n+1;
Readln(inf, rArg[n],rF[n])
end;
for I:=1 to n dо
begin
Writeln(I:2, rArg[ I ]:8:2 rF[I]:8:2);
Write(outf, rArg[I], rF[I]);
end;
close(outf);
end.
ЗАВДАННЯ ДО РОЗВ’ЯЗАННЯ
1. Дано файл f, компонентами якого є дійсні числа. Знайти суму компонент файла f.
2. Дано файл f, компонентами якого є дійсні числа. Знайти найбільше зі значень модулів компонент з парними номерами.
3. Дано файл f, компонентами якого є цілі числа. Знайти кількість квадратів непарних чисел серед компонент.
4. Дано символьний файл f. Записати в файл g компоненти файлу f в зворотному порядку.
5. Дано файл f, компонентами якого є цілі числа. Отримати в файлі g всі компоненти файлу f, які діляться на 3 і не діляться на 7.
ПРАКТИЧНА РОБОТА № 9. МОДУЛІ
Модулі. Структура модуля.
ТЕОРЕТИЧНІ ПИТАННЯ
1. Структура модуля у BORLAND PASCAL
2. Директива під’єднання include.
3. Директиви asm, assembler, extrernal.
4. Зв’язок з процедурами на інших мовах програмування
5. Створення модуля на BORLAND PASCAL (на прикладі програми з лабораторної роботи)
ПРАКТИЧНІ ЗАВДАННЯ
1. Створити модуль DATE_TODAY, який містить в собі структуру для опису дати та функції SETDATETODAY, DAY_TODAY, MONTH_TODAY, YEAR_TODAY для встановлення відповідно поточної дати, отримання числа, місяця та року з поточної дати.
2. Створити модуль FIN, який містить функції PROCENT_SIMPLE, PROCENT_COMPLEX, AMORT_SIMPLE, AMORT_COMPLEX для нарахування банківського простого та складеного проценту, амортизації за простим та складеним методом. Простий процент нараховується на суму за таким правилом: „До початкової суми додається відсоток за пройдений рік.” Складений процент нараховується на суму за таким правилом: „Відсоток за рік додається до поточної суми. Ця сума використовується для нарахування у наступному році”. Амортизація простим методом нараховується на суму за таким правилом: „Від початкової суми віднімається відсоток за пройдений рік.” Амортизація складеним методом нараховується на суму за таким правилом: „Відсоток за рік віднімається до поточної суми. Ця сума використовується для нарахування у наступному році”.
3. Створити модуль MATEM, який містить в собі структуру для опису комплексного числа, функції IS_SIMPLE (перевірка чи є число простим), IS_FIBONACHI (перевірка чи є дане число числом Фібоначчі) та процедури ADD_COMPLEX, SUB_COMLEX, MULT_COMPLEX, DIV_COMPLEX (додавання, віднімання, множення, ділення двох комплексних чисел).
ЛІТЕРАТУРА
1. Фаронов В.В. Turbo Pascal 7.0 Начальный курс. М.: „НОЛИДЖ”, 1999. – 616 с., ил.
ПРАКТИЧНА РОБОТА № 10. МОДУЛЬ ГРАФІКИ.
ТЕОРЕТИЧНІ ПИТАННЯ
1. Графіка в середовищі DOS. Екрани, палітри, система координат.
2. Процедури та функції для роботи з лініями.
3. Процедури та функції для роботи з многокутниками.
4. Процедури та функції для роботи з дугами та еліпсами.
5. Процедури та функції для роботи зі шрифтами.
6. Методика роботи з бітовими зображеннями.
7. Методи створення анімацій.
ПРАКТИЧНІ ЗАВДАННЯ
1. Описати фрагмент програми, яка будує спіраль.
2. Описати фрагмент програми, яка будує графік довільної функції f(x).
ЛІТЕРАТУРА
1. Марченко А.И. Программирование в среде Воrland Pascal 7.0. Киев: ТОО “ВЕК” “ЮРИОР” 1996. – 480 с.
ПРАКТИЧНА РОБОТА № 11. ВКАЗІВНИКИ. ОПИС ДИНАМІЧНИХ ТИПІВ. ОПЕРАЦІЇ НАД ВКАЗІВНИКАМИ.
ТЕОРЕТИЧНІ ПИТАННЯ
1. Прицип адресації у класичній ЕОМ та у IBM PC
2. Поняття вказівника. Посилання. Позначення пустого вказівника та його реальний зміст для DOS та Windows.
3. Опис динамічних змінних. Операції над динамічними змінними. Звертання до динамічних змінних. Поняття про „сміття” в пам’яті.
4. Процедури New, Delete, Getmem, Freemem. Приклади використання.
5. Поняття про алгоритмічні структури, що базуються на вказівниках: черги, стеки, деки, дерева.
ЗАВДАННЯ ДЛЯ РОЗВ’ЯЗАННЯ
1. У файлі знаходиться інформація про батьків та їх дітей у вигляді:
Батько: Іванов Іван Іванович
Мати: Іванова Марія Петрівна
Дитина: Іванова Оксана Іванівна
Дитина: Іванова Світлана Іванівна
Дитина: Іванов Сергій Іванович
Кількість дітей може змінюватися в межах від 1 до 10.
Сформувати в пам’яті ЕОМ структуру, яка б займала мінімальний об’єм пам’яті і повіністю відображала інформацію з файлу.
2. Відсортуватия двовимірний масив, організувавши доступ до нього як до динамічного одновимірного масиву з цілих чисел.
3. Організувати запис/зчитування файлу, який містить заголовок до бази даних.
Структура заголовку бази така:
Назва бази – рядок 25 символів
Кількість полів – 1 байт
Далі слідує відповідна кількість полів виду:
Назва поля – рядок 20 символів
Тип поля – рядок 5 символів
ЛІТЕРАТУРА
1. Кух А.М. Лабораторні роботи №№1-20. – методична розробка (рукопис)– електронний варіант
2. Васюкова Н.Д., Тюляева В.В. Практикум по основам программирования: язык Паскаль. -М.: Высшая школа, 1991, пп. 9.1-9.4
ДОМАШНЄ ЗАВДАННЯ
1. Пильщиков В.И. Сборник упражнений по языку Паскаль.- М.: “Наука”, 1989.
ПРАКТИЧНА РОБОТА № 12. СПИСКОВІ СТРУКТУРИ. СТЕКИ, СПИСКИ ТА ЧЕРГИ
ТЕОРЕТИЧНІ ПИТАННЯ
1. ОДНОНАПРАВЛЕНИЙ СПИСОК ТА ЙОГО ПОБУДОВА МОВОЮ ПАСКАЛЬ. ВКЛЮЧЕННЯ ТА ВИДАЛЕННЯ ЕЛЕМЕНТУ СПИСКУ
2. ДВОНАПРАВЛЕНИЙ СПИСОК ТА ЙОГО ПОБУДОВА МОВОЮ ПАСКАЛЬ. ВКЛЮЧЕННЯ ТА ВИДАЛЕННЯ ЕЛЕМЕНТУ СПИСКУ
3. СТЕК, ПОБУДОВА СТЕКУ МОВОЮ ПАСКАЛЬ. ВКЛЮЧЕННЯ ТА ВИДАЛЕННЯ ЕЛЕМЕНТУ СТЕКУ
4. ЧЕРГА, ПОБУДОВА ЧЕРГИ МОВОЮ ПАСКАЛЬ. ВКЛЮЧЕННЯ ТА ВИДАЛЕННЯ ЕЛЕМЕНТУ ЧЕРГИ
ЗАВДАННЯ ДЛЯ РОЗВ’ЯЗАННЯ
1. Дано натуральне число n, дійсні числа a1, a2,…,an. Перетворити послідовність таким чином, що спочатку йшли від’ємні числа, а потім – додатні. Порядок слідування від’ємних змінити на протилежний.
2. Дано натуральне число n, дійсні числа a1, a2,…,an. Перетворити послідовність таким чином, що спочатку йшли від’ємні числа, а потім – додатні, які діляться на 5, а далі решта.
3. Дано натуральне число n, дійсні числа a1, a2,…,an.. Отримати послідовність, в якій кожна п’ятірка початкових чисел замінена добутком 1-го елемента на середнє арифметичне п’ятірки.
4. Дано натуральне число n, зростаюча послідовність a1, a2,…,an. Перетворити послідовність таким чином, що спочатку йшли від’ємні числа, а потім – додатні. Порядок слідування чисел, які за модулем більші 17 змінити на протилежний.
ЛІТЕРАТУРА
1. Марченко А.И. Программирование в среде Воrland Pascal 7.0. Киев: ТОО “ВЕК” “ЮРИОР” 1996. – 480 с. Гл. 14
2. Дмитриева М.В., Кубенский А,А, Элементы современного программирования. Под ред. С.С.Лаврова –С-Пб.:Изд. С.-Пб. Университета, 1991. Гл.7.
ПРАКТИЧНА РОБОТА № 12. ТЕХНОЛОГІЯ ОБ’ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ
ТЕОРЕТИЧНІ ПИТАННЯ
5. Основні поняття об’єктно-орієнтованого програмування
ЗАВДАННЯ ДЛЯ РОЗВ’ЯЗАННЯ
6. Дано натуральне число n, дійсні числа a1, a2,…,an. Перетворити послідовність таким чином, що спочатку йшли від’ємні числа, а потім – додатні. Порядок слідування від’ємних змінити на протилежний.
7. Дано натуральне число n, дійсні числа a1, a2,…,an. Перетворити послідовність таким чином, що спочатку йшли від’ємні числа, а потім – додатні, які діляться на 5, а далі решта.
8. Дано натуральне число n, дійсні числа a1, a2,…,an.. Отримати послідовність, в якій кожна п’ятірка початкових чисел замінена добутком 1-го елемента на середнє арифметичне п’ятірки.
9. Дано натуральне число n, зростаюча послідовність a1, a2,…,an. Перетворити послідовність таким чином, що спочатку йшли від’ємні числа, а потім – додатні. Порядок слідування чисел, які за модулем більші 17 змінити на протилежний.
ЛІТЕРАТУРА
3. Марченко А.И. Программирование в среде Воrland Pascal 7.0. Киев: ТОО “ВЕК” “ЮРИОР” 1996. – 480 с. Гл. 14
4. Дмитриева М.В., Кубенский А,А, Элементы современного программирования. Под ред. С.С.Лаврова –С-Пб.:Изд. С.-Пб. Университета, 1991. Гл.7.