UCZELNIA WARSZAWSKA Programowanie obiektowe r.a. 2007/2008 ProwadzÄ…cy: dr hab. in\. Kazimierz Worwa, prof. WAT e-mail: kworwa@wat.edu.pl Programowanie obiektowe RAZEM WykÅ‚ady Ćwiczenia Laboratoria 32 16x - 16+ Programowanie obiektowe 2 Programowanie obiektowe Warunki zaliczenia przedmiotu (dwa wpisy): zaliczenie laboratorium egzamin (test wielokrotnego wyboru) Programowanie obiektowe 3 LITERATURA 1. Stroustrup B.: JÄ™zyk C++. WNT, Warszawa,2006. 2. Schildt H.: Programowanie: C++. Wydawnictwo RM, Warszawa, 2002. 3. Graham I.: Metody obiektowe w teorii i w praktyce. WNT, Warszawa, 2004. 4. Wrycza S., Marcinkowski B., Wyrzykowski K.: JÄ™zyk UML 2.0 w modelowaniu systemów informatycznych. Wydawnictwo Helion, Gliwice, 2005. Programowanie obiektowe 4 Lokalizacja plików do wykÅ‚adów http://members.lycos.co.uk/pkjw84/kw/ w folderze: Programowanie obiektowe II ZIN logowanie: nazwa u\ytkownika 2007/2008 hasÅ‚o kw Programowanie obiektowe 5 Programowanie obiektowe Tematyka przedmiotu 1. Wprowadzenie do jÄ™zyka C++ 2. Wprowadzenie do klas obiektów 3. Konstruktory i destruktory 4. Dziedziczenie 5. Funkcje wirtualne i polimorfizm 6. Szablony funkcji i klas 7. ObsÅ‚uga wyjÄ…tków 8. Funkcje przeciÄ…\one 9. PrzeciÄ…\anie operatorów 10. Biblioteka standardowych szablonów (STL) WykÅ‚ad 1-2 Wprowadzenie do jÄ™zyka C++ Struktura programu Podstawowe typy danych StaÅ‚e i zmienne Operatory arytmetyczne i logiczne Instrukcje sterujÄ…ce Instrukcje alokacji i dealokacji pamiÄ™ci Programowanie obiektowe 7 Jaki dokÅ‚adnie jest jÄ™zyk C ? Jego kod jest niezwykle szybki, ale skÅ‚adnia jÄ™zyka mo\e przysparzać wielu kÅ‚opotów niewprawnym programistom, C ma ugruntowanÄ… pozycjÄ™ na rynku przetrwaÅ‚ próbÄ™ czasu, czego nie mo\na powiedzieć o wielu innych jÄ™zykach programowania, UNIX zostaÅ‚ prawie w 100% zaimplementowany w jÄ™zyku C i caÅ‚y czas jest podstawowym jÄ™zykiem programowania dla systemów operacyjnych z grupy systemów UNIX, np. Solaris, AIX, Linux, jest on równie\ wa\ny dla systemu DEC VMS, C jest równie\ bardzo wa\nym jÄ™zykiem programowania dla systemów z rodziny Windows i systemów sieciowych z rodziny NetWare Programowanie obiektowe 8 Jaki dokÅ‚adnie jest jÄ™zyk C ? C jest jÄ™zykiem tzw. Å›redniego poziomu: Niski poziom jÄ™zyki maszynowe, assemblery wydajność kodu wynikowego C zbli\ona do wydajnoÅ›ci jÄ™zyka maszynowego Åšredni poziom jÄ™zyk C skÅ‚adnia kodu zródÅ‚owego C zbli\ona do skÅ‚adni Wysoki poziom jÄ™zyki pochodzÄ…ce jÄ™zyka wysokiego poziomu od Algola: Pascal, Modula2, ADA, Basic, jak równie\ C++, Java Programowanie obiektowe 9 Jakie jest odniesienie jÄ™zyka C do jÄ™zyków C++ i Java JÄ™zyk C++ jest obiektowo zorientowanym rozszerzeniem jÄ™zyka C JÄ™zyk Java zostaÅ‚ zbudowany bezpoÅ›rednio na podstawie jÄ™zyka C++ Wobec powy\szego: aby dobrze poruszać siÄ™ w obszarze jÄ™zyków C++ i Java wskazana jest znajomość jÄ™zyka C Aby nazywać siebie profesjonalistÄ…, nale\y znać jÄ™zyk C Programowanie obiektowe 10 JÄ™zyk programowania C++ Dlaczego jÄ™zyk C++? C++ jest jÄ™zykiem hybrydowym: umo\liwia programowanie, bÄ™dÄ…ce wynikiem stosowania w jednym programie ró\nych technik programowania; C++ jest jÄ™zykiem elastycznym; umo\liwia pisanie programów ka\dÄ…, z wczeÅ›niej omówionych, technik programowania (główna przyczyna jego popularnoÅ›ci). C++ jest jÄ™zykiem wydajnym; semantyka jÄ™zyka znajduje siÄ™ na niskim poziomie, tzn. podstawowe pojÄ™cia jÄ™zyka odzwierciedlajÄ… podstawowe pojÄ™cia tradycyjnego komputera. C++ jest jÄ™zykiem szeroko dostÄ™pnym; implementacje tego jÄ™zyka istniejÄ… zarówno dla mikrokomputerów jak te\ dla du\ych maszyn (superkomputerów). C++ jest jÄ™zykiem przenoÅ›nym; programów napisanych w C++ zazwyczaj nie mo\na automatycznie przenosić z jednego systemu operacyjnego do drugiego; jednak przenoÅ›ność z uwzglÄ™dnieniem odpowiednich uwarunkowaÅ„ jest mo\liwa. Programowanie obiektowe 11 JÄ™zyk programowania C++ Charakterystyczny bÅ‚Ä…d: programiÅ›ci u\ywajÄ… C++ jako lepszego C , nie wykorzystujÄ…c w istocie \adnych jego mo\liwoÅ›ci obiektowych; Część specjalistów wró\y szybki koniec kariery jÄ™zyka C++, m.in. w zwiÄ…zku z pojawieniem siÄ™ bardziej przyjaznych jÄ™zyków wy\szego poziomu (takich jak Java lub Å›rodowisk programowania wizualnego); Programowanie obiektowe 12 Historia jÄ™zyka C/C++ 1978r. pierwszy opis standardu jÄ™zyka C Dennis Ritchie i Brian Kernighan w ksiÄ…\ce pt. The C Programming Language wyd. Prentice-Hall (polskie wydanie w 1988r. pt. JÄ™zyk C wydawnictwo WNT) 1989r. standard ANSI jÄ™zyka C 1983 oddanie do u\ytku pierwszej implementacji jÄ™zyka C++ (Bjarne Stroustrup). Powstanie nazwy C++ 1985 powstanie pierwszej wersji jÄ™zyka C++ do u\ytku zewnÄ™trznego 1994 przyjÄ™cie standardu ANSI/ISO jÄ™zyka C++ Programowanie obiektowe 13 KsztaÅ‚t programu w jÄ™zyku C/C++ PodstawÄ… programu jest tzw. MODUA GAÓWNY, który jest zapisywany w postaci kodu zródÅ‚owego zapisanego w pliku ASCII z rozszerzeniem .C lub .CPP Struktura moduÅ‚u głównego w jÄ™zyku C/C++: .. /* klauzule importu bibliotek */ część .. /* deklaracje staÅ‚ych, zmiennych, typów */ deklaracyjna .. /* prototypy lub deklaracje funkcji lub procedur */ .. main( ) /* sÅ‚owo domyÅ›lne i zastrze\one */ część { /* klamra otwierajÄ…ca program*/ wykonywalna .. /* polecenia wykonywane przez program */ .. } /* klamra zamykajÄ…ca program*/ Programowanie obiektowe 14 Wprowadzenie do jÄ™zyka C++ Pierwszy program // Pierwszy program w C++ #include using namespace std; // main rozpoczyna wykonanie siÄ™ programu int main() { cout << "Witaj C++!\n"; getchar(); return 0; // program zakoÅ„czony poprawnie } // koniec bloku main Program 1.1 Programowanie obiektowe 15 PodziaÅ‚ programu na procedury i funkcje w jÄ™zykach programowania mamy do czynienia z dwoma rodzajami podprogramów: funkcje wykonujÄ…ce czynnoÅ›ci i zwracajÄ…ce wartość procedury wykonujÄ…ce jakieÅ› czynnoÅ›ci deklaracje procedur i funkcji sÄ… umieszczane w części deklaracyjnej moduÅ‚u w części wykonywalnej programu zdefiniowane procedury i funkcje sÄ… wywoÅ‚ywane wykorzystujÄ…c procedury i funkcje w tekÅ›cie programu realizujemy tzw. programowanie proceduralne, którego najwy\szÄ… formÄ… jest programowanie strukturalne, wykorzystujÄ…ce technikÄ™ dekompozycji ( dziel i rzÄ…dz ) Programowanie obiektowe 16 PodziaÅ‚ programu na moduÅ‚y Program mo\e być zbudowany z wielu modułów, np.: biblioteki standardowe biblioteki wÅ‚asne , ......, moja_bib1.h , ..., moja_bib2.h import moduÅ‚ główny z funkcjÄ… main( ) kompilator, linker program wykonywalny Programowanie obiektowe 17 Deklarowanie procedur i funkcji Funkcje w jÄ™zyku C/C++ deklarujemy wedÅ‚ug schematu: zwracany_typ nazwa_funkcji (typ1 zmienna1,..., typn zmiennan); funkcja zwraca wartość, Parametry formalne funkcji (procedury). obliczonÄ… w czasie jej W czasie wywoÅ‚ania funkcji (procedury) wykonania w ich miejsce wstawiane sÄ… parametry aktualne, które przekazujÄ… wartoÅ›ci do podprogramu, na których on operuje Procedury w jÄ™zyku C/C++: void nazwa_procedury (typ1 zmienna1,..., typn zmiennan); procedura nie zwraca wartoÅ›ci, co oznaczamy sÅ‚owem void Programowanie obiektowe 18 Deklarowanie procedur i funkcji /* deklaracje importu bibliotek*/ ....................... /*deklaracje procedur i funkcji, np.:*/ int moja_fun1(int par1); /*funkcja z jednym parametrem*/ { /*treść funkcji*/ return wartość /*wymagana deklaracja zwrotu wartoÅ›ci funkcji*/ } void moja_proc1(void); /*procedura bezparametrowa*/ { /*treść procedury*/ } /* moduÅ‚ główny */ main( ) { /*treść programu*/ zmienna = moja_fun1(21); /*przykÅ‚ad wywoÅ‚ania funkcji*/ moja_proc1( ); /*przykÅ‚ad wywoÅ‚ania procedury*/ return 0; } Programowanie obiektowe 19 Komentarze Komentarz jest fragmentem programu ignorowanym w procesie kompilacji Wyró\nia siÄ™ komentarze blokowe i liniowe Komentarz blokowy umieszcza siÄ™ miÄ™dzy sekwencjÄ… znaków "/*" a "*/", a komentarz liniowy rozpoczyna siÄ™ sekwencjÄ… "//" a koÅ„czy znakiem koÅ„ca linii. PrzykÅ‚ady /* To jest komentarz blokowy. Mo\e zajmować kilka wierszy */ // To jest komentarz liniowy Uwaga na nierozwa\ne umieszczenie w zakresie komentarza linii kodu zródÅ‚owego, np. int a; /*Komentarz w stylu int b; jÄ™zyka C */ Programowanie obiektowe 20 Identyfikatory Identyfikator (nazwa) sÅ‚u\y do nazywania obiektów wchodzÄ…cych w skÅ‚ad programu napisanego w jÄ™zyku C (zmiennych, typów, funkcji itp). PrzykÅ‚adowe identyfikatory: i, liczba, j1, J1, data_urodzenia, _koniec PrzykÅ‚ady niepoprawnych identyfikatorów: 2rok, 1_kwietnia, ab$, czary!mar, a-b Nie nale\y u\ywać identyfikatorów majÄ…cych dwa znaki podkreÅ›lenie obok siebie (sÄ… one poprawne z punktu widzenia skÅ‚adni jÄ™zyka C), poniewa\ mogÄ… być one u\ywane przez twórców kompilatora do tworzenia bibliotek, makr itp. Programowanie obiektowe 21 StaÅ‚e i zmienne w programie staÅ‚e nie zmieniajÄ… swojej wartoÅ›ci w czasie dziaÅ‚ania programu zmienne mogÄ… zmieniać swojÄ… wartość dowolnie wiele razy je\eli chodzi o zakres widocznoÅ›ci mo\emy wyró\nić w programie dwa rodzaje staÅ‚ych i zmiennych: zmienne i staÅ‚e globalne deklarowane w części deklaracyjnej moduÅ‚u, widoczne w caÅ‚ym programie, a wiÄ™c we wszystkich jego procedurach, funkcjach i funkcji main( ) zmienne i staÅ‚e lokalne deklarowane wewnÄ…trz procedur, funkcji i widoczne wyÅ‚Ä…cznie w tych procedurach, funkcjach, w których zostaÅ‚y one zadeklarowane ka\da staÅ‚a lub zmienna musi mieć okreÅ›lony typ danych na obecnym etapie wykÅ‚adu bÄ™dziemy wykorzystywać wyÅ‚Ä…cznie predefiniowane typy danych Programowanie obiektowe 22 SÅ‚owa kluczowe Niektóre identyfikatory zostaÅ‚y zastrze\one przez twórców jÄ™zyka. SÅ‚u\Ä… one do zapisu konstrukcji jakie sÄ… dopuszczalne w jÄ™zyku C. Dlatego nazywa siÄ™ je sÅ‚owami kluczowymi. SÅ‚owa kluczowe nie mogÄ… być u\yte jako nazwy zmiennych, typów lub funkcji i nie sÄ… poprawnymi identyfikatorami w sensie skÅ‚adni jÄ™zyka C. W jÄ™zyku ANSI C wystÄ™pujÄ… nastÄ™pujÄ…ce sÅ‚owa kluczowe: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Programowanie obiektowe 23 Deklarowanie staÅ‚ych staÅ‚e literalne (literal constant): nazwa_staÅ‚ej = wartość, np.: dzieÅ„ = 24; godzina = 60; PI = 3.1416; staÅ‚e symboliczne (symbolic constant): #define nazwa_staÅ‚ej wartość, np.: #define dzieÅ„ 24 #define godzina 60 # define PI 3.1416 const typ_staÅ‚ej nazwa_staÅ‚ej wartość_staÅ‚ej, np.: const int dzieÅ„ 24; const int godzina 60; const float PI 3.1416; Programowanie obiektowe 24 Zmienne ZmiennÄ… okreÅ›lany jest pewien obszar w pamiÄ™ci komputera, w którym mogÄ… być przechowywane dane. Z punktu widzenia osoby piszÄ…cej program, zmienna posiada nastÄ™pujÄ…ce cechy podstawowe: nazwa (identyfikator) typ wartość Nazwa zmiennej pozwala wskazać w programie, o który fragment pamiÄ™ci nam chodzi. Aatwiej jest posÅ‚ugiwać siÄ™ nazwÄ… ni\ adresem liczbowym (Å‚atwiej zrozumieć napis printf(imiÄ™); ni\ np. printf(*0x12342);) Kompilator dokonujÄ…c tÅ‚umaczenia napisanego programu zamienia wszystkie nazwy zmiennych na odpowiednie adresy w pamiÄ™ci komputera. Wszystkie nazwy zmiennych przed u\yciem muszÄ… być zadeklarowane. Programowanie obiektowe 25 Zmienne Wartość zmiennej jest tym, co przechowujemy w obszarze pamiÄ™ci okreÅ›lanym przez nazwÄ™. Wartość mo\e siÄ™ zmieniać w dowolnym momencie w czasie wykonania programu. WartoÅ›ciÄ… mo\e być liczba caÅ‚kowita, zmiennoprzecinkowa (uÅ‚amek dziesiÄ™tny), adres w pamiÄ™ci komputera (tzw. wskaznik), tekst itp. W momencie deklaracji wartość zmiennej lokalnej (zadeklarowanej wewnÄ…trz funkcji) jest nieokreÅ›lona tzn. jej wartość jest przypadkowa; zmienne globalne (deklarowane poza funkcjami) sÄ… inicjowane na zero. Typ zmiennej okreÅ›la jakÄ… wartość mo\na wpisać do obszaru wskazywanego przez nazwÄ™ (czy bÄ™dzie to liczba caÅ‚kowita, zmienno-przecinkowa ... , czy te\ inny rodzaj danej). W zale\noÅ›ci od rodzaju wartoÅ›ci (typu zmiennej), inny bÄ™dzie rozmiar pamiÄ™ci potrzebny do jej zapamiÄ™tania. Kompilator na podstawie typu okreÅ›la jakÄ… ilość pamiÄ™ci nale\y przydzielić zmiennej i jakie operacje sÄ… na niej dopuszczalne. Programowanie obiektowe 26 Deklarowanie i nadawanie zmiennym wartoÅ›ci schemat deklaracji zmiennej (globalnej, lokalnej): typ_zmiennej nazwa_zmiennej; przykÅ‚ady deklaracji zmiennych: int dÅ‚ugość, odlegÅ‚ość; /*zmienne caÅ‚kowitoliczbowa*/ float powierzchnia; /*liczba rzeczywista*/ char znak; /*zmienna znakowa*/ schemat nadawania wartoÅ›ci zmiennej: nazwa_zmiennej = wartość_zmiennej; przykÅ‚ady nadawania wartoÅ›ci zmiennym: dÅ‚ugość = 20; /*nadanie wartoÅ›ci wprost*/ powierzchnia = 15.20; /*przecinek jest obowiÄ…zkowy*/ znak = A ; /*znaki wpisujemy w apostrofach*/ odlegÅ‚ość = dÅ‚ugość; /*wpisanie wartoÅ›ci jednej zmiennej do drugiej*/ Programowanie obiektowe 27 Wprowadzenie do jÄ™zyka C++ PrzykÅ‚ad #include using namespace std; int index; int main(){ index= 0 int stuff; stuff = ?, np. 1245068 for (int count; count < 8 ; count++) count = ?, np. 4217000 { } goofy = 0 static unsigned goofy; napis = ? char * napis; } Jakie wartoÅ›ci przyjmÄ… zmienne z powy\szego kodu? Programowanie obiektowe 28 Wprowadzenie do jÄ™zyka C++ Podstawowe typy danych: Typ caÅ‚kowity: int - typ caÅ‚kowity, long int - typ tzw. dÅ‚ugich liczb caÅ‚kowitych, short int - typ tzw. krótkich liczb caÅ‚kowitych, signed - liczby ze znakiem, unsigned - liczby bez znaku; Typ znakowy: char; PrzykÅ‚ad: long int x; // dÅ‚uga liczba caÅ‚kowita long x; // znaczenie: jak wy\ej short int x; // krótka liczba caÅ‚kowita short x; // znaczenie: jak wy\ej Programowanie obiektowe 29 Wprowadzenie do jÄ™zyka C++ Typ Liczba bitów Zakres Podstawowe typy danych (2): unsigned char 8 0..255 signed char 8 -128..127 unsigned int 16 0..65535 short signed int 16 -32768..32767 signed int 16 -32768..32767 long unsigned int 32 0..4.294.967.295 long signed int 32 -2.147.483.648..2.147.483.647 Programowanie obiektowe 30 Wprowadzenie do jÄ™zyka C++ Podstawowe typy danych: Typ rzeczywisty: float liczby rzeczywiste, double liczby podwójnej precyzji, long double liczby wysokiej precyzji; PrzykÅ‚ad: long double x=2.1234; Typ Liczba bitów Zakres float 32 3.4*10-38..3.4*1038 double 64 1.7*10-308..1.7*10308 long double 80 3.4*10-4932..1.1*104932 Programowanie obiektowe 31 Zasada widzialnoÅ›ci zmiennych i staÅ‚ych Zmienne i staÅ‚e zdefiniowane na poziomie caÅ‚ego moduÅ‚u głównego main obowiÄ…zujÄ… we wszystkich miejscach tego moduÅ‚u, tzn.: w jego części wykonywalnej we wszystkich procedurach i funkcjach zawartych w module, Zmienne i staÅ‚e zdefiniowane w funkcji (procedurze) obowiÄ…zujÄ… tylko w zakresie tej funkcji (procedury) Programowanie obiektowe 32 Standardowe moduÅ‚y biblioteczne jÄ™zyka C++ Na poczÄ…tku tekstu programu u\ywamy sentencji: #include #include ................ #include using namespace std; SÄ… to tzw. klauzule importu standardowych bibliotek Å›rodowiska jÄ™zyka C++ Nazwy bibliotek standardowych piszemy w otoczeniu tzw. nawiasów kÄ…towych Biblioteki sÄ… dodatkowymi moduÅ‚ami jÄ™zyka C++, w których zostaÅ‚y zgromadzone napisane wczeÅ›niej funkcje przydatne programiÅ›cie DziÄ™ki takiemu rozwiÄ…zaniu nie trzeba ich pisać samodzielnie Programowanie obiektowe 33 Standardowe moduÅ‚y biblioteczne jÄ™zyka C++ PrzykÅ‚adowe biblioteki jÄ™zyka C++ : #include #include #include #include PrzykÅ‚adowe biblioteki jÄ™zyka C: #include #include #include #include Programowanie obiektowe 34 Operatory jÄ™zyka C/C++ Operatory umo\liwiajÄ… zapisywanie ró\nego rodzaju operacji w kodzie zródÅ‚owym programu Omówimy nastÄ™pujÄ…ce rodzaje operatorów jÄ™zyka C/C++: operator unarny operatory arytmetyczne operatory logiczne operatory relacyjne operatory przyrostowe Programowanie obiektowe 35 Operator unarny Operator unarny jest zapisywany w postaci znaku minusa Umo\liwia on zmianÄ™ znaku dowolnej liczby na przeciwny PrzykÅ‚ad a = 5; b = a; czyli b = 5 Programowanie obiektowe 36 Operatory arytmetyczne Umo\liwiajÄ… one zapis operacji arytmetycznych: * (gwiazdka) - mno\enie, % (procent) - reszta z dzielenia caÅ‚kowitoliczbowego, / (ukoÅ›nik) - dzielenie, + (plus) - dodawanie (minus) odejmowanie W zapisie bardziej zÅ‚o\onych dziaÅ‚aÅ„ zaleca siÄ™ stosowanie nawiasów okrÄ…gÅ‚ych, aby uniknąć nieporozumieÅ„ zwiÄ…zanych z priorytetami operatorów PrzykÅ‚ady: 8 2 * 4 // 0 (8 2) * 4 // 24 5 / 2 // 2, 5.0 / 2.0 // 2.5 5 % 2 //1 Programowanie obiektowe 37 Operatory logiczne Wykorzystywane w wyra\eniach logicznych Lista operatorów logicznych: && - iloczyn logiczny AND || - suma logiczna OR ! negacja logiczna NOT PrzykÅ‚ady: zdanie a AND b zapisujemy: a && b, zdanie a OR b zapisujemy: a || b, zdanie NOT b zapisujemy: !b, zdanie a OR NOT(b AND c) zapisujemy: a || !(b && c) Programowanie obiektowe 38 Operatory relacyjne Umo\liwiajÄ… one wykonywanie ró\nych porównaÅ„ w zdaniach logicznych Lista operatorów relacyjnych: > wiÄ™ksze ni\, >= wiÄ™ksze lub równe ni\, < mniejsze ni\, <= mniejsze lub równe ni\, == równe != ró\ne UWAGA: Nale\y zwrócić uwagÄ™ na istotnÄ… ró\nicÄ™ pomiÄ™dzy operatorem przypisania =, a operatorem relacyjnym porównania == Programowanie obiektowe 39 Priorytety operatorów porównania i relacyjnych ! Najwy\szy priorytet >, >=, <, <= ==, != && || Najni\szy priorytet W zapisie zdaÅ„ logicznych wykorzystujemy ponadto nawiasy okrÄ…gÅ‚e Programowanie obiektowe 40 Wprowadzenie do jÄ™zyka C++ Podstawowe typy danych: Konwersja typów: Operator rzutowania jÄ™zyka C: " zmienna a (typu int) bÄ™dzie void main() { poddana konwersji to typu float int a = 2; float x = 17.1; char c; przed wykonaniem dodawania, c = (char)a + (char)x; " nastÄ™pnie wynik typu float bÄ™dzie c = a + x; poddany konwersji do typu char } przed przypisaniem go do zmiennej c Nowy operator rzutowania jÄ™zyka C++: skÅ‚adania konwersji typu podobna do wywoÅ‚ania funkcji, np. c = char(a) + char(x); W C++ dostÄ™pne sÄ… wszystkie formy konwersji typów; Programowanie obiektowe 41 Wprowadzenie do jÄ™zyka C++ Operator zasiÄ™gu: Operator :: umo\liwia peÅ‚ny dostÄ™p do zmiennej globalnej z pominiÄ™ciem zmiennej lokalnej, np. int index = 13; void main() { float index = 3.1415; ::index = index + 7; cout << " Wartość lokalna index to: " << index << "\n"; cout << " Wartość globalna index to: " << ::index << "\n"; } Nadu\ywanie czyni kod zródÅ‚owy nieczytelnym; Co zobaczymy na ekranie? Wartość lokalna index to: 3.1415 Wartość globalna index to: 10 Programowanie obiektowe 42 Wprowadzenie do jÄ™zyka C++ Operator cout stosowany do wyprowadzania danych na standardowe urzÄ…dzenie; zastÄ™puje printf jÄ™zyka C, ale nie sÄ… wymagane informacje formatujÄ…ce (typ wyprowadzanych danych), np. #include using namespace std; int main() { float index = 3.1415; char letter; letter = 'X'; cout << " Wartość index to: " << index << endl; cout << " Wartość letter to: " << letter << endl; } operator << (nazywany operatorem wyprowadzania) nakazuje systemowi wyprowadzić wartość zmiennej lub staÅ‚ej nastÄ™pujÄ…cej po nim; Co zobaczymy na ekranie? Program 1.2 Programowanie obiektowe 43 Wprowadzenie do jÄ™zyka C++ Operator cin stosowany do wprowadzania danych ze standardowego urzÄ…dzenia; zastÄ™puje scanf jÄ™zyka C, ale nie sÄ… wymagane informacje o typie wprowadzanych danych; operator >> (nazywany operatorem pobierania) nakazuje wczytać wartość do zmiennej nastÄ™pujÄ…cej po nim, np. #include using namespace std; int main() { float index = 3.1415; char znak; cout << "Podaj liczbe" << endl; cin >> index; cout << "Wartosc zmiennej index to: " << index << endl; cin >> znak; } Program 1.3 Co zobaczymy na ekranie? Programowanie obiektowe 44 Operatory przyrostowe Umo\liwiajÄ… zapis operacji inkrementacji (zwiÄ™kszenia wartoÅ›ci liczby caÅ‚kowitej o jeden) lub dekrementacji (zmniejszenia wartoÅ›ci liczby caÅ‚kowitej o jeden) Inkrementacja: a = a + 1; zapisujemy operatorem: a++ Dekrementacja: a = a 1; zapisujemy operatorem: a-- operatory przyrostowe Programowanie obiektowe 45 Operatory przyrostowe PrzykÅ‚ad #include using namespace std; Co zobaczymy na ekranie? int main(void) { int i, k, n=50; i = 10; k = i++; n+=5; /* wyÅ›wietlenie wartoÅ›ci zmiennych */ cout << "i = " << i << endl; cout << "k= " << k << endl; cout << "n= " << n; getchar(); //Zatrzymanie okna konsoli return 0; Program 1.4 } Programowanie obiektowe 46 Operatory przyrostowe PrzykÅ‚ad #include using namespace std; int main(void) { int i, k, m=5, n=50; Co zobaczymy na ekranie? i = 10; k = ++i; n*= 2; /* wyÅ›wietlenie wartoÅ›ci zmiennych */ cout << "i = " << i << endl; cout << "k= " << k << endl; cout << "n = " << n << endl; m = m * ++m; cout << "m = " << m << endl; m=5; m = m * m++; cout << "m = " << m << endl; getchar(); //Zatrzymanie okna konsoli return 0; Program 1.5 } Programowanie obiektowe 47 Instrukcje jÄ™zyka C/C++ Wszystkie instrukcje w jÄ™zyku C z wyjÄ…tkiem instrukcji zÅ‚ożonej koÅ„czÄ… siÄ™ Å›rednikiem. Instrukcja zÅ‚ żona Å‚oż Å‚ ż Å‚ ż Instrukcja zÅ‚ożona skÅ‚ada siÄ™ z nawiasu klamrowego otwierajÄ…cego, dowolnych instrukcji (mogÄ… być również kolejne instrukcje zÅ‚ożone) i nawiasu klamrowego zamykajÄ…cego: { instrukcja1; instrukcja 2; instrukcja 3; { instrukcja 4; instrukcja 5; } } Programowanie obiektowe 48 Instrukcja podstawienia Instrukcja ta zawiera dowolne wyra\enie jÄ™zyka C PrzykÅ‚ady: a = 2; /* inicjowanie zmiennej */ a = b = c + 4; znak = a ; Programowanie obiektowe 49 Instrukcja warunkowa Instrukcja warunkowa umo\liwia wykonanie pewnej instrukcji w zale\noÅ›ci od wartoÅ›ci wyra\enia Wszystkie wartoÅ›ci ró\ne od 0 sÄ… w jÄ™zyku C/C++ traktowane jako prawda; równe 0 jako faÅ‚sz Wyra\enia logiczne sÄ… liczone tylko do momentu, w którym mo\na okreÅ›lić jego wartość SkÅ‚adnia: if (wyra\enie) instrukcja1; lub if (wyra\enie) instrukcja1; else instrukcja 2; wyra\enie `" 0 Ò! PRAWDA `" Ò! `" Ò! `" Ò! wyra\enie = 0 Ò! FAASZ Ò! Ò! Ò! Programowanie obiektowe 50 Instrukcja warunkowa W obu postaciach instrukcja mo\e być instrukcjÄ… zÅ‚o\onÄ…. W pierwszym przypadku instrukcja wykonuje siÄ™, jeÅ›li wartość wyra\enia jest ró\na od 0. W drugim wykonuje siÄ™ jedna z dwóch podanych instrukcji (nigdy obie) - pierwsza, gdy wartość wyra\enia jest ró\na od 0, druga - gdy wartość wyra\enia jest równa 0. Programowanie obiektowe 51 Instrukcja warunkowa - przykÅ‚ad if (a > 5) cout << "a jest wiÄ™ksze od 5 << endl; else cout << "a jest mniejsze lub równe 5 << endl; Programowanie obiektowe 52 Instrukcja switch Instrukcja switch sÅ‚u\y do wybierania jednego przypadku z wielu. SkÅ‚adnia: switch (zmienna){ case staÅ‚a1: Instrukcja 1; Break; case staÅ‚a2: Instrukcja 2; Break; & & & & default: Instrukcja n; Break; } Programowanie obiektowe 53 Instrukcja switch przykÅ‚ad 1 #include using namespace std; int main(void) { int i; char znak; cout << "Wprowadz liczbe od 1 do 4: " << endl; cin >> i; switch(i) { case 1: cout << "jeden"; break; case 2: cout << "dwa"; break; case 3: cout << "trzy"; break; case 4: cout << "cztery"; break; default: cout << "Liczba nierozpoznana"; } cin >> znak; Program 1.6 return 0; } Programowanie obiektowe 54 Instrukcja switch przykÅ‚ad 2 #include using namespace std; int main(void) { char ch; do { cout << endl << "Wprowadz litere (q konczy): "; cin >> ch; cout << endl; switch(ch) { case 'a': cout << "Nadszedl "; case 'b': cout << "czas "; case 'c': cout << "ludzi honoru"; break; case 'd': cout << "Idzie "; case 'e': cout << "student"; } } while(ch != 'q'); Program 1.7 return 0; } Programowanie obiektowe 55 Program 1.8 PÄ™tla while SkÅ‚adnia: while (wyra\enie) instrukcja; Instrukcja umieszczona w pÄ™tli while" (mo\e to być instrukcja zÅ‚o\ona) jest powtarzana a\ do momentu, gdy wartość wyra\enia bÄ™dzie równa 0. W przypadku, gdy wartość wyra\enia od razu bÄ™dzie równa 0, instrukcja nie wykona siÄ™ ani raz. JeÅ›li wyra\enie nie przyjmie wartoÅ›ci 0, instrukcja bÄ™dzie siÄ™ wykonywać nieskoÅ„czonÄ… liczbÄ™ razy. PrzykÅ‚ad char znak; cin >> znak; cin >> znak; cin >> znak; cin >> znak; while (znak!= # ) { cout << Niepoprawny znak << endl ; cout << Niepoprawny znak << endl ; cout << Niepoprawny znak << endl ; cout << Niepoprawny znak << endl ; cin >> znak; cin >> znak; cin >> znak; cin >> znak; } } } } Programowanie obiektowe 56 PÄ™tla do SkÅ‚adnia; do instrukcja; while (wyra\enie); PÄ™tla do" jest podobna do pÄ™tli while", z tÄ… ró\nicÄ…, \e warunek kontynuacji jest sprawdzany po wykonaniu instrukcji. Oznacza to, \e instrukcja wykona siÄ™ przynajmniej jeden raz. Programowanie obiektowe 57 PÄ™tla do PrzykÅ‚ad: { do cout << "ZakoÅ„czyć program? << endl; while (getchar() != T'); } Jak dziaÅ‚a powy\szy kod? Programowanie obiektowe 58 PÄ™tla for SkÅ‚adnia: for (wyra\enie1; wyra\enie2; wyra\enie3) instrukcja; PrzykÅ‚ad: int i; char txt[10]; for (i = 0; i < 10; i ++) txt[i] = 'A'; Jak dziaÅ‚a powy\szy kod? Programowanie obiektowe 59 PÄ™tla for SkÅ‚adnia: for (wyra\enie1; wyra\enie2; wyra\enie3) instrukcja; Wszystkie wyra\enia sÄ… opcjonalne. Wyra\enie1 jest obliczane przed wejÅ›ciem do pÄ™tli (tylko raz!). NastÄ™pnie oblicza siÄ™ wyra\enie2 i sprawdza czy jest ono ró\ne od 0. JeÅ›li tak, wykonywana jest instrukcja i obliczane jest wyra\enie3. NastÄ™pnie sprawdzana jest wartość wyra\enia2. PÄ™tla jest wykonywana a\ do momentu, gdy wartość wyra\enia2 bÄ™dzie równa 0. Wyra\enie3 jest zawsze obliczane po wykonaniu instrukcji. JeÅ›li wszystkie trzy wyra\enia w pÄ™tli for sÄ… puste (pÄ™tla postaci: for (;;) instrukcja; to jest to bezwarunkowa pÄ™tla nieskoÅ„czona. Instrukcja w pÄ™tli for mo\e nie wykonać siÄ™ ani razu, jeÅ›li wyra\enie2 bÄ™dzie od razu równe 0. PÄ™tla for mo\e być pÄ™tlÄ… nieskoÅ„czonÄ…, jeÅ›li wyra\enie2 nigdy nie przyjmie wartoÅ›ci 0. Wyra\enie1 bÄ™dzie zawsze obliczone (dokÅ‚adnie jeden raz). Programowanie obiektowe 60 Instrukcja Return Powoduje wyjÅ›cie z aktualnie wykonywanej funkcji. Instrukcja return mo\e wystÄ…pić w dowolnym miejscu w ciele funkcji. Instrukcja return mo\e być u\yta z podaniem wyra\enia lub bez. JeÅ›li wyra\enie zostanie podane, to jego wartość zostanie obliczona przed wyjÅ›ciem z funkcji i zwrócona na zewnÄ…trz. SkÅ‚adnia: return; lub return wyra\enie; Programowanie obiektowe 61 Instrukcja Return - przykÅ‚ad long silnia(int n) { long wynik; int i; if (n <= 0) return 1; wynik = 1; for (i = 1; i <= n; i++) wynik = wynik * i; return wynik; } Programowanie obiektowe 62 Instrukcja Return - przykÅ‚ad #include using namespace std; long silnia(int n) { long wynik; int i; if (n <= 0) return 1; wynik = 1; for (i = 1; i <= n; i++) wynik = wynik * i; return wynik; } int main(){ Program 1.9 int n; cout << "Podaj n" << endl; cin >> n; Jaki jest warunek wyjÅ›cia z pÄ™tli while(n) { (i zakoÅ„czenia obliczeÅ„)? cout << n << "! = " << silnia(n) << endl; cout << "Podaj n" << endl; cin >> n; } } Programowanie obiektowe 63 Instrukcja skoku SkÅ‚adnia: goto etykieta; Instrukcja skoku powoduje bezwarunkowe przekazanie sterowania do instrukcji poprzedzonej etykietÄ… EtykietÄ™ definiuje siÄ™ w dowolnym miejscu wewnÄ…trz funkcji, z której zostaÅ‚a wykonana instrukcja skoku SkÅ‚adnia: etykieta: Etykiet nie trzeba deklarować Programowanie obiektowe 64 Instrukcja skoku - przykÅ‚ad #include using namespace std; long silnia(int n) { long wynik=1; int i; if (n==0) return 1; for (i = 1; i <= n; i++) wynik = wynik * i; return wynik; } int main(){ int n; char znak; cout << "Podaj n" << endl; cin >> n; while(n) { if (n < 0) goto err; cout << n << "! = " << silnia(n) << endl; cout << "Podaj n" << endl; cin >> n; } return 0; err: cout << "Nie mozna obliczyc silni liczby mniejszej od 0!!!" ; cin >> znak; } Program 1.10 Programowanie obiektowe 65 Wprowadzenie do jÄ™zyka C++ Dynamiczny przydziaÅ‚ pamiÄ™ci (alokacja): w jÄ™zyku C: malloc() z biblioteki stdlib.h w jÄ™zyku C++ wbudowano nowy operator new, np. int *point; point = new int; *point = 999; w porównaniu z malloc() rozmiar przydzielanej pamiÄ™ci jest wyliczany automatycznie; Programowanie obiektowe 66 Wprowadzenie do jÄ™zyka C++ PrzykÅ‚ad u\ycia malloc() z sizeof() oraz new: rekurencyjna struct node { deklaracja char data; struktury struct node *nextPtr }; struct node *newPtr, newN; newPtr = malloc(sizeof(struct node)); newPtr = new node; newPtr ? (newPtr !=0) Dane nextPtr newPtr = new node(newN); newN.data newPtr (newPtr !=0) Dane nextPtr Programowanie obiektowe 67 Wprowadzenie do jÄ™zyka C++ Dynamiczne zwolnienie pamiÄ™ci: w jÄ™zyku C: free() z biblioteki stdlib.h, np. int *point; point = malloc(int); free(point); w jÄ™zyku C++ wbudowano nowy operator delete, np. delete point; usuwanie tablicy zaalokowanej dynamicznie: /* new tab[2]; */ delete [ ] tab; Programowanie obiektowe 68 Programowanie obiektowe 69