Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

Hasonló dokumentumok
10. gyakorlat. Pointerek Tárolási osztályok

Programozás I gyakorlat. 10. Stringek, mutatók

C programozási nyelv Pointerek, tömbök, pointer aritmetika

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás I gyakorlat

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

10. gyakorlat Struktúrák, uniók, típusdefiníciók

C programozási nyelv

Programozás 5. Dr. Iványi Péter

Óbudai Egyetem. C programozási nyelv

Információs Technológia

A C programozási nyelv III. Pointerek és tömbök.

5. Gyakorlat. struct diak {

A C programozási nyelv III. Pointerek és tömbök.

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Programozas 1. Strukturak, mutatok

Mutatók és mutató-aritmetika C-ben március 19.

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Járműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás alapjai 9.Gy: Struktúra 2.

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

10. gyakorlat Tömb, mint függvény argumentum

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

5. gyakorlat. Konstansok Tömbök Stringek

Programozás II. 2. Dr. Iványi Péter

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Programozás I gyakorlat

C változók. Feladat: Deklaralj egy valos, egy karakter es ket egesz tipusu valtozot! int main() {

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás C és C++ -ban

7/8. gyakorlat Karaktertömbök és sztringkezelés

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Programozás I. gyakorlat

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

OOP #14 (referencia-elv)

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

INFORMATIKA tétel 2018

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

1. Alapok. Programozás II

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Osztályok. 4. gyakorlat

7. fejezet: Mutatók és tömbök

Programozás 3. Dr. Iványi Péter

Programozás I gyakorlat

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Megoldott programozási feladatok standard C-ben

Bevezetés a C++ programozási nyelvbe

Pénzügyi algoritmusok

Programozási Nyelvek: C++

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozás 6. Dr. Iványi Péter

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Programozás alapjai 8.Gy: Program struktúra

malloc free malloc free int sum(int a[4]) { return a[0] + a[1] + a[2] + a[3]; }

Láncolt lista. az itt adott nevet csak a struct deklaráción belül használjuk

Példák tematikus csoportosításban

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

Nagy HF u tmutato 2011/2012 II. fe le v

Bevezetés a programozásba I.

1. Írjunk programot mely beolvas két számot és ellenőrzi hogy mindkét szám zérus-e:

Pénzügyi algoritmusok

Programozás II. 4. Dr. Iványi Péter

Példatár a Programozás 1 tárgyhoz

Például számokból álló, egyszeresen láncolt lista felépítéséhez az alábbi struktúra definíciót használhatjuk:

Programozás I gyakorlat

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Programozás II. Fájlkezelés

Osztály és objektum fogalma

3. Osztályok II. Programozás II

Programozás II gyakorlat. 6. Polimorfizmus

C++ programozási nyelv Konstruktorok-destruktorok

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Vezérlési szerkezetek

Ha meg akarod tudni, hogy az egyes típusok milyen méretűek a te rendszereden, a következő program megmutatja:

Programozás C++ -ban

Programozási nyelvek Java

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Algoritmizálás + kódolás C++ nyelven és Pascalban

3 A C programozási nyelv szintaktikai egységei

Bevezetés, a C++ osztályok. Pere László

Programozás C nyelven (13. ELŐADÁS) Sapientia EMTE

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Átírás:

Struktúrák (struct) A struktúra egy olyan összetett adatszerkezet, amely nemcsak azonos típusú elemeket rendelhet össze. A struktúra definíciójában leírjuk, hogy a struktúra hogyan épül fel. A struktúra szerkezetét meghatározó deklaráció általános formája: struct struktúra_azonosító típus1 tag1; típus2 tag2;... típusn tagn; ; Pl: struct ember char nev[80]; unsigned kor; float suly; Deklaráció alkalmával egy példányt hozunk létre (így hozunk létre változót belőle): struct struktúra_azonosító struktúra_változó; Pl: struct ember jozsi; Elég gyakran alkalmazott megoldás a typedef kulcsszóra épül: typedef struct book char szerzo[20]; char cim[40]; int ev; int ar; BOOK; Változók létrehozása:

BOOK macska, gyerek, cprog; Feladat: Hozz létre típust egy háromdimenziós térbeli pozíció tárolására. Ezt felhasználva hozz létre egy típust, ami részecskék helyzetét, tömegét, nevét és töltését (pozitív/negatív/semleges) tárolja. Készíts egy függvényt, ami két részecskéről eldönti, hogy melyik nehezebb, és egy másikat, ami megmondja, hogy elektromosan vonzzák vagy taszítják egymást, esetleg nem hatnak egymásra. Inicializálj két részecskét, és használd a függvényeket.

Feladat: Adott a síkon 3 pont, mi az általuk meghatározott háromszög területe? #include <math.h> struct pont float x; float y; ; float tav(struct pont P, struct pont Q) return sqrtf((p.x-q.x)*(p.x-q.x) + (P.y-Q.y)*(P.y-Q.y)); struct pont A, B, C; float a,b,c,s; scanf("%f %f", &A.x, &A.y); scanf("%f %f", &B.x, &B.y); scanf("%f %f", &C.x, &C.y); a=tav(b, C); b=tav(a, C); c=tav(a, B); s=(a+b+c)/2; printf("terulet: %f\n", sqrtf(s*(s-a)*(s-b)*(s-c))); F: Készítsünk komplex számok tárolására alkalmas adatszerkezetet (egész komponensekkel). Készítsünk továbbá olyan függvényeket, melyek feladata: - kiír egy komplex számot az stdout-ra, - összead két komplex számot, és visszaadja az eredményt - összeszoroz két komplex számot, és visszaadja az ere dményt

typedef struct komplex int real; int imag; komplex; komplex add(komplex k1, komplex k2) komplex e; e.real = k1.real+k2.real; e.imag = k1.imag+k2.imag; return e; komplex mul(komplex k1, komplex k2) komplex e; e.real = k1.real*k2.real-k1.imag*k2.imag; e.imag = k1.imag*k2.real+k1.real*k2.imag; return e; void printk(komplex k) printf("(%d%+di)\n", k.real, k.imag); komplex x1,x2,e; x1.real = 10; x1.imag = 2; x2.real = 20; x2.imag = -3; printk(x1); printk(x2); e = add(x1,x2); printk(e); printk(mul(x1,x2)); Feladat: Láncolt lista. Olvassunk be egész számokat egy láncolt listába egy adott végjelig, majd írassuk ki őket.

#include <stdlib.h> #define VEGJEL 0 struct cella int ertek; struct cella *kov; ; struct cella *elso = NULL; struct cella *p; int i; scanf("%d", &i); while(i!=vegjel) p = (struct cella*)malloc(sizeof(struct cella)); p->ertek = i; p->kov = elso; elso = p; scanf("%d", &i); for(p=elso; p!=null; p=p->kov) printf("%d\n", p->ertek); while(elso!=null) p =elso; elso=p->kov; free(p); Unió (union) Egyetlen és egyben lényegi különbség a struct és az union között az adattagok elhelyezkedése között van. Míg a struktúra adattagjai a memóriában egymás után helyezkednek el, addig az únió adattagjai közös címen kezdődnek (átlapoltak).

Az union szerkezetét meghatározó deklaráció formája: union union_azonosító típus1 tag1; típus2 tag2;... típusn tagn; ; Változó deklarálása: union union_azonosító union_változó; Feladat: Mi a különbség a struct és a union között? Deklarálj egy struct és egy union típust ugyanolyan mezőkkel. Adj értéket a mezőknek, majd írasd ki őket! typedef struct int i; double d; char c; float f; st; typedef union int i; double d; char c; float f; un; st s; un u; s.i = u.i = 12345; printf("s.i: %d u.i: %d\n", s.i, u.i); s.d = u.d = 3.141593; printf("s.d: %lf u.d: %lf\n", s.d, u.d); s.c = u.c = 'A'; printf("s.c: %c u.c: %c\n", s.c, u.c); s.f = u.f = 2.718281; printf("s.f: %f u.f: %f\n", s.f, u.f);

Így nem látszik semmi. De mi van, ha egyszerre íratjuk ki a mezők értékeit? typedef struct int i; double d; char c; float f; st; typedef union int i; double d; char c; float f; un; st s; un u; s.i = u.i = 12345; s.d = u.d = 3.141593; s.c = u.c = 'A'; s.f = u.f = 2.718281; printf("s.i: %d u.i: %d\n", s.i, u.i); printf("s.d: %lf u.d: %lf\n", s.d, u.d); printf("s.c: %c u.c: %c\n", s.c, u.c); printf("s.f: %f u.f: %f\n", s.f, u.f); Feladat: Írasd ki a mezők kezdőcímét! typedef struct int i; double d; char c; float f; st; typedef union int i; double d; char c; float f; un; st s; un u; printf("s.i: %p u.i: %p\n", &s.i, &u.i); printf("s.d: %p u.d: %p\n", &s.d, &u.d); printf("s.c: %p u.c: %p\n", &s.c, &u.c); printf("s.f: %p u.f: %p\n", &s.f, &u.f);

Pointerek (mutatók) A mutató olyan változó, amely egy másik objektum címét tartalmazza. Mutató deklarációja: tipusnév* azonosító; Egy objektum címe megkapható az & operátorral. A mutató által megcímzett objektum értéke a *pointerazonosító Kifejezéssel hivatkozhatunk. Mivel a mutató is változó, így értéket kaphat, műveletek végezhetők rajta, a műveletek definíciója figyelembe veszi azt a tényt, hogy a mutató címet tárol, valamint a műveletek eredményét befolyásolja az, hogy a mutató milyen típusra mutat. Mutatók és tömbök: C-ben egy tömb azonosítóját a fordító mindig a tömb első elemét megcímző mutatóként kezeli. Következmények: - egy tomb elemei indexeléssel és mutató aritmetikával egyaránt elérhetők - a mutatók is indexelhetők - a tomb esetén a kezdőcímet kapja meg a függvény Új dinamikus változó létesítése: P=malloc(sizeof(típus)); A malloc(s) függvény lefoglal egy S méretű memóriaterületet a program számára. A sizeof(e) megadja, hogy egy E típusú változó mekkora helyet igényel a memóriában. A malloc(sizeof(e)) hatására tehát létrejön egy új E típusú érték tárolására (is) alkalmas változó, és ez a változó lesz a p értéke. Pointer dereferencia: *p A * művelet segítségével érhetjük el a p értékét vagyis a dinamikus változót. A *p változóhivatkozás a p által mutatott címen tárolt változó értéke lesz, tehát a *p értéke a dinamikus változó értéke lesz.

Dinamikus változó törlése free(p); A művelet hatására a p-hez tartozó memóriaterület felszabadul ezáltal a dinamikus változó megszűnik. A művelet végrehajtása után a p pointerhez nem tartozik érvényes változó, ezért a *p változóhivatkozás végrehajtása jobb esetben azonnali futási hibát eredményez. (Rosszabb esetben pedig olyan lappangó hibát, aminek az eredménye a program egy teljesen más pontján jelenik meg.) A címképző művelet p = &i; A művelet meghatározza egy változóhoz tartozó memória mező címét. Ha egy p pointer típusú változó értéke az i változóhoz tartozó memória címe, akkor azt mondjuk, hogy a p i-re mutat. Ez a referencia szerinti értékátadás. Feladat: Nézzük meg, mi a különbség p, q, illetve *p és *q értéke között. #include <stdlib.h> int *p, *q; p = malloc(sizeof(int)); q = malloc(sizeof(int)); *p = 3; *q = 3; printf("p es q %s\n", p == q? "megegyezik" : "nem egyezik meg"); printf("*p == %d, *q == %d\n", *p, *q); *p = 4; printf("*p == %d, *q == %d\n", *p, *q); free(p); p = q; printf("p es q %s\n", p == q? "megegyezik" : "nem egyezik meg"); printf("*p == %d, *q == %d\n", *p, *q); *p = 4; printf("*p == %d, *q == %d\n", *p, *q); free(p);

Feladat: Futtassuk le a következő programot, és értelmezzük! Melyik érték melyik értékkel egyenlő, és miért? int a = 10; int *pa; pa = &a; printf("%d %#x\n", a, (int)pa); printf("%#x %#x\n", (int)&a, (int)&pa); printf("%d\n", *pa); Feladat: Írj egy csere() függvényt, ami megcseréli két int típusú változó értékét. void csere(int *x, int *y) int tmp; tmp = *x; *x = *y; *y = tmp; int x = 3, y = 4; printf("a fuggveny elott: x = %d, y = %d\n", x, y); csere(&x,&y); printf("a fuggveny utan: x = %d, y = %d\n", x, y);

Feladat: Deklarálj egy 20 elemű int tömböt, majd töltsd fel értékekkel az inputról. Deklarálj egy pointert, és a beolvasást azon keresztül valósítsd meg. #define N 20 int t[n], *p, i; for(i=0; i<n; i++) p=&(t[i]); scanf("%d", p); for(i=0; i<n; i++) printf("%d\n", t[i]); Feladat: Először olvasd be a tömb méretét, és foglalj neki dinamikusan helyet! #include <stdlib.h> int *t, *p, i, N; scanf("%d", &N); t=(int*)malloc(n*sizeof(int)); for(i=0; i<n; i++) p=&(t[i]); scanf("%d", p); for(i=0; i<n; i++) printf("%d\n", t[i]); free(t);

Feladat: Olvass be 5 darab maximum 99 karakter hosszú szót úgy, hogy mindegyiknek pontosan annyi helyet foglalsz, amennyi kell! A sztringeket írasd ki, majd szabadítsd fel a lefoglalt területet! #include <stdlib.h> #include <string.h> char buff[100]; char *ptr_tomb[5]; int i; for(i=0; i<5; i++) scanf("%s", buff); ptr_tomb[i] = (char*)malloc(strlen(buff)+1); strcpy(ptr_tomb[i], buff); for(i=0; i<5; i++) puts(ptr_tomb[i]); for(i=0; i<5; i++) free(ptr_tomb[i]);