Сторінка
3
if z>0 then
begin readln(x); if x=0 then k:=1 end
else k:=5 else-гілка k:=5 відповідає хибності умови z>0, а не умови x=0, пропущеної у складеному операторі. За цим самим правилом у операторі
if x>0 then {квадранти перший або четвертий}
if y>0 then k:=1 else k:=4
else {квадранти другий або третій}
if y>0 then k:=2 else k:=3 гілка з початком "else if y>0" відповідає хибності умови x>0, а хибності першої умови y>0 відповідає гілка " else k:=4". 2.2. Масовість задач і програм При виконанні оператора розгалуження, булів вираз у якому не тотожно істинний або хибний, можливі принаймні два різних процеси обчислень. Який із них здійснюється, залежить від значень змінних, що входять в умову, тобто від стану пам'яті програми. Таким чином, оператор розгалуження задає різні дії, що їх має виконати комп'ютер при різних станах пам'яті. Різні стани пам'яті після виконання тих самих операторів програми можуть утворюватися, якщо її змінним "присвоюються з зовнішнього світу" різні набори значень. Отже, з використанням оператора розгалуження можна описати розв'язання задачі для різних наборів значень, що надходять "із зовнішнього світу" (вхідних значень, або вхідних даних). Програми, як правило, пишуться для того, щоб перекласти на комп'ютер розв'язання задач, які людина не хоче або не може розв'язати сама. Звичайно задача ставиться в загальному вигляді з указанням параметрів, від значень яких залежить хід і результат розв'язання, наприклад, "розв'язати квадратне рівняння ax2+bx+c=0, задане коефіцієнтами a, b, c". Параметри тут – коефіцієнти рівняння. Задачі, що ставляться в загальному вигляді з параметрами, називаються масовими. Задача, поставлена не в загальному вигляді, а з конкретним набором значень параметрів, називається екземпляром задачі. Наприклад, "розв'язати рівняння x2+3x+2=0, задане коефіцієнтами 1, 3, 2". Всі можливі конкретні набори значень параметрів утворюють екземпляри задачі й задають конкретні процеси її розв'язання. Алгоритм розв'язання масової задачі теж повинний бути масовим, тобто таким, що за ним можна здійснити процеси розв'язання всіх екземплярів задачі. Наприклад, розв'язати всі можливі конкретні квадратні рівняння. Таким чином, програми, як правило, мають властивість масовості. І оператор розгалуження – це один із засобів, яким масовість забезпечується. 2.3. Блок-схеми Процеси, задані оператором розгалуження if умова then оператор else оператор, можна зобразити як гілки одного процесу, на які він розділяється. Позначимо обчислення умови ромбом, із якого виходять два стрілки, позначені можливими значеннями умови true і false. Стрілки задають послідовність дій. Позначимо виконання оператора прямокутником; рис.3.1 виражає "розгалуження" процесу виконання оператора розгалуження на два можливих процеси, хоча при будь-якому його виконанні здійснюється в точності один із них. Зображення, складені з прямокутників, ромбів указаного вигляду й стрілок, називаються блок-схемами. Одна зі стрілок звичайно починається з "нізвідки" і позначає початок блок-схеми. Якщо рухатися по стрілках і виписувати дії, позначені в блоках (ромбах і прямокутниках), утворяться позначення процесів, що задаються блок-схемою. Отже, блок-схема – це теж алгоритм, тільки виражений в іншій формі. Такого, нехай не зовсім точного, тлумачення блок-схем нам буде достатньо, оскільки ми скористаємося ними лише для ілюстрації семантики окремих операторів. Пункт (3) алгоритму обчислення коренів квадратного рівняння за його коефіцієнтами можна задати блок-схемою з рис. 3.2. У деяких випадках блок-схеми дуже наочно подають можливі процеси виконання програми. На зорі програмування вони використовувалися дуже широко, і перед написанням програм навіть необхідно було креслити блок-схеми. Тепер можна обходитися і без них. Задачі 3.7.* Імітувати виконання операторів, де x, y – імена змінних цілого типу: readln(x); if x=1 then y:=16 else if x=2 then y:=256 else if x=3 then y:=4096 else y:=10000; writeln(y), якщо при читанні x одержує значення: а) 1; б) 2; в) 3; г) 4. 3.8. Написати програму обчислення та друкування дійсних коренів квадратного рівняння, заданого коефіцієнтами a, b, c, а) де a¹ 0; б) де, можливо, a=0. 3.9.* Написати програму дослідження, тобто обчислення кількості коренів рівняння ax2+bx+c=0 за його коефіцієнтами a, b, c (можливо, a=0). 3.10. Написати програму дослідження вигляду множини розв'язань нерівності ax2+bx+c>0 (два інтервали, інтервал і т.п.). 3.11. Зобразити аналогічно рис.3.2 алгоритми розв'язання задач 3.8–3.10. 3.12. Написати програму визначення виду трикутника за трьома довжинами його сторін (можна припускати, що вони додатні й задовольняють нерівності трикутника): а)* рівносторонній, рівнобедрений і не рівносторонній, різнобічний; б) гострокутний, прямокутний, тупокутний.
3. Функція та її виклики Status in statu.
(лат.: Держава в державі) Розглянемо задачу: обчислити мінімальну з відстаней між точками площини A(x1; y1), B(x2; y2) і C(1;2). Алгоритм розв'язання цієї задачі очевидний: 1) обчислити відстані d1=AB, d2=AC, d3=BC; 2) обчислити m= min{d1, d2, d3}. Відстань між точками з довільними координатами (x; y), (x'; y') виражається формулою d=, і для обчислення відстаней нам необхідно тричі написати "Паскалівський" варіант цієї формули з різними наборами координат: x1, y1, x2, y2, потім x1, y1, 1, 2, потім x2, y2, 1, 2. Ці вирази досить громіздкі й задають по суті ті самі обчислення, тільки з різними наборами значень. Все це можна записати інакше. Мова Паскаль дозволяє описати повторювані обчислення один раз, дати цьому опису ім'я і далі не описувати самі обчислення, а тільки позначати їх цим ім'ям. Отже, у мові Паскаль є описи обчислень і є їх позначення. Опис обчислень, як правило, є параметризованим, подібно до алгоритму обчислення коренів квадратного рівняння, де параметрами були коефіцієнти рівняння. Конкретні значення, з якими треба зробити обчислення, вказуються в позначенні обчислень разом із ім'ям цього опису й називаються аргументами. Опис обчислень деякого значення називається функцією, а їх позначення – викликом функції. У даному випадку параметрами будуть чотири координати двох точок. Назвемо їх a1, b1, a2, b2. Опис обчислень задається у вигляді функції, якій ми дамо ім'я dd: function dd(a1, b1, a2, b2: real):real; begin dd:=sqrt( sqr(a1-a2)+sqr(b1-b2) ) end; Цей опис є означенням імені dd, тому поміщається серед інших означень програми. Позначення цієї функції, тобто виклики її з конкретними аргументами записуються в тілі програми: program minimdis(input, output); var x1, y1, x2, y2, d1, d2, d3, m : real; function dd(a1, b1, a2, b2: real):real; begin dd:=sqrt( sqr(a1-a2)+sqr(b1-b2) ) end; begin writeln('введіть координати двох точок:'); readln(x1, y1, x2, y2); d1:=dd(x1, y1, x2, y2); d2:=dd(x1, y1, 1, 2); d3:=dd(x2, y2, 1, 2); if d1<d2 then m:=d1 else m:=d2; if d3<m then m:=d3; writeln('найменша відстань: ', m) end. При виконанні цієї програми після читання значень змінних виконується виклик функції dd: значення змінних x1, y1, x2, y2 присвоюються відповідним параметрам a1, b1, a2, b2 як звичайним змінним і потім обчислюється значення dd. Воно і є значенням виразу dd(x1, y1, x2, y2), що присвоюється змінній d1. Так само, тільки з іншими аргументами, виконуються другий і третій виклики функції, і інші значення присвоюються змінним d2 і d3. Отже, ми бачимо, що мова Паскаль дозволяє не тільки користуватися викликами "стандартних" функцій, наприклад, odd або sin, але й створювати свої власні. Функція має такий загальний вигляд: function ім'я(означення параметрів) : ім'я типу; означення begin послідовність операторів end; У першому рядку функції записано заголовок, де вказано її ім'я й означення параметрів. Наприкінці заголовка обов'язково записується ім'я типу значень, що обчислюються в результаті виконання викликів функції. Ці значення називаються такими, що повертаються. Параметрів у функції може не бути, тоді й дужки відсутні, а виклик такої функції є просто її ім'ям. Після заголовка структура функції повторює структуру програми за винятком лише точки в кінці. У функції можна визначати свої змінні, сталі та функції. Проте функція істотно відрізняється від програми тим, що: 1) функція записується серед означень програми; 2) ім'я самої програми ніде в програмі не вказується, тоді як серед операторів функції обов'язково повинні бути оператори присвоювання з ім'ям функції в лівій частині, причому при виконанні виклику функції хоча б один із них повинен бути виконаним. Виклик функції є виразом того типу, який указано в її заголовку. І він, як усякий вираз, може бути частиною складнішого виразу. Наприклад, за необхідності ми могли б написати d1:=sqr(dd(x1, y1, 1, 2)+1). Повернемося до прикладу. Нескладно написати функцію обчислення меншого з двох значень: function min(x1, x2 : real):real; begin if x1<x2 then min:=x1 else min:=x2 end; і помістити її слідом за функцією dd у програмі minimdis. З її використанням обчислення мінімального зі значень змінних d1, d2, d3 можна в тілі програми задати так: m:=min(d1, d2); m:=min(m, d3) або навіть так: m:=min(min(d1, d2), d3) При обчисленні останнього виразу спочатку виконується "внутрішній" виклик min(d1, d2). Значення, обчислене при його виконанні, стає аргументом у "зовнішньому" виклику. Задачі 3.13.* Написати функцію even, тобто "парне", що задає обчислення ознаки парності цілого. 3.14. Написати функцію обчислення за дійсним параметром x: а) його знака (sign(x)=-1, 0 або 1 відповідно при x<0, x=0, x>0); б)* ceil(x) – найменшого цілого, що не менше, ніж значення параметра (для від'ємних значень параметра можливі два варіанти означення). 3.15. Написати програму обчислення периметра й площі трикутника за координатами його вершин. 3.16. Написати тригонометричні функції з дійсним параметром, значення якого вимірюються в градусах. 3.17. Написати функцію означення за довжинами трьох відрізків, чи утворюють вони трикутник З її використанням написати програму обчислення, скільки трикутників можна утворити з чотирьох заданих різних відрізків.