Програма, написана мовою паскаль, складається з лексем І

Вид материалаДокументы

Содержание


Примітка: роздільники не можуть бути частиною лексем (за винятком рядкових констант).
2.     Типи даних.
Тип даних
3.     Запис арифметичних виразів.
4.     Структура програми мовою Паскаль.
Program  Uses
Узагальнення по темі.
Program  Uses
Тема 5. Програмування основних алгоритмічних структур. 1.     Оператори присвоювання, вводу-виводу; запис лінійних алгоритмів.
2.     Умовні оператори; запис розгалужень.
3.     Оператори циклу; запис циклів.
Узагальнення по темі.
Тема 6. Програмування масивів. 1.     Поняття масиву.
2.     Основні алгоритми опрацювання масивів.
Узагальнення по темі.
Подобный материал:

Тема 4. Вступ у програмування мовою Паскаль.

1.     Загальні відомо мості про мову Паскаль.


Мова ПАСКАЛЬ є універсальною мовою програмування  високого рівня. Його основи розробив Ніклаус Вірт, професор технічного університету в Цюріху (Швейцарія), що назвав мову на честь Блєза Паскаля, знаменитого французького філософа і математика XVII сторіччя.

Створення професором Віртом мови ПАСКАЛЬ у 1971 році мало своєю метою полегшити процес навчання систематичному підходу до програмування для ЕОМ, точніше сказати, структурному програмуванню. Відтоді мова ПАСКАЛЬ використовується для програмування майже всіх типів задач на майже всіх типах ЕОМ і довгий час вважалася однією з кращих мов програмування високого рівня, незалежно від того, для яких цілей він використовується: для навчання або для програмування як аматорами так і професіоналами.

Програма, написана мовою ПАСКАЛь, складається з лексем і роздільників. Лексемами називаються мінімальні значимі одиниці тексту в програмі, написаній мовою ПАСКАЛЬ. Вони подані такими категоріями як спеціальні символи, ідентифікатори, мітки, числа, рядкові константи.

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

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

Зарезервоване слово – це ідентифікатор, якому в мові програмування наданий певний смисл. Це може бути ім’я операції, оператор, службове слово, тощо. Забороняється правилами мови ПАСКАЛь перевизначати зарезервовані слова (наприклад, використовувати їх для позначення інших об’єктів програми). Наступні слова являються зарезервованими в Турбо Паскаль:

and  else  inline  procedure type

asm end  interface program unit

array external  interrupt record until

begin file  label  repeat uses

case for  mod  set  var

const  forward  nil  shl  while

constructor  function  not  shr  with

destructor  goto  object  string  xor

div  if  of  then 

do implementation  or  to

downto  in packed

 

Для мови ТУРБО ПАСКАЛЬ байдужний регістр клавіатури, тому можна використовувати у програмі як малі, так і великі літери. Відмінність має значення лише при записі рядкових констант.

2.     Типи даних.


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

       константи та змінні;

       скалярні та структуровані;

       стандартні та дані користувача.

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

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

Стандартні величини реалізовані в трансляторі мови ПАСКАЛЬ, тому їх можна використовувати без додаткового оголошення. Крім того, користувач може оголошувати і використовувати власні величини, які називаються даними користувача.

Тип даних визначає множину значень, що може приймати змінна. Кожній змінній в програмі необхідно задати один, і тільки один тип даних. Хоча ПАСКАЛЬ може опрацьовувати достатньо складні типи даних, усі вони складаються з простих (неструктурованих) типів.

Вивчення типів даних розпочнемо зі скалярних стандартних типів даних. Їх в ПАСКАЛІ є чотири: integer (тип цілих чисел) , real (тип дійсних чисел), char (літерний тип) та boolean (логічний тип).

У ТУРБО ПАСКАЛЬ існує п’ять вбудованих цілочисельних типів: Shortint (коротке ціле), Integer (ціле), Longint (довге ціле), Byte (довжиною в байт) і Word (довжиною в слово). Кожний тип визначає певну підмножину цілих чисел, як це показано таблиці 4.1.

 

Таблиця 4.1 Вбудовані цілочисельні типи




Тип

Діапазон

Формат

Shortint

-128 .. 127

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

Integer

-32768 .. 32767

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

Longint

-2147483648 .. 2147483647

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

Byte

0 .. 255

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

Word

0 .. 65535

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

 

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

Є п’ять видів дійсних типів: Real, Single, Double, Extended і Comp.

Дійсні типи розрізняються діапазоном і точністю пов’язаних з ними значень. Основним є перший тип, тому детально зупинимось саме на його вивченні.

Перш за все, дані дійсного типу можуть подаватись у двох формах: з фіксованою точкою та плаваючою точкою (експоненційній формі). Перша форма подання чисел більш звична. В ній явно задана ціла та дробова частина, які відокремлені точкою Так, числа 2.729, -89.084109, 134 подані у формі з фіксованою точкою.

Експоненційна форма подає число у так званому нормалізованому вигляді: мантиси і порядку. Мантиса лежить у діапазоні [1 ; 10) і складається з 12 символів: однієї цифри на цілу частину, одного символу на десяткову точку і десяти цифр на дробову частину. Якщо дробова частина містить менше цифр, то решта заповнюється нулями. Порядок складається з чотирьох символів і починається літерою Е, після якої йде знак порядку та дві цифри – його значення. Приклад запису чисел поданий в таблиці 4.2.

Таблиця 4.2. Запис дійсних чисел




Форма з фіксованою точкою

Експоненційна форма

1.4529

1.4529000000Е+00

39870

3.9870000000Е+04

0.000029

2.9000000000Е-05

 

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

Значенням змінної літерного типу може бути один із символів, що входять у таблицю символів.. Символи впорядковані один щодо одного відповідно до їх значень в коді ASCII, наприклад: “А” < “У”. Значення кодів символів у ASCII змінюються від 0 до 255. Змінна символьного типу займає один байт пам’яті

3.     Запис арифметичних виразів.


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

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

Будь-який операнд, тип якого є піддіапазоном порядкового типу, опрацьовується так, якби він був порядкового типу.

Якщо обидва операнди в операторах +, -, *, div або mod є операндами цілого типу, то тип результату є таким же, як спільний тип обох операндів. 

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

Значення виразу x/y завжди є Real незалежно від типів операндів. Якщо y дорівнює 0, то виникає помилка.

Значення виразу  i div j являє собою цілу частину від ділення i/j. Якщо j дорівнює 0, то виникає помилка. Наприклад, 25 div 4 = 6, 21 div 3 = 7.

Оператор mod повертає залишок, отриманий при діленні двох його операндів. Наприклад, 25 mod 4 = 1, 21 mod 3 = 0.

Знак результату оператора mod є тим же, що і знак змінної i. Якщо j дорівнює 0, то виникає помилка.

 

Таблиця 4.3 Бінарні арифметичні операції




Оператор

Операція

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

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

+

додавання

цілий

цілий

дійсний

дійсний



віднімання

цілий

цілий

дійсний

дійсний

*

множення

цілий

цілий

дійсний

дійсний

/

ділення

цілий

дійсний

дійсний

дійсний

div

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

цілий

цілий

mod

залишок цілочисельного ділення

цілий

цілий

 

Таблиця 4.4 Унарні арифметичні операції




Оператор

Операція

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

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

+

збереження знака

цілий

цілий

 

 

дійсний

дійсний

-

заперечення знака

цілий

цілий

 

 

дійсний

дійсний

 

Таблиця 4.5. Основні арифметичні функції.






Математичний запис

Запис в
ПАСКАЛІ

Тип
операнду

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

1.        

sin x

sin(x)

real

real

2.        

cos x

cos(x)

real

real

3.        

ex

exp(x)

real

real

4.        

ln x

ln(x)

real

real

5.        

























Зауважимо, що можливі й інші вірні варіанти запису виразів.

4.     Структура програми мовою Паскаль.


Програма, написана мовою ПАСКАЛЬ, являє собою послідовність рядків, кожен з яких відокремлюється від іншого символом “;” (крапка з комою). Вона складається з трьох частин: заголовка, блока описів та блока операторів.

Заголовок задає ім’я програмі.

Блок описів оголошує всі об’єкти, які використовуються програмою: мітки, константи, типи користувача, змінні, тощо.

Блок операторів задає дії, які направлені на розв’язання завдання.

Отже, загальний вид програми на мові ПАСКАЛЬ має вигляд:

Program <ім’я програми >

Uses  < модулі >

Const  < константи >

Label < мітки >

Type < типи користувача >

Var < змінні >

Begin

< оператори >

End.

Розглянемо кожен блок детальніше.

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

ПРИКЛАД:

program circles;

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

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

             розділ підключення модулів процедур та функцій;

             розділ опису міток;

             розділ опису констант;

             розділ визначення типів;

             розділ опису змінних;

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

Транслятор мови ПАСКАЛЬ створений таким чином, що основний файл не містить всіх процедур та функцій. Вони згруповані і реалізовані в окремих файлах, які називаються модулями стандартних процедур та функцій. Наприклад, модуль CRT містить функції для роботи з екраном в текстовому режимі, GRAPH – функції для роботи з екраном в графічному режимі. Крім того, користувач може створювати власні модулі процедур та функцій. В розділі uses  здійснюється підключення необхідних модулів процедур та функцій. Програма може містити лише один розділ uses  , причому він повинен бути завжди першим у блокові описів. Якщо жоден з модулів не підключається, то цей розділ відсутній.

ПРИКЛАДИ:

uses dos, graph;

uses my_lib;

Розділ оголошення міток призначений для вказівки міток операторів. Перед будь-яким оператором програми можна поставити мітку. Це дозволить виконувати прямий перехід на цей оператор при виконанні команди GOTO. Розділ опису міток має таку структуру: спочатку записується зарезервоване слово label (мітка), за ним слідує список ідентифікаторів міток, відділених одна від одної комами. В мові TУРБО ПАСКАЛЬ в ролі міток можуть бути використані як числа, так і ідентифікатори.

ПРИКЛАД:

label 10,999;

label new, errors;

У розділі визначення констант здійснюється присвоювання ідентифікатором визначених постійних значень. На початку розділу визначення констант пишеться слово const (константа). Слідом за цим словом іде список імен і після символу “=” відповідні їм вирази, у яких ідентифікаторам присвоюються визначені постійні значення. Елементи списку відокремлюються один від одного крапкою з комою.

ПРИКЛАД:

Const


max = 1024;

password = ‘Sezam’;

limit=2*max;

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

ПРИКЛАД:

type

day = (пн, вт, ср, чт, пт, сб, вс);

colors= (синій, червоний, зелений);

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

Розділ оголошення змінних є найважливішим в блокові оголошень. Кожна змінна, що зустрічається в програмі, повинна бути описана, тобто, повинен бути вказаний її тип. Опис змінної повинен передувати використанню її в тексті програми для того, щоб у момент використання вона була вже “знайома” компілятору.

Розділ опису змінних починається зарезервованим словом var (від variable - змінна). Слідом за ним йде список, записи якого мають таку структуру: спочатку через кому перераховується один або декілька ідентифікаторів змінних, потім ставиться двокрапка і після двокрапки вказується тип перерахованих змінних.

ПРИКЛАД:

var

a, b, result: real;

i, j, x, y: integer;

period: day;

Мова ПАСКАЛЬ припускає також оголошення змінних безпосереднім описом змінних.

ПРИКЛАД:

var

nt: 1..20;

anser: (yes, no);

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

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

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

Розділ операторів є останнім у блоці програми. Він задає дії, які повинна виконати програма. Розділ операторів починається службовим словом begin і закінчується службовим словом  end. (крапка в кінці обов’язкова). Кожна програма може мати лише один розділ операторів.

Узагальнення по темі.


Програма, написана мовою ПАСКАЛь, складається з лексем і роздільників. Лексемами називаються мінімальні значимі одиниці тексту в програмі, написаній мовою ПАСКАЛЬ. Вони подані такими категоріями як спеціальні символи, ідентифікатори, мітки, числа, рядкові константи.

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

Зарезервоване слово – це ідентифікатор, якому в мові програмування наданий певний смисл. Це може бути ім’я операції, оператор, службове слово, тощо. Забороняється правилами мови ПАСКАЛь перевизначати зарезервовані слова.

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

       константи та змінні;

       скалярні та структуровані;

       стандартні та дані користувача.

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

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

Стандартні величини реалізовані в трансляторі мови ПАСКАЛЬ, тому їх можна використовувати без додаткового оголошення. Крім того, користувач може оголошувати і використовувати власні величини, які називаються даними користувача.

Тип даних визначає множину значень, що може приймати змінна. Кожній змінній в програмі необхідно задати один, і тільки один тип даних. Хоча ПАСКАЛЬ може опрацьовувати достатньо складні типи даних, усі вони складаються з простих (неструктурованих) типів.

ПАСКАЛЬ має чотири стандартних скалярних типи даних: integer (тип цілих чисел) , real (тип дійсних чисел), char (літерний тип) та boolean (логічний тип).

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

Програма, написана мовою ПАСКАЛЬ, являє собою послідовність рядків, кожен з яких відокремлюється від іншого символом “;” (крапка з комою). Вона складається з трьох частин: заголовка, блока описів та блока операторів.

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

Загальний вид програми на мові ПАСКАЛЬ має вигляд:

Program <ім’я програми >

Uses  < модулі >

Const  < константи >

Label < мітки >

Type < типи користувача >

Var < змінні >

Begin

< оператори >

End.






Тема 5. Програмування основних алгоритмічних структур.

1.     Оператори присвоювання, вводу-виводу; запис лінійних алгоритмів.


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

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

Вид оператора:

ім’я змінної := вираз

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

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

ПРИКЛАДИ:

a :=41;

b := false;

c := a+8;

c := c div 2;

d := ‘a’;

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

Типовими помилками при використанні цього оператора, є:

             несумісні типи даних змінної та виразу;

             використання в лівій частині оператора замість змінної виразу.

Розповсюдженими є також синтаксичні помилки при записі виразів в лівій частині оператора.

ПРИКЛАДИ:

var

 a: integer;

 b:real;



a:=a/2;  операція ділення дає результат дійсного типу, а змінна a – цілочисельна;

b+1:=a–2;  в лівій частині оператора записаний вираз;

b:=sqrt(sqr(a)+1; в лівій частині не вистачає закритої дужки.

Оператор виводу інформації призначений для обчислення значень виразів і виводу їх на екран. Є два оператори виводу: write  та writeln. Вид оператораwrite :

write(список виразів)

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

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

ПРИКЛАД:

1. write(‘Моя програма’);

write(a,b,c);

write(b*b-4*a*c);

2. writeln(x,y);

writeln(x/y);

writeln;

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

write(вираз:n),

де n задає кількість позицій екрану, які відводяться для виводу значення виразу. Якщо ця кількість менша за потрібну, мова ПАСКАЛЬ автоматично розширяє поле виводу. Якщо кількість позицій більша за потрібну, значення вирівнюється по правому краю поля, а зайві позиції заповнюються пробілами.

Для даних дійсного типу форматний вивід має вигляд:

write(вираз:n:m),

де n задає загальну кількість позицій екрану, які відводяться для виводу значення виразу, а m - кількість позицій для дробової частини числа. Слід пам’ятати, що загальна кількість позицій виводу повинна включати одну позицію на знак числа, і одну позицію на десяткову точку. Якщо значення m менше за дійсну кількість цифр у дробовій частині, то зайві цифри відкидаються з округленням. Якщо значення n менше за потрібне, мова ПАСКАЛЬ автоматично розширяє поле виводу. Якщо кількість позицій більша за потрібну, значення вирівнюється по правому краю поля, а зайві позиції заповнюються пробілами.

ПРИКЛАДИ:

write(a:4,b:6,c:1);

write(b*b-4*a*c:5);

writeln(x:8:3,y:6:2);

 

Оператор вводу даних призначений для вводу даних з клавіатури та присвоювання їх змінним. Є два оператори вводу даних: read та readln . Оператор read   має такий вид :

read(список змінних)

де список задає ті змінні, значення яких необхідно ввести з клавіатури. Можна вводити з клавіатури значення всіх стандартних типів даних, крім boolean.

При виконанні оператора очікується введення даних вказаного типу. Значення повинні вводитись у строгій відповідності з синтаксисом мови ПАСКАЛЬ. При цьому ніякого додаткового повідомлення про очікування вводу даних на екрані не виводиться. Дані можна вводити списком, розділяючи їх символом “пробіл”, або по одному. Введення закінчується натискуванням клавіші Enter.

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

Типовими помилками використання оператора є :

        розбіжність типу змінної і типу значення, що вводиться;

        введення виразів, а не значень.

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

ПРИКЛАДИ:

write(‘введіть цілі значення змінних a,b,c’);

readln(a,b,c);

write(‘введіть два довільних дійсних числа’);

readln(x,y);

Для покращення наочності тексту програми рекомендується використовувати коментарі. Їх наявність не обов’язковою, але дозволить пояснити особі, що працює з текстом програми, зміст окремих її блоків. Коментар являє собою послідовність будь-яких символів, укладених у фігурні дужки. Коментар не є оператором, і його не потрібно відокремлювати від інших об’єктів програми символом “;”.Навпаки, він є роздільником і може використовуватись для відокремлення складових рядків програми аналогічно символу “пропуск”. Але таке використання коментарю, очевидно, було б дуже незручним.

ПРИКЛАД:

p:=(a+b+c)/2; {обчислення півпериметра трикутника}

s:=sqrt(p*(p-a)*(p-b)*(p-c)); {обчислення площі за формулою Герона}

 

Лінійним називається алгоритм, у якому оператори виконуються в порядку їх слідування в програмі. Для запису таких алгоритмів достатньо наведених операторів. Розглянемо приклади запису лінійних алгоритмів.

Задача 1 Два робітники виконували спільну роботу протягом місяця на умовах погодинної оплати праці. Перший відпрацював t1годин, а другий – t2 годин. Вартість однієї години першого робітника становить p1 грн., другого – p2 грн. Обчислити середню заробітну плату робітників.

Розв’язання. Середня заробітна плата обчислюється за формулою:

pc=(p1 * t1 + p2 * t2)/(t1 + t2)

Програма для обчислень має вигляд:

program zarplata;

var p1,p2:real;

 t1,t2:integer;

 pc:real;

 x:real;

 y:integer;

begin

 write(‘введіть кількість відпрацьованих годин робітниками’);

 readln(t1,t2);

 write(‘введіть вартості годин:’);

 readln(p1,p2);

 x:=p1*t1+p2*t2;

 y:=t1+t2;

 pc:=x/y;

 writeln(‘Середня зарплата становить pc=’,pc:7:2,’грн’);

end.

2.     Умовні оператори; запис розгалужень.


Лінійні алгоритми зустрічаються на практиці рідко. В більшості випадків обчислення носять розгалужений або циклічний характер. При цьому оператори об’єднуються в групи, які виконуються як один оператор. Для цього призначений складений оператор. Складений оператор використовується також в тому випадку, якщо необхідно виконати декілька операторів, а синтаксис мови ПАСКАЛЬ припускає наявність лише одного оператора. Складений оператор може містити довільну кількість операторів, відділених один від одного крапкою з комою. Отже, він являє собою сукупність операторів мови ПАСКАЛЬ, об’єднаних операторними дужками begin та end.

ПРИКЛАД

begin

 readln(x,y);

 z:=x+y;

 writeln(‘z=’,z);

end;

Операторні дужки не є операторами, тому символ “;” перед службовим словом end не обов’язковий. Складений оператор використовується в умовних операторах та операторах циклу, які будуть розглянуті далі.

Умовний оператор дозволяє виконувати один з декількох операторів, що входять у його склад,  у залежності від виконання певної умови. До умовних відносять оператори if та case.

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

Вид оператора:

if логічний вираз then  оператор1 else оператор2

Якщо вираз приймає значення true, то виконується оператор1 (гілка then), у противному випадку, якщо вираз приймає значення false, то виконується оператор2 (гілка else). Після цього виконується наступний за оператором if оператор.

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

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

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

if логічний вираз then  оператор

Якщо вираз приймає значення true, то виконується оператор (гілка then), у противному випадку ця гілка пропускається (обходиться ). Далі виконується наступний за цим оператор.

ПРИКЛАДИ:

1. Пошук більшого із двох значень: z=max(x,y)

if  x>y then  z:=x else z:=y;

 

2. Впорядкування значень двох змінних за зростанням

if x>y  then

begin

z:=x; x:=y; y:=z

end;

“Розширенням” оператора  if є оператор варіанта case. Він призначений для вибору однієї з декількох альтернатив в залежності від значення селектора варіанта.

Вид оператора

Case селектор of

мітка1: оператор1;

мітка2: оператор2;

. . .

міткаN: операторN;

end;

Оператор case складається з виразу (селектора) і списку операторів, кожному з який передує мітка. Ці мітки називаються мітками варіанта і вони не повинні оголошуватись у розділі опису міток програми. При цьому мітки варіанта повинні мати той же тип, що і селектор. З визначення оператора case випливає, що в кожному випадку виконується лише один оператор - той, мітка якого дорівнює поточному значенню селектора. Якщо жодна з міток не дорівнює поточному значенню селектора, то ніякі оператори не виконуються.

Оператор варіанта має ще одну форму:

Case селектор of

мітка1: оператор1;

мітка2: оператор2;

. . .

міткаN: операторN;

else оператор(N+1);

end;

 

Цей оператор варіанта відрізняється від попереднього тим, що, якщо жодна з міток не дорівнює поточному значенню селектора, то виконується оператор, що слідує за зарезервованим словом else. Наявність альтернативи  else в операторі case є розширенням стандартної мови ПАСКАЛЬ. Мітка оператора case може складатися з довільної кількості констант або діапазонів, відділених один від одного комами. Слідом за міткою ставиться двокрапка. Діапазон записується у виді двох констант, відділених один від одного роздільником “..”. Тип констант повинний збігатися з типом селектора. Оператор, записаний слідом за міткою оператора case, виконується в тому випадку, якщо значення селектора дорівнює однієї з констант або потрапляє в межі одного з зазначених діапазонів.

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

ПРИКЛАДИ:

1. case i of

1: write(‘понеділок’);

2: write(‘вівторок’);

3: write(‘середа’);

4: write(‘четвер’);

5: write(‘п’ятниця’);

6: write(‘субота’);

7: write(‘неділя’);

 end;

2.case i of

1..5: write(‘робочий день’);

6,7: write(‘вихідний’);

 end;

Розглянемо приклад запису розгалуженого алгоритму.

Задача 3. Розмір відрахувань на заробітну плату становить 1% з суми, що не перевищує 150 грн, і 2% у противному випадку. Програма має вигляд:

program vidrah;

var s:integer;

 x:real;

begin

 write(‘введіть значення фонду зарплати s:’);

 readln(s);

 if s<=150 then x:=s*0.01 else x:=s*0.02;

 writeln(‘відрахування становлять x=’,x:7:2, ‘грн’)

end.

3.     Оператори циклу; запис циклів.


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

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

Вид оператора:

for параметр = поч.зн to кін.зн do оператор,

де for, =, to, do - службові слова;

параметр - змінна, яка рахує кількість повторень тіла циклу;

поч.зн.  та кін.зн. – початкове та кінцеве значення параметру циклу (діапазон його значень);

оператор - тіло циклу.

Параметром може бути будь-яка неіндексована змінна довільного скалярного типу (окрім типу real).

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

Існує ще одна форма оператора for

for параметр = поч.зн to кін.зн downto оператор

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

Для програмування циклів із заздалегідь невідомою кількістю повторень або циклів, в яких параметр циклу приймав би значення із діапазону з певним кроком (наприклад 2, 4, 6, ...) використовуються оператор циклу з передумовою та оператор циклу з постумовою.

Оператор циклу з передумовою while має вигляд

while лог. вираз do оператор ,

де while, do -службові слова;

лог. вираз - умова (логічний вираз), яка управляє виконанням тіла циклу;

оператор - задає тіло циклу.

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

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

repeat  оператор until лог. вираз ,

де repeat ,until -службові слова;

логічний вираз - умова (логічний вираз), яка управляє виконанням тіла циклу;

оператор - задає тіло циклу.

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

В усіх операторах циклу (окрім repeat) тіло циклу може складатись лише з одного оператора . Якщо тіло циклу містить групу операторів, їх необхідно об’єднати операторними дужками.

ПРИКЛАД :

обчислити добуток перших n натуральних чисел (тобто n!) кожним із операторів циклу

а) оператор циклу з параметром for-to:

p:=1;

for i:=1 to n do p:=p*i;

б) оператор циклу з параметром for-downto:

p:=1;

for i:=n downto 1 do p:=p*i;

в) оператор циклу з передумовою

p:=1;

i:=1;

while i<=n do

begin

p:=p*i;

i:=i+1

end;

г) оператор циклу з постумовою

p:=1;

i:=1;

repeat

p:=p*i;

i:=i+1

until i>n;

 



Узагальнення по темі.


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

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

Оператор виводу інформації призначений для обчислення значень виразів і виводу їх на екран. Є два оператори виводу: write  та writeln.

Оператор вводу даних призначений для вводу даних з клавіатури та присвоювання їх змінним. Є також два оператори вводу даних: read та readln .

Можна вводити з клавіатури значення всіх стандартних типів даних, крім boolean. При виконанні оператора очікується введення даних вказаного типу. Значення повинні вводитись у строгій відповідності з синтаксисом мови ПАСКАЛЬ. Дані можна вводити списком, розділяючи їх символом “пробіл”, або по одному. Введення закінчується натискуванням клавіші Enter.

Для покращення наочності тексту програми рекомендується використовувати коментарі. Їх наявність не обов’язковою, але дозволить пояснити особі, що працює з текстом програми, зміст окремих її блоків. Коментар являє собою послідовність будь-яких символів, укладених у фігурні дужки. Коментар є роздільником і може використовуватись для відокремлення складових рядків програми аналогічно символу “пропуск”.

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

Лінійні алгоритми зустрічаються на практиці рідко. В більшості випадків обчислення носять розгалужений або циклічний характер. При цьому оператори об’єднуються в групи, які виконуються як один оператор. Для цього призначений складений оператор. Такий оператор використовується також в тому випадку, якщо необхідно виконати декілька операторів, а синтаксис мови ПАСКАЛЬ припускає наявність лише одного оператора. Складений оператор являє собою деяку сукупність операторів мови ПАСКАЛЬ, об’єднаних операторними дужками begin та end.

Умовний оператор дозволяє виконувати один з декількох операторів, що входять у його склад,  у залежності від виконання певної умови. До умовних відносять оператори if та case.

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

“Розширенням” оператора  if є оператор варіанта case. Він призначений для вибору однієї з декількох альтернатив в залежності від значення селектора варіанта.

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

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

Для програмування циклів із заздалегідь невідомою кількістю повторень або циклів, в яких параметр циклу приймав би значення із діапазону з певним кроком (наприклад 2, 4, 6, ...) використовуються оператор циклу з передумовою та оператор циклу з постумовою.



Тема 6. Програмування масивів.

1.     Поняття масиву.


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

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

Масив визначається наступним чином:

ім’я типу = array[тип індексу] of тип компонентів

Визначення масиву починається зарезервованим словом array (масив), за яким слідує тип індексу, укладений у квадратні дужки. Після типу індексу іде зарезервоване слово of, за яким указується тип компонентів масиву. В ролі типу індексу може виступати будь-який скалярний обмежений тип, окрім real та integer. Разом з тим типом індексу може виступати діапазон типу integer. В ролі типу компонентів може виступати довільний тип, крім файлового. Розглянемо спочатку одновимірні масиви, тобто масиви, в яких типом компонентів є скалярний тип даних.

ПРИКЛАД:

type

massiv = array[1..10] of integer;

period = array[14..20] of real;

letters = array[char] of boolean;

 

Змінні структурованого типу вводяться звичайним шляхом в розділі опису змінних:

var

a:massiv;

t:period;

k:letters;

 

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

var

b : array[1..10] of integer;

f : array[14..20] of real;

s : array[char] of boolean;

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

Для масивів, як єдиного цілого, існує лише одна операція – операція присвоювання. В усіх інших випадках масиви опрацьовуються поелементно. Як правило, для цього використовуються цикли. Це можливо завдяки впорядкованості та однотиповості його елементів. В більшості випадків це цикл з параметром.

Для опрацювання елементу масиву необхідно вказати ім’я масиву та індекс його елементу. Так, запис a[1] означає, що опрацьовується перший елемент масиву а; a[k] – опрацьовується  k-тий елемент масиву а; a[2*k-1] – опрацьовується той елемент, індекс якого дорівнює виразу 2*k-1.

ПРИКЛАД:

const n=10;

type

massiv = array[1..n] of integer;

var

a,b,massiv;

i:integer;

begin



 a:=b; {правильний оператор}

 read(a);  {неправильний оператор -

 недопустима операція }

for i:=1 to n do read(a[i]); {правильний оператор}

 write(b); { неправильний оператор -

 недопустима операція }

for i:=1 to n do write(a[i]); {правильний оператор}



end.

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

Як уже відмічалось, базовим типом масиву може бути будь-який тип даних, у тому числі і масив. Структура, елементами якої є масиви, називається багатовимірним масивом. Такі масиви об’являються аналогічно одновимірним. Розглянемо порядок визначення та опрацювання багатовимірних масивів на прикладі двовимірних числових масивів.

ПРИКЛАД:

type

massiv = array[1..n] of integer;

matr = array[1..m, 1..n] of integer;

tabl = array[1..m] of massiv;

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

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

ПРИКЛАД:

var

  c, d :matr;

  i,j;integer;

begin

  …

  c:=d; { правильний оператор }

  c[1]:=d[2]; { правильний оператор }

  d[1,4]:=10; { правильний оператор }

  read(c); { неправильний оператор - недопустима операція }

  read(d[1]); {неправильний оператор - недопустима операція }

  for i:=1 to n do

  for j:=1 to n do read(d[i,j]); { правильний оператор }

  …

end.

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

2.     Основні алгоритми опрацювання масивів.


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

const n=...; 

type massiv=array[1..n] of integer;

var

  a:massiv;

  i:integer;

 

2.1.  Введення елементів масиву з клавіатури на екрані.

for i:=1 to n do

begin 

  write(‘Введіть,i,’-й елемент масиву:’); 

  read(a[i]);

end;

2.2.  Заповнення елементів масиву випадковими цілими числами. Числа беруться з діапазону [0, 99].

randomize;

for i:=1 to n do a[i]:=random(100);

 

2.3. Форматний друк елементів масиву .

for i:=1 to n do write(a[i]:4); 

writeln 

 

Далі розглянемо типові алгоритми опрацювання масивів.

2.4. Пошук найменшого елемента масиву

Program pr1; 

Uses crt;

const n=20; 

type massiv=array[1..n] of integer;

var

  a:massiv;

  i:integer;

  min:integer;

begin

  clrscr;

  randomize; 

  for i:=1 to n do a[i]:=random(100);

  writeln(‘Вихідні дані’);

  for i:=1 to n do write(a[i]:4); 

  writeln; 

  min:=a[1]; 

  for i:=2 to n do if a[i]
  writeln(‘Результат’);

  writeln(‘Найменший елемент min=’, min:4);

end.

2.5. Обчислення суми елементів масиву

Program pr2; 

Uses сrt;

const n=20; 

type massiv=array[1..n] of integer;

var

  a:massiv;

  i:integer; 

  s:integer;

begin

  clrscr;

  randomize; 

  for i:=1 to n do a[i]:=random(100);

  writeln(‘Вихідні дані’);

  for i:=1 to n do write(a[i]:4); 

  writeln; 

  s:=0;

  for i:=1 to n do s:=s+a[i];

  writeln(‘Результат’);

  writeln(‘Сума s=’, s:4);

end.

2.6.  Обчислення добутку елементів масиву з парними номерами.

Program pr3; 

Uses crt;

const n=20; 

type massiv=array[1..n] of integer;

var

  a:massiv;

  i:integer; 

  p:longint;

begin

  clrscr;

  randomize; 

  for i:=1 to n do a[i]:=random(10)+1;

  writeln(‘Вихідні дані’);

  for i:=1 to n do write(a[i]:4); 

  writeln; 

  p:=1;

  i:=2;

  repeat

  p:=p*a[i];

  i:=i+2;

  until i>n

  writeln(‘Результат’);

  writeln(‘Добуток елементів з парними номерами p=’, p:4)

end.

 

 



Узагальнення по темі.


 

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

Для визначення масиву потрібно задати тип індексу та тип елементів. . В ролі типу індексу може виступати будь-який скалярний обмежений тип, окрім real та integer. Разом з тим типом індексу може виступати діапазон типу integer. В ролі типу компонентів може виступати довільний тип, крім файлового.

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

Як уже відмічалось, базовим типом масиву може бути будь-який тип даних, у тому числі і масив. Структура, елементами якої є масиви, називається багатовимірним масивом. Такі масиви об’являються аналогічно одновимірним. Розглянемо порядок визначення та опрацювання багатовимірних масивів на прикладі двовимірних числових масивів.