FUNKCJE ARYTMETYCZNE

  W zasobach BCB, w module math.hpp znajdują się prototypy funkcji, służących do przeprowadzania różnego rodzaju działań arytmetycznych. Funkcje te mogą mieć zastosowanie przy tworzeniu skomplikowanych operacji arytmetycznych. Jeżeli przeglądaliście już dział obliczenia finansowe to na pewno zauważyliście że moduł math.hpp jest również wykorzystywany do przeprowadzania obliczeń finansowych.

WAŻNE!
   
Żeby używać funkcji zawartych w module math.hpp trzeba najpierw włączyć ten moduł do projektu. Najlepiej będzie zrobić to w pliku nagłówkowym np. Unit1.h w sekcji include:

#include <math.hpp>


Menu


Podnoszenie do potęgi.

Żeby podnieść liczbę do n potęgi, należy posłużyć się funkcją IntPower, podając jako argumenty podstawę potęgi Base oraz wykładnik potęgi Exponent. Można również skorzystać z funkcji Power posiadającej takie same argumenty z tą jednak różnicą, że wykładnik potęgi może być liczbą dziesiętną:

__fastcall IntPower(Extended Base, int Exponent);
__fastcall IntPower(long double, int);

__fastcall Power(Extended Base, Extended Exponent);
__fastcall Power(long double, long double);

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int x = IntPower(2, 4); // dwa do czwartej potęgi powinno dać 16.

 long double y = Power(2, 4.4); // dwa do potęgi 4,4 powinno dać 21,11.
}
//--------------------------------

...powrót do menu. 

Konwertowanie stopni na radiany i odwrotnie.

W celu przekonwertowania stopni na radiany można posłużyć się funkcją DegToRad:

__fastcall DegToRad(Extended Degrees);
__fastcall DegToRad(long double);
Radians = Degrees * (pi / 180);

Żeby dokonać konwersji z radianów na stopnie, można posłużyć się funkcją RadToDeg:

__fastcall RadToDeg(Extended Radians);
__fastcall RadToDeg(long double);
Degrees = Radians * (180 / pi);

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 long double x = DegToRad(90);

 long double y = RadToDeg(1.57);
}
//--------------------------------

...powrót do menu. 

Sumowanie wartości liczbowych z wykorzystaniem tablic.

    W module math.hpp znajduje się funkcja Sum, która umożliwia przeprowadzanie szybkiego sumowania dowolnych wartości liczbowych. Jest to szczególnie przydatne gdy potrzebujemy podsumować bardzo długie ciągi liczbowe. Do funkcji Sum przekazuje się za pomocą argumentów ciąg liczb, który zostanie zsumowany Data, przy czym ten argument wymaga podania całej tablicy. Drugi argument Data_Size wymaga pobiera liczbę elementów tablicy:

__fastcall Sum(const double * Data, const int Data_Size);

Przykład 1.:
W niniejszym przykładzie wykonamy następujące równanie → 10 + 10 + 10 + 10 + 20 + 30 = 90:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 double data[] = {10, 10, 10, 10, 20, 30};       // linia pierwsza
 long double x = Sum(data, ARRAYSIZE(data) - 1); // linia druga
}
//--------------------------------

Kod wyróżniony na żółto, to tablica otwarta, która występuje w roli argumentów funkcji i może posiadać dowolne rozmiary. W drugiej linii funkcji Sum tablica została przekazana jako argument. 
Kod wyróżniony na niebiesko określa rozmiar tablicy, czyli liczbę jej elementów pomniejszoną o jeden, ponieważ elementy tablic w języku C++ są indeksowane począwszy od wartości 0.

Przedstawiony przykład jest mało praktyczny ponieważ wymaga zdefiniowania sumowanych liczb wewnątrz programu. Rozważmy sytuację z obiektem StringGrid1 i spróbujmy zsumować zawartość 10 komórek znajdujących się w jednej kolumnie. W tym celu umieszczamy na formularzu obiekty StringGrid1 oraz Button1, a następnie ustawmy właściwość obiektu StringGri1 w następujący sposób:

Przykład 2.:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 double data[10];
 for(int i = 0; i < StringGrid1->RowCount; i++)
     data[i] = StrToFloat(StringGrid1->Cells[0][i]);

 long double x = Sum(data, 9);

 delete [] data;
}
//--------------------------------

Jedyna różnica polega na tym, że tym razem rozmiar tablicy został z góry określony i inaczej nie można tego zrobić, ponieważ można tworzyć tablicę o dowolnych rozmiarach (np: data[]) tylko wtedy, gdy jest ona jednocześnie inicjowana tak jak to obrazuje pierwszy przykład.

...powrót do menu. 

Wyliczanie średniej arytmetycznej.

    Średnia arytmetyczna to suma elementów tablicy podzielona przez liczbę jej elementów, np średnia arytmetyczna dla rónania: 1 + 2 + 3 + 4 + 5 jest równa 3 ponieważ suma tych liczb podzielona przez ich ilości, czyli 15/5 = 3. W BCB zadanie to można zrealizować za pomocą prostej funkcji Mean:

__fastcall Mean(const double * Data, const int Data_Size);

Przykład:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 double data[] = {1, 2, 3, 4, 5};

 long double x = Mean(data, 4);

 delete [] data;
}
//--------------------------------

...powrót do menu. 

Zaokrąglanie liczby

Czasami zachodzi konieczność zaokrąglenia liczby zmiennopozycyjnej, inaczej mówiąc dziesiętnej, można taką liczbę przepisać do zmiennej typu int, ale takie przepisanie zawsze zaokrągli liczbę poprzez obcięcie końcówki, ale istnieje funkcja floor umożliwiająca zaokrąglenie liczby do najbliżej wartości całkowietej, czyli jeżeli mamy np. liczby o pomiędzy 2.5... i 2.9... to takie liczby zostaną zaokrąglone do 3, jeżeli natomiast weźmiemy liczby z przedziału od 2.0... do 2.49... to takie liczby zostaną zaokrąglone do 2. Żeby skorzystać ze wspomnianej funkcji należy włączyć do projektu bibliotekę #include <math.h>:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 double x = 2.5;
 int przybliz = floor(x + 0.5);
 Label1->Caption = przybliz;
}
//--------------------------------

...powrót do menu. 

Sprawdzanie czy liczba jest podzielna przez x.

Żeby sprawdzić czy liczba jest podzielna bez reszty przez inną liczbę, nie trzeba wcale stosować, żadnych funkcji, lecz wystarczy posłużyć się warunkiem i operatorem %:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 static int x = 1;
 if((x % 3) == 0)
  Edit1->Text = FormatCurr("# - Liczba jest podzielna przez 3", x);
 else
  Edit1->Text = FormatCurr("# - Liczba nie jest podzielna przez 3", x);

 x++;
}
//--------------------------------

W podanym przykładzie jest sprawdzane, czy kolejne liczby są podzielne przez 3, kluczem do sprawdzania podzielności jest wyrażenie: if((x % 3) == 0).

...powrót do menu. 

Pobieranie modulo (MOD).

W celu pobrania wartości modulo (MOD) należy posłużyć się operatorem %:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int x = 22 % 3;
 Edit1->Text = (AnsiString)x; // reszta = 1.
}
//--------------------------------

bo 3 mieści się siedem razy w 22 co się równa 3 x 7 = 21, czyli reszty zostaje 1.

...powrót do menu. 

Podwajanie wartości liczb.

Pisząc o podwajaniu wartości liczb mam na myśli dokładnie to co z tego wynika, czyli jeśli mamy np. wartość 1000 to po podwojeniu wyniesie ona 2000, a po kolejnym podwojeniu 4000. Do zrealizowania tej operacji należy posłużyć się operatorem <<=:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 static int x = 1000;
 x <<= 1;
 Edit1->Text = x;
}
//--------------------------------

Można zwielokrotniać wartość liczbową podając zamiast 1 inną liczbę. Można również dzielić wartość liczbową o połowę stosując odwrotny operator:

// Plik źródłowy np. Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 static int x = 1000;
 x >>= 1;
 Edit1->Text = x;
}
//--------------------------------

Gdy takie dzielenie wartości osiągnie wartość 0 nie przejdzie do liczb ujemnych, lecz zatrzyma się na zerze.

...powrót do menu. 

Porównywanie liczb. Większa > mniejsza.

W tej poradzie chcę pokazać prostą funkcję wskazującą, która z dwóch podanych liczb jest większa, a która mniejsza. Funkcja pobiera dwie wartości typu int i zwraca wynik w postaci łańcucha znaków.

// Plik źródłowy np. Unit1.cpp
#pragma warn +csu
String foo(int u, int i)
{
 bool z = u < i;
 if(z) return IntToStr(u) + " < " + IntToStr(i);
 return IntToStr(u) + " > " + IntToStr(i);
}
//--------------------------------
void __fastcall TInterface1::Button1Click(TObject *Sender)
{
 Edit1->Text = foo(-10, 5);
}
//--------------------------------

...powrót do menu.