Полегшуємо собі роботу з обчислення значення виразу за допомогою готових функцій, отримуємо файл готової програми
Поняття функції вам уже знайоме з курсу алгебри. В математиці функцією називають правило (закон), який описує залежність одних величин від інших. Наприклад, функція залежності площі квадрата від його сторони може бути математично виражена як S(x)=x². (залежність S від x виражається формулою x²). Іншими словами кажучи, функція задає результат, який ми отримаємо, якщо візьмемо якесь конкретне значення x. Буде x=2 - отримаємо S=2²=4. Якщо x=6, тоді матимемо S=6²=36 і т.д.
Аналогічну роль виконує функція і в програмуванні. Функцією в програмуванні називають частину програмного коду, якому передається якесь значення і в результаті виконання цього програмного коду отримується відповідь. Функцію можна порівняти з деякою машиною, в яку "завантажуються" деякі дані, машина щось там з тими даними витворяє, в результаті на виході з неї отримуємо якусь певну відповідь.
Наприклад, функція int(x)
десятковий дріб перетворює на ціле число, відкидаючи від нього цілу частину.
Розгляньте код вбудованої нижче програми і поекспериментуйте з нею (натискати слід на кнопку з написом Run, вводити десяткові дроби в англійській розкладці, використовуючи КРАПКУ замість десяткової коми)
Зверніть увагу: у виведеному результаті після крапки, яка відділяє цілу частину від дробової, далі йдуть нулі - дробова частина ігнорується, тому і, наприклад, 3,2 і 3,8 в результаті дають одну й ту саму відповідь: 3.00000000000000E+000
, що означає 3 цілих, 0 дробових, помножене на 10 в степені 0 (написане після E). Результати типу real
подаються в стандартному вигляді.
Якщо вам захочеться не відкинути дробову частину, а округлити результат до цілих, то вам допоможе функція round(x)
:
Тепер уже округлення відбувається за всіма правилами математики: 3,2 дає нам 3.00000000000000E+000
, а при значенні 3,8 отримаємо 4.00000000000000E+000
.
До, речі, позбутися "набридливих" нулів, насправді, досить легко. Для цього в Pascal існує спеціальна конструкція, яка використовується при виведенні результату і виглядає так: write(b:2:1)
. Означає цей запис таке: вивести значення зміної b, відвівши для неї 2 позиції, а після коми залишити одну. Тепер отримаємо вже не 4.00000000000000E+000
, а 4.0
. Щоб не було дробової частини взагалі, слід записати write(b:2:0)
, тоді у відповіді отримаємо просто 4
.
Роль першого числа в конструкції write(b:2:1)
(у нашому випадку це число 2) стає зрозумілою, якщо поставити це число таким, щоб воно перевищувало загальну довжину результату:
Ну а в адаптованому під OS Windows PascalABC нічого цього робити взагалі не потрібно, бо на відміну від справжнього середовища Pascal, яке відтворюється на OnlineGDB, він цих нулів не виводить зовсім.
Дано три числа. Обчислити суму їх квадратів.
Перший спосіб розв'язання цієї задачі вам легко доступний: вводимо і прочитуємо три числа (три змінні) і в четверту змінну записуємо суму квадратів цих чисел (помножити саме на себе).
Розв'язання задачі
program sum_kv;
var a,b,c,res:real; //res - відповідь, від result
begin
write('Введіть перше число ');
readln(a);
write('Введіть друге число ');
readln(b);
write('Введіть третє число ');
readln(c);
res:=a*a+b*b+c*c;
writeln(res)
end.
Виведення "красивої" відповіді в середовищі PascalABC не потребує більше ніяких інших маніпуляцій (перевірте!). Реалізація того ж самого в середовищі справжнього Pascal, а не адаптованого під OS Windows, вимагатиме подати останню команду у вигляді writeln(res:2:2)
. В обох випадках при, наприклад, a=2.1
, b=2.2
, c=2.3
отримаємо 14.54
.
ІІ спосіб:
Замість записувати a*a
, b*b
і т.д. можемо використати спеціальну функцію піднесення до квадрата sqr(x)
(від англ. square - "квадрат"). Тепер уже рядок, в якому обчислюється сума квадратів матиме такий вигляд: res:=sqr(a)+sqr(b)+sqr(c);
(що означає a²+b²+c²)
Завдяки цій функції тепер можемо обчислювати і вищі степені. Так, команда на обчислення четвертого степеня числа тепер може бути подана не a*a*a*a
, а всього лише sqr(a)*sqr(a)
або ще коротше sqr(sqr(a))
(як відомо з курсу алгебри, четвертий степінь може бути подано як (a²)²). Піднесення до непарного, наприклад, п'ятого степеня можна скомбінувати так: sqr(sqr(a))*a
і т.д.
Однак, цей спосіб не можна назвати раціональним для вищих степенів. На жаль, в Pascal оператора "кришечка" (^), як в Excel, немає. Тому, наприклад, піднесення до 22 степеня (a²²) записати як a^22
не вийде, доведеться сконструювати досить довгий ланцюжок з "квадратів": (((a²)²)²∙a²∙a)², що в програмному коді матиме вигляд sqr(sqr(sqr(sqr(a)))*sqr(a)*a)
. Жах, в якому легко заплутатися!
Для піднесення до вищих степенів у Pascal існує спеціальна функція power(a,n)
, де a - основа степеня, а n - його показник. Записати power(a,22)
, зрозуміло, легше, аніж sqr(sqr(sqr(sqr(a)))*sqr(a)*a)
.
Між іншим, застосування функції power
вимагає тільки типу даних real
.
І знову про відмінності між справжнім Pascal і адаптованим. Запуск цього ж коду, який чудово спрацьовує в PascalABC, в середовищі OnlineGDB викличе помилку:
Річ у тім, що ми бачимо лише зовнішню оболонку функції - її назву, кількість змінних, які ми туди передаємо і результат, який отримуємо. Що відбувається всередині тієї самої "машини", яка готує нам тост, меле кавові зерна чи додає до нашого числа число 3 нам невідомо. Ми записуємо в своїй програмі команду round(x)
і очікуємо отримати округлене значення. Але ЯК вона це робить? ЯКИЙ АЛГОРИТМ дій, які виконує програма, щоб округлити число до цілих?
Ця послідовність дій записана в самому середовищі програмування або в спеціальних т.зв. модулях, які необхідно підключити до самої програми, щоб використовувати ті чи інші функції. Функція power
міститься в окремому математичному модулі math
, після підключення якого усе починає працювати як слід:
uses
- ПЕРЕД var
.Тепер, коли програма "натикається" на функцію power
, вона просто "зазирає" в модуль math
- там є "інструкція", ЯК виконати цю функцію. З часом ви навчитеся й самі створювати свої функції, але про це - не зараз.
В PascalABC модуль math
підключати не треба, він уже "включений" за промовчанням. Про те, які ще функції містяться в модулі math
можна прочитати за посиланням.
Знайти значення заданих функцій при заданих користувачем з клавіатури значеннях x:
Створюємо програму самостійно і перевіряємо себе:
6.1.
program zavd6_1;
var x,y:real;
begin
writeln('Введіть x: ');
readln(x);
y:=3*power(x,6)-6*sqr(x)-7;
writeln(y)
end.
6.2.
І спосіб:
program zavd6_2_1;
var x,y:real;
begin
writeln('Введіть x: ');
readln(x);
y:=4*power(x-3,5)-7*power(x-3,3)+2;
writeln(y)
end.
Якщо помітити, що у дужках міститься один і той самий вираз, то його можна обчислити окремо, а потім підставити.
ІІ спосіб:
program zavd6_2_2;
var x,xx,y:real;
begin
writeln('Введіть x: ');
readln(x);
xx:=x-3;
y:=4*power(xx,5)-7*power(xx,3)+2;
writeln(y)
end.
Обчислити значення виразу |x³-5x-12|
Для обчислення модуля числа теж є спеціальна функція abs(x)
, де замість x слід підставити підмодульний вираз. От її і застосуйте.
program zavd7;
var x,y:real;
begin
writeln('Введіть x: ');
readln(x);
y:=abs(power(x,3)-5*x-12);
writeln(y)
end.
Після того, як написано код програми, вона пройшла компіляцію і ми перевірили правильність її роботи, виникає закономірне питання: "А де ж сама програма?". Збережений файл .pas вимагає наявності на комп'ютері середовища Pascal. Якщо такого немає, то відкрити його можна хіба що за допомогою Блокнота (клік правою кнопкою миші → Відкрити за допомогою → Блокнот) і лише переглянути код. Чи можна отримати exe-файл, який можна буде запустити на будь-якому комп'ютері з OS Windows?
Можна. Тільки для того потрібно попередньо виконати деякі налаштування нашого PascalABC:
Тепер після того, як ви запустите програму кліком на зеленому трикутнику у разі успішного її виконання в папці С:\PABCWork.NET\Output ви і знайдете свій exe-файл:
Тепер його можна скопіювати, наприклад, на флешку й запускати будь-де.
Хоча, є деяка проблема. Точніше, дві.
Перша: некоректне відображення української літери "і". Як бачимо, замість української "і" у слові "Введіть" відображається знак питання. Помилка в кодуванні літери. Плутається вона з англійською літерою "і".
Щоб цього уникнути вводьте в текстових фрагментах свого коду англійську літеру "і" (перемикайтесь на англійську розкладку) або замість української "і" набирайте її код (натискаємо лівий Alt → тримаємо → на NumPad набираємо 105 → відпускаємо Alt).
Друга проблема більш критична. Після введення числа з клавіатури чорне вікно програми просто закривається і не показує нам результат. Хоча, насправді, це лише так виглядає. Насправді, програма результат роботи нам показує, адже команда writeln(y)
там присутня, значить вона буде виконана. От тільки робить вона це настільки швидко, що ми не встигаємо нічого прочитати. А наступним після writeln(y)
є end
- кінець програми. От програма й припиняє свою роботу! Усе! Кінець!
Для того, щоб затримати вікно програми, програмісти придумали таку хитрість: після writeln(y);
розміщують ще одну команду readln
. Саме так - без дужок і будь-яких інших змінних:
writeln(y);
readln
end.
Тим самим ми подаємо команду стояти й чекати, поки щось не буде введено з клавіатури (найчастіше в такому випадку натискається клавіша Enter!). Оскільки ми не написали, куди подіти введене (команда readln
не містить аргументів), то комп'ютер його прочитує але не запам'ятовує (ми ж не написали, куди його розмістити!) і переходить до виконання наступної команди. Наступним стоїть end
. Все. Програма закривається!
От тепер у нас все добре: програма видала відповідь і стоїть слухняно чекає, поки ми не відреагуємо:
Тільки на перевірку потрібно надсилати не exe, а pas-файли! Не переплутайте!
Отже, з цього уроку ви дізналися і маєте запам'ятати:
int(x)
дозволяє відкинути дробову частину дробового числа, функція round(x)
- округлити його до цілих, функція abs(x)
обчислити модуль числа, функція sqr(x)
піднести деяке число до квадрата, а функція power(x,n)
- піднести число x
до степеня n
;power
працює тільки з типом даних real
;uses <назва модуля>
;readln
, яку ставлять без аргументів аж наприкінці програми безпосередньо перед end
.