Файли
Національний унівеоситет “Львівська політехніка”
Кафедра прикладної математики
Тексти лекцій
та завдання до лабораторних робіт
з курсу “Програмування та алгоритмічні мови”
1 семестр
Львів-20031. Задання алгоритму
Поняття алгоритму.
Алгоритм — це конструктивно задане правило (закон), за яким вхідній інформації (умовам задачі) ставиться у відповідність нова вихідна інформація (розв'язок задачі). Інакше кажучи, алгоритм — це деякий скінченний набір операцій, виконання яких одна за однією через скінченне число кроків приводить до поставленої мети (розв'язку задачі). Поняття алгоритму належить до базових понять і не означається через простіші поняття.
Алгоритм повинен володіти властивостями:
Масовість Алгоритм повинен бути застосовним до широкого класу задач.
Визначеність (детермінованість). Описання множини операцій, якою визначається алгоритм, не повинні допускати двояких тлумачень. При виконанні операцій не повинно виникати питань, що саме і як треба робити. Строго визначеним повинен бути і порядок виконання операцій.
3. Дискретність. Процес, який визначається алгоритмом, повинен мати дискретний (перервний) характер, тобто являти собою послідовність окремих завершених кроків. Кожна операція алгоритму повинна виконуватися за скінченний час, а виконання наступної операції повинно починатися після завершення попередньої.
4. Результативність. Виконання послідовності операцій, якою визначається алгоритм, через скінченне, можливо досить значне, число кроків приводить до цілком певного результату Виконання алгоритму не може закінчуватися невизначеною ситуацією або ж зовсім не закінчуватися.
Кожен алгоритм передбачає наявність деяких вхідних даних і його виконання за скінченний час приводить до цілком певних результатів.
5. Формальність. Будь-який виконавець, здатний сприймати і виконуючи вказівки алгоритму, виконає поставлене завдання.
6. Захищеність. Алгоритм повинен бути захищеним від несанкціонованого використання (використання без дозволу авторів) та некваліфікованого користувача (некоректне задання початкових даних).
7. Дружелюбність. Алгоритим завжди готовий вказати виконавцю на його помилки.
Набір операцій, виконанню яких навчено виконавця і які можуть бути включені у множину операцій, якою визначається алгоритм, називають системою операцій (вказівок) виконавця. Може трапитися, що множина допустимих операцій виявиться такою, що в результаті виконання будь-якої скінченної послідовності операцій не вдасться виконати поставлене завдання. Надалі вважатимемо, що виконавець має достатню для виконання поставленого перед ним завдання множину допустимих операцій.
Якщо виконавця навчено виконувати вказану операцію, тобто вказівка про виконання завдання входить до системи допустимих для нього вказівок, то описання алгоритму складається з однієї вказівки, тобто множина операцій, якою визначається алгоритм, містить єдину операцію.
Якщо ж виконавця не навчено виконувати поставлене завдання, то виникає потреба вказану операцію розкласти на деяку сукупність простіших операцій. Якщо всі такі операції входять до системи операцій виконавця, то описання алгоритму на цьому закінчується. Якщо ж серед вказаних операцій є такі, що не входять до системи операцій виконавця, то такі операції розкладаються на сукупність ще простіших операцій. Таке розкладання операцій на простіші продовжується доти, поки утвориться сукупність операцій, кожна з яких входить до системи операцій виконавця. Такий метод конструювання алгоритмів називають методом покрокової деталізації зверху вниз. Існують різні форми задання алгоритмів: словесні, словесно-формульні, графічні, у вигляді послідовності кодів з деякого скінченного набору кодів та інші — залежно від того, на якого виконавця орієнтовано алгоритм. При складанні алгоритмів часто поєднують різні форми.
Зображення алгоритму у вигляді блок-схеми.
Блок-схемою називається графічне зображення алгоритму, при якому окремі кроки (етапи) алгоритму зображаються з допомогою геометричних фігур (символів), а зв’язки між етапами задаються з допомогою ліній потоків, що з’єднують символи.
Символ ПРОЦЕС зображається у вигляді прямокутника з відношенням сторін a:b =2:3, де a вибирається з множини { 10, 15, 20, 50, 75, 100 мм.}. Необхідно відмітити, що всі наступні символи вписуватимуться у задані розміри. Інформація про перетворення, які виконує символ, записуються всередині символа.
Приклад. Змінній Y присвоюється значення sin(x) і значення змінної i збільшується на 1.
Символ РОЗГАЛУЖЕННЯ зображається у вигляді ромба, діагоналі якого рівні a та b. Цей символ має один вхід і два виходи, кожен з яких у залежності від виконання умови, позначається “так” або “ні” і задає напрям продовження обчислень. Ми відмітили стрілочками напрями потоків, які входять у символ розгалуження і виходять з нього. У майбутньому лінії потоків, що йдуть зверху-вниз та зліва-направо, вважатимемо природніми і стрілочками не позначатимемо.
Символ ПОЧАТОК-КІНЕЦЬ обчислень зображається графічно як прямокутник з заокругленими кінцями і висотою a/2 та служить для задання початку і кінця алгоритму.
Небхідно пам’ятати, що лінії потоків йдуть паралельно зовнішньому краю блок-схеми, тобто строго вертикально і горизонтально.
Етапи ВВОДУ-ВИВОДУ відображаються при допомозі символа паралелограма.
У ряді випадків не всю інформацію про перетворення, які виконує символ, можна у ньому розмістити; хоча б з огляду на те, що символ чисто фізично займає обмежену площу. У таких випадках, інформацію про перетворення, які виконує символ, виносять за межі символа. Вся інформація записується після відкритої квадратної дужки, з'єднаної з символом лінією потоку.
ПРИКЛАД: При такому запиcі (декілька перетворень в одному оимволі), порядок їхнього виконання відповідає порядку запису.
Для полегшення аналізу алгоритму та підвищення його читабельності бажано документувати ( коментувати ) дії, які виконує символ. Коментарі записуються у довільній формі після відкритої квадратної дужки, з'єднаної з символом пунктирною лінією.
ПРИКЛАД:
ПРИКЛАД. Розглянемо довільне ціле чиcло N. Як перевірити, чи задане число є парним і двоцифровим. Цю задачу можна розбити на дві підзадачі:
а) перевірити, чи N - парне;
б) перевірити, чи N - двоцифрове.
При реалізації алгоритмів ми вже використовували математичні функції (sinx. cosх. lnх, ex і т.п. ). Для реалізацїї нашого завдання у вигляді алгоритму скориcтаємось функцією entier(х), яка виділяє цілу чаcтину аргумента х, для прикладу: entier(5.7)=5, entier(-4.2)=-4. Тоді для перевірки парності числа N можна запиcати умову, 2*entier(N/2)= N, а entier(N/10), якщо N - двоцифрове чиcло, задає кількість десятків у ньому. Дійсно, нескладно перевірити, що при N = 25, entier(25/10)=2.
Поняття про структурний підхід
при побудові алгоритмів
Структурний підхід при побудові алгоритмів - це підхід, який дозволяє "дисциплінувати" процес створення (побудови) алгоритму. Сам по собі структурний підхід не є обов' язковим при складанні алгоритмів, але його застосування значно полегшує як читання, так і аналіз алгоритму виконавцями.
Структурний підхід включає в себе ряд структурних елементів ,які базуються на раніше введених символах. До основних cтруктурних елементів відносяться: слідування. Всі символи і блоки алгоритму повинні бути послідовно розміщеними, тобто алгоритм повинен читатись зліва-направо і зверху-вниз
розгалуження. Застосовується, коли в залежності від виконання умови (істинності умови) необхідно виконати одну або іншу дію. Кожна з цих дій, в свою чергу, може містити декілька етапів
Блок-схема перевірки N на парність і двоцифровість.
обхід. Це частковий випадок розгалуження, коли одна з віток , як правило, не містить жодних дій. Вказану конструкцію можна використовувати швидше,як виняток. цикли. Тіло циклу - це сукупність етапів, які необхідно багаторазово повторювати в процесі виконання алгоритму. Число повторень тіла циклу задаєтьcя умовою, яка називається умовою завершення циклу. Перед виконанням циклу ряду змінних, які в нього входять, необхідно присвоїти початкові значення. Цей етап називається етапом ініціалізації циклу.
Два типи циклів використовуються в алгоритмізаціі. Це цикли з відомим числом повторень (іноді їх ще називають циклами типу перерахунку або циклами типу До) і цикли з невідомим числом повторень (ітераційні цикли або цикли типу ПОКИ).
Цикли з відомим числом повторень
Використовуються в тих випадках, коли число повторень тіла циклу відоме. Цикли вказаного типу містять лічильник числа повторень тіла циклу, який може змінювати свої значення лише в строго заданому інтервалі. Тому перед виконанням групи операторів тіла циклу необхідно зарезервувати в алгоритмі ряд змінних, які будуть з6ерігати початкове і кінцеве значення керуючої змінної, а також величину кроку, при допомозі якого ми від початкового значення керуючої змінної приходимо до її кінцевого значення. Цей процес називається етапом ініціалізації. В ролі початкового, кінцевого значення керуючої змінної і кроку можна використовувати константи, але в ряді випадків застосування констант суттєво звужує область застосування алгоритму.
Приклад: Обчислити суму перших N натуральних чисел.
Цикли з невідомим числом повторень.
В циклах з невідомим числом повторень умова виходу з циклу перевіряється перед виконанням операторів тіла циклу. При використанні циклів з невідомим числом повторень (ітераційні цикли) необхідно в тілі циклу змінювати значення змінних, що входять в умову завершення циклу.
Попередній приклад можна реалізувати і з допомогою циклу з невідомим числом повторень.
Обчислення сум та добутків.
Задача обчислення сум та добутків дуже часто зустрічається при побудові алгоритмів. Ми вже розглянули приклад накопичення суми перших N натуральних чиcел. Характерною ознакою цього алгоритму є присвоєння змінній, якою ми позначаємо суму, нульового початкового значення. При обчисленні добутків, змінній, якою позначатимемо добуток, необхідно очевидно присвоїти початкове значення 1.
ПРИКЛАД: Згідно з означенням, факторіалом натурального числа N
називаєтьоя добуток всіх натуральних чисел, які не перевищують N, тобто
N! = 1 * 2 * 3 * …*(N-і) * N, при цьому 0! приймаотьоя рівним 1.
Складемо блок-охему алгоритму обчиолення N!
Побудова алгоритмів складних виразів
Алгоритми математичних формул
Розглянемо вирази типу
Або
В математиці таку cукупність елементів називаюгь рядами і завдання обчислення відповідно суми або добутку позначають символами та
В прикладах такого типу, з метою прискорення виконання алгоритму шляхом зменшення числа операцій, доцільно встановити залежніоть між наступним і попереднім членами ряду, якщо це тільки можливо.
У випадку обчиcлення суми S= , , а наступний за ним член . Тоді .
Таким чином .
Побудуємо алгоритм обчислення розглянутої нами суми ряду. При побудові алгоритму необхідно зарезервувати змінні під та , лічильник I, при допомозі якого перебиратимемо члени ряду та суму S.
х х і і
г
(і+і) іі х
г
кінець
Розглянуті принципи конструювання алгоритмів не залежать від конкретних особливостей і природи виконуваного завдання, а також від того, на якого виконавця орієнтовано алгоритм. Проте вибір виконавця (з відповідною системою операцій) може вплинути на ступінь деталізації операцій і на структуру алгоритму.
Слід зауважити, що розглянуті принципи розбиття задач на підзадачі не є новими. Вони використовувалися раніше при розв'язуванні різноманітних задач, навчанні учнів виконувати ті чи інші виробничі операції, осмислюванні різних явищ. Проте цей метод був чітко розроблений лише в зв'язку з конструюванням алгоритмів для виконання їх на ЕОМ.
Очевидно, фахівець будь-якої спеціальності, перш ніж доручати виконавцеві певне завдання (складну операцію), повинен навчити його виконувати простіші операції, тобто розкладати задану операцію на простіші, які він вже вміє виконувати. При цьому виконавець може і не розуміє суті поставленого завдання, проте успішно виконуючи задану послідовність операцій, зуміє виконати все завдання. Ця задана послідовність операцій є алгоритмом виконання поставленого завдання про виконання складної операції.
Дещо аналогічне відбувається й при конструюванні алгоритмів, призначених для комп'ютерів. Знаючи, які операції «вміє виконувати» комп'ютер, і розкладаючи задану операцію на сукупність простіших операцій, можна «навчити» комп'ютер виконувати задану операцію, якщо тільки система операцій комп'ютера достатня для того, щоб задану операцію разкласти на сукупність операцій з такої системи.
Алгоритм виконання певного завдання, поданий як деяка скінченна послідовність операцій із системи операцій комп'ютера, називають програмою.
2.МОВА ПРОГРАМУВАННЯ ПАСКАЛЬ
Мова Паскаль, названа в честь французського математика і філософа Блеза Паскаля (1623-1662), створена як навчальна мова програмування в 1968-1971 рр. Ніклаусом Віртом у вищій технічній школі в Цюріху. В теперішній час дана мова програмування має більш широку сферу застосування, ніж передбачалось при її створенні. Метою роботи Вірта було створення мови, котра будувалася б на невеликій кількості базових понять, мала простий синтаксис, допускала перевід програм в машинний код простим компілятором. Лінгвістична концепція Паскаля пропагує системний підхід, що виражається, зокрема, в розбитті великих проблем на менші по складності і розміру задачі, що легше розв’язуються.
Основні принципи Паскаля такі:
структурне програмування. Його суть полягає в оформленні послідовностей команд, як замкнених функцій або процедур і в об’єднанні даних, пов’язаних по змісту, в складні структури даних. Завдяки такому підходу підвищується наглядність тексту, спрощується його відлагодження.
об’єктно-орієнтоване програмування робить наступний крок від ремесла до науки програмування. Дані об’єднуються з властивими їм операціями обробки в об’єкти.
2.1. Алфавіт, Імена, числа, рядки
Важливими особливостями мови Паскаль є можливість послідовного здійснення ідей структурного програмування та концепція структур даних, як одного з фундаментальних понять, що лежить в основі алгоритмізації і програмування. Мова програмування Паскаль з успіхом використовується для навчання програмуванню, а також як практична мова для написання ефективних і надійних програм. Системне програмне забезпечення сучасних ЕОМ містить, як правило, не менше одного транслятора з мови Паскаль.
Алфавіт мови Паскаль містить букви, десяткові цифри, а також такі спеціальні символи:
1) знаки операцій +, -, *, =, /, <>, <, >, <=, >=, :=
2) обмежувачі: , . ; : ( ) [ ] { } ( .. _
3) службові слова AND | ARRAY | BEGIN | CASE | CONST | DIV | DO | DOWNTO | ELSE | END | FILE | FOR | FUNCTION | GOTO| IF | IN | LABEL | MOD | NIL | NOT | OF | OR | PACKED | PROCEDURE | PROGRAM | RECORD | REPEAT |SET | THEN | TO | TYPE | UNTIL | VAR | WHILE | WITH
Службові слова інтерпретуються як єдині символи з фіксованим значенням.
Авторський варіант мови Паскаль (Стандартний Паскаль) дає змогу використовувати великі і малі букви латинського алфавіту. Алфавіти конкретних реалізацій можуть бути розширені буквами російського алфавіту або обмежені наприклад, вилученням малих букв.
Інколи в реалізаціях мови деякі з основних символів можуть бути відсутні, тоді замість них використовують комбінації інших символів.
Для позначення констант, змінних, типів, процедур, функцій, файлів і програм використовуються імена (ідентифікатори).
Ім'ям може бути будь-яка послідовність букв, цифр і знаку підкреслювання, яка починається з букви (пропуски в іменах не припустимі). Імена не повинні збігатися із службовими словами. Кількість символів імені (довжина імені), взагалі кажучи, може бути довільною. Проте, в деяких реалізаціях мови вимагається, щоб імена, які позначають різні об'єкти, відрізнялися першими вісьмома символами. Для кращого розуміння програми доцільно вибирати значущі імена, а не просто довільний набір символів. Знак підкреслювання в іменах зручно використовувати тоді, коли імена складаються з кількох слів. Тоді слова сполучають знаком підкреслювання. Наприклад, modul— junga, середня -температура.
Для зображення чисел, які є константами цілого (integer) чи дійсного (real) типу в мові Паскаль використовується десяткове подання. Дійсні константи можуть бути написані в двох формах: у звичайній (з фіксованою крапкою) (1.2, —0.5, 14.0), в експоненціальній (з плаваючою крапкою) (7.2Е-2,19.2Е+3, 8.0.Е4, 5Е—2). Якщо число записано в експоненціальній формі, то порядку передує буква Е, яку слід читати як «помножити на десять в степені...». Якщо число містить десяткову крапку, то синтаксис мови вимагає, щоб перед нею і після неї було принайні по одній цифрі.
У мові Паскаль можна використовувати константи-рядки. Рядок — це будь-яка послідовність символів, взятих в апострофи.. Якщо одним із символів рядка повинен бути апостроф, то його повторюють двічі. Наприклад, 'Два розвозки', 'PASCAL', 'Pascal', 4988', 'C,';'.
Рядки, що містять лише один символ, є константами стандартного символьного типу (типу char).
2.2. Структура програми
Програма, записана мовою Паскаль, складається із заголовку і блоку і закінчується крапкою.
Проілюструємо структуру програми на прикладі:
PROGRAM circle (input,output);
{Обчислення довжини кола і площі круга радіуса г}
CONST pi=3.1416;
VAR г, length, s:real;
BEGIN
read (r);
length:=2*pi*r;
s:=pi*r*r;
write ('довжина =’, length,’ площа =’, S)
END.
У заголовку програми за службовим словом PROGRAM вказується ім'я програми (у даному разі circle)» а в круглих дужках—список параметрів. Закінчується заголовок крапкою з комою. У загальному випадку заголовок має вигляд
PROGRAM ім'я (список параметрів);
За допомогою параметрів програма взаємодіє з «навколишнім світом». Список параметрів — це фактично список імен формальних файлів, з якими працює програма.
У мові Паскаль є два стандартних файли, імена яких input (введення) і output (виведення). Вхідні дані читаються з файла input, а результати роботи програми записуються у файл output, з якого вони і виводяться на пристрій відображення інформації. Оскільки кожна програма видає деякі результати, то заголовок кожної програми містить формальний параметр output.
PROGPAM Ім'я;
При роботі на ПЕОМ вхідні дані, як правило, вводяться з екрана дисплея або з магнітного диска, а результати видаються на дисплей або друкуються на принтері.
Блок будь-якої програми може мати до шести розділів, які записуються в такому порядку:
1) розділ опису міток;
2) розділ означень констант;
3) розділ означень типів;
4) розділ опису змінних;
5) розділ опису процедур і функцій;
6) розділ операторів (тіло блоку, тіло програми).
Кожний опис і означення закінчується символом — крапкою з комою. Обов'язковим у кожній програмі є розділ операторів, решта розділів може не бути. Оператори програми обмежуються службовими словами BEGIN і END. Зазначимо, що BEGIN і END не є операторами; вони відіграють роль операторних дужок. Таким чином, загальна структура програми, яка використовує тільки два стандартних файли, має вигляд
PROGRAM Ім'я ;
розділи описів i означень;
BEGIN S1; S2;… Sn; END.
де SI, S2, .... Sn — оператори.
Будь-яку послідовність (серію) операторів, що обмежена словами BEGIN і END, називають складеним оператором.
Складені оператори можна помістити в будь-якому місці програми, де може бути записано простий оператор. Часто складені оператори використовують в умовних операторах і операторах циклів.
Наведена програма circle з перших п'яти розділів містить лише два, а саме,
розділ означення констант
CONST pi = 3.1416;
і розділ опису змінних
VAR г, length, s : real;
Тіло програми містить два оператори присвоювання І оператори вводу (read), виводу (write), які працюють із стандартними файлами input і output.
Між будь-якими операторами програми повинна стояти крапка з комою. Крапка з комою не є символом, що закінчує оператор, вона відокремлює оператори один від одного. Між останнім оператором і словом END крапка з комою не ставиться, оскільки слово END не є оператором.
Між двома будь-якими послідовними символами в програмі можна поставити довільну кількість пропусків. Проте пропуски не повинні зустрічатися всередині ідентифікаторів, службових слів, чисел і складених символів. Між будь-якими двома рядками програми завжди розуміють наявність одного пропуску (маркери кінця рядків інтерпретуються як пропуски), тому ідентифікатори, службові слова, числа і складені символи не можна розривати при переході від одного рядка до іншого.
У програмах крім звичайних констант часто використовуються іменовані константи (у програмі circle такою константою є рі). Імена присвоюються константам у розділі означення констант:
CONST ім'я = константа;
ім'я == константа;
………………….
ім'я == константа;
Під константою тут розуміють або число, або ім'я константи, або рядок.
Наприклад,
CONST variant = 'ізотропний';
е = 268;
nju = 0.34;
eps = l.0E—4;
epsl = eps;
У подальшому замість констант скрізь використовуються імена, які їм присвоєні. Константі після її означення у програмі не може бути присвоєно нове значення. Використання розділу означення констант у програмі робить її більш наочною, підвищує надійність, забезпечує її простіші модифікування. Завдяки розділу означення констант можна, наприклад, згрупувати на початку програми величини, які залежать від ЕОМ, на якій розв'язується задача, або характерні для даного прикладу, оскільки вони більш помітні і їх простіше змінювати.
У програмі можна використовувати коментарі:
{будь-яка послідовність символів} У деяких реалізаціях мови Паскаль коментарі обмежуються не фігурними дужками, а символами (* і *). Коментарі, як і пропуски, і кінці рядків належать до відокремлювачів; їх можна поставити в будь-яке місце програми, де дозволяються пропуски. Коментарі допомагають краще розуміти програму, вони можуть використовуватися для пояснення призначення програми, призначення змінних (вказувати на аргументи і результати), окремих частин програми і т. п.
2.3. Стандартні типи даних. Стандартні функції. Вирази
Кожний елемент даних (константи, змінні) належить до деякого типу, який означає як множину значень, що може набувати елемент, так і операції, які можна над ними виконувати.
У мові Паскаль є чотири стандартних скалярних типи:
цілий (integer), дійсний (real), булевий (boolean), символьний (char). Інші скалярні типи, відмінні від стандартних, можуть бути введені програмістом.
Тип кожної змінної, яка використовується у програмі, повинен бути явно заданий за допомогою описів (у розділі опису змінних). Розділ опису змінних починається із службового слова VAR і має вигляд:
VAR список ідентифікаторів змінних: тип;
………………………………………..
список ідентифікаторів змінних: тип;
Ідентифікатори в списку відокремлюються один від одного комою.
Наприклад,
VAR і, a, m2 : integer;
j, r5 : real;
d: char;
Тут описано 6 змінних: і, а, m2 — цілого типу (integer), j, r5 —дійсного типу (real), d — символьного типу (char).
На відміну від змінних вказувати тип константи за допомогою спеціального ідентифікатора типу не слід; машина може визначити тип константи за її зображенням.
Цілий тип (integer). Змінні цілого типу можуть набувати лише цілих значень. У мові Паскаль можна подати цілі числа з відрізка [minint; maxint], де minint і maxint— цілі константи, які залежать від реалізацій. Наприклад, minint=—32768, maxint = 32767. Спроба обчислити вираз, значення якого виводить за межі вказаного відрізка, призводить до помилки. Компілятори з Паскаля, як правило, мають вбудовану числову константу, Ім'я якої maxint; значення константи є 32767.
До операндів цілого типу можна застосовувати такі операції: + (додавання), — (віднімання), * (множення), DIV (цілочисельне ділення), MOD (остача від цілочисельного ділення). Такі операції виконуються точно. У виразах службові слова DIV і MOD відокремлюються від операндів принаймні одним пропуском. Залежність між операціями DIV і MOD виражається співвідношенням:
a MOD b = a --(a DIV b)*b, де а>0 i Ь>0.
При обчисленнях порядок операцій загальний; операції множення, ділення і знаходження остачі виконуються перед операціями додаваня і віднімання.
Якщо для цілих т і п виконується співвідношення (т DIV п) * п = т або т MOD п = 0, то п є дільником m.
Дійсний тип (real). Змінні типу real можуть набувати як цілі, так і значення з дробовою частиною (—2.75, 2.0, 3.2Е—5 і т. д.). У пам'яті ЕОМ можна подати дійсні числа з деякої скінченної підмножини дійсних чисел.
До дійсних операндів можна застосовувати такі операції:
+ (додавання), — (віднімання), * (множення), / (ділення); в результаті операції дістанемо результат дійсного типу. В одному арифметичному виразі можна використовувати цілі і дійсні значення (константи, змінні, підвирази). Якщо один з операндів операції +, -, * є дійсний, то другий перед виконанням операції автоматично перетворюється до дійсного типу. При виконанні операції ділення обидва операнди можуть бути і цілого типу, але результат операцій завжди дійсний.
Дійсні значення в ЕОМ запам'ятовуються з обмеженим числом цифр (число у формі з плаваючою крапкою) і тому є наближеними. Тому не слід порівнювати дійсні числа між собою. На практиці замість порівняння двох дійсних значень а і b доцільно користуватися таким співвідношенням:
abs (а—b)<(,
де ( — деяка мала константа. Якщо порядок а і b невідомий, то ( повинно бути функцією одного з них. Наприклад, можна взяти
abs (а — b) < abs (а * 1E — 6)
Для роботи з числовими величинами у мові Паскаль є ряд стандартних функцій, які подано в табл. 2.1.
Зауважимо, що округлення значення х у функції round (x) здійснюється за правилом:
(trunc — скорочення від truncate — відтинати, відрізати; round — круглий). Наприклад.
trunc (5.4) = 5, trunc (— 2.8) = — 3, round (4.2) = 4,
round (6.9) = 7, round (—2.5) = —2, round (3.5) = 4.
Таблиця 2.1
Позначення функції
Математичне позначення функції
Тип
аргументу
Тип
рeзультату
Примітка
abs (x)
І х І
real або іnteger
real або integer
sqr (x)
Х2
real або іnteger
real або integer
sqrt (x)
real або іnteger
real
Х ( 0
In (x)
In х
real або
Х >0
exp (x)
ex
integer
real
cos (x)
cos х
sin (x)
sin х
X в радіанах
arctan (x)
arctg x
головне значення в радіанах
trunc (x)
Виділення цілої частини х
real
integer
round (x)
Округлення х до цілого
Real
integer
Булевий тип (boolean). Булеві (логічні) змінні набувають одне значення: true (істинно) або false (хибно). Слова true і false є булевими константами. Булеві змінні як змінні інших стандартних типів повинні бути описані в розділі опису змінних. Наприклад:
VAR a, b, c: boolean;
До булевих операндів можна застосовувати такі операції: AND (логічне І, кон'юнкція), OR (логічне АБО, диз'юнкція), NOT (логічне НЕ, заперечення).
Якщо а, b, c, d — булеві змінні, то булевим виразом буде, наприклад, вираз
a AND NOT b AND (c OR d).
Крім булевих операцій результат типу boolean видають операції відношення =, < >, <=, >, >= застосовані до виразів будь-якого впорядкованого типу. Наприклад, вираз 2 < 5 має значення true, а 4 < >4 - значеня false.
У мові Паскаль є стандартні функції (предикати), які набувають булевих значень:
odd (x) — задає значення true, якщо х — ціле непарне число; false — якщо парне;
eof (f) — задає значення true, якщо файл f перебуває в стані «кінець файла»; false — у противному випадку (eof — скорочення від End Of File — кінець файла);
eoln (f) — задає значення true, якщо файл f перебуває в стані «кінець рядка»; false — у противному випадку (eoln скорочення від End of Line — кінець рядка).
Символьний тип (char). Змінна символьного (літерного) типу може набувати значень лише одного символу (char — скорочення від character — символ). У мові Паскаль взагалі не визначена множина символів, а в кожному конкретному випадку використовується множина, яка визначається транслятором.
Проте незалежно від реалізації, у мові Паскаль вимагається, щоб усі символи даної множини були впорядковані (кожен символ мав свій порядковий номер). Значення порядкових номерів символів визначається конкретною реалізацією.
Символьні константи — це символи, які взято в апострофи (апостроф в рядку повторюється двічі). Наприклад, символьними константами є 'А', 'С', '7', '5*, ':', "",’ ‘. Значення останньої константи — це пропуск, який завжди включається у множину символів.
Константи і змінні символьного типу можуть бути операндами в операціях порівняння. Так, можна записати вирази 'd ' > 'а', ':' < >'; ', які видають результат типу boolean.
Для відображення множини символів у підмножину натуральних чисел і навпаки існують дві стандартні функції:
ord (С) — визначає порядковий номер символу із заданого набору символів;
chr (I) —символом, порядковий номер якого дорівнює І.
Очевидно, chr (ord (С)) == С.
Зазначимо, що впорядкування заданої множини символів визначається такою властивістю:
якщо С 1 і С2 мають символьний тип i ( одна з операцій відношення =,< >, <, >=, >, ) ^ то СІ ( С2 набуває значення true тоді і тільки тоді, коли те саме значення набуває ord (С1) 6 ord (C2).
Зокрема, справедливі такі відношення:
‘ ‘<’A’<’B’<’C’ …’X’<’Y’<’Z’
‘a’<’b’< …’z’, ‘0’<’1’<’2’<…<’9’.
Існують ще дві стандартні функції pred (попередній елемент) i succ (наступний елемент), які можуть бути застосовані до символьних аргументів:
pred (С) — визначає символ, який знаходиться в заданій впорядкованій множині символів безпосередньо перед символом С;
succ (С) визначає символ, який знаходиться безпосередньо після символу С.
Усі елементи множини символів, крім крайніх, мають попередній І наступний елементи. Останній елемент не має наступного, перший — попереднього. Якщо відповідного елемента немає, то результат функції не визначено.
Вирази. Вирази задають дії та послідовність обчислення значень. Вони утворюються з констант, змінних, функцій за допомогою знаків операцій і дужок. При обчисленні виразу операції виконуються в строго визначеному порядку з урахуванням загальноприйнятих правил ієрархії операцій і дужок. Значення функцій обчислюється насамперед, якщо вираз не містить дужок, то операції виконуються в такому порядку:
1) NOT
2) * , /, DIV, MOD, AND (операції типу множення)
3) +, —, OR (операції типу додавання)
4) =, < >, <, <=, >, >= (операції відношення).
Операції одного старшинства виконуються послідовно зліва направо.
Якщо треба змінити вказаний порядок операцій, то використовуються круглі дужки.
Наведемо приклади деяких виразів:
1. sqrt (2*sqr (x) + 1) - 3*sin (x)/(x + у) + exp (y+ ln(x)).
Тут для операції піднесення до степеня використано співвідношення
xy = ey lnx
2. (-b + sqrt (b*b – 4*а*с))/(2*а)
(х > 1) AND (x < 2)
2.4. Оператори присвоювання. Оператори вводу, виводу
Оператор присвоювання має вигляд
ім'я змінної: = вираз
Змінна і вираз повинні бути одного типу. Виняток становить випадок дійсної змінної, коли вираз може бути і цілого типу.
Якщо, наприклад, у програмі є опис
VAR a, b, c, beta : real;
n, m : integer;
cl, c2 : char;
pi, p : boolean;
то синтаксично правильними будуть оператори:
beta: = (—b + sqrt (sqr (b) — 4 * a * c))/(2 * a)
cl: = 'A'; c2: = '+’; m:= ord (cl) + ord (c2)
p: = (n>0) AND(n< = 10)
p1: = true
Присвоювання n: = а і cl: = p — помилкові.
Для введення даних використовують оператори
read (список змінних)
або
readln (список змінних)
Зауважимо, що read і readln у мові програмування Паскаль не є операторами в звичайному розумінні, а звернення до стандартних процедур вводу.
Наприклад, read (а, b, c)
При виконанні оператора із вхідних даних (із стандартного файла input) буде взято три послідовних значення, перетворені у відповідні внутрішні подання і присвоєні змінним а, b, c.
Якщо стандартним пристроєм вводу є клавіатура, то, виконуючи оператор read чи readln, ЕОМ переходить в стан чекання вводу інформації. Необхідні значення набирають з клавіатури. Числові значення відокрем-люються один від одного принаймні одним пропуском. Якщо читаються символьні дані, то кожна буква подає сама себе і пропуски сприймаються як символи. Набрані значення вводяться в пам'ять ЕОМ після натискування клавіші вводу. Після виконання команди введення змінним, імена яких вказано в списку команди, будуть присвоєні відповідні значення.
Наприклад, при наявності в програмі опису
VAR a, b : real;
k, l: integer;
і оператора
read (a, fc, k, l) вхідні дані можна подати так:
2.35 - 5.01Е— 8 12 5
Виконання оператора введення в цьому випадку рівносильно виконанню чотирьох операторів присвоювання:
а: = 2.35; b:= 5.01Е — 8; k:= 12; l:= 5
Оператор readln, як i read, вводить дані (із стандартного файла input), але після вибору необхідної кількості даних здійснює, перехід на початок наступного рядка. Якщо, наприклад, треба послідовно виконати оператори
readln (а, b); read (k, l) і на клавіатурі набрати дані
2.35 —5.01Е—8 12 5
то після введення двох перших значень (2.35 і —5.01Е — 8) курсор перейде на новий рядок і значення для k i l введені не будуть.
Для виконання оператора read (k, l) значення 12 i 5 треба набирати в новому рядку:
2.35 —5.01Е—8 (
12 5 (
Для послідовного виконання операторів
read (а, b); read (k, l), дані слід набирати так:
2.35 - 5.01Е— 8( 12 5(
Якщо список в операторі readln відсутній, то введення даних не відбувається і тільки після натискування клавіші введення здійсниться перехід до нового рядка.
Виведення інформації здійснюється операторами (точніше процедурами)
write (список елементів виводу)
або
writeln (список елементів виводу)
Елементами виведення є вирази, зокрема, змінні або константи. Можна використовувати всі чотири стандартні типи. Значення арифметичних виразів виводяться в десятковій системі числення. При цьому дійсні значення виводяться у формі з плаваючою крапкою. Для символьних змінних чи виразів виводиться літера. У булевих виразах виводиться слово true або false. Кожна одиниця виведення заноситься у відведене поле, ширина якого залежить від конкретної ЕОМ.
Виконання оператора write автоматично не веде до виводу в новому рядку. Щоб здійснити перехід до нового рядка, використовується оператор writeln. Правила для нього такі ж, як і для оператора write, за винятком того, що після виведення всіх елементів списку вивідний пристрій переводиться на початок наступного рядка. Оператор writeln, який не містить списку елементів виведення, лише забезпечує перехід до нового рядка. Якщо до виконання оператора курсор знаходився в початковій позиції рядка, то після його виконання забезпечується пропуск рядка. Очевидно, оператори write (а, b,с); writeln рівносильні оператору writeln (а, b, с)
Для прикладу наведемо досить просту програму:
PROGRAM krug;
CONST pi-3,141593;
VAR r,s: real;
BEGIN write (‘Який радіус круга ?’);read (г);writeln;
s:=pi*r*r; writeln (‘Площa круга радіусa');
writeln (r); writeln (fдорiвнює: ', s)
END.
Результати (протокол) роботи програми для значення радіуса 10 матиме вигляд:
Який радіус круга? 10(
Площа круга радіуса 1.00000000000E+01
дорівнює: 3.1415930000Е+02
У мові Паскаль є й інші варіанти управління виводом інформації. Можна вказувати, наприклад, ширину поля, яка відводиться для кожного елемента виведення, форму подання числових значень та ін. Здійснюється це за допомогою однієї або двох цілих додатних констант чи цілих виразів, які розміщуються в списку оператора write (або writeln) після відповідного елемента виводу. Ці управляючі величини відокремлюються один від одного і від елемента виводу двокрапкою.
Наприклад,
write (‘i =’, i: 5, ‘ ‘: 4, a : 9 : 3)
Перша величина після двокрапки (одиниця довжини) вказує мінімальну ширину поля (кількість позицій), які будуть відведені для даного елемента виведення. Якщо для елемента виведення треба меншу кількість позицій, то перші зліва незайняті позиції заповнюються пропусками. Якщо ж елемент виводу не вміщується у відведене поле, то буде відведено стільки позицій, скільки треба. Дійсним даним, крім того, передує завжди принаймні один пропуск. Друга величина, наступна за одиницею довжини, використовується лише для виведення значень типу real. Вона вказує на кількість десяткових розрядів, які будуть виведені після десяткової крапки. Приклад. Написати програму обчислення площі бокової поверхні і об’єму прямого кругового зрізаного конуса, радіуси нижньої і верхньої основ якого відповідно дорівнюють r1 i r2, а висота дорівнює h. Результати вивести з двома цифрами після десяткової крапки.
Площа бічної поверхні i об'єм зрізаного конуса обчислюються відповідно за формулами: s = (*l*( r1 + r2), v = (*h/3(r12 + r22 + r1*r2),
l =( h2 +( r1 - r2)2.
Програму можна записати у вигляді
PROGRAM conus;
CONST pi= 3.142;
sa=5; {ширина поля для аргументів}
sr=10; {ширина поля для результатів}
dr=2; {кількість дробових розрядів}
VAR r1, r2, h, {аргументи}
s, v, {результати}
l: real;
BEGIN
writeln ('Введіть, радіуси нижньої, верхньої');
writeln (‘основ і висоту: ‘);
read (r1,r2, h);
writeln;
v:=pi*h/3*(sqr(r1)+sqr(r2)+r1*r2) ;
l:=sqrt (sqr (h)+sqr (r1-r2));
s:=pi*l*(r1+r2);
writeln (‘параметри конуса:’);
writeln ( ‘r1=’,r1:sa:dr,’ ‘:3,
‘r2=’,r2:sa:dr,’ ‘:3,
‘h=’,h: sa:dr);
writeln (‘Площа бічної поверхні =’, s:sr:dr);
writeln ( ‘Об’’єм =’, v:sr:dr)
END.
2.5. Умовний оператор. Оператор вибору. Програмування розгалужень
Умовний оператор. У мові Паскаль він має вигляд
IF булевий вираз THEN оператор 1 ELSE оператор 2
Тут оператори 1 І 2 — прості або складені, a IF (якщо), THEN (то), ELSE (інакше)—службові слова. Можлива також неповна конструкція (форма) умовного оператора:
IF булевий вираз THEN оператор
Правила виконання умовного оператора повної і неповної форми зображені відповідно на рис. 2.1. Отже, умовний оператор природно реалізує базову структуру розгалуження.
Рис. 2.1
Зазначимо, що умовний оператор управляє тільки одним оператором. Тому якщо після службових слів THEN і ELSE треба записати більше одного оператора (серію операторів), то слід цю послідовність операторів взяти в oпeраторні дужки BEGIN — END. У цьому випадку серія розглядається як один складений оператор. Це обмеження в умовному операторі мови Паскаль дає змогу обійтися без спеціального слова, яке обмежує текст оператора.
Умовний оператор, в якому оператори 1 і 2 є складеними, доцільно для наочності записувати у вигляді:
IF булевий вираз
THEN
BEGIN
серія 1
END
ELSE
BEGIN
серія 2
END
Зауважимо, що синтаксична неоднозначність (до якого IF належить ELSE) конструкції
IF bl THEN IF b2 THEN SI ELSE S2 де bl, b2 — 6yлеві вирази, a S1, S2 —оператори, розв'язується за допомогою інтерпретації її в такому еквівалентному вигляді:
IF bl THEN BEGIN
IF b2 THEN SI
ELSE S2 END
Приклад.
Записати програму розв'язування квадратного рівняння ах2 + bх + с = 0.
PROGRAM quadreq;
VAR a,b,c: real;
x1, x2: real;
d: real;
BEGIN
writeln ('Введіть коефіцієнти a,b,c:');
read (a,b,c); writeln;
IF (a=0) AND (b=0) THEN
writeln (‘Рівняння вироджене')
ELSE
IF a=0 THEN
writein (‘Рівняння лінійне, корінь=’, c/b)
ELSE
BEGIN
write (‘розвrязування’);
writeln (‘квадратногорівняння');
writeln (a:1,’*x^2+’,b:1,’*x+’,c:1,’=0’);
writeln;
d:=sqr(b)-4*a*c;
IF d<0 THEN
BEGIN
write ('Рівняння має ‘);
writeln(‘комплексні корені ' )
END
ELSE
BEGIN
x1:=(-b+sqrt (d)) / (2*a);
x2:=(-b-sqrt(d))/(2*a);
writeln ('Корені рівняннях: x1=’, x1,’ x2=’, x2)
END
END
END.
Оператор вибору. Якщо треба перевіряти кілька умов і залежно від них виконувати ті чи інші дії, то доводиться ви користовувати вкладені один в другий умовні оператори. Проте програми з вкладеними умовними операторами стають менш наочними i складнішими для розуміння. У мові Паскаль для запису таких програм є оператор вибору (варіанта), який дає змогу записувати програми простіше і наочніше.
Оператор вибору записується у вигляді:
CASE вираз OF
список констант: оператор;
список констант: оператор;
……………………………….
список констант: оператор
END
Вираз, який стоїть між службовими словами CASE (варіант) і OF (з) називається селектором. Якщо список констант вибору містить більше однієї константи, то вони відокремлюються одна від однієї комами. Тип констант вибору повинен збігатися з типом селектора. Тип в...