39

(GKxB INTM021) Dr. Hatwágner F. Miklós - rs1.sze.hurs1.sze.hu/~hatwagnf/prg/ea08.pdf · Programozás (GKxB_INTM021) Dr. Hatwágner F. Miklós Széchenyi István Egyetem, Gy®r 2018

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

  • Programozs

    (GKxB_INTM021)

    Dr. Hatwgner F. Mikls

    Szchenyi Istvn Egyetem, Gyr

    2018. prilis 4.

  • Szmok rendezse

    Feladat:

    Fejlesszk tovbb gy a bubork rendezalgoritmust bemutatpldt, hogy a felhasznl adhassa meg a rendezendadatokat! (Adatbevitelnek vge negatv adatra.)

    Nem adhat meg tbb szmot, mint a tmb elemszma!

    Problmk:

    Fordtsi idben tudni kellene a rendezend adatok szmt

    Tl kicsi tmb nem frnek el az adatokTl nagy tmb pazaroljuk a memritInkbb nagyobb legyen a tmb, mint tl kicsi!

    Dr. Hatwgner F. Mikls 8. elads

  • Szmok rendezse

    Kimenet1

    Adjon meg nemnegativ szamokat!

    1. szam: 2

    2. szam: 4

    3. szam: 1

    4. szam: 3

    5. szam: -1

    Rendezes utan:

    1 2 3 4

    Kimenet2

    Adjon meg nemnegativ szamokat!

    1. szam: 5

    2. szam: 4

    3. szam: 3

    4. szam: 2

    5. szam: 1

    Rendezes utan:

    1 2 3 4 5

    Dr. Hatwgner F. Mikls 8. elads

  • Szmok rendezse

    3 #d e f i n e OSSZES 5

    37 i n t main ( ) {38 i n t ha s z n a l ; // Enny i e l emet ha s zna l unk eppen39 i n t szamok [OSSZES ] ;40 cout

  • Szmok rendezse

    5 void b e o l v a s ( i n t szamok , i n t ha s z n a l ) {6 i n t u j ;7 ha s z n a l = 0 ;8 do {9 cout u j ;11 i f ( uj>=0 and haszna l=0 and haszna l=0 and *hasznal=0 and *hasznal=1; i--) { for(int k=0; k t[k+1]) { int csere = t[k]; t[k] = t[k+1]; t[k+1] = csere; } } }}void tombKiir(const int* t, int n) { for(const int* vege=t+n; t

  • Dinamikus memriakezels

    Dinamikus memriakezels

    A programoz dnt a dinamikus vltozk lettartamrl

    Memria foglals: new opertorral

    Visszaadott mutat tpusa: mindig megfelel, nincs szksgtpusknyszertsre

    Sikertelen memriafoglals esetn NULL rtket kapunk ellenrizni kell

    Terlet felszabadtsa: delete

    Ugyanaz a terlet nem szabadthat fel tbbszr

    NULL mutat felszabadtsa nem okoz gondot

    Dr. Hatwgner F. Mikls 8. elads

  • Dinamikus memriakezels

    5 char pc ; // d e k l a r a c i o k6 i n t p i ;7 double pd ;89 pc = new char ; // memo r i a f o g l a l a s o k10 p i = new in t ;11 pd = new double ;1213 i f ( pc == NULL) { // e l l e n o r z e s14 c e r r

  • Dinamikus memriakezels

    18 pc = 'X ' ; // e r t e k ada sok19 p i = 42 ;20 pd = 3 . 1 4 ;2122 de lete pc ; // memoria f e l s z a b a d i t a s23 de lete p i ;24 de lete pd ;

    A lefoglalt terlet inicializlhat

    9 pc = new char ( 'X ' ) ; // memo r i a f o g l a l a s ok10 p i = new in t ( 4 2 ) ; // i n i c i a l i z a c i o k11 pd = new double ( 3 . 1 4 ) ;

    Dr. Hatwgner F. Mikls 8. elads

    #include using namespace std;int main() { char *pc; // deklaraciok int* pi; double* pd; pc = new char; // memoriafoglalasok pi = new int; pd = new double; if(pc == NULL) { // ellenorzes cerr

  • Dinamikus memriakezels

    Struktrknak is foglalhat memria dinamikusan, amit akrinicializci is kvethet

    4 s t r u c t h a l l g a t o {5 s t r i n g nev ;6 i n t e l e t k o r ;7 } ;

    10 h a l l g a t o h = { " G i z i " , 19 } ; // L o k a l i s v a l t o z o11 h a l l g a t o ph1 = new h a l l g a t o ; // Memoria f o g l a l a s12 ph1>nev = "Mari " ; // Er tekadasok13 ph1>e l e t k o r = 20 ;14 // Mar l e z e t o s t r u k t u r a v a l i n i c i a l i z a l h a t o15 h a l l g a t o ph2 = new h a l l g a t o ( h ) ;16 h a l l g a t o ph3 = new h a l l g a t o ( ph1 ) ;17 h a l l g a t o ph4 = new h a l l g a t o { " L i l i " , 21 } ; // C++11

    Dr. Hatwgner F. Mikls 8. elads

    #include using namespace std;struct hallgato { string nev; int eletkor;};int main() { hallgato h = { "Gizi", 19 }; // Lokalis valtozo hallgato* ph1 = new hallgato; // Memoria foglalas ph1->nev = "Mari"; // Ertekadasok ph1->eletkor = 20; // Mar lezeto strukturaval inicializalhato hallgato* ph2 = new hallgato(h); hallgato* ph3 = new hallgato(*ph1); hallgato* ph4 = new hallgato{ "Lili", 21 }; // C++11 delete ph1; delete ph2; delete ph3; delete ph4; return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Dinamikus memriakezels

    Tmbknek is lehet dinamikusan memrit foglalni

    7 char pc = new char [ 1 0 ] ; // Tomb f o g l a l a s a8 // Futa s i doben k i s z amo l t meret sem okoz gondot9 s rand ( t ime (NULL ) ) ;10 i n t p i = new i n t [ rand ( )%50 ] ;11 doub le pd = new doub le [ 1 0 0 ] ;1213 // B e e p i t e t t t i p u s o k b o l a l l o tomb14 // nem i n i c i a l i z a l h a t o : (1516 de l e t e [ ] pc ; // F e l s z a b a d i t a s17 de l e t e [ ] p i ;18 de l e t e [ ] pd ;

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include using namespace std;int main() { char* pc = new char[10]; // Tomb foglalasa // Futasidoben kiszamolt meret sem okoz gondot srand(time(NULL)); int* pi = new int[rand()%50]; double* pd = new double[100]; // Beepitett tipusokbol allo tomb // nem inicializalhato :( delete[] pc; // Felszabaditas delete[] pi; delete[] pd; return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Szmok rendezse

    37 i n t main ( ) {38 i n t ha s z n a l ; // Enny i e l emet ha s zna l unk eppen39 i n t szamok = new in t [OSSZES ] ;40 cout

  • Szmok rendezse

    Megjegyzsek

    A megolds nem hasznlta ki, hogy futsidben is eldnthet atmb elemszma

    A lefoglalt terlet felszabadthat, msik is foglalhat

    Javaslat

    Foglaljunk valamennyi memrit a program indulsakor, majd

    ha elfogyott, mindig nveljk a terletet a dupljra! Rgiadatokat t kell mozgatni az j helykre

    Dr. Hatwgner F. Mikls 8. elads

  • Szmok rendezse

    49 i n t main ( ) {50 i n t ha s z n a l ; // Enny i e l emet ha s zna l unk eppen51 i n t szamok ; // Tomb cime52 cout

  • Szmok rendezse

    4 i n t b eo l v a s ( i n t ha s zn a l ) {5 i n t uj , o s s z e s = 1 ;6 i n t szamok = new i n t [ o s s z e s ] ;7 ha s zn a l = 0 ;8 do {9 c e r r

  • Szmok rendezse

    20 de l e t e [ ] szamok ;21 szamok = szamok2 ;22 }23 szamok [ ha s zn a l ] = u j ;24 ( ha s zn a l )++;25 }26 } wh i l e ( u j >= 0 ) ;27 r e t u r n szamok ;28 }

    Dr. Hatwgner F. Mikls 8. elads

    #include using namespace std;int* beolvas(int* hasznal) { int uj, osszes = 1; int* szamok = new int[osszes]; *hasznal = 0; do { cerr

  • Szmok rendezse

    KimenetAdjon meg nemnegativ szamokat!

    [Felhasznalva: 0, tombelemek szama: 1]1. szam: 9

    [Felhasznalva: 1, tombelemek szama: 1]2. szam: 8

    [Memoriafoglalas + mozgatas][Felhasznalva: 2, tombelemek szama: 2]

    3. szam: 7[Memoriafoglalas + mozgatas][Felhasznalva: 3, tombelemek szama: 4]

    4. szam: 6[Felhasznalva: 4, tombelemek szama: 4]

    5. szam: 5[Memoriafoglalas + mozgatas][Felhasznalva: 5, tombelemek szama: 8]

    6. szam: 4[Felhasznalva: 6, tombelemek szama: 8]

    7. szam: 3[Felhasznalva: 7, tombelemek szama: 8]

    8. szam: 2[Felhasznalva: 8, tombelemek szama: 8]

    9. szam: 1[Memoriafoglalas + mozgatas][Felhasznalva: 9, tombelemek szama: 16]

    10. szam: 0[Felhasznalva: 10, tombelemek szama: 16]

    11. szam: -1Rendezes utan:0 1 2 3 4 5 6 7 8 9

    Dr. Hatwgner F. Mikls 8. elads

  • Tglalapok rajzolsa

    Alaktsuk r a tglalap rajzol programot is hasonlan, de

    most mindig ugyanannyival nveljk a tmb mrett, ha elfogya hely

    a tmbt lefoglal s feltlt fggvny adja vissza az elemekszmt, a tmb cmt pedig rja a paramterknt kapott cmre!

    91 i n t main ( ) {92 t e g l a l a p t t ; i n t db ;93 cout

  • Tglalapok rajzolsa

    58 i n t bek e r e s ( t e g l a l a p t t ) {59 i n t db=0, o s s z e s = 2 , b f x ;60 bool f o l y t a t ;61 t t = new t e g l a l a p [ o s s z e s ] ;62 do {63 c e r r

  • Tglalapok rajzolsa

    74 de le te [ ] t t ;75 t t = t t 2 ;76 }77 ( t t ) [ db ] . b f . x = b fx ;78 ( t t ) [ db ] . b f . y = beke r ( db+1, "BF sa rok Y" ,79 MINY, MAXY1);80 ( t t ) [ db ] . j a . x = beke r ( db+1, "JA sa rok X" ,81 ( t t ) [ db ] . b f . x+1, MAXX) ;82 ( t t ) [ db ] . j a . y = beke r ( db+1, "JA sa rok Y" ,83 ( t t ) [ db ] . b f . y+1, MAXY) ;84 cout ( t t ) [ db ] . c ;86 db++;87 }88 } whi le ( f o l y t a t ) ;89 re tu rn db ;90 }

    Dr. Hatwgner F. Mikls 8. elads

    #include using namespace std;#define MINX 0#define MAXX 79#define MINY 0#define MAXY 24struct koordinata { int x, y;};struct teglalap { koordinata bf, ja; char c;};bool takarja(teglalap t, int s, int o) { return (t.bf.x=o) and (t.bf.y=s);}void rajzol(teglalap tt[], int db) { for(int s=MINY; s

  • Tglalapok rajzolsa

    Kimenet 1/2Rajzprogram - adja meg a tglalapok adatait!

    [Felhasznalva: 0, elemszam: 2]1. teglalap BF sarok X: [0, 78] (negativra vege) 01. teglalap BF sarok Y[0, 23] 01. teglalap JA sarok X[1, 79] 51. teglalap JA sarok Y[1, 24] 51. teglalap rajzol karaktere: *

    [Felhasznalva: 1, elemszam: 2]2. teglalap BF sarok X: [0, 78] (negativra vege) 22. teglalap BF sarok Y[0, 23] 22. teglalap JA sarok X[3, 79] 72. teglalap JA sarok Y[3, 24] 72. teglalap rajzol karaktere: |

    [Felhasznalva: 2, elemszam: 2]3. teglalap BF sarok X: [0, 78] (negativra vege) 4

    [Memoriafoglalas + mozgatas]3. teglalap BF sarok Y[0, 23] 43. teglalap JA sarok X[5, 79] 93. teglalap JA sarok Y[5, 24] 93. teglalap rajzol karaktere: -

    [Felhasznalva: 3, elemszam: 4]4. teglalap BF sarok X: [0, 78] (negativra vege) -1

    Kimenet 2/2

    ******

    ******

    **||||||

    **||||||

    **||------

    **||------

    ||------

    ||------

    ------

    ------

    Dr. Hatwgner F. Mikls 8. elads

  • C-stlus karakterlncok

    A C nyelv karakterlncai

    C-ben nincs string tpus karakteres tmbk troljk a jelekASCII kdjait, a lnc vgt a 0 kd karakter ('\0') jelzi

    Minden eddig ltott karakterlnc literl valjban konstans Ckarakterlnc (tmb) volt!

    char str[] = "abc"; Automatikusan bekerl a lnczrkarakter a tmb vgre!

    Karakterlncok kezelse: a cstring (string.h) fggvnyeivel, pl.

    size_t strlen(const char *s); hossz lekrdezsechar *strcat(char *dest, const char *src);

    sszefzschar *strcpy(char *dest, const char *src); msols

    A programoz felelssge, hogy az eredmny elfrjen a dest helyen!

    C++ string C-karakterlnc: string::c_str()

    Dr. Hatwgner F. Mikls 8. elads

  • C-stlus karakterlncok

    1 #i n c l u d e 2 #i n c l u d e 3 #i n c l u d e // s t r l e n , s t r copy , s t r c a t4 us ing namespace s t d ;56 vo id k i i r ( const char c s t r ) {7 const char ment = c s t r ;8 cout

  • C-stlus karakterlncok

    21 i n t main ( ) {22 k i i r ( "" ) ;23 k i i r ( "C" ) ;24 k i i r ( "C s t i l u s " ) ;25 s t r i n g h = " He l l o " ;26 k i i r ( h . c_st r ( ) ) ;27 char v [ ] = " v i l a g !\ n" ;28 char c s = new char [ h . l e n g t h ( ) + s t r l e n ( v ) + 1 ] ;29 s t r c p y ( cs , h . c_st r ( ) ) ;30 s t r c a t ( cs , v ) ;31 cout

  • C-stlus karakterlncok

    KimenetASCII: 0

    Olv.:

    ASCII: 67 0

    Olv.: C

    ASCII: 67 45 115 116 105 108 117 115 0

    Olv.: C - s t i l u s

    ASCII: 72 101 108 108 111 0

    Olv.: H e l l o

    Hello vilag!

    Dr. Hatwgner F. Mikls 8. elads

  • Mtrixok

    Mtrix: azonos tpus elemek ktdimenzis tmbjeA C++-ban csak egydimenzis tmbk lteznek, de ezekettetszleges mlysgben egymsba lehet gyazni!

    mtrix = vektorokbl ll vektor

    A =

    11 12 13 1421 22 23 2431 32 33 34

    int A[3][4] = {{11, 12, 13, 14},{21, 22, 23, 24},

    {31, 32, 33, 34} };

    ...0 1 2 m ...0 1 2 m ... ...0 1 2 m

    A[0] A[1] A[n]

    A[1][2]

    Mtrixok sszeadsa: (A+ B)[i , j ] = A[i , j ] + B[i , j ], ahol A s Bkt n m mret mtrix.

    Dr. Hatwgner F. Mikls 8. elads

  • Mtrixok

    5 #d e f i n e SOROK 36 #d e f i n e OSZLOPOK 478 i n t main ( ) {9 // d e k l a r a c i o , i n i c i a l i z a c i o10 i n t a [SOROK] [OSZLOPOK] = {11 { 11 , 12 , 13 , 14 } ,12 { 21 , 22 , 23 , 24 } ,13 { 31 , 32 , 33 , 34 }14 } ;15 i n t b [SOROK] [OSZLOPOK] , c [SOROK] [OSZLOPOK ] ;16 s rand ( t ime (NULL ) ) ;17 f o r ( i n t s=0; s

  • Mtrixok

    22 f o r ( i n t s=0; s

  • Mtrixok

    Kimenet

    11 12 13 14 33 49 36 12 44 61 49 26

    21 22 23 24 + 20 45 24 18 = 41 67 47 42

    31 32 33 34 19 10 11 42 50 42 44 76

    Hogyan adhat t egy mtrix fggvnynek?

    OK X

    void fv(int t[SOROK][OSZLOPOK]) { //...

    void fv(int t[][OSZLOPOK]) { //...

    void fv(int (*t)[OSZLOPOK]) { //...

    Hiba X Ez mutattmb, nem mtrix!

    void fv(int *t[OSZLOPOK]) { //...

    Dr. Hatwgner F. Mikls 8. elads

  • Mtrixok

    45 i n t main ( ) {46 i n t a [SOROK] [OSZLOPOK] , b [SOROK] [OSZLOPOK] ,47 c [SOROK] [OSZLOPOK ] ;48 s rand ( t ime (NULL ) ) ;49 g e n e r a l ( a ) ;50 g e n e r a l ( b ) ;51 o s s z ead ( a , b , c ) ;52 me g j e l e n i t ( a , b , c ) ;53 r e t u r n 0 ;54 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include using namespace std;#define SOROK 3#define OSZLOPOK 4void general(int t[][OSZLOPOK]) { for(int s=0; s

  • Mtrixok

    5 #d e f i n e SOROK 36 #d e f i n e OSZLOPOK 478 vo id g e n e r a l ( i n t t [ ] [ OSZLOPOK] ) {9 f o r ( i n t s=0; s

  • Mtrixok

    26 vo id meg j e l e n i t ( const i n t a [ ] [ OSZLOPOK] ,27 const i n t b [ ] [ OSZLOPOK] ,28 const i n t c [ ] [ OSZLOPOK] ) {29 f o r ( i n t s=0; s

  • Mtrixok

    Problma:

    rugalmatlan fggvnyek,mert az oszlopok szmargztett

    Megolds:

    hozzunk ltre dinamikusanvektorokat (pl. int*-galcmezhetk), majd

    ezek cmeit troljuk egyjabb, dinamikus vektorban(int**, mutattmb)!

    ...

    ...0 1 2 m012

    n

    A[0]A[0][1]

    ...

    A[n]

    int**int*

    int

    Dr. Hatwgner F. Mikls 8. elads

  • Mtrixok

    56 i n t main ( ) {57 s rand ( t ime (NULL ) ) ;58 i n t so rok = 1 + rand ()%4;59 i n t o s z l opok = 1 + rand ()%4;60 i n t a = l e f o g l a l ( sorok , o s z l opok ) ;61 i n t b = l e f o g l a l ( sorok , o s z l opok ) ;62 i n t c = l e f o g l a l ( sorok , o s z l opok ) ;63 g e n e r a l ( a , sorok , o s z l opok ) ;64 g e n e r a l ( b , sorok , o s z l opok ) ;65 o s s z ead ( a , b , c , sorok , o s z l opok ) ;66 me g j e l e n i t ( a , b , c , sorok , o s z l opok ) ;67 f e l s z a b a d i t ( a , s o rok ) ;68 f e l s z a b a d i t (b , so rok ) ;69 f e l s z a b a d i t ( c , s o rok ) ;70 re tu rn 0 ;71 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include using namespace std;int** lefoglal(int sorok, int oszlopok) { int** t = new int*[sorok]; for(int s=0; s

  • Mtrixok

    6 i n t l e f o g l a l ( i n t sorok , i n t o s z l opok ) {7 i n t t = new i n t [ s o rok ] ;8 f o r ( i n t s=0; s

  • Mtrixok

    22 vo id os s z ead ( i n t a , i n t b , i n t c ,23 i n t sorok , i n t o s z l opok ) {24 f o r ( i n t s=0; s

  • Mtrixok

    Alternatv megolds:

    utnozzuk a statikus tmbk memriabeli szerkezett, azaz

    valjban vektornak foglalunk helyet, s erre kpezzk le amtrix elemeit

    ...0 1 2 m...

    ...

    ...

    ... ... ......

    012

    n

    A[2*sorhossz+1]

    intint*

    Dr. Hatwgner F. Mikls 8. elads

  • Mtrixok

    45 i n t main ( ) {46 s rand ( t ime (NULL ) ) ;47 i n t so rok = 1 + rand ()%4;48 i n t o s z l opok = 1 + rand ()%4;49 i n t a = l e f o g l a l ( sorok , o s z l opok ) ;50 i n t b = l e f o g l a l ( sorok , o s z l opok ) ;51 i n t c = l e f o g l a l ( sorok , o s z l opok ) ;52 g e n e r a l ( a , sorok , o s z l opok ) ;53 g e n e r a l ( b , sorok , o s z l opok ) ;54 o s s z ead ( a , b , c , sorok , o s z l opok ) ;55 me g j e l e n i t ( a , b , c , sorok , o s z l opok ) ;56 de le te [ ] a ;57 de le te [ ] b ;58 de le te [ ] c ;59 re tu rn 0 ;60 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include using namespace std;int* lefoglal(int sorok, int oszlopok) { return new int[sorok*oszlopok];}void general(int* t, int sorok, int oszlopok) { for(int s=0; s

  • Mtrixok

    6 i n t l e f o g l a l ( i n t sorok , i n t o s z l opok ) {7 re tu rn new i n t [ s o rok o s z l opok ] ;8 }910 vo id g e n e r a l ( i n t t , i n t sorok , i n t o s z l opok ) {11 f o r ( i n t s=0; s

  • Mtrixok

    Inline fggvnyek:

    javaslat a fordtnak, hogy a fggvny kdjt helyettestse beminden hvs helyre

    csak egyszer, rvid fggvnyekkel javasolt hasznlni

    fggvny hvsi id megtakarthat kdmret nvekszik

    10 i n l i n e i n t i d x ( i n t s , i n t o , i n t o s z l opok ) {11 re tu rn s o s z l opok + o ;12 }1314 vo id g e n e r a l ( i n t t , i n t sorok , i n t o s z l opok ) {15 f o r ( i n t s=0; s