Gratulacje, kretor Mój egrafik został zakończony. Jeżeli rejestrowałeś się w tym kreatorze, pamiętaj aby kliknąć w link potwierdzający, wysłany na Twój adres email. Jeżeli tego nie zrobisz, nie będziesz mógł się zalogować, a dodane przez Ciebie wpisy nie zostaną opublikowane.
Umiemy już wypisywać tekst w konsoli i tworzyć własne funkcje. Niestety, nasze programy są na razie zupełnie bierne, jeżeli chodzi o kontakt z użytkownikiem. Nie ma on przy nich nic do roboty oprócz przeczytania komunikatu i wciśnięcia dowolnego klawisza.
Najwyższy czas to zmienić. Napiszmy więc program, który będzie porozumiewał się z użytkownikiem. Może on wyglądać na przykład tak:
Po kompilacji i uruchomieniu widać już wyraźny postęp w dziedzinie form komunikacji :) Nasza aplikacja oczekuje na wpisanie imienia użytkownika i potwierdzenie klawiszem ENTER, a następnie chwali się dopiero co zdobytą informacją.
Patrząc w kod programu widzimy kilka nowych elementów, zatem nie będzie niespodzianką, jeżeli teraz przystąpię do ich omawiania :D
Zmienne i ich typy
Na początek zauważmy, że program pobiera od nas pewne dane i wykonuje na nich operacje. Są to działania dość trywialne (jak wyświetlenie rzeczonych danych w niezmienionej postaci), jednak wymagają przechowania przez jakiś czas uzyskanej porcji informacji.
W językach programowania służą do tego zmienne.
Zmienna (ang. variable ) to miejsce w pamięci operacyjnej, przechowujące pojedynczą wartość określonego typu. Każda zmienna ma nazwę, dzięki której można się do niej odwoływać.
Przed pierwszym użyciem zmienną należy zadeklarować , czyli po prostu poinformować kompilator, że pod taką a taką nazwą kryje się zmienna danego typu. Może to wyglądać choćby tak:
std::string strImie;
W ten sposób zadeklarowaliśmy w naszym programie zmienną typu std::string o nazwie strImie . W deklaracji piszemy więc najpierw typ zmiennej, a potem jej nazwę.
Nazwa zmiennej może zawierać liczby, litery oraz znak podkreślenia w dowolnej kolejności. Nie można jedynie zaczynać jej od liczby. W nazwie zmiennej nie jest także dozwolony znak spacji.
Zasady te dotyczą wszystkich nazw w C++ i, jak sądzę, nie szczególnie trudne do przestrzegania.
Z brakiem spacji można sobie poradzić używając w jej miejsce podkreślenia ( jakas_zmienna ) lub rozpoczynać każdy wyraz z wielkiej litery ( JakasZmienna ).
W jednej linijce możemy ponadto zadeklarować kilka zmiennych, oddzielając ich nazwy przecinkami. Wszystkie będą wtedy przynależne do tego samego typu.
Typ określa nam rodzaj informacji, jakie można przechowywać w naszej zmiennej. Mogą to być liczby całkowite, rzeczywiste, tekst (czyli łańcuchy znaków, ang. strings ), i tak dalej. Możemy także sami tworzyć własne typy zmiennych, czym zresztą niedługo się zajmiemy. Na razie jednak powinniśmy zapoznać się z dość szerokim wachlarzem typów standardowych, które to obrazuje niniejsza tabelka:
nazwa typu
opis
int
liczba całkowita (dodatnia lub ujemna)
float
liczba rzeczywista (z częścią ułamkową)
bool
wartość logiczna (prawda lub fałsz)
char
pojedynczy znak
std::string
łańcuch znaków (tekst)
Tabela 1. Podstawowe typy zmiennych w C++
Używając tych typów możemy zadeklarować takie zmienne jak:
int nLiczba; // liczba całkowita, np. 45 czy 12 + 89
float fLiczba; // liczba rzeczywista (1.4, 3.14, 1.0e-8 itp.)
std::string strNapis; // dowolny tekst
Być może zauważyłeś, że na początku każdej nazwy widnieje tu przedrostek, np. str czy n . Jest to tak zwana notacja węgierska; pozwala ona m.in. rozróżnić typ zmiennej na podstawie nazwy. Zapis ten stał się bardzo popularny, szczególnie wśród programistów języka C++ - spora ich część uważa, że znacznie poprawia on czytelność kodu.
Szerszy opis notacji węgierskiej możesz znaleźć w Dodatku A.
Strumień wejścia
Cóż by nam jednak było po zmiennych, jeśli nie mieliśmy skąd wziąć dla nich danych?.
Prostych sposobem uzyskania ich jest prośba do użytkownika o wpisanie odpowiednich informacji z klawiatury. Tak też czynimy w aktualnie analizowanym programie - odpowiada za to kod:
std::cin >> strImie;
Wygląda on podobnie do tego, który jest odpowiedzialny za wypisywanie tekstu w konsoli. Wykonuje jednak czynność dokładnie odwrotną: pozwala na wprowadzenie sekwencji znaków i zapisuje ją do zmiennej strImie .
std::cin symbolizuje strumień wejścia , który zadaniem jest właśnie pobieranie wpisanego przez użytkownika tekstu. Następnie kieruje go (co obrazują "strzałki" >> ) do wskazanej przez nas zmiennej.
Zauważmy, że w naszej aplikacji kursor pojawia się w tej samej linijce, co komunikat "Podaj swoje imię". Nietrudno domyśleć się, dlaczego - nie umieściliśmy po nim std::endl , wobec czego nie jest wykonywane przejście do następnego wiersza. Jednocześnie znaczy to, iż strumień wejścia zawsze pokazuje kursor tam, gdzie skończyliśmy pisanie - warto o tym pamiętać.
***
Strumienie wejścia i wyjścia stanowią razem nierozłączną parę mechanizmów, które umożliwiają nam pełną swobodę komunikacji z użytkownikiem w aplikacjach konsolowych.
Schemat 3. Komunikacja między programem konsolowym i użytkownikiem
Stałe
Stałe są w swoim przeznaczeniu bardzo podobne do zmiennych - tyle tylko że są. niezmienne :)) Używamy ich, aby nadać znaczące nazwy jakimś niezmieniającym się wartościom w programie.
Stała to niezmienna wartość, której nadano nazwę celem łatwego jej odróżnienia od innych, często podobnych wartości, w kodzie programu.
Jej deklaracja, na przykład taka:
const int STALA = 10 ;
przypomina nieco sposób deklarowania zmiennych - należy także podać typ oraz nazwę. Słówko const (ang. constant - stała) mówi jednak kompilatorowi, że ma do czynienia ze stałą, dlatego oczekuje również podania jej wartości. Wpisujemy ją po znaku równości = .
W większości przypadków stałych używamy do identyfikowania liczb - zazwyczaj takich, które występują w kodzie wiele razy i mają po kilka znaczeń w zależności od kontekstu. Pozwala to uniknąć pomyłek i poprawia czytelność programu.
Stałe mają też tę zaletę, że ich wartości możemy określać za pomocą innych stałych, na przykład:
const int NETTO = 2000 ;
const int PODATEK = 22 ;
const int BRUTTO = NETTO + NETTO * PODATEK / 100 ;
Jeżeli kiedyś zmieni się jedna z tych wartości, to będziemy musieli dokonać zmiany tylko w jednym miejscu kodu - bez względu na to, ile razy użyliśmy danej stałej w naszym programie. I to jest piękne :)
Inne przykłady stałych:
const int DNI_W_TYGODNIU = 7 ; // :-)
const float PI = 3.141592653589793 ; // w końcu to też stała!
const int MAX_POZIOM = 50 ; // np. w grze RPG