• Nem Talált Eredményt

Felhasználó által definiált adattípus C++ Izsó Tamás 2017. február 24.

N/A
N/A
Protected

Academic year: 2022

Ossza meg "Felhasználó által definiált adattípus C++ Izsó Tamás 2017. február 24."

Copied!
23
0
0

Teljes szövegt

(1)

Felhasználó által definiált adattípus

C++

Izsó Tamás

2017. február 24.

(2)

Irodalom

Izsó Tamás Felhasználó által definiált adattípus/ 2

(3)

Programtervezési szempontok

Teljesítse a specifikációt.

Legyen robosztus, extrém adatokra se szálljon el.

Rugalmasan lehessen változtatni.

A megírt részeket máshol is lehessen használni.

Részek egymással tudjanak együttm ˝uködni.

Legyen hatékony (futási id ˝o, memória) Legyen hordozható.

Könnyen lehessen használni.

Forrás legyen könnyen érthet ˝o és jól dokumentált.

(4)

Funkcionális dekompozíció

Olvassuk be és írjuk ki azoknak a diákoknak az adatait, akiknek a tanulmányi átlaga az összátlag felett van. (megvalósítás nélkül)

Kovács Ágnes 4.5 next első

Okos Tobiás 4.8 next

Lusta Henrik 2.1 next

Buli Józsi 3.0 next

Lanc∗ e l s o ; double a ;

e l s o = f i l e _ b e o l v a s a s ( " adat . t x t " ) ; a = a t l a g ( e l s o ) ;

p r i n t _ o k o s o k ( e l s o , a t l a g ) ;

Izsó Tamás Felhasználó által definiált adattípus/ 4

(5)

Funkcionális dekompozíció

Olvassuk be és írjuk ki azoknak a diákoknak az adatait, akiknek a tanulmányi átlaga az összátlag felett van. (megvalósítás nélkül)

Kovács Ágnes 4.5 next első

Okos Tobiás

4.8 next

Lusta Henrik

2.1 next

Buli Józsi 3.0 next

Lanc∗ e l s o ; double a ;

e l s o = f i l e _ b e o l v a s a s ( " adat . t x t " ) ; a = a t l a g ( e l s o ) ;

p r i n t _ o k o s o k ( e l s o , a t l a g ) ;

(6)

Funkcionális dekompozíció

Olvassuk be és írjuk ki azoknak a diákoknak az adatait, akiknek a tanulmányi átlaga az összátlag felett van. (megvalósítás nélkül)

Kovács Ágnes 4.5 next első

Okos Tobiás

4.8 next

Lusta Henrik

2.1 next

Buli Józsi 3.0 next

Lanc∗ e l s o ; double a ;

e l s o = f i l e _ b e o l v a s a s ( " adat . t x t " ) ; a = a t l a g ( e l s o ) ;

p r i n t _ o k o s o k ( e l s o , a t l a g ) ;

Izsó Tamás Felhasználó által definiált adattípus/ 4

(7)

OO dekompozíció

Szerepl ˝ok:

Kovács Katalin 4.5

egy diák adata tankör

b e o l v a s ( ) ; b e t e s z ( ) ;

k i i r ( ) ; k i v e s z ( ) ;

g e t _ a t l a g ( ) ; e l s o _ a d a t ( ) ;

get_nev ( ) ; van_meg_adat ( ) ;

k o v e t k e z o _ a d a t ( ) ;

A megadott függvények képzik az adatok interfészét. Mi van az implementációval? Kivülr ˝ol nem látszik. Diak_adat: struct vagy string

Tankor: láncolt lista, fa, dinamikus vektor, ...

(8)

OO dekompozíció

Szerepl ˝ok:

Kovács Katalin 4.5

egy diák adata tankör

b e o l v a s ( ) ; b e t e s z ( ) ;

k i i r ( ) ; k i v e s z ( ) ;

g e t _ a t l a g ( ) ; e l s o _ a d a t ( ) ;

get_nev ( ) ; van_meg_adat ( ) ;

k o v e t k e z o _ a d a t ( ) ;

A megadott függvények képzik az adatok interfészét. Mi van az implementációval? Kivülr ˝ol nem látszik. Diak_adat: struct vagy string

Tankor: láncolt lista, fa, dinamikus vektor, ...

Izsó Tamás Felhasználó által definiált adattípus/ 5

(9)

OO dekompozíció

Szerepl ˝ok:

Kovács Katalin 4.5

egy diák adata tankör

b e o l v a s ( ) ; b e t e s z ( ) ;

k i i r ( ) ; k i v e s z ( ) ;

g e t _ a t l a g ( ) ; e l s o _ a d a t ( ) ;

get_nev ( ) ; van_meg_adat ( ) ;

k o v e t k e z o _ a d a t ( ) ;

A megadott függvények képzik az adatok interfészét.

Mi van az implementációval?

Kivülr ˝ol nem látszik. Diak_adat: struct vagy string

Tankor: láncolt lista, fa, dinamikus vektor, ...

(10)

OO dekompozíció

Szerepl ˝ok:

Kovács Katalin 4.5

egy diák adata tankör

b e o l v a s ( ) ; b e t e s z ( ) ;

k i i r ( ) ; k i v e s z ( ) ;

g e t _ a t l a g ( ) ; e l s o _ a d a t ( ) ;

get_nev ( ) ; van_meg_adat ( ) ;

k o v e t k e z o _ a d a t ( ) ;

A megadott függvények képzik az adatok interfészét.

Mi van az implementációval? Kivülr ˝ol nem látszik.

Diak_adat: struct vagy string

Tankor: láncolt lista, fa, dinamikus vektor, ...

Izsó Tamás Felhasználó által definiált adattípus/ 5

(11)

Dátum típus létrehozása [3-7]

s t r u c t Date { i n t y ;

i n t m;

i n t d ; } ;

Date x1 ; x1 . y =2005;

x1 .m= 3 ;

x1 . d =15;

(12)

Adatok konzisztenciájának biztosítása [20-25]

Date x2 ; x2 . y =2000;

x2 .m= 2 ;

x2 . d= 2 9 ; / / K i t u d j a van−e i l y e n ; x2 .m=15; / / Huh ! !

void i n i t _ d a t e ( Date& date ,

i n t year , i n t month , i n t day ) {

i f ( ! i s _ d a t e ( year , month , day ) ) { th ro w " Hibas datum " ;

}

dd . y= year ; dd .m=month ; dd . d=day ; }

Izsó Tamás Felhasználó által definiált adattípus/ 7

(13)

Hibás számítások elkerülése [27-44]

Date holnap ( Date ma ) { Date holnap ;

holnap . y = ma . y ;

holnap .m = ma .m; / / valóban ? holnap . d = ma . d + 1 ; / / Huh ! ! r e t u r n holnap ;

}

Hozzunk létre egy jó m ˝uköd ˝o add_day() függvényt.

Date next_day ( Date ma ) {

Date holnap =ma ; add_day ( holnap , 1 ) ; r e t u r n holnap ;

}

(14)

Egységbe zárás [46-60]

s t r u c t Date { i n t y ; i n t m;

i n t d ;

Date (i n t year , i n t month , i n t day ) { / / e l l e n ˝o r z i az a d a t o k a t

. . . } ;

void add_day (i n t number_of_day ) { . . . } } ;

Használat:

Date ma( 2 0 1 3 , 0 2 , 26 ) ;

Date holnap = ma ; / / Van i l y e n ? holnap . add_day ( 1 ) ;

Izsó Tamás Felhasználó által definiált adattípus/ 9

(15)

Adattagok elrejtése [64-78]

ma .m=13; / / huh ! ! s t r u c t Date { p r i v a t e:

i n t y ; i n t m;

i n t d ; p ub li c:

Date (i n t year , i n t month , i n t day ) ; / / e l l e n ˝o r z i az a d a t o k a t void add_day (i n t number_of_day ) ;

i n t y e a r _ o f _ d a t e ( ) { r e t u r n y ; } i n t month_of_date ( ) { r e t u r n m; } i n t day_of_date ( ) { r e t u r n d ; } } ;

Date dd ( 2 0 1 3 , 2 , 2 6 ) ;

i n t ev = dd . y ; / / HIBA ! ! p r i v a t e

i n t ev = dd . y e a r _ o f _ d a t e ( ) ; / / I g y már j ó

Mekkora a getter függvények overhead-je?

(16)

struct vs. class [80-90]

s t r u c t A {

} ;

,

class A { p ub li c :

} ; class A {

} ;

,

s t r u c t A { p r i v a t e:

} ;

Viselkedéssel nem rendelkez ˝o típusnál struct -ot szokás használni.

Izsó Tamás Felhasználó által definiált adattípus/ 11

(17)

Hónap és nap felcserélésének kivédése [94-110]

Hogyan vesszük észre ha Date dd(2013,2,3); helyett Date dd(2013,3,2); írunk?

class Date {

p ub li c:

enum Month { j a n =1 , feb , mar , apr , may ,

j u n , j u l , aug , sep , o c t , nov , dec } ;

Date (i n t year , Month month , i n t day ) ; / / e l l e n ˝o r z i az a d a t o k a t void add_day (i n t d ) ;

i n t y e a r _ o f _ d a t e ( ) {r e t u r n y ; } Month month_of_date ( ) {r e t u r n m; }

i n t day_of_date ( ) {r e t u r n d ; } p r i v a t e:

i n t y ; Month m;

i n t d ; } ;

(18)

enum használata [111-121]

Date : : Month m = Date : : dec ; i n t x = m; / / OK FONTOS m = 1 0 ; / / Hiba !

m = Date : : Month ( 1 0 ) ; / / OK

Date ma( 2013 , Date : : feb , 26 ) ; / / OK / / Rossz paraméter s o r r e n d .

Date ma( 2013 , 26 , Date : : f e b ) ; / / F o r d í t á s i h i b a / / Újabb problémák

const holnap ( 2 0 1 3 , Date : : feb , 27 ) ;

i n t ev= holnap . y e a r _ o f _ d a t e ( ) ; / / Hiba mert nem konstans függvény Date szabadnapok [ 3 0 ] ; / / Hiba n i n c s paraméter n é l k ü l i c t o r

Izsó Tamás Felhasználó által definiált adattípus/ 13

(19)

Újabb gondok kiküszöbölése [124-145]

class Date { p ub li c:

enum Month { j a n =1 , feb , mar , apr , may , j u n , j u l , aug , sep , o c t , nov , dec } ;

class I n v a l i d { } ; / / throw−hoz

Date (i n t year , Month month , i n t day ) ; Date ( ) ; / / a l a p é r t e l m e z e t t k o n s t r u k t o r void add_day (i n t number_of_day ) ;

i n t y e a r _ o f _ d a t e ( ) const { r e t u r n y ; } Month month_of_date ( ) const { r e t u r n m; } i n t day_of_date ( ) const { r e t u r n d ; }

p r i v a t e: i n t y ; Month m;

(20)

Tagfüggvények definiálása osztályon kívül [148-175]

Date : : Date ( ) {

s t a t i c const Date dd ( 2 0 0 1 , Date : : j a n , 1 ) ; y=dd . y ; m = dd .m; d = dd . d ; }

Date : : Date (i n t y , Date : : Month month , i n t day ) { i f ( ! i s _ d a t e ( y , month , day ) ) throw I n v a l i d ( ) ;

t h i s>y = y ; / / Paraméter és t a g v á l t o z ó megkülönböztetése m = month ;

d = day ; }

void Date : : add_day (i n t number_of_day ) { i f ( number_of_day <0) throw I n v a l i d ( ) ;

while ( days_in_month ( y ,m) < number_of_day+d ) { number_of_day −= days_in_month ( y ,m) ;

i f( m == dec ) { m= j a n ; y ++; } else m = Month (m+ 1 ) ;

}

d += number_of_day ; }

Izsó Tamás Felhasználó által definiált adattípus/ 15

(21)

Segédfüggvények [175-200]

bool l e a p y e a r (i n t year ) { i f ( year %4) r e t u r n f a l s e;

i f ( year%100==0 && year %400) r e t u r n f a l s e; r e t u r n t r u e;

}

i n t days_in_month (i n t year , Date : : Month month ) { switch ( month ) {

case Date : : f e b : / / F e b r u á r i napok v á l t o z n a k r e t u r n ( l e a p y e a r ( year ) ) ? 2 9 : 2 8 ;

case Date : : apr : case Date : : j u n : case Date : : sep : case Date : : nov : r e t u r n 3 0 ;

d e f a u l t: r e t u r n 3 1 ; }

}

bool i s _ d a t e (i n t year , Date : : Month month , i n t day ) { / / Évet nem l e h e t r o s s z u l megadni

i f ( day <=0) r e t u r n f a l s e; / / day m i n d i g p o z i t í v i f ( days_in_month ( year , month ) < day ) r e t u r n f a l s e; r e t u r n t r u e;

(22)

Kiíratás és beolvasás [202-220]

ostream& operator< <( ostream& os , const Date& d ) { r e t u r n os << ’ ( ’ << d . y e a r _ o f _ d a t e ( ) << ’ , ’

<< d . month_of_date ( ) << ’ , ’ << d . day_of_date ( ) << ’ ) ’ ; }

i s t r e a m& operator> >( i s t r e a m& i s , Date& dd ) { i n t y , m, d ;

char ch1 , ch2 , ch3 , ch4 ;

i s >> ch1 >> y >> ch2 >> m >> ch3 >> d >> ch4 ; i f ( ! i s ) r e t u r n i s ;

i f ( ch1 ! = ’ ( ’ | | ch2 ! = ’ , ’ | |

ch3 ! = ’ , ’ | | ch4 ! = ’ ) ’ ) { / / oops : f o r m a t e r r o r i s . c l e a r ( ios_base : : f a i l b i t ) ; / / s e t t h e f a i l b i t r e t u r n i s ;

}

dd = Date ( y , Date : : Month (m) , d ) ; / / update dd r e t u r n i s ;

}

Izsó Tamás Felhasználó által definiált adattípus/ 17

(23)

Osztály interfész kialakításának a szempontjai

Legyen teljes, minden szükséges szolgáltatást biztosítson.

Legyen minimális. Ami az adatok realizációjától független, az inkább legyen küls ˝o függvény.

Inicializálja az objektumot.

Támogassa a másolást (következ ˝o óra).

A függvények argumentum típusa olyan legyen, hogy azt jól lehessen ellen ˝orizni.

Az interfész szolgálja ki a konstans objektumokat is.

Szabadítson fel minden lefoglalt er ˝oforrást.

Hivatkozások

KAPCSOLÓDÓ DOKUMENTUMOK

Meghatározó a ciklusban a rezignált hangvétel is, a Félgyászjelentés mellett idesorolható számos vers, többek között a Lassan („Lassan, anyám, mindegy lesz nekem […]”),

Érdekes mozzanat az adatsorban, hogy az elutasítók tábora jelentősen kisebb (valamivel több mint 50%), amikor az IKT konkrét célú, fejlesztést támogató eszközként

A helyi emlékezet nagyon fontos, a kutatói közösségnek olyanná kell válnia, hogy segítse a helyi emlékezet integrálódását, hogy az valami- lyen szinten beléphessen

Minden bizonnyal előfordulnak kiemelkedő helyi termesztési tapasztalatra alapozott fesztiválok, de számos esetben más játszik meghatározó szerepet.. Ez

As before, we double every second digit, starting with the digit to the right of the check digit, and add the values of all digits, including the check digit, to determine

cin standard input ( C megfelel ˝oje stdin ) cout standard output ( C megfelel ˝oje stdout ) cerr standard error ( C megfelel ˝oje stderr ) clog buffer-olt változata a

táblázat: Az innovációs index, szervezeti tanulási kapacitás és fejlődési mutató korrelációs mátrixa intézménytí- pus szerinti bontásban (Pearson korrelációs

Egy atomi származtatott adattípus esetén true az adattípus-alaptulajdonság értéke akkor, ha adattípus- tulajdonságai között van a minInclusive vagy a