Strona główna » C++ » Kurs » Operacje Matematyczne

Operacje Matematyczne

Wstęp

Tak samo jak słowa mówionego tak samo matematyki komputery nie potrafią zrozumieć dosłownie. Czasem potrzeba przetłumaczyć ją na ciąg tekstowy zrozumiały dla programu. Tak samo jest w przypadku wykonywania działań matematycznych w C++. Podstawowe funkcje arytmetyczne wykonujemy wpisując naturalnie w kodzie programu. Bardziej zaawansowane wymagają znajomości biblioteki cmath, która znacząco zwiększa ilość operacji matematycznych możliwych do wykonania w programie.

Operacje arytmetyczne

Jak już wspomniałem operacje arytmetyczne w C++ można wpisać bezpośrednio w kod. Każdej operacji matematycznej przypisany jest operator. Operator jest to symbol, który kompilator interpretuje i wykonuje odpowiednie operacje na danych podanych przy operatorach. Dla dodawania jest to +, odejmowania -, mnożenia *, a dla dzielenia to /. Przykładowo w celu wypisania wyniku dodawania można zapisać następująco:

  1.   cout << "2 + 3 = " << 2 + 3 << "\n\n";

Po uruchomieniu programu otrzymujemy na konsoli wynik operacji:

  1. 2 + 3 = 5

Operacje arytmetyczne nie muszą być wykonywane na liczbach podanych wprost. Możemy wykorzystać do tego celu zmienne. Spróbujmy przykładowo dodać wartości dwóch zmiennych a, b i zapisać je do zmiennej c:

  1.   int a = 2;
  2.   int b = 3;
  3.   int c = a + b;
  4.   cout << "a = 2\nb = 3\nc = a + b =" << c << "\n\n";

(1., 2.) Deklarujemy kolejno zmienne a i b. Przypisujemy im odpowiednie wartości. (3.) Deklarujemy zmienną c i przypisujemy jej sumę a i b. Następnie (4.) wypisujemy wynik. Tak samo wykonujemy operację dla każdego dowolnego operatora arytmetycznego podstawiając pod znak + inny operator.

Dzielenie liczb całkowitych

Spróbujmy podzielić teraz 3 przez 2 i wypisać wynik na ekran:

  1.   cout << 3 / 2;

Ku naszemu zdziwieniu po skompilowaniu i uruchomieniu otrzymamy:

  1. 1

Jest to spowodowane użyciem do operacji zmiennych typu całkowitego. Kompilator w trakcie wykonywania operacji arytmetycznych określa typ zwracanej wartości. W tym przypadku liczby 2 i 3 są prawidłowo rozpoznane jako liczby całkowite czyli typ int. Logika programu nakazuje mu nadać liczbie wyjściowej ten sam typ. Jednak w typie int nie możemy przechowywać części ułamkowej, dlatego zostaje ona ucięta.

Możemy to naprawić kompilator informując, że spodziewamy się liczby typu rzeczywistego. Osiągniemy to kiedy obie liczby też będą rozpoznane jako rzeczywiste. Musimy tu działać nieco przeciw logice matematycznej i dopisać część dziesiętną każdej liczby. Innymi słowy podzielimy teraz 3.0 przez 2.0:

  1.   cout << 3.0 / 2.0;

Tym razem nasz program już prawidłowo określa typ wyniku wyjściowego - double i nasz wynik jest prawidłowy:

  1. 1.5

Podany błąd występuje również podczas przypisywania zmiennej typu int części całkowitej. Za każdym razem część ułamkowa zostanie odrzucona najlepiej ilustruje to poniższy kod:

  1.   int f = 3.1;
  2.   cout << f;

To spowoduje wypisanie na ekran:

  1. 3

W przypadku bardziej zaawansowanych środowisk programistycznych na konsoli błędów i ostrzeżeń może zostać wypisany komunikat zwracający uwagę, że w danym miejscu w kodzie następuje zmiana typu rzeczywistego na całkowite co może skutkować utratą pewnych informacji.

Biblioteka cmath

W informatyce w niektórych algorytmach używa się operacji potęgowania. Na forach matematycznych oraz niektórych językach zapisu matematycznego potęgowanie zapisuje się przy pomocy znaku ^. Jednak w przypadku C++ ten operator służy do czego innego. Operacja potęgowania jest wykonywana przez funkcję i nie ma skrótu w postaci operatora. Jednak zanim jej użyjemy musimy dołączyć do naszego programu bibliotekę cmath. W tym celu na początku kodu dopisujemy :

  1. #include <cmath>

Do potęgowanie liczb użyjemy teraz funkcji pow() (ang. power). Przyjmuje ona dwa argumenty liczbowe: pierwszy określa jaką liczbę podnosimy, a drugi do jakiej potęgi. Należy pamiętać, że oba argumenty powinny być liczbą rzeczywistą. Wynik również otrzymamy jako typ double, dlatego wyniku nie powinniśmy przechowywać w typie int. Wracając do użycia funkcji to przykładowo kod wygląda tak:

  1. pow(2.0, 3.0);

Funkcja to zwróci wynik 8.0. Możemy z nim zrobić co chcemy. Przykładowo (1.) zapisać do zmiennej, albo (2.) wypisać bezpośrednio na konsolę:

  1. double a = pow(2.0, 3.0);
  2. cout << pow(2.0, 3.0);

Inne przydatne funkcję

Pierwiastek z liczby możemy uzyskać na dwa sposoby. Jednym z nich jest podniesienie liczby rzeczywistej a do potęgi , gdzie n to jest to stopień pierwiastka. Przykładowo:

  1. pow(8.0, 1.0 / 3.0);

Wywołanie funkcji zwróci 2.0.

Jednak kiedy potrzebujemy wyciągnąć pierwiastek kwadratowy to możemy użyć funkcji sqrt (ang. square root). Jest to funkcja, która przyjmuje tylko jedną liczbę rzeczywistą, którą jest liczba pierwiastkowana. Chociaż jej zastosowanie jest mocno ograniczone to w kodzie znacząco się wyróżnia i łatwiej stwierdzić co wykonuje. Przykładowo możemy użyć tak:

  1. sqrt(4.0);

Wywołanie funkcji zwróci 2.0.

Na uwagę zasługuje również funkcja zwracająca wartość absolutną. W programie używamy jej pod nazwą abs (ang. absolute). W tym przypadku również wymagane jest podanie argumentu typu double:

  1. abs(-4.0);

Wywołanie funkcji zwróci 4.0.

Kolejność wykonywania działań

W C++ najpierw zostanie wykonane kolejno mnożenie, dzielenie, dodawanie i odejmowania. Jednak czasem, tak samo jak w zapisie matematycznym, niezbędne mogą okazać się nawiasy. Podczas wpisywania wyrażenia do kodu wolno nam używać tylko nawiasów okrągłych ( ). Inne nawiasy, prawidłowe z punktu widzenia matematycznego, mogą oznaczą inne operatory co doprowadzi do nieprawidłowych wyników, albo nawet błędu kompilacji. Przykładowo:

  1.   cout << (2 + 2) * 2;

Wywołanie funkcji zwróci 8.

Podsumowanie

Lekcja 6 dobiegła końca. Zajrzyj do kodu źródłowego, aby przeanalizować wypisywanie danych jeszcze raz. Następnie spróbuj wykonać zadania, aby utrwalić materiał.

Zadania

Zadanie 1

Oblicz wyniki operacji w C++ oraz podaj zwrócony typ bez pisania programu:

  1. 80 - 4
  2. 72.0 + 3.0
  3. 72.0 / 3.0
  4. 72 / 3
  5. 5 * 3

Zadanie 2

Oblicz przy użyciu programu w C++:

Wszystkie operacje powinny być zapisane bez uprzedniego upraszczania wprowadzanego wyrażenia.