View
14
Download
0
Category
Preview:
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
Recommended