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:
- Kompilacja - zamienienie kodu źródłowego (tego co napiszemy) na kod maszynowy, czyli zestaw instrukcji (ciąg zer i jedynek) zrozumiały dla procesora
- 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;
}