Przejdź do głównej zawartości

Składnia C++

Poniżej przedstawione jest podsumowanie najważniejszych części składni języka C++. Jest on obok Pythona jednym z języków, w których można zdawać maturę z informatyki. Jeśli do tej pory uczyłeś się Pythona i czujesz się w nim dobrze, to nie ma potrzeby uczenia się C++ (przynajmniej w liceum :)).

C++ jest, w przeciwieństwie do Pythona, językiem kompilowanym, co oznacza, że jego wykonanie odbywa się w dwóch etapach:

  1. Kompilacja - zamienienie kodu źródłowego (tego co napiszemy) na kod maszynowy, czyli zestaw instrukcji (ciąg zer i jedynek) zrozumiały dla procesora
  2. Uruchomienie - czyli wykonanie skompilowanego zestawu instrukcji przez procesor

Struktura programu

// Na początku pliku możemy zaimportować potrzebne nam biblioteki. Domyślnie w
// C++ dostępne jest niewiele typów, które przydatne są na maturze, więc z
// pomocą przychodzi nam biblioteka bits, która włącza bardzo wiele z nich.
#include <bits/stdc++.h>

// W uproszczeniu: poniższa instrukcja pozwala nam korzystać z włączonych przez
// bits funkcji i typów tak, jakby nie pochodziły z biblioteki, tylko były
// powszechnie dostępne. Ale to duże uproszczenie.
using namespace std;

// Funkcja `main` to punkt startowy naszego programu. Zostanie ona wykonana,
// kiedy go uruchomimy. Funkcja `main` powinna zawsze zwracać liczbę całkowitą.
int main() {
// Ta funkcja nic nie robi, po prostu zwraca zero, co oznacza, że w wykonaniu
// programu nie było żadnego błędu.
return 0;
}

Deklaracje zmiennych

W przeciwieństwie do Pythona, podanie typu zmiennej w C++ nie jest opcjonalne. Jeśli podany typ będzie niepoprawny, to uruchomienie programu najprawdopodobniej nie powiedzie się.

int a = 5;
char b = 't';
string c = "test";

// Oba poniższe typy przechowują liczby niecałkowite, ale z różną dokładnością
double d = 5.1;
float e = 5.1;

// Poniżej znajdują się tablice. Tablice mają stałą, z góry określoną długość.
// Nie można dodać do nich nowych elementów, ale można podmienić istniejące.
int f[3] = [1, 2, 3];
char g[5] = ['a', 'b', 'c', 'd', 'e'];

// Typ vector jest bardziej zbliżony do list, które znamy z Pythona. Vectory nie
// mają z góry określonej długości, można z nich usuwać i dodawać do nich
// elementy.
vector<int> h = {1, 5, 7, 0};

Obsługa wejścia/wyjścia

Uzyskanie danych od użytkownika:

string imie;
int wiek;

cout << "Jak masz na imię?";
cin >> imie;

cout << "Ile masz lat?";
cin >> wiek;

cout << "Cześć " << imie << "! Widzę, że masz " << wiek << " lat." << endl;

Przykładowy plik:

-1 1
1 0
1 1
4 -1
3 1

Czytanie z pliku:

// input file stream - otwieramy plik do czytania
ifstream plik("dane.txt");

for (int i = 0; i < 5; i++) {
int v1, v2;

plik >> v1;
plik >> v2;

cout << v1 + v2 << endl;
}

Uwaga! W przeciwieństwie do Pythona, operator >> powoduje automatyczną zamianę wejścia na odpowiedni typ. Użycie zmiennej o niepoprawnym typie spowoduje błąd. Przy czytaniu z pliku operator >> będzie czytał plik do innego momentu, w zależności od typu danych 0 np. string wczyta całą linijkę, char jeden znak, a typy liczbowe będą czytane do końca linijki, lub spacji.

Tablice i wektory

// Jak wspomniałem wcześniej - tablice mają stałą długość, można tylko edytować
// ich zawartość
int tablica[5] = [1, 2, 3, 4, 5];

int pierwszy = tablica[0]; // 1
tablica[3] = 0; // Zawartość tablicy: [1, 2, 3, 0, 5]

// Bardziej interesujące są wektory
vector<int> liczby = {1, 2, 3, 4, 5};

int pierwszy = liczby[0]; // 1
liczby.push_back(6); // Zawartość wektora: [1, 2, 3, 4, 5, 6]
liczby.pop_back(); // Zawartość wektora: [1, 2, 3, 4, 5]
size_t dlugosc = liczby.size(); // 5

Instrukcja warunkowa if

int a = 5;
int b = 3;

if (a + b < 3) {
cout << "Suma mniejsza od trzech" << endl;
} else if (a + b < 0) {
cout << "Suma ujemna" << endl;
} else {
cout << "Suma większa lub równa trzy" << endl;
}

Pętla while

int i = 0;

while (i < 5) {
cout << i << endl; // 0, 1, 2, 3, 4
i += 1;
}

Pętla for

for (int i = 0; i < 5; i++) {
cout << i << endl; // 0, 1, 2, 3, 4
}

vector<char> znaki = {'a', 'b', 'c', 'd'};

for (int i = 0; i < znaki.size(); i++) {
cout << znaki[i] << endl; // 'a', 'b', 'c', 'd'
}

Funkcje

// Ta funkcja przyjmuje dwa argumenty, które są liczbami całkowitymi i zwraca
// liczbę całkowitą
int dodaj_liczby(int a, int b) {
return a + b;
}

// Ta funkcja przyjmuje dwa argumenty, które są liczbami całkowitymi, ale nic
// nie zwraca (void == nic)
void wypisz_sume(int a, int b) {
cout << a + b<< endl;
}

// Poniższe funkcje nie przyjmują żadnych argumentów. Obie formy są poprawne
int daj_5() {
return 5;
}

int daj_6(void) {
return 6;
}