Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik
Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest osiągnięcie łącznie 41 punktów, w tym co najmniej 30% punktów z każdej grupy zadań sprawdzających założone dla tego przedmiotu efekty kształcenia oraz zdanie egzaminu. Lista efektów kształcenia w karcie przedmiotu dostępnej na stronie: http://157.158.16.139/js/wyklady/is2/is2.html Punkty: 1 Laboratorium Aktywność - 10 punktów Dwa sprawdziany praktyczne - po 10 punktów Projekt - 30 punktów 2 Egzamin - 40 punktów (15 punktów - min.) W tym semestrze projekt jest realizowany zespołowo! Nieprzekraczalny termin oddania projektu - 3 lipiec 2015.
Literatura Bjarne Stroustrup, Język C++. Kompendium wiedzy, Helion, Gliwie 2014 Bjarne Stroustrup, Programowanie. Teoria i praktyka z wykorzystaniem C++, Helion, Gliwice 2010 S. Lippman, J. Lajoie, Podstawy języka C++, WNT, Warszawa 2001 P. J. Plauger, Biblioteka standardowa C++, WNT, Warszawa 1997 A. Langer, K. Kreft, C++ Biblioteka IOStreams i lokalizacje programów, Helion, Gliwice 2005
Literatura uzupełniająca Adam Majczak, C++ Przykłady praktyczne, Mikom, Warszawa 2003 S. Lippman, Istota języka C++, WNT, Warszawa 2004 J. Viega, M. Messier, C i C++ Bezpieczne programowanie. Receptury, Helion, Gliwice 2005 B. W. Kernighan, D. M. Ritchie, Język ANSI C, WNT, Warszawa 2000
Historia 1970 1972 - język C, Dennis Ritchie - Bell Laboratories 1983 - język C++, Bjarne Stroustrup - AT&T Bell Laboratories 1988 - ogłoszenie standardu ANSI C 1989 1998 - proces standaryzacji języka C++ 1998 - standard języka C++ w postaci ISO/IEC 14882, zwany jako ANSI C++. Zawiera zestaw abstrakcji znany pod nazwą biblioteki standardowej C++. 2003 - poprawki w standardzie (ISO/IEC 14882:2003) sierpień 2011 - poprawki w standardzie, tzw. C++11 (ISO/IEC 14882:2011) grudzień 2014 - poprawki w standardzie, tzw. C++14 (ISO/IEC 14882:2014(E))
Historia 1970 1972 - język C, Dennis Ritchie - Bell Laboratories 1983 - język C++, Bjarne Stroustrup - AT&T Bell Laboratories 1988 - ogłoszenie standardu ANSI C 1989 1998 - proces standaryzacji języka C++ 1998 - standard języka C++ w postaci ISO/IEC 14882, zwany jako ANSI C++. Zawiera zestaw abstrakcji znany pod nazwą biblioteki standardowej C++. 2003 - poprawki w standardzie (ISO/IEC 14882:2003) sierpień 2011 - poprawki w standardzie, tzw. C++11 (ISO/IEC 14882:2011) grudzień 2014 - poprawki w standardzie, tzw. C++14 (ISO/IEC 14882:2014(E)) STL (Standard Template Library) - początkowo rozwijana jako niezależna biblioteka przez firmę Hewlett Packard
Pierwsze kroki (1) #include <iostream> using namespace std; int main() cout << "Hello" << endl; return 0;
Elementy biblioteki standardowej z C Aby skorzystać w języku C++ z elementów biblioteki standardowej języka C musimy dołączyć plik nagłówkowy o nazwie poprzedzonej literą c. #include <cstring> #include <ctime> #include <cmath> #include <cstdlib>
Pierwsze kroki (2) #include <iostream> #include <cstdlib> int main() std::cout << "Hello\n" << std::endl; system("pause"); return 0;
Komentarze // Komentarz do końca linii /* Komentarz wieloliniowy Brak zagnieżdżeń...... koniec bloku komentarza */
Typy wbudowane danych char int float double - typ znakowy - typ całkowitoliczbowy, - typ zmiennoprzecinkowy, - typ zmiennoprzecinkowy podwójnej precyzji, bool - typ boolowski, przyjmuje wartości: true, false. Nie występuje w ANSI C. Słowa kluczowe: short, long, unsigned
Sposoby definiowania obiektów danych W dowolnym miejscu kodu: int liczba; int liczba = 2; int liczba1 = 0, liczba2 = -2; int liczba3( 5 ); int liczba4( liczba3 );
Liczby zespolone #include <complex>... complex <double> moja( 2.1, 3.0 ); moja.real(3); moja.imag(9); cout << "z=" << moja.real() << "+" << moja.imag() << "i" << endl; cout << "z=" << moja << endl; // z=(3,9)
Liczby zespolone complex <double> z( 2, -3.5 ), w( 1, 1 ), x; x = z + w; cout << x << endl; x = z * w; cout << x << endl; x += 5; cout << x << endl; if( z == x ) cout << "Rowne" << endl; if( z == complex<double>(0,0) ) cout << "Otrzymalismy zero" << endl;
Przykład #include <iostream> #include <cstdlib> using namespace std; int main() int a = 0, b = 0; cout << "Podaj liczby:" << endl; cin >> a >> b; cout << "Suma wynosi: " << a+b << endl; system("pause"); return 0;
Deklaracje wyliczeń enum a, b, c=0 ; enum d, e, f=e+2 ; a=0, b=1, c=0, d=0, e=1, f=3 Wyliczenie definiuje nowy typ o wartościach całkowitych: enum Kolor CZERWONY, ZIELONY, NIEBIESKI=10, CZARNY; // wartości: 0, 1, 10, 11 Kolor kol = CZERWONY; kol = 1; // jest niepoprawne int n = kol; // poprawne kol = Kolor(10); // ustawia na NIEBIESKI
Blok int main() int i = 5; int i = 1; cout << i << endl; //zwraca 1 cout << i << endl; //zwraca 5 system("pause"); return 0;
Zasięg zmiennych Nazwa: - lokalna - zadeklarowana wewnątrz funkcji ma zasięg od punktu deklaracji do końca bloku, - globalna - zadeklarowana poza funkcją lub klasą, ma zasięg od punktu deklaracji do końca pliku. int x = 5; //globalne x void f() int i = 1; //lokalne i cout << x << endl; //jest dostęp do x
Zasłanianie nazw zmiennych int x = 5; //globalne x void f() int x = 1; //lokalne x zasłania globalne cout << x << endl; //zwraca 1
Zasłanianie nazw zmiennych int x = 5; //globalne x void f() int x = 1; //lokalne x zasłania globalne cout << x << endl; //zwraca 1 int x = 5; //globalne x void f() int x = 1; //lokalne x ::x = 2; //ustawiamy globalne x Powinno się unikać zasłaniania nazw.
Zmienne statyczne Zmienne statyczne - mają stałą lokalizację w pamięci, którą otrzymują w chwili uruchomienia programu. Zmienne statyczne, które nie zostały jawnie zainicjowane w programie otrzymują po zadeklarowaniu wartość zero (dla typów wbudowanych). void f( void ) static int licznik = 0; licznik++; cout << "Funkcja byla wywolana "; cout << licznik << "razy.";...
Czas życia zmiennych Obiekty są tworzone w chwili napotkania definicji i niszczone, gdy ich nazwa opuszcza zasięg. Obiekty globalne i statyczne żyją do końca programu. void f( void ) int t[] = 1, 2, 3; //tablica tworzona przy każdym wywołaniu f()... //po zakończeniu funkcji usunięta z pamięci
Funkcje Deklaracja (function prototype): typ zwracany nazwa funkcji( argumenty formalne ); int oblicz( int, int );
Funkcje Deklaracja (function prototype): typ zwracany nazwa funkcji( argumenty formalne ); int oblicz( int, int ); Definicja - zawiera treść: int oblicz( int a, int b ) return a + b;
Funkcje Deklaracja (function prototype): typ zwracany nazwa funkcji( argumenty formalne ); int oblicz( int, int ); Definicja - zawiera treść: int oblicz( int a, int b ) return a + b; Wywołanie funkcji: int z, a = 1; z = oblicz( 3, a );
Funkcje - przeciążanie int oblicz( int, int ); int oblicz( int ); void oblicz( void );
Funkcje - przeciążanie int oblicz( int a, int b ) return a + b; int oblicz( int a ) return a+5; void oblicz( void ) cout << "inna wersja" << endl;
Funkcje - przeciążanie cout << oblicz( 2, 3 ) << endl; // zwraca 5 cout << oblicz( 2 ) << endl; // zwraca 7 oblicz(); //wypisuje napis: "inna wersja"
Funkcje - argumenty domyślne Deklaracja: int wylicz( int, int = 1 ); Definicja: int wylicz( int a, int b ) //nie powielamy wartości domyślnych return a + b; Wywołanie funkcji: cout << wylicz( 2, 3 ) << endl; cout << wylicz( 2 ) << endl;
Przykłady - błędy przy przeciążaniu int wylicz( int, int = 1 ); int wylicz( int );
Przykłady - błędy przy przeciążaniu int wylicz( int, int = 1 ); int wylicz( int ); int wylicz( int ); double wylicz( int );... cout << wylicz( 5 ) << endl;
Rekurencja int silnia( int n ) if( n < 1 ) return 1; return n * silnia( n - 1 );... cout << silnia( 12 ) << endl; //zwraca 479001600 12! jest to największa możliwa zwracana wartość nie przekraczająca zakresu int (czterobajtowego).
Funkcje inline Funkcja inline (funkcja rozwijana) - w miejscu jej wywołania kompilator wstawia kod tej funkcji inline int oblicz( int a, int b ) //definicja return a+b; int main() int a, b, c; c = oblicz( a, b ); return 0;
Funkcje inline Zalety: - szybkości działania - czytelność kodu Stosowanie: - krótkie funkcje (kilka linii kodu), - niewielka ilość miejsc wywołań funkcji Wady: - przyrost długości pliku wykonywalnego Uwaga. - Jeśli funkcja inline znajduje się w pliku nagłówkowym to musi być to definicja. - Kompilator może zignorować żądanie inline.
Referencje Referencja - inna nazwa obiektu. Referencja musi być zainicjowana. Musi istnieć coś, czego jest ona nazwą. int i = 1024; // obiekt typu int int *p = &i; // wskaźnik do obiektu typu int int &r = i; // referencja do obiektu typu int
Referencje Referencja - inna nazwa obiektu. Referencja musi być zainicjowana. Musi istnieć coś, czego jest ona nazwą. int i = 1024; // obiekt typu int int *p = &i; // wskaźnik do obiektu typu int int &r = i; // referencja do obiektu typu int r = 13; cout << r << endl; //zwróci 13 cout << i << endl; //zwróci 13
Referencje Referencja - inna nazwa obiektu. Referencja musi być zainicjowana. Musi istnieć coś, czego jest ona nazwą. int i = 1024; // obiekt typu int int *p = &i; // wskaźnik do obiektu typu int int &r = i; // referencja do obiektu typu int r = 13; cout << r << endl; //zwróci 13 cout << i << endl; //zwróci 13 Obiekt referencyjny nie może być ponownie przypisany: int u = 7; r = u; //kopiowanie wartości 7 do i cout << i << endl; //zwróci 7
void nie_zwieksz( int i ) ++i; //nic nie robi, bo zmieniona zostaje lokalna kopia void zwieksz_c( int *i ) ++(*i); void zwieksz_cpp( int& i ) ++i; int main() int a = 0, b = 0, c = 0; nie_zwieksz( a ); zwieksz_c( &b ); zwieksz_cpp( c ); cout << a << " " << b << " " << c; //zwróci 0 1 1 return 0;
Koniec