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