Programowanie w C++ Wykład 5 Katarzyna Grzelak 26 marca 2018 9 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40
Pojęcia z poprzedniego wykładu Podział programu na funkcje podział na niezależne moduły. Dane można przekazywać do funkcji podajac ich wartość (funkcja pracuje na kopii) lub adres w pamięci (funkcja pracuje na oryginale ) referencje, wskaźniki. K.Grzelak (Wykład 1) Programowanie w C++ 2 / 40
Pojęcia z poprzedniego wykładu Tablica to ciag obiektów tego samego typu, zajmujacy ciagły obszar pamięci. Wskaźnik to adres w pamięci gdzie znajduje się dany obiekt. int *wski; int liczba=150; wski= &liczba; cout «liczba to «(*wski)«endl; K.Grzelak (Wykład 1) Programowanie w C++ 3 / 40
Tablice przechowujace liczby Na etapie deklaracji rezerwowany jest obszar pamięci o określonej długości. 1 4 9 16 25 36 49 64 81 0 1 2 3 4 5 6 7 8 K.Grzelak (Wykład 1) Programowanie w C++ 4 / 40
Z poprzedniego wykładu Częste użycie wskaźników do pracy z tablicami. Nazwa tablicy to adres jej zerowego elementu. Przykład: wskaźnik ustawiony na poczatku tablicy. int naturalne[9]; int *wsk=naturalne; 1 4 9 16 25 36 49 64 81 K.Grzelak (Wykład 1) Programowanie w C++ 5 / 40
Z poprzedniego wykładu Zwiększanie (zmniejszanie) wskaźnika o n odpowiada przesuwaniu go o n pól w tablicy. Przykład: przesuwamy wskaźnik o 3 pola tablicy (tutaj 3*4 bajty) wsk=wsk+3; 1 4 9 16 25 36 49 64 81 0 1 2 3 4 5 6 7 8 K.Grzelak (Wykład 1) Programowanie w C++ 6 / 40
Przekazywanie jednowymiarowej tablicy do funkcji Tablicę przesyła się do funkcji podajac adres jej poczatku (i jej rozmiar). W przypadku tablicy funkcja zawsze pracuje na jej oryginale. K.Grzelak (Wykład 1) Programowanie w C++ 7 / 40
Przekazywanie jednowymiarowej tablicy do funkcji Zapis z nawiasami kwadratowymi K.Grzelak (Wykład 1) Programowanie w C++ 8 / 40
Przekazywanie jednowymiarowej tablicy do funkcji Zapis wskaźnikowy Na co pokazuje wskaźnik po wyjściu z pętli for? Jak wypisać wewnatrz funkcji zawartość tablicy po zmianach? K.Grzelak (Wykład 1) Programowanie w C++ 9 / 40
Przekazywanie jednowymiarowej tablicy do funkcji Zapis mieszany K.Grzelak (Wykład 1) Programowanie w C++ 10 / 40
Przekazywanie jednowymiarowej tablicy do funkcji Wszystkie trzy funkcje wywołuje się tak samo, podajac nazwę tablicy i jej rozmiar. K.Grzelak (Wykład 1) Programowanie w C++ 11 / 40
Tablice wielowymiarowe... czyli tablice których elementami sa inne tablice int tab[5][2]; tab jest 5-cio elementowa tablica obiektów z których każdy jest dwuelementowa tablica liczb typu int. Tablica ma 5 wierszy i 2 kolumny. Tablice przechowywane sa w pamięci wierszami najszybciej zmienia się indeks najbardziej z prawej strony. K.Grzelak (Wykład 1) Programowanie w C++ 12 / 40
Tablice wielowymiarowe... czyli tablice których elementami sa inne tablice int tab[5][2]; tab adres w pamięci zerowego elementu 5-elementowej tablicy wypełnionej 2-elementowymi tablicami obiektów int. tab[i] adres w pamięci 2-elementowej tablicy wypełnionej obiektami int. tab[i][j] obiekt typu int. K.Grzelak (Wykład 1) Programowanie w C++ 13 / 40
Przekazywanie dwuwymiarowej tablicy do funkcji Zapis tablicowy K.Grzelak (Wykład 1) Programowanie w C++ 14 / 40
Przekazywanie dwuwymiarowej tablicy do funkcji Zapis wskaźnikowy Tak jak w przypadku jednowymiarowym obie funkcje wywołuje się tak samo. K.Grzelak (Wykład 1) Programowanie w C++ 15 / 40
C-string tablica znakowa z języka C K.Grzelak (Wykład 1) Programowanie w C++ 16 / 40
Tablice znakowe Przechowywanie napisów w standardowej tablicy: char figura[11]={"kwadrat"}; k w a d r a t NULL 0 1 2 3 4 5 6 7 8 NULL znak o kodzie Ascii 0 Ważne Przechowywany w tablicy ciag znaków, zakończony znakiem NULL to C-string string z języka C. 9 10 K.Grzelak (Wykład 1) Programowanie w C++ 17 / 40
Tablice znakowe C-string Nie trzeba znać długości napisu wczytywanie napisu aż do napotkania znaku o kodzie Ascii 0. Rozmiar C-stringu jest większy o 1 od ilości zapisanych znaków. K.Grzelak (Wykład 1) Programowanie w C++ 18 / 40
Klasa string ciagi znaków w języku C++ K.Grzelak (Wykład 1) Programowanie w C++ 19 / 40
Podstawy użycia klasy string w C++... czyli przechowywanie napisów prościej Nowy typ zmiennej Wymaga dodania pliku nagłówkowego: #include<string> Deklaracja: string wyraz; Deklaracja i inicjalizacja: string figura="kwadrat"; K.Grzelak (Wykład 1) Programowanie w C++ 20 / 40
Podstawy użycia klasy string w C++ Przykłady użytkowania Używanie bardzo podobne jak dla typów int,double... Przykład 1 - wczytywanie z klawiatury cout «Podaj nazwę figury «endl; string figura; cin» figura Przykład 2 - porównania if(figura== kwadrat ){ cout «OK «endl; } K.Grzelak (Wykład 1) Programowanie w C++ 21 / 40
Podstawy użycia klasy string w C++ To dopiero poczatki Napis z klasy string (np. string nazwa;)...... można zamienić na C-string: nazwa.c_str()... mozna sprawdzić jego długość: nazwa.length()... mozna odwołać się do pojedynczej litery, tak jak w przypadku zwykłej tablicy: nazwa[i]... K.Grzelak (Wykład 1) Programowanie w C++ 22 / 40
Dynamiczna rezerwacja (alokacja) obszarów pamięci K.Grzelak (Wykład 1) Programowanie w C++ 23 / 40
Operatory new i delete new - kreuje obiekty delete - usuwa obiekty Obiekty tworzone operatorem new nie maja nazwy int *wsk; wsk = new int; delete wsk; K.Grzelak (Wykład 1) Programowanie w C++ 24 / 40
Operatory new i delete Obiekty tworzone operatorem new nie maja nazwy - dostęp tylko za pomoca wskaźników. Czas życia od użycia new do użycia delete. Obiekty nie sa tworzone na stosie, tylko na stogu (heap). K.Grzelak (Wykład 1) Programowanie w C++ 25 / 40
Operatory new[] i delete[] new [] - kreuje tablice delete [] - usuwa tablice Tablice tworzone operatorem new[] nie maja nazwy int *wsktab; wsktab = new int[n]; delete [] wsktab; K.Grzelak (Wykład 1) Programowanie w C++ 26 / 40
Operatory new[] i delete[] Obiekty tworzone operatorem new [] nie maja nazwy - dostęp tylko za pomoca wskaźników. Czas życia od użycia new [] do użycia delete [] Dynamiczne tablice nie sa tworzone na stosie, tylko na stogu (heap) moga być większe. K.Grzelak (Wykład 1) Programowanie w C++ 27 / 40
Dynamiczne tablice Rozmiar dynamicznej tablicy nie musi być znany w czasie kompilacji. K.Grzelak (Wykład 1) Programowanie w C++ 28 / 40
Argumenty funkcji main K.Grzelak (Wykład 1) Programowanie w C++ 29 / 40
Argumenty funkcji main...... czyli parametry z linii wywołania programu Dwie możliwości deklaracji funkcji main 1 int main() 2 int main(int argc,char* argv[]) K.Grzelak (Wykład 1) Programowanie w C++ 30 / 40
Argumenty funkcji main...... czyli parametry z linii wywołania programu Przykładowe uruchomienie programu g++ -o prog prog.cc./prog kwadrat 15.5 K.Grzelak (Wykład 1) Programowanie w C++ 31 / 40
Argumenty funkcji main...... czyli parametry z linii wywołania programu argc licznik parametrów wywołania (łacznie z nazwa programu) argv tablica wskaźników do ciagów znaków (C-string) K.Grzelak (Wykład 1) Programowanie w C++ 32 / 40
Argumenty funkcji main...... czyli parametry z linii wywołania programu Jeśli wywołanie programu:./prog kwadrat 15.5 to: argc 3 argv[0]./prog argv[1] kwadrat argv[2] 15.5 K.Grzelak (Wykład 1) Programowanie w C++ 33 / 40
Argumenty funkcji main...... czyli parametry z linii wywołania programu W tablicy argv parametry zapisane jako wskaźniki do C-stringow. W przypadku parametrów które sa liczbami potrzebna konwersja na liczbę (funkcja atof z biblioteki cstdlib) K.Grzelak (Wykład 1) Programowanie w C++ 34 / 40
Podsumowanie Tablice wielowymiarowe: tablice których elementami sa inne tablice. Przechowywanie ciagów znaków: sposób z języka C C-string tablica wypełniona znakami ze znakiem NULL na końcu; sposób z języka C++ obiekt z klasy string użycie analogiczne jak w przypadku podstawowych typów (int, double,... ). Argumenty funkcji main: albo brak argumentów albo dwa: int main(int argc,char* argv[]) => argumenty z linii wywołania zawsze przekazywane jako ciagi znaków (C-stringi). K.Grzelak (Wykład 1) Programowanie w C++ 35 / 40
Do przemyślenia i sprawdzenia w domu Pytanie: Jak ułożone sa w pamięci kolejne elementy tablicy zdefiniowanej poniżej? K.Grzelak (Wykład 1) Programowanie w C++ 36 / 40
Do przemyślenia i sprawdzenia w domu Tak można wypisać kolejne elementy tablicy liczby bez użycia wskaźników: K.Grzelak (Wykład 1) Programowanie w C++ 37 / 40
Do przemyślenia i sprawdzenia w domu Tak można wypisać kolejne elementy tablicy liczby z użyciem wskaźników: K.Grzelak (Wykład 1) Programowanie w C++ 38 / 40
Do przemyślenia i sprawdzenia w domu Co wypisze się na ekran? K.Grzelak (Wykład 1) Programowanie w C++ 39 / 40
Do przemyślenia i sprawdzenia w domu Co wypisze się na ekran? K.Grzelak (Wykład 1) Programowanie w C++ 40 / 40