Nauka c++ - co nas czeka?
Jednym z powodów uczenia się C++ jest chęć opanowania jego możliwości obiektowych. Jednak do tego potrzebne są podstawy języka C, gdyż z niego pochodzą typy podstawowe, operatory i duża część składni. Każdy poprawnie napisany program w C będzie jednocześnie poprawnym programem języka C++, czyli C jest podzbiorem C++. Bla Bla Blah
Tak, wiem że każdy z was chciałby po tygodniu robić własne Wiedźminy, jednak zanim zaczniemy tworzyć takie cuda musimy zająć się tym:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!";
return 0;
}
Niestety zanim przejdziemy do bardziej skomplikowanej magii musimy zrozumieć co właściwie dzieje się nieco powyżej.
#include
#include to dyrektywa preprocesora, a po polsku znaczy "zawierać", "io" to skrót od "input", "output", a stream to "strumień". Łącząc wszystko w jedną całość uzyskamy coś w rodzaju "załącz strumień wejścia i wyjścia" Oznacza to, że kiedy program zacznie się kompilować właśnie w tym miejscu pojawi się kod, który pozwoli komputerowi kontaktować się z użytkownikiem. Jeżeli wpiszemy coś do konsoli, komputr będzie mógł to odczytać (wejście) i zwrócić nam jakąś informację (wyjście). Przydatna biblioteka, prawda? Właśnie, to jest polecenie wczytujące bibliotekę, czyli zbiór poleceń. Dzięki temu my nie musimy pisać paruset linijek kodu. Oczywiście isnieje więcej bibliotek, nauczymy się nawet pisać włane.
using namespace std;
Using namespace std oznacza "używanie przestrzeni nazw std" Każde polecenie znajduje się w danej przestrzeni nazw. Po co i co to jest? Jeżeli programista1 chciałby napisać sobie polecenie "jakasfunkcja" i w tym samym momencie drugi programista zrobiłby inne o tej samej nazwie a oba wczytalibyśmy z bibliotek, program nie miałby pojęcia, o które polecenie nam chodzi. Dlatego powstały przestrzenie nazw. Od teraz możemy napisać:
programista1::jakasfunkcja programista2::jakasfunkcja
Dzięki temu program się nie pogubi. No dobrze, ale po co to using namespace? Jeżeli wiemy, że w namym programie nie będziemy używać dwóch jednakowych zestawów poleceń możemy ustawić jedną przestrzeń jako domyślną:
using namespace programista1;
I od teraz nie musimy pisać za każdym razem:
programista1::obliczpierwiastek programista1::superpolecenie programista1::funkcja3 programista1::siema
tylko możemy zrobić tak:
obliczpierwiastek superpolecenie funkcja3 siema
i program sam będzie wiedział jakiej przestrzeni używamy. Pomyślcie ile właśnie zaoszczędziliście czasu. Oczywiście w ogromnych projektach może to stanowić problem, dlatego możemy również ustawić przestrzeń tylko dla jednego polecenia z danej przestrzeni:
using std::cout; using std::endl; using std::cin;
Znamy już podstawy przestrzeni nazw. W takim razie jakie polecenia znajdują się w przestrzeni nazw ::std? (standard library) Te, których dzisiaj będziemy używać to cout, cin oraz endl.
Cout Cin Endl
cout (c out) to polecenie, za pomocą którego program może wyświetlić dane na naszym ekranie.
cout << "Hello World!"; Hello World! cout << "2+8"; 2+8 cout << 2+8; 10
Tak! W C++ możemy dodawać, odejmować, mnożyć, dzielić, używać nawiasów do wymuszania pierwszeństwa działania. Jeżeli chcielibyśmy użyć bardziej zaawansowanych form matematycznych takich jak pierwiastki czy logarytmy wystarczy wczytać bibliotekę math.h. Wszystko zawarte w cudzysłowiach jest uznawane za tekst. Teraz wprowadźmy zmienne. Zmienna to nic innego jak pojemnik na dane. Każda zmienna ma swój rodzaj: może to być tekst, liczba całkowita, liczba zmiennoprzecinkowa, znak. Jak możemy powiedzieć jakiego rodzaju jest zmienna? A oto mała tabelka do wkłucia:
Nazwa typu | Ilość Bajtów | Zakres wartości |
---|---|---|
bool | 1 | false lub true |
char | 1 | od -128 do 127 |
unsigned char | 1 | od 0 do 255 |
wchar_t | 2 | od 0 do 65'535 |
short | 2 | od -32'768 do 32'767 |
unsigned short | 2 | od 0 do 65'535 |
int | 4 | od -2'147'483'648 do 2'147'483'647 |
unsigned int | 4 | od 0 do 4'294'967'295 |
long | 4 | od -2'147'483'648 do 2'147'483'647 |
unsigned long | 4 | od 0 do 4'294'967'295 |
long long | 8 | od -9'223'372'036'854'775'808do 9'223'372'036'854'775'807 |
unsigned long long | 8 | od 0 do 18'446'744'073'709'551'615 |
float | 4 | 3.4E +/- 38 (7 cyfr) |
double | 8 | 1.7E +/- 308 (15 cyfr) |
long double | 8 | 1.7E +/- 308 (15 cyfr) |
Jak widzicie mamy parę typów zmiennych. Najbardziej podstawowe to:
int - liczba całkowia
float - liczba zmiennoprzecinkowa
char - znak
string - łańcuch znaków, czyli tekst
bool - prawda albo fałsz
Stwórzmy zmienną o nazwie liczba przechowującą liczbę całkowitą 230:
int liczba = 230;
Wyświetlijmy ją na ekranie za pomocą polecenia cout:
cout << liczba; 230
Zawartość zmiennej możemy w każdej chwili zmienić:
int liczba = 230; cout << liczba; 230 liczba = 20; cout << liczba; 20
Zauważcie, że tylko na samym początku dopisujemy int, ten proces nazywa się deklaracją zmiennej. Po zadeklarowaniu (stworzeniu i nadaniu wartości) zmiennej już nie będziemy mogli zmienić jej rodzaju.
cin (c in), to polecenie, za pomocą którego jesteśmy w stanie wprowadzić dane do środka programu.
int liczba = 0; cin >> liczba; to podaje użytkownik cout << liczba; to co wprowadził zostało zapisane i teraz jest wyświetlone
A teraz połączmy strumienie (tak, to co braliśmy na linuxie!) i dodajmy endl, czyli zakończenie linii (end line):
string imie = "";
cin >> imie; Kasia
cout << "Witaj " << imie << "." << endl << "Pierogi.";
Rezultat:
Witaj Kasia. Pierogi.
Podobny efekt możemy uzyskać za pomocą \n:
string imie = "";
cin >> imie; przyjmijmy, że wpisuje Kasia
cout << "Witaj " << imie << ".\nPierogi.";
Funkcja Main()
Funkcje to bardzo ważny i rozległy temat, dlatego dzisiaj dowiemy się tylko o co chodzi z tym main. Każdy program rozpoczyna swoje działanie od funkcji main(). W jej środku znajdują się wszystkie instrukcje. Return 0, czyli zwróć 0 mówi programowi żeby zakończył swoje działanie.
int main() { instrukcje return 0; }
Mechanika Tworzenia Programu
Załóżmy, że napisaliśmy ten kod. Jak mamy go uruchomić?
1. Za pomocą edytora tekstu piszemy program i zapisujemy go w pliku. Plik ten jest kodem źródłowym programu.
2. Kompilujemy kod źródłowy, czyli uruchamiamy program tłumaczący nasze wypociny na 0110001000001101010, czyli kod maszynowy (komputer w końcu może go zrozumieć). Taki kod nazywamy kodem wynikowym programu.
3. Konsoliduje się kod wynikowy z dodatkowymi zasobami. Na przykład z bibliotekami. Konsolidacja polega na łączeniu własnego kodu wynikowego z kodem wynikowym używanych funkcji (tych poleceń z bibliotek) oraz dodatkowym kodem startowym, który pozwala nasz program w ogóle uruchomić. Plik zawierający efekt końcowy to tak zwany kod wykonalny.
Dodatek
Wielu z was ma problem z pisaniem zmiennych w prawidłowym miejscu. Na razie każda zmienna powinna znajdować się w ciele funkcji, to znaczy między nawiasami { i }, w przeciwnym wypadku zostanie zmienną globalną czego byśmy sobie nie życzyli. Więcej o zmiennych globalnych dowiemy się podczas nauki o funkcjach. Na tę chwilę używajcie zmiennych lokalnych.
Zadania
1. Napisz program, który prosi użytkownika o wprowadzenie wieku, a następnie wyświetla wiek użytkownika podany w miesiącach.
2. Napisz program, który prosi użytkownika o podanie liczby godzin i minut, po czym wyświetla je w formie: "Czas: godzina:minuty". Przykład: "Czas: 23:56".
Niejednokrotnie powtarzałem, że materiały ówcześniej przerobione oraz przyswojone z gimnazjum pozwolą wam na wykonanie poniższych zadań, a jeżeli nie: i tu już pomi... krótki koleś z ciebie!