Labor, 3. hét: struktúrák és függvények
Pohl László, Czirkos Zoltán, Kohári Zsolt · 2024.09.15.
Struktúrák és függvények kezelése. Néhány vezérlési szerkezet.
Felkészülés a laborra:
- A switch szerkezet megértése.
- A struktúrákról tanultak átismétlése.
- A függvényekről tanultak átismétlése.
Adott egy valós számokat tartalmazó tömb, benne vegyesen mindenféle előjelű számokkal.
A feladat végén látható egy olyan program, amelyik kilistázza a tömböt az elemek indexeivel. (Emlékezz vissza, ezt a feladatot egyszer már megoldottad laboron.) Másold be a kódot egy új projectbe, próbáld ki, majd végezd el az alábbi feladatokat!
Az első lépés kigyűjteni egy másik tömbbe a negatív tömbelemek indexeit. Listázd ki ezeket az indexeket is!
Ebből 5 szám negatív. Indexeik: 1 3 4 7 8
Ha ez is megvan, egy olyan programrészt kell írnod, amelyik az indexek ismeretében kiírja, hogy mik voltak a negatív számok. Fontos, hogy ne keresd meg újra a negatív számokat! Elvégre is, ha az indexeik megvannak, abból már lehet tudni, melyek voltak azok. A végleges eredmény valami ilyesmi legyen:
Összesen 10 szám van. [0]=2.5 [1]=-69 [2]=5.4 [3]=-8 [4]=-7.7 [5]=6 [6]=2.9 [7]=-10 [8]=-3 [9]=9.8 Ebből 5 szám negatív. [1]=-69 [3]=-8 [4]=-7.7 [7]=-10 [8]=-3
Rajzolj ábrát, amely a tömböket, a tömbelemekben tárolt számokat, és az azok közötti összefüggéseket ábrázolja! Hány elemű kell legyen az a tömb, amelyik az indexeket tárolja? Honnan fogja tudni a negatív elemeket kiíró programrész, hogy hány negatív elem volt?
#include <stdio.h>
int main(void) {
double szamok[10] = { 2.5, -69, 5.4, -8, -7.7, 6, 2.9, -10, -3, 9.8 };
/* Az eredeti tömb kiírása */
printf("Összesen %d szám van.\n", 10);
for (int i = 0; i < 10; ++i)
printf("[%d]=%g ", i, szamok[i]);
printf("\n\n");
/* Negatívak indexeinek kigyűjtése */
/* Negatívak kiírása */
return 0;
}
Írj függvényeket, amelyek valós számot vesznek át, és visszatérnek az:
kob()– harmadik hatványával,abszolut()– abszolút értékével (vanfabs()függvény, de most ne használd)!
Írj programot, amelyik a = −1-től +1-ig, tizedenként lépve, kiírja egymás mellé a, a3, |a| és sin(a) értékét,
mindig négy tizedesjegy pontossággal!
Hasonló feladatok
Ha ez a feladat nehezen ment, megoldhatsz pár hasonló feladatot a példatárból, mielőtt a következő feladatra rátérsz.
Vigyázz, a laborfeladatokat erősen ajánlott az utolsó feladatig megoldani, hogy a jövő hétre felkészült legyél. Ha nem sikerül, fejezd be őket otthon!
Adott az alábbi program, amely madárnyelven (mavadávárnyevelveven) írja ki a beírt szöveget.
#include <stdio.h>
int main(void) {
char c;
while (scanf("%c", &c) != EOF) {
if (c=='a' || c=='e' || c=='i' || c=='o' || c=='u')
printf("%cv%c", c, c);
else
printf("%c", c);
}
return 0;
}
Írj függvényt, amelyik megmondja egy betűről, hogy magánhangzó-e! Alakítsd át úgy
a programot, hogy a megírt függvényt használod a main()-ben!
Hogyan lehetne megoldani azt, hogy a nagybetűvel kezdődő szavakat is helyesen kezelje a program? Pl. az „Alma” szóra azt kell
kiírnia, hogy „Avalmava”. Ehhez fel kell tudnia ismerni a nagybetűvel írt magánhangzókat is. Kiíráskor a
v betű előtt az eredeti karaktert kell kiírni, utána pedig a kisbetűsítettet. Használhatod a meglévő
maganhangzo() függvényt is, csak a beolvasott karaktert kisbetűsítve kell odaadnod neki.
Hasonló feladatok
Ha ez a feladat nehezen ment, megoldhatsz pár hasonló feladatot a példatárból, mielőtt a következő feladatra rátérsz.
Vigyázz, a laborfeladatokat erősen ajánlott az utolsó feladatig megoldani, hogy a jövő hétre felkészült legyél. Ha nem sikerül, fejezd be őket otthon!
Definiálj egy típust síkbeli pontok reprezentálására. Az x és y koordináták valós számok.
Írj egy olyan programot, melyben létrehozol két pontot: az egyik a (2.2 ; 1.6) pont legyen, a másiknak a koordinátáit olvassuk be. Ezután hozzunk létre egy harmadikat, a fenti két pont által meghatározott szakasz felezőpontját. Írjuk ki a felezőpont koordinátáit.
Az itt látható táblázat egy futóverseny eredményeit tartalmazza.
| Index | Név | Születés | Helyezés |
|---|---|---|---|
| 0 | Am Erika | 1984. 05. 06. | 1 |
| 1 | Break Elek | 1982. 09. 30. | 3 |
| 2 | Dil Emma | 1988. 08. 25. | 2 |
| 3 | Kasza Blanka | 1979. 06. 10. | 5 |
| 4 | Reset Elek | 1992. 04. 05. | 4 |
Alább egy elkezdett programot látsz, amelyben a megfelelő típusok már definiálva vannak, és az adatokat egy tömb tartalmazza. Egészítsd ki a programot, hogy kiírja a képernyőre a kommentekben megadott adatokat!
#include <stdio.h>
typedef struct Datum {
int ev, ho, nap;
} Datum;
typedef struct Versenyzo {
char nev[31];
Datum szuletes;
int helyezes;
} Versenyzo;
void datum_kiir(Datum d);
void versenyzo_kiir(Versenyzo v);
int main() {
Versenyzo versenyzok[5] = {
{ "Am Erika", {1984, 5, 6}, 1 },
{ "Break Elek", {1982, 9, 30}, 3 },
{ "Dil Emma", {1988, 8, 25}, 2 },
{ "Kasza Blanka", {1979, 6, 10}, 5 },
{ "Reset Elek", {1992, 4, 5}, 4 },
};
/* 0-s versenyző neve - printf %s */
/* 2-es versenyző helyezése */
/* 4-es versenyző születési dátumát (írd meg a datum_kiir függvényt!) */
/* 1-es versenyző nevének kezdőbetűjét (ne feledd, a sztring karaktertömb) */
/* az 1-es versenyző dobogós-e? igen/nem, akár ?: operátorral, de egy printf-fel */
/* az 4-es versenyző gyorsabb-e, mint a 3-as versenyző? */
/* az 1-es versenyző ugyanabban az évben született-e, mint a 2-es? */
/* egészítsd ki a versenyzo_kiir() függvényt,
* aztán írd ki az 1-es versenyző összes adatát */
/* végül listázd ki az összes versenyzőt sorszámozva, összes adatukkal. */
return 0;
}
void datum_kiir(Datum d) {
/* dátum kiírása */
}
void versenyzo_kiir(Versenyzo v) {
/* a versenyző összes adatának kiírása */
}
Készíts egyszerű menüvezérelt programot! A program tároljon el egy számot, melynek kezdőértéke a = 1. Ezt
követően a program jelenítse meg a képernyőn a értékét, és az alább látható menüt. A megfelelő menüpont számának megadása
(scanf()-fel) után hajtsa végre a-n a kiválasztott műveletet, írja ki újból a új értékét és a menüt! A
menüből mindaddig lehessen újból választani, míg a kilépést nem választja a felhasználó! Használj switch-et és
do ... while(), azaz hátultesztelő ciklust!
printf("0. Alapertek visszaallitasa (a = 1)\n"
"1. Hozzaad 1-et\n"
"2. Megforditja az elojelet\n"
"3. Szorozza 2-vel\n"
"9. Kilepes\n");
Minden egyes tevékenységet (műveletet) egy pici függvény valósítson meg, amelynek bemenő paramétere az a változó
tartalma, visszatérési értéke pedig a megváltozott szám! A main() ezen függvények hívásával végezze el a
feladatát!
Miért olyan lényeges ez a feladat?
Figyeld meg a kapott főprogramot! Ez irányítja a többi függvény működését: meghívja az egyes részfeladatokhoz tartozó alprogramokat, amelyek dolgukat végezve visszatérnek, újra a főprogram kezébe adva az irányítást. A főprogram és az alprogramok a paramétereken és a visszatérési értékeken keresztül kommunikálnak.
Ha elkészültél, folytasd a feladatgyűjtemény ehhez a témakörhöz kapcsolódó struktúrákkal kapcsolatos feladataival!