PODSTAWY WEJŚCIA/WYJŚCIA, ZMIENNE I OPERACJE NA NICH
5.1. Podstawowe operacje na zmiennych
Wiemy już co to są zmienne - teraz zajmiemy się ich praktycznym wykorzystaniem. Zacznijmy od
prostego przykładu.
#include <iostream>
#include <conio.h>
using
namespace
std;
int
main()
{
int
a;
int
b;
cout<<
"Podaj pierwsza liczbe: "
;
cin>>a;
cout<<
"Podaj druga liczbe: "
;
cin>>b;
cout<<
"liczba a: "
<<a<<endl;
cout<<
"liczba b: "
<<b<<endl;
cout<<
"Suma a+b wynosi: "
<<a+b<<endl;
cout<<
"Roznica a-b wynosi: "
<<a-b<<endl;
cout<<
"Roznica b-a wynosi: "
<<b-a<<endl;
cout<<
"Iloczyn a*b: "
<<a*b<<endl;
cout<<
"Wynik rownania ((a+b)*b+a)*a wynosi: "
<<((a+b)*b+a)*a<<endl;
cout<<
"Calkowity wynik z dzielenia a/b wynosi: "
<<a/b<<endl;
cout<<
"Reszta z dzielenia a/b wynosi: "
<<a%b<<endl;
cout<<"
Calkowity wynik z dzielenia b/a wynosi: "
<<b/a<<endl;
getch();
return
(0);
}
Program ten pokazuje nam podstawowe operacje matematyczne, jakie możemy wykonywać na
zmiennych. W C++ obowiązują takie same zasady wykonywania działań na liczbach jak w matematyce.
Najpierw mnożymy (dzielimy), później dodajemy (odejmujemy). Jeśli chcemy, aby działania wykonały się
w innej kolejności, korzystamy z okrągłych nawiasów. Operację dodawania symbolizuje
+
operację
odejmowania
-
, operację mnożenia
*
, operację dzielenia
/
, a operację reszty z dzielenia
%
.
5.2. Jak poprawiać czytelność programu
Ponieważ operacje arytmetyczne są instrukcjami, które najczęściej są pisane, na przestrzeni wielu lat
powstało sporo ułatwień do wykonywania operacji matematycznych. Kolejny przykład prezentuje ich
zapis i działanie.
#include <iostream>
#include <conio.h>
using
namespace
std;
int
main()
{
int
a;
cout<<
"Podaj liczbe: "
;
cin>>a;
cout<<
"liczba a: "
<<a<<endl;
a=a+10;
// dodaj do siebie: (a+10) i przypisz otrzymany wynik do zmiennej (a)
cout<<
"liczba a: "
<<a<<endl;
a+=15;
// do aktualnej warto
ś
ci zapisanej w zmiennej o nazwie 'a' dodaj
warto
ść
15
cout<<
"liczba a: "
<<a<<endl;
a++;
//Inkrementacja warto
ś
ci o 1 (post inkrementacja)
cout<<
"liczba a: "
<<a<<endl;
++a;
//Inkrementacja warto
ś
ci o 1 (pre inkrementacja)
cout<<
"liczba a: "
<<a<<endl;
int
b;
cout<<
"Podaj liczbe: "
;
cin>>b;
cout<<
"liczba b: "
<<b<<endl;
b=b-9;
cout<<
"liczba b: "
<<b<<endl;
b-=8;
cout<<
"liczba b: "
<<b<<endl;
b--;
cout<<
"liczba b: "
<<b<<endl;
--b;
cout<<
"liczba b: "
<<b<<endl;
int
c;
c=a+b;
cout<<endl<<
"liczba c: "
<<c<<endl;
int
d,e,f;
//deklaracja kilku zmiennych naraz
cout<<
"Podaj liczbe d: "
;
cin>>d;
cout<<
"Podaj liczbe e: "
;
cin>>e;
cout<<
"Podaj liczbe f: "
;
cin>>f;
d*=5;
//aktualn
ą
warto
ść
zmiennej mno
ż
y razy 5;
e/=2;
//aktualn
ą
warto
ść
zmiennej dzieli przez 2;
f%=3;
//liczy reszt
ę
z dzielenia aktualnej warto
ś
ci w zmiennej modulo 3;
cout<<
"liczba d: "
<<d<<endl;
cout<<
"liczba e: "
<<e<<endl;
cout<<
"liczba f: "
<<f<<endl;
getch();
return
(0);
}
Pojęcia:
•
Inkrementacja - zwiększenie wartości zmiennej o jeden;
•
Dekrementacja - zmniejszenie wartości o jeden;
W podanym przykładzie łatwo można zauważyć, że polecenie
a++;
jest równoważne
a+=1;
jak
również
a=a+1;
i
++a;
. Każdy z tych zapisów jest wygodny ze względu na swoją długość. Jednak jeśli nasza
zmienna zmieni swoją nazwę na np.
int bardzo_niewygodna_nazwa;
to inkrementacja wartości zmiennej o
1 będzie niezbyt wygodna korzystając np. z tej instrukcji przypisania:
bardzo_niewygodna_nazwa=
bardzo_niewygodna_nazwa+1;
. W takim wypadku warto korzystać z krótszych zapisów, chociażby po to,
żeby oszczędzić i tak już wytarte klawisze na klawiaturze. Co więcej, powinieneś dbać o estetykę swojego
kodu. Na pewno zgrabniej będzie wyglądała krótka i treściwa wiadomość, niż wiersz na pół ekranu.
5.3. Wczytywanie danych do zmiennych
Za pomocą polecenia (strumienia)
cin>>
, wczytujemy dane do zmiennej. Poleceniem tym będziemy
wczytywali zmienne każdego typu prostego (czyli np. unsigned int, char). To oczywiście nie jedyny sposób
na wczytywania danych do zmiennych. Do innych rozwiązań dojdziemy w swoim czasie.
5.4. Praca domowa
1.
Napisz program, który poprosi o podanie wieku dla poszczególnych osób w twojej rodzinie.
Następnie wyliczy różnice lat miedzy poszczególnymi członkami rodziny.
Przykładowe wyświetlenie:
Podaj swój wiek: 17
Podaj wiek siostry: 15
Podaj wiek brata: 13
Podaj wiek mamy: 44
Podaj wiek taty: 48
Podaj wiek babci: 69
Podaj wiek dzidka:72
Ja mam – 13 lat.
Moja mama ma 40 lat a tata 45 lat.
Mój tato jest starszy od mamy …. lat.
Ja jestem starszy od siostry o …. lat.
Siostra jest starsza od ……….. lat
Itp.
2.
Napisz program który będzie zamieniał minuty na godz.
Np.
Podaj ilo
ść
min.: 30
30 min. to 0,5 godz.
Obsługa strumienia wyjściowego
Zapoznanie się z obsługą standardowego wyjścia za pomocą funkcji printf oraz strumienia std::cout.
W niniejszym rozdziale b
ę
dziemy zajmowa
ć
si
ę
wy
ś
wietlaniem danych. Jak
ju
ż
zapewne wiesz j
ę
zyk C++ jest potomkiem j
ę
zyka C. W zwi
ą
zku z tym do
istniej
ą
cych komponentów C zostały dodane ich odpowiedniki w stylu C++. W celu
zachowania wstecznej zgodno
ś
ci, tj. z j
ę
zykiem C - stare komponenty zostały
zachowane i równie
ż
mo
ż
na z nich korzysta
ć
w C++. W konsekwencji mamy do
dyspozycji dwa mechanizmy do wypisywania danych na standardowe wyj
ś
cie, które w
naszym wypadku jest konsol
ą
. W niniejszym rozdziale wymienimy te dwie stosowane
techniki, jednak szerzej zostanie omówiona metoda prostsza w u
ż
yciu, nale
żą
ca
do j
ę
zyka C++.
Funkcja printf
Funkcj
ę
printf
mieli
ś
my okazj
ę
zobaczy
ć
w działaniu ju
ż
kilkukrotnie. W tym
rozdziale poznamy j
ą
troch
ę
lepiej, jednak to b
ę
dzie ostatni rozdział
po
ś
wi
ę
cony tej funkcji w podstawowej cz
ęś
ci kursu. Funkcja ta wywodzi si
ę
bowiem z j
ę
zyka C i nie jest zbyt przyjemna w u
ż
yciu dla pocz
ą
tkuj
ą
cego
programisty. Przejd
ź
my teraz do wcze
ś
niej omawianego przykładu:
#include <cstdio>
int
main
()
{
printf
(
"Test dzialania Code::Blocks"
)
;
return
0
;
}
Powy
ż
szy wiersz jakby si
ę
mogło wydawa
ć
na pierwszy rzut oka jest oczywisty i
efekt działania powy
ż
szego programu jest łatwo przewidywalny. Jak ju
ż
pisałem w
jednym ze wcze
ś
niejszych rozdziałów powy
ż
szy wiersz wy
ś
wietli komunikat:
Test dzialania Code::Blocks
Funkcja
printf
mo
ż
e
przyjmowa
ć
jednak
wi
ę
cej
ni
ż
jeden
argument,
co
przedstawiam w poni
ż
szym przykładzie:
#include <cstdio>
int
main
()
{
printf
(
"Czy %d jest wieksze od %s?"
,
3
+
4
,
"siedem"
)
;
return
0
;
}
O ile pierwszy wariant wywołania był oczywisty tak tutaj już tak nie jest. Pojawiają się bowiem tajemnicze
argumenty, które nie wiadomo jak zadziałają w programie. Warto jednak najpierw wtrącić słowo co to jest
argument
. Argumentem nazywamy wartość przekazywaną do funkcji. Kolejne argumenty są rozdzielone
przecinkami.
Innymi słowy funkcja
printf
przyjęła trzy argumenty. Pierwszym z nich jest tekst "Czy %d jest
wieksze od %s?"
, drugim działanie arytmetyczne 3+4 i trzecim znowu tekst o treści "siedem".
Pytanie jakie tu należy zasadniczo zadać to co wyświetli wyżej wspomniane wywołanie funkcji i dlaczego.
Po uruchomieniu tego programu ujrzymy następującą treść:
Czy 7 jest wieksze od siedem?
Porównując wywołanie funkcji z treścią którą otrzymaliśmy można łatwo zauważyć, że zamiast zapisu %d
pokazała się nam liczba 7, natomiast w miejscu %s ukazał się napis siedem. Pierwszy argument funkcji
printf
w rzeczywistości służy do formatowania wyjścia, tj. sposobu prezentacji danych. Znak % jest
znakiem specjalnym, po którym następuje określenie sposobu prezentacji kolejnych argumentów funkcji
printf
. Zapis %d informuje, że argumentem będzie liczba całkowita, natomiast %s mówi funkcji, że będzie
to łańcuch znaków. Funkcja
printf
jest znacznie bardziej rozbudowana niż te dwa podstawowe typy. Nie
będziemy się jednak w nią zagłębiać ze względu na to, iż będziemy wykorzystywali inne i znacznie
prostsze narzędzie do wypisywania danych.
Strumień wyjścia std::cout
Pomimo, i
ż
znamy ju
ż
powierzchownie jedn
ą
technik
ę
wypisywania ró
ż
nych danych
na ekranie - pora pozna
ć
inn
ą
, któr
ą
znacznie bardziej docenisz w toku nauki
programowania. Jest ni
ą
u
ż
ycie strumienia std::cout. Na pocz
ą
tek przytocz
ę
program, który ju
ż
widzieli
ś
my wcze
ś
niej z t
ą
ró
ż
nic
ą
,
ż
e b
ę
dzie on napisany w
C++. Oto on:
C/C++
#include <iostream>
int
main
()
{
std
::
cout
<<
"Test dzialania Code::Blocks"
;
return
0
;
}
Powy
ż
szy
program
wypisze
dokładnie
to,
co
jest
zawarte
w
podwójnych
apostrofach. Zapis std::cout powoduje skierowanie danych na standardowy
strumie
ń
wyj
ś
ciowy tak samo jak to robiła funkcja
printf
. W programie tym
wyst
ę
puj
ą
równie
ż
znaki <<, które nazywamy operatorem. Za pomoc
ą
operatora <<
'wskazujemy'
dane,
które
maj
ą
zosta
ć
przekazane
do
strumienia.
Pierwszy przykład jest na tyle oczywisty,
ż
e nie wymaga on dalszych wywodów,
tak wi
ę
c przejd
ź
my do kolejnego programu.
#include <iostream>
int
main
()
{
std
::
cout
<<
"Czy "
;
std
::
cout
<<
3
+
4
;
//drugi argument w printf
std
::
cout
<<
" jest wieksze od "
;
std
::
cout
<<
"siedem"
;
//trzeci argument w printf
return
0
;
}
Powy
ż
szy kod realizuje dokładnie to samo, co wcze
ś
niej przedstawiony program,
u
ż
ywaj
ą
cy
printf
(nie trzeba chyba wskazywa
ć
o który kod konkretnie chodzi).
Jak wida
ć
wiersze w których wyst
ę
puj
ą
komentarze zawieraj
ą
te same dane, które
były przekazane za pomoc
ą
drugiego i trzeciego argumentu funkcji
printf
.
Istotn
ą
ró
ż
nic
ą
jest jednak brak %d oraz brak %s. Fakt ten powinien mie
ć
dla
Ciebie istotne zaczenie - mniej musisz pami
ę
ta
ć
by otrzyma
ć
ten sam efekt.
Powy
ż
szy fakt jest głównym powodem dlaczego b
ę
dziemy korzystali ze strumienia
wyj
ś
ciowego std::cout. Zanim zaczniesz narzeka
ć
na to,
ż
e zapis jest du
ż
o
dłu
ż
szy - miej
ś
wiadomo
ść
tego,
ż
e j
ę
zyk C++ oferuje kilkana
ś
cie typów
podstawowych, np. liczba całkowita krótka 16-bitowa, zwykła 32-bitowa i długa
64-bitowa. Ka
ż
da z wcze
ś
niej wymienionych liczb mo
ż
e by
ć
ze znakiem lub bez. Do
tego dochodz
ą
znaki, liczby zmiennoprzecinkowe, warto
ś
ci logiczne, wsa
ź
niki i
by
ć
mo
ż
e jeszcze inne podstawowe typy, które w chwili obecnej pomin
ą
łem. Dla
ka
ż
dego wy
ż
ej wymienionego typu zapis w funkcji
printf
wyst
ę
puj
ą
cy po % b
ę
dzie
wygl
ą
dał inaczej, natomiast w przypadku u
ż
ycia mechanizmu C++ kompilator 'wie'
co z danym typem zrobi
ć
. Na deser warto jeszcze przedstawi
ć
jak mo
ż
na zapisa
ć
ten sam kod krócej.
#include <iostream>
int
main
()
{
std
::
cout
<<
"Czy "
<<
3
+
4
<<
" jest wieksze od "
<<
"siedem"
;
return
0
;
}
Jak wida
ć
strumie
ń
std::cout jest znacznie wygodniejszym narz
ę
dziem w r
ę
kach
pocz
ą
tkowego programisty.
Znaki specjalne
Zanim przejdziemy do nast
ę
pnego rozdziału dobrze b
ę
dzie zapozna
ć
si
ę
jeszcze ze
znakami specjalnymi, jakie mo
ż
na wstawi
ć
we wypisywanym tek
ś
cie. Do najcz
ęś
ciej
u
ż
ywanych znaków nale
żą
: tabulacja, przej
ś
cie do nowego wiersza, backslash i
podwójny apostrof. Aby wy
ś
wietli
ć
znaki specjalne w tre
ś
ci nale
ż
y je poprzedzi
ć
backslashem (\ ). Poni
ż
sza tabelka przedstawia tylko te najcz
ęś
ciej u
ż
ywane:
Opis
Język C Język C++
przejście do nowego wiersza \n
std::endl
tabulacja
\t
(brak - patrz zapis języka C)
backslash
\\
(brak - patrz zapis języka C)
Na koniec krótki przykład wykorzystujący powyższe znaki specjalne:
#include <iostream>
#include <cstdio>
int
main
()
{
std
::
cout
<<
"\t tekst \"C:\\Hej\\ho.txt.\""
<<
std
::
endl
;
printf
(
"Uczymy sie \" pisac \t tekst C:\\Hej\\ho.txt. w stylu C\n"
)
;
printf
(
"\n\na tu konczymy zabawe"
)
;
std
::
cout
<<
std
::
endl
<<
std
::
endl
<<
"zrob sobie przerwe :)"
<<
std
::
endl
;
return
0
;
}
Po uruchomieniu zobaczymy na ekranie następującą treść:
tekst "C:\Hej\ho.txt."
Uczymy sie " pisac tekst C:\Hej\ho.txt. w stylu C
a tu konczymy zabawe
zrob sobie przerwe :)
Praca domowa
Napisz program, który wyświetli na ekranie:
==============
= To proste! =
==============
A jak to zrobic?
Koniec :)