Úloha 2.3
Napíšte program, zdrojový kód, v jazyku C++ použitím štandardu C++17, ktorý realizuje nasledovnú činnosť.
Vytvorte triedu Student
so súkromnými atribútmi:
std::string meno
int rocnik
std::vector<double> znamky
Implementujte verejné metódy:
- Konstruktor na inicializáciu mena a ročníka.
- Metódu
pridaj_znamku(double znamka)
, ktorá pridá známku do zoznamu známok. - Metódu
vypocitaj_priemer()
, ktorá vráti priemernú hodnotu známok. - Metódu
vypis_info()
, ktorá vypíše informácie o študentovi v nasledujúcom formáte:
Meno: <meno>
Ročník: <rocnik>
Priemerná známka: <priemer>
Použite triedu std::vector
na ukladanie známok. Zabezpečte, aby meno a ročník nemohli byť priamo modifikované mimo
triedy. Ošetrite situácie, keď študent nemá žiadne známky pri výpočte priemeru. Pre demonštráciu implementácie vytvorte
vo funkcii main
aspoň tri objekty a zavolajte ich metódy.
Rozbaľ pre ukážku riešenia
#include <iostream>
#include <vector>
#include <string>
#include <numeric> // Pre std::accumulate
class Student {
private:
std::string meno;
int rocnik;
std::vector<double> znamky;
public:
// Konštruktor na inicializáciu mena a ročníka
Student(const std::string& m, int r) : meno(m), rocnik(r) {}
// Metóda na pridanie známky
void pridaj_znamku(double znamka) {
if (znamka >= 1.0 && znamka <= 5.0) {
znamky.push_back(znamka);
} else {
std::cout << "Neplatná známka. Povolené hodnoty sú od 1.0 do 5.0.\n";
}
}
// Metóda na výpočet priemernej známky
double vypocitaj_priemer() const {
if (znamky.empty()) {
return 0.0; // Ak nie sú známky, vracia 0
}
return std::accumulate(znamky.begin(), znamky.end(), 0.0) / znamky.size();
}
// Metóda na výpis informácií o študentovi
void vypis_info() const {
std::cout << "Meno: " << meno << "\n"
<< "Ročník: " << rocnik << "\n"
<< "Priemerná známka: " << (znamky.empty() ? "N/A" : std::to_string(vypocitaj_priemer()))
<< "\n----------------------\n";
}
};
int main() {
// Vytvorenie objektov študentov
Student student1("Ján Novák", 2);
Student student2("Mária Horváthová", 3);
Student student3("Peter Kováč", 1);
// Pridanie známok
student1.pridaj_znamku(1.5);
student1.pridaj_znamku(2.0);
student1.pridaj_znamku(1.0);
student2.pridaj_znamku(3.0);
student2.pridaj_znamku(2.5);
student2.pridaj_znamku(4.0);
student3.pridaj_znamku(5.0);
student3.pridaj_znamku(4.5);
// Výpis informácií o študentoch
student1.vypis_info();
student2.vypis_info();
student3.vypis_info();
return 0;
}
Vysvetlenie:
Zapuzdrenie:
- Atribúty
meno
,rocnik
aznamky
sú súkromné (private
), aby neboli priamo modifikovateľné mimo triedy.
- Atribúty
Konštruktor:
- Inicializuje meno a ročník študenta.
Metódy:
pridaj_znamku(double znamka)
: Pridá známku do vektoraznamky
, ak je v rozsahu1.0 - 5.0
.vypocitaj_priemer()
: Počíta aritmetický priemer známok, pričom kontroluje, či zoznam nie je prázdny.vypis_info()
: Vypíše meno, ročník a priemernú známku (ak neexistujú známky, zobrazí “N/A”).
Použitie
std::vector<double>
:znamky
sú uložené v dynamickom kontajneristd::vector
, čo umožňuje efektívne pridávanie nových hodnôt.
Ošetrenie prázdneho zoznamu známok:
- Ak študent nemá žiadne známky, priemer sa vráti ako
0.0
a vo výpise sa zobrazí"N/A"
.
- Ak študent nemá žiadne známky, priemer sa vráti ako
Príklad výstupu:
Meno: Ján Novák
Ročník: 2
Priemerná známka: 1.5
----------------------
Meno: Mária Horváthová
Ročník: 3
Priemerná známka: 3.166667
----------------------
Meno: Peter Kováč
Ročník: 1
Priemerná známka: 4.75
----------------------