48391

Основи мови Паскаль

Конспект

Информатика, кибернетика и программирование

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

Украинкский

2013-12-15

564.32 KB

18 чел.

ЗМІСТ

ТЕМА  1 Основні поняття мови Паскаль 6

Алфавіт мови Паскаль 6

Ідентифікатори та правила їх утворення 6

Оператори, операнди та вирази 7

Константи та змінні 7

Контрольні запитання за темою 7

ТЕМА 2  Базові типи даних мови Паскаль 8

Внутрішнє подання даних (формати даних) 8

Числові дані 8

Символьні дані 11

Логічний (булів) тип даних 11

Контрольні запитання за темою 11

ТЕМА 3  Структура програми мовою Паскаль 13

Розділ підключення стандартних бібліотек та модулів 13

Розділ опису міток 13

Розділ констант 14

Розділ опису типів 14

Розділ опису змінних 15

Розділ опису процедур і функцій 15

Розділ дій (операторів) 15

Контрольні запитання за темою 16

ТЕМА 4  Операції над даними 17

Бінарні та унарні операції: 17

Арифметичні операції 17

Операції порівняння 17

Логічні операції 18

Операції  над бітами 19

Пріоритет операцій 19

Операція присвоєння 20

Перетворення типів 20

Неявне перетворення типів 20

Явне перетворення типу 21

Стандартні функції мови Паскаль 22

Операції введення/виведення даних мови Паскаль. Форматне виведення 23

Введення даних 23

Виведення даних 24

Контрольні запитання за темою 24

ТЕМА 5   Управління послідовністю дій у програмах мовою Паскаль 26

Послідовний (лінійний) обчислювальний процес 26

Розгалужений обчислювальний процес 27

Реалізація розгалужень у програмах мовою Pascal 28

Оператор IF - THEN -  ELSE 28

Оператор case – of – else 29

Складений оператор 30

Контрольні запитання за темою 31

ТЕМА 6 Організація циклічного обчислювального процесу 31

Цикли з перед-умовою 31

Цикл з пост-умовою 33

Цикл з параметром 34

Контрольні запитання за темою 36

Тема 7 Організація масивів даних 37

Індексація елементів масиву 38

Тип діапазон 38

Тип перелічення 39

Операції над масивами 40

Багатовимірні масиви 40

Введення / виведення масивів 41

Одномірні масиви 41

Двовимірні масиви 42

Правила використання вкладених циклів 43

Спакований масив 44

Рядки символів 44

Введення / виведення рядків символів 45

Процедури роботи з рядками 45

Функції роботи з рядками 45

Опис типізованих констант-масивів та констант-рядків 46

Контрольні запитання за темою 46

ТЕМА 8 Обробка файлів даних у програмах мовою Паскаль 47

Програмна модель файлу 47

Файли прямого та послідовного доступу 3

Обробка файлів у програмі мовою Паскаль 49

Оголошення файлової змінної 49

Зв’язування файлової змінну з файлом на диску 49

Відкриття файлу 49

Доступ до елементів файлу 50

Закриття файлу 54

Зовнішні пристрої і стандартні текстові файли 55

Контрольні запитання за темою 55

ТЕМА 9 Структура типів даних мови Паскаль 56

Загальна характеристика типів даних мови Паскаль 56

Тип запис мови Паскаль 57

Оператор приєднання 58

Опис власного типу даних 59

Використання масиву записів 59

Використання вкладених записів 60

Запис з варіантною частиною 61

Тип множина 62

Операції над множинами 62

Опис типізованих констант-записів та констант-множин 63

Контрольні запитання за темою 64

ТЕМА  10 Побудова графіку функції        65

Підключення графічної бібліотеки        65

Ініціалізація графічного режиму роботи екрану     65

Ініціалізація графічного режиму роботи екрану                                                                    65

Установка розмірів активного вікна для виводу зображення 66

Відображення осей координат        66

Вибір масштабу зображення        67

Побудова графіку функції         68

ТЕМА  11 Розробка програм з підпрограмами    69

Підпрограма.          69

Виклик підпрограми         69

“Чорна скриня”          69

Специфікація підпрограми        69

Функція           69

Параметри підпрограми         69

Формальні параметри         69

Фактичні параметри         69

Глобальні ідентифікатори         69

Локальні ідентифікатори         69

Час життя змінної          69

Область дії імен(область видимості)        69

Правила опису та відмінності в використання підпрограм-процедур та підпрограм-функцій         69

Підпрограма, формальні та фактичні параметри підпрограми, локальність та глобальність змінних, час життя та область дії змінної    69

ТЕМА  12 Математичне моделювання функціональних залежностей          69

Обчислення суми степеневого ряду       69

Математична постановка задачі (МПЗ)      69

Математична постановка задачі обчислення значення функції для кожної із точок             70

Ітеративний підхід          70

Рекурсивний підхід          71

Обчислення значення ланцюгового дробу      71

Ітеративний підхід          72

Рекурсивний підхід          72

Чисельні методи визначення коренів нелінійних рівнянь    72

Ітеративний підхід          73

Рекурсивний підхід          73

СПИСОК ЛІТЕРАТУРИ 75


ТЕМА  1  Основні поняття мови Паскаль

Алфавіт мови Паскаль

Алфавіт мови Паскаль включає:

  1.  букви - всі латинські літери від a до z, від A до Z та символ підкреслення _;
  2.  цифри - всі арабські цифри від 0 до 9;
  3.  шістнадцяткові цифри, що  позначаються арабськими цифрами (від 0 до 9) та латинськими буквами від A до F.
  4.  спеціальні символи : +,  - , *,  /,  =,  ; , : , = , <,  >  та інші;
  5.  ключові слова – службові зарезервовані слова мови Паскаль, які використовуються для напису програми. До них відносяться :

and

asm

array

begin

case

const

constructor

destructor

div

do

downto

else

end

file

for

function

goto

if

implementation

in

inline

interface

label

mod

nil

not

object

of

or

packed

procedure

program

record

repeat

set

shl

shr

string

then

to

type

unit

until

uses

var

while

with

xor

Ідентифікатори та правила їх утворення

Ідентифікатори – назви (імена) констант, змінних, підпрограм та інших об’єктів у програмі. Ідентифікатори складаються з букв латинського алфавіту та цифр. Ідентифікатори обираються  довільно, але при виборі ідентифікаторів краще дотримуватись якоїсь системи. Наприклад, імена змінних відображають смислове навантаження змінної.

Обмеження на вибір ідентифікаторів:

  1.  ідентифікатори можуть починатись тільки з літери ;
  2.  значущими є перші 63 символи ;
  3.  малі та великі літери в мові Pascal не розрізняються. Таким чином назви Text, TEXT, text є однаковими.
  4.  у програмі не можна використовувати ідентифікатори, що співпадають з ключовими словами ;
  5.  у склад ідентифікаторів не можна включати спеціальні символи та пробіли (окрім символу підкреслення _ ) ;

В  Паскалі є два різновиди ідентифікаторів : стандартні визначені і користувача.

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

Оператори, операнди та вирази

Оператор  - це мінімальна структура, що задає повний опис дії або деякого обчислення, яке потрібно виконати. Якщо провести аналогію з українською мовою, то оператор – це речення. Оператором може бути команда мови Паскаль, виклик процедури чи функції, математичний вираз.

Оператори відділяються друг від друга крапкою з комою ( ;).

Перед ключовими словами UNTIL та ELSE , крапка з комою (;) не ставиться.

Операнд  - це дані, над якими виконується дія. Операндами можуть бути числова константа (число), або ідентифікатор (ім’я константи, змінної, функції, масиву, запису).

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

Наприклад, вираз a:=b+3*с . Тут  а, b, с та 3 – операнди, +, := - знаки операції, а взагалі цей вираз є оператором.

Константи та змінні 

   В залежності від способу збереження та обробки дані можна розділити на 2 групи : константи  - це дані, значення яких не змінюється під час роботи програми, та   змінні.

Кожна константа або змінна в програмі позначається своїм ідентифікатором та належить до певного типу даних.

Контрольні запитання за темою

  1.  Які символи включає алфавіт мови Паскаль?
  2.  Що таке ключові слова мови програмування? Які ключові слова мови Паскаль ви запам’ятали?
  3.  Що таке ідентифікатор? Які правила утворення ідентифікаторів у програмі мовою Паскаль? Що таке стандартний ідентифікатор?
  4.  Що таке вираз, оператор та операнд?
  5.  Що таке константа та змінна?


ТЕМА 2 Базові типи даних мови Паскаль

Внутрішнє подання даних (формати даних)

Даними називається вся інформація, що введена для обробки в ЕОМ.

Дані можуть бути подані різним чином: числа, символьна інформація, графічні зображення та інше. Говорять, що дані подані в різній формі мають різний тип.

Тип даних – визначає множину значень, що може приймати змінна і припустимі над нею операції.

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

Числові дані

Форма подання

Множина чисел

Цілі числа

Дійсні числа

Беззнакові

Знакові

З фіксованою крапкою

З плаваючою крапкою

Рис. 1. Подання множини чисел

Всю множину чисел можна умовно поділити на дві категорії: цілі числа та дійсні (рис. 1). В свою чергу по формі внутрішнього подання числа розподіляються на знакові (додатні та від’ємні) та беззнакові (тільки додатні) цілі, дійсні з плаваючою та фіксованою крапкою.

Діапазон припустимих значень залежить від розрядності числа. Наприклад, якщо для подання числа виділяється 1 байт (8 біт), то для беззнакового цілого мінімальне значення – 0, а максимально можливе значення буде 28=256. Для цілого зі знаком 1 (старший) біт відводиться  для збереження знаку числа (1 – мінус, 0 – плюс). Це зменшує діапазон, тому мінімальне значення буде  -27= -128, а максимально можливе значення 27=128 (рис.2).

У програмах мовою Паскаль для подання цілих чисел використовують 5 типів, характеристики яких наведені у табл. 1. Цілочисельні типи відносяться до скалярних типів даних.

а)

№ розряду

7

6

5

4

3

2

1

0

У десятковій системі:

Значення

1

1

1

1

1

1

1

1

27+26+25+24+23+22+21+20=256

б)

№ розряду

7

6

5

4

3

2

1

0

У десятковій системі:

Значення

Знак

1

1

1

1

1

1

1

26+25+24+23+22+21+20=128

Рис.2. Формати цілих чисел (а – без знака, б – зі знаком)

Таблиця 1 - Діапазон представлення цілих.

Назва

Діапазон значень

Розрядність

byte

0 ... 255

8 бітів без знака

word

0 ... 65535

16 бітів без знака

shortint

-128 ... 127

8 бітів зі знаком

integer

-32768 ... 32767

16 бітів зі знаком

longint

-2147483648 ...   2147483647

32 біта зі знаком

Для подання дійсних чисел припускаються дві форми:

  1.  з фіксованою крапкою.

Наприклад, 5.45, 0.009, 345.789 та інші. Це – канонічна форма запису дійсних чисел.

  1.  з плаваючою крапкою.

Наприклад, канонічне число 5.729 можна записати так – 0.5729101, де 0.5729 – мантиса, 10 – основа системи числення, 1 – порядок числа, або так –  0.5729Е1.

10 000 = 1.0 104 або 1.0Е4;

0.0000034 = 3.410-6 або 3.4Е-6.

Крім того, число треба записувати у нормалізованій формі: перед крапкою має бути одна значуща цифра (див. приклад).

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

Розміри порядку (експоненти) та мантиси числа наведені у табл. 2, формат запису двійкового числа на рис. 3, де M – кількість розрядів під мантису (відповідно до точності числа); P – кількість розрядів під експоненту; 1 розряд під знак числа (1 – від’ємне, 0 - додатне).

Розряди

К

К-1

К-2

3

2

1

0

Призначення

Знак

Мантиса

Кількість бітів

P

0

1

M

Рис. 3. Формат двійкового числа з плаваючою крапкою

Таблиця 2 - Формати чисел з плаваючою крапкою.

Тип даних

Кількість біт

Кількість значущих  цифр

Загальна

К

Мантиса

M

Порядок

P

Коротке дійсне

32

(4 байти)

23

8

7

Довге дійсне

64

(6 байт)

52

11

15 -16

Розширене дійсне

80

(8 байт)

64

15

19

Для того щоб не зберігати від’ємний порядок, він подається у так званому зміщеному вигляді, тобто збільшеним на певну константу Т:

р’ = р + Т

Наприклад, для короткого дійсного на Т = 26 =64, довгого дійсного – 1023, розширеного дійсного – 16 383. Тобто для короткого дійсного замість -64p63, значення порядку буде 0 p’ 127, де p’< 64  - від’ємний порядок,  р’  64 - додатний порядок. Це спрощує дії над числами та полегшує виконання операцій порівняння.

У програмах мовою Паскаль для подання дійсних чисел використовують 5 типів, характеристики яких наведені у табл. 3.

Таблиця 3 – Дійсні типи даних мови Паскаль

Назва

Розрядність

Діапазон значень

Кількість значущих цифр

real

6 байт

2.910-38 ... 1.71038

11– 12

single

8 байт

1.510-45 ... 3.41038

7 – 8

double

8 байт

5.010-324 ... 1.710308

15 – 16

extended

10 байт

1.910-4951 ... 1.7104932

19 – 20

comp

8 байт

-2 63 +1... 2 63 –1

19 – 20

Докладніше про тип comp . Цей тип поєднує в собі властивості цілого та дійсного. Змінні цього типа можуть приймати тільки цілі значення (властивості цілих типів), але тип comp не є скалярним (порядковим) типом даних.

Використання типів, single, double, extended можливе тільки при наявності арифметичного співпроцесора.

Символьні дані

Значенням символьного типу є множина всіх символів ПК. Кожному символу ставиться у відповідність ціле число в діапазоні 0 .. 256. Це число служить кодом внутрішнього подання символу (див. додаток А). Для кодування використовується ASCII - код (American Standard Code for Information Interchange – американський стандартний код для обміну інформацією).  [3]

Символьні дані описуються у програмі типом CHAR, для збереження такої змінної відводиться 1 байт.

Константою літерного типу є одна з допустимих літер, що взята в одиничні лапки ( ’  ’ ).

Наприклад, якщо задекларована змінна A: CHAR , то для присвоєння їй певного значення можна задати оператор:

A:=’d’;

Фактично змінна А буде зберігати код (згідно ASCII - стандарту) літери d.

Для прямого та зворотного зображення множини символьних значень на підмножину натуральних чисел в мові Паскаль використовуються дві стандартні функції:

   ORD (c:char): byte  - дає ASCII – код символу;

   CHR (N: byte) :char - дає символ з кодом N.

Логічний (булів) тип даних

Змінна типу BOOLEAN може приймати тільки 2 значення: істина (TRUE=1) або лож (FALSE=0) і займає 1 байт. Змінні булового типу використовуються при обчисленні логічних виразів та при роботі операторів розгалуженого та циклічного обчислювальних процесів.

Контрольні запитання за темою

  1.  Що таке тип даних? Чому у програмі всі змінні мають бути описаними певним типом даних?
  2.  На які типи можна розділити всю множину чисел?
  3.  Від чого залежить діапазон припустимих значень цілого числа?
  4.  Чим за внутрішнім поданням відрізняються цілі зі знаком і цілі без знаку?
  5.  Які цілочисельні типи мови Паскаль ви знаєте?
  6.  Які форми запису дійсних чисел ви знаєте?
  7.  Як подаються в ЕОМ дійсні числа? Що таке експонента (порядок) числа і мантиса?
  8.  Як зберігаються числа, які мають від’ємну експоненту ?
  9.  Які дійсні типи мови Паскаль ви знаєте? Що таке точність числа?
  10.  Як подаються в ЕОМ символьні типи даних?
  11.  Що являє собою логічний тип даних?

ТЕМА 3   Структура програми мовою Паскаль

Програма мовою Паскаль має жорстку структуру, якої треба дотримуватися при написі програми. Програма починається з заголовка та складається з 7 розділів. Заголовок та розділи не є обов’язковими частинами програми, тобто будь-який  розділ (або заголовок) можна пропустити, але послідовність опису розділів треба зберігати.

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

Заголовок - ім’я програми та список параметрів;

PROGRAM <ім’я програми > [ (INPUT, OUTPUT, F1, F2, ...) ] ;

Примітка !!! Якщо при описі оператору якась його частина наведена дужках [ ], це означає, що ця частина не є обов’язковою і при написі програми її можна пропустити.

Розділ підключення стандартних бібліотек та модулів

Синтаксис опису підключення стандартних бібліотек та модулів має вигляд:

USES < список модулів >;

< список модулів > - назви модулів, що підключаються, вказуються через кому. Довжина списку не обмежена. Наприклад,

Використання у програмі рядка USES не обов’язкове. USES вказується коли у програмі використовуються константи, типи, змінні, процедури або функції визначені в стандартних бібліотеках мови (крім SYSTEM, який використовується за умовчанням) або модулях, що описані користувачем.

Рядок USES у програмі описується один раз одразу ж після заголовка. Наприклад,

USES Crt, Graph, MyModul;

Розділ опису міток

Синтаксис опису міток має вигляд:

LABEL < список міток >;

Будь-який оператор, що виконується може бути споряджений міткою. Мітки використовуються сумісно з оператором goto для позначення та швидкого переходу до деяких частин (операторів) програми.

Міткою може бути ідентифікатор або цифра від 0 до 9999. Початкові нулі не є значущими. Мітка відокремлюється від оператора двокрапкою (:). При описі мітки відокремлюються комою. Наприклад,

LABEL 1, 2, А1, А2;

Використання міток та оператора goto у програмі  суперечить принципам структурного програмування та вважається дурним стилем у програмуванні.

Розділ констант

Константи в мові Pascal бувають трьох типів: числові (цілі та дійсні), булового (TRUE, FALSE) і символьні.

За синтаксисом опису константи поділяються на  прості та типізовані.

Синтаксис опису простої констант має вигляд:

CONST <константа1 >=<значення1 >;

 < константа2 >=< значення 2 >;

    . . .

< константа N >=< значення N >;

Наприклад, описані 4 константи:

Const

A = 23;

B = 12.5;

C = ‘a’;

D = True;

Тип простої константи визначається компілятором з її опису. Таким чином константа A є чисельною цілою, константа B – чисельною дійсною, C – символьною, D – логічною або булового типу.

Синтаксис опису типізованої константи такий:

CONST <константа1 >:<тип 1 >=<значення1 > ;

 < константа2 >:<тип 2 >=< значення 2 >;

    . . .

< константа N >:<тип N >=< значення N >;

Наприклад, описані 4 константи:

Const

A : integer = 23;

B : real  = 12.5;

C : char = ‘a’;

D : boolean = True;

Типізовані константи можуть бути описані стандартними типами, як у наведеному вище прикладі, типом покажчик або бути структурованого типу: масив, запис, множина, об’єкт, опис яких буде розглянуто у відповідних темах.

Розділ опису типів 

Синтаксис опису типів має вигляд:

TYPE  <назва типу1 >=<опис типу1 >;

<назва типу2 >=<опис типу2 >;

   . . .

<назва типуN >=<опис типу N >;

Множину типів Паскаль-прогарами можна розділити на дві групи: стандартні типи та типи користувача.

Стандартні типи це визначені ідентифікатори (не плутати з ключовими словами!). Вони описані у стандартній бібліотеці SYSTEM. До них належать типи word, byte, integer, real, char та інші.

Типи користувача – це додаткові абстрактні типи, характеристики яких програміст визначає самостійно. Наприклад,

TYPE

MyType = 0 ..10;

Таким чином визначено підтип цілих чисел від 0 до 10.

Розділ опису змінних 

Синтаксис опису змінних має вигляд:

VAR 

<список змінних 1> :<тип1>;

<список змінних 2> :<тип2>;

 . . .

<список змінних N> :<тип N>;

<список змінних > - перелік ідентифікаторів, які відокремлюються комою.

<тип > - ідентифікатор стандартного типу або типу користувача.

Кожна змінна повинна бути описана до її використання у програмі і віднесена до одного типу.

Розділ опису процедур і функцій

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

Розділ дій (операторів) 

Синтаксис опису розділу дій такий:

BEGIN

<оператор 1>;

<оператор 2>;

 . . .

<оператор 3>

END.

Це єдиний обов’язковий розділ програми. Він починається з ключового слова BEGIN та закінчується ключовим словом END. Наприкінці програми ставиться крапка.

Після останнього оператора перед заключним END крапка з комою (;) не ставиться.

Коментарі  - можуть стояти в будь-якому місці програми, але не всередині операторів, і заключаються в фігурні дужки { } або в (* *).

Контрольні запитання за темою

  1.  Скільки розділів може мати програма мовою Паскаль?
  2.  Як записується заголовок програми?
  3.  Як описується розділ підключення стандартних бібліотек та модулів?
  4.  Що таке мітка? Як описується розділ міток?
  5.  Як описуються типізовані і нетипізовані константи?
  6.  Як описується розділ типів? Що таке тип користувача?
  7.  Як описується розділ опису змінних?
  8.  Для чого призначений розділ опису процедур та функцій?
  9.  Як формується розділ дій (операторів)?


ТЕМА 4   Операції над даними
 

Бінарні та унарні операції:

а) бінарні арифметичні операції - приймають 2 операнда. До них відносяться додавання, віднімання, множення, ділення. Наприклад, в виразі а+р вказані два операнди (а і р) та знак операції (+).

б) унарні арифметичні операції приймають один операнд. Наприклад, в виразі –х відбувається зміна знаку операнду х. Для операції зміни знаку потрібний тільки один операнд, тобто ця операція унарна.

Арифметичні операції

Арифметичні операції мови Паскаль наведені у таблиці 4.

Таблиця 4 – Арифметичні операції мови Паскаль

Позначення

Назва

Тип операндів

Тип результату

Бінарні арифметичні операції

+

додавання

Цілочисельний або

дійсний

Відповідно до типу операндів

-

віднімання

Цілочисельний або

дійсний

Відповідно до типу операндів

*

множення

Цілочисельний або

дійсний

Відповідно до типу операндів

/

ділення

Цілочисельний або

дійсний

x/y - завжди дійсний тип  y0

div

Цілочисельне ділення

Тільки цілочисельний

Цілочисельний

x/y – округляється до найменшого цілого

mod

обчислення остачі при діленні

Тільки цілочисельний

Цілочисельний

Х mod У=Х(Х div У)*У

Унарні арифметичні операції

унарний мінус (зміна знака змінної)

Цілочисельний або

дійсний

Відповідно до типу операндів

Х = - Х


Операції порівняння

Таблиця 5 – Операції порівняння мови Паскаль

Позначення

Назва

Тип операндів

Тип результату

=

Дорівнює

Цілочисельний,

дійсний, символьний

Булів тип

<>

Не дорівнює

Цілочисельний,

дійсний, символьний

Булів тип

>

Більше

Цілочисельний,

дійсний, символьний

Булів тип

<

Менше

Цілочисельний,

дійсний, символьний

Булів тип

>=

Більше або дорівнює

Цілочисельний,

дійсний, символьний

Булів тип

<=

Менше або дорівнює

Цілочисельний,

дійсний, символьний

Булів тип

in

Належність до множини

Змінна типу множина

Булів тип

Логічні операції 

Логічні операції використовуються для змінних логічного типу. Опис логічних операцій та правила їх використання наведені у таблицях 6 та 7.

Таблиця 6 – Логічні операції мови Паскаль

Позначення

Назва

Тип операндів

Тип результату

not

заперечення

Булів тип

Булів тип

and

кон’юнкція - логічне “И” (множення)

Булів тип

Булів тип

or

диз’юнкція – логічне “АБО” (додавання)

Булів тип

Булів тип

xor

виняткове “АБО”

Булів тип

Булів тип

Таблиця 7 – Використання логічних операцій мови Паскаль

U

not U

U

V

U and V

U

V

U or V

U

V

U xor V

T

F

T

T

T

T

T

T

T

T

F

F

T

T

F

F

T

F

T

T

F

T

F

T

F

F

T

T

F

T

T

F

F

F

F

F

F

F

F

F

Операції  над бітами

Операції над бітами виконуються над цілочисельними або символьними типами. Результатом операції є ціле число або символ (у відповідності ло типу операндів), біти якого формуються з бітів операндів за правилами, що є аналогічними до відповідних логічних операцій.

Таблиця 8 – Операції над бітами мови Паскаль

Позначення

Назва

Тип операндів

Тип результату

not

заперечення

Цілочисельний або символьний

Відповідно до типу операндів

and

“И”

Цілочисельний або символьний

Відповідно до типу операндів

or

“АБО”

Цілочисельний або символьний

Відповідно до типу операндів

xor

виключаюче  “АБО”

Цілочисельний або символьний

Відповідно до типу операндів

shl

i shl j

зміщення ліворуч на j бітів

Цілочисельний або символьний

Відповідно до типу операндів

shr

i shr j

зміщення праворуч на j бітів

Цілочисельний або символьний

Відповідно до типу операндів

Пріоритет операцій 

Пріоритет операцій визначає послідовність виконання операцій у виразі. Правила пріоритету говорять:  

  1.  Операції з більшим пріоритетом виконуються раніше ніж операції з меншим пріоритетом.
  2.  Будь-який вираз у дужках обчислюється раніше, ніж виконуються операції, що передують дужкам.
  3.  Операнд, що знаходиться між двома операціями “прив’язаний” сильніше до операнду з більшим пріоритетом.
  4.  Операції з однаковим пріоритетом виконуються послідовно зліва направо.

У таблиці 9 наведені операції мови Паскаль по мірі зменшення пріоритету.


Таблиця 9 – Пріоритет операцій мови Паскаль

Операції

Тип операцій

not , @, +, -, [ ], ( ), *

Унарні

*, /, div, mod, and, shl, shr

Бінарні

+, -, or, xor

:=, =, <>, <, >, <=, >=, in

Операція присвоєння

Загальний вигляд:

<ідентифікатор змінної >  : =  < вираз > ;

Вираз може містити  константи, змінні, назви функцій, знаки операцій та дужки. Наприклад:

  F:=3*c+2*sin(x) - (k - r mod t).

Правила використання операції присвоєння:

  1.  Присвоєння можливе для змінних та виразів всіх типів ( за виключенням FILE ).
  2.  Змінна та вираз повинні бути одного типу. Або тип змінної, що знаходиться праворуч від оператору присвоєння поглинають тип змінної, що знаходиться ліворуч від оператору присвоєння. Наприклад, допускається змінній типу REAL присвоювати змінну типу INTEGER, але не навпаки. Тому що множина дійсних чисел включає і всі цілі числа.

Перетворення типів

Неявне перетворення типів

Перетворення типів відбувається коли необхідно виконати якісь операції над операндами різних типів. Наприклад:

var

a:byte;

b:integer;

begin

 ReadLn (a);

 b:=a;

end.

В наведеному прикладі змінна а типу byte – беззнакове ціле розміром в 1 байт, змінна b – ціле зі знаком розміром в 2 байти.  Зрозуміло, що вони мають різні формати. Таким чином перш ніж присвоїти змінній b значення змінної а, необхідно призвести формат змінної а до формату змінної b. Це перетворення відбувається без привертання уваги користувача (програміста) або неявно.

Перетворення типів це процес приведення формату подання одного числа до формату іншого.

Мова Паскаль вимагає жорсткої типізації. Всі  використовувані у програмі операції мають виконуватись над операндами одного типу або сумісного з ним типу.

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

Два типи вважаються сумісними якщо:

  1.  обидва вони є один і той самий тип (обидва дійсні, обидва цілі);
  2.  один тип є тип - діапазон іншого типу (наприклад, тип byte за своїм діапазоном є підтипом  для integer; тип integer є підтипом для real, тому що цілі числа є підмножиною дійсних чисел, але не навпаки).

Неявне перетворення типів відбувається в таких випадках:

  1.  обчислюється вираз, в якому є змінні дійсного та цілого типу. При виконанні операцій цілі приводяться (перетворюються) до дійсного типу. Результат буде мати дійсний тип.
  2.  змінна – нетипізований покажчик вказує на область пам’яті, яка в залежності від потреб може використовуватись для збереження значень різних типів.
  3.  при використанні змінної – запису з варіантними полями.
  4.  при наданні однакової абсолютної адреси для декількох змінних різних типів.

Явне перетворення типу

Явне перетворення типу  може відбуватися двома способами:

  1.  Явне приведення типу.

Якщо ми хочемо присвоїти якесь значення змінної Х типу Т1 змінній У типу Т2, то для явного приведення типів можна задати такий вираз:

У := Т2 ( Х ) .

Наприклад,

Var

I : integer;

H : real;

Begin

H := real ( I );

End;

  1.  Перетворення з використанням відповідних функцій перетворення.

Дійсний тип може бути перетворений в цілий такими функціями:

  1.  TRUNC (x: <дійсний тип>): Longint -  відкидання десяткових знаків після точки, тобто округлення до найменшого цілого;
  2.  ROUND (x: <дійсний тип>): Longint - округлення до найближчого цілого за математичними правилами.

Символьний тип може приводитись до цілого та навпаки

  1.  CHR (i: <цілий тип>): char - повертає символ;
  2.  ORD (c) : Longint - порядковий номер значення дискретного типу;

Стандартні функції мови Паскаль

Таблиця 10 – Стандартні функції мови Паскаль

Назва

Тип аргументу

Тип результату

Дія

Математичні функції

Abs (x)

Дійсний або цілий

Відповідно до типу аргументу

x

Cos (x);

Дійсний

Дійсний

Косинус Х. Х подається в радіанах.

Sin (x);

Дійсний

Дійсний

Синус Х. Х подається в радіанах.

ArcTan (у)

Дійсний

Дійсний

Арктангенс у.

Pi

Дійсний

значення числа

Frac (x)

Дійсний

Дійсний

повертає дробову частину числа

Int (x)

Дійсний

Дійсний

повертає цілу частину числа

Exp (x)

Дійсний

Дійсний

еx

Ln (x)

Дійсний

Дійсний

повертає натуральний логарифм аргументу

SQR (x)

Дійсний або цілий

Дійсний

x2

SQRT (x)

Дійсний або цілий

Дійсний

x

Randomize

Ініціалізація генератора випадкових чисел

Random

Дійсний

Повертає псевдовипадкове число в інтервалі [0, 1]

Random (n)

Цілий

Цілий

Повертає псевдовипадкове число в інтервалі [0, n]

Round

Дійсний

Цілий

Округлення числа до найближчого цілого

Функції перетворення типів

Trunc

Дійсний

Цілий

Відсікає дробову частину дійсного числа

Ord

Символьний

Цілий

Повертає ASCII-код заданого символу

Chr

Цілий

Символьний

За заданим ASCII-кодом повертає символ

Функції з дискретними типами

INC (i, n)

Цілі

Цілий

Збільшує величину і на величину n

DEC (i, n)

Цілі

Цілий

Зменшує величину і на величину n

ODD (n)

Цілий

Логічний

Перевіряє чи є аргумент парним числом

PRED (n)

Порядковий

Цілий

повертає попереднє значення

SUCC (n)

Порядковий

Цілий

повертає наступне значення

Операції введення / виведення даних мови Паскаль Форматне виведення  

Введення даних

Для введення даних у програмі мовою Паскаль використовуються оператори:

READ (<список введення >);  

READLN (<список введення >);

де <список введення > - перелік ідентифікаторів змінних, значення яких ми хочемо ввести. Наприклад, якщо у програмі необхідно задати значення трьох змінних a, b, c, то  оператор записується так: READ (a, b, c).

Закінчення –LN говорить про те, що після виконання оператору курсор на екрані буде переведений на новий рядок (line).

Значення змінних вводяться з консолі (клавіатури) і за кількість та типом повинні відповідати змінним, що задані у списку введення. Тобто якщо змінні a, b, c мають відповідно дійсний, цілий та символьний типи, то при введенні необхідно задати три значення:

  1.  перше – дійсного типу для змінної а;
  2.  друге – цілочисельне для змінної b;
  3.  третє – символьне для змінної с.

Порядок подання значень при введенні змінювати неможна.

Процедура  READ (ReadLn) чекає введення послідовності символів, що формують число зі знаком, ігнорує всі попередні пропуски (маркери кінця рядка і т.д.). При введенні елементів списку змінні відокремлюються прогалинами або після кожного значення клавішею <Enter>. Зчитування закінчується при зустрічі першого пропуску. Якщо у цифровому рядку будуть символи, що не відповідають чисельному формату, генерується помилка введення. Не рекомендується вказувати в одному списку введення змінні числового та символьного типів одночасно, так як прогалина-роздільник може бути сприйнятий як значення типу CHAR, яке вводиться.

Виведення даних 

WRITE (<список виведення >);

WRITELN (<список виведення >);

де <список виведення > - перелік ідентифікаторів змінних, значення яких ми хочемо вивести на екран.

Якщо у програмі заданий оператор WRITE (a, b, c), то в результаті на екран одна за одною будуть виведені значення трьох змінних.

Але постає така проблема: значення змінних можуть бути виведені на екран підряд без роздільних прогалин.

Існує два способи уникнення цієї проблеми:

  1) форматне виведення :

в списку виведення для кожної змінної вказується

      <ідентифікатор змінної > : L : D,

де L – загальна ширина поля виведення, D - кількість позицій під дробову частину.

  2) використання при виведенні допоміжних рядків – повідомлень.

Крім значень змінних на екран може бути виведений набір символів (рядок повідомлення) :

  WRITELN (’ Значення z= ’, z);

де ’ Значення z= ’ – рядок – повідомлення, вказується в лапках, z  - ідентифікатор змінної. Якщо z дорівнює, наприклад, 27, то на екран буде виведене:

Значення z= 27

Виведення рядків – повідомлень можна  комбінувати з форматним виведенням:

  WRITELN (‘ a, b ’, a:10, b:10);

Контрольні запитання за темою

  1.  Які арифметичні, логічні операції, операції над бітами числа та операції порівняння мови Паскаль ви знаєте?
  2.  Що таке унарна та бінарна операція?
  3.  Що таке пріоритет операцій? Які правила пріоритету операцій мови Паскаль ви знаєте?
  4.  Як записується операція присвоєння мови Паскаль? Які правила використання операції присвоєння ви знаєте?
  5.  Що таке перетворення типів? Коли відбувається неявне перетворення типів? Наведіть приклади.
  6.  Як здійснити явне перетворення типів? Які стандартні функції перетворення  типів ви знаєте?
  7.  Які стандартні функції мови Паскаль ви знаєте? Якого типу аргументи вони приймають і якого типу результат повертають?
  8.  Які операції використовуються у програмі для введення та виведення даних?
  9.  Що таке список введення та список виведення? Які правила їх формування?
  10.  Що таке форматне виведення даних? Чому доцільно його використовувати у програмі? Як відрізняється форматне виведення цілих та дійсних змінних?


ТЕМА 5   Управління послідовністю дій у програмах мовою Паскаль

Послідовний (лінійний) обчислювальний процес

S1

S2

S3

. . .

. . .

Рис. 4. Лінійний обчислювальний процес

a,b,c

S, V

S=2ab+4bc

V=abc

Рис. 5.

Найпростішим видом обчислювального процесу є послідовний або лінійний обчислювальний процес, коли всі дії виконуються одна за одною (рис. 4).

Розглянемо приклад: скласти програму для обчислення об’єму та площі поверхні прямокутного паралелепіпеда, якщо задані довжини ребер a, b, c (дійсні числа).

Вхідними даними цієї задачі будуть довжини ребер a, b, c типу real.

Вихідними даними цієї задачі будуть: площа поверхні S та об’єм V також типу real.

Математична постановка задачі:

  1.  Площа поверхні паралелепіпеда визначається за формулою:

,

де a та b – сторони основи паралелепіпеду, c – висота.

  1.  Об’єм паралелепіпеда :

Виходячи з проведеного аналізу алгоритм цієї задачі буде складатися з таких етапів:

  1.  Введення даних для змінних a, b, c.
  2.  Обчислення S та V.
  3.  Виведення значення S та V на екран.

Схема алгоритму наведена на рис. 5.

var

a,b,c,S,V:real;

begin

WriteLn (‘Введіть довжини ребер паралелепіпеда a, b, c:’);

Read (a,b,c);

S:= 2*a*b+4*b*c;

V:=a*b*c;

Writeln (‘S= “, S:7:3, ‘V= ’, V:7:3);

end.

В процесі розв’язку цієї задачі всі дії виконуються одна за одною, тому алгоритм вирішення відноситься ло послідовного обчислювального процесу.

Розгалужений обчислювальний процес

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

Рис. 6. Розгалужений обчислювальний процес

S1

S2

S3

умова

ні

так

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

Основу техніки програмування   розгалужених алгоритмів складає просте розгалуження.

так

Виконується перевірка логічної умови та перехід в залежності від його істинності на виконання одного з операторів S1 або S2. Після чого обчислення повертається до “спільного русла” , тобто виконується оператор S3. Не слід забувати, що оператори S1 та S2 є альтернативними. Якщо < умова > істинна, то виконується оператор S1, якщо ні, то S2.

Приклади алгоритму з розгалуженим обчислювальним процесом:

  1.  Алгоритм знаходження коренів квадратного рівняння ax2 +bx+c=0 поданий на рис. 7.
  2.  Алгоритм знаходження найбільшого значення з двох змінних a= max (x, y) поданий на рис. 8.

ні

так

x,y

x>y

a:=x

a:=y

X1,X2

a,b,c

D=b2-4аc

X1=(-b+D)/2a

X2=(-b-D)/2a

X1,X2

D0

Дійсних коренів

не існує

так

ні

Рис. 7.

Рис. 8.

Реалізація розгалужень у програмах мовою Pascal

У програмах мовою Паскаль розгалужений обчислювальний процес може бути заданий двома операторами:

Оператор перевірки умови IF - THEN -  ELSE 

Оператор – перемикач case – of – else .

Оператор IF - THEN -  ELSE

Синтаксис оператора перевірки умови такий:

IF <Умова > THEN <оператор1 >  ELSE <оператор2 >;

При виконанні оператора IF по-перше обчислюється <Умова >. <Умова > - логічний вираз, результат якого булового типу (true / false).  Якщо <Умова> істинна, то виконується <оператор1>, інакше виконується <оператор2>.

Частина ELSE не є обов’язковою, тобто оператор перевірки умови може бути заданий так:

IF <Умова > THEN <оператор1 >;

У випадку, коли оператор IF використовується у скороченому записі без частини ELSE, при значенні результату умови false нічого не виконується, оператор після THEN пропускається.

Зверніть увагу на те, що перед ключовим словом ELSE;” не ставиться.

Оператор case – of – else

Оператор IF дозволяє вибрати тільки одну з двох можливих дій в залежності від виконання або невиконання умови. На практиці дуже часто виникає ситуація, коли необхідно приймати більш складні рішення, тобто вибирати не з двох, а набагато більшої кількості варіантів. Для реалізації такого “сильно” розгалуженого процесу використовується оператор – перемикач CASE.

Синтаксис опису оператора – перемикача:

CASE <вираз > OF

<константа1> :<oператор1 > ;       

<константа2> :<oператор2 > ;       

. . .

<константаN> :<oператорN >       

ELSE <оператор > ;

END;

<Вираз> є селектором, тобто в залежності від того, яке значення він приймає обирається та чи інша гілка оператору CASE, для якої значення виразу співпадає зі значенням константи (<конст. 1>, <конст. 2> або <конст. N>). Тип виразу може бути одним з дискретних типів: цілочисельним ,  символьним або логічним.

CASE - константи повинні бути унікальними й відповідати типу виразу – селектора.

При формуванні оператора CASE можливе об’єднання декількох констант на одній гілці та можливе надання певного діапазону значень. Наприклад,

Case f of

0..5, 10..17 : <оператор1>;

6..9, 18, 20 : <оператор2>;

19  : <оператор3>

else <оператор4>;

end;

Якщо значення цілочисельної змінної f буде від 0 до 5 або від 10 до 17, то виконується <оператор1>.

Якщо значення f буде від 6 до 9 або 18 або 20, то виконується <оператор2>.

Якщо значення f буде 19, то виконується <оператор3>.

Якщо f приймає якесь інше значення, то виконується <оператор4>.

Приклад 1. Скласти програму для обчислення ХР, де Х - дійсне число, р – ціле (р5).

Program EX_2;

VAR

XP,X  : real;

P : integer;

Begin

WRITELN ( ‘ПРОГРАМА ВИКОНУЄ ОБЧИСЛЕННЯ ХР,ДО Х5’ );

WRITELN ( ‘ВВЕДІТЬ Х: ‘);

READ (X);

WRITELN ( ‘ВВЕДІТЬ ПОКАЗНИК СТЕПЕНІ Р’ );

READ (P);

CASE P OF

1:  XP:=X;

2: XP:=SQR;

3: XP:=SQR(X)*X;

4: XP:=SQR(SQR(X));

5: XP:=SQR(SQR(X))*X;

ELSE  WRITE ( ‘ПОКАЗНИК СТЕПЕНІ ПЕРЕВИЩУЄ 5’ );

END;

WRITELN (‘ОТРИМАНЕ ЗНАЧЕННЯ :‘, XP:10);

END.

Приклад 2. Вивести на екран повідомлення `БУКВА` або `ЦИФРА` в залежності від введеного символу.

Var

C: char;

Begin

WriteLn( ‘Введіть символ ’ );

ReadLn (C);

CASE C OF

‘A’..’Z’, ‘a’..’z’  :WRITELN ( ‘БУКВА’ );

‘0’..’9’   : WRITELN ( ‘ЦИФРА’ );

END;

End.

Складений оператор 

Правила запису операторів мови Паскаль говорять, що після ключових слів then, else, do або в кожній гілці оператору case може бути виконаний тільки один програмний оператор.

Якщо при деяких умовах виникає необхідність виконувати послідовність з декількох операторів то їх об’єднують в один складений оператор.

Складений оператор – це група операторів, що об’єднані операторними дужками. Роль операторних дужок виконують BEGIN та END.

x>0

так

Рис. 9.

Наприклад, для реалізації схеми алгоритму на рис. 9 необхідно оператор if задати так:

If x>0 then

Begin

  A:=sqr(x);

  B:=1/x;

End;

Контрольні запитання за темою

  1.  Що являє собою лінійний обчислювальний процес?
  2.  Що таке математична постановка задачі?
  3.  Що таке алгоритм? Які властивості алгоритму ви знаєте? Які позначення використовуються при графічному описі алгоритму?
  4.  Що таке розгалужений обчислювальний процес? Як він позначається в схемі алгоритму?
  5.  Які оператори мови Паскаль, що реалізують розгалужений процес ви знаєте?
  6.  Які правила запису та використання оператору if – else?
  7.  Які правила запису та використання оператору case – of?
  8.  Для чого у програмах використовується складений оператор?
  9.  

ТЕМА 6 Організація циклічного обчислювального процесу

Цикл – це процес, що повторюється певну кількість разів. Кожне однократне повторення циклу називається ітерацією циклу. Для організації циклічного обчислювального процесу необхідно задати :

  1.  Початкове значення параметру циклу. Параметр циклу – це змінна, яка визначає кількість ітерацій циклу.
  2.  Тіло циклу, тобто ту послідовність дій, яка буде повторюватись.
  3.  Прирощення параметра циклу.
  4.  Умову виходу з циклу, яка безпосередньо пов’язана зі значенням параметра циклу.

Циклічний обчислювальний процес буває трьох видів:

  1.  Цикл з перед – умовою, коли умова виходу з циклу перевіряються до виконання тіла циклу.
  2.  Цикл з пост – умовою, коли умова виходу з циклу перевіряється до виконання тіла циклу. Таким чином цикл буде виконуватись хоча б один раз.
  3.  Цикл з параметром, коли до початку виконання циклу задається кількість ітерацій.

Розглянемо кожний з видів обчислювального процесу детальніше.

Цикли з перед-умовою

Приклад 1:

Для заданого натурального додатного М знайти ціле додатне К, для якого виконується умова Р=3к буде більше за M.

  1.  Вводимо значення М. Задаємо перше значення для К = 0, Р = 30 = 1б.
  2.  Якщо P < M, то перехід до п. 3, інакше – до п. 5.
  3.  Збільшити показник степені: К = К+1.
  4.  Обчислити наступне значення Р =3K або Р = Р*3.
  5.  Вивести значення К на екран.На першому кроку задається значення М та початкове значення для К = 0. Для коректного розв’язку задачі відразу необхідно перевірити, а не перевищує Р=3K=30  М. Бо якщо було задано М =0, то ми знайшли К. Інакше, якщо М більше за Р, то необхідно обчислити наступне Р=31 (або необхідно попереднє значення Р помножити на 3) і збільшити К на 1. Ці дії будуть повторюватись доки Р не стане більше за М.

В Паскаль – програмі цикл з перед – умовою задається оператором:

WHILE < умова виконання > DO < тіло циклу >;

K

K=K+1

P<M

M

К=0, P=1

K=0

P=P*3

ні

Так

Рис. 10.

< умова виконання > - це логічний вираз. Якщо його результат дорівнює TRUE, то тіло циклу виконується.

< тіло циклу > - це один простий або складений оператор.

Мовою Паскаль, наш алгоритм буде реалізований так:

VAR   

Якщо для введення задати М=10, то:

  P,K:INTEGER;

Р<M ?  true

  M:REAL;

1 ітерація. K = K+1=2; P=P*3=3.

BEGIN

Р<M ?  true

READLN (M);

2 ітерація. K = K+1=3;   P=P*3=9.

  K:=0;P:=1;

Р<M ?  true

  WHILE P<M DO

3 ітерація. K = K+1=3; P=P*3=27.

    BEGIN

Р<M ?  false

K:=K+1;

Вивести на екран значення К=3.

 P:=P*3;

    END;

WRITE (`K=`,K);

END.

Цикл з пост-умовою

В Паскаль – програмі цикл з пост – умовою задається оператором:

REPEAT  < тіло циклу > UNTIL < умова виходу >;

< тіло циклу > - це один або декілька операторів.

< умова виходу > - це логічний вираз. Якщо його результат дорівнює FALSE, то тіло циклу повторюється.

Y = f(x)

Х

Рис. 11.

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

Приклад 2.

Протабулювати функцію y = f(x) на інтервалі [Хпочаткове, Хкінцеве ], з кроком х.

Табулювання функції – це обчислення значення функції на заданому проміжку з заданим шагом (рис. 11). Тобто, необхідно обчислити:

  1.  Y = f(Xпоч)
  2.  Y = f(Х1), де Х1 = Xпоч + х.
  3.  Y = f(Х2), де Х2 = X1+ х.

  1.  Y = f(Хкінц).

Таким чином обчислення Y триває доки поточне значення Х не буде перевищувати Хкінц.  Алгоритм табулювання функції наведений на рис. 12.

VAR

Xn, Xk, dx, X, Y :REAL;

BEGIN

  READLN (Xn, Xk, dx);

  X:=Xn;

  REPEAT

     Y:=( SQR (X) +1 )* SIN (X) ;

     WRITELN( X:9:3, Y:9:3)

  UNTIL X > Xk;

END.

ні

так

X:=X+X

Х>Xk

X,Y

Xn, Xk,

X

Y:=(Х2+1)*cos(x)

X=Xn

Рис. 12. Алгоритм табулювання функції

Цикл з параметром

Оператор циклу з параметром мови Паскаль має вигляд:

FOR  <парам_циклу > := <почат _знач > TO <кінц _знач > DO

< тіло циклу > ;

<парам_циклу > – змінна будь-якого порядкового типу (цілочисельна або символьна);

<почат _знач >  – початкове значення параметру – вираз або константа такого ж типу;

<кінц _знач > – кінцеве значення параметру – вираз або константа такого ж типу;

< тіло циклу > – один простий або складений оператор.

При виконанні оператору FOR спочатку обчислюється початкове значення параметру (лічильника циклу). Якщо початкове значення менше за кінцеве, то виконується тіло циклу. Після виконання тіла циклу значення параметру збільшується на 1. Якщо значення параметру не перевищує кінцевого значення (<парам_циклу >  <кінц _знач >), то тіло циклу повторюється.

Якщо < почат_знач >  < кінц_знач >, то цикл не виконується.

Є ще одна форма запису циклу з параметром:

FOR  <парам_циклу > := <почат _знач > DOWNTO   <кінц _знач > DO

< тіло циклу > ;

<почат _знач > має бути більшим за <кінц _знач >. Крок зміни параметру циклу  дорівнює –1.

Приклад 3

Обчислити суму N членів гармонійного ряду, загальний член якого обчислюється за формулою , де  і=1,2,… N. Сума ряду

= .

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

N

і=1,N

S

S=S+1 / і

S=0

Рис. 13.

В алгоритмі (рис. 13) :

  1.  Вводиться значення N – кількість членів ряду, що сумуються. Наприклад, задамо N=5.
  2.  Початкове значення суми S=0.
  3.  Визначається цикл з параметром і, який буде змінюватись від 1 до 5.

1 ітерація. i=1; S=0+1/1=1.

2 ітерація. i=2; S=1+1/2=1,5.

3 ітерація. i=3; S=1.5+1/3=1.833.

4 ітерація. i=4; S=1.833+1/4=2.083.

5 ітерація. i=5; S=2.083+1/5=2.283.

  1.  Виведення S=2.283.

Мовою Паскаль програма записується так:

VAR  

I: BYTE;

S:REAL;

BEGIN

READLN (N); S:=0;

FOR I:=1 TO N DO

S:=S+1/І;

    WRITE (S);

END.

Контрольні запитання за темою

  1.  Що таке цикл? Поняття циклу та принцип його утворення.
  2.  Які види циклічних обчислювальних процесів ви знаєте?
  3.  Правила використання оператору циклу з перед – умовою мови Паскаль.
  4.  Правила використання оператору циклу з пост – умовою мови Паскаль.
  5.  Правила використання операторів циклу з параметром мови Паскаль.
  6.  Чи може використовуватись в якості параметру циклу for змінна дійсного типу? Символьного? Логічного?
  7.  Який крок зміни параметру в циклі for ? Чим відрізняються оператори for – to та for – downto?


Тема 7 Організація масивів даних

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

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

 Отже, масив – набір фіксованої кількості значень (елементів), що груповані під одним іменем. Кожному елементу масиву присвоюється свій порядковий номер – індекс, за яким ми отримуємо доступ до значення елемента. Елементи масиву повинні бути одного типу, котрий називається базовим типом масиву. Схематично масив поданий на рис. 14.

1

2

3

4

5

6

7

MAS

Рис. 14. Схематичне подання масиву

Перед нами сукупність елементів одного типу, але різних за значенням. Кількість елементів 7. Елементи груповані під спільним ім’ям MAS. Для того щоб отримати значення певного елементу масиву MAS необхідно звернутися до нього за індексом. Наприклад, щоб отримати значення:

першого елементу масиву  MAS [1]  

другого елементу масиву  MAS [2]  

третього елементу масиву MAS [3]  

і так далі

Таким чином, для того щоб звернутися до певного елементу масиву необхідно задати ім’я масиву і у квадратних дужках – індекс потрібного елементу:

< ім’я масиву > [< номер елемента >]

Ця операція називається індексацією масиву. Значення індексу має однозначно встановлювати номер елементу масиву і не перевищувати загальної кількості елементів.

Опис масиву в Паскаль – програмі задається так:

VAR

< ім’я масиву > : ARRAY [ < тип індексів > ] OF < тип елементів > ;

< тип індексів > - може бути або

  1.  тип діапазон;
  2.  тип перелічення.

< тип елементів >  - будь – який тип мови Паскаль або тип, заданий користувачем в розділі TYPE.

Індексація елементів масиву

Тип діапазон

Для змінної порядкового типу можна вказати деяку підмножину значень. Наприклад:

VAR

A : 1..10;

В : ‘a’ .. ‘n’;

Змінна А – це цілочисельна змінні, але її значення обмежене діапазоном від 1 до 10; В – символьна змінна, її значення обмежене діапазоном від   ‘a’  до  ‘n’.

Зручно тип діапазон описувати в розділі TYPE :

TYPE

  < ім’я типу – діапазону > = <нижня межа> .. <верхня межа>;

  Diapaz_int  = 1 ..10;

  Diapaz_char =  ‘a’ .. ‘n’;

VAR

  A : Diapaz_int ;

  B : Diapaz_char ;

Цей опис змінних А і В аналогічний попередньому.

Типи Diapaz_int та  Diapaz_char можна використовувати при описі масивів.

VAR

  С : ARRAY [Diapaz_int] OF REAL;

  D : ARRAY [Diapaz_char] OF REAL;

Масив С містить 10 елементів, елементи проіндексовані від 1 до 10, кожний елемент буде типу REAL. Наприклад:

Індекс

1

2

3

4

5

6

7

8

9

10

С

0,1

-3,75

5,2

3,7

-0,56

45,2

100,0

47,0

25,36

6,47

Масив D містить 14 елементів, кожний елемент буде типу REAL. Треба звернути увагу, що індекси елементів цього масиву будуть вже не цілочисельними, а символьними. Наприклад:

Індекс

‘a’

‘b’

‘c’

‘d’

‘e’

‘f’

‘m’

‘n’

D

1,1

1,8

2,4

-4,6

5,22

6,0

7,1

4,1

При зверненні до елементів масивів:

C[1] дає 0,1

D[‘a’] дає 1,1

C[2] дає -3,75

D[‘b’] дає 1,8

C[10] дає 6,47

D[‘n’] дає 4,1

Тип перелічення

Тип перелічення задається переліченням значень, які може приймати змінна.  Кожне значення іменується певним ідентифікатором. Список цих ідентифікаторів подається в дужках. Наприклад:

TYPE

  COLOR = ( RED, GREEN, BLUE);

Всередині типу COLOR елементи перелічення впорядковані :   RED < GREEN < BLUE. Кожному елемент у перелічення відповідає певне значення цілого типу, яке визначається порядком перелічення: перший елемент у списку отримує значення 0, другий – 1, третій –2 і так далі. Максимальне припустиме значення 65536. Таким чином тип перелічення може розглядатися, як скорочений опис набору цілочисельних констант зі значеннями 0, 1, 2 …

Використання типу перелічення збільшує наочність програми.

До змінних типу перелічення застосовуються, окрім операцій порівняння, операції PRED, SUCC, ORD.

PRED ( GREEN) = RED ;

SUCC ( RED ) = GREEN ;

ORD ( RED ) = 0.

Нажаль для змінних типу перелічення не можна використовувати арифметичні операції та операції введення / виведення ReadLn та WriteLn.

Для опису масиву можна задати, наприклад, такий тип:

TYPE

  WEEK = (SUN,MON,TUE,WEN,TH,FRI,SAT);

VAR

 W: ARRAY [WEEK] OF INTEGER ;

 DAY: WEEK;

BEGIN

.........

FOR DAY:=SUN TO SАT DO

.........

END.

W

SUN

MON

TUE

WEN

TH

FRI

SAT

11

8

2

-4

22

6

1

Операції над масивами

S=0

I=1,10

Ai

S=S+ Ai

S

Рис. 15.

Арифметичні та логічні операції, операції порівняння, присвоєння та введення / виведення виконуються тільки над окремими елементами масиву, а не над масивом в цілому.

Тому для зручної роботи з елементами масиву використовують цикли (найчастіше – цикли з параметром).

Приклад 4.

Знайти суму елементів цілочисельного масиву А (10).

VAR

  A : array [1..100] of integer;             

  S, i : integer;                                  

Begin

S:=0;

for i:=1 to 10 do

    begin

 ReadLn (A[i]);

S:=S+A[i];

   end;

WriteLn (‘S = ‘ , S);

End.

Багатовимірні масиви

Досі було розглянуто одномірний масив, тобто масив, елемент якого визначається одним індексом. На практиці дуже часто використовуються двомірні та тривимірні масиви.

Двомірний масив (матриця) задається так:

ім’я масиву >: array [<тип інд_рядків >, <тип інд_стовпців >] of <тип елементів >;

Звернення до елемента масиву :

<ім’я масиву > [<індекс рядка >, <індекс стовпця >].

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

Тривимірний масив задається так:

< ім’я масиву >: array [<тип інд1 >, <тип інд_2 >, <тип інд_3 >] of <тип елементів >;

Звернення до елемента масиву :

<ім’я масиву > [<індекс_1>, <індекс_2>, <індекс_3>].

Var

 MAS : array [1..3, 1..3] of < тип елементів >;

MAS

1

2

3

1

2

3

MAS[2,1] MAS[1,2] MAS[3,3]

Рис. 16. Двовимірний масив

Третій індекс

         2

       1

      1

      

      2

      

      3

  1 2      3

Рис. 17. Тривимірний масив

Перший індекс

Другий індекс

CUB [1,3,1]

CUB [3,3,3]

 CUB : array  [1..3, 1..3, 1..3] of < тип елементів >;

Введення / виведення масивів

Одномірні масиви

Як вже було сказано вище, операції введення та виведення виконуються не над масивом в цілому, у над окремими його елементами. Доступ до кожного елемента масиву здійснюється через операцію індексування, тому при введенні / виведенні зручно використовувати цикл з параметром. Припустимо, що необхідно ввести елементи одномірного масиву А, що описується так:

Const N=10;

Var  i:byte;

A: array [1..N] of real;

Далі у програмі необхідно задати цикл, у якому будуть перебиратися елементи масиву, починаючи з 1 до N:

for i:=1 to N do

 ReadLn ( A[i] );

Таким чином на першій ітерації циклу буде введений елемент А1, на другій – А2, на третій – А3 і так далі, доки не буде введений  А10.

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

for i:=1 to N do

 WriteLn ( A[i] );

Схема алгоритму для введення / виведення елементу масиву наведена на рис. 18.

Для формування рядка-підказки під час введення масиву можна трошки модифікувати наведений вище цикл:

for i:=1 to N do

 begin

    Write (‘Введіть А[’ ,  i,  ‘]: ’);    

    ReadLn ( A[i] );

end;

Тоді на екрані для першого елемента з’явиться підказка:

Введіть А [1] :

для другого:

Введіть А [2] :

і так далі, що значно прикрасить та полегшить введення.

Двовимірні масиви

Індексація елементів двовимірного масиву здійснюється за допомогою двох індексів – індексів рядка та стовпця. Тому при введенні / виведенні необхідно використовувати два цикли.  Припустимо, що необхідно ввести елементи матриці В, що описується так:

i =1, N

A [ i ]

Рис. 18. Алгоритм введення / виведення одномірного масиву

i =1, N

i =1, N

B [ i, j ]

Рис. 19. Алгоритм введення / виведення двовимірного масиву

Const N=10;

Var  i, j : byte;

В: array [1..N, 1..N] of real;

У програмі необхідно задати цикли: один для індексації рядків, другий для стовпців:

for i:=1 to N do

for j:=1 to N do

 ReadLn ( B[i, j] );

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

for i:=1 to N do

for j:=1 to N do

 WriteLn ( B[i, j] );

Схема алгоритму для введення / виведення елементу двовимірного масиву наведена на рис. 19.

Для формування рядка-підказки під час введення:

for i:=1 to N do

for j:=1 to N do

 begin

    Write (‘Введіть А[’ ,  i,   ‘,’  ,  j ,   ‘]: ’);    

    ReadLn ( A[i] );

end;

Правила використання вкладених циклів

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

for i:=1 to N do

for j:=1 to N do

 ReadLn ( B[i, j] );

Такі цикли називаються вкладеними. В даному випадку можна сказати, що цикл з параметром і є зовнішнім циклом, а цикл з параметром j – внутрішнім (або цикл  з параметром j вкладений в цикл з параметром і).

При першому входженні в зовнішній цикл і=1.

Далі потрапляємо во внутрішній цикл j=1. Вводиться елемент В [1,1].

j=2. Вводиться елемент В [1,2].

j=3. Вводиться елемент В [1,3].

І так далі, доки j=N. Вводиться елемент В [1,N].

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

Знову потрапляємо во внутрішній цикл j=1. Вводиться елемент В [2,1].

j=2. Вводиться елемент В [2,2].

І так далі, доки j=N. Вводиться елемент В [2,N].

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

Таким чином для кожної ітерації зовнішнього циклу виконуються всі ітерації внутрішнього циклу. Робота вкладених циклів закінчиться, коли будуть виконані всі ітерації зовнішнього циклу.

Спакований масив

Якщо при описі масиву використовується слово Packed то при виконанні програми елементи цього масиву розташовуються в пам’яті більш щільно, що дозволяє зекономити об’єм пам’яті, але не час доступу до даних.

Var

<ім’я масиву>:packed array [<тип індексу>] of <тип елементів>;

Рядки символів

Рядок – це спакований масив символів. Кількість елементів у рядку не може перевищувати 256. Рядок описується типом string:

VAR

S1:string ;   

при цьому описі рядок S1має максимальний розмір – 256 символів. При описі масиву можна явно задавати реальну довжину рядка, якщо відомо, що під час виконання програми її не буде перевищено.

VAR

S2:string [10] ;   

Рядок S2 має довжину  10 символів.

Над рядками припустимі такі операції :

  1.  присвоєння:

S2:=’Це рядок !’;

S1:=S2;

Треба звернути увагу на те, що рядок це масив, але при присвоєнні звичайні правила роботи з масивом, як можна бачити з наведеного приклада, не   дотримуються, але і не скасовуються. Можливий і такий варіант присвоєння:

S2[1]=’Ц’;  S2[2]=’е’; S2[3]=’  ‘ і так далі.

  1.  порівняння;

Вважається, що рядок S1=S2 , якщо S1i = S2i, де і змінюється від 1 до кінця рядка, тобто всі символи рядків співпадають.

Рядок S1 < S2, якщо існує будь-який символ у рядку S1, який менший за символ з тим же індексом рядка S2:

S1i < S2i      

Наприклад:

S1 := ‘Петров’

S2 := ‘Абрамов’

S3 := ‘Петрищенко’

Для цих рядків S1 > S2, тому що вже  при порівнянні перших символів рядків S1 та S2 символ  ‘П’ буде більший за ‘А’ (Насправді, як ви пам’ятаєте, при порівнянні символів порівнюються їх коди і вважається, що один символ більший (або менший) за інший, якщо його код більший (або менший) за код іншого символу).

За таким же принципом рядок S1 > S3, тому що при порівнянні  перші 4 символи обох рядків співпадають, але на п’ятому різняться і символ ‘o’ більший за ‘и’.

Під час порівняння рядків треба пам’ятати, що рядки  різної довжини порівнювати неможна.

В наведеному прикладі вважається, що рядки S1, S2, S3 були оголошені одним типом:

Var

S1, S2, S3:STRING [20];

Введення / виведення рядків символів

Для введення рядків використовується процедури Read, ReadaLn, для виведення – Write, WriteLn. Не зважаючи на те, що рядок це масив при введенні рядків не треба використовувати цикли. Рядки вводяться та виводяться як прості змінні:

ReadaLn (s);

WriteLn (‘ Був введений рядок ’, s);

Крім цього для рядків припустиме використання форматного виведення (вказується кількість символів в полі виведення рядка):

WriteLn (s : 10);

Процедури роботи з рядками

  1.  Delete (Var S:string; Index:integer;  Count:integer)  - видаляє підрядок з рядка S. Index - номер першого символу, що видаляється ;Count - кількість символів, що видаляються;
  2.  Insert (Source: string; Var S:string; Index:integer) - вставляє підрядок Source до рядка S . Якщо виходить рядок великого розміру, він скорочується до 255 символів. Index - номер позиції вихідного рядка, починаючи з якого буде вміщений поданий підрядок Source.
  3.  Str(X ; Var S:string) - перетворює число цілого типа чи типа real в послідовність символів.
  4.  Val(S:string; Var  X ; Var Code:integer) - перетворює рядок символів в змінну цілого типа чи типа real. Змінна  Code  дорівнює нулю: якщо перетворення відбулося без помилок.

Функції роботи з рядками

  1.  Concat (s1,s2,...,sn : string) : string - конкатенація (склеювання ) поданих рядків s1,s2,...,sn.
  2.   Copy ( S : string; n,k : integer) : string  - копіювання з поданого рядка S підрядка, який починається з позиції n та має довжину k.
  3.   Length (S : string ) : integer  -  обчислення довжини рядка S.
  4.   Pos (S : string; Substr : string ) : string -  пошук підрядка у рядку. Результатом функції є номер позиції, починаючи з якої підрядок Substr входить в рядок S. Якщо підрядка не знайдено , функція повертає 0.

Опис типізованих констант-масивів та констант-рядків

Загальний опис типізованих констант було наведено в темі №3. Для того щоб описати типізовану константу масив необхідно вказати ім’я константи, описати її тип-масив, а потім в круглих дужках через “;” перелічити значення елементів цього масиву. Якщо масив двовимірний, то кожний рядок береться в окремі дужки ( ).

Const

Zero : array [1..3] of byte = (0, 0, 0);

Double_zero : array [1..2, 1..3] of byte = ( (0, 0, 0), (0, 0, 0) );

{опис константи - рядка}

Prog : string [20] = ‘Turbo Pascal 7.0 !!!’;

Контрольні запитання за темою

  1.  Для чого у програмах використовують масиви даних?
  2.  Як розташовуються елементи масиву в пам’яті? Чи можуть елементи одного масиву бути розташовані в різних областях пам’яті?
  3.  Що таке одномірний масив, його опис у Паскаль – програмі?
  4.  Як здійснити введення  та виведення одномірного масиву. Наведіть приклад?
  5.  Що таке індексація елементів масиву? Якіми типами можуть описуватися індекси?
  6.  Як задається тип діапазон та тип перелічення?
  7.  Якого типу можуть бути елементи масиву? Чи може один масив містити елементи різних типів?
  8.  Багатовимірні масиви, їх опис у Паскаль – програмах?
  9.  Як здійснити введення та виведення двовимірного масиву? Наведіть приклад.
  10.  Які правила роботи вкладених циклів?
  11.  Як описуються багатовимірні масиви даних?
  12.  Які операції припустимі над масивами?
  13.  Що являє собою тип string? Для чого він використовується?
  14.  Як здійснюється введення та виведення рядків символів? Які операції застосовуються над рядками? Як здійснюється порівняння рядків?
  15.  Як застосовуються процедури роботи з рядками: Delete, Insert та функції роботи з рядками Copy, Length, Concat, Pos?
  16.  Як описуються типізовані константи-масиви та рядки?


ТЕМА 8 Обробка файлів даних у програмах мовою Паскаль 

Програмна модель файлу

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

З точки зору програми мовою Паскаль файл може мати три іпостасі або бути поданим в трьох формах:

  1.  типізований файл:
  2.  нетипізований файл;
  3.  текстовий файл.

0

1

К

компонент 1

компонент 2

. . .

компонент К-1

EOF

 файловий покажчик 

Рис. 20. Модель типізованого файлу

Типізований файл – являє собою лінійну послідовність компонентів (елементів) одного типу і, як слідство цього, одного розміру (рис. 20). Всі компоненти файлу пронумеровані, починаючи з 0. Але це не означає, що файл організований аналогічно масиву. Нажаль, до компонентів файлу не можна звертатися за їх індексами. Наприкінці файлу встановлюється управляючий символ EOF (end of file) – ознака кінця файлу.

В Паскаль-програмі розмір типізованого файлу вимірюється не в байтах, а в компонентах, тобто кількість компонентів файлу є його розміром.

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

Нетипізований файл – являє собою лінійну послідовність байтів. Для швидкісного зчитування даних з нетипізованого файлу до пам’яті та запису з пам’яті на диск нетипізований файл розбивається на блоки фіксованого розміру (рис.21). Бажано, щоб розмір блоку був 128, 256, 512 і т.д. байтів (це обумовлено фізичною організацією дискового простору). Переваги використання нетипізованого файлу відчутні при роботі з великими масивами даних, тому що існує можливість перенесення інформації не по окремих елементах, а блоками (гуртово).

байти

EOF

блок 1

блок 2

. . .

блок N

Рис. 21. Модель нетипізованого файлу

Текстовий файл – являє собою послідовність символів. Текстовий фал може бути розбитий на рядки ( EOLN (end of line) – ознака кінця рядка). Наприкінці файлу знаходиться ознака EOF (рис. 22).

рядок символів

EOLN 

рядок символів

EOLN 

рядок символів

EOF

Рис. 22. Модель текстового файлу

Файли прямого та послідовного доступу

Файли за порядком доступу до своїх компонентів розподіляють ся на файли прямого та послідовного доступу.

Файли прямого доступу – це файли, у яких при зчитування або запису компонентів можна звертатися до довільного компонента, пересунувши на нього файловий покажчик.

Файли послідовного доступу – це файли, для яких при зчитуванні або записі компонента необхідно спочатку прочитати всі передуючі компоненти, щоб отримати доступ до необхідного.

Типізовані та нетипізовані файли – це файли прямого доступу. Текстові файли – це файли послідовного доступу.

Обробка файлів у програмі мовою Паскаль

У програмах файли використовуються для постійного збереження даних. Для того щоб у програмі здійснити звернення до файлу необхідно:

  1.  Оголошення файлової змінної 

Файлова змінна ( ФЗ ) – це спеціалізована змінна програми для доступу до файлів.

Відповідно до типу файлу файлова змінна може бути одного з трьох типів:

  1.  типізована файлова змінна оголошується:

< ідентифікатор ФЗ> : file of <тип компонентів файлу> ;

Наприклад:

Var

F:file of integer; {ФЗ для доступу до файлу з цілими числами}

G:file of real; {ФЗ для доступу до файлу з дійсними числами}

  1.  нетипізована файлова змінна:

< ідентифікатор ФЗ> : file ;

Наприклад:

Var

H:file; {нетипізована ФЗ}

  1.  текстова файлова змінна

< ідентифікатор ФЗ> : text ;

Наприклад:

Var

J:text; {ФЗ для доступу до текстового файлу}

  1.  Зв’язування файлової змінну з файлом на диску

 Ця операція виконується за допомогою процедури:

Assign (<ФЗ>, <ім’я файлу>);

<ФЗ> – файлова змінна будь-якого типу;

<ім’я файлу>  - повне ім’я файлу, що включає ім’я диску, список каталогів та безпосередньо ім’я файлу з розширенням. Ім’я файлу – це послідовність символів, тобто змінна типу string або рядкова константа. Наприклад:

Assign(f, ‘c:\MyDir\myfile.dat’);

В наведеному прикладі файлова змінна f зв’язується з фаайлом, що розташований на диску c: в каталозі MyDir. Ім’я файлу – myfile, розширення dat.

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

  1.  Відкриття файлу

Для того щоб отримати доступ до компонентів файлу, його необхідно відкрити.

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

Відкриття типізованого файлу

Відкриття вже існуючого типізованого файлу здійснюються за допомогою процедури:

Reset (<ФЗ>);

де < ФЗ >  - файлова змінна.

При відкритті типізованого файлу командою Reset припустиме виконання операцій зчитування та запису компонентів файлу.

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

Відкриття нового типізованого файлу здійснюється процедурою:

Rewrite (<ФЗ>);

яка відкриваю типізований файл для запису в нього інформації.

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

Відкриття нетипізованого файлу

Відкриття вже існуючого нетипізованого файлу для зчитування здійснюються за допомогою процедури:

Reset (<ФЗ>, Size);

де < ФЗ >  - файлова змінна, Size – розмір блоку у байтах.

Відкриття нового нетипізованого  файлу для запису:

Rewrite (<ФЗ>, Size);

Другий параметр Size в цих процедурах не є обов’язковим. Якщо його не вказано, то вважається, що розмір блоку по замовчанню 128 байтів.

Відкриття текстового файлу

Відкриття текстового файлу здійснюється також як і відкриття типізованого файлу, але для текстового файлу процедура Reset відкриває файл тільки для зчитування, а Rewrite – тільки для запису. Крім того для текстових файлів застосовується ще процедура

Append(< ФЗ >);

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

  1.  Доступ до елементів файлу

Стандартні процедури і функції для файлів всіх типів

Еоf (<ФЗ>) : boolean

Функція повертає значення true, якщо досягнутий кінець файлу або false у протилежному випадку.

Дуже зручно використовувати цю функцію при організації циклічного зчитування з файлу. Розглянемо приклад: заданий файл ‘c:\myfile.dat’, що містить непусту послідовність цілих чисел. Обрахувати суму цих чисел.

var

F: file of integer;  {файл цілих чисел}

S: longint;   {накопичувач суми}

x:integer; {проміжна змінна для зчитування компонентів файлу}

begin

{відкриття файлу для зчитування}

Assign (F, ‘c:\myfile.dat’);

Reset(F);

S:=0;

while not EOF (F) do

 begin

read(F, x);

S:=S+x;

 end;

Close (F); {закриття файлу}

Writeln (‘S=’, S:10);

end.

В наведеному прикладі на початку програми файлова змінна зв’язується з вказаним у задачі файлом на диску, який відкривається для зчитування. Тіло циклу while  буде повторюватися доки не буде досягнуто кінець файлу. У циклі з файлу послідовно зчитується по одному компоненту та додаються до суми. По завершенні циклу значення суми виводиться на екран.

Стандартні процедури і функції для файлів прямого доступу

Seek(< ФЗ >, N )

Процедура переміщує файловий покажчик з поточної позиції на вказану компоненту  з номером N (значення N типу longint).

Filepos (< ФЗ >) :longint

Функція повертає номер компоненту файлу, на який встановлений файловий покажчик.

Filesize (< ФЗ >) :longint

Функція повертає розмір файлу, що вимірюється не в байтах, а в компонентах (кількість компонент).

IOResult(< ФЗ >): integer

функція повертає номер помилки, яка виникла при звернені до файлу. Якщо помилок не було, то повертається 0.

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

Для того щоб відключити видачу стандартного повідомлення про помилку необхідно дати директиву компілятору {$I-}. Якщо на початку в тексті програми задати цю директиву, то під час виконання не будуть видаватися повідомлення про помилку.

Для того щоб все повернути назад у програмі треба вказати директиву {$I+}.

Стандартні процедури і функції для текстових файлів

ЕOLN (<ФЗ>) : boolean

Функція повертає значення true, якщо досягнутий кінець рядка (або кінець файлу) або false у протилежному випадку.

SeekEOLN (<ФЗ>);

Пересуває файловий покажчик на кінець рядка.

SeekEOF (<ФЗ>);

Пересуває файловий покажчик на кінець файлу.

Стандартні процедури і функції зчитування/ запису даних

Для зчитування і запису даних у типізованих та текстовий файлів використовується процедури Read та Write.

Read (< ФЗ >, < список введення > );

Write (< ФЗ >, < список виведення > );

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

Для текстових файлів можливо використання процедур

ReadLn (< ФЗ >, < список введення > );

WriteLn (< ФЗ >, < список виведення > );

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

Особливості використання текстового файлу

Як вже було сказано вище текстовий файл містить набір рядків символів. Здавалось би, що це накладає певні обмеження на тип інформації, що передається з файлу та в файл (тобто передаються тільки рядки символів). Але для текстового файлу такого обмеження не існує!

При виконанні операцій зчитування та запису текстового файлу дозволяється передача даних чисельних і нечисельних типів без попередньої конвертації (перетворення) у рядок. Таке перетворення відбувається автоматично при передачі даних.

Але при зчитуванні треба бути певними, що дані, які містить файл дійсно відповідають тим типам змінних, які будуть зчитуватися.

Розглянемо приклад: скласти програму для обчислення

,

де a, b – цілі, x – дійсне зберігаються у файлі.

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

Var

a, b: integer;

y, x: real;

f: text;

begin

{відкриття файлу}

Assign (f, ‘c:\datafile.dat’);

Reset (f);

{зчитування змінних}

Read (f, a, b, x);

y:=srt ( abs(a+b*x) );

WriteLn(‘y=’, y:9:4);

Close (f);

end.

При зчитуванні вважається, що файл містить всю необхідну інформацію, яка подана у форматі, що відповідає типу заданих змінних, тобто для правильного виконання процедури Read (f, a, b, x) у файлі f записані два цілочисельних значення (для змінних a і b) та одне дійсне для змінної x. Ці значення вказуються у файлі через прогалину. Наприклад, якщо файл містить таку послідовність:

5 5 4.0

то змінна а дорівнюватиме 5, b теж дорівнюватиме 5, а х=4.0. Тоді значення у буде 5.0.

Для нетипізованих файлів використовуються процедури:

BlockRead (< ФЗ >, Buf, N, Result);

яка зчитує з файлу, з яким пов’язана файлова змінна < ФЗ >  N блоків і записує їх в змінну Buf. Вважається, що змінна Buf достатня за розміром і у файлі вистачить даних. Змінна Result не є обов’язковим параметром. Якщо вона використовується, то повертає кількість реально зчитаних блоків. Після виконання операції зчитування файловий покажчик пересувається на відповідну кількість блоків.

Для запису даних у нетипізований файл використовується процедура:

BlockWrite (< ФЗ >, Buf, N, Result);

яка записує в файл, з яким пов’язана файлова змінна < ФЗ >  N блоків зі змінної Buf. Змінна Result також не є обов’язковим параметром. Якщо вона використовується, то повертає кількість реально зчитаних блоків.

Розглянемо приклад: зчитати з нетипізованого файлу ‘c:\DataFile.dat’  цілочисельні дані для масиву А(100). Звести елементи масиву в квадрат та записати знову до файлу.

Var

F: file;

A: array [1..100] of integer;

i: byte;

begin

{зв’язування файлу з ФЗ}

Assign (F, ‘c:\DataFile.dat’);

{відкриття файлу для зчитування}

Reset (F, SizeOf(A));

{зчитування даних з файлу до масиву А}

BlockRead (F, A, 1);

Close (F); {закриття файлу}

{обробка елементів масиву}

for i:=1 to 100 do

 A[i]:=sqr(A[i]);

{відкриття файлу для запису}

Rewrite(F, SizeOf(A));

{запис даних з масиву А до файлу}

BlockWrite(F, A, 1);

Close(F);  {закриття файлу}

end.

На початку програми нетипізований фай відкривається для зчитування (дивися розд. “Відкриття нетипізованого файлу”).  Другим параметром процедури Reset  є розмір блока файла. Для зручності розмір блока файла призначається рівним розміру масиву А.

Функція SizeOf (Х) повертає розмір заданого аргументу Х, яким може бути будь-яка змінна або тип даних.

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

  1.  Закриття файлу

Після закінчення роботи необхідно закрити файл процедурою:

close (<ФЗ>);

Якщо файл не закрити, то можна втратити інформацію, особливо якщо проводився запис даних у файл.

Після закриття файлу, у разі необхідності, файлова змінна може бути зв’язана з іншим файлом.

Зовнішні пристрої і стандартні текстові файли

Зовнішні пристрої операційної системи такі як клавіатура, дисплей, принтер, послідовні та паралельні порти можуть бути описані та використані у програмі як файли зі стандартними іменами:

CON – стандартний текстовий файл консолі. В залежності від напряму передачі даних пов’язаний з клавіатурою або екраном;

PRN – стандартний файл принтера;

LPT1, LPT2 – стандартні файли паралельних портів;

COM1, COM2– стандартні файли послідовних портів;

AUX – синонім СОМ1;

NUL – неіснуючий пристрій.

Крім цього для введення та виведення можуть використовуватися стандартні текстові файли:

Input – стандартний текстовий файл, що пов’язаний з буфером клавіатури;

Output – стандартний текстовий файл, що пов’язаний з буфером виведення на екран;

Контрольні запитання за темою

  1.  Що таке файл? Коли доцільно зберігати у файл дані з програми?
  2.  Форми подання файлу у Паскаль - програмі? Що таке типізований, нетипізований та текстовий файл?
  3.  Моделі типізованого, нетипізованого та текстового файлу як лінійної послідовності компонентів?
  4.  Для чого потрібна у програмі файлова змінна? Типи файлових змінних. Наведіть приклади їх оголошення.
  5.  Організація доступу до файлу з програм мовою Паскаль. Призначення процедур Assign, Reset, Rewrite, Append, Close.
  6.  Процедури і функції роботи з типізованим файлами FilePos, FileSize, Seek, EOF.
  7.  Як здійснюється файлове введення \ виведення даних з типізованого та нетипізованого файлу?
  8.  Особливості структури текстового файлу. Процедури і функції роботи з текстовими файлами. Чи можна у текстовий файл записати чисельні значення? Наведіть приклади.
  9.  Стандартні текстові файли введення \ виведення Input та Output.
  10.  Як здійснюється доступ до портів з програми мовою Паскаль?


ТЕМА 9 Структура типів даних мови Паскаль

Загальна характеристика типів даних мови Паскаль

Типи даних мови Паскаль

Прості

Структуровані

Процедурні

Покажчики

Об’єкти

Порядкові

Дійсні

Цілі

Символьні

Логічні

Масиви

Рядки

Файли

Записи

Множини

Тип-діапазон

Перелічення

Рис. 23. Структура типів мови Паскаль

Всю множину типів мови Паскаль можна розділити на декілька груп (рис. 23).

До простих типів даних відносяться порядкові та дійсні типи.

Порядкові типи відрізняються тим, що кожний з них має обмежену кількість можливих значень. Наприклад, змінні цілочисельного типу byte може змінюватися в діапазоні від 0 до 127 і приймає тільки цілі значення. Таким чином кількість можливих значень обмежена. Тип  char включає 256 символів, тобто  кількість можливих значень, що приймає змінна цього типу також кінцеве. Не говорячи вже про логічний тип boolean, для якого змінна може приймати тільки 2 значення: true або false.

На відміну від порядкових типів для дійсні типи неможливо перелічити всі значення, які може приймати змінна. Довести це дуже просто. Розглянемо інтервал від 0.1 до 0.2. До нього входять 0.11, 0.111, 0.1111 і так далі. Хіба можна перелічити всі дійсні числа, що потрапляє у цей маленький інтервал?

Але треба пам’ятати те, що при поданні в ЕОМ кількість припустимих значень дійсних типів все ж таки обмежена внутрішнім форматом, але навіть це не дає можливості перелічити всі можливі значення.

В темі №2 цього лекційного курсу детально були розглянуті цілочисельні, символьні, логічні та дійсні типи даних. Тема №7 присвячена масивам та рядкам, також в ній розглядаються тип перелічення та діапазон. Тема №8 стосується файлового типу. Об’єктний тип даних буде розглянутий при вивченні теми “Об’єктно-орієнтований підхід до розробки програмного забезпечення”, типи покажчиків в темі “Динамічний розподіл пам’яті”, процедурний тип після теми “Підпрограми”, що не ввійшли до першої частини конспекту.

Крім цього мова Паскаль надає можливість створювати нові типи даних, що описуються в розділі TYPE. Використання механізму створення власних типів, типи запис та множина будуть розглянуті нижче.

Тип запис мови Паскаль

Дуже часто у програмах необхідно обробляти набори даних різних типів як єдине ціле. Наприклад, якщо вводити у програму дані з екзаменаційної відомості: прізвище студента (описується типом string), номер залікової книжки (цілочисельний тип), екзаменаційна оцінка (тип-діапазон 2..5 на базі цілочисельного). Всі ці дані пов’язані між собою і повинні оброблятися як єдине ціле. Враховуючи те, що студентів в групі не більше 30, можна було би використовувати масив, але дані різнотипні, тому простий масив використати неможна.

У таких випадках для найдоцільнішим буде використання типу запис.

Запис – це складний тип даних, що включає декілька частин – полів запису і кожне поле описується певним типом. Змінна – запис описується типом record , після якого задаються назви полів запису та їх тип. Опис закінчується ключовим словом end:

Var

<ім’я запису> = record 

 <ім’я поля 1> : <тип поля 1>;

 <ім’я поля 2> : <тип поля 2>;

   . . .

 <ім’я поля М> : <тип поля М>;

end;

Для того щоб спростити собі процедуру опису змінної – запису, подамо необхідні дані у вигляді таблиці з назвою “СТУДЕНТ”:

Прізвище студента

Номер заліков. книжки

Оцінка

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

Прізвище студента

Номер заліков. книжки

Оцінка

string [20]

word

2..5

Тепер опишемо змінну типу запис для збереження даних про студента:

Var

Student : record 

 FIO : string[20]; { поле для зберігання прізвища}

 Numb : word; { поле з номером заліковки}

 Mark : 2..5;  { поле - оцінка}

end;

Для того щоб змінній студент присвоїти значення, необхідно звертатися окремо до кожного поля:

Student.FIO:=’Іваненко П.П.’;

Student.Numb:= 345;

Student.Mark:= 5;

Тепер змінна Student зберігає дані про студента Іваненко П.П., у якого номер заліковки 345, і який на іспиті отримав оцінку 5.

Таким чином, для того щоб полю запису присвоїти якісь значення необхідно вказати ім’я запису та через крапку ім’я поля. Це називається операцією розкриття запису:

< ім’я запису > . < ім’я поля > := < значення > ;

Оператор приєднання

Для того щоб спростити доступ до полів і не повторювати кожен раз ім’я запису, використовується оператор приєднання:

with < ім’я запису > do 

< ім’я поля > := < значення > ;

Присвоєння даних запису Student буде виглядати так:

with Student do

 begin

  FIO:=’Іваненко П.П.’;

  Numb:= 345; 

  Mark:= 5;

end;

Зверніть увагу на те, що в наведеному прикладі використовується операторні дужки (begin – end), тому що після do, згідно з правилами мови Паскаль, може виконуватися тільки один оператор, а необхідно – три, тому вони згруповані в один складений оператор.

Опис власного типу даних

Найчастіше при роботі з записом описують спочатку тип запису, а потім цей тип використовують при описі змінних. Опис типів, як вже говорилося в попередніх темах, здійснюється в розділі TYPE. Давайте опишемо тип запису для “нашого бідного студента”:

Type

StudentType = record 

 FIO : string[20];

 Numb : word;

 Mark : 2..5;  

end;

Тепер можна описати змінну:

Var

Student : StudentType;

Використання масиву записів

З використання вище описаного типу можна задати масив записів для збереження даних про студентську групу:

StudentGroup : array [1..30] of StudentType;

Для доступу до елементів масиву використовується операція  індексування та розкриття запису:

StudentGroup [1] . FIO := Андрейченко‘; 

StudentGroup [1] . Numb := 367;

StudentGroup [1] . Mark := 5;

або з оператором приєднання:

with StudentGroup [1] do

 begin

  FIO:=’Андрейченко’;

  Numb:= 367; 

  Mark:= 5;

end;

Якщо проводити, наприклад, введення елементів масиву, то підійде такий оператор циклу:

for i:=1 to 30 do

 with StudentGroup [i] do

   begin

Write (‘Введіть прізвище ’ , i:3, ‘ студента :’);

Read (FIO);

Write (‘Введіть номер його заліковки :’);

Read (Numb);

Write (‘Введіть його оцінку :’);

Read (Mark);

   end;

Використання вкладених записів

Будь-яке поле запису може мати також складну структуру, тобто бути також записом. Наприклад, розглянемо структуру даних, в якій повинно зберігатися прізвище людини та її адреса (місто, вулиця, № будинк, № квартири). У табличній формі ці дані будуть виглядати так:

Прізвище

Адреса

Місто

Вулиця

№ будинку

Квартира

Відповідно поля будуть мати такі типи:

Прізвище

Адреса

Місто

Вулиця

№ будинку

Квартира

string[20]

string [12]

string[20]

byte

word

Поле “Адреса” складається з 4 частин і є також записом. Мовою Паскаль тип для запису такої структури описується так:

Type

ManType = record

FIO: string[20];

Address: record

 Misto: string [12];

Vul: string[20];

Bud: byte;

Kv: word;

end;

end;

Для адреси також можна записати окремий тип, тоді загальний опис запису зміниться так:

Type

AddressType = record

 Misto: string [12];

Vul: string[20];

Bud: byte;

Kv: word;

end;

ManType = record

FIO: string[20];

Address: AddressType ;

end;

Опишемо змінну цього типу:

Var

Man: ManType ;

Для доступу до полів поля адреси необхідно використовувати подвійну операцію розкриття запису:

Man . Adress . Misto := ‘Київ’;

Man . Adress .  Vul := ‘Хрещатик’;

Man . Adress . Bud := 1;

Man . Adress . Kv := 26;

Якщо до оператора приєднання занести повторювану частину, о отримаємо:

with Man . Adress do

 begin

   Misto := ‘Київ’;

   Vul := ‘Хрещатик’;

   Bud := 1;

   Kv := 26;

end;

Запис з варіантною частиною2*

Тип-запис може мати варіантну частину, яка змінюється при різних реалізаціях, наприклад, в типі-запису параметрів геометричних фігур для квадрату задається сторона, для трикутника – дві сторони та кут між нами, для кола – радіус і т.д. Варіантна частина може бути тільки одна і розташовується наприкінці запису:

Type

Figure = (Square, Triangle, Circle);

Param = record

X, Y: Real;

 Case Figе: Figure of

Square: (Side: Real);

Triangle: (Side1, Side2, Angle: Real);

Circle: (Radiuse: Real);

 end;

Var

MySquare, MyTriangle, MyCircle: Param;

Варіантна частина починається зі слова Case, за яким слідує змінна вибору варіанта (в наведеному прикладі Figе) з описом типу. Далі вказуються константи, значення яких може приймати змінна вибору (у прикладі Square, Triangle, Circle, які були описані в типі-переліченні Figure). За кожною константою після двох крапок у дужках описуються поля варіантної частини запису з описом типу. Дужки є необхідними, навіть якщо варіантна частина відсутня для даного варіанту. Треба відмітити, що варіантна частина не завершується своєю операторною дужкою end, так як звичайна конструкція Case, так як далі йде завершальна операторна дужка end всього типу.

В стандарті мови Паскаль перед тим як використовувати один з варіантів запису, змінній вибору варіанта треба присвоїти відповідне значення:

MySquare. Fige:= Square;

MySquare. Side:= 15.5;

MySquare.x:=0.5;

MySquare.y:=7.5;

В Turbo Pascal цю операцію виконувати не обов’язково, але, якщо змінна вибору задана, її значення можна переглянути в програмі, для того щоб визначити, який був заданий варіант. [1]

Тип множина

З терміном множина всі знайомляться в курсі математики. Множина – це набір однотипних логічно пов’язаних між собою об’єктів  [3]. Мова програмування Паскаль надає для утворення множин спеціальний тип даних, який будується на базі порядкових типів (аналогічно типу-діапазон):

set of <перелічення припустимих значень>;

Розглянемо приклади опису власних типів-множин на базі символьного  і цілочисельного типів:

Type

Digits = set of ‘0’..’9’;

AlphaBet = set of ‘A’..’Z’;

Alpha_Dig = set of ‘0’..’9’, ‘A’..’Z’;

Dig_int = set of 0..9;

Double_dig= set of 10..99;

Var

D:Digit;

A:AlphaBet;

Dig:Double_dig;

Кількість елементів множини не може перевищувати 256. Елементи внутрі множини нумеруються від 0 до 255 (номер можна отримати за допомогою функції ord).

Ініціалізація змінних відбувається за допомогою конструктору множини – списку елементів множини, які перелічуються через кому:

D:=[ ‘0’, ’3’..‘5’, ‘9’];

A:= [];

Dig:=[11, 22, 33, 44, 55,  66, 77, 88, 99];

Зверніть увагу на те, що елемента, які записуються до множина задаються у квадратних дужках. Якщо вказати путі квадратні дужки (змінна А), то множина буде пустою.

Операції над множинами

Над множинами припустимі такі операції:

*  пересічення множин. Результат містить елементи, що є спільними для обох множин. Припустимо задані дві множини:

Var

A,B,С:set of 1..10;

Їм присвоєні такі значення:

A:=[1,3,5,7,9]; B:=[3,4,8,9,10];

Тоді С:=А*В дасть [3,9].

+  об’єднання множин. Результат містить елементи обох множин. С:=А+В дає [1,3,4,5,7,8,9,10].

-  різниця множин. Результат містить елементи першої множини, що не входять до другої. С:=А-В дає [1,5,7].

= перевірка еквівалентності множин. Результат дорівнює true, якщо множини еквівалентні.

< > перевірка нееквівалентності множин. Результат дорівнює true, якщо множини нееквівалентні.

<= перевірка входження, повертає true, якщо перша множина включена до другої.

>= перевірка входження, повертає true, якщо друга множина включена до першої.

in перевірка належності певного значення до елементів множина, повертає true, якщо елемент належить множині. Першим операндом цієї операції має бути вираз, результат, якого співпадає з базовим типом множини. Другий операнд – множина, або конструктор множини:

3 in A дає true;

7*7 in B дає false.

Додатково до цих операцій можливо використовувати дві процедури:

INCLUDE (< множина > , < елемент > ) – включає новий елемент до множини.

EXCLUDE (< множина > , < елемент > ) – виключає з множини заданий елемент.

На різницю від операцій + та – ці процедури виконують дії над елементом і множиною, а не над двома множинами.

Опис типізованих констант-записів та констант-множин

Визначення типізованих констант-записів має вигляд:

< ім’я константи > : < тип запису > = (< список значень полів >) ;

< ім’я константи > - довільний правильний ідентифікатор;

< тип запису > - ідентифікатор типу запису, який декларований в розділі type;

< список значень полів > включає ідентифікатори полів, дві крапки, значення полів, які задаються у круглих дужках і розділяються крапкою з комою:

(< ідентифікатор поля 1> : < значення поля 1 >;

< ідентифікатор поля 2> : < значення поля 2 >; і так далі );

Наприклад;

 type

 TZero = record

       x,y,z:real;

 end;

Const

Zero: TZero = (x:0; y:0; z:0);

Визначення типізованих констант-множин має вигляд:

< ім’я константи > : < тип множини > = < конструктор множини > ;

< ім’я константи > - довільний правильний ідентифікатор;

< тип запису > - ідентифікатор типу множини, який декларований в розділі type;

< конструктор множини > - перелічення значень елементів, що подаються у квадратних дужках.

Type

Seconds = set of 0..59;

Digits = set of ‘0’..’9’;

Const

Half_min: Seconds = [0..29] ;

Empty : Digits = [ ];

Контрольні запитання за темою

  1.  На які групи можна розділити всю множину типів мови Паскаль? Дайте коротку характеристику типів кожної групи.
  2.  Для чого використовується тип запис мови Паскаль? Як описуються змінна цього типу?
  3.  Як проводиться ініціалізація полів запису? Що таке розкриття запису?
  4.  Для чого використовується оператор приєднання? Наведіть синтаксис його опису.
  5.  Як описується власний тип даних  запис?
  6.  Як описується масив записів? Як здійснюється доступ до елементів цього масиву та їх полів?
  7.  Як здійснити введення / виведення елементів масиву записів?
  8.  Для чого і як використовуються записи з варіантною частиною? Чи може бути в записі дві варіантні складові?
  9.  Що таке множина і як вона описується у програмі мовою Паскаль?
  10.  Чи обмежена кількість елементів множини? Чи може бути пуста множина?
  11.  Що таке конструктор множини, для чого він використовується і який в нього синтаксис опису?
  12.  Які операції над множинами ви знаєте і які правила їх застосування?
  13.  Для чого використовуються процедури INCLUDE та EXCLUDE? Чим вони відрізняються від операцій + та - ?
  14.  Як описуються типізовані константи-записи?
  15.  Як описуються типізовані константи-множини?

ТЕМА  10  Побудова графіку функції

Підключення графічної бібліотеки 

Мова Паскаль

Мова Сі

Uses Graph;

#include <graphics.h>

… … …

… … …

Ініціалізація графічного режиму роботи екрану

Мова Паскаль

Мова Сі

Procedure Init_Graph;

void init_graph(void)

Var

{

  GraphDriver, GraphMode,

ErrorCode : integer;

int GraphDriver, GraphMode,

ErrorCode;

begin

  GraphDriver := detect;

GraphDriver = DETECT;

   InitGraph(GraphDriver ,

GraphMode,’ ’);

initgraph(&GraphDriver, &GraphMode,

" " );

    ErrorCode :=GraphResult;

ErrorCode = graphresult();

    if ErrorCode <>grOK Then

if( ErrorCode != grOk )

      begin

{

WriteLn(‘Graphics System Error:’,  

GraphErrorMsg(ErrorCode ));

printf(" Graphics System Error: %s\n",

grapherrormsg( ErrorCode ) );

Halt;

   exit( 1 );

      End;

}

End;

}

Якщо при ініціалізації не виникло помилок, графічний режим роботи екрану встановлено і можна будувати зображення.

Установка розмірів активного вікна для виводу зображення

Установка розмірів активного вікна здійснюється процедурою SetViewPort(x1,y1,x2,y2,ClipOn), де x1,y1,x2,y2 - координати, відповідно, лівого верхнього та правого нижнього кутів вікна у пікселах.

Мова Паскаль

Мова Сі

SetViewPort(x1,y1,x2,y2, ClipOn)

setviewport(x1,y1,x2,y2, CLIPON)

Відображення осей координат

При відображенні осей координат та графіку функції необхідно врахувати такі фактори:

  1.  початок координат розташований в лівому верхньому куті встановленої робочої області(або екрану);
  2.  вісь ординат(У) екрану спрямована донизу;
  3.  координати точок на екрані вимірюються в пікселах.

(0,0)

вікно

виводу

(Cx,Cy)

екран

Xе

Yе

(maxX, maxY)

(х1, y1)

(x2, y2)

Побудова графіка здійснюється відносно умовного центру з координатами (Cx,Cy) (дивися рисунок).

Якщо центр координат розташований по центру екрана, то його координати можна визначити так:

Тоді координати кінців осей координат будуть приблизно такі:

Ось

Початок

Кінець

Х

У

Х

У

Х

x1+10

Cy

x2-10

Cy

У

Cx

y1+10

Cx

y2-10

Віднімання або додавання 10 пікселів необхідно для того, щоб ось трохи відступала від границь вікна.

Для зображення осей необхідно скористатися процедурою Line, встановивши перед цим колір та стиль для виведення ліній:


Паскаль

Сі

SetLineStyle(SolidLn, 0, NormWidth );

SetColor(колір_осей);

Line(…);{координати кінців осі Х}

Line(…);{координати кінців осі У}

setlinestyle(SOLID_LINE, 0,

NORM_WIDTH);

setcolor(колір_осей);

line(…); line(…);

Для виведення стрілок та підписів осей можна скористатися процедурою текстового виведення OutTextXY, задавши для виведення стрілок символи ‘^’, ‘>’.

Паскаль

Сі

OutTextXY(кординати Х, У кінця осі, ‘^’);

OutTextXY(кординати Х, У кінця осі, ‘Y’);

outtextxy(кординати Х, У кінця

осі, “^”);

outtextxy(кординати Х, У кінця

осі, “Y”);

Крім того стрілки можна вивести, намалювавши їх крильця двома лініями.

Після виведення стрілок та підписів осей необхідно провести тестовий запуск програми для отримання насолоди від побудованого зображення або(та) виправлення помилок.

Вибір масштабу зображення

Визначення масштабних коефіцієнтів необхідно тому, що відстань в 1 піксел значно менше, ніж відстань, наприклад, в 1 см. Для вибору масштабу зображення необхідно:

  1.  визначити діапазон зміни значень по осям. По осі х – це заданий інтервал [a, b], по осі У – [minY, maxY], що можна визначити з таблиці табулювання функції;
  2.  розрахувати коефіцієнти масштабування за такими формулами:

.

Побудова графіку функції

Якщо точка А в декартовій системі координат має координати (XA,YA), то для виводу на екран  їх треба переобчислити  за формулами:

де  Мху - масштабні коефіцієнти, які є необхідними для переведення величин XA,YA в пікселі. Віднімання при обчисленні У-координат визначено тим, що ось У екрану спрямована донизу.

(0,0)

вікно

виводу

XA

YA

(Cx,Cy)

A

екран

YAе

XAе

Xе

Yе

(maxX, maxY)

Побудувати графік можна, протабулювавши функцію з малим кроком для х і вивівши на екран щільну послідовність пікселів процедурою PutPixel. Наприклад:

Паскаль

Сі

x:=a, dx:=0.1;

while x<=b do

begin

PutPixel(Cx+x*Mx, Cy-f(x)*My

колір_пікселя);

x:=x+dx;

end;

x=a, dx=0.1;

while (x<=b)

{

putpixel(Cx+x*Mx, Cy-f(x)*My

колір_пікселя);

x+=dx;

}

ТЕМА  11 Розробка програм з підпрограмами.

Підпрограма.

Виклик підпрограми.

“Чорна скриня”.

Специфікація підпрограми.

Функція.

Параметри підпрограми.

Формальні параметри;

Фактичні параметри.

Глобальні ідентифікатори.

Локальні ідентифікатори.

Час життя змінної.

Область дії імен(область видимості).

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

Підпрограма, формальні та фактичні параметри підпрограми, локальність та глобальність змінних, час життя та область дії змінної.

ТЕМА  12 Математичне моделювання функціональних залежностей

Обчислення суми степеневого ряду: 

Обчислити суми ряду

        (1)

з заданою точністю на проміжку [a,b], де a<b  при при .

  1. Скласти ітеративну функцію обчислення значення суми ряду (1).
  2. Скласти рекурсивну функцію обчислення суми ряду (1).
  3. Скласти програми для обчислення суми ряду (1) з заданою точністю на заданому проміжку.
  4. Порівняти результати Ваших обчислень з результатом роботи стандартної функції мови програмування.
  5. Побудувати графік функції на певному обраному проміжку(вивести одним кольором графік функції, точки для якого обчислюються “своєю” функцією, іншим – графік, точки для якого обчислюються стандартною функцією). Для побудови графіка скласти підпрограму, параметром, якої буде функція розрахунку.

Математична постановка задачі (МПЗ).

Під терміном “табулювання функції” розуміють обчислення n значень певної функції y=f(x) для х, значення якого належать проміжку [a,b] і змінюється з кроком x (рис.1). Отже, необхідно обчислити значення:

,

,

.

Якщо задано n – кількість точок на проміжку, тоді .

Процес обчислення значень функції носить циклічний характер, тіло циклу складають дії:

.

Математична постановка задачі обчислення значення функції для кожної із точок 

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

,

де - наступний член ряду, - попередній член ряду, правило, за яким утворюється новий член ряду.

Наближене значення суми ряду можна отримати або обмежуючись сумою перших N членів ряду (1), або обчислюючи суму з наперед заданою точністю .

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

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

Отже обчислення суми ряду переривається коли:

.

Розглянемо обчислення суми такого ряду (1). Він буде спадним для .

По-перше, необхідно встановити рекурентне співвідношення для членів ряду. Якщо за  взяти , тоді для отримання наступного члену необхідно чисельник помножити на , а знаменник збільшити на 2. Це співвідношення вірне і для .

Ітеративний підхід

Якщо прийняти , тоді початкове значення , .

.      (2)

Наступне значення для a та b будуть:

.     (3)

Обчислення суми ряду (1) переривається для  (ряд буде спадним), коли:

.      (4)

Обчислення суми ряду (1) переривається для . обмежуючись сумою перших N членів ряду

Рекурсивний підхід

З формули (1) зрозуміло, що S обмежуючись сумою перших N членів ряду можна подати як функцію від a та b– S(a, b)., тоді (2) трансформується в вираз:

,     (5)

де наступні значення для  a та b, що визначаються за формулою (2).

 Враховуючи (3), цю ж саму функцію можна визначити так:

    (6)

Перший виклик цієї рекурсивної функції буде S(1,1). В результаті цього виклику буде отримане значення суми ряду.

Обчислення значення ланцюгового дробу

Окрім степеневих рядів, при обчисленні елементарних функцій на ЕОМ використовуються також ланцюгові дроби.

Ланцюговим, або неперервним, дробом називають вираз виду:

або .

Звичайно замість вище наведеного запису застосовують більш компактний, записуючи ланки ланцюгового дробу:

або .

Числа , , ... називають частковими чисельниками, а  , , , ... - частковими знаменниками  ланцюгового дробу.

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

Значення ланцюгового дробу Сі можна також визначити рекурентним співвідношенням:

.     (6)

Розглянемо визначення значення такого дробу:

Ітеративний підхід

Для ітеративного визначення значення ланцюгового дробу необхідно обчислення розпочинати з останнього співвідношення. Отже, початкові значення .

Частковий знаменник кожного разу зменшується на 1, а частковий чисельник збільшується на 1.

Отже, для ,

, , .

Рекурсивний підхід

На відміну від ітеративного підходу рекурсивне обчислення ланцюгового дробу можна розпочати з першої пари часткових чисельника та знаменника. Отже, початковими значеннями будуть:

,

які кожного разу будуть зменшуватися(a) та збільшуватися(b) на 1.

З формули (6) зрозуміло, що С можна подати як функцію від a та b– С(a, b), тоді (6) трансформується в вираз:

    (8)

де – наступні значення для  a та b.

Враховуючи (8), цю ж саму функцію можна визначити так:

    (5)

Перший виклик цієї рекурсивної функції буде S(x,1). В результаті цього виклику буде отримане значення дробу.

Чисельні методи визначення коренів нелінійних рівнянь

Чисельні методи визначення коренів нелінійних рівнянь дозволяють знайти корінь рівняння f(x)=0 на заданому проміжку [a, b] з певною похибкою розрахунку Е.

Вхідні дані:

E - точність обчислення;

a, b - границі інтервалу, в якому буде проводитись пошук кореня.

Вихідні дані: x – корінь рівняння.

Варіант 1: метод дихотомії

Ітеративний підхід

Обчислення значень ya=f(a) i yb=f(b).

Обчислення першого приблизного значення та y=f(x), де х - корінь рівняння.

Якщо  a-b < E, переходимо до п.7.

Якщо y i ya мають різні знаки, то корінь знаходиться в інтервалі [a, x]. Тоді b=х; переходимо до п. 1.

Якщо y i yb мають однакові знаки, то корінь знаходиться на інтервалі [x, b]. Тоді а=х; переходимо до п.1.

Друк результату.

Рекурсивний підхід

Функцію пошуку кореня можна подати як рекурсивну:

Варіант 2: метод січної (хорди)

Ітеративний підхід

  1.  Обчислення ya=f(a), yb=f(b)
  2.  Обчислення кореня х відбувається за формулою: 

  1.  Якщо a-b< E , то виконується п.6.
  2.  Якщо y i ya мають різні знаки, то корінь знаходиться в інтервалі [a, x]. Тоді b=х; переходимо до п. 1.
  3.  Якщо y i yb мають однакові знаки, то корінь знаходиться на інтервалі [x, b]. Тоді а=х; переходимо до п.1.
  4.  Друк результату.

Рекурсивний підхід

Функцію пошуку кореня можна подати як рекурсивну:

Варіант 3: метод дотичної

Ітеративний підхід

  1.  Початкове значення х=0.
  2.  Якщо   f(x) < E, корінь знайдено, переходимо до п.4.
  3.  Обчислення наступного приблизного значення, де f‘(x) - похідна  від f(x). Перехід до п.2.
  4.  Друк результату.

Рекурсивний підхід

Функцію пошуку кореня можна подати як рекурсивну:

Варіант 4: метод хорд–дотичних

Ітеративний підхід

  1.  Початкове значення х0=0, х=0.
  2.  Якщо   f(x) < E, корінь знайдено, переходимо до п.5.
  3.  Обчислення наступного приблизного значення , , перехід до п.2.
  4.  Друк результату.

Рекурсивний підхід

Функцію пошуку кореня можна подати як рекурсивну:


СПИСОК ЛІТЕРАТУРИ

  1.  Епанешников А.М., Епанешников В.А. Программирование в среде Turbo Pascal 7.0 –  3-е изд., стер. – М.: “Диалог-МИФИ”, 1997. – 288 с.
  2.  Марченко А.И., Марченко  Л.А. Программирование в среде TurboPascal 7.0. – К.: ЮНИОР, 1997 – 496 с., ил.
  3.  Фаронов В.В. Тур,о Паскаль 7.0. Начальный курс. – М.: “Нолидж”, 1997- 616 с., ил.

2* - матеріали цього підрозділу повністю взяті з [1]


 

А также другие работы, которые могут Вас заинтересовать

71166. Понятие и виды пособий по действующему российскому законодательству 404.5 KB
  По продолжительности выплаты сохранились социальные пособия ежемесячные ежемесячные пособие на ребенка и по уходу за ребенком единовременные пособия при рождении ребенка при передаче ребенка на воспитание в семью и периодические пособие по беременности...
71167. Пенсионные фонды в России 548.5 KB
  Актуальность рассмотрения данной темы определяется тем, что на фоне общего социального обеспечения одним из его основных элементов является пенсионное обеспечение. А в свете проводимого реформирования пенсионной системы Российской Федерации данный вопрос становится еще более важным.
71168. Разработка интернет – магазина по продаже программного обеспечения 241.99 KB
  Дипломная работа состоит из пяти разделов. Для осуществления поставленных целей в первом разделе был проведен обзор принципов построения информационных систем для торговли через интернет, анализ и безопасность платежных систем в интернет.
71169. Создание модели эффективного электронного документооборота и его внедрение на предприятии 486.5 KB
  Как показывают современные исследования 85 рабочего времени сотрудников организаций тратится на подготовку сопровождение заполнение копирование и передачу документов. Рост объемов информации и соответственно документов потребовал внедрения техники для своевременной обработки документов...
71170. Деятельность Ивана IV в 60 – 70 годы. Сущность опричнины, содержание опричнины 265.5 KB
  В силу неблагоприятных исторических условий, среди которых немаловажную роль играло страшное татарское нашествие, Русское государство несколько отставало в своем развитии от европейских стран. Губительные последствия иноземного ига давали о себе знать в течении длительного времени.
71172. Формирование мотивации и стимулирование труда в системе управления персоналом на примере ФГБУП “Дмитровский экскаваторный завод при спецстрое россии” 403 KB
  Неэффективная система мотивации может вызвать у работников неудовлетворенность что всегда влечет снижение производительности труда. Путь к эффективному управлению человеком лежит через понимание его мотивации.
71174. Пути совершенствования системы управления персоналом в АО «Желаевское КХП» 604 KB
  Актуальность темы научных исследований по изучению системы управления персоналом возникает во многих организациях и обусловлена развитием инфраструктуры рынка, изменением характера выполняемых работ и содержанием труда.