Strona 1
[lekcja] Operacje matematyczne | Kurs C++ » Poziom 1
2011-11-12 15:33:42
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Operacje-matematyczne/13
Darmowe kursy Online
»
Kurs C++
»
Poziom 1
Autor: Piotr Szawdyński
Operacje matematyczne
[lekcja]
Rozdział 10. Podstawowe operatory matematyczne, inkrementacjai dekrementacja oraz sposoby zapisywaniadziałań matematycznych.
Zanim przejdziemy do właściwej części rozdziału zastanówmy się przez chwilę czym jest komputer. Komputer w dzisiejszych czasach stał
się nieodłączną częścią życia każdego z nas. Z praktycznego punktu widzenia hasło to samo w sobie jest dla nas czymś w rodzaju słowa
kluczowego , pod którym kryje się system operacyjny, programy i gry. W rzeczywistości komputer jest jednak maszyną służącą do
obliczeń. Wszystkie aplikacje, które uruchamiamy na komputerze wykonują obliczenia. Nawet podczas pisania tekstu w notatniku
wykonywane są stale obliczenia, a skoro tak to C++ również powinien umożliwić nam liczenie i tak właśnie jest.
Operatory matematyczne
Operatorami matematycznymi nazywamy te znaki, które wykonują jakieś działanie matematyczne. W C++ są to: +, -, *, / i %.
Wszystkie operatory powinieneś znać ze szkoły oprócz ostatniego, tj. % dzięki któremu otrzymujemy resztę z dzielenia liczb całkowitych.
Kolejność wykonywaniadziałań
Kolejność wykonywania działań jest taka sama jak uczyłeś się w szkole podstawowej na matematyce. Najpierw mnożymy i dzielimy, a
następnie dodajemy i odejmujemy. Jeśli chcemy zmienić kolejność wykonywania operacji, musimy wykorzystać nawiasy zaokrąglone. Oto
przykład wykorzystujący powyższy fakt:
C/C++
#include <iostream>
int
main
()
{
std
::
cout
<<
"Obliczam: 3+2*4="
<<
3
+
2
*
4
<<
std
::
endl
;
std
::
cout
<<
"Obliczam: (3+2)*4="
<<(
3
+
2
) *
4
<<
std
::
endl
;
return
0
;
}
Wynik działania programu będzie wyglądał tak:
Obliczam: 3+2*4=11
Obliczam: (3+2)*4=20
Obliczeniaz wykorzystaniemzmiennych
Jeśli mamy potrzebę wykonać obliczenia na wartościach znajdujących się w zmiennych, możemy również to robić. Wykonuje się to w taki
sam sposób, jakby to była liczba. Tłumaczenie tutaj na niewiele się zda, więc przejdźmy do przykładu:
C/C++
#include <iostream>
int
main
()
{
std
::
cout
<<
"Podaj liczbe: "
;
int
zmienna
;
std
::
cin
>>
zmienna
;
std
::
cout
<<
"Obliczam: 3+zmienna*4="
<<
3
+
zmienna
*
4
<<
std
::
endl
;
std
::
cout
<<
"Obliczam: (3+zmienna)*4="
<<(
3
+
zmienna
) *
4
<<
std
::
endl
;
return
0
;
}
Wynik działania programu:
Podaj liczbe: 10
Obliczam: 3+zmienna*4=43
Obliczam: (3+zmienna)*4=52
Zapisywanieobliczeń do zmiennych
Obliczenia, które wykonujemy można zapisywać również do zmiennych. Wykorzystuje się do tego celu operator przypisania, który
poznałeś już w jednym ze wcześniejszych rozdziałów. Przytoczmy jednak przykład demonstrujący jego użycie:
C/C++
#include <iostream>
int
main
()
Strona 2
[lekcja] Operacje matematyczne | Kurs C++ » Poziom 1
2011-11-12 15:33:42
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Operacje-matematyczne/13
{
std
::
cout
<<
"Podaj liczbe: "
;
int
zmienna
;
std
::
cin
>>
zmienna
;
int
wynik1
=
3
+
zmienna
*
4
;
int
wynik2
=(
3
+
zmienna
) *
4
;
std
::
cout
<<
"Wynik pierwszy: "
<<
wynik1
<<
std
::
endl
;
std
::
cout
<<
"Wynik drugi: "
<<
wynik2
<<
std
::
endl
;
return
0
;
}
Wynik działania powyższego programu:
Podaj liczbe: 7
Wynik pierwszy: 31
Wynik drugi: 40
Pamiętajmyo konsekwencjachdzielenia
Wykonując różne operacje matematyczne, najgroźniejszą operacją dla naszego programu jest dzielenie. Może ona bowiem spowodować
zamknięcie krytyczne aplikacji. Pamiętajmy jednak, że samo z siebie nic nie przestanie działać. W matematyce nie można jednak dzielić
przez zero i właśnie ta wartość w mianowniku jest niepożądana. Na chwilę obecną miej świadomość, że taki problem istnieje. W jednym
z późniejszych rozdziałów dowiesz się jak temu się zapobiega.
Warto też tutaj wspomnieć, że to samo dotyczy obliczania reszty z dzielenia i program również odmówi nam posłuszeństwa w przypadku,
gdy wartość po znaku % będzie równa 0.
Reszta z dzielenia, a liczby rzeczywiste
Załóżmy, że napiszemy program, który będzie miał pokazywać resztę z dzielenia dwóch liczb. Program ten będzie wyglądał następująco:
C/C++
#include <iostream>
int
main
(
void
)
{
double
a
;
std
::
cout
<<
"Podaj a: "
;
std
::
cin
>>
a
;
double
b
;
std
::
cout
<<
"Podaj b: "
;
std
::
cin
>>
b
;
std
::
cout
<<
"a % b = "
<<
a
%
b
<<
std
::
endl
;
return
0
;
}
Próba kompilacji tego programu się nie powiedzie i otrzymamy następujący błąd:
error: invalid operands of types 'double' and 'double' to binary 'operator%'
Błąd ten wynika z faktu, że operację modulo możemy wykonywać tylko i wyłącznie na liczbach całkowitych. Naprawienie tego programu
wymaga albo zmiany typów zmiennych z liczb rzeczywistych na całkowite albo wykonania rzutowania typów, którego jeszcze nie znasz.
Poprawnie napisany program będzie więc wyglądał następująco:
C/C++
#include <iostream>
int
main
(
void
)
{
int
a
;
std
::
cout
<<
"Podaj a: "
;
std
::
cin
>>
a
;
int
b
;
std
::
cout
<<
"Podaj b: "
;
std
::
cin
>>
b
;
std
::
cout
<<
"a % b = "
<<
a
%
b
<<
std
::
endl
;
return
0
;
}
Jak poprawić czytelnośćkodu
Ponieważ operacje arytmetyczne są działaniami, które najczęściej są używane w programie, na przestrzeni wielu lat powstało kilka
ułatwień do wykonywania operacji matematycznych. Pierwszym z nich jest wykonywanie działań już na obecnej wartości zmiennej.
Strona 3
[lekcja] Operacje matematyczne | Kurs C++ » Poziom 1
2011-11-12 15:33:42
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Operacje-matematyczne/13
Załóżmy, że mamy zmienną x, której wartość początkowa wynosi 5. Następnie chcemy, aby w tej samej zmiennej znalazła się nowa
wartość, np. 2 razy większa. Mając wiedzę obecną mogli byśmy zrobić to np. tak:
C/C++
int
x
=
5
;
int
tmp
=
x
*
2
;
//x*2 = 10
x
=
tmp
;
//tmp = 10, wi
ę
c x = 10
Oczywiście to samo, można zapisać bez tworzenia dodatkowej zmiennej, czyli:
C/C++
int
x
=
5
;
x
=
x
*
2
;
//x*2 = 10, nast
ę
pnie przypisz obliczon
ą
warto
ść
, czyli x = 10
To co zostało wyżej napisane powinieneś już wiedzieć i potrafić zrobić samodzielnie. Nowy, krótszy zapis zamieszczam poniżej:
C/C++
int
x
=
5
;
x
*=
2
;
//pomno
ż
enie obecnej warto
ś
ci zmiennej razy 2.
Operatory skróconych operacji istnieją również do pozostałych działań arytmetycznych. Ich zestawienie zamieszczam w poniższej tabeli.
Operacja
Zapis tradycyjny Zapis skrócony
dodawanie
x = x + y;
x += y;
odejmowanie
x = x - y;
x -= y;
mnożenie
x = x * y;
x *= y;
dzielenie
x = x / y;
x /= y;
reszta z dzielenia x = x % y;
x %= y;
Inkrementacjai dekrementacja
Jeśli nie miałeś nigdy wcześniej styczności z programowaniem to prawdopodobnie hasła inkrementacja jak i dekrementacja nic Ci nie
mówią. Opis pojęć przedstawiam w poniższej tabeli:
Pojęcie
Opis
Przykład
inkrementacja zwiększenie wartości zmiennej o jeden zmienna += 1;
dekrementacja zmniejszenie wartości zmiennej o jeden zmienna -= 1;
Pomimo, iż skrócony zapis jest wygodnym rozwiązaniem na zwiększenie , bądź zmniejszenie wartości o jeden, to do wykonania tych
operacji istnieją dodatkowe zapisy i są to:
Pojęcie
Przykład
Odpowiednik
preinkrementacja
++zmienna; zmienna += 1;
postinkrementacja zmienna++; zmienna += 1;
predekrementacja
--zmienna;
zmienna -= 1;
postdekrementacja zmienna--;
zmienna -= 1;
Rozpatrzmy teraz jakie mamy możliwości inkrementacji:
C/C++
++
zmienna
;
zmienna
++
;
zmienna
+=
1
;
Na dzień dzisiejszy możesz przyjąć, że powyższe zapisy są równoważne, tj. wykonają dokładnie to samo, czyli zwiększą wartość
zmiennej o 1. W rzeczywistości istnieją jednak różnice w działaniu między poszczególnymi zapisami. Na chwilę obecną uważam jednak,
że wiedza tak szczegółowa nie jest Ci potrzebna i nie powinieneś dostawać informacji ponad niezbędne minimum. Priorytetem jest
bowiem zrozumienie podstaw programowania, a nie znajomość wszystkich detali języka, których można się douczyć w każdej chwili.
Podsumowanierozdziału
Podsumujmy teraz przedstawioną wiedzę w rozdziale w postaci następującego kodu źródłowego:
C/C++
#include <iostream>
int
main
()
{
double
liczba
=
123.3
;
std
::
cout
<<
"liczba = "
<<
liczba
<<
std
::
endl
;
liczba
=
liczba
+
6.7
;
std
::
cout
<<
"liczba = "
<<
liczba
<<
std
::
endl
;
liczba
-=
30
;
std
::
cout
<<
"liczba = "
<<
liczba
<<
std
::
endl
;
liczba
/=
11
;
Strona 4
[lekcja] Operacje matematyczne | Kurs C++ » Poziom 1
2011-11-12 15:33:42
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Operacje-matematyczne/13
std
::
cout
<<
"liczba = "
<<
liczba
<<
std
::
endl
;
liczba
*=
3
;
std
::
cout
<<
"liczba = "
<<
liczba
<<
std
::
endl
;
int
nowa
=
liczba
;
std
::
cout
<<
"nowa = "
<<
nowa
<<
std
::
endl
;
nowa
%=
8
;
std
::
cout
<<
"nowa = "
<<
nowa
<<
std
::
endl
;
nowa
++
;
std
::
cout
<<
"nowa = "
<<
nowa
<<
std
::
endl
;
++
nowa
;
std
::
cout
<<
"nowa = "
<<
nowa
<<
std
::
endl
;
nowa
*=
10
;
std
::
cout
<<
"nowa = "
<<
nowa
<<
std
::
endl
;
--
nowa
;
std
::
cout
<<
"nowa = "
<<
nowa
<<
std
::
endl
;
nowa
--
;
std
::
cout
<<
"nowa = "
<<
nowa
<<
std
::
endl
;
return
0
;
}
Po uruchomieniu powyższego programu w konsoli ujrzymy następującą treść:
liczba = 123.3
liczba = 130
liczba = 100
liczba = 9.09091
liczba = 27.2727
nowa = 27
nowa = 3
nowa = 4
nowa = 5
nowa = 50
nowa = 49
nowa = 48
Zadanie domowe
Liczby całkowite
Napisz program, który wczyta dwie liczby całkowite a i b, a następnie wykona na nich obliczenia. Efekt działania programu powinien być
następujący:
Podaj a: 5
Podaj b: 4
a + b = 9
a - b = 1
a * b = 20
a / b = 1
a % b = 1
Liczby rzeczywiste
Napisz program, który wczyta dwie liczby rzeczywiste i wykona na nich obliczenia. Efekt programu powinien być analogiczny jak w
pierwszym zadaniu czyli:
Podaj a: 5
Podaj b: 4
a + b = 9
a - b = 1
a * b = 20
a / b = 1.25
Eksperymenty
Sprawdź jak zachowają się oba programy gdy:
a lub b jest ujemne
b = 0
W przypadku pierwszym zwróć szczególną uwagę na resztę z dzielenia.
Wszystkieteksty są chronioneprawami autorskimi. Kopiowanielub rozpowszechnianietreści poza niniejszymserwisem jest
zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechnianiawłasnego tekstu wedle własnego uznania.
Strona 5
[lekcja] Operacje matematyczne | Kurs C++ » Poziom 1
2011-11-12 15:33:42
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Operacje-matematyczne/13
Architektserwisu: Piotr Szawdyński
© Wszelkieprawa zastrzeżone2005-2011