BAZA WIEDZY
KURSY
Bazy danych w PHP
Kurs AdvancedAJAX
Kurs ASP
Kurs ASP.NET
Kurs C++
Kurs CSS
Kurs HTML
Kurs HTML drugi
Kurs JavaScript
Kurs MySQL
Kurs PHP
Kurs RSS
Kurs XHTML
Obiekty DOM
MANUALE
CSS1 - W3C
DOM - w budowie
PHP 2005
PHP 2006
Wyrażenia regularne
SHOUTBOX
STAT
Online: 6 | UU: 212

Operatory arytmetyczne

Przyznajmy szczerze: nasze dotychczasowe aplikacje nie wykonywały żadnych sensownych zadań - bo czy można nimi nazwać wypisywanie ciągle tego samego tekstu? Z pewnością nie. Czy to się szybko zmieni? Niczego nie obiecuję, jednak z czasem powinno być w tym względzie coraz lepiej :D

Znajomość operatorów arytmetycznych z pewnością poprawi ten stan rzeczy - w końcu od dawien dawna podstawowym przeznaczeniem wszelkich programów komputerowych jest właśnie liczenie .

Umiemy liczyć!

Tradycyjnie już zaczniemy od przykładowego programu:

// Arithmetic - proste działania matematyczne
#include <iostream>
#include <conio.h>
void main()
{
int nLiczba1;
std::cout << "Podaj pierwsza liczbe: " ;
std::cin >> nLiczba1;
int nLiczba2;
std::cout << "Podaj druga liczbe: " ;
std::cin >> nLiczba2;
int nWynik = nLiczba1 + nLiczba2;
std::cout << nLiczba1 << " + " << nLiczba2 << " = " << nWynik;
getch();
}

Po uruchomieniu skompilowanej aplikacji przekonasz się, iż jest to prosty. kalkulator :) Prosi on najpierw o dwie liczby całkowite i zwraca później wynik ich dodawania. Nie jest to może imponujące, ale z pewnością bardzo pożyteczne ;)

Zajrzyjmy teraz w kod programu. Początkowa część funkcji main() :

int nLiczba1;
std::cout << "Podaj pierwsza liczbe: " ;
std::cin >> nLiczba1;

odpowiada za uzyskanie od użytkownika pierwszej z liczb. Mamy tu deklarację zmiennej, w której zapiszemy ową liczbę, wyświetlenie prośby przy pomocy strumienia wyjścia oraz pobranie wartości za pomocą strumienia wejścia.

Kolejne trzy linijki są bardzo podobne do powyższych, gdyż ich zadanie jest niemal identyczne - chodzi oczywiście o zdobycie drugiej liczby naszej sumy. Nie ma więc potrzeby dokładnego ich omawiania.

Ważny jest za to następny wiersz:

int nWynik = nLiczba1 + nLiczba2;

Jest to deklaracja zmiennej nWynik , połączona z przypisaniem do niej sumy dwóch liczb uzyskanych poprzednio. Taką czynność (natychmiastowe nadanie wartości deklarowanej zmiennej) nazywamy inicjalizacją . Oczywiście można by zrobić to w dwóch instrukcjach, ale tak jest ładniej, prościej i efektywniej :)

Znak = nie wskazuje tu absolutnie na równość dwóch wyrażeń - jest to bowiem operator przypisania , którego używamy do ustawiania wartości zmiennych.

Ostatnie dwie linijki nie wymagają zbyt wiele komentarza - jest to po prostu wyświetlenie obliczonego wyniku i przywołanie znanej już skądinąd funkcji getch() , która oczekuje na dowolny klawisz.

Rodzaje operatorów arytmetycznych

Znak + , którego użyliśmy w napisanym przed chwilą programie, jest jednym z kilkunastu operatorów języka C++.

Operator to jeden lub kilka znaków (zazwyczaj niebędących literami), które mają specjalne znaczenie w języku programowania.

Operatory dzielimy na kilka grup; jedną z nich są właśnie operatory arytmetyczne, które służą do wykonywania prostych działań na liczbach. Odpowiadają one podstawowym operacjom matematycznym, dlatego ich poznanie nie powinno nastręczać ci problemów. Przedstawia je ta oto tabelka:

operator

opis

+

dodawanie

-

odejmowanie

*

mnożenie

/

dzielenie

%

reszta z dzielenia

Tabela 2. Operatory arytmetyczne w C++

Pierwsze trzy pozycje są na tyle jasne i oczywiste, że darujemy sobie ich opis :) Przyjrzymy się za to bliżej operatorom związanym z dzieleniem.

Operator / działa na dwa sposoby w zależności od tego, jakiego typu liczby dzielimy. Rozróżnia on bowiem dzielenie całkowite , kiedy interesuje nas jedynie wynik bez części po przecinku, oraz rzeczywiste , gdy życzymy sobie uzyskać dokładny iloraz. Rzecz jasna, w takich przypadkach jak 25 / 5 , 33 / 3 czy 221 / 13 wynik będzie zawsze liczbą całkowitą. Gdy jednak mamy do czynienia z liczbami niepodzielnymi przez siebie, sytuacja nie wygląda już tak prosto.

Kiedy zatem mamy do czynienia z którymś z typów dzielenia? Zasada jest bardzo prosta - jeśli obie dzielone liczby są całkowite, wynik również będzie liczbą całkowitą; jeżeli natomiast choć jedna jest rzeczywista, wtedy otrzymamy iloraz wraz z częścią ułamkową.

No dobrze, wynika stąd, że takie przykładowe działanie

float fWynik = 11.5 / 2.5 ;

da nam prawidłowy wynik 4.6 . Co jednak zrobić, gdy dzielimy dwie niepodzielne liczby całkowite i chcemy uzyskać dokładny rezultat?. Musimy po prostu obie liczby zapisać jako rzeczywiste, a więc wraz z częścią ułamkową - choćby była równa zeru, przykładowo:

float fWynik = 8.0 / 5.0 ;

Uzyskamy w ten sposób prawidłowy wynik 1.6 .

A co z tym dziwnym "procentem", czyli operatorem % ? Związany jest on ściśle z dzieleniem całkowitym, mianowicie oblicza nam resztę z dzielenia jednej liczby przez drugą. Dobrą ilustracją działania tego operatora mogą być. zakupy :) Powiedzmy, że wybraliśmy się do sklepu z siedmioma złotymi w garści celem nabycia drogą kupna jakiegoś towaru, który kosztuje 3 złote za sztukę i jest możliwy do sprzedaży jedynie w całości. W takiej sytuacji dzieląc (całkowicie!) 7 przez 3 otrzymamy ilość sztuk, które możemy kupić. Zaś

int nReszta = 7 % 3 ;

będzie kwotą, która pozostanie nam po dokonaniu transakcji - czyli jedną złotówką. Czyż to nie banalne? ;)

Priorytety operatorów

Proste obliczenia, takie jak powyższe, rzadko występują w prawdziwych programach. Najczęściej łączymy kilka działań w jedno wyrażenie i wtedy może pojawić się problem pierwszeństwa ( priorytetu ) operatorów, czyli po prostu kolejności wykonywania działań.

W C++ jest ona na szczęście identyczna z tą znaną nam z lekcji matematyki. Najpierw więc wykonywane jest mnożenie i dzielenie, a potem dodawanie i odejmowanie. Możemy ułożyć obrazującą ten fakt tabelkę:

priorytet

operator(y)

1

* , / , %

2

+ , -

Tabela 3. Priorytety operatorów arytmetycznych w C++

Najlepiej jednak nie polegać na tej własności operatorów i używać nawiasów w przypadku jakichkolwiek wątpliwości.

Nawiasy chronią przed trudnymi do wykrycia błędami związanymi z pierwszeństwem operatorów, dlatego stosuj je w przypadku każdej wątpliwości co do kolejności działań.

***

W taki oto sposób zapoznaliśmy się właśnie z operatorami arytmetycznymi.

Tajemnicze znaki

Twórcy języka C++ mieli chyba na uwadze oszczędność palców i klawiatur programistów, uczynili więc jego składnię wyjątkowo zwartą i dodali kilka mechanizmów skracających zapis kodu. Z jednym z nich, bardzo często wykorzystywanym, zapoznamy się za chwilę.

Otóż instrukcje w rodzaju

nZmienna = nZmienna + nInnaZmienna;
nX = nX * 10 ;
i = i + 1 ;
j = j - 1 ;

mogą być, przy użyciu tej techniki, napisane nieco krócej. Zanim ją poznamy, zauważmy, iż we wszystkich przedstawionych przykładach po obu stronach znaku = znajdują się te same zmienne . Instrukcje powyższe nie są więc przypisywaniem zmiennej nowej wartości, ale modyfikacją już przechowywanej liczby.

Korzystając z tego faktu, pierwsze dwie linijki możemy zapisać jako

nZmienna += nInnaZmienna;
nX *= 10 ;

Jak widzimy, operator + przeszedł w += , zaś * w *= . Podobna "sztuczka" możliwa jest także dla trzech pozostałych znaków działań 1 . Sposób ten nie tylko czyni kod krótszym, ale także przyspiesza jego wykonywanie (pomyśl, dlaczego!).

Jeżeli chodzi o następne wiersze, to oczywiście dadzą się one zapisać w postaci

i += 1 ;
j -= 1 ;

Można je jednak skrócić (i przyspieszyć) nawet bardziej. Dodawanie i odejmowanie jedynki są bowiem na tyle częstymi czynnościami, że dorobiły się własnych operatorów ++ i -- (tzw. inkrementacji i dekrementacji ), których używamy tak:

i++;
j--;

lub 2 tak:

++i;
--j;

Na pierwszy rzut oka wygląda to nieco dziwnie, ale gdy zaczniesz stosować tę technikę w praktyce, szybko docenisz jej wygodę.

1 A także dla niektórych innych rodzajów operatorów, które poznamy później

2 Istnieje różnica między tymi dwoma formami zapisu, ale na razie nie jest ona dla nas istotna. co nie znaczy, że nie będzie :)

Kurs C++
| | | |
Copyright © 2006-2013 egrafik.pl | Kontakt | Reklama | Projekty domów
jocker