Арифметичні дії. Пріоритети дій. Бібліотека

Якщо ви працюєте з числами, то з великою ймовірністю вам доведеться виконувати арифметичні дії. Розберемося які вони бувають у мові та які підводні камені тут можуть бути прихованими.

У шкільному курсі математики ви використовували такі дії:

« + » - додавання

« - » - віднімання

« * » - множення

З ними жодних проблем не має і вони працюють однаково як в реальному житті так, і у мові

З діленням вже виникають перші нюанси.

Є два типи ділення. та від ділення.

Також результати будуть відрізнятися від типів чисел які діляться (чи числа є цілими чи дробовими).

Якщо ви маєте ділення двох цілих чисел, то дасть вам цілий результат і відкине дробову частину. Наприклад, при отримаємо А дає залишок від ділення. Наприклад, отримаємо

Якщо ж обидва числа або хоча б одне з чисел є дробовим, то результат буде також дробовим. І при ми отримаємо число з крапкою Наприклад, при отримаємо а взагалі не працює, якщо є дробові числа.

    
            #include <iostream>
            using namespace std;
            int main()
            {
                cout << 7 + 2 << endl;
                cout << 7 - 2 << endl;
                cout << 7 * 2 << endl;
                cout << 7 / 2 << endl;
                cout << 7 % 2 << endl;
                cout << 7.0 / 2.0 << endl;
                cout << 7.0 / 2 << endl;
                //cout << 7.0 % 2.0 << endl; //error

                return 0;
            }
        
    

Варто зауважити, що коли одне з чисел є дробовим а інше цілим, то результат буде дробовим. Це називається «не явним перетворенням типів».

Також ми будемо мати «не явне перетворення типів», коли ми присвоюємо змінній не той тип. Наприклад, коли змінній типу ми будемо присвоювати дробові числа. В такій ситуації у числа відкинуть дробову частину.

    
            #include <iostream>
            int main()
            {
                int a = 5.6;
                std::cout << a << std::endl;
                return 0;
            }
        
    

Детальніше ми розглянемо це пізніше. Ця ж інформація необхідна щоб уникнути проблем на початку.

У мові є такі дії (вказані не всі):

• « + » - додавання

• « - » - віднімання

• « * » - множення

• « / » - ділення

• « % » - залишок від ділення (для цілих чисел)

• « > » - більше

• « >= » - більше або рівне

• « < » - менше

• « <= » - менше або рівне

• « && » - «і»

• « || » - «або»

• « ++ » - додаємо до змінної одиницю

• « -- » - віднімаємо від змінної одиницю

• « ( ) » - дужки вказують, що дії в них мають найвищий пріоритет

У програмуванні як і у математиці дужки мають найвищий пріоритет. Тому, якщо ви бажаєте щоб якась дія виконалася першою, то необхідно її взяти у дужки. Наступний пріоритет має далі Якщо є дії з однаковим пріоритетом, то дії виконуються з ліва на право.

Один з самих менших пріоритетів має знак присвоєння

    
            #include <iostream>
            int main()
            {
                //першим виконається додавання «2 + 4 = 6», оскільки воно у дужках
                //після чого множення «3 * 6 = 18»
                int a = 3 * (2 + 4);
                std::cout << a << std::endl;

                return 0;
            }
        
    

Часто буває потреба виконати дії з якимось значенням (змінною) та записати це значення назад у змінну.

Наприклад:

У вас було яблук. Вам дали ще яблука. Скільки у вас стало яблук? Все доволі просто. Вам потрібно до додати Тобто, ви до старого значення додаєте необхідне число та записуєте його на місце старого значення. У мові це виглядатиме так:

    

            #include <iostream>
            int main()
            {
                int apples = 5;
                std::cout << "apples = " << apples << std::endl;
                apples = apples + 2;
                std::cout << "apples = "<< apples << std::endl;
                return 0;
            }
        
    

Розберемо рядок

Змінна з самого початку має значення У нас є два знаки Оскільки має вищий пріоритет чим то першою виконається дія а вже тоді В правій частинні ми маємо тому будемо мати і отримаємо Після чого виконається дія присвоєння, тому в змінну ми збережемо значення

Якщо ви виконуєте дію зі значенням змінної і після цього перезаписуєте значення цієї змінної (як у рядку то можна використовувати скорочений запис

Наприклад, рядок ми можемо замінити на Аналогічно буде з іншими діями:

Якщо до змінної ви хочете додати/відняти одиницю, то можна скористатися скороченим записом

Скорочений запис можна використовувати двома способами. Вам можна писати його перед або після іменні змінної. Наприклад: або

Якщо знаходиться після імені змінної, то з першу виконається якась дія, а потім одиницю.

Якщо знаходиться перед іменем змінної, то з першу одиницю, а потім виконується якась дія.

    
            #include <iostream>
            int main()
            {
                float a = 4.2;
                //з першу дія потім додаємо. Оскільки ми вже вивели «а», то результат після додавання помітимо в другому виведені
                std::cout << a++ << std::endl; //виводимо значення "4.2", після чого додаємо "1"
                std::cout << a << std::endl;

                int b = 7;
                //з першу віднімаємо, тоді виводимо. Тому результат бачимо відразу
                std::cout << --b << std::endl; //віднімаємо "1", після чого виводимо значення "6"
                std::cout << b << std::endl;

                return 0;
            }
        
    
    
            #include <iostream>
            int main()
            {
                int a = 5;
                //оскільки до "а" добавиться одиниця лише після виконання дій
                //то програма буде використовувати початкове значення
                //і ми отримаємо "3 + 5 = 8"
                std::cout << 3 + a++ << std::endl;

                int b = 7;
                //оскільки до "b" добавиться одиниця перед виконанням дій
                //то програма буде використовувати нове значення "7 + 1 = 8"
                //і ми отримаємо "3 + 8 = 11"
                std::cout << 3 + ++b << std::endl;

                return 0;
            }
        
    

Якщо ви збираєтеся використовувати скорочені записи і так далі, то майте на увазі, що змінна до якої ви їх застосовуєте обов’язково має бути ініціалізованою (їй має бути присвоєне якесь значення). В інших випадках ви будете мати помилку.

        
            #include <iostream>
            int main()
            {
                int a;

                //a++;      //помилка. змінна "а" не має значення
                //a -= 3;   //помилка. змінна "а" не має значення

                int b;
                b = 5;

                b++;        //все гаразд. змінна "b" має початкове значення
                b *= 2;     //все гаразд. змінна "b" має початкове значення

                return 0;
            }
        
    

Для складніших математичних дій (степінь, sin, cos, степінь, корінь, …) варто підключити бібліотеку або Тобто, потрібно на початку програми написати такий рядок: або

Функцій які надає ця бібліотека дуже багато. Тому, ми розглянемо лише деякі з них.

Щоб декілька разів не повторюватись, відразу зауважимо, що «х» означає число, вираз або змінну числового типу.

• «abs(х)» - функція повертає абсолютне значення Тобто, це є модуль. В результаті ми отримаємо число з додатним знаком:

• «fabs(x)» - функція повертає абсолютне значення числа з плаваючою крапкою.

• «sin(x)» - приймає радіальну міру кута та знаходить його синус.

• «cos(x)» - приймає радіальну міру кута та знаходить його косинус.

• «tan(x)» - приймає радіальну міру кута та знаходить його тангенс.

• «pow(x, y)» - піднімає число в степінь

• «sqrt(x)» - добуває корінь квадратний з

• «cbrt(х)» - добуває корінь кубічний з числа

• «ceil(x)» - округлення до найближчого цілого числа в більшу сторону.

• «floor(x)» - округлення до найближчого цілого числа в меншу сторону.

• «round(х)» - округлення до цілого числа за правилами.

• «exp(х)» - обчислення експоненти числа

• «log(x)» - логарифм натуральний (логарифм з основою експонента) від числа

• «log10(x)» - логарифм десятковий (з основою від числа

• «fmax(x, y)» - повертає більше зі значень та

• «fmin(x, y)» - повертає менше зі значень та

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

Якщо ви бажаєте використовувати логарифми з довільними основами, то вам доведеться це реалізувати самостійно. Для цього створіть функцію:

    
            double logbase(double a, double base)
            {
                return log(a) / log(base);
            }
        
    

Де це під логарифмічний вираз, а це основа логарифму. Тобто, ви маєте:

Найбільше проблем виникає, коли ви працюєте з тригонометричними функціями

Наприклад, синус є рівний але якщо ви напишете то результат буде іншим. Це все виникає через те, що дані функції працюють з радіанами. Тому, в першу чергу варто перетворювати з радіанів у градуси. Але це буває доволі складно. Через це краще працювати з радіанами. А щоб отримувати правильний результат, то варто змінювати значення.

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

Програма виглядатиме так:

    
            #include <iostream>
            #include <math.h>
            int main()
            {
                int grad;
                std::cin >> grad;
                std::cout << sin(grad * 3.14 / 180);

                return 0;
            }
        
    

Також, часто бувають проблеми, коли необхідно працювати з коренем. У випадку, коли використовують корінь арифметичний (квадратний), то можна скористатися готовою функцією Але коли потрібно використати корінь кубічний (корінь третього степеня, то необхідно скористатися функцією І в якості степеня потрібно писати не цілі числа а дробові числа Пам’ятаємо, що степінь числа це чисельник, а

Розглянемо приклад:

    
            #include <iostream>
            #include <math.h>
            int main()
            {
                std::cout << pow(8, 1/3) << std::endl;
                std::cout << pow(8, 1.0/3.0) << std::endl;

                return 0;
            }
        
    

Розберемося, що тут відбувається. В першому рядку ми маємо Враховуючи, що це цілі числа, то результатом від ділення буде бо при ділені ми не маємо цілої частини, тобто, вона буде рівна І ми отримаємо а це буде рівне

Коли ми маємо ділення то результатом буде адже ми маємо ділення дробових чисел, тому і результат буде дробовим. І ми отримаємо (тобто, будемо мати: що дасть