Programozás I gyakorlat 5. Struktúrák
Bemelegítés • Írj programot, amely beolvassa 5 autó adatait, majd kiírja az adatokat a képernyőre. Egy autóról a következőket tároljuk: – maximális sebesség – fogyasztás – szállítható személyek száma
2
Első megoldás #include <stdio.h> #define N 5 int main() { int maxSeb[N]; int fogyasztas[N]; int szemelyek[N]; int i; for (i = 0; i < N; i++) { scanf("%d %d %d", &maxSeb[i], &fogyasztas[i], &szemelyek[i]); } for (i = 0; i < N; i++) { printf("%d.: %d %d %d\n", i, maxSeb[i], fogyasztas[i], szemelyek[i]); } return 0; }
3
Első megoldás int int int int for
maxSeb[N]; fogyasztas[N]; szemelyek[N]; i; (i = 0; i < N; i++) { scanf("%d %d %d", &maxSeb[i], &fogyasztas[i], &szemelyek[i]);
}
• Egy autó adatait külön tömbökben tároljuk • Még több adatnál még nehezebben kezelhető a kód • Megoldás: Egy új adattípusban tároljuk egyetlen autó adatait
4
Struktúra struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; };
• A memóriában a három változó (maxSeb, fogyasztas, szemelyek) egymás mellé kerül, valamint logikailag is egy egységbe foglaljuk őket • A kód felépítése is egyszerűbb, átláthatóbb lesz 5
Struktúra struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; };
A struct kulcsszó jelzi, hogy struktúrát hozunk létre
6
Struktúra struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; };
Ez lesz a struktúra neve
7
Struktúra struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; };
Ezek az adattagok alkotják a struktúrát
8
Struktúra struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; };
A struktúra adattagjait kötelező { }-ek közé írni
9
Struktúra struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; };
Végül a struktúrát ;-el zárjuk
10
Struktúra struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; };
Ez a struktúra még nem változó! Ez csak egy „leírás” arról, hogy egy ilyen típusú változónak hogyan kell felépülnie, ebből létre kell hozni egy vagy több változót (ahogy a tervrajz alapján megépítik a házakat)
11
Struktúra int main() { struct Kocsi kocsi; kocsi.maxSeb = 200; kocsi.fogyasztas = 10; kocsi.szemelyek = 5; scanf("%d", &kocsi.maxSeb); …
A változó típusa: struct Kocsi 12
Struktúra int main() { struct Kocsi kocsi; kocsi.maxSeb = 200; kocsi.fogyasztas = 10; kocsi.szemelyek = 5; scanf("%d", &kocsi.maxSeb); …
A változó neve: kocsi 13
Struktúra int main() { struct Kocsi kocsi; kocsi.maxSeb = 200; kocsi.fogyasztas = 10; kocsi.szemelyek = 5; scanf("%d", &kocsi.maxSeb); …
A kocsi-n belül a maxSeb adattagot használhatjuk úgy, mint a többi változót
14
Struktúra int main() { struct Kocsi kocsik[N]; int i; for (i = 0; i < N; i++) { scanf("%d %d %d", &kocsik[i].maxSeb, &kocsik[i].fogyasztas, &kocsik[i].szemelyek); } for (i = 0; i < N; i++) { printf("%d.: %d %d %d\n", i, kocsik[i].maxSeb, kocsik[i].fogyasztas, kocsik[i].szemelyek); } return 0; }
15
typedef typedef struct Kocsi { int maxSeb; int fogyasztas; int szemelyek; } Kocsi; int main() { Kocsi kocsik[N]; struct Kocsi k; …
struct Kocsi helyett használhatjuk a Kocsi típusnevet is
16
Feladat • Írj programot, amely beolvassa 5 autó adatait billentyűzetről (szintén fogyasztás, maximális sebesség és utasok száma), majd beolvas egy S sebességet és egy F fogyasztást. A program határozza meg, hogy a program tárol-e olyan autót, amelynek legalább S a sebessége, vagy a fogyasztása legfeljebb F. • Melyik programozási tételt kell alkalmazni? 17
keresés • Alkalmazzuk a lineáris keresés tételét • A „nem ez az az elem, amit keresek” feltételt kell jól megfogalmazni: i = 0; while (i < N && !(kocsik[i].maxSeb >= s || kocsik[i].fogyasztas <= f)) { i++; } if (i < N) { printf("Van ilyen auto, a %d.\n", i); } else { printf("Nincs ilyen auto\n"); }
18
keresés • De persze ezt a feltételt okosabban is megfogalmazhatjuk: i = 0; while (i < N && kocsik[i].maxSeb < s && kocsik[i].fogyasztas > f) { i++; } if (i < N) { printf("Van ilyen auto, a %d.\n", i); } else { printf("Nincs ilyen auto\n"); } 19
Feladat • Bővítsd ki az előző programot úgy, hogy írja ki, mennyi az autók átlagos fogyasztása.
20
Feladat • Bővítsd ki az előző programot, hogy határozza meg, melyik a leggyorsabb autó, valamint hogy melyiknek van a legnagyobb fogyasztása.
21
Feladat • Az előző programot bővítsük ki úgy, hogy az autókat sebesség szerint növekvő sorrendbe rendezze!
22
Feladat • Az előző rendezést fejlesszük tovább úgy, hogy továbbra is a sebesség szerint rendezzen növekvő sorrendbe, de ha több autónak a sebessége azonos, akkor az azonos sebességű járműveken belül az autók a fogyasztásuk szerint csökkenő sorrendben legyenek rendezve!
23
Gyakran ismételt kérdések • Mi a hiba az alábbi programban? struct valami { int a, b; } int main() { return 0; }
• Hiányzik a ; a struktúra végéről. Ekkor a program minden, a struktúra utáni szót úgy értelmezi, hogy azok változók, amelyek struktúra típusúak.
24
Gyakran ismételt kérdések • Az autós feladatban az auto nevet adtam a struktúrának, de azt nem fogadja el, miért? struct auto { int maxSeb; int fogyasztas; int szemelyek; };
• Az auto a C nyelv kulcsszava, a jelentését majd a függvényeknél megbeszéljük. 25