Programowanie Procedurale
Transkrypt
Programowanie Procedurale
Programowanie Procedurale Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 2 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 1 / 37 Typ wiliczeniowy Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 2 / 37 Typ wiliczeniowy Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela }; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 2 / 37 Typ wiliczeniowy Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela }; W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero. Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 2 / 37 Typ wiliczeniowy Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela }; W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero. Każda nastepna ˛ ma wartość wieksz ˛ a˛ o jeden - chyba że zostanie zdefiniowana inaczej. Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 2 / 37 Typ wiliczeniowy Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela }; W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero. Każda nastepna ˛ ma wartość wieksz ˛ a˛ o jeden - chyba że zostanie zdefiniowana inaczej. Stałe definiowane przy pomocy enum sa˛ implementowane przez kompilator jako “typy calkowite”. Konkretny typ – int, long, long long – jest dobierany na podstawie wartości stałej. Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 2 / 37 enum0.cc #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; i n t main ( void ) { enum t y d z i e n d z i s = p o n i e d z i a l e k ; i n t i = d z i s ; / / niejawna konwersja t y d z i e n −−> i n t while ( i ! = sobota ) { c o u t << " Dzis j e s t " << i +1 << " d z i e n t y g o d n i a wiec s i e ucze ! \ n " ; i ++; } d z i s = ( t y d z i e n )++ i ; / / jawna konwersja i n t −−>t y d z i e n c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a , c z y l i sobota " ; c o u t << " wiec mam wolne : ) ! " << e n d l ; dzis = niedziela ; c o u t << " J u t r o j e s t " << d z i s +1 << " d z i e n t y g o d n i a , c z y l i n i e d z i e l a " ; c o u t << " wiec mam t e z wolne : ) ! " << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 3 / 37 enum0.cc - wykonanie Dzis jest 1 dzien tygodnia wiec sie ucze ! Dzis jest 2 dzien tygodnia wiec sie ucze ! Dzis jest 3 dzien tygodnia wiec sie ucze ! Dzis jest 4 dzien tygodnia wiec sie ucze ! Dzis jest 5 dzien tygodnia wiec sie ucze ! Dzis jest 6 dzien tygodnia, czyli sobota wiec mam wolne :)! Jutro jest 7 dzien tygodnia, czyli niedziela wiec mam tez wolne :)! Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 4 / 37 enum1.cc #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; i n t main ( void ) { enum t y d z i e n d z i s = p o n i e d z i a l e k ; enum t y d z i e n x = 1 ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 5 / 37 enum1.cc - kompilacja Domyślna konwersja z typu int na typ wyliczeniowy nie jest dozwolona. bws@bozenka:~/programy$ g++ enum1.cc enum0a.cc: In function ‘int main()’: enum0a.cc:9:19: error: invalid conversion from ‘int’ to ‘tydzien’ [-fpermissive] bws@bozenka:~/programy$ Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 6 / 37 enum1.c – Uwaga Programiści C ! #include < s t d i o . h> enum t y d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; i n t main ( void ) { enum t y d z i e n d z i s = p o n i e d z i a l e k ; enum t y d z i e n x = 2 ; p r i n t f ( " Wszystko OK ! \ n " ) ; p r i n t f ( " Jezyk C pozwala na p r z y p i s y w a n i e w a r t o s c i \ n " ) ; p r i n t f ( " c a l k o w i t y c h do zmiennych w y l i c z e n i o w y c h ! \ n " ) ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 7 / 37 enum1.c - kompilacja i wykonanie bws@bozenka:~/programy$ gcc enum1.c bws@bozenka:~/programy$ ./a.out Wszystko OK ! Jezyk C pozwala na przypisywanie wartosci calkowitych do zmiennych wyliczeniowych ! bws@bozenka:~/programy$ Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 8 / 37 enum2.cc - problem #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; i n t main ( void ) { enum t y d z i e n d z i s = p o n i e d z i a l e k ; i n t i = d z i s ; / / niejawna konwersja t y d z i e n −−> i n t while ( i ! = sobota ) { c o u t << " Dzis j e s t " << i +1 << " d z i e n t y g o d n i a wiec s i e ucze ! \ n " ; i ++; } d z i s = ( t y d z i e n )++ i ; / / jawna konwersja i n t −−>t y d z i e n c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a , c z y l i sobota " ; c o u t << " wiec mam wolne : ) ! " << e n d l ; dzis = niedziela ; d z i s ++; c o u t << " J u t r o j e s t " << d z i s << " d z i e n t y g o d n i a , c z y l i n i e d z i e l a " ; c o u t << " wiec mam t e z wolne : ) ! " << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 9 / 37 enum2.cc - kompilacja Operator ++ nie jest domyślnie zdefiniowany dla typu wyliczeniowego. bws@bozenka:~/programy$ g++ enum2.cc enum0b.cc: In function ‘int main()’: enum0b.cc:19:6: error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive] bws@bozenka:~/programy$ Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 10 / 37 enum2.c - Uwaga Programiści C! #include < s t d i o . h> enum t y d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , / / sobota , n i e d z i e l a } ; i n t main ( void ) { enum t y d z i e n d z i s = p o n i e d z i a l e k ; while ( d z i s ! = sobota ) { p r i n t f ( " Dzis j e s t %d d z i e n t y g o d n i a wiec s i e ucze ! \ n " , d z i s + 1 ) ; d z i s ++; } p r i n t f ( " Dzis j e s t %d d z i e n t y g o d n i a , c z y l i sobota " ,++ d z i s ) ; p r i n t f ( " wiec mam wolne : ) ! \ n " ) ; p r i n t f ( " J u t r o j e s t %d d z i e n t y g o d n i a , c z y l i n i e d z i e l a " ,++ d z i s ) ; p r i n t f ( " wiec mam t e z wolne : ) ! \ n " ) ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 11 / 37 enum2.c - kompilacja i wykonanie bws@bozenka:~/programy$ gcc enum2.c bws@bozenka:~/programy$ ./a.out Dzis jest 1 dzien tygodnia wiec sie ucze ! Dzis jest 2 dzien tygodnia wiec sie ucze ! Dzis jest 3 dzien tygodnia wiec sie ucze ! Dzis jest 4 dzien tygodnia wiec sie ucze ! Dzis jest 5 dzien tygodnia wiec sie ucze ! Dzis jest 6 dzien tygodnia, czyli sobotawiec mam wolne :)! Jutro jest 7 dzien tygodnia, czyli niedzielawiec mam tez wolne :)! bws@bozenka:~/programy$ Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 12 / 37 enum3.cc #include < iostream > using namespace s t d ; enum m i e s i a c { s t y c z e n =1 , l u t y , marzec , kwiecien , maj , czerwiec , l i p i e c , / / s i e r p i e n , wrzesien , p a z d z i e r n i k , l i s t o p a d , g r u d z i e n } ; i n t main ( void ) { c o u t << s t y c z e n << " " << l u t y << " " << marzec << " " << k w i e c i e n << " " << maj << " " << c z e r w i e c << " . . . " << g r u d z i e n << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 13 / 37 enum3.cc #include < iostream > using namespace s t d ; enum m i e s i a c { s t y c z e n =1 , l u t y , marzec , kwiecien , maj , czerwiec , l i p i e c , / / s i e r p i e n , wrzesien , p a z d z i e r n i k , l i s t o p a d , g r u d z i e n } ; i n t main ( void ) { c o u t << s t y c z e n << " " << l u t y << " " << marzec << " " << k w i e c i e n << " " << maj << " " << c z e r w i e c << " . . . " << g r u d z i e n << e n d l ; return 0; } 1, 2, 3, 4, 5, 6,..., 12. Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 13 / 37 enum4.cc #include < iostream > using namespace s t d ; enum m i e s i a c { s t y c z e n =1 , l u t y , marzec , kwiecien , maj , czerwiec , l i p i e c , / / s i e r p i e n , wrzesien , p a z d z i e r n i k , l i s t o p a d , g r u d z i e n } ; i n t main ( void ) { c o u t << s t y c z e n << " " << l u t y << " " << marzec << " " << k w i e c i e n << " " << maj << " " << c z e r w i e c << " . . . " << g r u d z i e n << e n d l ; enum m i e s i a c x = maj ; / / C++ i C m i e s i a c y = g r u d z i e n ; / / t y l k o w C++ c o u t << " Miesiace : " << e n d l ; c o u t << x << " i " << y << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 14 / 37 enum4.cc #include < iostream > using namespace s t d ; enum m i e s i a c { s t y c z e n =1 , l u t y , marzec , kwiecien , maj , czerwiec , l i p i e c , / / s i e r p i e n , wrzesien , p a z d z i e r n i k , l i s t o p a d , g r u d z i e n } ; i n t main ( void ) { c o u t << s t y c z e n << " " << l u t y << " " << marzec << " " << k w i e c i e n << " " << maj << " " << c z e r w i e c << " . . . " << g r u d z i e n << e n d l ; enum m i e s i a c x = maj ; / / C++ i C m i e s i a c y = g r u d z i e n ; / / t y l k o w C++ c o u t << " Miesiace : " << e n d l ; c o u t << x << " i " << y << e n d l ; return 0; } 1, 2, 3, 4, 5, 6,..., 12. Miesiace: 5 i 12 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 14 / 37 enum5.cc #include < iostream > using namespace s t d ; enum d i r e c t i o n { n o r t h = 0 , e a s t = 90 , south = 180 , west = 270 } ; i n t main ( void ) { int n; do { c o u t << " Podaj co pokazuje kompas : " << e n d l ; c i n >> n ; switch ( n ) { case n o r t h : c o u t << " I d z na Polnoc ! \ n " ; break ; case e a s t : c o u t << " I d z na Wschod ! \ n " ; break ; case south : c o u t << " I d z na P o l u d n i e ! \ n " ; break ; case west : c o u t << " I d z na Zachod ! \ n " ; break ; d e f a u l t : c o u t << " Kierunek n i e p r a w i d l o w y ! ! ! \ n " ; break ; } } while ( ! ( ( n== n o r t h ) | | ( n== e a s t ) | | ( n== south ) | | ( n==west ) ) ) ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 15 / 37 enum5.cc - kompilacja i wykonanie bws@bozenka:~/programy$ g++ enum5.cc bws@bozenka:~/programy$ ./a.out Podaj co pokazuje kompas: 0 Idz na Polnoc ! bws@bozenka:~/programy$ ./a.out Podaj co pokazuje kompas: 90 Idz na Wschod ! bws@bozenka:~/programy$ ./a.out Podaj co pokazuje kompas: 180 Idz na Poludnie ! bws@bozenka:~/programy$ ./a.out Podaj co pokazuje kompas: 270 Idz na Zachod ! bws@bozenka:~/programy$ ./a.out Podaj co pokazuje kompas: 6 Kierunek nieprawidlowy !!! Podaj co pokazuje kompas: 0 Idz na Polnoc ! Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 16 / 37 enum6.cc – rozwiazanie problemu operatora postfix-owego ++ #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; / / P o s t f i x −owy o p e r a t o r i n k r e m e n t a c j i t y d z i e n operator ++( t y d z i e n &rs , i n t ) { return rs = ( tydzien ) ( rs + 1 ) ; } i n t main ( void ) { tydzien dzis = poniedzialek ; while ( d z i s ! = sobota ) { c o u t << " Dzis j e s t " << d z i s +1 << " d z i e n t y g o d n i a wiec s i e ucze ! \ n " ; d z i s ++; } d z i s ++; c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a , c z y l i sobota " ; c o u t << " wiec mam wolne : ) ! " << e n d l ; d z i s = n i e d z i e l a ; d z i s ++; c o u t << " J u t r o j e s t " << d z i s << " d z i e n t y g o d n i a , c z y l i n i e d z i e l a " ; c o u t << " wiec mam t e z wolne : ) ! " << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 17 / 37 enum6.cc - kompilacja i wykonanie Dzis jest 1 dzien tygodnia wiec sie ucze ! Dzis jest 2 dzien tygodnia wiec sie ucze ! Dzis jest 3 dzien tygodnia wiec sie ucze ! Dzis jest 4 dzien tygodnia wiec sie ucze ! Dzis jest 5 dzien tygodnia wiec sie ucze ! Dzis jest 6 dzien tygodnia, czyli sobota wiec mam wolne :)! Jutro jest 7 dzien tygodnia, czyli niedziela wiec mam tez wolne :)! Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 18 / 37 enum7.cc – rozwiazanie problemu operatora prefix-owego ++ #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; / / P o s t f i x −owy o p e r a t o r i n k r e m e n t a c j i t y d z i e n operator ++( t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / Prefixowy operator inkrementacji t y d z i e n operator ++( t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } i n t main ( void ) { tydzien dzis = poniedzialek ; while ( d z i s ! = sobota ) c o u t << " Dzis j e s t " << ++ d z i s << " d z i e n t y g o d n i a wiec s i e ucze ! \ n " ; c o u t << " Dzis j e s t " << ++ d z i s << " d z i e n t y g o d n i a , c z y l i sobota " ; c o u t << " wiec mam wolne : ) ! " << e n d l ; dzis = niedziela ; c o u t << " J u t r o j e s t " << ++ d z i s << " d z i e n t y g o d n i a , c z y l i n i e d z i e l a " ; c o u t << " wiec mam t e z wolne : ) ! " << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 19 / 37 enum7.cc - kompilacja i wykonanie Dzis jest 1 dzien tygodnia wiec sie ucze ! Dzis jest 2 dzien tygodnia wiec sie ucze ! Dzis jest 3 dzien tygodnia wiec sie ucze ! Dzis jest 4 dzien tygodnia wiec sie ucze ! Dzis jest 5 dzien tygodnia wiec sie ucze ! Dzis jest 6 dzien tygodnia, czyli sobota wiec mam wolne :)! Jutro jest 7 dzien tygodnia, czyli niedziela wiec mam tez wolne :)! Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 20 / 37 enum8.cc – rozwiazanie problemu operatora pre- i postfix-owego – #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k =1 , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; / / P o s t f i x−owy o p e r a t o r i n k r e m e n t a c j i t y d z i e n operator ++( t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / Prefixowy operator inkrementacji t y d z i e n& operator ++( t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / P o s t f i x−owy o p e r a t o r d e k r e m e n t a c j i t y d z i e n operator−−(t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } / / Prefixowy operator dekrementacji t y d z i e n& operator−−(t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } i n t main ( void ) { tydzien dzis = poniedzialek ; d z i s −−; while (++ d z i s ! = sobota ) { c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a wiec s i e ucze ! \ n " ; } c o u t << "∗∗∗" << e n d l ; d z i s = sobota ; while ( d z i s−− ! = p o n i e d z i a l e k −1){ c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a wiec s i e ucze ! \ n " ; } return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 21 / 37 enum8.cc - kompilacja i wykonanie Dzis Dzis Dzis Dzis Dzis *** Dzis Dzis Dzis Dzis Dzis jest jest jest jest jest 1 2 3 4 5 dzien dzien dzien dzien dzien tygodnia tygodnia tygodnia tygodnia tygodnia wiec wiec wiec wiec wiec sie sie sie sie sie ucze ucze ucze ucze ucze ! ! ! ! ! jest jest jest jest jest 5 4 3 2 1 dzien dzien dzien dzien dzien tygodnia tygodnia tygodnia tygodnia tygodnia wiec wiec wiec wiec wiec sie sie sie sie sie ucze ucze ucze ucze ucze ! ! ! ! ! Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 22 / 37 Kompilacja statyczna i dynamiczna ldd - drukuje biblioteki dzielone, których wymaga program, podany w linii komend. bws@bws:~/$ g++ enum5.cc -static -o 5 bws@bws:~/$ g++ enum5.cc -o 6 bws@bws:~/$ ldd ./5 not a dynamic executable bws@bws:~/$ ldd ./6 linux-gate.so.1 => (0x00213000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x00110000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00d87000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x003b0000) /lib/ld-linux.so.2 (0x00d64000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00214000) bws@bws:~/$ ls -l -rwxrwxr-x 1 bws bws 1305771 2012-02-24 12:56 5 -rwxrwxr-x 1 bws bws 7835 2012-02-24 12:56 6 .... Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 23 / 37 Referencja to alternatywna nazwa uprzednio zdefiniowanej zmiennej. Zmienna referencyjna musi zostać zainicjalizowana. # include < iostream > # include <iomanip > using namespace s t d ; i n t main ( void ) { i n t wysokosc = 1 0 ; i n t &h = wysokosc ; h += 1 0 ; c o u t << " h = " << h << " , wysokosc = " << wysokosc << e n d l ; c o u t << " adres h : " << &h << " , adres wys . : " << &wysokosc << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 24 / 37 Referencja to alternatywna nazwa uprzednio zdefiniowanej zmiennej. Zmienna referencyjna musi zostać zainicjalizowana. # include < iostream > # include <iomanip > using namespace s t d ; i n t main ( void ) { i n t wysokosc = 1 0 ; i n t &h = wysokosc ; h += 1 0 ; c o u t << " h = " << h << " , wysokosc = " << wysokosc << e n d l ; c o u t << " adres h : " << &h << " , adres wys . : " << &wysokosc << e n d l ; return 0; } h = 20, wysokosc = 20 adres h: 0xbfb4c4d8, adres wys.: Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale 0xbfb4c4d8 Wykład 2 24 / 37 referencja1.cc # include < iostream > i n t main ( ) { using namespace s t d ; i n t s z c z u r y = 101; i n t & gryzonie = szczury ; / / rodents to r e f e r e n c j a c o u t << " s z c z u r y = " << s z c z u r y ; c o u t << " , g r y z o n i e = " << g r y z o n i e << e n d l ; c o u t << " adres s z c z u r w = " << &s z c z u r y ; c o u t << " , adres g r y z o n i e = " << &g r y z o n i e << e n d l ; i n t k r o l i k i = 50; / / zmieniamy wartosc , a l e n i e adres gryzonie = k r o l i k i ; c o u t << " k r o l i k i = " << k r o l i k i ; c o u t << " , s z c z u r y = " << s z c z u r y ; c o u t << " , g r y z o n i e = " << g r y z o n i e << e n d l ; c o u t << " adres k r o l i k i = " << & k r o l i k i ; c o u t << " , adres g r y z o n i e = " << &g r y z o n i e << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 25 / 37 referencja1.cc - wykonanie szczury = 101, gryzonie = 101 adres szczurów = 0xbf8636b4, adres gryzonie = 0xbf8636b4 kroliki = 50, szczury = 50, gryzonie = 50 adres kroliki = 0xbf8636b8, adres gryzonie = 0xbf8636b4 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 26 / 37 referencja1.cc # include < iostream > # include <iomanip > using namespace s t d ; i n t zamiana ( i n t & , i n t & ) ; i n t main ( void ) { i n t a = 10 , b = 2 0 ; c o u t << " a = " << a << " , b = " << b << e n d l ; zamiana ( a , b ) ; c o u t << " a = " << a << " , b = " << b << e n d l ; return 0; } i n t zamiana ( i n t & a , i n t & b ) { i n t c=a ; a=b ; b=c ; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 27 / 37 referencja1.cc # include < iostream > # include <iomanip > using namespace s t d ; i n t zamiana ( i n t & , i n t & ) ; i n t main ( void ) { i n t a = 10 , b = 2 0 ; c o u t << " a = " << a << " , b = " << b << e n d l ; zamiana ( a , b ) ; c o u t << " a = " << a << " , b = " << b << e n d l ; return 0; } i n t zamiana ( i n t & a , i n t & b ) { i n t c=a ; a=b ; b=c ; } a = 10, b = 20 a = 20, b = 10 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 27 / 37 Referencje bywaja˛ zdradliwe - referencja1.cc # include < iostream > double cube ( double a ) ; double r e f c u b e ( double &r a ) ; i n t main ( ) { using namespace s t d ; double x = 3 . 0 ; c o u t << cube ( x ) ; c o u t << " = s z e s c i a n " << x << e n d l ; c o u t << r e f c u b e ( x ) ; c o u t << " = s z e s c i a n " << x << e n d l ; return 0; } double cube ( double a ) { a ∗= a ∗ a ; return a ; } double r e f c u b e ( double &r a ) { r a ∗= r a ∗ r a ; return ra ; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 28 / 37 Referencje bywaja˛ zdradliwe - referencja1.cc # include < iostream > double cube ( double a ) ; double r e f c u b e ( double &r a ) ; i n t main ( ) { using namespace s t d ; double x = 3 . 0 ; c o u t << cube ( x ) ; c o u t << " = s z e s c i a n " << x << e n d l ; c o u t << r e f c u b e ( x ) ; c o u t << " = s z e s c i a n " << x << e n d l ; return 0; } double cube ( double a ) { a ∗= a ∗ a ; return a ; } double r e f c u b e ( double &r a ) { r a ∗= r a ∗ r a ; return ra ; } 27 = szescian 3 27 = szescian 27 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 28 / 37 Referencje a wartości funkcji - enum9.cc #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k =1 , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; / / P o s t f i x −owy o p e r a t o r i n k r e m e n t a c j i t y d z i e n operator ++( t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / Prefixowy operator inkrementacji t y d z i e n& operator ++( t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / P o s t f i x −owy o p e r a t o r d e k r e m e n t a c j i t y d z i e n operator −−(t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } / / Prefixowy operator dekrementacji t y d z i e n& operator −−(t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } i n t main ( void ) { tydzien dzis = poniedzialek ; d z i s ++; c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a ! \ n " ; ++ d z i s ; c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a ! \ n " ; ++++ d z i s ; c o u t << " Dzis j e s t " << d z i s << " d z i e n t y g o d n i a ! \ n " ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 29 / 37 Referencje a wartości funkcji - enum9.cc Dzis jest 2 dzien tygodnia ! Dzis jest 3 dzien tygodnia ! Dzis jest 5 dzien tygodnia ! Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 30 / 37 Referencje a wartości funkcji - enum10.cc #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k =1 , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; / / P o s t f i x −owy o p e r a t o r i n k r e m e n t a c j i t y d z i e n operator ++( t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / Prefixowy operator inkrementacji t y d z i e n& operator ++( t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / P o s t f i x −owy o p e r a t o r d e k r e m e n t a c j i t y d z i e n operator −−(t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } / / Prefixowy operator dekrementacji t y d z i e n& operator −−(t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } i n t main ( void ) { tydzien dzis = poniedzialek ; d z i s ++; c o u t << " Dzis j e s t " << d z i s << ++ d z i s ; c o u t << " Dzis j e s t " << d z i s << ++++ d z i s ; c o u t << " Dzis j e s t " << d z i s << " d z i e n d z i s ++++; c o u t << " Dzis j e s t " << d z i s << " d z i e n return 0; } Bożena Woźna-Szcześniak (AJD) " dzien tygodnia ! \ n " ; " dzien tygodnia ! \ n " ; tygodnia ! \ n" ; tygodnia ! \ n" ; Programowanie Procedurale Wykład 2 31 / 37 enum10.cc: In function ‘int main()’: enum10.cc:21:8: error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive] Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 32 / 37 Referencje a wartości funkcji - enum10a.cc #include < iostream > using namespace s t d ; enum t y d z i e n { p o n i e d z i a l e k =1 , wtorek , sroda , czwartek , p i a t e k , sobota , n i e d z i e l a } ; / / P o s t f i x −owy o p e r a t o r i n k r e m e n t a c j i t y d z i e n& operator ++( t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / Prefixowy operator inkrementacji t y d z i e n& operator ++( t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s + 1 ) ; } / / P o s t f i x −owy o p e r a t o r d e k r e m e n t a c j i t y d z i e n& operator −−(t y d z i e n &rs , i n t ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } / / Prefixowy operator dekrementacji t y d z i e n& operator −−(t y d z i e n &r s ) { r e t u r n r s = ( t y d z i e n ) ( r s − 1 ) ; } i n t main ( void ) { tydzien dzis = poniedzialek ; d z i s ++; c o u t << " Dzis j e s t " << d z i s << ++ d z i s ; c o u t << " Dzis j e s t " << d z i s << ++++ d z i s ; c o u t << " Dzis j e s t " << d z i s << " d z i e n d z i s ++++; c o u t << " Dzis j e s t " << d z i s << " d z i e n return 0; } Bożena Woźna-Szcześniak (AJD) " dzien tygodnia ! \ n " ; " dzien tygodnia ! \ n " ; tygodnia ! \ n" ; tygodnia ! \ n" ; Programowanie Procedurale Wykład 2 33 / 37 Dzis Dzis Dzis Dzis jest jest jest jest 2 3 5 7 dzien dzien dzien dzien Bożena Woźna-Szcześniak (AJD) tygodnia tygodnia tygodnia tygodnia ! ! ! ! Programowanie Procedurale Wykład 2 34 / 37 Funkcje i referencje- referencja4.cc #include < iostream > using namespace s t d ; double suma ( double a , double b ) { r e t u r n a+b ; } i n t main ( void ) { double x , y ; c o u t << " Podaj 1 c o u t << " Podaj 2 c o u t << x << " + c o u t <<suma ( x , y ) return 0; } l i c z b e : " ; c i n >> x ; l i c z b e : " ; c i n >> y ; " << y << " = " <<suma ( x , y ) << e n d l ; << " + " << y << " = " <<suma ( suma ( x , y ) , y ) << e n d l ; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 35 / 37 Funkcje i referencje- referencja4.cc #include < iostream > using namespace s t d ; double suma ( double a , double b ) { r e t u r n a+b ; } i n t main ( void ) { double x , y ; c o u t << " Podaj 1 c o u t << " Podaj 2 c o u t << x << " + c o u t <<suma ( x , y ) return 0; } l i c z b e : " ; c i n >> x ; l i c z b e : " ; c i n >> y ; " << y << " = " <<suma ( x , y ) << e n d l ; << " + " << y << " = " <<suma ( suma ( x , y ) , y ) << e n d l ; Podaj 1 liczbe: 4 Podaj 2 liczbe: 5 4+5=9 9 + 5 = 14 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 35 / 37 Funkcje i referencje- referencja4a.cc #include < iostream > using namespace s t d ; double suma ( double a , double b ) { r e t u r n a+b ; } i n t main ( void ) { double x , y ; c o u t << " Podaj 1 l i c z b e : " ; c i n >> x ; c o u t << " Podaj 2 l i c z b e : " ; c i n >> y ; c o u t << x << " + " << y << " = " <<suma ( x , y ) << e n d l ; c o u t << ++suma ( x , y ) << " + " << y << " = " <<suma(++suma ( x , y ) , y ) << e n d l ; return 0; } referencja4a.cc: In function ‘int main()’: referencja4a.cc:14:20: error: lvalue required as increment operand referencja4a.cc:14:61: error: lvalue required as increment operand Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 36 / 37 Funkcje i referencje- referencja4b.cc #include < iostream > using namespace s t d ; double suma ( double a , double b ) { r e t u r n a+b ; } double& refsuma ( double a , double b , double &s ) { s = a+b ; return s ; } i n t main ( void ) { double x , y , s ; c o u t << " Podaj 1 l i c z b e : " ; c i n >> x ; c o u t << " Podaj 2 l i c z b e : " ; c i n >> y ; c o u t << x << " + " << y << " = " <<refsuma ( x , y , s ) << e n d l ; c o u t <<++refsuma ( x , y , s ) << " + " << y << " = " <<refsuma (++ refsuma ( x , y , s ) , y , s ) << e n d l ; c o u t <<refsuma ( x , y , s )++ << " + " << y << " = " <<refsuma ( refsuma ( x , y , s ) + + , y , s ) << e n d l ; return 0; } Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 37 / 37 Funkcje i referencje- referencja4b.cc Podaj Podaj 3 + 4 8 + 4 7 + 4 1 2 = = = liczbe: 3 liczbe: 4 7 12 11 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 2 38 / 37