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 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]); 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
struct Kocsi { ; int maxseb; int fogyasztas; int szemelyek; Struktúra 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
struct Kocsi { int maxseb; int fogyasztas; int szemelyek; ; Struktúra A struct kulcsszó jelzi, hogy struktúrát hozunk létre 6
struct Kocsi { int maxseb; int fogyasztas; int szemelyek; ; Struktúra Ez lesz a struktúra neve 7
struct Kocsi { int maxseb; int fogyasztas; int szemelyek; ; Struktúra Ezek az adattagok alkotják a struktúrát 8
struct Kocsi { int maxseb; int fogyasztas; int szemelyek; ; Struktúra A struktúra adattagjait kötelező { -ek közé írni 9
struct Kocsi { int maxseb; int fogyasztas; int szemelyek; ; Struktúra Végül a struktúrát ;-el zárjuk 10
struct Kocsi { int maxseb; int fogyasztas; int szemelyek; ; Struktúra 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
int main() { Struktúra 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