Ласло Краус |
СИ2ОО1 Испит 12. 2. 2006. |
|---|
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
а) Шта означава модификатор методе inline и када се он подразумева?
б) Каква је разлика између статичке и нестатичке методе? Да ли се у статичкој методи може користити this?
Коришћењем класа из првог дела, саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
dat<<cvor).
dat<<grana) у облику ozn(poc,kra), где су ozn – ознака гране а poc и kra – ознаке почетног и крајњег чвора гране. Грана не сме да се копира.
а) Ако се у некој класи X дефинише operator()(int), како се за X x; int i; преводи x(i)?
б) Да ли апстрактна класа може имати атрибуте и конкретне методе и зашто?
Коришћењем класа из првог и другог дела, саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа класа које су оспособљене за исписивање текста поруке):
niz+=elem; препуњавање низа је грешка). Може да се дохвати број елемената низа и да се приступа елементу са датим редним бројем (niz[ind]; грешка је ако је индекс изван опсега).
(10 поена) Саставити на језику C++ главни програм који направи географску карту од два географска чвора са контурама од по три тачке и једном географском граном између та два чвора и исписује дужину те гране на главном излазу.
а) Шта се дешава са изузетком баченим у неком try блоку уколико иза блока не постоји одговарајућа catch грана која може да обради изузетак?
б) Како се може спречити аутоматско генерисање функције из шаблона за неки тип аргумента?
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
class Tacka {
double xx, yy;
public:
Tacka (double x=0, double y=0) { xx = x; yy = y; }
double x () const { return xx; }
double y () const { return yy; }
double rastojanje (Tacka t=Tacka()) { return sqrt (pow(xx-t.xx,2) + pow(yy-t.yy,2)); }
};
class Mesto {
char* iime; Tacka* niz; int n;
void kopiraj (const Mesto& m);
void brisi () { delete [] iime; delete [] niz; }
public:
explicit Mesto (const char* ime, int nn=8) {
iime = new char [strlen(ime)+1];
strcpy (iime, ime);
niz = new Tacka [n = nn];
}
Mesto (const Mesto& m) { kopiraj (m); }
~Mesto () { brisi (); }
Mesto& operator= (const Mesto& m) {
if (this != &m) { brisi (); kopiraj (m); }
return *this;
}
Mesto& postavi (Tacka t, int i) {
if (i>=0 && i<n) niz[i] = t;
return *this;
}
Tacka centar () const;
double obim () const;
const char* ime () { return iime; }
};
void Mesto::kopiraj (const Mesto& m) {
iime = new char [strlen (m.iime)+1];
strcpy (iime, m.iime);
niz = new Tacka [n = m.n];
for (int i=0; i<n; i++) niz[i] = m.niz[i];
}
Tacka Mesto::centar () const {
double x = 0, y = 0;
for (int i=0; i<n; i++) { x += niz[i].x(); y += niz[i].y(); }
return Tacka (x/n, y/n);
}
double Mesto::obim () const {
double a = niz[0].rastojanje (niz[n-1]);
for (int i=1; i<n; i++) a += niz[i-1].rastojanje (niz[i]);
return a;
}
class Cvor {
char ozn;
virtual void pisi (ostream& d) const { d << ozn; }
public:
explicit Cvor (char oz) { ozn = oz; }
virtual ~Cvor () {}
char oznaka () const { return ozn; }
virtual double vel () const =0;
friend ostream& operator<< (ostream& d, const Cvor& c) { c.pisi (d); return d; }
};
class GeoCvor: public Cvor {
Mesto mst;
void pisi (ostream& d) { d << mst.ime() << '/' << vel (); }
public:
explicit GeoCvor (char oz, const Mesto& ms): Cvor (oz), mst (ms) {}
double vel () const { return mst.obim (); }
Tacka centar () const { return mst.centar (); }
};
class Grana {
Grana (const Grana&) {}
void operator= (const Grana&) {}
protected:
char ozn; const Cvor *poc, *kra;
public:
Grana (char oz, const Cvor* po, const Cvor* kr) {ozn = oz; poc = po, kra = kr; }
virtual ~Grana () {}
char oznaka () const { return ozn; }
virtual double duz () const =0;
friend ostream& operator<< (ostream& d, const Grana& g)
{ return d << g.ozn << '(' << g.poc->oznaka() << ',' << g.kra->oznaka() << ')'; }
};
class GeoGrana: public Grana {
public:
GeoGrana (char oz, const GeoCvor* po, const GeoCvor* kr): Grana (oz, po, kr) {}
double duz () const {
const GeoCvor* cv1 = static_cast<const GeoCvor*>(poc);
const GeoCvor* cv2 = static_cast<const GeoCvor*>(kra);
return cv1->centar().rastojanje (cv2->centar());
}
};
class GIndeks {
friend ostream& operator<< (ostream& d, const GIndeks&)
{ return d << "*** Nedozvoljeni indeks!"; }
};
class GPun {
friend ostream& operator<< (ostream& d, const GPun&)
{ return d << "*** Niz je pun!"; }
};
template <typename T>
class Niz {
T* niz; int kap, duz;
void kopiraj (const Niz& n);
public:
explicit Niz (int k=10) { niz = new T [kap = k]; duz = 0; }
Niz (const Niz& n) { kopiraj (n); }
~Niz () { delete [] niz; }
Niz& operator= (const Niz& n) {
if (this != &n) { delete [] niz; kopiraj (n); }
return *this;
}
int vel () const { return duz; }
Niz& operator+= (const T& t) {
if (duz == kap) throw GPun ();
niz[duz++] = t;
return *this;
}
T& operator[] (int i) {
if (i<0 || i>=duz) throw GIndeks ();
return niz[i];
}
const T& operator[] (int i) const {
if (i<0 || i>=duz) throw GIndeks ();
return niz[i];
}
Niz& isprazni () { duz = 0; }
};
template <typename T>
void Niz<T>::kopiraj (const Niz& n) {
niz = new T [kap = n.kap]; duz = n.duz;
for (int i=0; i<duz; i++) niz[i] = n.niz[i];
}
class GCvor {
friend ostream& operator<< (ostream& d, const GCvor&)
{ return d << "*** Neispravna oznaka cvora!"; }
};
class GGrana {
friend ostream& operator<< (ostream& d, const GGrana&)
{ return d << "*** Neispravna oznaka grane!"; }
};
class GeoKarta {
Niz<GeoCvor*> cvori;
Niz<GeoGrana*> grane;
GeoKarta (const GeoKarta&) {}
void operator= (const GeoKarta&) {}
public:
GeoKarta (int ncv, int ngr): cvori(ncv), grane(ngr) {}
~GeoKarta ();
GeoKarta& dodajCvor (GeoCvor& cv) { cvori += new GeoCvor (cv); return *this; }
GeoKarta& dodajGranu (GeoGrana* gr) { grane += gr; return *this; }
const GeoCvor* dohvatiCvor (char ozn) const;
const GeoGrana* dohvatiGranu (char ozn) const;
};
GeoKarta::~GeoKarta () {
for (int i=0; i<cvori.vel(); delete cvori[i++]);
for (int i=0; i<grane.vel(); delete grane[i++]);
}
const GeoCvor* GeoKarta::dohvatiCvor (char ozn) const {
for (int i=0; i<cvori.vel(); i++)
if (cvori[i]->oznaka() == ozn) return cvori[i];
throw GCvor ();
}
const GeoGrana* GeoKarta::dohvatiGranu (char ozn) const {
for (int i=0; i<grane.vel(); i++)
if (grane[i]->oznaka() == ozn) return grane[i];
throw GGrana ();
}
int main () {
GeoKarta karta (2,1);
Mesto bg ("Beograd", 3);
bg.postavi(Tacka(1,1),0);
bg.postavi(Tacka(2,1),1);
bg.postavi(Tacka(2,2),2);
karta.dodajCvor (GeoCvor('A', bg));
Mesto ni ("Nis", 3);
ni.postavi(Tacka(-1,-1),0);
ni.postavi(Tacka(-2,-1),1);
ni.postavi(Tacka(-2,-2),2);
karta.dodajCvor (GeoCvor('B', ni));
try {
karta.dodajGranu (new GeoGrana('x', karta.dohvatiCvor('A'),
karta.dohvatiCvor('B')));
cout << karta.dohvatiGranu('x')->duz() << endl;
} catch (GCvor g) { cout << g << endl; }
catch (GGrana g) { cout << g << endl; }
return 0;
}
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.