Podstawy języka C++

Kompilacja

Kompilacja to przetworzenie tekstowego kodu programu do postaci binarnej wykonywalnej przez procesor.

Na tym etapie sprawdzana jest poprawność składni całego programu. Jeśli w jakimś miejscu brakuje przecinka, jest literówka, zastosowano instrukcję w niewłaściwy sposób lub np. mylnie wykonano operację arytmetyczną dla zmiennej, w której są litery, to każda taka sytuacja zostanie wychwycona przez kompilator przed uruchomieniem. Dzięki temu błąd można naprawić, zanim wykonanie programu doszłoby do linii, w której występuje. Oczywiście, nie należy przeceniać tego mechanizmu. Dotyczy on tylko błędów składni, nie wykrywane są natomiast tzw. błędy semantyczne. Na przykład, błąd dzielenia przez 0 pojawi się dopiero w trakcie działania programu, gdy wartość danej zmiennej zostanie obliczona.

Biblioteki

Istotą tworzenia projektu jest korzystanie z bibliotek. Program główny może korzystać z bibliotek standardowych, dostarczanych wraz z kompilatorem, lub napisanych przez użytkownika. Dołączanie bibliotek odbywa się poprzez napisanie na początku programu instrukcji #include. W pierwszym przykładzie dołączana jest biblioteka standardowo o nazwie „iostream”.

#include <iostream>

Odpowiada ona za wyświetlanie napisów. Aby ta biblioteka zadziałała prawidłowo, należy jeszcze dopisać:

using namespace std;

co wskaże, że chcemy korzystać ze nazw funkcji z przestrzeni std. Przestrzenie nazw to mechanizm ułatwiający zarządzanie wielkimi projektami, w których pojawia się bardzo dużo funkcji, niekiedy o takich samych nazwach. Przy pisaniu pierwszych programów, wystarczy tylko wpisać linijkę „using namespace std;”, nie wgłębiając się w temat.

Dołączanie własnych bibliotek odbywa się analogicznie:

#include <moj_plik>

Z tym, że trzeba jeszcze dołączyć plik ze swoim kodem do projektu. Można to zrobić wybierając z menu: Project/Add files. Po wskazaniu plików w katalogu, pojawiają się one na drzewie projektu.

Program główny

Program główny jest zdefiniowany poprzez linijki:

int main()
{

}

Nazwa programu głównego to „main”. Nawiasy { } służą w C++ do zaznaczania bloków, czyli program składa się linii ujętych w nawiasy trójkątne.

Komentarze

Linie w C++ można komentować na dwa sposoby. Komentarz pojedynczej linii uzyskuje się za pomocą //. Aby skomentować kilka linii, należy użyć znaków /* na początku i */ na końcu.

Wyświetlanie

Program main składa się z linijek:

cout << "Hello world!" << endl;
return 0;

Pierwsza z nich spowoduje wyświetlenie w konsoli napisu „Hello world!”. Druga oznacza wyjście z programu.

W C++ najwygodniej wyświetlać napisy za pomocą tzw. strumieni. Aby wyświetlić napis, trzeba napisać cout<< i dalej umieścić swój napis. W ten sposób można wyświetlić kilka napisów, np. :

cout << "Pierwszy napis " << „Drugi napis”;

Można też wyświetlać liczby, np. :

cout << "Liczba dwa " << 2;

Aby rozpocząć wyświetlanie od nowej linijki, należy dodać znak końca wiersza endl, jak to jest pokazane w przykładzie.

Każda linia programu, musi się kończyć średnikiem.

Wstęp do pisania funkcji

Program główny jest w rzeczywistości funkcją, tyle że funkcją, która wywołana będzie jako pierwsza.

int main()
{

}

Funkcja ta składa się z treści, ujętej w nawiasy trójkątne, oraz z deklaracji

int main()

Deklaracja zaś składa się z nazwy funkcji (main), argumentów i wyniku. Argumenty są ujęte w nawiasy okrągłe. Funkcja main nie ma żadnych argumentów, dlatego pojawia się tylko (). Wynikiem funkcji jest liczba całkowita, stąd napis int (jak integer). Program główny po zakończeniu działania, czyli po wyświetleniu napisu „Hello world!”, zwraca wartość zero. Za zwrócenie wyniku odpowiada instrukcja return.

int main()
{
 
    return 0;
}

W pliku main.cpp można umieszczać inne funkcje, ale muszą się one znaleźć nad funkcją main. Można np. napisać funkcję obliczającą sumę dwóch liczb:

int suma_2_i_2()
{
     return 2+2;
}

i wywołać ją z programu głównego:

int main()
{
    cout << "2+2 = " << suma_2_i_2() << endl;
    return 0;
}

Po uruchomieniu w konsoli pojawi się napis:

2+2 = 4

Proste typy danych

Żeby napisać bardziej skomplikowane funkcje, koniecznie trzeba poznać proste typy danych. Jeden z nich już się pojawił: int czyli liczba całkowita. Innym typem jest liczba rzeczywista: double (nazwa wiąże się z podwójną precyzją, stosowaną do zapisu miejsc dziesiętnych). Inny prosty typ to znak: char. Należy jeszcze wymienić napis: text. Ten ostatni nie należy do standardu języka i trzeba go włączyć poprzez #include <text.h>.

Zmienne

Wszystkie zmienne w C++ muszą mieć zadeklarowany swój typ. Jeśli zmienna zostanie zadeklarowana jak liczba, nie można do niej przypisać tekstu. W drugą stronę, jeśli zmienna jest przeznaczona do przechowywania tekstu, to nie można do niej wpisać liczby.

Deklaracja odbywa się poprzez napisanie typu, a po nim nazwy zmiennej. Na przykład:

int n;
double x;
char c;
text t;

Oczywiście nazwy mogą być dłuższe niż jedna litera. Należy zwrócić też uwagę na wielkość liter, która jest rozróżniana. Np.:

int liczba_parzysta;
text nazwa_pliku;

Gdy zmienna jest już zadeklarowana, można jej przypisać wartość, np. :

n=10;
x=5.56;
c='A';
t="jakiś napis";

Przypisanie może nastąpić zaraz po deklaracji, np. :

int liczba_parzysta=14;
text nazwa_pliku="wyniki.xls";

Jeśli jest więcej zmiennych tego samego typu, to można je zdefiniować równocześnie, np. :

int liczba_parzysta, liczba_nieparzysta, podzielna_przez_3;

Można również od razu nadać im wartości np. :

int liczba_parzysta=14,
      liczba_nieparzysta=19,
      podzielna_przez_3=21;

Dla poprawy czytelności linijka została przełamana.

Uwaga! Należy pamiętać, że liczby całkowite i rzeczywiste w C++ to osobne typy danych. Dlatego dobrą praktyką jest wpisywanie stałych rzeczywistych z kropką (np. 2.0 a nie 2). W większości przypadków operacje na nich dają ten sam wynik (np. 2+2 = 4 i 2.0+2.0 = 4.0). Ale już dzielenie liczb prowadzi do innych wyników (np. 1.0/2.0 = 0.5, ale 1/2 = 0 – wykonywane jest dzielenie całkowitoliczbowe).

Funkcje

Żeby pisać bardziej skomplikowane funkcje, trzeba umieć przekazywać do nich argumenty. Oto przykład:

int suma(int a,int b)
{
     int wynik = a+b;
     return wynik;
}

int main()
{
    cout << "3+7 = " << suma(3,7) << endl;
    return 0;
}

Po uruchomieniu w konsoli pojawi się napis:

3+7 = 10

Argumentami funkcji 'suma’ są dwie liczby całkowite 'a’ i 'b’. Wywołanie funkcji to: suma(3,7).

Funkcja może posiadać dowolną liczbę argumentów, dowolnego typu.

Wpisywanie danych z klawiatury

Aby można było wpisywać do programu dane z klawiatury, wykorzystuje się instrukcję cin>>. Przykład:

int suma(int a,int b)
{
     int wynik = a+b;
     return wynik;
}

int main()
{
    int liczba1,liczba2;

    cout << "Podaj liczbe nr 1: ";
    cin >> liczba1;

    cout << endl << "Podaj liczbe nr 2: ";
    cin >> liczba2;

    cout << liczba1 << " + " << liczba2 << " = " << suma(liczba1,liczba2) << endl;
    return 0;
}

Po uruchomieniu programu, pojawi się napis „Podaj liczbę nr 1: ”. Będzie można wpisać liczbę. W podobny sposób będzie można wybrać drugą liczbę. Na koniec pokazany zostanie wynik obliczeń.

Definiowanie stałych

W programie można zdefiniować stałe. Stosuje się zapis #define. Np.:

#define PI 3.14159
#define jakas_stala 81.5

Operatory arytmetyczne

Na liczbach można wykonywać podstawowe operacje arytmetyczne (+, -, *, /, %) i porównania. Dla C++ charakterystyczne są jeszcze operacje:

  1. ++ co odpowiada zwiększeniu o 1
  2. – – co odpowiada zmniejszeniu o 1
  3. += co odpowiada zwiększeniu o daną wartość
  4. -= co odpowiada zmniejszeniu o daną wartość

Przykład 1

int n=5;
n++;

Po wykonaniu ++ zmienna 'n’ ma wartość 6.

Przykład 2

double x=1.5;
x += 0.5

Po wykonaniu += zmienna 'x’ ma wartość 2.

Instrukcje warunkowe i pętle

W C++ dostępne są instrukcje warunkowe i pętle. Warunek można zapisać w taki sposób:

if (warunek1)
{
   działanie1
}
else if (warunek2)
{
   działanie2
}
else
{
   działanie3
}

Pętle uzyskuje się w taki sposób:

for (inicjalizacja; warunek; zwiększenie)
{
  działanie
}

Na przykład:

int n,k;
k=0;
for (n=1; n<=10; n++)
{
  k+=n;
}

Powyższy kod zsumuje liczby od 1 do 10. Wynik będzie w zmiennej 'k’.

Drugim sposobem na stworzenie pętli, jest wykorzystanie instrukcji while:

while (warunek)
{
   działanie
}

Oto kod sumujący liczby od 1 do 10 z wykorzystaniem while:

int n,k;
k=0;
n=1;
while (n<=10)
{
  k+=n;
  n++;
}

Wynik będzie identyczny.

Uwaga! Pisząc warunki należy pamiętać, że operatorem równości jest = =, a nie =. Jeśli napisze się np. if (a=0), to program się uruchomi i w tym miejscu, zamiast sprawdzenia warunku, nastąpi przypisanie wartości 0 do zmiennej ‘a’. Poprawna forma to if (a==0).

Procedury

Procedura to szczególny rodzaj funkcji, która nic nie zwraca (może np. tylko wyświetlać wynik). Aby napisać procedurę, stosuje się słowo void. Na przykład:

void wyswietl_sume(int a,int b)
{
     int wynik = a+b;
     cout << wynik;
}

Funkcje i ich argumenty

W poniższym przykładzie funkcja 'suma’ zwraca jedną wartość (wynik dodawania).

int suma(int a,int b)
{
     int wynik = a+b;
     return wynik;
}

int main()
{
    cout << "3+7 = " << suma(3,7) << endl;
    return 0;
}

Jeśli jednak z jakiegoś powodu chcielibyśmy, aby funkcja zwracała więcej wartości, to można to osiągnąć za pomocą przekazania przez referencję (adres). Jak to działa, zostanie zaprezentowane na funkcji 'suma’:

void suma2(int a,int b,int &wynik)
{
     wynik = a+b;
}

int main()
{
    int wynik;
    suma2(3,7,wynik);
    cout << "3+7 = " << wynik << endl;
    return 0;
}

Zdefiniowana została funkcja 'suma2′, która nie zwraca żadnego wyniku. Jednak ma dodatkowy argument, który jest przekazywany przez referencję (znak &). Argument 'wynik’ musi zostać zadeklarowany przed wywołaniem funkcji i do niej przekazany. Funkcja 'suma2′ oblicza wartość zmiennej 'wynik’ i zwraca rezultat. Dzięki referencji, 'wynik’ jest przekazany do programu głównego i może zostać wyświetlony.

W ten sposób można przekazywać dowolną liczbę argumentów, dowolnego typu.

Uwaga! Można zabezpieczyć argumenty przekazywane do funkcji, aby ich wartość nie uległa zmianie wewnątrz funkcji. Osiąga się to za pomocą słowa const. Na przykład zamiast „int a”, można napisać „const int a”.

Funkcje i domyślne argumenty

Dla funkcji można zdefiniować domyślne argumenty. Na przykład:

int suma(int a,int b=1)
{
     int wynik = a+b;
     return wynik;
}

Pisząc „=1” zaznaczono, że jeśli argument 'b’ nie zostanie podany, to program ma przyjąć, że b równa się 1.

int main()
{
    cout << "3+domyślny = " << suma(3) << endl;
    return 0;
}

W programie można wówczas wywołać funkcję „suma(3)”, co da w wyniku 4.

Tablice

W C++ można deklarować tablice (array). Robi się to za pomocą nawiasów kwadratowych, np.:

int tab[10];

W ten sposób zostaje zadeklarowana tablica dziesięciu elementów typu int. Można się do niej odwoływać poprzez operator [], np.:

tab[5] = 100;

W miejsce o indeksie 5 zostaje do tablicy wpisana wartość 100.

Należy pamiętać o tym, że tablice są indeksowane od zera. Tzn. w powyższym przykładzie dostępne są elementy od tab[0] do tab[9].

Można tworzyć tablice wielowymiarowe, np.:

double tab[10][20];
tab[5][3] = 11;

W praktyce wygodniej stosować jeden ze złożonych typów danych, opisanych w dalszej części.

Własne biblioteki

Własne funkcje można umieszczać w pliku main.cpp. Jednak gdy ich liczba wzrośnie, wygodniej utworzyć własną bibliotekę funkcji. Robi się to tak:

  1. należy utworzyć plik nazwa_biblioteki.h, który zawiera deklaracje funkcji (inaczej mówiąc nagłówki funkcji)
  2. należy utworzyć plik nazwa_biblioteki.cpp, w którym są zdefiniowane funkcje (czyli po prostu kod funkcji)
  3. włącza się plik nazwa_biblioteki.h i nazwa_biblioteki.cpp do projektu
  4. w programie głównym wpisuje się #include <nazwa_biblioteki.h>

I można korzystać z własnej biblioteki. Plik z rozszerzeniem h nazywa się plikiem nagłówkowym, ponieważ zawiera nagłówki wszystkich funkcji dostępnych w bibliotece. Żeby wiedzieć, co dana biblioteka „potrafi”, wystarczy zajrzeć do pliku nagłówkowego, który jest dużo krótszy od plik cpp z definicjami.

Przykładowy plik 'biblioteka_sumy.h’ powinien zawierać:

int suma(int a,int b);

A plik 'biblioteka_sumy.cpp’:

int suma(int a,int b)
{
     int wynik = a+b;
     return wynik;
}

Aby wszystko było w porządku, potrzebne są jeszcze linijki umożliwiające poprawne skompilowanie i uruchomienie programu.

Poprawny plik 'biblioteka_sumy.h’:

#ifndef _biblioteka_sumy_h_
#define _biblioteka_sumy_h_

int suma(int a,int b);

#endif

Instrukcje poprzedzone znakiem #, to podpowiedź dla kompilatora, czy dana biblioteka została już przygotowana. Jest to konieczne, aby nie przygotować do uruchomienia wielu kopii tej samej biblioteki, co prowadziłoby do niejednoznaczności, z której kopii skorzystać.

Poprawny plik 'biblioteka_sumy.cpp’:

#include <bibliotek_sumy.h>

int suma(int a,int b)
{
     int wynik = a+b;
     return wynik;
}

Plik cpp musi być uzupełniony o wskazanie do pliku nagłówkowego (dzięki temu oba pliki są powiązane).

Uwaga! Jeżeli pliki znajdują się w innym katalogu niż projektu, to należy ustawić ścieżkę do nich w menu: Settings/Compiler settings/Search directories w zakładce Compiler i zakładce Linker.

Funkcje matematyczne

Stałe matematyczne, funkcje trygonometryczne, logarytmy, potęgi, eksponenta, funkcje specjalne itp. znajdują się w bibliotece „math”. Dołącza się ją za pomocą:

#include <math.h>