Ласло Краус |
ИР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.