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 |
Ż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 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. |
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); |
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.
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; |
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; } //-------------------------------- |
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).
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.
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.
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); } //-------------------------------- |