46

Programozás alapjai - (GKxB INTM023)rs1.sze.hu/~hatwagnf/prgalap/ea08.pdfProgramozás alapjai (GKxB_INTM023) Dr. Hatwágner F. Miklós Széchenyi István Egyetem, Gy®r 2018. november

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

  • Programozs alapjai

    (GKxB_INTM023)

    Dr. Hatwgner F. Mikls

    Szchenyi Istvn Egyetem, Gyr

    2018. november 4.

  • Paramterek rtkt felcserl fggvny ksztse

    Feladat:

    ksztsnk olyan fggvnyt, ami a kt paramternek rtktfelcserli!

    Problma:

    rtk szerinti paramter-tads

    csak egy visszatrsi rtke lehet a fggvnynek

    1 #i n c l u d e 23 vo id nyomtat ( i n t a , i n t b ) {4 p r i n t f ( "a = %d , b = %d\n" , a , b ) ;5 }

    Dr. Hatwgner F. Mikls 8. elads

    #include void nyomtat(int a, int b) { printf("a = %d, b = %d\n", a, b);}void csere1(int a, int b) { int cs = a; a = b; b = cs;}struct ketszam { int a, b; };struct ketszam csere2(int a, int b) { struct ketszam cs = {b, a}; return cs;}void csere3(int* a, int* b) { int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("eredeti ertekek:\t"); nyomtat(a, b); csere1(a, b); printf("csere1 utan:\t\t"); nyomtat(a, b); struct ketszam ksz = csere2(a, b); a = ksz.a; b = ksz.b; printf("csere2 utan:\t\t"); nyomtat(a, b); csere3(&a, &b); printf("csere3 utan:\t\t"); nyomtat(a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Paramterek rtkt felcserl fggvny ksztse

    Els prblkozs, csere1

    7 vo id c s e r e 1 ( i n t a , i n t b ) {8 i n t c s = a ;9 a = b ;10 b = cs ;11 }

    A main rszlete

    26 i n t main ( vo id ) {27 i n t a = 1 , b = 2 ;28 p r i n t f ( " e r e d e t i e r t e k e k : \ t " ) ; nyomtat ( a , b ) ;29 c s e r e 1 ( a , b ) ; p r i n t f ( " c s e r e 1 utan : \ t \ t " ) ; nyomtat ( a , b ) ;

    Kimenet rszleteeredeti ertekek: a = 1, b = 2

    csere1 utan: a = 1, b = 2

    Dr. Hatwgner F. Mikls 8. elads

    #include void nyomtat(int a, int b) { printf("a = %d, b = %d\n", a, b);}void csere1(int a, int b) { int cs = a; a = b; b = cs;}struct ketszam { int a, b; };struct ketszam csere2(int a, int b) { struct ketszam cs = {b, a}; return cs;}void csere3(int* a, int* b) { int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("eredeti ertekek:\t"); nyomtat(a, b); csere1(a, b); printf("csere1 utan:\t\t"); nyomtat(a, b); struct ketszam ksz = csere2(a, b); a = ksz.a; b = ksz.b; printf("csere2 utan:\t\t"); nyomtat(a, b); csere3(&a, &b); printf("csere3 utan:\t\t"); nyomtat(a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!

    #include void nyomtat(int a, int b) { printf("a = %d, b = %d\n", a, b);}void csere1(int a, int b) { int cs = a; a = b; b = cs;}struct ketszam { int a, b; };struct ketszam csere2(int a, int b) { struct ketszam cs = {b, a}; return cs;}void csere3(int* a, int* b) { int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("eredeti ertekek:\t"); nyomtat(a, b); csere1(a, b); printf("csere1 utan:\t\t"); nyomtat(a, b); struct ketszam ksz = csere2(a, b); a = ksz.a; b = ksz.b; printf("csere2 utan:\t\t"); nyomtat(a, b); csere3(&a, &b); printf("csere3 utan:\t\t"); nyomtat(a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Paramterek rtkt felcserl fggvny ksztse

    Msodik prblkozs, csere2

    13 s t r u c t ketszam { i n t a , b ; } ;1415 s t r u c t ketszam c s e r e 2 ( i n t a , i n t b ) {16 s t r u c t ketszam cs = {b , a } ;17 re tu rn c s ;18 }

    A main rszlete

    30 s t r u c t ketszam ksz = c s e r e 2 ( a , b ) ; a = ksz . a ; b = ksz . b ;31 p r i n t f ( " c s e r e 2 utan : \ t \ t " ) ; nyomtat ( a , b ) ;

    Kimenet rszletecsere2 utan: a = 2, b = 1

    Dr. Hatwgner F. Mikls 8. elads

    #include void nyomtat(int a, int b) { printf("a = %d, b = %d\n", a, b);}void csere1(int a, int b) { int cs = a; a = b; b = cs;}struct ketszam { int a, b; };struct ketszam csere2(int a, int b) { struct ketszam cs = {b, a}; return cs;}void csere3(int* a, int* b) { int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("eredeti ertekek:\t"); nyomtat(a, b); csere1(a, b); printf("csere1 utan:\t\t"); nyomtat(a, b); struct ketszam ksz = csere2(a, b); a = ksz.a; b = ksz.b; printf("csere2 utan:\t\t"); nyomtat(a, b); csere3(&a, &b); printf("csere3 utan:\t\t"); nyomtat(a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!

    #include void nyomtat(int a, int b) { printf("a = %d, b = %d\n", a, b);}void csere1(int a, int b) { int cs = a; a = b; b = cs;}struct ketszam { int a, b; };struct ketszam csere2(int a, int b) { struct ketszam cs = {b, a}; return cs;}void csere3(int* a, int* b) { int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("eredeti ertekek:\t"); nyomtat(a, b); csere1(a, b); printf("csere1 utan:\t\t"); nyomtat(a, b); struct ketszam ksz = csere2(a, b); a = ksz.a; b = ksz.b; printf("csere2 utan:\t\t"); nyomtat(a, b); csere3(&a, &b); printf("csere3 utan:\t\t"); nyomtat(a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Paramterek rtkt felcserl fggvny ksztse

    Harmadik prblkozs, csere3

    20 vo id c s e r e 3 ( i n t a , i n t b ) {21 i n t c s = a ;22 a = b ;23 b = cs ;24 }

    A main rszlete

    32 c s e r e 3 (&a , &b ) ; p r i n t f ( " c s e r e 3 utan : \ t \ t " ) ; nyomtat ( a , b ) ;33 re tu rn 0 ;34 }

    Kimenet rszletecsere2 utan: a = 2, b = 1

    csere3 utan: a = 1, b = 2

    Dr. Hatwgner F. Mikls 8. elads

    #include void nyomtat(int a, int b) { printf("a = %d, b = %d\n", a, b);}void csere1(int a, int b) { int cs = a; a = b; b = cs;}struct ketszam { int a, b; };struct ketszam csere2(int a, int b) { struct ketszam cs = {b, a}; return cs;}void csere3(int* a, int* b) { int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("eredeti ertekek:\t"); nyomtat(a, b); csere1(a, b); printf("csere1 utan:\t\t"); nyomtat(a, b); struct ketszam ksz = csere2(a, b); a = ksz.a; b = ksz.b; printf("csere2 utan:\t\t"); nyomtat(a, b); csere3(&a, &b); printf("csere3 utan:\t\t"); nyomtat(a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!

    #include void nyomtat(int a, int b) { printf("a = %d, b = %d\n", a, b);}void csere1(int a, int b) { int cs = a; a = b; b = cs;}struct ketszam { int a, b; };struct ketszam csere2(int a, int b) { struct ketszam cs = {b, a}; return cs;}void csere3(int* a, int* b) { int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("eredeti ertekek:\t"); nyomtat(a, b); csere1(a, b); printf("csere1 utan:\t\t"); nyomtat(a, b); struct ketszam ksz = csere2(a, b); a = ksz.a; b = ksz.b; printf("csere2 utan:\t\t"); nyomtat(a, b); csere3(&a, &b); printf("csere3 utan:\t\t"); nyomtat(a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Paramterek rtkt felcserl fggvny ksztse

    Cserl fggvnyek

    3 vo id c s e r e 1 ( i n t a , i n t b ) {4 p r i n t f ( " c s e r e 1 : ' a ' c ime : %p , ' b ' c ime : %p\n" , &a , &b ) ;5 p r i n t f ( " c s e r e 1 : ' a ' e r t e k e : %d , ' b ' e r t e k e : %d\n" , a , b ) ;6 i n t c s = a ;7 a = b ;8 b = cs ;9 }1011 vo id c s e r e 3 ( i n t a , i n t b ) {12 p r i n t f ( " c s e r e 3 : ' a ' c ime : %p , ' b ' c ime : %p\n" , &a , &b ) ;13 p r i n t f ( " c s e r e 3 : ' a ' e r t e k e : %p , ' b ' e r t e k e : %p\n" , a , b ) ;14 p r i n t f ( " c s e r e 3 : ' a ' cimen l e v o e r t e k : %d , "15 " ' b ' cimen l e v o e r t e k : %d\n" , a , b ) ;16 i n t c s = a ;17 a = b ;18 b = cs ;19 }

    Dr. Hatwgner F. Mikls 8. elads

    #include void csere1(int a, int b) { printf("csere1: 'a' cime: %p, 'b' cime: %p\n", &a, &b); printf("csere1: 'a' erteke: %d, 'b' erteke: %d\n", a, b); int cs = a; a = b; b = cs;}void csere3(int* a, int* b) { printf("csere3: 'a' cime: %p, 'b' cime: %p\n", &a, &b); printf("csere3: 'a' erteke: %p, 'b' erteke: %p\n", a, b); printf("csere3: 'a' cimen levo ertek: %d, " "'b' cimen levo ertek: %d\n", *a, *b); int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("main: 'a' cime: %p, 'b' cime: %p\n", &a, &b); printf("main: 'a' erteke: %d, 'b' erteke: %d\n", a, b); csere1(a, b); printf("main, csere1 hivas utan: " "'a' erteke: %d, 'b' erteke: %d\n", a, b); csere3(&a, &b); printf("main, csere3 hivas utan: " "'a' erteke: %d, 'b' erteke: %d\n", a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Paramterek rtkt felcserl fggvny ksztse

    main fggvny

    21 i n t main ( vo id ) {22 i n t a = 1 , b = 2 ;23 p r i n t f ( "main : ' a ' c ime : %p , ' b ' c ime : %p\n" , &a , &b ) ;24 p r i n t f ( "main : ' a ' e r t e k e : %d , ' b ' e r t e k e : %d\n" , a , b ) ;25 c s e r e 1 ( a , b ) ;26 p r i n t f ( "main , c s e r e 1 h i v a s utan : "27 " ' a ' e r t e k e : %d , ' b ' e r t e k e : %d\n" , a , b ) ;28 c s e r e 3 (&a , &b ) ;29 p r i n t f ( "main , c s e r e 3 h i v a s utan : "30 " ' a ' e r t e k e : %d , ' b ' e r t e k e : %d\n" , a , b ) ;31 re tu rn 0 ;32 }

    Dr. Hatwgner F. Mikls 8. elads

    #include void csere1(int a, int b) { printf("csere1: 'a' cime: %p, 'b' cime: %p\n", &a, &b); printf("csere1: 'a' erteke: %d, 'b' erteke: %d\n", a, b); int cs = a; a = b; b = cs;}void csere3(int* a, int* b) { printf("csere3: 'a' cime: %p, 'b' cime: %p\n", &a, &b); printf("csere3: 'a' erteke: %p, 'b' erteke: %p\n", a, b); printf("csere3: 'a' cimen levo ertek: %d, " "'b' cimen levo ertek: %d\n", *a, *b); int cs = *a; *a = *b; *b = cs;}int main(void) { int a = 1, b = 2; printf("main: 'a' cime: %p, 'b' cime: %p\n", &a, &b); printf("main: 'a' erteke: %d, 'b' erteke: %d\n", a, b); csere1(a, b); printf("main, csere1 hivas utan: " "'a' erteke: %d, 'b' erteke: %d\n", a, b); csere3(&a, &b); printf("main, csere3 hivas utan: " "'a' erteke: %d, 'b' erteke: %d\n", a, b); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Paramterek rtkt felcserl fggvny ksztse

    Kimenetmain: 'a' cime: 0x7ffce0413c38, 'b' cime: 0x7ffce0413c3c

    main: 'a' erteke: 1, 'b' erteke: 2

    csere1: 'a' cime: 0x7ffce0413c0c, 'b' cime: 0x7ffce0413c08

    csere1: 'a' erteke: 1, 'b' erteke: 2

    main, csere1 hivas utan: 'a' erteke: 1, 'b' erteke: 2

    csere3: 'a' cime: 0x7ffce0413c08, 'b' cime: 0x7ffce0413c00

    csere3: 'a' erteke: 0x7ffce0413c38, 'b' erteke: 0x7ffce0413c3c

    csere3: 'a' cimen levo ertek: 1, 'b' cimen levo ertek: 2

    main, csere3 hivas utan: 'a' erteke: 2, 'b' erteke: 1

    Dr. Hatwgner F. Mikls 8. elads

  • Tglalapok rajzolsa

    bekerBFX: Akarja folytatni a bevitelt? Ha igen, mi a koordinta?

    39 boo l bekerBFX ( i n t db , i n t min , i n t max , i n t k ) {40 boo l f o l y t a t ;41 do {42 p r i n t f ( "%d . t e g l a l a p BF sa rok X [%d , %d ] "43 " ( n e g a t i v r a vege ) " , db , MINX, MAXX1);44 s c an f ( "%d" , k ) ;45 f o l y t a t = k>=0;46 } whi le ( f o l y t a t && (kMAXX1)) ;47 re tu rn f o l y t a t ;48 }4950 i n t beke r ( i n t db , char s [ ] , i n t min , i n t max) {51 i n t k ;52 do {53 p r i n t f ( "%d . t e g l a l a p %s [%d , %d ] " , db , s , min , max ) ;54 s c an f ( "%d" , &k ) ;55 } whi le ( kmax ) ;56 re tu rn k ;57 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include #define MAXALAK 128#define MINX 0#define MAXX 79#define MINY 0#define MAXY 24struct koordinata { int x, y;};struct teglalap { struct koordinata bf, ja; char c;};bool takarja(struct teglalap t, int s, int o) { return (t.bf.x=o) and (t.bf.y=s);}void rajzol(struct teglalap tt[MAXALAK], int db) { for(int s=MINY; s=0; } while(folytat && (*kMAXX-1)); return folytat;}int beker(int db, char s[], int min, int max) { int k; do { printf("%d. teglalap %s [%d, %d] ", db, s, min, max); scanf("%d", &k); } while(kmax); return k; }int main(void) { struct teglalap tt[MAXALAK]; int db; bool folytat = true; printf("Rajzprogram - adja meg a tglalapok adatait!\n"); for(db=0; db

  • Tglalapok rajzolsa

    59 i n t main ( vo id ) {60 s t r u c t t e g l a l a p t t [MAXALAK] ; i n t db ; boo l f o l y t a t = t r u e ;61 p r i n t f ( "Rajzprogram ad j a meg a t g l a l a p o k a d a t a i t ! \ n" ) ;62 f o r ( db=0; db

  • Mutatk

    Nhny tovbbi tudnival mutatkkal kapcsolatban

    Mintaplda:

    Vigyzz! i egsz, pi1 s pi2 viszont egszet cmz mutatk!

    A * krl tetszleges szm szkz elhelyezhet

    Mutat is kaphat inicializlssal kezdrtket

    4 i n t i =3, pi1 , p i 2 ;5 p i 1 = p i 2 = &i ; // OK6 double d=1.5 ;7 double pd = &d ; // i n i c i a l i z a l a s

    Dr. Hatwgner F. Mikls 8. elads

    #include int main(void) { int i=3, *pi1, *pi2; pi1 = pi2 = &i; // OK double d=1.5; double* pd = &d; // inicializalas // pd = &12.34; // error: lvalue required as unary '&' operand // literalnak nincs memoriacime, ertelmetlen // pd = pi1; warning: assignment from // incompatible pointer type void *pv; pv = pi1; // OK pi1 = pv; // OK, de tenyleg int-et cimzett pv? pv = NULL; // OK return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Mutatk

    Ha valaminek nincs memriacme, akkor az & opertor semtudja ellltani

    8 // pd = &12.34;9 // e r r o r : l v a l u e r e q u i r e d as unary '& ' operand10 // l i t e r a l n a k n i n c s memoriacime , e r t e lm e t l e n

    rtkads ltalban csak azonos tpus mutatk kzttrtelmes

    11 // pd = p i1 ; warn ing : a s s i gnment from12 // i n c ompa t i b l e p o i n t e r type

    Dr. Hatwgner F. Mikls 8. elads

  • Mutatk

    Kivtel: void* brmilyen ms mutat rtkt felveheti( tpusinformci eldobsa)

    13 void pv ;14 pv = p i 1 ; // OK

    Fordtva megy ugyan, de nem lehetnk benne biztosak, hogy azon acmen milyen tpus adat van

    15 p i 1 = pv ; // OK, de t e n y l e g i n te t c imze t t pv?

    Dr. Hatwgner F. Mikls 8. elads

  • Mutatk

    A NULL specilis memriacm: semmilyen adatot nem trolnakott, s

    hiba, vagy valami hinynak jelzsre hasznljk,

    brmilyen tpus mutathoz hozzrendelhet rtk

    16 pv = NULL ; // OK

    Dr. Hatwgner F. Mikls 8. elads

  • Dtumok kezelse

    Problma:

    struktrk ltalban nagyok, fggvnyhvsnl a paramtertads a msols miatt idignyes

    Megolds:

    adjuk t a struktra cmt!

    Veszly! Ha a hvott fv. mdostja a paramtert, annak a hvfggvnyben is lesz hatsa!

    Ha a hvott fggvnynek nem clja mdostani a paramtert:const csak olvashatv teszi (brmilyen ms vltoznl ishasznlhat tpusmdost)

    Indirekci + tagelrs: -> opertorral, pl. (*d).nap d->nap

    Dr. Hatwgner F. Mikls 8. elads

  • Dtumok kezelse

    23 // datum t a r t a lm i e l l e n o r z e s e24 boo l e l l e n o r i z ( const s t r u c t datum d ) {25 i f (d>hoho>12) r e t u r n f a l s e ;26 i n t n = napok (d>ev , d>ho ) ;27 i f (d>napnap>n ) r e t u r n f a l s e ;28 r e t u r n t r u e ;29 }3031 i n t evNapja ( const s t r u c t datum d ) { // ev nap janak32 i n t n = d>nap ; // meghatarozasa33 f o r ( i n t h=1; hho ; h++) { // ev , ho , napbo l34 n += napok (d>ev , h ) ;35 }36 r e t u r n n ;37 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include struct datum { int ev, ho, nap;};bool szoko(int ev) { // szokoev megallapitas return (ev%4==0 and ev%100!=0) or ev%400==0;}int napok(int ev, int ho) { // honap napjainak szamat int nt[12] = // adja vissza adott evben { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if(ho == 2) { if(szoko(ev)) return 29; else return 28; } else { return nt[ho-1]; }}// datum tartalmi ellenorzesebool ellenoriz(const struct datum* d) { if(d->hoho>12) return false; int n = napok(d->ev, d->ho); if(d->napnap>n) return false; return true;}int evNapja(const struct datum* d) { // ev napjanak int n = d->nap; // meghatarozasa for(int h=1; hho; h++) { // ev, ho, napbol n += napok(d->ev, h); } return n;}int bazis(const struct datum* d) { // 0000.01.01 ota int b = 0; // eltelt napok szama for(int e=0; eev; e++) { b += 365 + szoko(e); } for(int h=1; hho; h++) { b += napok(d->ev, h); } b += d->nap; return b;}int kulonbseg(const struct datum* tol, const struct datum* ig) { return bazis(ig)-bazis(tol); // ket datum kozott} // eltelt napok szamastruct datum hoEsNap(int ev, int evNapja) { // nap even beluli struct datum d = { ev, 0, evNapja }; // szamabol ho es int h, n; // nap szamolasa for(h=1; d.nap>(n=napok(ev, h)); h++) { d.nap -= n; } d.ho = h; return d;}int main(void) { struct datum d = {2018, 3, 15}; printf("A megadott datum %s.\n" "%d.%d.%d az ev %d. napja.\n", (ellenoriz(&d)?"helyes":"hibas"), d.ev, d.ho, d.nap, evNapja(&d)); struct datum kar = {2018, 12, 24}; printf("Hany nap van karacsonyig? %d\n", kulonbseg(&d, &kar)); int evNapja = 300; d = hoEsNap(d.ev, evNapja); printf("%d %d. napja: %d.%d\n", d.ev, evNapja, d.ho, d.nap); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Dtumok kezelse

    65 i n t main ( vo id ) {66 s t r u c t datum d = {2018 , 3 , 15} ;67 p r i n t f ( "A megadott datum %s . \ n"68 "%d.%d.%d az ev %d . nap ja . \ n" ,69 ( e l l e n o r i z (&d )? " h e l y e s " : " h i b a s " ) ,70 d . ev , d . ho , d . nap , evNapja(&d ) ) ;71 s t r u c t datum kar = {2018 , 12 , 24} ;72 p r i n t f ( "Hany nap van k a r a c s o n y i g ? %d\n" ,73 ku lonbseg (&d , &kar ) ) ;74 i n t evNapja = 300 ;75 d = hoEsNap ( d . ev , evNapja ) ;76 p r i n t f ( "%d %d . nap ja : %d.%d\n" ,77 d . ev , evNapja , d . ho , d . nap ) ;78 r e t u r n 0 ;79 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include struct datum { int ev, ho, nap;};bool szoko(int ev) { // szokoev megallapitas return (ev%4==0 and ev%100!=0) or ev%400==0;}int napok(int ev, int ho) { // honap napjainak szamat int nt[12] = // adja vissza adott evben { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if(ho == 2) { if(szoko(ev)) return 29; else return 28; } else { return nt[ho-1]; }}// datum tartalmi ellenorzesebool ellenoriz(const struct datum* d) { if(d->hoho>12) return false; int n = napok(d->ev, d->ho); if(d->napnap>n) return false; return true;}int evNapja(const struct datum* d) { // ev napjanak int n = d->nap; // meghatarozasa for(int h=1; hho; h++) { // ev, ho, napbol n += napok(d->ev, h); } return n;}int bazis(const struct datum* d) { // 0000.01.01 ota int b = 0; // eltelt napok szama for(int e=0; eev; e++) { b += 365 + szoko(e); } for(int h=1; hho; h++) { b += napok(d->ev, h); } b += d->nap; return b;}int kulonbseg(const struct datum* tol, const struct datum* ig) { return bazis(ig)-bazis(tol); // ket datum kozott} // eltelt napok szamastruct datum hoEsNap(int ev, int evNapja) { // nap even beluli struct datum d = { ev, 0, evNapja }; // szamabol ho es int h, n; // nap szamolasa for(h=1; d.nap>(n=napok(ev, h)); h++) { d.nap -= n; } d.ho = h; return d;}int main(void) { struct datum d = {2018, 3, 15}; printf("A megadott datum %s.\n" "%d.%d.%d az ev %d. napja.\n", (ellenoriz(&d)?"helyes":"hibas"), d.ev, d.ho, d.nap, evNapja(&d)); struct datum kar = {2018, 12, 24}; printf("Hany nap van karacsonyig? %d\n", kulonbseg(&d, &kar)); int evNapja = 300; d = hoEsNap(d.ev, evNapja); printf("%d %d. napja: %d.%d\n", d.ev, evNapja, d.ho, d.nap); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Bubork rendezs

    1 #i n c l u d e 23 void buborek ( i n t t [ ] , i n t n ) {4 f o r ( i n t i=n1; i >=1; i) {5 f o r ( i n t k=0; k t [ k+1]) {7 i n t c s e r e = t [ k ] ;8 t [ k ] = t [ k+1] ;9 t [ k+1] = c s e r e ;10 }11 }12 }13 }

    Dr. Hatwgner F. Mikls 8. elads

    #include void buborek(int t[], int n) { for(int i=n-1; i>=1; i--) { for(int k=0; k t[k+1]) { int csere = t[k]; t[k] = t[k+1]; t[k+1] = csere; } } }}int main(void) { int szamok[] = {12, 3, 54, -4, 56, 4, 7, 3}; int n = sizeof(szamok)/sizeof(szamok[0]); buborek(szamok, n); printf("Rendezes utan:\n"); for(int i=0; i

  • Bubork rendezs

    15 i n t main ( vo id ) {16 i n t szamok [ ] = {12 , 3 , 54 , 4, 56 , 4 , 7 , 3} ;17 i n t n = s i z e o f ( szamok )/ s i z e o f ( szamok [ 0 ] ) ;18 buborek ( szamok , n ) ;19 p r i n t f ( "Rendezes utan : \ n" ) ;20 f o r ( i n t i =0; i=1; i--) { for(int k=0; k t[k+1]) { int csere = t[k]; t[k] = t[k+1]; t[k+1] = csere; } } }}int main(void) { int szamok[] = {12, 3, 54, -4, 56, 4, 7, 3}; int n = sizeof(szamok)/sizeof(szamok[0]); buborek(szamok, n); printf("Rendezes utan:\n"); for(int i=0; i

  • Mutatk s tmbk

    jdonsgok:

    Tmb elemszmt nem kell megadni a formlisparamterlistn (de a fv.-nek valahonnan tudnia kell, hnytmbelemet kell rendezni)

    A hvott fggvny mdostotta a paramter tmbt!

    Magyarzat:

    A tmbk ltalban nagyok mindig a cmet adjk t!A tmbk azonostja egy konstans mutat (a mutatt nem,de a mutatott helyen lv rtket lehet mdostani), pl.int t[] int* const tA tmb tartalma csak olvashatv tehet:const int* const a const int a[]

    Dr. Hatwgner F. Mikls 8. elads

  • Bubork rendezs

    15 void tombKi i r ( const i n t const t , i n t n ) {16 f o r ( i n t i =0; i=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* const t, int n) { for(int i=0; i

  • Mutatk

    Mutataritmetika: hasonlan vgezhet mvelet mutatkkal, mintegszekkel

    Mutat nvelhet, cskkenthet a tnyleges cm a mutatottadat mretnek tbbszrsvel vltozik

    Mutatk sszehasonlthatak (relcik)

    tmbelemCme =tmbKezdcme + index*sizeof(tmbelemTpusa)

    tomb[index] *(tomb + index)A void* mutat kivteles: a mutatott elem mrete ismeretlen

    Azonos tmb elemeit cmz mutatk klnbsge kpezhet

    Dr. Hatwgner F. Mikls 8. elads

  • Mutatk

    4 i n t t [ ] = { 100 , 200 , 300 } ;5 i n t p i = t ;6 p r i n t f ( " E l s o elem e r t e k e ( cime ) : \ t%d (%p)\n" ,7 p i [ 0 ] , t ) ;8 p i++;9 p r i n t f ( "Masodik elem e r t e k e ( cime ) : \ t%d (%p)\n" ,10 pi , p i ) ;11 p r i n t f ( "Harmadik elem e r t e k e ( cime ) : \ t%d (%p)\n" ,12 ( t +2) , t +2);

    Kimenet

    Elso elem erteke (cime): 100 (0x7ffc7a2b43f0)

    Masodik elem erteke (cime): 200 (0x7ffc7a2b43f4)

    Harmadik elem erteke (cime): 300 (0x7ffc7a2b43f8)

    Dr. Hatwgner F. Mikls 8. elads

    #include int main(void) { int t[] = { 100, 200, 300 }; int* pi = t; printf("Elso elem erteke (cime):\t%d (%p)\n", pi[0], t); pi++; printf("Masodik elem erteke (cime):\t%d (%p)\n", *pi, pi); printf("Harmadik elem erteke (cime):\t%d (%p)\n", *(t+2), t+2); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Bubork rendezs

    15 void tombKi i r ( const i n t t , i n t n ) {16 fo r ( const i n t vege=t+n ; t=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

  • Rsz-karakterlncok cserje

    Feladat:

    lltsunk el egy j karakterlncot egy rgi alapjn gy, hogy argiben egy adott rsz-karakterlncot lecserlnk valami msra!

    Pl. Mari foz, Mari sut, Mari mosogat Julcsa foz, Julcsasut, Julcsa mosogat

    Megolds:1 Kikeressk a rgi karakterlncban Mari els elfordulst2 Mindent, ami eltte van, hozzfzzk a kezdetben res j

    karakterlnc vghez3 Majd hozzfzzk j vghez Julcsa-t4 Megkeressk Mari kvetkez elfordulst, majd ismteljk 2-t

    s 3-at mindaddig, amg az sszes Mari-t meg nem talltuk5 Az utols Mari utni rszt hozzfzzk az j karakterlnc

    vghez

    Dr. Hatwgner F. Mikls 8. elads

  • Rsz-karakterlncok cserje

    Mire lesz szksg?size_t strlen(const char *s);

    s hosszt szolgltatja, a lnczr '\0' nlkl

    char *strstr(const char *haystack, const char

    *needle);

    Visszaadja needle els elfordulsnak cmt haystack-ben, vagyNULL mutatt szolgltat, ha nem fordul el benne

    char *strcat(char *dest, const char *src);

    char *strncat(char *dest, const char *src, size_t n);

    Hozzfzi src-t dest vghez, lezr '\0'-t megfelelen elhelyezistrncat() legfeljebb n karaktert fz hozz dest-hez

    size_t lt. unsigned int

    Elegend helynek (azaz strlen(dest)+strlen(src)+1, ill.strlen(dest)+n+1) kell lennie dest-tl kezdden!

    Dr. Hatwgner F. Mikls 8. elads

  • Rsz-karakterlncok cserje

    8 vo id nevek ( const char r e g i , char uj ,9 const char mit , const char mire ) {10 // Ke r e s e t t s z o v eg e t NEM ta r t a lmazo r e s z e l e j e11 const char e l e j e = r e g i ;12 char vege ; // es vege13 i n t mitHossz = s t r l e n ( mit ) ;14 whi le ( ( vege = s t r s t r ( e l e j e , mit ) ) != NULL) {15 // Meg ta l a l t uk v a l a h o l Mar i t16 // Atmasol juk , ami e l o t t e van17 s t r n c a t ( uj , e l e j e , vegee l e j e ) ;18 // Utana i r j u k J u l c s a t19 s t r c a t ( uj , mi re ) ;20 // Ke r e s e s t f o l y t a t j u k az e l s o Mari mogott21 e l e j e = vege + mitHossz ;22 }23 // Uto l s o Mari mogott i r e s z maso lasa24 s t r c a t ( uj , e l e j e ) ;25 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define MIBEN "Mari foz, Mari sut, Mari mosogat"#define MIT "Mari"#define MIRE "Julcsa"void nevek(const char* regi, char* uj, const char* mit, const char* mire) { // Keresett szoveget NEM tartalmazo resz eleje const char *eleje = regi; char *vege; // es vege int mitHossz = strlen(mit); while((vege = strstr(eleje, mit)) != NULL) { // Megtalaltuk valahol Marit // Atmasoljuk, ami elotte van strncat(uj, eleje, vege-eleje); // Utana irjuk Julcsat strcat(uj, mire); // Keresest folytatjuk az elso Mari mogott eleje = vege + mitHossz; } // Utolso Mari mogotti resz masolasa strcat(uj, eleje);}int main(void) { char mondat[128] = ""; nevek(MIBEN, mondat, MIT, MIRE); printf("%s\n", mondat); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Rsz-karakterlncok cserje

    8 s i z e_t s t r l e n ( const char s ) {9 const char ment = s ;10 whi le ( s != ' \0 ' ) s++;11 re tu rn sment ;12 }

    14 // V i s s z a tu kaza lb e l i e l s o e l o f o r d u l a s a n a k cime15 // i l l . NULL mutato , ha tu n i n c s i s a kaza lban .16 char s t r s t r ( const char kaza l , const char tu ){17 const char k , t ;18 f o r ( ; k a z a l ; ++ka z a l ) {19 f o r ( k=kaza l , t=tu ; t != ' \0 ' and k==t ; ++k,++t ) ;20 i f ( t==' \0 ' ) re tu rn ( ( char ) k a z a l ) ;21 }22 re tu rn NULL ;23 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define MIBEN "Mari foz, Mari sut, Mari mosogat"#define MIT "Mari"#define MIRE "Julcsa"size_t strlen(const char* s) { const char* ment = s; while(*s != '\0') s++; return s-ment;}// Vissza tu kazal-beli elso elofordulasanak cime// ill. NULL mutato, ha tu nincs is a kazalban.char *strstr(const char *kazal, const char *tu){const char *k, *t; for(; *kazal; ++kazal) { for(k=kazal,t=tu; *t!='\0' and *k==*t; ++k,++t); if(*t=='\0') return((char*)kazal); } return NULL;}char* strncat(char *cel, const char *forras, size_t n) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel != '\0') ++cel; // forras cel vegere masolasa a zaro '\0'-ig, vagy // legfeljebb n karakterig while(n-- and *forras!='\0') { *cel = *forras; cel++; forras++; } // Vissza az egyesitett karakterlanc kezdocime return ment;}char* strcat(char *cel, const char *forras) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel) ++cel; // forras cel vegere masolasa a zaro '\0'-ig while((*cel++ = *forras++)); // Vissza az egyesitett karakterlanc kezdocime return ment;}void nevek(const char* regi, char* uj, const char* mit, const char* mire) { // Keresett szoveget NEM tartalmazo resz eleje const char *eleje = regi; char *vege; // es vege int mitHossz = strlen(mit); while((vege = strstr(eleje, mit)) != NULL) { // Megtalaltuk valahol Marit // Atmasoljuk, ami elotte van strncat(uj, eleje, vege-eleje); // Utana irjuk Julcsat strcat(uj, mire); // Keresest folytatjuk az elso Mari mogott eleje = vege + mitHossz; } // Utolso Mari mogotti resz masolasa strcat(uj, eleje);}int main(void) { char mondat[128] = ""; nevek(MIBEN, mondat, MIT, MIRE); printf("%s\n", mondat); return 0;}

    HFMKattintson dupln a minta megtekintshez!

    #include #include #define MIBEN "Mari foz, Mari sut, Mari mosogat"#define MIT "Mari"#define MIRE "Julcsa"size_t strlen(const char* s) { const char* ment = s; while(*s != '\0') s++; return s-ment;}// Vissza tu kazal-beli elso elofordulasanak cime// ill. NULL mutato, ha tu nincs is a kazalban.char *strstr(const char *kazal, const char *tu){const char *k, *t; for(; *kazal; ++kazal) { for(k=kazal,t=tu; *t!='\0' and *k==*t; ++k,++t); if(*t=='\0') return((char*)kazal); } return NULL;}char* strncat(char *cel, const char *forras, size_t n) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel != '\0') ++cel; // forras cel vegere masolasa a zaro '\0'-ig, vagy // legfeljebb n karakterig while(n-- and *forras!='\0') { *cel = *forras; cel++; forras++; } // Vissza az egyesitett karakterlanc kezdocime return ment;}char* strcat(char *cel, const char *forras) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel) ++cel; // forras cel vegere masolasa a zaro '\0'-ig while((*cel++ = *forras++)); // Vissza az egyesitett karakterlanc kezdocime return ment;}void nevek(const char* regi, char* uj, const char* mit, const char* mire) { // Keresett szoveget NEM tartalmazo resz eleje const char *eleje = regi; char *vege; // es vege int mitHossz = strlen(mit); while((vege = strstr(eleje, mit)) != NULL) { // Megtalaltuk valahol Marit // Atmasoljuk, ami elotte van strncat(uj, eleje, vege-eleje); // Utana irjuk Julcsat strcat(uj, mire); // Keresest folytatjuk az elso Mari mogott eleje = vege + mitHossz; } // Utolso Mari mogotti resz masolasa strcat(uj, eleje);}int main(void) { char mondat[128] = ""; nevek(MIBEN, mondat, MIT, MIRE); printf("%s\n", mondat); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Rsz-karakterlncok cserje

    25 char s t r n c a t ( char c e l , const char f o r r a s , s i z e_t n ) {26 char ment = c e l ;27 // P o z i c i o n a l a s c e l l e z a r o '\0 ' k a r a k t e r e r e28 whi le ( c e l != ' \0 ' ) ++c e l ;29 // f o r r a s c e l v e g e r e maso lasa a za ro '\0 ' i g , vagy30 // l e g f e l j e b b n k a r a k t e r i g31 whi le (n and f o r r a s != ' \0 ' ) {32 c e l = f o r r a s ;33 c e l++; f o r r a s++;34 }35 // V i s s z a az e g y e s i t e t t k a r a k t e r l a n c kezdoc ime36 re tu rn ment ;37 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define MIBEN "Mari foz, Mari sut, Mari mosogat"#define MIT "Mari"#define MIRE "Julcsa"size_t strlen(const char* s) { const char* ment = s; while(*s != '\0') s++; return s-ment;}// Vissza tu kazal-beli elso elofordulasanak cime// ill. NULL mutato, ha tu nincs is a kazalban.char *strstr(const char *kazal, const char *tu){const char *k, *t; for(; *kazal; ++kazal) { for(k=kazal,t=tu; *t!='\0' and *k==*t; ++k,++t); if(*t=='\0') return((char*)kazal); } return NULL;}char* strncat(char *cel, const char *forras, size_t n) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel != '\0') ++cel; // forras cel vegere masolasa a zaro '\0'-ig, vagy // legfeljebb n karakterig while(n-- and *forras!='\0') { *cel = *forras; cel++; forras++; } // Vissza az egyesitett karakterlanc kezdocime return ment;}char* strcat(char *cel, const char *forras) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel) ++cel; // forras cel vegere masolasa a zaro '\0'-ig while((*cel++ = *forras++)); // Vissza az egyesitett karakterlanc kezdocime return ment;}void nevek(const char* regi, char* uj, const char* mit, const char* mire) { // Keresett szoveget NEM tartalmazo resz eleje const char *eleje = regi; char *vege; // es vege int mitHossz = strlen(mit); while((vege = strstr(eleje, mit)) != NULL) { // Megtalaltuk valahol Marit // Atmasoljuk, ami elotte van strncat(uj, eleje, vege-eleje); // Utana irjuk Julcsat strcat(uj, mire); // Keresest folytatjuk az elso Mari mogott eleje = vege + mitHossz; } // Utolso Mari mogotti resz masolasa strcat(uj, eleje);}int main(void) { char mondat[128] = ""; nevek(MIBEN, mondat, MIT, MIRE); printf("%s\n", mondat); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Rsz-karakterlncok cserje

    39 char s t r c a t ( char c e l , const char f o r r a s ) {40 char ment = c e l ;41 // P o z i c i o n a l a s c e l l e z a r o '\0 ' k a r a k t e r e r e42 wh i l e ( c e l ) ++c e l ;43 // f o r r a s c e l v eg e r e maso lasa a za ro '\0 ' i g44 wh i l e ( ( c e l++ = f o r r a s ++));45 // V i s s z a az e g y e s i t e t t k a r a k t e r l a n c kezdoc ime46 r e t u r n ment ;47 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define MIBEN "Mari foz, Mari sut, Mari mosogat"#define MIT "Mari"#define MIRE "Julcsa"size_t strlen(const char* s) { const char* ment = s; while(*s != '\0') s++; return s-ment;}// Vissza tu kazal-beli elso elofordulasanak cime// ill. NULL mutato, ha tu nincs is a kazalban.char *strstr(const char *kazal, const char *tu){const char *k, *t; for(; *kazal; ++kazal) { for(k=kazal,t=tu; *t!='\0' and *k==*t; ++k,++t); if(*t=='\0') return((char*)kazal); } return NULL;}char* strncat(char *cel, const char *forras, size_t n) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel != '\0') ++cel; // forras cel vegere masolasa a zaro '\0'-ig, vagy // legfeljebb n karakterig while(n-- and *forras!='\0') { *cel = *forras; cel++; forras++; } // Vissza az egyesitett karakterlanc kezdocime return ment;}char* strcat(char *cel, const char *forras) { char *ment = cel; // Pozicionalas cel lezaro '\0' karakterere while(*cel) ++cel; // forras cel vegere masolasa a zaro '\0'-ig while((*cel++ = *forras++)); // Vissza az egyesitett karakterlanc kezdocime return ment;}void nevek(const char* regi, char* uj, const char* mit, const char* mire) { // Keresett szoveget NEM tartalmazo resz eleje const char *eleje = regi; char *vege; // es vege int mitHossz = strlen(mit); while((vege = strstr(eleje, mit)) != NULL) { // Megtalaltuk valahol Marit // Atmasoljuk, ami elotte van strncat(uj, eleje, vege-eleje); // Utana irjuk Julcsat strcat(uj, mire); // Keresest folytatjuk az elso Mari mogott eleje = vege + mitHossz; } // Utolso Mari mogotti resz masolasa strcat(uj, eleje);}int main(void) { char mondat[128] = ""; nevek(MIBEN, mondat, MIT, MIRE); printf("%s\n", mondat); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Magn- s mssalhangzk keresse

    Feladat:llaptsuk meg egy karakterlnc sszes betjrl, hogy magn- vagymssalhangzk-e!

    Megolds:1 Egy magnhangzkat tartalmaz karakterlncot vesznk fel (mivel

    mssalhangzbl sokkal tbb van).2 Vgignzzk a vizsgland karakterlnc sszes jelt, s ha az bet,

    akkor kikeressk helyt a magnhangzk kztt.3 Ha megtalljuk magnhangz, ha nem mssalhangz

    Mire lesz szksg?char *strchr(const char *s, int c);

    c-nek s-en belli els elfordulsnak cmvel tr vissza, vagyNULL-lal, ha nem talljaAkkor is mkdik, ha c=='\0'

    char *strrchr(const char *s, int c);

    Mint strchr(), de az utols elforduls cmt adja vissza

    Dr. Hatwgner F. Mikls 8. elads

  • Magn- s mssalhangzk keresse

    5 i n t main ( vo id ) {6 char s zoveg = "Commodore 64 Bas i c V2" ;7 char magan = " eu i oa " ;8 p r i n t f ( "Magnhangzk (G) , m s s a l h a ng z k (S) s egy b "9 " j e l e k () k e r e s se \n%s \n" , s zoveg ) ;10 f o r ( ; s zoveg ; s zoveg++) {11 i f ( i s a l p h a ( s zoveg ) ) { // Bin r i s so r o s k e r e s s ?12 i f ( s t r c h r (magan , t o l owe r ( s zoveg ) ) ) p r i n t f ( "G" ) ;13 e l s e p r i n t f ( "S" ) ;14 } e l s e p r i n t f ( "" ) ;15 }16 p r i n t f ( "\n" ) ;17 re tu rn 0 ;18 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include int main(void) { char* szoveg = "Commodore 64 Basic V2"; char* magan = "euioa"; printf("Magnhangzk (G), mssalhangzk (S) s egyb " "jelek (-) keresse\n%s\n", szoveg); for(; *szoveg; szoveg++) { if(isalpha(*szoveg)) { // Binris soros keress? if(strchr(magan, tolower(*szoveg))) printf("G"); else printf("S"); } else printf("-"); } printf("\n"); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Magn- s mssalhangzk keresse

    5 const char s t r c h r ( const char s , i n t c ) {6 while ( s !=c and s != ' \0 ' ) s++;7 i f ( s ) return s ;8 e l s e return NULL ;9 }

    szrevtel: tl bonyolult a printf egyetlen karakter kirshoz!

    int putchar(int c);

    c karaktert a szabvny kimenetre rjaVisszatrsi rtk: a kirt karakter, vagy EOF hiba esetn

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include const char *strchr(const char *s, int c) { while(*s!=c and *s!='\0') s++; if(*s) return s; else return NULL;}int main(void) { char* szoveg = "Commodore 64 Basic V2"; char* magan = "euioa"; printf("Magnhangzk (G), mssalhangzk (S) s egyb " "jelek (-) keresse\n%s\n", szoveg); for(; *szoveg; szoveg++) { if(isalpha(*szoveg)) { // Binris soros keress? if(strchr(magan, tolower(*szoveg))) putchar('G'); else putchar('S'); } else putchar('-'); } putchar('\n'); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Magn- s mssalhangzk keresse

    11 i n t main ( vo id ) {12 char s zoveg = "Commodore 64 Bas i c V2" ;13 char magan = " eu i oa " ;14 p r i n t f ( "Magnhangzk (G) , m s s a l h a ng z k (S) s egy b "15 " j e l e k () k e r e s se \n%s \n" , s zoveg ) ;16 f o r ( ; s zoveg ; s zoveg++) {17 i f ( i s a l p h a ( s zoveg ) ) { // Bin r i s so r o s k e r e s s ?18 i f ( s t r c h r (magan , t o l owe r ( s zoveg ) ) ) pu tcha r ( 'G ' ) ;19 e l s e putcha r ( 'S ' ) ;20 } e l s e putcha r ( ' ' ) ;21 }22 putcha r ( ' \n ' ) ;23 re tu rn 0 ;24 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include const char *strchr(const char *s, int c) { while(*s!=c and *s!='\0') s++; if(*s) return s; else return NULL;}int main(void) { char* szoveg = "Commodore 64 Basic V2"; char* magan = "euioa"; printf("Magnhangzk (G), mssalhangzk (S) s egyb " "jelek (-) keresse\n%s\n", szoveg); for(; *szoveg; szoveg++) { if(isalpha(*szoveg)) { // Binris soros keress? if(strchr(magan, tolower(*szoveg))) putchar('G'); else putchar('S'); } else putchar('-'); } putchar('\n'); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Nevek sszehasonltsa

    Feladat:

    Olvassunk be kt nevet a szabvny bemenetrl, majdllaptsuk meg, melyik van elrbb a nvsorban!

    Mire lesz szksg?

    int strcmp(const char *s1, const char *s2);

    int strncmp(const char *s1, const char *s2,

    size_t n);sszehasonltjk az unsigned char-knt rtelmezett s1 s s2paramtereket. Vt. rtk

    negatv, ha s1 < s2,pozitv, ha s1 > s2,klnben nulla.

    strncmp() legfeljebb az els n karakterig vgzi azsszehasonltst

    Van rtelme s1 s s2 kzvetlen sszehasonltsnak (relcisopertorokkal)?

    Dr. Hatwgner F. Mikls 8. elads

  • Nevek sszehasonltsa

    6 i n t main ( vo id ) {7 p r i n t f ( "Adjon meg ke t nevet , megmondjuk , me l y i k van "8 " e l o r e b b a nevso rban !\ n" ) ;9 char n1 [MAX] , n2 [MAX] ;10 p r i n t f ( " E l s o nev : " ) ; s c a n f ( "%s " , n1 ) ;11 p r i n t f ( "Masodik nev : " ) ; s c a n f ( "%s " , n2 ) ;12 i n t s o r r e nd = strcmp ( n1 , n2 ) ;13 i f ( s o r r e nd < 0)14 p r i n t f ( "%s mege l o z i %st . \ n" , n1 , n2 ) ;15 e l s e i f ( s o r r e nd > 0)16 p r i n t f ( "%s mege l o z i %st . \ n" , n2 , n1 ) ;17 e l s e18 p r i n t f ( "A megadott ke t nev egyforma . \ n" ) ;19 re tu rn 0 ;20 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define MAX 128int main(void) { printf("Adjon meg ket nevet, megmondjuk, melyik van " "elorebb a nevsorban!\n"); char n1[MAX], n2[MAX]; printf("Elso nev: "); scanf("%s", n1); printf("Masodik nev: "); scanf("%s", n2); int sorrend = strcmp(n1, n2); if(sorrend < 0) printf("%s megelozi %s-t.\n", n1, n2); else if(sorrend > 0) printf("%s megelozi %s-t.\n", n2, n1); else printf("A megadott ket nev egyforma.\n"); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Nevek sszehasonltsa

    5 i n t st rcmp ( const char s1 , const char s2 ) {6 f o r ( ; s1 == s2 ; ++s1 , ++s2 )7 i f ( ! ( s1 ) ) re tu rn 0 ; // s1 megegyez ik s2v e l8 re tu rn ( s1 s2 ) ; } // s1 < s2 vagy s1 > s2

    Problma: scanf-fel nem tudunk szkzt (fehr karaktert)tartalmaz karakterlncot beolvasni!Lehetsges megoldsok:

    char *gets(char *s);

    Beolvas egy sort a szabvny bemenetrl j sor vagy EOFkarakterig. A soremelst nem trolja. Puer tlcsorduls ellenivdelem nincs, elavult fv.

    char *fgets(char *s, int size, FILE *stream);

    Beolvas egy sort, de legfeljebb size-1 karaktert a streamfolyambl j sor vagy EOF karakterig. A soremelst is trolja.

    Dr. Hatwgner F. Mikls 8. elads

    #include #define MAX 128int strcmp(const char *s1, const char *s2 ) { for(; *s1 == *s2; ++s1, ++s2) if(!(*s1)) return 0; // s1 megegyezik s2-vel return(*s1 - *s2); } // s1 < s2 vagy s1 > s2int main(void) { printf("Adjon meg ket nevet, megmondjuk, melyik van " "elorebb a nevsorban!\n"); char n1[MAX], n2[MAX]; printf("Elso nev: "); scanf("%s", n1); printf("Masodik nev: "); scanf("%s", n2); int sorrend = strcmp(n1, n2); if(sorrend < 0) printf("%s megelozi %s-t.\n", n1, n2); else if(sorrend > 0) printf("%s megelozi %s-t.\n", n2, n1); else printf("A megadott ket nev egyforma.\n"); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Nevek sszehasonltsa

    10 p r i n t f ( " E l s o nev : " ) ; g e t s ( n1 ) ;11 p r i n t f ( "Masodik nev : " ) ; g e t s ( n2 ) ;

    10 char vege ;11 p r i n t f ( " E l s o nev : " ) ; f g e t s ( n1 , MAX, s t d i n ) ;12 i f ( ( vege=s t r r c h r ( n1 , ' \n ' ) ) != NULL)13 vege = ' \0 ' ;14 p r i n t f ( "Masodik nev : " ) ; f g e t s ( n2 , MAX, s t d i n ) ;15 i f ( ( vege=s t r r c h r ( n2 , ' \n ' ) ) )16 vege = ' \0 ' ;

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define MAX 128int main(void) { printf("Adjon meg ket nevet, megmondjuk, melyik van " "elorebb a nevsorban!\n"); char n1[MAX], n2[MAX]; printf("Elso nev: "); gets(n1); printf("Masodik nev: "); gets(n2); int sorrend = strcmp(n1, n2); if(sorrend < 0) printf("%s megelozi %s-t.\n", n1, n2); else if(sorrend > 0) printf("%s megelozi %s-t.\n", n2, n1); else printf("A megadott ket nev egyforma.\n"); return 0;}

    HFMKattintson dupln a minta megtekintshez!

    #include #include #define MAX 128int main(void) { printf("Adjon meg ket nevet, megmondjuk, melyik van " "elorebb a nevsorban!\n"); char n1[MAX], n2[MAX]; char* vege; printf("Elso nev: "); fgets(n1, MAX, stdin); if((vege=strrchr(n1, '\n')) != NULL) *vege = '\0'; printf("Masodik nev: "); fgets(n2, MAX, stdin); if((vege=strrchr(n2, '\n'))) *vege = '\0'; int sorrend = strcmp(n1, n2); if(sorrend < 0) printf("%s megelozi %s-t.\n", n1, n2); else if(sorrend > 0) printf("%s megelozi %s-t.\n", n2, n1); else printf("A megadott ket nev egyforma.\n"); return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Nevek sszehasonltsa

    Elnys tulajdonsgok egyestse: getline

    nem olvas tbb karaktert, mint amennyi hely rendelkezsre ll

    nem trolja az j sor karaktert

    karakteres puert trli a kvetkez olvass eltt

    7 i n t g e t l i n e ( char s [ ] , i n t l im ) {8 i n t c , i ;9 f o r ( i =0; i

  • Karakterlncok beolvassa

    Feladat:

    Ksztsen programot, amely neveket olvas a szabvny bemenetrl EOF-ig vagyres sorig! Megllaptand s kijelezend a leghosszabb nv!

    15 i n t main ( vo id ) {16 i n t hos s z ; // Az a k t u a l i s s o r hos s za17 i n t max = 0 ; // Az a k t u a l i s max . s o r hos s za18 char s o r [MAX+1] ; // Az a k t u a l i s s o r19 char ment [MAX+1] ; // Az a k t u a l i s max . s o r20 p r i n t f ( "A l e gho s s z abb s z o v e g s o r k i v a l a s z t a s a \n"21 "A so r o k a t z a r j a l e Enter r e l ! \ n"22 " K i l e p e s u r e s s o r r a l vagy C t r l+Zv e l . \ n\n" ) ;23 whi le ( ( ho s s z=g e t l i n e ( sor , MAX) ) > 0) {24 i f ( ho s s z > max) {25 max = hos s z ;26 s t r c p y (ment , s o r ) ; } }27 p r i n t f ( "A l e gho s s z abb s o r : \ n" ) ;28 i f (max > 0) p r i n t f ( "\n%s \n" , ment ) ; // Vo l t s o r29 re tu rn 0 ;30 }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include #define MAX 1000int getline(char s[], int lim) { int c, i; for(i=0; i 0) { if (hossz > max) { max = hossz; strcpy(ment, sor); } } printf("A leghosszabb sor:\n"); if(max > 0) printf("\n%s\n", ment); // Volt sor return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Karakterlncok beolvassa

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

    char *strncpy(char *dest, const char *src, size_t n);

    Karakterek msolsa src helyrl dest-reAz eredmny (dest) cmvel trnek visszastrncpy() legfeljebb n karaktert msol, s ha src rvidebb n-nl, akkor alnczr nullt is kiteszi, de klnben nem.Nem ellenrzik, hogy az eredmny elfr-e a megadott dest helyen

    5 char s t r c p y ( char c e l , const char f o r r a s ) {6 char ment = c e l ;7 // f o r r a s c e lba maso lasa l e z a r o '\0 ' k a r a k t e r e v e l8 wh i l e ( ( c e l++ = f o r r a s ++));9 // V i s s z a a maso la t k a r a k t e r l a n c kezdoc ime10 r e t u r n ment ; }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define MAX 1000char *strcpy(char *cel, const char *forras) { char *ment = cel; // forras cel-ba masolasa lezaro '\0' karakterevel while((*cel++ = *forras++)); // Vissza a masolat karakterlanc kezdocime return ment; }int getline(char s[], int lim) { int c, i; for(i=0; i 0) { if (hossz > max) { max = hossz; strcpy(ment, sor); } } printf("A leghosszabb sor:\n"); if(max > 0) printf("\n%s\n", ment); // Volt sor return 0;}

    HFMKattintson dupln a minta megtekintshez!
  • Karakterlnc tokenekre bontsa

    Feladat:

    Hatrozzuk meg egy URL lekrdez karakterlncnakkulcs-rtk prjait!

    http://it.sze.hu/index.php?tart=hirek&old=2

    Mire lesz szksg?

    char *strtok(char *str, const char *delim);

    Ha str nem NULL, akkor visszaadja annak els tokenjt. Atokeneket delim karakterei vlaszthatjk el egymstl. Atovbbi tokenek megllaptshoz str-nek NULL rtknek kelllennie. Ha nincs tbb token, NULL rtk visszaadsval jelzi.str-be lnczr nullkat illeszt a tokenek keresse kzben!

    Dr. Hatwgner F. Mikls 8. elads

  • Karakterlnc tokenekre bontsa

    4 #d e f i n e SEP "&"5 i n t main ( vo id ) {6 char u r l [ ] =7 " ht tp : // i t . s z e . hu/ i ndex . php? t a r t=h i r e k&o ld=2" ;8 char pk = s t r c h r ( u r l , ' ? ' ) ;9 char pv ;10 i f ( pk && ( pk=s t r t o k ( pk+1, SEP ) ) ) {11 do {12 pv = s t r c h r ( pk , '= ' ) ;13 i f ( pv ) pv = ' \0 ' ;14 e l s e cont inue ;15 p r i n t f ( " Ku lc s : %s , r t k : %s \n" , pk , pv+1);16 } whi le ( ( pk=s t r t o k (NULL , SEP ) ) ) ;17 } e l s e {18 p r i n t f ( "Az URL nem ta r t a lmaz l e k rde z "19 " k a r a k t e r l ncot . \ n" ) ; }20 re tu rn 0 ; }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #define SEP "&"int main(void) { char url[] = "http://it.sze.hu/index.php?tart=hirek&old=2"; char* pk = strchr(url, '?'); char* pv; if(pk && (pk=strtok(pk+1, SEP))) { do { pv = strchr(pk, '='); if(pv) *pv = '\0'; else continue; printf("Kulcs: %s, rtk: %s\n", pk, pv+1); } while((pk=strtok(NULL, SEP))); } else { printf("Az URL nem tartalmaz lekrdez " "karakterlncot.\n"); } return 0; }

    HFMKattintson dupln a minta megtekintshez!
  • Vletlenszm generls

    lvletlen szmok ellltsa (PseudoRandom NumberGenerator, PRNG)

    Szksges fejfjl: stdlib.h

    Kezdrtk: void srand(unsigned int seed);, ahol seeda kezdrtk

    Vletlen szmok: 0 int rand(void); RAND_MAX

    Pldk:

    x = (double)rand()/RAND_MAX ahol {x |x R, 0 x 1}x = MIN + rand()%(MAX-MIN+1) ahol{x |x Z,MIN x MAX}

    Dr. Hatwgner F. Mikls 8. elads

    https://en.wikipedia.org/wiki/Pseudorandom_number_generator
  • Vletlenszm generls

    Problma: azonos seed azonos szmsorozatokMegolds:

    seed minden programindtsnl ms legyen pontos idSzksges fejfjl: time.h

    time_t time(time_t *t);

    V.t. rtk: time_t (long) tpusban az 1970-01-01 00:00:00+0000 (UTC) ta eltelt msodpercek szma, amit t cmen iseltrol, ha az nem NULL

    A C++ nyelv sokkal kinomultabb kpessgekkel rendelkezik.

    Tovbbi tudnivalk a vletlenszm generlssal kapcsolatban.

    Dr. Hatwgner F. Mikls 8. elads

    http://www.cplusplus.com/reference/random/http://www.cplusplus.com/faq/beginners/random-numbers/
  • Vletlenszm generls

    #i n c l u d e #i n c l u d e #i n c l u d e #d e f i n e MIN 1#d e f i n e MAX 100

    i n t main ( vo id ) {s rand ( t ime (NULL ) ) ;i n t t i pp , szam = MIN + rand ()%(MAXMIN+1);p r i n t f ( " Ta l a l d k i a %d es %d k o z o t t i szamot !\ n" ,MIN , MAX) ;

    do {p r i n t f ( "Tipp : " ) ; s c a n f ( "%d" , &t i p p ) ;i f ( t i p p < szam ) p r i n t f ( "Nagyobbra gondoltam .\ n" ) ;e l s e i f ( t i p p > szam ) p r i n t f ( " K i s ebb r e gondoltam .\ n" ) ;

    } whi le ( t i p p != szam ) ;p r i n t f ( " E l t a l a l t a d !\ n" ) ;re tu rn 0 ; }

    Dr. Hatwgner F. Mikls 8. elads

    #include #include #include #define MIN 1#define MAX 100int main(void) { srand(time(NULL)); int tipp, szam = MIN + rand()%(MAX-MIN+1); printf("Talald ki a %d es %d kozotti szamot!\n", MIN, MAX); do { printf("Tipp: "); scanf("%d", &tipp); if(tipp < szam) printf("Nagyobbra gondoltam.\n"); else if(tipp > szam) printf("Kisebbre gondoltam.\n"); } while(tipp != szam); printf("Eltalaltad!\n"); return 0; }

    HFMKattintson dupln a minta megtekintshez!