Programowamie strukturalne Flashcards

(16 cards)

1
Q

Struktura języka C. Zmienne, stałe, operatory, wyrażenia. Wypisywanie wyników,
wprowadzenie danych do programowania. Tworzenie i uruchamianie programu.

A

Język C jest językiem programowania proceduralnym, który umożliwia tworzenie programów za pomocą zmiennych, stałych, operatorów i wyrażeń.

Zmienne to elementy programu, które przechowują dane. Można je zdefiniować na początku programu za pomocą polecenia “int” lub “float” w zależności od tego, czy dane będą liczbami całkowitymi czy zmiennoprzecinkowymi. Przykład: int x; float y;

Stałe to elementy programu, które nie mogą być zmieniane podczas działania programu. Można je zdefiniować za pomocą polecenia “define”. Przykład: #define PI 3.14

Operatory to elementy programu, które służą do wykonywania operacji matematycznych i logicznych. Przykłady operatorów to: + (dodawanie), - (odejmowanie), * (mnożenie), / (dzielenie), < (mniejsze niż), > (większe niż).

Wyrażenia to zestawienie zmiennych, stałych i operatorów, które służą do obliczania wartości. Przykład: x + y * PI

Wypisywanie wyników to proces wyświetlania wyników obliczeń na ekranie. Można to zrobić za pomocą polecenia “printf”. Przykład: printf(“Wynik to: %d”, x + y);

Wprowadzenie danych do programowania to proces przekazywania danych do programu za pomocą polecenia “scanf”. Przykład: scanf(“%d”, &x);

Tworzenie i uruchamianie programu to proces tworzenia kodu programu i kompilowania go do pliku wykonywalnego, który można uruchomić na komputerze. Można to zrobić za pomocą odpowiedniego edytora kodu i kompilatora. Przykład: tworzenie pliku o nazwie “program.c” z kodem programu i kompilowanie go za pomocą polecenia “gcc program.c -o program”. Następnie program można uruchomić za pomocą polecenia “./program”.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Wprowadzenie do algorytmiki. Schematy Nassi-Schneidermana. Programy
imperatywne.

A

Wprowadzenie do algorytmiki to dziedzina informatyki zajmująca się projektowaniem, analizowaniem i implementacją algorytmów, czyli systematycznych sposobów rozwiązywania problemów. Algorytm to ciąg instrukcji opisujących sposób wykonania konkretnego zadania.

Schematy Nassi-Schneidermana (NS) są narzędziem służącym do tworzenia graficznych przedstawień algorytmów. Są one bardzo przydatne w procesie projektowania algorytmów, ponieważ umożliwiają jasne i czytelne przedstawienie logicznej struktury algorytmu.

Programy imperatywne to programy, które opierają się na wykonywaniu poleceń. Są one napisane w językach imperatywnych, takich jak C, C++ czy Java, i składają się z ciągu instrukcji, które są wykonywane sekwencyjnie od początku do końca. W programach imperatywnych można zmieniać stan programu poprzez zmianę zmiennych oraz wykonywanie instrukcji warunkowych i pętli.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Funkcje standardowe i funkcje własne. Prototypy funkcji.

A

Funkcje standardowe to funkcje, które są dostępne w większości języków programowania i służą do wykonywania podstawowych operacji, takich jak np. obliczanie wartości matematycznych, przekształcanie typów danych czy wypisywanie tekstu na ekranie.

Funkcje własne to funkcje, które są tworzone przez programistę i służą do wykonywania określonych zadań zdefiniowanych przez programistę. Funkcje własne mogą być tworzone w celu modularizacji kodu, co umożliwia lepszą jego organizację i ułatwia rozwój aplikacji.

Prototypy funkcji to deklaracje funkcji, które informują kompilator o istnieniu funkcji oraz jej nazwie, typie zwracanym i typach argumentów. Prototypy funkcji są używane w języku C, aby uniknąć błędów kompilacji spowodowanych brakiem informacji o funkcji podczas jej wywoływania.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Programowanie z instrukcjami strukturyzującymi: IF, IF … ELSE, SWITCH.

A

> Instrukcje strukturyzujące służą do kontrolowania przepływu wykonywania programu i pozwalają na wykonywanie określonych fragmentów kodu w zależności od spełnienia określonych warunków.Instrukcja if służy do sprawdzenia, czy podane warunek jest spełniony, i wykonania kodu znajdującego się w jej ciele, jeśli warunek jest prawdziwy.Instrukcja if ... else jest rozszerzeniem instrukcji if i pozwala na wykonanie określonego kodu, jeśli warunek jest spełniony, lub innego kodu, jeśli warunek nie jest spełniony.Instrukcja switch jest alternatywą dla instrukcji if ... else, służącą do wykonywania określonego kodu w zależności od wartości podanego wyrażenia. W instrukcji switchnależy pamiętać o umieszczeniu słowa kluczowego breakpo każdym bloku kodu, aby zapobiec jego przełączaniu się na kolejne bloki. Słowo kluczowe defaultjest opcjonalne, kod umieśczony pod tym blokiem bedzie wykonany w przypadku nie spełnienia innych warunków.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Konwersja i rzutowanie typów.

A

Konwersja typów polega na przekształceniu jednego typu danych w inny. Konwersja typów może być konieczna, gdy chcemy przypisać wartość zmiennej o jednym typie do zmiennej o innym typie lub gdy chcemy wywołać funkcję, która oczekuje na argument o określonym typie, a przekazujemy jej argument o innym typie.

Rzutowanie typów polega na ręcznym przekształceniu jednego typu danych w inny. Rzutowanie typów jest często wymagane w sytuacjach, gdy konwersja typów nie jest możliwa lub gdy chcemy zmienić typ danych na typ, który nie jest bezpośrednio kompatybilny z typem źródłowym.

Należy pamiętać, że konwersja i rzutowanie typów mogą prowadzić do utraty informacji, jeśli dokonywane są na typach o różnej precyzji lub pojemności. Dlatego należy zachować ostrożność podczas ich stosowania i upewnić się, że są one odpowiednie do konkretnego zastosowania.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Programowanie iteracyjne z WHILE, DO … WHILE, FOR.

A

Pętla while wykonuje instrukcje w bloku, dopóki warunek jest spełniony. Jeśli warunek jest fałszywy, pętla zostaje przerwana i program kontynuuje wykonywanie instrukcji po pętli.

Pętla do…whilerównież wykonuje instrukcje w bloku, ale sprawdzenie warunku jest wykonywane dopiero po wykonaniu instrukcji w bloku. Oznacza to, że instrukcje w bloku zostaną wykonane co najmniej raz, niezależnie od tego, czy warunek jest spełniony czy nie.

Pętla forskłada się z trzech części: inicjalizacji, warunku i iteracji. Inicjalizacja jest wykonywana przed pierwszym wykonaniem pętli i może być używana do zainicjowania zmiennych. Warunek jest sprawdzany przed każdym wykonaniem pętli i, jeśli jest fałszywy, pętla zostaje przerwana. Iteracja jest wykonywana po każdym wykonaniu pętli i może być używana do zmiany wartości zmiennych używanych w warunku.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Stałe, zmienne lokalne i globalne. Zasięg i zakres zmiennych. Operatory
arytmetyczne, relacyjne, logiczne i bitowe.

A

> Stałe to wartości, które są niezmienne w trakcie działania programu i nie mogą być zmieniane przez programistę ani przez sam program. Stałe są deklarowane za pomocą słowa kluczowego const i najczęściej są stosowane w celu zapewnienia niezmienności ważnych wartości, takich jak stałe matematyczne lub stałe konfiguracyjne.Zmienne to elementy pamięci, których wartość może być zmieniana w trakcie działania programu. Zmienne muszą być zadeklarowane przed ich użyciem i muszą mieć określony typ, taki jak np. int, float lub char.Zmienne lokalne to zmienne, które są deklarowane wewnątrz funkcji lub bloku kodu i są dostępne tylko w obrębie tej funkcji lub bloku. Zmienne lokalne są automatycznie utworzone przy wywołaniu funkcji i są usuwane po jej zakończeniu.Zmienne globalne to zmienne, które są deklarowane poza funkcjami i są dostępne w całym programie. Zmienne globalne są tworzone w momencie uruchomienia programu i są usuwane po jego zakończeniu.Zasięg zmiennej to obszar programu, w którym zmienna jest dostępna. Zasięg zmiennej lokalnej jest ograniczony do funkcji lub bloku kodu, w którym została zadeklarowana, natomiast zasięg zmiennej globalnej obejmuje cały program.Zakres zmiennej to czas trwania zmiennej w pamięci. Zakres zmiennej lokalnej jest ograniczony do czasu trwania funkcji lub bloku kodu, w którym została zadeklarowana, natomiast zakres zmiennej globalnej obejmuje cały czas trwania programu.Operatory arytmetyczne to operatory służące do wykonywania podstawowych działań matematycznych, takich jak dodawanie, odejmowanie, mnożenie, dzielenie.Operatory relacyjne pozwalają na porównywanie dwóch wartości i zwracają wartość logiczną (prawda lub fałsz) na podstawie wyniku tego porównania. Przykłady operatorów relacyjnych to >, <, >=, <=, ==, !=.Operatory logiczne pozwalają na łączenie wyrażeń logicznych, takich jak AND, OR, NOT. Przykłady operatorów logicznych to &&, ||, !.Operatory bitowe pozwalają na pracę na poziomie bitów, takie jak AND, OR, NOT, XOR, lewa i prawa przesunięcie. Przykłady operatorów bitowych to &, |, ~, ^, «,&raquo_space;.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Zmienne wskaźnikowe, operatory i arytmetyka wskaźnikowa. Tablice wskaźnikowe.
Wskaźniki jako argumenty funkcji.

A

> Zmienne wskaźnikowe to zmienne, które przechowują adresy innych zmiennych lub elementów pamięci. Wskaźniki są deklarowane za pomocą operatora * i mogą być używane do uzyskiwania dostępu do zmiennych lub elementów pamięci za ich pośrednictwem.Operatory arytmetyki wskaźnikowej to operatory służące do wykonywania arytmetyki na wskaźnikach. Operatory te pozwalają na przesuwanie wskaźników o określoną liczbę elementów w pamięci lub na obliczanie różnicy między dwoma wskaźnikami.Tablice wskaźnikowe to tablica zawierająca wskaźniki do innych elementów pamięci. Tablice wskaźnikowe są deklarowane za pomocą dwóch gwiazdek ** i pozwalają na uzyskiwanie dostępu do elementów tablicy za pośrednictwem wskaźników.Wskaźniki mogą być również używane jako argumenty funkcji. W takim przypadku wskaźnik przekazuje adres zmiennej lub elementu pamięci do funkcji, co pozwala na jej modyfikację z poziomu funkcji.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Tablice statyczne jednowymiarowe i wielowymiarowe. Inicjalizacja tablic. Tablice o
zmiennych rozmiarach. Tablice wskaźników.

A

> Tablice statyczne to tablica o stałym rozmiarze, której elementy są tworzone i zwalniane razem z programem. Tablice statyczne mogą być jednowymiarowe lub wielowymiarowe i są deklarowane za pomocą słowa kluczowego static.

Tablice statyczne mogą być inicjalizowane przy deklaracji, podając wartości poszczególnych elementów tablicy w nawiasach klamrowych.
>
>
> Tablice o zmiennych rozmiarach to tablica, której rozmiar może być określany dynamicznie w trakcie działania programu. Tablice o zmiennych rozmiarach są często używane w programach, które wymagają przetwarzania dużych ilości danych lub których rozmiar jest nieznany w momencie tworzenia programu.
>
> Tablice o zmiennych rozmiarach są deklarowane jako wskaźniki i alokowane dynamicznie za pomocą funkcji malloc lub calloc.
>
> Tablice wskaźników to tablica zawierająca wskaźniki do innych elementów pamięci. Tablice wskaźników są deklarowane za pomocą dwóch gwiazdek **
> i pozwalają na uzyskiwanie dostępu do elementów tablicy za pośrednictwem wskaźników.
>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Dynamiczna alokacja pamięci. Dostęp do danych. Klasy pamięci. Operatory bitowe.

A

> Dynamiczna alokacja pamięci to sposób tworzenia elementów pamięci i przydzielania im adresów w trakcie działania programu. Dynamiczna alokacja pamięci pozwala na tworzenie elementów o zmiennych rozmiarach i pozwala na elastyczne dostosowywanie rozmiaru pamięci do potrzeb programu.W języku C dynamiczną alokację pamięci można wykonać za pomocą funkcji malloc, calloc lub realloc. Funkcja malloc alokuje pojedynczy blok pamięci o określonej rozmiarze, funkcja calloc alokuje blok pamięci i wypełnia go zerami, a funkcja realloc zmienia rozmiar istniejącego bloku pamięci.Dostęp do danych w pamięci można uzyskać za pomocą operatorów & i *. Operator &zwraca adres elementu pamięci, natomiast operator *zwraca wartość pod adresem pamięci.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Łańcuchy znakowe, tablice, działania na łańcuchach, wczytywanie i wypisywanie
łańcuchów.

A

Łańcuchy znakowe to ciąg znaków służący do przechowywania tekstu. W języku C łańcuchy znakowe są reprezentowane przez tablice znaków, w których ostatni element jest znakiem końca łańcucha (\0).

Łańcuchy znakowe można wczytywać i wypisywać za pomocą funkcji fgetsi fputsz biblioteki stdio.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Złożone typy danych: struktury, unie, pola bitowe, wyliczenie enum, definicje nazwy
typu typedef.

A

> Złożone typy danych to typy danych składające się z innych typów danych, takich jak struktury, unie, pola bitowe i wyliczenia.Struktury to typ danych pozwalający na grupowanie różnych typów danych w jednym obiekcie. Struktury są deklarowane za pomocą słowa kluczowego struct i mogą zawierać różne pola o różnych typach danych.Unie to typ danych pozwalający na przechowywanie różnych typów danych w tym samym bloku pamięci. Unie są deklarowane za pomocą słowa kluczowego union
i mogą zawierać różne pola o różnych typach danych.Pola bitowe to typ danych pozwalający na przechowywanie bitów w strukturach lub uniach. Pola bitowe są deklarowane za pomocą słowa kluczowego bitfield
i mogą zajmować określoną liczbę bitów w bloku pamięci.Wyliczenia (ang. enumeration) to typ danych pozwalający na tworzenie stałych o nazwach składających się z liter. Wyliczenia są deklarowane za pomocą słowa kluczowego enum i przypisują kolejnym elementom wyliczenia wartości liczbowe (od 0 w górę).Definicje nazwy typu (ang. type alias) to sposób na tworzenie nowych nazw dla istniejących typów danych. Definicje nazwy typu są deklarowane za pomocą słowa kluczowego typedef.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Podstawowe operacje plikowe, znaczniki trybu dostępu do plików. Binarne operacje
plikowe. Dostęp swobodny do plików.

A

> Podstawowe operacje plikowe to operacje pozwalające na odczyt i zapis danych do plików oraz na manipulowanie plikami. W języku C podstawowe operacje plikowe są realizowane za pomocą funkcji z biblioteki stdio.

Otwarcie pliku do odczytu i zapisu za pomocą funkcji fopen

Odczyt pojedynczego znaku z pliku za pomocą funkcji fgetc

Zapis pojedynczego znaku do pliku za pomocą funkcji fputc
>
>
> Znaczniki trybu dostępu do plików to znaki określające sposób, w jaki plik ma być otwarty. W języku C dostępne są następujące znaczniki trybu dostępu do plików:
>
> - "r" - otwarcie pliku tylko do odczytu
> - "w" - otwarcie pliku tylko do zapisu (plik jest tworzony, jeśli nie istnieje)
> - "a" - otwarcie pliku tylko do zapisu (plik jest otwierany na końcu, jeśli istnieje)
> - "r+" - otwarcie pl
>
> Binarne operacje plikowe to operacje, które pozwalają na dostęp do plików w sposób bezpośredni, bez konieczności interpretacji ich zawartości przez program. Dzięki temu możliwe jest szybsze odczytywanie i zapisywanie danych do plików.
>
> W przeciwieństwie do tekstowych operacji plikowych, w których pliki są interpretowane jako sekwencje znaków i dane są odczytywane i zapisywane w postaci tekstu, w przypadku binarnych operacji plikowych pliki są traktowane jako sekwencje bajtów i dane są odczytywane i zapisywane w postaci binarnej.
>
> Dostęp swobodny do plików oznacza, że program może w dowolny sposób odczytywać i zapisywać dane z pliku. Może to być przydatne w przypadku plików, których format jest znany i możliwe jest bezpośrednie odczytanie i zapisanie danych za pomocą binarnych operacji plikowych.
>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Nowe operatory arytmetyczne. Priorytety operatorów. Zarządzanie pamięcią, data i
czas.

A

> W języku C istnieją następujące operatory arytmetyczne: +, -, *, /, % (reszta z dzielenia).Priorytety operatorów to kolejność, w jakiej operacje są wykonywane w wyrażeniach. Operator o wyższym priorytecie jest wykonywany przed operatorem o niższym priorytecie. Priorytety operatorów są następujące (od najwyższego do najniższego):

  1. ()
  2. ++, - (pre- i post-inkrementacja/dekrementacja)
  3. !, ~, +, -(not, one’s complement, plus, minus)
  4. -, /, % (mnożenie, dzielenie, reszta z dzielenia)
  5. +, -(dodawanie, odejmowanie)
  6. <<, >> (przesunięcie bitowe w lewo, przesunięcie bitowe w prawo)
  7. <, <=, >, >= (mniejszy, mniejszy lub równy, większy, większy lub równy)
  8. ==, != (równy, różny)
  9. & (bitowe AND)
  10. ^ (bitowe XOR)
  11. | (bitowe OR)
  12. && (logiczne AND)
  13. || (logiczne OR)
  14. ?: (operator trójargumentowy)
  15. =, +=, =, =, /=, %=, &=, ^=, |=, <<=, >>= (przypisanie, przypisanie z dodaniem/odejmowaniem/mnożeniem/dzieleniem/resztą z dzielenia/bitowym AND/XOR/OR/przesunięciem bitowym w lewo/prawo)
Zarządzanie pamięcią w języku C odbywa się za pomocą specjalnych funkcji i operatorów. Do głównych narzędzi zarządzania pamięcią należą:
  • malloc() i calloc() - alokują pamięć
Język C udostępnia kilka struktur i funkcji do pracy z datą i czasem. Główne z nich to:
  • Struktura tm zdefiniowana w pliku nagłówkowym time.h, która przechowuje informacje o dacie i czasie.
  • Funkcja time() zwracająca aktualny czas w postaci liczby sekund od początku epoki (1 stycznia 1970 r. 00:00:00 UTC).
  • Funkcja localtime() konwertująca liczbę sekund od początku epoki na strukturę tm z czasem lokalnym.
  • Funkcja gmtime() konwertująca liczbę sekund od początku epoki na strukturę tm z czasem w UTC (czas uniwersalny).
  • Funkcja mktime() konwertująca strukturę tm na liczbę sekund od początku epoki.
  • Funkcja strftime() służąca do formatowania daty i czasu w postaci ciągu znaków.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Standardowe funkcje wejścia-wyjścia nieformatowane i formatowane. Specyfikacje
kodów dla grupy printf( ), scanf( ), modyfikatory, flagi.

A

> Standardowe funkcje wejścia-wyjścia nieformatowane to funkcje, które pozwalają na odczyt i zapis danych w sposób niezależny od ich reprezentacji. Najczęściej używane funkcje tego typu to fread() i fwrite().Standardowe funkcje wejścia-wyjścia formatowane to funkcje, które pozwalają na odczyt i zapis danych w sposób zależny od ich reprezentacji. Najczęściej używane funkcje tego typu to fprintf() i fscanf().Grupa funkcji printf() to funkcje, które pozwalają na wypisywanie danych na standardowe wyjście. Grupa funkcji scanf() to funkcje, które pozwalają na odczyt danych ze standardowego wejścia.Modyfikatory to znaki, które służą do modyfikowania sposobu wyświetlania danych przez funkcje z grupy printf() lub odczytywania danych przez funkcje z grupy scanf(). Przykłady modyfikatorów to: - (left-justify), + (zawsze wyświetlaj znak), ' ' (dodaj spację dla dodatnich wartości), # (alternatywna reprezentacja).Flagi to znaki, które służą do modyfikowania sposobu wyświetlania danych przez funkcje z grupy printf(). Przykłady flag to: 0 (wypełnij brakujące miejsca zerami), ' (separator tysięcy).Kody specyfikacji to znaki, które służą do określenia typu danych, które mają być wyświetlone lub odczytane. Przykłady kodów specyfikacji to: d (liczba całkowita), f (liczba zmiennoprzecinkowa), s (ciąg znaków).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Preprocesor. Standard C99.

A

> Preprocesor to program, który jest uruchamiany przed kompilatorem i służy do przetwarzania plików źródłowych. Jego głównym zadaniem jest dodawanie plików nagłówkowych, definiowanie makr i umożliwienie warunkowego kompilowania kodu.Preprocesor jest uruchamiany za pomocą polecenia #include lub #define. Polecenie #include służy do dodawania pliku nagłówkowego do pliku źródłowego, natomiast polecenie #define służy do definiowania makr. Makra to ciągi znaków, które są zamieniane na inne ciągi znaków przez preprocesor.Standard C99 (ang. C99, ISO/IEC 9899:1999) to trzecia wersja standardu języka C. Wprowadza on m.in. obsługę nowych typów danych (np. long long, _Bool), nowe funkcje (np. snprintf(), vprintf()) oraz umożliwia definiowanie makr z argumentami. Standard C99 jest obecnie najnowszą wersją standardu języka C.

  • Programowanie obiektowe w C++🫠
    1. Język C++ – paradygmaty programowania obiektowego.
    > C++ jest językiem programowania, który umożliwia programowanie zarówno w paradygmacie obiektowym, jak i proceduralnym.
    
    Paradygmat obiektowy polega na tworzeniu programu za pomocą obiektów, które reprezentują rzeczywiste elementy z otaczającego nas świata. Każdy obiekt posiada pewien zestaw cech (zwane atrybutami) oraz zachowań (zwane metodami). Obiekty współdziałają ze sobą poprzez wywoływanie swoich metod i korzystanie z ich atrybutów.
    
    Język C++ umożliwia tworzenie obiektów za pomocą klas. Klasa jest szablonem, z którego możemy tworzyć konkretne obiekty. Każda klasa zawiera opis atrybutów i metod swoich obiektów. W C++ możemy również tworzyć relacje pomiędzy klasami, takie jak dziedziczenie i kompozycja.
    
    Paradygmat obiektowy jest szczególnie przydatny w programowaniu dużych i złożonych projektów, ponieważ umożliwia on lepsze zorganizowanie kodu i łatwiejsze jego rozszerzanie i utrzymanie.
    > 
2. **Przeciążanie operatorów, wskaźnik this, referencje.**
    
    > Przeciążanie operatorów to możliwość zdefiniowania nowych zachowań dla operatorów już istniejących w języku. Na przykład możemy zdefiniować, jak ma działać operator dodawania dla dwóch obiektów naszej klasy. Przeciążenie operatorów jest szczególnie przydatne w przypadku klas, które reprezentują pewne pojęcia matematyczne lub logiczne.
    > 
    > 
    > Wskaźnik **`this`** to specjalny wskaźnik, który wskazuje na obiekt, w którym jest używany. Możemy używać go w metodach naszej klasy, aby odwołać się do atrybutów lub metod tego obiektu.
    > 
    > Referencja to zmienna, która jest "aliasem" do innej zmiennej lub obiektu. Możemy ją utworzyć za pomocą operatora **`&`**. Referencja działa jak zwykła zmienna, ale jest zawsze "podpięta" do zmiennej lub obiektu, do którego została utworzona. Używamy referencji, aby uniknąć kopiowania dużych obiektów lub w przypadku, gdy chcemy mieć bezpośredni dostęp do obiektu.
    > 
    > Wskaźnik **`this`** i referencje są szczególnie przydatne w konstruktorach i operatorach przeciążających, gdzie często chcemy odwołać się do obiektu, w którym są one używane.
    > 
3. **Funkcje i klasy wirtualne.**
    
    > Funkcja wirtualna to funkcja, która jest oznaczona jako "wirtualna" w klasie bazowej, a następnie może być nadpisana (przesłonięta) w klasach pochodnych. Funkcja wirtualna jest wywoływana w sposób dynamiczny, co oznacza, że w momencie wywołania, kompilator decyduje, która z funkcji wirtualnych zostanie wywołana.
    
    Klasa wirtualna to klasa, która zawiera co najmniej jedną funkcję wirtualną. Klasa wirtualna jest szczególnie przydatna, gdy chcemy stworzyć hierarchię klas, w której chcemy mieć możliwość nadpisywania (przesłaniania) pewnych funkcji w klasach pochodnych.
    
    Funkcje wirtualne i klasy wirtualne są szczególnie przydatne w programowaniu obiektowym, ponieważ umożliwiają one tworzenie polimorfizmu, czyli możliwości wywoływania różnych implementacji tej samej funkcji w zależności od typu obiektu. Jest to szczególnie przydatne w przypadku, gdy mamy do czynienia z dużymi hierarchiami klas i chcemy mieć możliwość dostosowywania zachowań poszczególnych klas do swoich potrzeb.
    > 
4. **System wejścia-wyjścia, mechanizmy formatowania.**
    
    > System wejścia-wyjścia (I/O) to mechanizm służący do wymiany danych pomiędzy programem a urządzeniami zewnętrznymi, takimi jak pliki, konsola, drukarka itp. W języku C++ mamy do dyspozycji standardowy system wejścia-wyjścia (stdio), który umożliwia nam m.in. czytanie danych z plików i wyświetlanie ich na konsoli oraz pobieranie danych od użytkownika z klawiatury i zapisywanie ich do plików.
    > 
    > 
    > Mechanizmy formatowania to narzędzia służące do prezentowania danych w odpowiedni sposób. W języku C++ mamy do dyspozycji specjalne znaki formatujące, które pozwalają nam sformatować wyjście programu, takie jak wyświetlenie liczb z określoną liczbą miejsc po przecinku czy wyświetlenie tekstu z określoną szerokością. Możemy również używać klas takich jak **`std::stringstream`** lub **`std::printf`**, aby sformatować dane wejściowe lub wyjściowe.
    > 
5. **Dynamiczna alokacja pamięci, statyczne elementy klas.**
    
    > Dynamiczna alokacja pamięci to mechanizm pozwalający na alokowanie pamięci w czasie wykonywania programu. W języku C++ możemy używać funkcji **`new`** i **`delete`**, aby alokować i zwalniać pamięć dynamicznie. Alokacja pamięci dynamicznej jest szczególnie przydatna, gdy nie wiemy z góry, ile pamięci będziemy potrzebować lub gdy chcemy zapewnić elastyczność naszemu programowi.
    > 
    > 
    > Elementy statyczne to elementy, które są wspólne dla wszystkich obiektów danej klasy. Elementy statyczne są alokowane w momencie uruchomienia programu i są dostępne do momentu jego zakończenia. Możemy stworzyć element statyczny za pomocą słowa kluczowego **`static`**. Elementy statyczne są szczególnie przydatne, gdy chcemy utworzyć coś, co jest wspólne dla wszystkich obiektów danej klasy, ale nie chcemy, aby było to zależne od konkretnych obiektów.
    > 
6. **Szablony funkcji i klas, przestrzenie nazw.**
    
    > Szablony funkcji i klas to mechanizm pozwalający na tworzenie "ogólnych" elementów programu, które mogą być używane dla różnych typów danych. Szablony umożliwiają nam tworzenie kodu, który jest uniwersalny i może być używany z różnymi typami danych bez konieczności tworzenia wielu różnych wersji tego samego kodu.
    > 
    > 
    > Przestrzenie nazw to mechanizm pozwalający na "oddzielenie" elementów naszego programu od siebie. Możemy stworzyć przestrzeń nazw za pomocą słowa kluczowego **`namespace`**. Przestrzenie nazw są szczególnie przydatne w dużych projektach, gdzie mamy do czynienia z dużą liczbą klas i funkcji o podobnych nazwach. Dzięki przestrzeniom nazw możemy uniknąć konfliktów nazw i lepiej zorganizować nasz kod.
    > 
7. **Wyjątki i ich obsługa.**
    
    > Wyjątki to specjalne obiekty, które służą do obsługi sytuacji awaryjnych w naszym programie. Możemy "rzucić" (throw) wyjątek w momencie, gdy wystąpi jakiś błąd lub nieoczekiwana sytuacja, a następnie "złapać" (catch) ten wyjątek i odpowiednio na niego zareagować.
    
    Obsługa wyjątków polega na umieszczeniu kodu, który może "rzucić" wyjątek, w bloku try, a następnie umieszczeniu kodu, który ma reagować na wyjątek, w bloku catch. Możemy również umieścić kod, który ma być wykonany po zakończeniu bloku try-catch, w bloku finally.
    
    Wyjątki są szczególnie przydatne w przypadku, gdy chcemy obsługiwać błędy lub nieoczekiwane sytuacje w sposób bardziej elastyczny niż za pomocą zwracania kodów błędów. Pozwalają one również uniknąć rozprzestrzeniania się błędów poprzez nasz kod i umożliwiają lepsze zorganizowanie obsługi błędów.
    > 
8. **Klasa string – łańcuchy znakowe w stylu C++, standardowa biblioteka szablonów**
    
    > Klasa **`string`** jest klasą służącą do przechowywania i manipulowania łańcuchami znaków w języku C++. Klasa **`string`** jest częścią standardowej biblioteki szablonów (STL) i jest zoptymalizowana pod kątem wydajności oraz użyteczności.
    > 
    > 
    > Klasa **`string`** posiada wiele przydatnych metod i operatorów, takich jak możliwość łączenia łańcuchów za pomocą operatora **`+`**, wyszukiwanie podłańcucha za pomocą metody **`find`**, zamienianie wszystkich znaków na małe lub duże litery za pomocą metod **`tolower`** i **`toupper`** itp.
    > 
    > Klasa **`string`** jest szczególnie przydatna w przypadku, gdy chcemy pracować z dużymi ilościami tekstu lub gdy potrzebujemy szybkiej i wygodnej obsługi łańcuchów znaków. Warto pamiętać, że klasa **`string`** jest niezgodna ze starej biblioteki wejścia-wyjścia (stdio), więc jeśli chcemy korzystać z klasy **`string`** razem z funkcjami stdio, musimy używać specjalnych funkcji takich jak **`std::getline`** lub **`std::printf`** z odpowiednimi specjalnymi znakami formatującymi.
    > 
9. **Wizualne biblioteki obiektowe, VCL, .NET, Qt.**
    
    > Wizualne biblioteki obiektowe to biblioteki, które umożliwiają nam tworzenie aplikacji z interfejsem graficznym (GUI). Wizualne biblioteki obiektowe zapewniają gotowe komponenty (takie jak przyciski, listy, pola tekstowe itp.), które możemy użyć do stworzenia interfejsu użytkownika naszej aplikacji.
    
    VCL (Visual Component Library) to wizualna biblioteka obiektowa stworzona przez firmę Borland do użytku z jej środowiskiem programistycznym Delphi. VCL umożliwia tworzenie aplikacji Windows za pomocą gotowych komponentów i narzędzi do projektowania interfejsu użytkownika.
    
    .NET (ang. dot net) to platforma programistyczna stworzona przez firmę Microsoft, która umożliwia tworzenie aplikacji dla różnych systemów operacyjnych za pomocą jednego zestawu narzędzi i języków programowania. .NET zawiera wiele różnych bibliotek i narzędzi, w tym wizualną bibliotekę obiektową o nazwie WPF (Windows Presentation Foundation), która umożliwia tworzenie aplikacji Windows z bogatym interfejsem użytkownika.
    
    Qt (ang. cute) to wizualna biblioteka obiektowa stworzona przez firmę Trolltech (obecnie Qt Company). Qt umożliwia tworzenie aplikacji dla różnych systemów operacyjnych, w tym Windows, Linux, macOS, Android i iOS, za pomocą jednego zestawu narzędzi i języków programowania.
    > 
10. **Metody tworzenia aplikacji wizualnych z wykorzystaniem biblioteki Qt**
    
    > Tworzenie aplikacji wizualnych z wykorzystaniem biblioteki Qt może być realizowane za pomocą kilku różnych metod:
    > 
    > 1. Tworzenie aplikacji za pomocą interfejsu programistycznego Qt Creator. Qt Creator to środowisko programistyczne stworzone przez Qt Company, które umożliwia tworzenie aplikacji za pomocą interfejsu graficznego. Qt Creator posiada wiele przydatnych narzędzi, takich jak edytor kodu, projektant interfejsu użytkownika i debugger, które ułatwiają tworzenie aplikacji.
    > 2. Tworzenie aplikacji za pomocą kodu. Możemy również tworzyć aplikacje za pomocą kodu, używając języka programowania C++ i odpowiednich klas i funkcji z biblioteki Qt. Ta metoda jest szczególnie przydatna dla programistów, którzy chcą mieć pełną kontrolę nad swoimi aplikacjami i chcą dostosować je do swoich potrzeb.
    > 3. Tworzenie aplikacji za pomocą interfejsu programistycznego innych bibliotek, takich jak wizualna biblioteka obiektowa .NET