Kurzusok
/
C++
C++
/
Feladatok
/
Osztályozás
Osztályozás

Osztályozás

Tanulófeladat

Bevezetés

Tömbök és vektorok

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.

Létrehozás

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.

Elemek elérése

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. Az at függvény viszont kivételt dob, ami hosszú távon megkönnyítheti az életedet.

A vektor módosítói

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

Kapacitás

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.

Utasítások

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.

1. Pontszámok kerekítése

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.

2. Nem átmenő tanulók

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

3. Betűs érdemjegyek kiszámítása

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}

4. Nevek párosítása a pontszámokkal

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"}

5. A „tökéletes” pontszám

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});
// => ""
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
C++ Exercism

Készen állsz elkezdeni a(z) Osztályozás feladatot?

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.