![]() Ласло Краус |
Објектно програмирање - испити Практични испит 18. 6. 1999 |
---|
Pravoug
). Предвидети:
+
),
*=
),
>>
), и
<<
).
Kvadar
) као изведену класу из класе правоугаоника.
Поред могућности те класе предвидети још и иницијализацију квадра
правоугаоником са дужином треће ивице једнаком један.
Пројектовати на језику C++ класу за уређене листе (ULista
)
геометријских објеката (правоугаоника и квадара) на основу њихових
површина. Предвидети:
=
),
+=
), и
<<
).
NLista
) геометријских објеката као изведену класу из
класе за неуређене листе. Предвидети исте могућности које има и основна
класа.Саставити на језику C++ главни програм који:
N
=неуређена,
U
=уређена),
P
=правоугаоник,
K
=квадар) и димензије објекта преко главног улаза и
ставља у листу,
G
(=готово),
G
(=готово).
// 990618.h
#ifndef __990618__h__
#define __990618__h__
#include <iostream.h>
#include <math.h>
class Pravoug {
protected:
double a, b;
public:
Pravoug (double aa=1, double bb=1) { a = aa; b = bb; }
~Pravoug() {}
virtual Pravoug *kopija () const { return new Pravoug (*this); }
virtual double operator+ () const { return a*b; }
virtual Pravoug & operator*= (double k)
{ a *= k; b *= k; return *this; }
protected:
virtual void citaj (istream &dd) { dd >> a >> b; }
virtual void pisi (ostream &dd) const
{ dd << '(' << a << ',' << b << ')'; }
friend istream & operator>> (istream &dd, Pravoug &pp)
{ pp.citaj (dd); return dd; }
friend ostream & operator<< (ostream &dd, const Pravoug &pp)
{ pp.pisi (dd); return dd; }
};
class Kvadar: public Pravoug {
double c;
public:
Kvadar (double aa=1, double bb=1, double cc=1): Pravoug (aa,bb) { c = cc; }
Kvadar (const Pravoug &pp): Pravoug (pp) { c = 1; }
Pravoug *kopija () const { return new Kvadar (*this); }
double operator+ () const { return 2 * (a*b + b*c + c*a); }
Kvadar & operator+=(const Pravoug &t3) {
*this += t3; c *= ((const Kvadar &)t3).c; return *this;
}
private:
void citaj (istream &dd) { Pravoug::citaj (dd); dd >> c; }
void pisi (ostream &dd) const
{ dd << '(' << a << ',' << b << ',' << c << ')'; }
};
class ULista {
protected:
struct Elem { Pravoug *obj; Elem *sled;
Elem (const Pravoug &pp, Elem *ss=0)
{ obj=pp.kopija(); sled=ss; }
~Elem () { delete obj; }
};
Elem *prvi, *posl;
void kopiraj (const ULista &ul);
void brisi ();
public:
ULista () { prvi = posl = 0; }
ULista (const Pravoug &pp) { prvi = new Elem (pp); }
ULista (const ULista &ul) {kopiraj(ul);}
~ULista () { brisi (); }
virtual ULista & operator= (const ULista &ul) {
if (this != &ul) { brisi (); kopiraj (ul); }
return *this;
}
virtual ULista & operator+= (const Pravoug &pp);
friend ostream & operator<< (ostream &dd, const ULista &ul);
};
class NLista: public ULista {
public:
NLista (): ULista () {}
NLista (const NLista &nl): ULista (nl) {}
virtual NLista & operator+= (const Pravoug &pp) {
posl = (posl ? posl->sled : prvi) = new Elem (pp);
return *this;
}
};
#endif
// 990618.cpp
#include "990618.h"
void ULista::kopiraj (const ULista &ul) {
Elem* posl = prvi = 0;
for (Elem *tek=ul.prvi; tek; tek=tek->sled)
posl = (posl ? posl->sled : prvi) = new Elem (*(tek->obj));
}
void ULista::brisi () {
while (prvi) { Elem *stari = prvi; prvi = prvi->sled; delete stari; }
}
ostream & operator<< (ostream &dd, const ULista &ul) {
dd << '[';
for (ULista::Elem *tek=ul.prvi; tek; tek=tek->sled) {
dd << *(tek->obj);
if (tek->sled) dd << ',';
}
return dd << ']';
}
ULista & ULista::operator+= (const Pravoug &pp) {
for (Elem *tek=prvi, *preth=0; tek && +*tek->obj<+pp;
preth=tek, tek=tek->sled);
(preth ? preth->sled : prvi) = new Elem (pp, tek);
return *this;
}
// 990618t.cpp
#include "990618.h"
#include <iostream.h>
void main () {
for (int dalje=1; dalje;) {
try {
cout<< "Vrsta liste (Neuredjena, Uredjena, Gotovo)? ";
char izb; cin >> izb; ULista *lista=0;
switch (izb) {
case 'N': case 'n': lista = new NLista; break;
case 'U': case 'u': lista = new ULista; break;
case 'G': case 'g': dalje = 0; break;
default: throw 1;
}
if (dalje) {
for (int jos=1; jos;) {
try {
cout << "Vrsta objekta (Pravougaonik, Kvadar, Gotovo)? ";
char izb; cin >> izb; Pravoug *obj=0;
switch (izb) {
case 'p': case 'P': obj = new Pravoug; break;
case 'k': case 'K': obj = new Kvadar; break;
case 'G': case 'g': jos = 0; break;
default: throw 1;
}
if (jos) {
cout << "Duzine stranica? "; cin >> *obj;
*lista += *obj; delete obj;
}
} catch (int) {
cout << "*** Neispravna vrsta tacaka ***\n";
}
}
cout << "Procitano: " << *lista << endl;
delete lista;
}
} catch (int) {
cout << "*** Neispravan izbor ***\n";
}
}
}
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.