Professional Documents
Culture Documents
OOP C++ Zadaci 1
OOP C++ Zadaci 1
ispit
2. srpanj 2003.
1. (25 bodova)
Napišite klasu Vec4 koja u sebi sadrži vektor od četiri float broja. Podržite najosnovnije operacije za rad s vektorima:
• pristup pojedinim elementima vektora - operator[]
• dodjeljivanje vrijednosti vektora vektoru - operator=
• pribrajanje vektora - operator+=
• množenje floating point brojem - operator*=
Ukoliko smatrate da default konstruktor, copy konstruktor i destruktor koji se automatski generiraju nisu dobri za vašu
klasu, onda napišite i njih. Napomena: obratite pažnju na konstantnost.
2. (35 bodova)
Zadan je interface:
class Filter {
public:
virtual int read() = 0;
virtual void write() = 0;
virtual void compute() = 0;
virtual float result() const = 0;
virtual ~Filter() = 0;
};
Filter::~Filter() {}
Napišite takvu implementaciju klase My_filter da sljedeći program ispisuje na standardni izlaz sve ono što je uneseno
na standardni ulaz osim svih slova 'a' i 'A'. Program na kraju ispisuje broj neispisanih znakova podijeljen s brojem
unesenih znakova.
int main() {
My_filter f(cin, cout);
float a = main_loop(f);
cout << "Frekvencija slova 'a' je: " << a << endl;
}
3. (40 bodova)
Napišite program koji sa standardnog ulaza učitava imena osoba i njihove godine sve dok se za ime ne unese "end".
Podatke stavljajte u mapu. Koristeći standardne algoritme ispišite:
• abecednim redom imena unesenih osoba i njihove godine
• ime najstarije i ime najmlađe osobe
• prosjek godina.
Rješenja
1.
class Vec4 {
float v[4];
public:
const float& operator[](int i) const { return v[i]; }
float& operator[](int i) { return v[i]; }
Vec4& operator=(const Vec4 &oth) {
for(int i=0; i<4; ++i) v[i]=oth.v[i];
return *this;
}
Vec4& operator+=(const Vec4 &oth) {
for(int i=0; i<4; ++i) v[i]+=oth.v[i];
return *this;
}
Vec4& operator*=(float f) {
for(int i=0; i<4; ++i) v[i]*=f;
return *this;
}
};
2.
class My_filter : public Filter {
istream& is;
ostream& os;
int nchar, nA;
char c;
public:
int read() { is >> c; return is.good(); }
void write() {
if(c=='a' || c=='A') ++nA;
else os << c;
}
void compute() { ++nchar; }
float result() const { return nchar ? float(nA)/nchar : 0; }
My_filter(istream &is, ostream &os) : is(is), os(os), nchar(0), nA(0) {}
};
3.
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
struct comp {
bool operator()(const pair<const string, int>& p1, const pair<const string, int>& p2){
return p1.second < p2.second;
}
};
class average {
int s, count;
public:
void operator()(const pair<const string, int>&p) { s+=p.second; count++; }
operator float() { return count ? float(s)/count : 0; }
average() : s(0), count(0) {}
};
int main() {
map<string, int> m;
while(true) {
string s; cin >> s;
if(s == "end") break;
int g; cin >> g;
m[s]=g;
}
map<string, int>::const_iterator it;
for(it=m.begin(); it!=m.end(); ++it)
cout << it->first << '\t' << it->second << endl;