Az előző feladathoz hasonlóan most is szavakat kell beolvasni a bemenetről. A programodnak most azt kell megmondania, hogy hány különböző szó volt.
Ehhez egy halmazt használhatsz, az std::set
-ből példányosítva. Minden szót be kell tenni
a halmazba. A halmaz dolga lesz kiszűrni azokat, amik már szerepeltek. A megoldás a halmaz számossága.
Iterálj végig az előző feladatban kapott halmazon, és írd ki a benne tárolt szavakat! Vajon mikor és miért rendeződtek ábécé sorba?
Az std::for_each
függvénysablon egy iterátorokkal megadott tartományon megy végig, és meghívja
annak minden elemére a paraméterként kapott függvényt. Írj függvényt, amelyik kiírja a paraméterként kapott
sztringet, majd listázd ki a halmaz szavait a for_each
segítségével!
Az std::max_element
egy iterátorokkal megadott tartomány legnagyobb elemét találja meg.
Harmadik paramétere egy komparátor, amellyel a rendezési reláció adható meg. Visszatérési értéke a legnagyobb
elemre mutató iterátor. Keresd meg a max_element
segítségével, és írd is ki a halmaz leghosszabb
szavát! Keresd meg a min_element
segítségével a legrövidebb szót is! Ehhez ugyanaz a komparátor
kell, vagy egy másik?
Az std::map
egy asszociatív tároló. Kívülről nézve hasonlóan viselkedik, mint egy tömb,
a tárolt értékeket az indexelő operátorral lehet elérni. Az indexelés kulcsa azonban lehet bármi, pl. egy
sztring is. A tároló elemei igény szerint, az indexelés hatására jönnek létre:
std::map<std::string, int> m; // kulcs = string, érték = int
m["Ernőke"] = 4;
std::cout << "Ernőke " << m["Ernőke"] << " éves.";
Írj programot, amelyik beolvassa a szabványos bemenetéről az összes szót, és kilistázza őket, melléjük írva azok gyakoriságát! Például:
alma körte alma barack
alma 2
barack 1
körte 1
Ehhez azt kell még tudnod, hogy az std::map
tároló std::pair
típusú elemeket
tárol. Az std::pair
lényegében ennyi:
template <typename T1, typename, T2>
class std::pair {
T1 first;
T2 second;
};
Amikor egy std::map
-en iterálsz, az iterátoron keresztül a benne tárolt
std::pair
-ek lesznek láthatóak. Vagyis it->first
a kulcs, it->second
az érték.
Írj olyan programot, ami a szabványos bemeneten érkező szavakról kiírja, hogy milyen hosszú szavakból hányféle szerepelt! Például:
egy ketto harom negy ot hat
2 karakteres: 1 db
3 karakteres: 2 db
4 karakteres: 1 db
5 karakteres: 2 db
Vigyázz, ugyanazt a szót csak egyszer számold!
egy egy
3 karakteres: 1 db
A mikulás ajándékokat visz egy végtelen, kétdimenziós rácson elhelyezkedő házakba.
Kezdetben beadja az ajándékot a kiindulási pozícióban lévő házba, utána pedig rádión kapja az utasításokat, merre kell tovább mennie: északra (^), délre (v), keletre (>) vagy nyugatra (<). Minden lépés után bead egy ajándékot az új pozícióban lévő házba.
A gond csak az, hogy az utasítások kicsit össze-vissza vannak, ezért némely háznál többször is jár. Kérdés az, hogy hány házba vitt legalább egy ajándékot.
Például:
>
két házba; egyik a kiindulási pozíció, másik pedig az attól keletre lévő.^>v<
négy házba; a kiinduló házban így két ajándékot kapnak.^v^v^v^v^v
rengeteg ajándékot kap két szerencsés gyerek.
Oldd meg a feladatot STL eszközökkel! Saját osztály definiálására nem lesz szükséged. Tippek:
- A pozíció eltárolható egy egész számpárral.
- Azt kell vizsgálni, hogy egy adott helyen járt-e már vagy nem. Vagyis hogy egy pozíció már szerepelt-e vagy nem. Milyen matematikai alapfogalomra képezhető ez le? Van olyan STL tároló is.
Bemenő adat: santa.txt, erre a kimenet 2081 kell legyen.