A C++ különböző konténereket kínál arra, hogy azonos típusú elemeket rendezett módon tárolj bennük.
Van std::array a rögzített méretű konténerekhez, és std::vector, amely dinamikus átméretezésre is képes.
Amikor tömböt vagy vektort deklarálsz, meg kell adnod, hogy milyen típusú elemeket fog tárolni a konténer. A tömböknél a méretet is meg kell adni. Nézd meg ezeket a példákat, hogy lásd a két konténertípus létrehozását:
#include <array>
#include <string>
// std::array<element_type, size> variable_name {list of elements}
std::array<std::string, 3> indie_rock {"yeah", "yeah", "yeah"};
// indie_rock contains the elements "yeah" three times
A vektorok általában több helyet igényelnek, mert memóriát foglalnak le a további növekedéshez. A méretet nem kell megadnod:
#include <vector>
// std::vector<element_type> variable_name {list of elements}
std::vector<int> countdown {3, 2, 1};
// countdown contains the elements 3, 2 and 1
Megjegyzés: Még nem kell ismerned a template fogalma mögötti pontos mechanikát, arról külön fogalom szól majd lejjebb a tantervben.
A vektorok és a tömbök ugyanazokat a függvényeket használják az elemeik elérésére.
A front és a back tagfüggvénnyel lekérheted a konténer első és utolsó elemét.
Az adott elemek eléréséhez ott van az at és a [] operátor is.
countdown[0];
// => 3
countdown.at(2);
// => 1
countdown[1] = 4;
// countdown now contains 3, 4 and 1
indie_rock.back() = "yeahs";
// indie_rock is now "yeah", "yeah", "yeahs"
Megjegyzés: Ha a konténer tartományán kívüli pozíciót választasz, a
[]nem definiált viselkedéshez vezethet. Azatfüggvény viszont kivételt dob, ami hosszú távon megkönnyítheti az életedet.
Mivel a vector mérete nem rögzített, hozzáadhatsz és eltávolíthatsz elemeket.
Erre a célra két gyakori függvény az emplace_back és a pop_back.
std::vector<std::string> witches {"Holly", "Alyssa", "Shannen"};
witches.pop_back();
// Shannen is no longer with the witches
witches.emplace_back("Rose");
// Rose has joined the team
Azt, hogy egy konténer üres-e, az empty tagfüggvénnyel ellenőrizheted.
Ha tudni szeretnéd az elemek számát, használd a size függvényt.
Tanársegédként tanulók vizsgáit javítod. Az eredmények kézi nyomon követése egyre fárasztóbbá és egyre hibahajlamosabbá válik. Úgy döntesz, hogy egy kicsit érdekesebbé teszed a dolgot, és összeállítasz néhány függvényt, amelyek megszámolják és kiszámítják az osztály eredményeit.
Bár a vizsgakérdésekre adhatsz részleges pontot, a vizsga összpontszámának int típusúnak kell lennie.
Mielőtt bármi mást tehetnél az osztály pontszámaival, végig kell menned az érdemjegyeken, és minden double pontszámot int-té kell alakítanod.
Hozd létre a round_down_scores() függvényt, amely paraméterként egy student_scores vector-t kap.
Az iskolák által kért kerekítés csonkítás.
Szerencsédre a C++ a static_cast segítségével képes az egyik típust a másikká alakítani.
A static_cast használatával végzett double-ból int-be történő átalakítás levágja az összes tizedesjegyet.
A függvénynek a bemeneti vector-t kell átvennie, és return-nel egy új vektort kell visszaadnia, amelyben minden pontszám int-té van alakítva.
std::vector<double> student_scores {90.33, 40.5, 55.44, 70.05, 30.55, 25.45, 80.45, 95.3, 38.7, 40.3};
round_down_scores(student_scores)
// => {90, 40, 55, 70, 30, 25, 80, 95, 38, 40}
Vannak más módszerek is, amelyek ugyanerre az eredményre vezetnek, de a cast gyakori.
int new_PI{static_cast<int>(3.14) + static_cast<int>(0.001592653589)};
// new_PI is 3.
Amikor a vizsgát javítottad, észrevetted, hogy néhány tanuló nem teljesített olyan jól, mint remélted. De elterelődött a figyelmed, és elfelejtetted feljegyezni, pontosan hány tanulóról van szó.
Hozd létre a count_failed_students() függvényt, amely paraméterként egy student_scores vector-t kap.
A függvény számolja meg azoknak a tanulóknak a számát, akiknek nincs átmenő pontszámuk, és adja vissza ezt a számot egész számként.
A vizsgán egy tanulónak 40-nél nagyobb pontszám kell az átmenő jegyhez.
count_failed_students({90,40,55,70,30,25,80,95,38,40});
// => 5
A tanár, akinek segítesz, szívesen ad betűs érdemjegyeket is a számszerű pontszámok mellett. Mivel a tanulók ritkán érnek el 100 pontot egy vizsgán, a „betűs érdemjegyek” alsó küszöbértékeit a legmagasabb elért pontszám alapján számítják ki, és ezek a legmagasabb pontszám és a <= 40-es bukási küszöb között egyenletesen nőnek.
Hozd létre a letter_grades() függvényt, amely paraméterként a vizsgán elért „legmagasabb” pontszámot kapja, és visszaad egy array-t (nem vektort) az egyes „amerikai stílusú” érdemjegy-intervallumok alsó pontszámküszöbeivel: ["D", "C", "B", "A"].
/*Where the highest score is 100, and failing is <= 40.
"F" <= 40
41 <= "D" <= 55
56 <= "C" <= 70
71 <= "B" <= 85
86 <= "A" <= 100
*/
letter_grades(100);
// => {41, 56, 71, 86}
/*Where the highest score is 88, and failing is <= 40.
"F" <= 40
41 <= "D" <= 52
53 <= "C" <= 64
65 <= "B" <= 76
77 <= "A" <= 88
*/
letter_grades(88);
// => {41, 53, 65, 77}
Rendelkezésedre állnak a vizsgapontszámok csökkenő sorrendben, valamint a hozzájuk tartozó tanulónevek (a vizsgapontszámaik sorrendjében rendezve). Szeretnéd minden tanuló nevét a vizsgapontszámához párosítani, és kiírni az osztály összesített rangsorát.
Hozd létre a student_ranking() függvényt student_scores és student_names paraméterekkel.
Párosítsd a student_names vector minden tanulónevét a student_scores vector-ból származó pontszámukkal.
Feltételezheted, hogy mindegyik vector argumentum a legmagasabb pontszámtól a legalacsonyabbig rendezett.
A függvény egy stringekből álló vector-t adjon vissza a következő formátumban: <rank>. <student name>: <student score>.
std::vector<int> student_scores {100, 99, 90, 84, 66, 53, 47};
std::vector<std::string> student_names {"Joci", "Sara","Kora","Jan","Indra","Bern", "Fred"};
student_ranking(student_scores, student_names)
// =>
// {"1. Joci: 100", "2. Sara: 99", "3. Kora: 90", "4. Jan: 84", "5. Indra: 66", "6. Bern: 53", "7. Fred: 47"}
Bár a 100 pontos „tökéletes” eredmény ritka egy vizsgán, érdekes lehet tudni, hogy legalább egy tanuló elérte-e.
Hozd létre a perfect_score() függvényt student_scores és student_names paraméterekkel.
A listák ugyanazok, mint a 4. részfeladatban.
A függvény return-nel adja vissza az első <name>-et (stringként) annak a tanulónak a neveként, aki 100 pontot ért el a vizsgán.
Ha nincs 100 pontos eredmény, üres stringet ("") kell visszaadni.
perfect_score({"Nur", "Tony", "Fatima"}, {90, 80, 100});
// => "Fatima"
perfect_score({"Nur", "Tony"}, {90, 80});
// => ""
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) C++ nyelvet 19 fogalom100 feladat segítségével, valódi emberi mentorálással, mindez ingyen.