You are on page 1of 2

Objektno orijentirano programiranje

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.

float main_loop(Filter &p) {


while(p.read()) {
p.compute();
p.write();
}
return p.result();
}

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;

it = max_element(m.begin(), m.end(), comp());


if(it!=m.end())
cout << "Najstariji: " << it->first << endl;
it = min_element(m.begin(), m.end(), comp());
if(it!=m.end())
cout << "Najmladji: " << it->first << endl;

float p = for_each(m.begin(), m.end(), average());


cout << "Prosjek godina: " << p << endl;
}

You might also like