1.
Funkcja main()
Oznaczonym początkiem programu C++, który programista musi zdefiniować jest funkcja main(). W
standardowej postaci funkcja ta może nie przyjmować żadnych lub przyjmować dwa argumenty podawane przez
system operacyjny przy uruchomieniu programu. Typem zwracanym funkcji main() jest int,np.:
Int main()
Int main(int grac, char *argv[])
2.
Petla for
Pętla for jest podobna do pętli while, lecz zapewnione są dodatkowe mechanizmy umożliwiające inicjalizację
pętli oraz wykonanie odpowiednich modyfikacji po każdej iteracji. Na przykład
#pragma warning(disable:4786) //zapobiega ostrzeżeniom w Visual C++//
typedef map<int, string> IntStringMap
IntStringMap m;
char s[4]
for (int i=0; i<10; i++)
{
s[0]=’a’+i; s[1]=’b’+i
s[2]=’c’+i; s[3]=’\0’;
m.insert(IntStringMap::value_type(i, string(s)));
}
Instrukcja znajdująca się przed pierwszym średnikiem wykonywana jest w celu inicjalizacji pętli. Przed każda
interacja, włączenie z pierwsza, wyznaczana jest wartość wyrażenia umieszczonego pomiędzy dwoma
ś
rednikami. Jeśli wartość wyrażenia równa jest true, wykonane zostaje ciało pętli, w przeciwnym razie pętla
kończy swoje wykonanie.
3.
Dyrektywy preprocesorowe
Każda dyrektywa zaczyna się od znaku # jako pierwszego znaku w wierszu, który nie jest znakiem odstępu.
Pojedyncza dyrektywę można zapisać wielu wierszach, wstawiając lewy ukośnik (\) na końcu wierszy
pośrednich.
a)
#define – powoduje zastąpienie danego identyfikatora tekstem, który został po nim określony, we
wszystkich miejscach występowania identyfikatora w pliku źródłowym.
Jeśli po identyfikatorze nie podamy żadnego tekstu, wówczas preprocesor zdefiniuje ten identyfikator w taki
sposób, aby każde sprawdzenie istnienia jego definicji dało w wyniku wartość true, a wszystkie wystąpienia
identyfikatora w kodzie źródłowym zostały zastąpione tekstem pustym (zostały usunięte)
b)
#undef – usuwa definicję identyfikatora tak, aby sprawdzenie jego istnienia dawało w wyniku wartość
false
c)
#ifdef, #ifndef, #else, # endif – stosowane są łącznie. Dyrektywa #ifdef powoduje dołączenie przez
preprocesor innego kodu w zależności od istnienia lub braku definicji danego identyfikatora. Użycie
dyrektywy #else jest opcjonalne. Dyrektywa #ifndef działa podobnie, lecz powoduje dołączenie
występującego po niej kodu tylko wtedy, gdy brakuje definicji danego identyfikatora.
d)
#if, #elif, #else, #endif – stosowane są łącznie. Powodują one dołączenie lub wykluczenie przez
preprocesor kodu w zależności od prawdziwości danego wyrażenia. Dyrektywa #elif służy do
łańcuchowego łączenia szeregu testów.
e)
#include – powoduje dołączenie przez preprocesor innego pliku, zazwyczaj pliku nagłówkowego.
Nazwy standardowych plików nagłówkowych ujmujemy w nawiasy ostre, a plików nagłówkowych
zdefiniowanych przez użytkownika w znaki cudzysłowiu.
f)
#error – powoduje przerwanie kompilacji i wyświetlenie określonego tekstu
g)
#line – dyrektywa, która sprawia, że preprocesor modyfikuje bieżący numer wiersza zapisywany
wewnętrznie przez kompilator podczas kompilacji w makrodefinicji _LINE_
h)
#pragma – umożliwia sterowanie operacjami przez podanie dyrektywy wraz z dowolnymi parametrami
w postaci wymaganej przez tę dyrektywę.
4.
Pętla wyboru(instrukcje wyboru) – powodują wykonanie różnych instrukcji lub bloku w zależności
od wyniku zwróconego przez wyrażenie. Występują dwa typy instrukcji wyboru:
a) if – oblicza wartość wyrażenia i wykorzystuje wynik do ustalenia, którą z maksymalnie dwóch
instrukcji lub bloków następnie wykonać.
5. Instrukcja warunkowa - są to instrukcje, które wykonują się tylko wtedy gdy spełniony
jest podany warunek. Dzięki instrukcjom warunkowych program może "zachowywać" się
zależnie od spełnienia pewnych warunków.
a) if…else - Podstawowa instrukcja warunkowa wygląda następująco:
if( <warunek> )
{//blok1
...
}
else
{//blok2
...
}
Jeżeli spełniony jest warunek to wykonane zostaną instrukcje zawarte w bloku 1, a gdy warunek nie jest
spełniony to wykonane zostaną instrukcje z bloku 2.
6. Instrukcja:
a) switch (instrukcja wyboru) – wybiera do wykonania jeden z kilku bloków kodu na podstawie wartości
wyrażenia sterującego, np.:
switch (type)
{
Case keyDown: //operacje do wykonania w przypadku naciśnięcia klawisza
….
Break;
Case keyUp: //operacje do wykonania w przypadku zwolnienia klawisza
….
Break;
….
Default: //obsługa tego, nie zostało obsłużone
….
}
Każdy blok jest oznaczony słowem case, po którym występuje wyrażenie, które podczas kompilacji sprowadzać
się musi do jednoznacznej stałej wartości całkowitej. Podczas wykonywania sterowanie przekazywane jest do
bloku o wartości zgodnej z wartością wyrażenia sterującego i do tego miejsca kontynuowane jest wykonywanie
programu. Na końcu każdego bloku case jest instrukcja break w celu zapobieżenia wykonania kodu związanego
z kolejnymi klauzulami case. Opcjonalna klauzula default umożliwia obsługę sytuacji, w której wartość
wyrażenia sterującego nie odpowiada żadnej klauzuli case.
b) break (instrukcja skoku) – umożliwia opuszczenie najbardziej wewnętrznej pętli lub
instrukcji switch
c) continue (instrukcja skoku) – powoduje przekazanie sterowania na początek najbardziej
wewnętrznej pętli
d) Goto (instrukcja skoku) – powoduje przekazanie sterowania do określonej etykiety
7. Funkcja – funkcje w c++ mogą pobierać pewne argumenty i zwracać określony typ wartości.
Funkcję deklarujemy w następujący sposób:
<typ_zwracanej_wartości> nazwa_funkcji( <argumenty_funkcji> );
a) deklaracje funkcji – składają się z następujących elementów: typu zwracanego, nazwy oraz ujętej w nawiasy
zwykłe listy parametrów rozdzielonych przecinkami lub, w przypadku braku parametrów, pustej pary nawiasów
zwykłych. Nazwy parametrów nie są wymagane, lecz stanowią dobrą dokumentacje kodu.
b) odwołania się do funkcji -
c) funkcja rekrutacyjna –
8. Deklaracje
a) Deklaracje stałych –
b) deklaracje zmiennych – deklaracje dotyczące zmiennych wprowadzają nazwy odnoszące się do danych.
Zawierają one: opcjonalną klasę pamięci, opcjonalne kwalifikatory, typy oraz listę jednej lub kilku
deklarowanych nazw rozdzielonych przecinkami, np.:
int i,j,k;
char buffer[80];
deklaracje zmiennych mogą wystąpić w dowolnym miejscu wewnątrz bloku, nie tylko na początku.
Typy zmiennych:
int
liczba całkowita (dodatnia lub ujemna)
float
liczba rzeczywista (z częścią ułamkową)
bool
wartość logiczna (prawda lub fałsz)
char
pojedynczy znak
std::string
łańcuch znaków (tekst)
9. Tablice – zawierają określoną liczbę elementów danego typu. Aby podczas kompilacji programu kompilator
mógł zarezerwować wymagana ilość pamięci, w definicji tablicy trzeba określić typ oraz liczbę elementów,
które będzie on zawierać. Kompilator musi mieć możliwość ustalenia tej wartości podczas kompilacji programu.
Tablice wielowymiarowe – są to tablice zdefiniowane przy użyciu więcej niż jednego indeksu.
10. Instrukcje wejścia/wyjścia
11. Wskaźniki – deklaruje się je przez umieszczenie w deklaracji przed nazwą zmiennej znaku gwiazdki (*),
np.:
Int 1=20;
Int *itr=&i;
Zmienna i jest typu int, natomiast *iptr jest wskaźnikiem do zmiennej.
a)
Wskaźniki typu void – mogą wskazywać dane dowolnego typu.
b)
Wskaźniki puste – można im przypisać wartość 0. Na tym wskaźniku nigdy nie wolno wykonywać
definicji.
c)
Wskaźniki funkcji – wskazuje funkcje. Jego typ jest związany z sygnaturą wskazywanej przez niego
funkcji.
12. Klasy – są typami grupującymi dane i funkcje w zhermetyzowane, spójne jednostki. Definiuje się je,
deklarując dla nich zestaw danych i funkcji składowych
13. Konstruktor i destruktor
a) konstruktor – są specjalnymi funkcjami składowymi służącymi do inicjalizacji egzemplarzy klasy.
Umożliwiają one przeprowadzenie inicjalizacji zanim obiekt zostanie w ogóle użyty. Konstruktory wywoływane
są przy każdej alokacji pamięci dla obiektu, automatycznie przez kompilator, czy tez na skutek zastosowania
operatorów new lub new[]. Konstruktory posiadają taką samą nazwę, co klasa i nigdy nie zwracają wartości.
Konstruktory domyślne
Konstruktory kopiujące
Konstruktory jawne
b) destruktor – są specjalnymi funkcjami składowymi wywoływanymi w momencie, gdy egzemplarz klasy ma
właśnie zostać zniszczony. Umożliwiają one przeprowadzenia czyszczenia zanim obiekt przestanie istnieć.
Destruktory wywoływane są bezpośrednio przed opuszczeniem zakresu przez obiekt oraz w przypadku jawnego
niszczenia obiektów za pośrednictwem wskaźnika do nich przy użyciu operatora delete lub delete[]. Destruktory
posiadają taka samą nazwę, co klasa, lecz poprzedzoną znakiem tyldy (~). Nie przyjmują żadnych argumentów i
nie zwracają wartości.
14.Słowa kluczowe, komentarze, operatory
a) słowa kluczowe - Słowa kluczowe to słowa które mają zastrzeżoną nazwę oraz specjalne znaczenie w danym
języku programowania.
Wykaz słów kluczowych języka c++ wraz z krótkim opisem:
asm
Wstawianie kodu w asemblerze
auto
Klasa zmiennej lokalnej
bool
Typ zmiennej
break Przerywa wykonywanie pętli (for, while) oraz instr. switch
case
Wskazuje na warunek insturkcji switch
catch
Wyłapuje wyjątek
char
Typ zmiennej
class
Deklaracje klas
const
Klasa zmiennych, deklaracja stałych funkcji
continue
Wykonanie kolejnej iteracji pętli
default Wskazuje na dowolny warunek insturkcji switch
delete Zwalnianie pamięci przydzielonej dynamicznie
do
Tworzenie pętli do-while
double Typ zmiennej
else
Alternatywa dla instr. if, gdy warunek nie jest spełniony
enum
Typ zmiennej
extern Klasa zmiennej
float
Typ zmiennej
for
Pętla
friend Wskazuje zaprzyjaźnioną klasę lub funkcję
goto
Skok bezwarunkowy
if
Instrukcja warunkowa
inline
Wstawia kod funkcji w miejscu jej wywołania
int
Typ zmiennej
long
Kwalifikator zmiennej
namespace
Przestrzeń nazw
new
Przydziela pamięć dynamicznie
operator
Przeciążanie operatorów
private Stopień ochrony danych w klasie
protected
Stopień ochrony danych w klasie
public Stopień ochrony danych w klasie
register Klasa zmiennej
return Zwracanie wartości przez funkcje
short
Kwalifikator zmiennej
signed Kwalifikator zmiennej
sizeof
Zwraca rozmiar obiektu (typu) w bajtach
static
Klasa zmiennej, funkcje statyczne
struct Deklaracja struktur
switch Rodzaj instrukcji warunkowej
template
Tworzenie wzorców
this
Wskaźnik dla klas
throw Rzucanie wyjątkiem
try
Przechwytywanie wyjątków
typedef Tworzenia nowego typu danych
union Deklaracja do definiowania unii
unsigned
Kwalifikator zmiennej
using
Wybór przestrzeni nazw
virtual Deklarowanie metod wirtualnych klasy
void
Typ zmiennej
volatile Klasa zmiennej
wchar_t Typ zmiennej
while
Rodzaj pętli
b) komentarze
c) operatory – służy do wykonania określonej operacji na zbiorze operandów występujących w wyrażeniu..
Operatory w języku C++ , w zależności od operatora, wykonują działania na jednym, dwóch lub trzech
operandach. Mogą one być łączone lewostronnie lub prawostronnie. Operatory przypisania(=,+=,<<=, itd.) na
przykład SA łączne prawostronnie,a zatem wyrażenie: i=j=k określa faktycznie operację: i=(j=k)
z drugiej strony operator przypisania (+) jest lewostronnie łączny, a więc wyrażenie: i+j+k określa faktycznie
operację: (i+j)+k
Operator
Opis
Łączność
::
Rozróżnianie zakresu
Brak
[]
Indeks tablicy
Lewostronna
.
Wybór składowej
Lewostronna
->
Wybór składowej
Lewostronna
( )
Wywołanie funkcji
Lewostronna
( )
Konstrukcja wartości
Brak
++
Inkremenatcja przyrostkowa
Brak
--
Dekrementacja przyrostkowa
Brak
Typeid
Informacja o typie
Brak
*_cast
Rzutowanie w stylu języka C++
Brak
Sizeof
Inf. o rozmiarze
Brak
++
Inkrementacja przedrostkowa
Brak
--
Dekrementacja przedrostkowa
Brak
~
Negacja bitowa (NOT)
Brak
!
Negacja logiczna (NOT)
Brak
-
Jednoargumentowy znak minusa
Brak
+
Jednoargumentowy znak plusa
Brak
&
Pobranie adresu
Brak
*
Adresowanie pośrednie
Brak
New
Przydział pamięci
Brak
New[]
Przydział pamięci
Brak
Delete
Zwolnienie pamięci
Brak
Delete[]
Zwolnienie pamięci
Brak
( )
Rzutowanie w stylu języka C++
Prawostronna
.*
Wy bór wskaźnika do składowej
Lewostronna
->*
Wy bór wskaźnika do składowej
Lewostronna
*
Mnożenie
Lewostronna
/
Dzielenie
Lewostronna
%
Reszta z dzielenia
Lewostronna
+
Dodawanie
Lewostronna
-
Odejmowanie
Lewostronna
<<
Przesunięcie bitowe w lewo
Lewostronna
>>
Przesunięcie bitowe w prawo
Lewostronna
<
Mniejsze niż
Lewostronna
<=
Mniejsze lub równe
Lewostronna
>
Większe niż
Lewostronna
>=
Większe lub równe
Lewostronna
==
Równe
Lewostronna
!=
Różne
Lewostronna
&
Koniunkcja bitowa (AND)
Lewostronna
^
Różnica symetryczna (XOR)
Lewostronna
|
Alternatywa bitowa (OR)
Lewostronna
&&
Iloczyn logiczny (AND)
Lewostronna
||
Suma logiczna (OR)
Lewostronna
?:
Wyrażenie warunkowe
Prawostronna
=
Przypisanie proste
Prawostronna
*=
Przypisanie wyniku mnożenia
Prawostronna
/=
Przypisanie wyniku dzielenia
Prawostronna
%=
Przypisanie reszty z dzielenia
Prawostronna
+=
Przypisanie wyniku dodawania
Prawostronna
-=
Przypisanie wyniku odejmowania
Prawostronna
<<=
Przypisanie wyniku przesunięcia w lewo
Prawostronna
>>=
Przypisanie wyniku przesunięcia w prawo
Prawostronna
&=
Przypisanie wyniku bitowego AND
Prawostronna
^=
Przypisanie wyniku bitowego XOR
Prawostronna
|=
Przypisanie wyniku bitowego OR
Prawostronna
Throw
Zgłoszenie wyjątku
Prawostronna
,
Sekwencja
Lewostronna
15. Struktura programu
Na najwyższym poziomie program w języku C++ składa się z jednego lub wielu plików źródłowych
zawierających kod źródłowy C++. We wszystkich tych plikach łącznie zdefiniowane jest dokładnie jedno
miejsce rozpoczęcia wykonania programu i być może wiele miejsc jego zakończenia.
W plikach źródłowych C++ często importowany jest, czyli dołączany, dodatkowy kod źródłowy znajdujący się
w tzw. plikach nagłówkowych. Za dołączenie kodu z tych plików przed kompilacją każdego pliku źródłowego
odpowiedzialny jest preprocesor języka C++. Jednocześnie preprocesor, poprzez zastosowanie tzw. dyrektyw
preprocesora, może wykonać także inne operacje. Plik źródłowy po przetworzeniu przez preprocesor zwany jest
jednostką translacji.
16. Algorytm - opis rozwiązywania problemu (zadania) wyrażony za pomocą takich operacji, które wykonawca
algorytmu rozumie i potrafi wykonać.
Jako przykład posłuży algorytm wyznaczania wartości całkowitej pierwiastka kwadratowego z danej liczby
naturalnej n, czyli algorytmicznego obliczania wartości funkcji (sqrt(n)), gdzie n jest liczbą naturalną. Algorytm
ten jest oparty na bardzo prostym pomyśle. Bierzemy liczbę naturalną i, a następnie sprawdzamy czy (i+1)²>n;
Jeśli warunek ten nie jest spełniony, to bierzemy kolejną liczbę naturalną i dla niej sprawdzamy warunek. Jeżeli
warunek jest spełniony, to i jest szukaną wartością funkcji E(sqrt(n)). Przyjmuje się, że wykonawca tego
algorytmu potrafi dodawać, podnosić do kwadratu i porównywać dwie liczby naturalne.