Wstep do Informatyki
Transkrypt
Wstep do Informatyki
Wstep ˛ do Informatyki Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 7 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 1 / 47 Historia C++ w wielkim skrócie Przed C++ istniał jezyk ˛ C. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 2 / 47 Historia C++ w wielkim skrócie Przed C++ istniał jezyk ˛ C. Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach Bella, w latach 70-tych XX wieku, a jego poprzednikiem był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 2 / 47 Historia C++ w wielkim skrócie Przed C++ istniał jezyk ˛ C. Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach Bella, w latach 70-tych XX wieku, a jego poprzednikiem był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. Jezyk ˛ C przeznaczony był głównie do pisania platform operacyjnych oraz aplikacji niższego rz˛edu. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 2 / 47 Historia C++ w wielkim skrócie Przed C++ istniał jezyk ˛ C. Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach Bella, w latach 70-tych XX wieku, a jego poprzednikiem był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. Jezyk ˛ C przeznaczony był głównie do pisania platform operacyjnych oraz aplikacji niższego rz˛edu. Pierwszy okres rozwoju jezyka ˛ C to lata 1969-1973. W szczególności w roku 1973 w jezyku ˛ C udało sie˛ zaimplementować jadro ˛ (ang. kernel) systemu operacyjnego Unix. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 2 / 47 Historia C++ w wielkim skrócie Przed C++ istniał jezyk ˛ C. Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach Bella, w latach 70-tych XX wieku, a jego poprzednikiem był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. Jezyk ˛ C przeznaczony był głównie do pisania platform operacyjnych oraz aplikacji niższego rz˛edu. Pierwszy okres rozwoju jezyka ˛ C to lata 1969-1973. W szczególności w roku 1973 w jezyku ˛ C udało sie˛ zaimplementować jadro ˛ (ang. kernel) systemu operacyjnego Unix. W roku 1978 Brian Kernighan i Dennis Ritchie opublikowali dokumentacje˛ jezyka: ˛ The C Programming Language (wydanie polskie, Jezyk ˛ ANSI C). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 2 / 47 Historia C++ w wielkim skrócie Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 3 / 47 Historia C++ w wielkim skrócie Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. W roku 1990 standard ANSI C został zmodyfikowany i nazwany C90. W roku 1999 standard C90 został zmodyfikowany i nazwany C99. W roku 2007 ogłoszono prace˛ nad nowym standardem C1X. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 3 / 47 Historia C++ w wielkim skrócie Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. W roku 1990 standard ANSI C został zmodyfikowany i nazwany C90. W roku 1999 standard C90 został zmodyfikowany i nazwany C99. W roku 2007 ogłoszono prace˛ nad nowym standardem C1X. W latach 1983-1985, w laboratoriach Bella, jezyk ˛ C został udoskonalony przez Bjarne Stroustrupa i nazwany jezykiem ˛ C++; C++ wzbogacił C o możliwość programowania obiektowego. C++ stał sie˛ jezykiem ˛ programowania powszechnego użytku, a jego wielka˛ zaleta˛ jest zgodność jego kodu źródłowego z kodem źródłowym jezyka ˛ C. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 3 / 47 Historia C++ w wielkim skrócie W październiku 1985 roku po raz pierwszy wydano komercyjna˛ wersje˛ jezyka ˛ C++. W tym samym roku Bjarne Stroustrup opublikował ksiażk˛ ˛ e:“The C++ Programming Language”. Mimo uniwersalności jezyka ˛ C++, dopiero w latach 90-tych XX wieku został uznany jako jeden z najbardziej popularnych jezyków ˛ ogólnego użytku. C++ poczatkowo ˛ był głównie przeznaczony dla systemów UNIX. Wciaż ˛ jezyk ˛ ten jest udoskonalany - wprowadzane sa˛ poprawki ułatwiajace ˛ prace informatyków, a obecnie obowiazujacy ˛ stndard to: ISO/IEC 14882:2011. Oficjalna strona T HE C++ S TANDARDS C OMMITTEE: http://www.open-std.org/jtc1/sc22/wg21/. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 4 / 47 Literatura podstawowa: Prata Stephen. “Szkoła programowania. Jezyk ˛ C++. Wydanie V”. Helion, 2006. Andrzej Stasiewicz. “C++. Ćwiczenia praktyczne. Wydanie III”. Helion , 2011. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 5 / 47 Wprowadzenie Program w C++ to zbiór funkcji, a każda funkcja to zbiór instrukcji. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 6 / 47 Wprowadzenie Program w C++ to zbiór funkcji, a każda funkcja to zbiór instrukcji. Program w C++ to plik (zbiór) tekstowy, który zawiera instrukcje jezyka ˛ C++ (czyli ciagi ˛ znaków), zgodne z obowiazuj ˛ acym ˛ standardem tego jezyka. ˛ Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 6 / 47 1 2 3 4 Wprowadzenie Program w C++ to zbiór funkcji, a każda funkcja to zbiór instrukcji. Program w C++ to plik (zbiór) tekstowy, który zawiera instrukcje jezyka ˛ C++ (czyli ciagi ˛ znaków), zgodne z obowiazuj ˛ acym ˛ standardem tego jezyka. ˛ Plik zawierajacy ˛ program w jezyku C++ powinien mieć rozszerzenie cpp (typowe dla kompilatorów firmy Microsoft, Borland) lub CC (typowe dla kompilatorów firmy Sun) lub cc. Najproszy program w C++ i n t main ( ) { return 0; } // // // // naglowek f u n k c j i g l o w n e j poczatek t r e s c i f u n k c j i k o n i e c f u n k c j i main ( ) koniec t r e s c i f u n k c j i Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 6 / 47 Kompilacja programu w C++ Podstawowym (i najprostszym) poleceniem kompilacji pliku o nazwie plik.cc (lub plik.cpp, plik.CC) jest g++ plik.cc g++ plik.CC g++ plik.cpp które w przypadku pomyślnym generuje plik wykonywalny o nazwie a.out umieszczony w tym samym katalogu, zaś w przypadku niepomyślnym wyświetla liste˛ komunikatów o błedach. ˛ Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 7 / 47 Kompilacja programu w C++ Jeśli chcemy, żeby plik wynikowy miał dowolna˛ inna˛ ustalona˛ przez nas nazwe˛ (rozszerzenie out nie jest obowiazkowe), ˛ możemy użyć polecenia postaci: g++ plik.cc -o plik_wynikowy Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 8 / 47 Kompilacja programu w C++ Jeśli chcemy, żeby plik wynikowy miał dowolna˛ inna˛ ustalona˛ przez nas nazwe˛ (rozszerzenie out nie jest obowiazkowe), ˛ możemy użyć polecenia postaci: g++ plik.cc -o plik_wynikowy Aby kompilator g++ traktował ostrzeżenia jako błedy ˛ należy użyć nastepuj ˛ acego ˛ polecenia: g++ -Wall plik.cc -o plik_wynikowy Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 8 / 47 Kompilacja programu w C++ Jeśli chcemy, żeby plik wynikowy miał dowolna˛ inna˛ ustalona˛ przez nas nazwe˛ (rozszerzenie out nie jest obowiazkowe), ˛ możemy użyć polecenia postaci: g++ plik.cc -o plik_wynikowy Aby kompilator g++ traktował ostrzeżenia jako błedy ˛ należy użyć nastepuj ˛ acego ˛ polecenia: g++ -Wall plik.cc -o plik_wynikowy Polecenie g++ umożliwia również jednoczesna˛ kompilacje˛ i połaczenie ˛ w całość kilku plików źródłowych zawierajacych ˛ różne fragmenty (ale nie dowolne) jednego programu. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 8 / 47 Kompilacja programu w C++ Jeśli chcemy, żeby plik wynikowy miał dowolna˛ inna˛ ustalona˛ przez nas nazwe˛ (rozszerzenie out nie jest obowiazkowe), ˛ możemy użyć polecenia postaci: g++ plik.cc -o plik_wynikowy Aby kompilator g++ traktował ostrzeżenia jako błedy ˛ należy użyć nastepuj ˛ acego ˛ polecenia: g++ -Wall plik.cc -o plik_wynikowy Polecenie g++ umożliwia również jednoczesna˛ kompilacje˛ i połaczenie ˛ w całość kilku plików źródłowych zawierajacych ˛ różne fragmenty (ale nie dowolne) jednego programu. Do przeprowadzania bardziej skomplikowanych kompilacji i łacze ˛ ń zalecany jest program make współpracujacy ˛ z zawierajacym ˛ polecenia dla niego plikiem Makefile – o tym na wykładach z programowania proceduralnego. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 8 / 47 Kompilacja programu w C++ W przypadku pomyślnego przebiegu kompilacji kompilator g++ nie wyświetla żadnego komunikatu, zwraca jedynie sterowanie do linii poleceń. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 9 / 47 Kompilacja programu w C++ W przypadku pomyślnego przebiegu kompilacji kompilator g++ nie wyświetla żadnego komunikatu, zwraca jedynie sterowanie do linii poleceń. W przypadku błedów ˛ kompilator g++ wyprowadza na standardowe wyjście błedów ˛ (czyli zazwyczaj na ekran) od razu cała˛ liste˛ wykrytych błedów ˛ wraz z podanymi numerami linii programu, w których wystepuj ˛ a. ˛ Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 9 / 47 Kompilacja programu w C++ odrobaczanie/debugowanie, ang. debugging Aby kompilator g++ przekazał informacje o komilowanym programie do programu debugujacego ˛ gdb należy użyć nastepuj ˛ acego ˛ polecenia: g++ -g -Wall plik.cc -o nazwa Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 10 / 47 Kompilacja programu w C++ odrobaczanie/debugowanie bws@bozenka:~/programy$ g++ -g cout.cc -o 1 bws@bozenka:~/programy$ gdb 1 GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see: <http://bugs.launchpad.net/gdb-linaro/>... Reading symbols from /home/bws/programy/1...done. (gdb) r Starting program: /home/bws/programy/1 Zabaw sie jezykiem C++. Nie pozalujesz! [Inferior 1 (process 3174) exited normally] (gdb) q bws@bozenka:~/programy$ Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 11 / 47 Kompilacja programu w C++ - używanie gdb break linenumber - utwórz punkt zatrzymania programu w linii “linenumber” break file:linenumber - utwórz punkt zatrzymania programu w linii “linenumber” pliku “file”. run lub r - uruchom program c - kontynuuj wykonywanie next lub n - wykonaj nastepna ˛ linie˛ step - wykonaj nastepna ˛ linie˛ lub wejdź do funkcji quit lub q - wyjście z programu gdb print expression lub p expression - drukuj bieżaca ˛ wartość wyrażenia “expression” help lub h- help programu Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 12 / 47 Kompilacja programu w C++ - używanie gdb bws@bozenka:~/programy$ gdb 1 ... Reading symbols from /home/bws/programy/1...done. (gdb) break 2 Breakpoint 1 at 0x804861d: file cout.cc, line 2. (gdb) r Starting program: /home/bws/programy/1 Breakpoint 1, main () at cout.cc:5 5 cout << "Zabaw sie jezykiem C++."; (gdb) n 6 cout << endl; (gdb) next Zabaw sie jezykiem C++. 7 cout << "Nie pozalujesz!" << endl; (gdb) c Continuing. Nie pozalujesz! [Inferior 1 (process 3326) exited normally] (gdb) q bws@bozenka:~/programy$ Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki # i n c l u d e < iostream > i n t main ( ) { u s i n g namespace s t d ; c o u t << " Zabaw s i e j e z y k i e m C+ + . " ; c o u t << e n d l ; c o u t << " Nie p o z a l u j e s z ! " << e n d l ; return 0; } Wykład 7 13 / 47 Debugowanie pamieci ˛ - program valgrind bws@bozenka:~/programy$ valgrind ./1 ==3486== Memcheck, a memory error detector ==3486== Copyright (C) 2002-2010, and GNU GPL’d, by Julian Seward et al. ==3486== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info ==3486== Command: ./1 ==3486== Zabaw sie jezykiem C++. Nie pozalujesz! ==3486== ==3486== HEAP SUMMARY: ==3486== in use at exit: 0 bytes in 0 blocks ==3486== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==3486== ==3486== All heap blocks were freed -- no leaks are possible ==3486== ==3486== For counts of detected and suppressed errors, rerun with: -v ==3486== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 6) bws@bozenka:~/programy$ Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 14 / 47 Debugowanie pamieci ˛ - program valgrind bws@bws:~/programy$ valgrind ls ==13217== Memcheck, a memory error detector ==13217== Copyright (C) 2002-2009, and GNU GPL’d, by Julian Seward et al. ==13217== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info ==13217== Command: ls ==13217== p0.c p1 p1.c p2.c ==13217== ==13217== HEAP SUMMARY: ==13217== in use at exit: 19,194 bytes in 11 blocks ==13217== total heap usage: 538 allocs, 527 frees, 83,869 bytes allocated ==13217== ==13217== LEAK SUMMARY: ==13217== definitely lost: 120 bytes in 1 blocks ==13217== indirectly lost: 0 bytes in 0 blocks ==13217== possibly lost: 0 bytes in 0 blocks ==13217== still reachable: 19,074 bytes in 10 blocks ==13217== suppressed: 0 bytes in 0 blocks ==13217== Rerun with --leak-check=full to see details of leaked memory ==13217== ==13217== For counts of detected and suppressed errors, rerun with: -v ==13217== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 15 / 47 Struktura pliku źródłowego .cc /* Rozpocznij od komentarza zawierajacego ˛ opis zawartości pliku */ Dyrektywy #include – dołaczanie ˛ (standardowych) bibliotek Inne definicje dla preprocessora Prototypy funkcji, deklaracje zmiennych i klas Definicja funkcji main() { Ciało funkcji main } Definicje pozostałych funkcji i klas Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 16 / 47 Komentarze Jednoliniowy: // komentarz jednoliniowy Wieloliniowy: /* To jest komentarz wieloliniowy Druga linia Trzecia linia */ Ignorowane przez kompilator Moga˛ wystapić ˛ prawie wsz˛edzie. Komentarze wileoliniowe nie moga˛ być zagnieżdżane. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 17 / 47 Najprostszy program w C++ i n t main ( ) { return 0; } // // // // Bożena Woźna-Szcześniak (AJD) naglowek f u n k c j i g l o w n e j poczatek t r e s c i f u n k c j i k o n i e c f u n k c j i main ( ) koniec t r e s c i f u n k c j i Wstep ˛ do Informatyki Wykład 7 18 / 47 Dyrektywa #include Dyrektywa #include < standardowy zbiór nagłówkowy > lub #include “ zbiór nagłówkowy w bieżacym ˛ katalogu programisty ” wczytuje/dołacza ˛ do programu zawartość zbioru nagłówkowego, np. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 19 / 47 Dyrektywa #include Dyrektywa #include < standardowy zbiór nagłówkowy > lub #include “ zbiór nagłówkowy w bieżacym ˛ katalogu programisty ” wczytuje/dołacza ˛ do programu zawartość zbioru nagłówkowego, np. #include <iostream> dołacza ˛ do programu zbiór iostream zawierajacy ˛ podstawowe funkcje wejścia/wyjścia Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 19 / 47 Nazwy plików nagłówkowych Kompilatory C++ zawsze sa˛ dostarczane wraz z szeregiem plików nagłówkowych, z których każdy obsługuje pewna˛ grupe˛ narz˛edzi. Zgodnie z tradycja˛ jezyka ˛ C plikom nagłówkowym nadawano rozszerzenie .h. Na przykład plik nagłówkowy C math.h zawierał deklaracje funkcji matematycznych. Poczatkowo ˛ w C++ sytuacja wygladała ˛ tak samo, ale ostatnio zmieniono to. Obecnie rozszerzenie .h zachowano dla starszych plików nagłówkowych C (które moga˛ być cały czas używane), natomiast pliki nagłówkowe samego C++ nie maja˛ rozszerzenia w ogóle. Istnieja˛ też pliki nagłówkowe C, które zostały zamienione na pliki nagłówkowe C++. Plikom tym zmieniono nazwe, ˛ odrzucajac ˛ rozszerzenie .h oraz poprzedzajac ˛ ich nazwy litera˛ c (od jezyka ˛ C). Na przykład w C++ staremu plikowi nagłówkowemu math.h odpowiada plik cmath. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 20 / 47 Wejście i wyjście w C++ W jezyku ˛ C++ do obsługi wejścia i wyjścia konieczne jest dodanie dwóch nastepuj ˛ acych ˛ wierszy: #include <iostream> using namespace std; # i n c l u d e < iostream > i n t main ( ) { u s i n g namespace s t d ; c o u t << " Zabaw s i e j e z y k i e m C+ + . " ; c o u t << e n d l ; c o u t << " Nie p o z a l u j e s z ! " << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) // // // // // // // // // Wstep ˛ do Informatyki dyrektywa PREPROCESORA naglowek f u n k c j i poczatek t r e s c i f u n k c j i uwidocznienie d e f i n i c j i komunikat zaczynamy nowy w i e r s z k o l e j n y komunikat k o n i e c f u n k c j i main ( ) koniec t r e s c i f u n k c j i Wykład 7 21 / 47 Wejście i wyjście w C++ W C++ można używać funkcji wyjścia/wejścia z jezyka ˛ Cprintf(),scanf() i im podobnych - wystarczy w tym celu dołaczyć ˛ standardowy nagłówek jezyka ˛ C - stdio.h. #include <cstdio > i n t main ( ) { p r i n t f ( " Zabaw s i e j e z y k i e m C + + . " ) ; printf ("\n"); p r i n t f ( " Nie p o z a l u j e s z ! \ n " ) ; return 0; } Bożena Woźna-Szcześniak (AJD) // // // // // // // // dyrektywa PREPROCESORA naglowek f u n k c j i poczatek t r e s c i f u n k c j i komunikat zaczynamy nowy w i e r s z k o l e j n y komunikat k o n i e c f u n k c j i main ( ) koniec t r e s c i f u n k c j i Wstep ˛ do Informatyki Wykład 7 22 / 47 Przestrzenie nazw Przestrzeń nazw to nowa cecha jezyka ˛ C++, która ma pomagać pisać programy składajace ˛ sie˛ z kodu pochodzacego ˛ od różnych dostawców. Trzeba sie˛ liczyć z tym, że w dwóch nabytych pakietach moga˛ istnieć tak samo nazywajace ˛ sie˛ funkcje, np. funkcja wanda(). Jeśli użyjemy funkcji wanda(), kompilator nie bedzie ˛ wiedział, o która˛ nam chodzi. Przestrzeń nazw pozwala zgrupować ze soba˛ wszystkie moduły jednego dostawcy i rozwiazać ˛ problem z wanda˛ :). Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 23 / 47 Przestrzenie nazw Załóżmy, że firma Kowalski umieszcza swoje definicje w przestrzeni nazw Kowalski. Wtedy ich funkcja wanda() bedzie ˛ sie˛ nazywała Kowalski::wanda(). Analogicznie przestrzeń nazw Nowak może również zawierać funkcje˛ wanda(), ale w tym przypadku funkcja ta bedzie ˛ nazywała sie˛ Nowak::wanda(). Mojac ˛ do dyspozycji dwie przestrzenie nazw Kowalski i Nowak, program bedzie ˛ mógł używać obu funkcji: Kowalski::wanda(”Wand to ta co nie chciała ...”; // funkcja z przestrzeni nazw Kowalski Nowak::wanda(”Nowak & Nowak”); // funkcja z przestrzeni nazw Nowak Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 24 / 47 Standardowa przestrzeń nazw Klasy, funkcje i zmienne bed ˛ ace ˛ standardowymi składnikami kompilatora C++ trafiły do przestrzeni nazw std Dzieje sie˛ tak w wersjach plików nagłówkowych nieposiadajacych ˛ rozszerzeń. Na przykład, zmienna cout używana do przekazywania danych na zewnatrz, ˛ zdefiniowana w iostream, tak naprawde˛ nazywa sie˛ std::cout, zmienna cin używana do pobierania danych z zewnatrz ˛ to tak naprawde˛ std::cin, a manipulator endl stosowany do wprowadzania nowego wiersza, to tak naprawde˛ std::endl. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 25 / 47 Standardowa przestrzeń nazw #include <iostream> int main() { std::cout << "Zabawe C++ czas zaczac !"; std::cout << std::endl; std::cout << "Zobzczysz spodoba Ci si˛ e!" << std::endl; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 26 / 47 Dyrektywa using Aby używać nazw z przestrzeni std bez dopisywania przedrostka std::, wystarczy napisać poniższa˛ instrukcje: ˛ using namespace std; Dyrektywa using powoduje bowiem, że wszystkie nazwy z przestrzeni std staja˛ sie˛ dostepne. ˛ Obecnie przyjmuje sie, ˛ że jest to podejście zbyt wygodnickie; należy raczej udostepnić ˛ te nazwy, których bedziemy ˛ później używać, stosujac ˛ inna˛ forme˛ dyrektywy using: using std::cout; // udostepnienie ˛ cout using std::endl; // udostepnienie ˛ endl using std::cin; // udostepnienie ˛ cin Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 27 / 47 #include <iostream> int main() { using namespace std; cout << "Zabaw˛ e z C++ czas zaczać ˛ !"; cout << endl; cout << "Nie pożałujesz!" << endl; return 0; } albo #include <iostream> int main() { using std::cout; using std::endl; cout << "Zabaw˛ e z C++ czas zaczać ˛ !"; cout << endl; cout << "Nie pożałujesz!" << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 28 / 47 Standardowe typy danych Typ logiczny: bool. Typ znakowy: char. Typy całkowite: short, unsigned short, int, unsigned int, long, unsigned long, long int, unsigned long int, long long, unsigned long long. Typy rzeczywiste: float, double, long double Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 29 / 47 Standardowe typy danych - wielkości wg. gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) bool = 1B char = 1B short = 2B unsigned short = 2B int = 4B unsigned int = 4B long = 4B unsigned long = 4B long int= 4B unsigned long int= 4B long long = 8B unsigned long long = 8B float = 4B double = 8B long double= 12B Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 30 / 47 Standardowe typy danych # i n c l u d e < iostream > u s i n g namespace s t d ; i n t main ( ) { cout < <" b o o l = "<< s i z e o f ( b o o l ) < <"B"<< e n d l ; cout < <" char = "<< s i z e o f ( char ) < <"B"<< e n d l ; cout < <" s h o r t = "<< s i z e o f ( s h o r t ) < <"B"<< e n d l ; cout < <" unsigned s h o r t = "<< s i z e o f ( unsigned s h o r t ) < <"B"<< e n d l ; cout < <" i n t = " << s i z e o f ( i n t ) < <"B"<< e n d l ; cout < <" unsigned i n t = "<< s i z e o f ( unsigned i n t ) < <"B"<< e n d l ; cout < <" l o n g = " << s i z e o f ( l o n g ) < <"B"<< e n d l ; cout < <" unsigned l o n g = "<< s i z e o f ( unsigned l o n g ) < <"B"<< e n d l ; cout < <" l o n g i n t = "<< s i z e o f ( l o n g i n t ) < <"B"<< e n d l ; cout < <" unsigned l o n g i n t = "<< s i z e o f ( unsigned l o n g i n t ) < <"B"<< e n d l ; cout < <" l o n g l o n g = "<< s i z e o f ( l o n g l o n g ) < <"B"<< e n d l ; cout < <" unsigned l o n g l o n g = "<< s i z e o f ( unsigned l o n g l o n g ) < <"B"<< e n d l ; cout < <" f l o a t = "<< s i z e o f ( f l o a t ) < <"B"<< e n d l ; cout < <" double = "<< s i z e o f ( double ) < <"B"<< e n d l ; cout < <" l o n g double= "<< s i z e o f ( l o n g double ) < <"B"<< e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 31 / 47 Definicje zmiennych Zanim zmienna zostanie użyta musi zostać zdefiniowana: i n t main ( ) { bool b ; char c ; s h o r t s1 , s2 , s3 ; / / l i s t a zmiennych unsigned s h o r t u s i ; i n t i1 , i 2 ; / / l i s t a zmiennych unsigned i n t u i ; long l ; unsigned l o n g u l i ; long long l l i ; unsigned l o n g l o n g u l l ; float f ; double d1 ; l o n g double l d , l d 2 ; / / l i s t a zmiennych return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 32 / 47 Definicje zmiennych dla standardowych typów połaczone ˛ z inicjalizacja. ˛ i n t main ( ) { b o o l b =1; char c = ’ a ’ ; s h o r t s1 = 1 , s2 = 2 , s3 = 3 ; / / l i s t a zmiennych unsigned s h o r t u s i = 3 ; i n t i 1 = 1 , i 2 = −2; / / l i s t a zmiennych unsigned i n t u i = 2 ; l o n g l = −20; unsigned l o n g u l i = 2 0 ; l o n g l o n g l l i = −33; unsigned l o n g l o n g u l l = 3 3 ; f l o a t f = 3.14; double d1 = 3 . 1 4 ; l o n g double l d = 3 . 1 4 ; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 33 / 47 Wyprowadzanie danych różnych typów #include <iostream> using namespace std; int main(void) { int i = 34; cout << "i = "; cout << i; cout << "\n"; long long l = 100000; cout << "l = " << l << "\n"; float f = 321.434; cout << "f = " << f << "\n"; double d = 321.434; cout << "d = " << d << "\n"; char c = ’a’; cout << "c = " << c << "\n"; const char *wc = "napis"; cout << "wc = " << wc << "\n"; string s = "napis w C++"; cout << "s = " << s << "\n"; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 34 / 47 #include <iostream> #include <iomanip> using namespace std; int main(void) { float f = 321.434; cout << "f = " << f << endl; cout << "f = " << setw(10) << f << endl; double d = 321.434; cout << "d = " << d << endl; cout << "d = " << setw(10)<< d << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 35 / 47 Operatory arytmetyczne # i n c l u d e < iostream > u s i n g namespace s t d ; i n t main ( ) { i n t a = 100 , b = 2 , c =25 , d = 4 , r e s u l t ; r e s u l t = a − b ; / / odejmowanie c o u t << " a − b = " << r e s u l t << e n d l ; r e s u l t = b ∗ c ; / / mnozenie c o u t << " b ∗ c = " << r e s u l t << e n d l ; result = a / c ; / / dzielenie c o u t << " a / c = " << r e s u l t << e n d l ; result = a + b ∗ c; // priorytety c o u t << " a + b ∗ c = " << r e s u l t << e n d l ; result = a ∗ b + c ∗ d; // priorytety c o u t << " a ∗ b + c ∗ d = " << r e s u l t << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 36 / 47 Wyniki a b a a a * / + * b c c b b = = = * + 98 50 4 c = 150 c * d = 300 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 37 / 47 Operatory arytmetyczne i wprowadzanie danych # i n c l u d e < iostream > u s i n g namespace s t d ; i n t main ( ) { int a, b, c , d, result ; c o u t << " Podaj 4 l i c z b y : " ; c i n >> a >> b >> c >> d ; r e s u l t = a − b ; / / odejmowanie c o u t << a << " −" << b << "= " << r e s u l t << e n d l ; r e s u l t = b ∗ c ; / / mnozenie c o u t << b << " ∗ " << c << "= " << r e s u l t << e n d l ; result = a / c ; / / dzielenie c o u t << a << " / " << c << "= " << r e s u l t << e n d l ; result = a + b ∗ c; // priorytety c o u t << a << " + " << b << " ∗ " << c << " = " << r e s u l t << e n d l ; result = a ∗ b + c ∗ d; // priorytety c o u t << a << " ∗ " << b << " + " << c << " ∗ " << d << " = " << r e s u l t << e n d l ; c o u t << " a ∗ b + c ∗ d = " << r e s u l t << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 38 / 47 Wyniki Podaj 4 liczby: 3 5 7 9 3-5= -2 5*7= 35 3/7= 0 3+5*7 = 38 3*5+7*9=78 a * b + c * d = 78 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 39 / 47 Operatory arytmetyczne i wprowadzanie danych #include <iostream> int main() { using namespace std; int carrots; cout << "Ile masz marchewek?" << endl; cin >> carrots; cout << "Prosz˛ e, oto jeszcze dwie. "; carrots = carrots + 2; cout << "Teraz masz " << carrots << " marchewek." << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 40 / 47 Operatory przypisania a=b=c=d=3; Znaczy tyle samo, co a=3; b=3; c=3; d=3; Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 41 / 47 Operatory przypisania Operator += −= ∗= /= %= Bożena Woźna-Szcześniak (AJD) Znaczenie a+ = b znaczy a = a + b a− = b znaczy a = a − b a∗ = b znaczy a = a ∗ b a/ = b znaczy a = a/b a% = b znaczy a = a%b Wstep ˛ do Informatyki Wykład 7 42 / 47 Operatory przypisania #include <iostream> int main() { using namespace std; int carrots; cout << "Ile masz marchewek?" << endl; cin >> carrots; cout << "Prosz˛ e, oto jeszcze dwie. "; carrots += 2; cout << "Teraz masz " << carrots << " marchewek." << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 43 / 47 Operator dekrementacji # i n c l u d e < iostream > u s i n g namespace s t d ; i n t main ( ) { i n t a = 3; c o u t << a << " \ t " ; / / dekrementacja przedrostkowa n a j p i e r w zmniejsz , / / potem u z y j c o u t << −−a << " \ t " ; c o u t << a << " \ t " ; / / dekrementacja p r z y r o s t k o w a n a j p i e r w u z y j , / / potem z m i e j s z c o u t << a−− << " \ t " ; c o u t << a << " \ t " ; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 44 / 47 Operator dekrementacji # i n c l u d e < iostream > u s i n g namespace s t d ; i n t main ( ) { i n t a = 3; c o u t << a << " \ t " ; / / dekrementacja przedrostkowa n a j p i e r w zmniejsz , / / potem u z y j c o u t << −−a << " \ t " ; c o u t << a << " \ t " ; / / dekrementacja p r z y r o s t k o w a n a j p i e r w u z y j , / / potem z m i e j s z c o u t << a−− << " \ t " ; c o u t << a << " \ t " ; return 0; } Wynik: 3 2 2 2 1 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 44 / 47 Operator dekrementacji # i n c l u d e < iostream > u s i n g namespace s t d ; i n t main ( ) { i n t a = 3; c o u t << a << " \ t " ; / / dekrementacja przedrostkowa n a j p i e r w zmniejsz , / / potem u z y j c o u t << ++a << " \ t " ; c o u t << a << " \ t " ; / / dekrementacja p r z y r o s t k o w a n a j p i e r w u z y j , / / potem z m i e j s z c o u t << a++ << " \ t " ; c o u t << a << " \ t " ; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 45 / 47 Operator dekrementacji # i n c l u d e < iostream > u s i n g namespace s t d ; i n t main ( ) { i n t a = 3; c o u t << a << " \ t " ; / / dekrementacja przedrostkowa n a j p i e r w zmniejsz , / / potem u z y j c o u t << ++a << " \ t " ; c o u t << a << " \ t " ; / / dekrementacja p r z y r o s t k o w a n a j p i e r w u z y j , / / potem z m i e j s z c o u t << a++ << " \ t " ; c o u t << a << " \ t " ; return 0; } Wynik: 3 4 4 4 5 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 45 / 47 #include <iostream> int main() { using namespace std; int marchewka = 25; cout <<"Mam "<< marchewka <<" marchewek."<< endl; marchewka = marchewka - 1; cout <<"Chrum. Teraz mam "<< marchewka <<" marchewki."<< endl; marchewka -= 1; cout <<"Chrum. Teraz mam "<< marchewka <<" marchewki."<< endl; marchewka--; cout <<"Chrum. Teraz mam "<< marchewka <<" marchewki."<< endl; --marchewka; cout <<"Chrum. Teraz mam "<< marchewka <<" marchewki."<< endl; cout <<"Chrum. Teraz mam "<< marchewka-- <<" marchewki."<< endl; cout <<"Chrum. Teraz mam "<< --marchewka <<" marchewki."<< endl; return 0; } Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 7 46 / 47