Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

CASE <вираз > OF



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 - завжди дійсний тип y¹0
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).

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

Ø Присвоєння можливе для змінних та виразів всіх типів (за виключенням FILE).

Ø Змінна та вираз повинні бути одного типу. Або тип змінної, що знаходиться праворуч від оператору присвоєння поглинають тип змінної, що знаходиться ліворуч від оператору присвоєння. Наприклад, допускається змінній типу 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. при наданні однакової абсолютної адреси для декількох змінних різних типів.

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

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

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

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

У:= Т2 (Х).

Наприклад,

Var

I: integer;

H: real;

Begin

H:= real (I);

End;

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

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

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

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

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

Ø CHR (i: <цілий тип>): char - повертає символ;

Ø ORD (c): Longint - порядковий номер значення дискретного типу;

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

Таблиця 10 – Стандартні функції мови Паскаль
Назва Тип аргументу Тип результату Дія
Математичні функції
Abs (x) Дійсний або цілий Відповідно до типу аргументу ½x½
Cos (x); Дійсний Дійсний Косинус Х. Х подається в радіанах.
Sin (x); Дійсний Дійсний Синус Х. Х подається в радіанах.
ArcTan (у) Дійсний Дійсний Арктангенс у.
Pi - Дійсний значення числа p
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 мають відповідно дійсний, цілий та символьний типи, то при введенні необхідно задати три значення:

Ø перше – дійсного типу для змінної а;

Ø друге – цілочисельне для змінної b;

Ø третє – символьне для змінної с.

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

Процедура 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 Управління послідовністю дій у програмах мовою Паскаль

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

 
 

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

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

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

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

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

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

,

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

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

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

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.

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

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

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

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

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

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

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

1. Алгоритм знаходження коренів квадратного рівняння ax2 +bx+c=0 поданий на рис. 7.

2. Алгоритм знаходження найбільшого значення з двох змінних a= max (x, y) поданий на рис. 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.

Наприклад, для реалізації схеми алгоритму на рис. 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 < тіло циклу >;

 
 

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

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

Приклад 2.

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

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

¨ Y = f(Xпоч)

¨ Y = f(Х1), де Х1 = Xпоч + Dх.

¨ Y = f(Х2), де Х2 = X1+ Dх.

¨ 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.

 
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Приклад 3

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

= .

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

 
 

В алгоритмі (рис. 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.

4. Виведення 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.

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

Що таке цикл? Поняття циклу та принцип його утворення.

Які види циклічних обчислювальних процесів ви знаєте?

Правила використання оператору циклу з перед – умовою мови Паскаль.

Правила використання оператору циклу з пост – умовою мови Паскаль.

Правила використання операторів циклу з параметром мови Паскаль.

Чи може використовуватись в якості параметру циклу for змінна дійсного типу? Символьного? Логічного?

Який крок зміни параметру в циклі for? Чим відрізняються оператори for – to та for – downto?


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

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

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

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

 
 

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


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

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

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

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

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. Наприклад:

Індекс                    
С 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
      -4      
Операції над масивами

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

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

Приклад 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 < тип елементів >;

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]:

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

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

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

 
 

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]=’ ‘ і так далі.

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

Вважається, що рядок 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);

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

· Delete (Var S:string; Index:integer; Count:integer) - видаляє підрядок з рядка S.Index - номер першого символу, що видаляється; Count - кількість символів, що видаляються;

· Insert (Source: string; Var S:string; Index:integer) - вставляє підрядок Source до рядка S. Якщо виходить рядок великого розміру, він скорочується до 255 символів. Index - номер позиції вихідного рядка, починаючи з якого буде вміщений поданий підрядок Source.

· Str (X; Var S:string) - перетворює число цілого типа чи типа real в послідовність символів.

· Val (S:string; Var X; Var Code:integer) - перетворює рядок символів в змінну цілого типа чи типа real. Змінна Code дорівнює нулю: якщо перетворення відбулося без помилок.

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

· Concat (s1,s2,...,sn: string): string - конкатенація (склеювання) поданих рядків s1,s2,...,sn.

· Copy (S: string; n,k: integer): string - копіювання з поданого рядка S підрядка, який починається з позиції n та має довжину k.

· Length (S: string): integer - обчислення довжини рядка S.

· 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!!!’;

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

Для чого у програмах використовують масиви даних?

Як розташовуються елементи масиву в пам’яті? Чи можуть елементи одного масиву бути розташовані в різних областях пам’яті?

Що таке одномірний масив, його опис у Паскаль – програмі?

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

Що таке індексація елементів масиву? Якіми типами можуть описуватися індекси?

Як задається тип діапазон та тип перелічення?

Якого типу можуть бути елементи масиву? Чи може один масив містити елементи різних типів?

Багатовимірні масиви, їх опис у Паскаль – програмах?

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

Які правила роботи вкладених циклів?

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

Які операції припустимі над масивами?

Що являє собою тип string? Для чого він використовується?

Як здійснюється введення та виведення рядків символів? Які операції застосовуються над рядками? Як здійснюється порівняння рядків?

Як застосовуються процедури роботи з рядками: Delete, Insert та функції роботи з рядками Copy, Length, Concat, Pos?

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


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

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

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

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

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

2. нетипізований файл;

3. текстовий файл.


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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

Наприклад:

Var

F: file of integer; {ФЗ д





Дата публикования: 2014-11-03; Прочитано: 636 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.168 с)...