
- •П. Г. Ратайчук, а. М. Тихоненко
- •Алгоритмічна мова
- •Курс лекцій
- •Черкаси – 2003
- •Основні поняття навчальної алгоритмічної мови
- •Величини в навчальнiй алгоритмiчнiй мовi
- •Вирази в навчальнiй алгоритмiчнiй мовi
- •Загальні правила опису алгоритмів на нам
- •Переклад алгоритмiв на мову Паскаль
- •Лiнiйнi алгоритми
- •Команди побудови розгалужень в нам
- •Наступнi алгоритми вимагають застосування команди розгалуження
- •Наступнi алгоритми вимагають застосування команди вибору
- •Команди повторення нам
- •Приклади алгоритмів, що вимагають застосування iтерацiйного циклу
- •Лiнiйні таблиці
- •Приклади алгоритмів
- •Прямокутні таблиці
- •Приклади алгоритмів прямокутних таблиць
- •Лiтерні величини
- •Приклади алгоритмів літерних величин
- •Список рекомендованої літератури
- •Про авторів
- •Алгоритмічна мова
- •18028, М. Черкаси, вул. Смілянська, 120/1
Переклад алгоритмiв на мову Паскаль
Алгоритм на НАМ при перекладi на мову Паскаль набуває назви "пiдпрограма". Пiдпрограми розподiляються на процедури та функцiї.
Основнi загальнi правила перекладу такi:
Алгоритм-процедура НАМ перекладається у процедуру мови Паскаль, при цьому слово алг замiнюється зарезервованим словом Procedure;
Алгоритм-функцiя НАМ перекладається у функцiю мови Паскаль, при цьому слово алг замiнюєтся зарезервованим словом Function;
Iм'я алгоритму замiнюється iдентифiкатором, побудованим у вiдповiдностi з правилами мови Паскаль;
У перелiку параметрiв алгоритму службове слово арг опускається, а слово рез замiнюється зарезервованим словом Var;
Iмена всiх параметрiв алгоритму мають бути перебудованi у вiдповiдностi iз правилами мови Паскаль;
При перекладi iмен типiв службове слово цiл замiнюється на стандартне iм'я Integer, нат - на Word, дiйс - на Real, лог - на Boolean, лiт - на String;
При перекладi перелiку параметрiв алгоритму всi описи типiв мають вiдокремлюватиси один вiд одного символом ";", крапка з комою ставиться також i в кiнцi заголовку;
До коментарiв дано i треба при перекладi повиннi бути застосованi фiгурнi дужки;
Пiсля заголовку слiд указати зарезервоване слово Var i розмiстити пiсля нього перелiк промiжних змiнних з вказiвками типiв; мiж окремими вказiвками типiв, а також в кiнцi слiд поставити крапки з комою; iмена всiх промiжних змiнних мають бути перебудованi у вiдповiдностi iз правилами мови Паскаль;
Службове слово поч замiнюється зарезервованим словом Begin; службове слово кiн замiнюється зарезервованим словом End, пiсля якого ставиться крапка з комою;
Оператори присвоєння та звернення до процедур мають той же самий вигляд, але вирази мають бути переписанi у вiдповiдностi iз правилами мови Паскаль; мiж операторами при перекладi необхiдно поставити крапку з комою; крiм того, має певнi особливостi присвоєння мiж числовими типами.
Iмена в мовi Паскаль називають iдентифiкаторами. Будь-якi нестандартнi iмена алгоритму (назва алгоритму, позначення змiнних) перебудовуються в iдентифiкатори у вiдповiдностi з такими правилами:
Можна використовувати лiтери тiльки англiйського алфавiту, цифри та знак пiдкреслювання "_";
Не можна починати з цифри;
Великi та малi лiтери вважаються рiвнозначними;
Зарезервоване слово мови Паскаль iдентифiкатором бути не може.
Числовi константи в мовi Паскаль мають той же вигляд. Нагадаємо лише, що замiсть десяткової коми має застосовуватись десяткова крапка. Логiчнi константи, що в НАМ позначаються стандартними iменами ТАК i НI, в мовi Паскаль позначаються стандартними iдентифiкаторами True та False вiдповiдно.
Лiтернi константи в мовi Паскаль мають той же вигляд, але як обмежувач застосовується символ "'" - апостроф. Якщо у складi самої лiтерної константи є потреба застосувати апостроф, то його позначають парою апострофiв "''".
Знаки арифметичних операцiй в мовi Паскаль тi ж самi, що й в НАМ, але операцiя пiднесення до степеня вiдсутня. Знаки логiчних операцiй "не", "i", "або" перекладаються вiдповiдно як Not, And i Or. Операцiї порiвняння "менше або дорiвнює", "бiльше або дорiвнює" i "не дорiвнює" указуються як "<=", ">=" i "<>" вiдповiдно.
В арифметичних виразах можуть бути застосованi такi стандартнi арифметичнi функцiї дiйсного типу: Abs(x) - абсолютна величина x, Sqr(x) - пiднесення x до квадрату, Sqrt(x) - добування квадратного кореня iз x, а також Sin(x), Cos(x), ArcTan(x), Ln(x) i Exp(x). До функцiй вiдноситься також Pi ( ), що використовується без аргументу i має значення 3.1415926536. Певну особливiсть мають функцiї Abs(x) i Sqr(x): вони можуть бути також i цiлого типу, але тiльки тодi, коли мають аргумент цiлого типу.
Набiр стандартних функцiй в мовi Паскаль не дуже великий, тому при необхiдностi використання якихось iнших функцiй їх виражають через указанi вище.
Одиниця вимiрювання кутiв в тригонометричних функцiях тiльки радiан. Тому при необхiдностi використання градусної мiри застосовують перехiднi формули:
- кут A, виражений в градусах, за допомогою виразу A*Pi/180 перетворюється в радiани;
- кут A, виражений в радiанах, за допомогою виразу A*180/Pi перетворюється в градуси.
Обчислення тангенса деякого кута x здiйснюють за допомогою виразу Sin(x)/Cos(x). Цiкаво, що даною формулою в мовi Паскаль можна користуватись без обмежень, оскiльки через наближений характер обчислень не вдається одержати значення Cos(x)=0.
Пiднесення числа x до степеня N можна здiйснити за допомогою виразу Exp(Ln(x)*N), а якщо N=2, то Sqr(x) або x*x (властивості логарифмів).
Добування кореня степеня N iз числа x можна здiйснити за допомогою виразу Exp(Ln(x)/N), а якщо N=2, то Sqrt(x) (властивості логарифмів).
Iнодi виникає питання, коли краще записувати x*x, а коли - Sqr(x). Це визначається довжиною указаного виразу. Наприклад, пiднесення до квадрату виразу Sin(x)+Cos(x) коротше записуєтся через використання функцiї Sqr, нiж через використання операцiї множення.
При перекладi на мову Паскаль виразiв, що використовують пiднесення до степеня та добування коренiв, треба бути обережним, iнакше внаслiдок перекладу можна одержати необчислюваний вираз. Наприклад, вираз x^(2/3) мовою Паскаль формально можна записати як Exp(Ln(x)*2/3). Але елементарний аналiз показує, що значення виразу x^(2/3) можна обчислити при будь-яких x, якщо спочатку пiднести x до квадрата, а потiм добути iз результату кубiчний корiнь. В той же час вираз Exp(Ln(x)*2/3) можна обчислити тiльки при додатнiх x. Отже, правильним перекладом може бути, наприклад, Exp(Ln(x*x)/3), що теж обчислюється при будь-яких x.
Як i в НАМ, в мовi Паскаль не заборонено присвоювати дiйснiй змiннiй числове значення цiлого або натурального типу.
На вiдмiну вiд НАМ, в мовi Паскаль заборонено безпосереднє присвоєння цiлочисельнiй змiннiй значення дiйсного типу.
Таке присвоєння стає можливим тiльки при застосуваннi спецiальних функцiй перетворення дiйсних типiв в цiлочисельнi:
1) функцiя Round(x) перетворює значення x дiйсного типу у значення цiлого типу шляхом заокруглення (Round(5.7)=6);
2) функцiя Trunc(x) перетворює значення x дiйсного типу у значення цiлого типу шляхом вiдкидання дробової частини (Trunc(5.7)=5).
Основний принцип побудови програми такий: всi iменованi об'єкти (змiннi, процедури, функцiї), на якi є посилання у програмi, попередньо мають бути об'явленi (описанi). Це означає, що звернення до будь-якого об'єкта стає можливим лише пiсля того, як дано явний його опис, що однозначно визначає його тип.
У вiдповiдностi з указаним принципом, елементарна програма на мовi Паскаль завжди складається з двох частин: описової та виконуваної. Описова частина мiстить описи всiх iменованих об'єктiв, що використанi у програмi. Виконувана частина мiстить оператори (команди), за допомогою яких указано дiї, що мають бути виконанi над об'єктами програми у вiдповiдностi з її алгоритмом.
Описова частина програми вiдокремлюється вiд виконуваної словом Begin. Виконувана частина, а разом з нею i вся програма, завершується словом End, за яким ставиться крапка. Обидвi частини програми разом утворюють тiло програми. Перед тiлом програми може бути необов'язковий заголовок. Заголовок починається iз зарезервованого слова Program, за яким указується iдентифiкатор (iм'я) програми.
В цiлому елементарна структура програми має такий вигляд:
Program <iдентифiкатор програми>;
<описова частина програми>
Begin
<виконувана частина програми>
End.
В описовiй частинi описують такi програмнi об'єкти, як змiннi, процедури та функцiї. Кожний окремий опис в описовiй частинi повинен закiнчуватися символом "крапка з комою".
Описи змiнних об'єднують в окремий роздiл, який називається роздiлом змiнних i починається словом Var.
Описи процедур та функцiй програми одержують шляхом перекладу з алгоритмiчної мови.
НАМ обходиться без застосування операцiй введення значень початкових даних та виведення значень результатiв. Коли
виконується перевiрка працездатностi алгоритму, то початковi данi вважаються вiдомими наперед, а манiпулювання конкретними значеннями проводиться вручну. Iнакше кажучи, користування алгоритмiчною мовою не потребує нiякої специфiчної апаратури.
В той же час виконання програми на ЕОМ вимагає врахування наявностi апаратних засобiв. Зокрема, у програмi необхiдно передбачити, що вона має якимсь чином одержати значення початкових даних, а також повiдомити про результати своєї роботи. Це здiйснюється за допомогою спецiальних операторiв введення та виведення, якi звертаються до зовнiшнiх пристроїв ЕОМ.
Таким чином, можна зробити висновок, що переклад алгоритму з НАМ на мову програмування повинен супроводжуватись певними доповненнями виконуваної частини, що враховують апаратнi особливостi ЕОМ.
Виконувану частину програми на мовi Паскаль у загальному випадку можна побудувати у виглядi лiнiйної послiдовностi таких трьох груп операторiв:
- група операторiв, що здiйснюють введення в ЕОМ значень початкових даних програми;
- група операторiв, що виконують обробку значень початкових даних, не користуючись апаратурою ЕОМ i переважно шляхом звернення до процедур та функцiй програми;
- група операторiв, що здiйснюють виведення значень одержаних результатiв у формi, зручнiй для сприйняття користувачем.
У вiдповiдностi з цим, в описовiй частинi програми у загальному випадку повиннi бути описанi:
- змiннi, що є початковими даними до програми в цiлому;
- змiннi, що є результатами роботи програми в цiлому;
- процедури та функцiї, що розв'язують поставлену перед програмою задачу.