C++ határozatlan mennyiségű változó?! Segítségre lenne szükségem! :D
Helló.
Olyan nehézségbe ütköztem, hogy szeretnék egy olyan programot írni (console application), amely kiszámolja a beírt számok médiáját, de ezt úgy szeretném megvalósítani, hogy a beírt számok random mennyiségüek legyenek (pl.: 124, 526, 3, 76, 9011 ), vagyis ne legyen meghatározva, hogy én hány számot adhatok meg.
Namost ahhoz, hogy átlagot számoljak belőlük, kéne tudnom, hogy hány darabról is van szó... .
Tehát hogy tudom megoldani a tetszőleges számú változók beolvasását illetve azok megszámlálását?
A válaszokat előre is kösz. :)
Mi az hogy médijáját?
Ez a random menyiség egy hülyeség a,random azt jelenti véletlen de te nem véletlen hanem korlátlan nagyságú számokról beszélsz.
Ha te adod meg a számokat akkor tudod a db számot ,zűrzavaros az egész...
Ha előre tudod, hogy csak átlagot fogsz számolni, akkor nem kell tárolnod a beolvasott számokat.
Tárolsz 2 db számot: az összeget és a darabszámot. Minden beolvasott érték után növeled az összeget, és +1-et adsz a darabszámhoz. Ha a végére értél, osztod a kettőt, és kész az átlag.
Tetszőlegesen sok érték tárolása pedig dinamikus programozással lehetséges, de vannak a C++ nyelvbe beépített tárolók is ehhez (vector, list). Nyelvfüggő.
vagy ha nem listát akarsz csinálni, akkor írhatsz egy függvényt, ami azt csinálja, hogy berak egy tömbbe egy plusz számot: létrehoz egy új tömböt, minden eleme egyenlő a régi tömb elemével, és a +1 elem pedig az új érték lesz.
vagy lefoglalsz egy 1000 elemű tömböt, és akkor max 1000 számot írhat be a user, az azért elég sok. és egy indexxel meg tárolod hogy hány számot írt be.
#3: erre nincsenek elegánsabb megoldások? Pl. vektorok?
A mediánhoz muszáj tárolni az elemeket. Én ehhez egy rendezett listát használnék, aminek aztán csak a megfelelő értékét kell lekérni és nem kell azzal foglalkozni, hogy a rendező algoritmust megírjam rá.
Ahogy fentebb írták, a C++ biztosít ehhez tárolókat. Legáltalánosabb a vector.
#include <vector>
#include <iterator>
std::vector<int> v;
std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_insterter(v));
std::sort(v);
std::cout << v[v.size() / 2] << '\n'; //nem veszi figyelembe ha páros számú elem van
Vagy még hatékonyabb (de akkor nem láttok back_insertert):
std::vector<int> v(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());
Ha átlagot akarsz csak számolni, ahhoz semmi szükség a számok felesleges tárolására. Egy ciklusban bekéred a számokat amíg mondjuk nullát nem kap és egy-egy double-ban tárolja az összeget és a darabszámot.
Amikor végeztél elosztod a kettőt egymással és íme, a számok átlaga. :D
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!