Ласло Краус |
ИР2ОО1 Први колоквијум 2. 12. 2006. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Шта су референце (упућивачи) и да ли је дозвољено имати низ референци? Зашто?
б) Шта исписује приложени програм?
в) Која општа ограничења постоје при преклапању оператора?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
++r) или смањи (−−r) за један корак, да се отпорник прочита из улазног тока (ut>>r) и да се упише у излазни ток (it<<r) у облику R(r,Δr), где су: r – тренутна вредност отпорности и Δr – износ корака промене. Параметре приликом стварања отпoрника не треба проверавати. Ако би отпорност, при смањивању, требалo да постане негативна, поставља се на нулу.
veza+=r; у случају неуспеха програм се прекида). Може да се дохвати капацитет и број попуњених места, да се израчуна отпорност везе, да се дохвати отпорник задатог редног броја (veza[i], недозвољен индекс прекида програм), да се избаце отпорници нулте вредности и да се веза упише у излазни ток (it<< veza) у облику r+r+…+r, где је: r – резултат писања једног садржаног отпорника.
(20 поена) Написати на језику C++ програм који читајући податке с главног улаза прво направи редну везу отпорника од неколико отпорника. Затим, све док у редној вези постоји бар један отпорник, испише везу и отпорност везе на главном излазу, смањи вредност сваког садржаног отпорника за један корак и избаци из везе све отпорнике чије су отпорности постале нула.
#include <iostream>
#include <cstdlib>
using namespace std;
class Otpornik {
double r, d;
public:
Otpornik (double rr=1000, double dd=1) { r = rr; d = dd; }
double otp () const { return r; }
Otpornik& operator++ () { r += d; return *this; }
Otpornik& operator-- () {
r -= d; if (r < 0) r = 0;
return *this;
}
friend istream& operator>> (istream& ut, Otpornik& r)
{ return ut >> r.r >> r.d; }
friend ostream& operator<< (ostream& it, const Otpornik& r)
{ return it << "R(" << r.r << ',' << r.d << ')'; }
};
class Veza {
Otpornik* niz; int kap, duz;
void kopiraj (const Veza& v);
void brisi () { delete [] niz; }
public:
explicit Veza (int k=2) {
niz = new Otpornik [kap = k];
duz = 0;
}
Veza (const Veza& v) {kopiraj(v);}
~Veza () { brisi (); }
Veza& operator= (const Veza& v) {
if (this != &v) { brisi (); kopiraj (v); }
return *this;
}
int uzmiKap () const {return kap;}
int uzmiDuz () const {return duz;}
Veza& operator+= (const Otpornik& r) {
if (duz == kap) exit (1);
niz[duz++] = r;
return *this;
}
double otp () const;
Otpornik& operator[] (int i) {
if (i,0 || i>=duz) exit (2);
return niz[i];
}
const Otpornik& operator[] (int i) const {
if (i,0 || i>=duz) exit (2);
return niz[i];
}
Veza& izbaci ();
friend ostream& operator<< (ostream& it, const Veza& v);
};
void Veza::kopiraj (const Veza& v) {
niz = new Otpornik [kap = v.kap];
duz = v.duz;
for (int i=0; i<duz; i++)
niz[i] = v.niz[i];
}
double Veza::otp () const {
double r = 0;
for (int i=0; i<duz; r+=niz[i++].otp());
return r;
}
Veza& Veza::izbaci () {
int j=0;
for (int i=0; i<duz; i++)
if (niz[i].otp()) niz[j++] = niz[i];
duz = j;
return *this;
}
ostream& operator<< (ostream& it, const Veza& v) {
for (int i=0; i<v.duz; i++) {
if (i) it << '+';
it << v.niz[i];
}
return it;
}
int main () {
cout << "n? "; int n; cin >> n;
Veza v(n);
for (int i=0; i<n; i++) {
cout << "r,d? ";
Otpornik r; cin >> r; v += r;
}
while (v.uzmiDuz ()) {
cout << v << '=' << v.otp() << endl;
for (int i=0; i<v.uzmiDuz(); --v[i++]);
v.izbaci ();
}
}
n? 4
r,d? 4 1
r,d? 8 3
r,d? 5 2
r,d? 10 3
R(4,1)+R(8,3)+R(5,2)+R(10,3)=27
R(3,1)+R(5,3)+R(3,2)+R(7,3)=18
R(2,1)+R(2,3)+R(1,2)+R(4,3)=9
R(1,1)+R(1,3)=2
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.20107.