Klasa Tacka
Napiši klasu Tacka sa koordinatama x, y, konstruktorom i metodom rastojanje(const Tacka& t). Učitati n tačaka i ispisati obim mnogougla koji one redom čine (zatvoren), na dve decimale.
Primer
Ulaz
4
0 0
3 0
3 4
0 4Izlaz
14.00Klasa spaja podatke i funkcije koje rade sa njima u jednu celinu – kao šablon po kome se prave objekti. U ovoj lekciji su atributi i metode, konstruktori, javni i privatni delovi (enkapsulacija) i preklapanje operatora, na primeru razlomka i bankovnog računa.
Struktura (struct) grupiše podatke – vidi Strukture i unije. Klasa (class) im dodaje metode i kontrolu pristupa. Jedina razlika ključnih reči: u struct je sve podrazumevano public, a u class private.
#include <iostream>
#include <string>
using namespace std;
class Pravougaonik {
public: // dostupno svima
double a, b; // atributi (podaci)
double povrsina() const { // metoda; const = ne menja objekat
return a * b;
}
double obim() const {
return 2 * (a + b);
}
};
int main() {
Pravougaonik p; // objekat klase Pravougaonik
cin >> p.a >> p.b;
cout << "P = " << p.povrsina() << ", O = " << p.obim() << "\n";
return 0;
}
Konstruktor je posebna metoda istog imena kao klasa; poziva se pri pravljenju objekta i postavlja početno stanje. Podaci koji ne smeju da se menjaju spolja idu u private – menjaju se samo preko metoda koje proveravaju pravila. To se zove enkapsulacija.
#include <iostream>
#include <string>
using namespace std;
class Racun {
private:
string vlasnik;
long long stanje; // ne može se promeniti direktno spolja
public:
Racun(string ime, long long pocetno) : vlasnik(ime), stanje(pocetno) {} // konstruktor
void uplati(long long iznos) {
if (iznos > 0) stanje += iznos;
}
bool isplati(long long iznos) { // vraća da li je uspelo
if (iznos <= 0 || iznos > stanje) return false;
stanje -= iznos;
return true;
}
long long getStanje() const { return stanje; }
string getVlasnik() const { return vlasnik; }
};
int main() {
Racun r("Ana", 1000);
int q;
cin >> q;
while (q--) {
string op;
long long x;
cin >> op >> x;
if (op == "uplata") r.uplati(x);
else if (!r.isplati(x)) cout << "odbijeno: " << x << "\n";
}
cout << r.getVlasnik() << " ima " << r.getStanje() << "\n";
// r.stanje = 1000000; // GREŠKA pri prevođenju: stanje je private
return 0;
}
Zapis : vlasnik(ime), stanje(pocetno) je lista inicijalizacije – preporučen način da konstruktor postavi atribute. Metode koje samo čitaju označavaju se sa const.
#include <iostream>
#include <numeric> // gcd
using namespace std;
class Razlomak {
long long b, i; // brojilac, imenilac (private po podrazumevanju)
void skrati() {
long long g = gcd(b, i);
b /= g; i /= g;
if (i < 0) { b = -b; i = -i; } // imenilac uvek pozitivan
}
public:
Razlomak(long long br = 0, long long im = 1) : b(br), i(im) { skrati(); }
Razlomak operator+(const Razlomak& o) const { return Razlomak(b * o.i + o.b * i, i * o.i); }
Razlomak operator*(const Razlomak& o) const { return Razlomak(b * o.b, i * o.i); }
bool operator<(const Razlomak& o) const { return b * o.i < o.b * i; }
friend ostream& operator<<(ostream& out, const Razlomak& r) { // ispis sa cout <<
return out << r.b << "/" << r.i;
}
};
int main() {
long long a, b, c, d;
cin >> a >> b >> c >> d;
Razlomak x(a, b), y(c, d);
cout << x << " + " << y << " = " << x + y << "\n";
cout << x << " * " << y << " = " << x * y << "\n";
cout << (x < y ? "prvi je manji" : "prvi nije manji") << "\n";
return 0;
}
Kada klasa ima operator<, objekti mogu da se sortiraju sa sort i čuvaju u set-u bez posebnog komparatora. Funkcija gcd je iz zaglavlja <numeric> (C++17).
#include <bits/stdc++.h>
using namespace std;
class Ucenik {
public:
string ime;
vector<int> ocene;
Ucenik(string i) : ime(i) {}
double prosek() const {
if (ocene.empty()) return 0;
return accumulate(ocene.begin(), ocene.end(), 0.0) / ocene.size();
}
};
int main() {
int n;
cin >> n;
vector<Ucenik> razred;
for (int k = 0; k < n; k++) {
string ime;
int m;
cin >> ime >> m;
Ucenik u(ime);
for (int j = 0; j < m; j++) { int o; cin >> o; u.ocene.push_back(o); }
razred.push_back(u);
}
const Ucenik* najbolji = &razred[0];
for (const auto& u : razred)
if (u.prosek() > najbolji->prosek()) najbolji = &u;
cout << fixed << setprecision(2) << najbolji->ime << " " << najbolji->prosek() << "\n";
return 0;
}
Za svaki zadatak postoji primer, uputstvo i rešenje. Rešenja su provereno tačna na primerima iz teksta.
Napiši klasu Tacka sa koordinatama x, y, konstruktorom i metodom rastojanje(const Tacka& t). Učitati n tačaka i ispisati obim mnogougla koji one redom čine (zatvoren), na dve decimale.
4
0 0
3 0
3 4
0 414.00Napravi klasu Vreme (sati, minuti, sekunde) sa konstruktorom iz ukupnog broja sekundi, operatorom + i ispisom u obliku hh:mm:ss (vodeće nule). Učitati n vremena (hh mm ss) i ispisati njihov zbir; sati mogu preći 24.
3
01 30 45
00 45 30
10 00 0012:16:15class A { ... };.vector<Klasa> v(n) tada ne radi, osim ako parametri imaju podrazumevane vrednosti.const Klasa& – bez kopiranja.1. Šta je podrazumevani pristup članovima u class?
2. Kada se poziva konstruktor?
3. Šta znači const posle metode, npr. double povrsina() const?
4. Šta omogućava operator< u klasi?