Pascal/Математичні операції

Матеріал з Вікіпідручника

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

program Calculate;
begin
  writeln( вираз );
end.

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

Не всі операції і дії в цьому розділі будуть вам зрозумілі. Нічого страшного - просто пам'ятайте, що сюди можна повернутися, коли вам щось знадобиться.

Математичні операції[ред.]

В Паскалі, як і в більшості мов програмування, дещо специфічно передаються основні математичні операції - бо математичні вирази треба записувати в один рядок, а не в кілька рівнів, як прийнято в класичній математичній нотації. Це досягається значно масовішим використанням дужок, що іноді засмучує початківців. Також завжди треба писати знак множення *. Крім того, параметри функцій завжди мають бути в дужках. Наприклад:

Математичний вираз Запис мовою Паскаль
2+2=4 2+2=4
a*(1+sqr(e))/2
(-b+sqrt(sqr(b)-4*a*c))/(2*a)
exp(2*x+y)
abs(cos(x)*sin(x)*cos(y)/tan(y))
або
abs(cos(x)*sin(x)*cos(y)/(sin(y))/cos(y))
якщо компілятор не підтримує функцію Tan.

Базова арифметика[ред.]

Назва операції Оператор Приклад Примітка
Додавання + 2+2 (=4)
Віднімання - 18.3-11 (=7.3)
Множення * 7*8 (=56)
Ділення / 7/8 (=0.875) Результат завжди дійсного типу (real)
Ціла частина ділення div 7 div 2 (=3)
Остача від ділення mod 7 mod 2 (=1)

vccv

Порівняння[ред.]

Всі операції порівняння повертають значення типу boolean, тобто можуть використовуватися в операторах розгалуження і циклах, наприклад

if 2+2=4 then writeln('Два і два разом дають чотири!');
else writeln('Та не може бути такого!');
Назва операції Оператор Приклад
Дорівнює = 2+2=4
Не дорівнює (?) <> 2+2<>5
Більше > 72>71.99
Більше або рівне (?) >= x*x>=0
Менше < 0<22
Менше або рівне (?) <= 1<=1

Функції для перетворення дійсних і цілих чисел[ред.]

Паскаль - мова програмування зі статичною сильною типізацією. Це означає, що компілятор не виконує перетворень значень між типами, які можуть призвести до втрати інформації; зокрема, якщо підставити в конструкцію, що передбачає ціле значення, дійсне число, компілятор повідомить про помилку, навіть якщо це число має ціле значення. Так, як ми бачили вище, 13 and 11 дорівнює 9, але вираз 13.0 and 11 викличе повідомлення компілятора про помилку! Щоб уникнути цього, треба явно задавати перетворення дійсного числа на ціле за допомогою таких функцій:

Назва функції Опис Приклад
Round(X) Повертає ціле значення, найближче до X Round(1.7)=2, Round(-3.1)=-3
Int(X),
Trunc(X)
Повертає цілу частину X Int(1.8)=1, Trunc(-11.3)=-11
Floor(X) Повертає найбільше ціле значення, що не перевищує X Floor(1.7)=1, Floor(-3.1)=-4
Ceil(X) Повертає найменше ціле значення, не менше від X Ceil(1.7)=2, Ceol(-3.1)=-3

Логічні і побітові операції[ред.]

Логічні операції використовуються для об'єднання кількох логічних умов в одну.

Назва операції Оператор Приклад Опис
Логічне І, and, логічне множення and (2+3=5) and (0>-1) Істинне, якщо обидва операнда істинні
Логічне АБО, or, логічне додавання or (2+2=5) or (1=1) Істинне, якщо хоча б один з операндів істинний
Логічне виключне АБО, eXclusive or xor (2+2=5) xor (1=1) Істинне, якщо рівно один з операндів істинний
Заперечення, логічне НЕ, not not not (2+2=5) Істинне, якщо операнд неправдивий

Логічні оператори, застосовані до цілих типів, можуть використовуватися, як побітові. Щоб отримати результат побітової операції, треба представити операнди у двійковій системі (так, як вони представлені в комп'ютері), після чого застосувати відповідну операцію до відповідних розрядів, причому 1 означає true, 0 - false. Так,

writeln(13 and 11);

виведе 9, бо

13 в двійковій системі буде 0 0 0 0 1 1 0 1
11 в двійковій системі буде 0 0 0 0 1 0 1 1
9 в двійковій системі буде 0 0 0 0 1 0 0 1

Крім того, є ще дві побітових операції зсуву:

Назва операції Оператор Приклад Опис
Зсув праворуч shr 14 shr 2 (=3) Зсуває двійкові розряди першого операнда праворуч на другий операнд розрядів;

еквівалент цілої частини ділення на степінь 2

Зсув ліворуч shl 7 shl 3 (=56) Зсуває двійкові розряди першого операнда ліворуч на другий операнд розрядів;

еквівалент множенню на степінь 2

Алгебраїчні функції[ред.]

Cірим позначені функції, які не підтримуються в Turbo Pascal

Назва функції Опис Замінник (для Turbo Pascal)
Pi Повертає значення числа (3,141592653589793238462643383279... з точністю, визначеним типом real)
Abs(X) Абсолютне значення (модуль) X
Sign(X) Знак числа X: -1, якщо X від'ємний, 1, якщо додатний, 0, якщо X=0
Exp(X) Експонента X (eX)
Ln(X) Натуральний логарифм X
Log2(X) Логарифм X за основою 2 Ln(X)/Ln(2)
Log10(X) Логарифм X за основою 10 Ln(X)/Ln(10)
LogN(X,Y) Логарифм Y за основою X Ln(Y)/Ln(X)
Power(X,Y) Степінь XY Exp(Y*Ln(X))
Sqrt(X) Корінь квадратний з X
Sqr(X) Квадрат X
Max(X,Y) Більше зі значень X та Y
Min(X,Y) Менше зі значень X та Y

Зауваження: корінь степеня Y з числа X можна представити як X1/Y, і, відповідно, як Power(X,1/Y) або в Turbo Pascal як Exp(Ln(X)/Y).

Тригонометричні функції[ред.]

Тригонометричні функції використовують значення кутів в радіанах, будьте уважні!

Cірим позначені функції, які не підтримуються в Turbo Pascal

Назва функції Опис Замінник (для Turbo Pascal)
DegToRad(X) Обчислює радіанну міру кута X, поданого в градусах X*Pi/180
RadToDeg(X) Обчислює градусну міру кута X, поданого в радіанах X*180/Pi
Sin(X) Синус X (X в радіанах)
Cos(X) Косинус X (X в радіанах)
Tan(X) Тангенс X (X в радіанах) Sin(X)/Cos(X)
ArcTan(X) Арктангенс X, кут, тангенс якого дорівнює X, в радіанах
ArcSin(X) Арксинус X, кут, синус якого дорівнює X, в радіанах ArcTan(X/sqrt(1-sqr(X)))
ArcCos(X) Арккосинус X, кут, косинус якого дорівнює X, в радіанах 2*ArcTan((1-X)/(1+X))
Sinh(X) Гіперболічний синус X (exp(X)-exp(-X))/2
Cosh(X) Гіперболічний косинус X (exp(X)+exp(-X))/2
Tanh(X) Гіперболічний тангенс X (exp(2*X)-1)/(exp(2*X)+1)

Функції для роботи з випадковими величинами[ред.]

Для імітації випадкових процесів в Паскалі є генератор псевдовипадкових чисел (ГПВЧ) і функції для роботи з ним; такі числа є досить непередбачуваними для практичного використання (тобто кожне наступне використання функції Random дасть певною мірою неочікуваний результат), але їхня послідовність може бути повністю відтворена, якщо встановити початкове значення ГПВЧ.

Cірим позначені функції, які не підтримуються в Turbo Pascal

Назва функції Опис Замінник (для Turbo Pascal)
Randomize Встановлює початкове значення ГПВЧ рівним поточному значенню годинника
Randomize(X) Встановлює початкове значення ГПВЧ рівним X
Random Повертає псевдовипадкове дійсне число від 0 (включно) до 1 (не включно)
Random(X) Повертає псевдовипадкове ціле число від 0 до X-1
Random(X,Y) Повертає псевдовипадкове ціле число від X до Y X+Random(Y-X+1)

Функції для роботи зі зліченими типами[ред.]

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

Назва функції Опис
Succ(X) Повертає значення, що йде після X (для цілих - X+1, для літерного - символ з наступним значенням, для переліку - наступне значення; так, Succ('A') повертає 'B'
Pred(X) Повертає значення, що передує X (для цілих - X-1, для літерного - символ з попереднім значенням, для переліку - попереднє значення; так, Pred('A') повертає '@'
Inc(X) Збільшує значення X на 1, еквівалент X:=Succ(X)
Inc(X,N) Збільшує значення X на N, еквівалент N застосувань Inc(X)
Dec(X) Зменшує значення X на 1, еквівалент X:=Pred(X)
Dec(X,N) Зменшує значення X на N, еквівалент N застосувань Dec(X)
Ord(X) Повертає значення X (для нечислових типів)
Odd(X) Перевіряє X на непарність, true, якщо X непарний або false, якщо X має парне значення

Пріорітет операцій[ред.]

Під час розбору математичного виразу Паскаль спершу виконує операції з високим пріорітетом, потім з низьким, все з права на ліво. Так, у виразі 2+2*2 спершу буде обчислено 2 * 2 = 4, а вже потім 2 + 4 = 6 - так, як і в звичайній математиці; у виразі 10 mod 2 * 3 спочатку буде виконано 10 mod 2 = 0, а вже потім 0 * 3 = 0!

Операції Приорітет Вид операції
@ not - + Перший (вищий) Унарні операції (плюс і мінус унарні, тобто тільки в формі -a, а не c-d!)
* / div mod and Другий Операції на кшталт множення
+ - or xor Третій Операції на кшталт додавання
= <> < > <= >= in Четвертий Операції порівняння
() f() П'ятий (нижчий) Дужки, виклик функції