Hello World!

Dużo teorii.

Posted by Mrozo on January 31, 2015

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 typuIlość
Bajtów
Zakres wartości
bool1false lub true
char1od -128 do 127
unsigned char1od 0 do 255
wchar_t2od 0 do 65'535
short2od -32'768 do 32'767
unsigned short2od 0 do 65'535
int4od -2'147'483'648 do 2'147'483'647
unsigned int4od 0 do 4'294'967'295
long4od -2'147'483'648 do 2'147'483'647
unsigned long4od 0 do 4'294'967'295
long long8od -9'223'372'036'854'775'808do 9'223'372'036'854'775'807
unsigned long long8od 0 do 18'446'744'073'709'551'615
float43.4E +/- 38 (7 cyfr)
double81.7E +/- 308 (15 cyfr)
long double81.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!