Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО1
Први колоквијум
2. 12. 2006.

Аутори: Игор Тартаља и Ласло Краус

Задаци: 1 2 | Напоменe | Решења: 2

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) Шта су референце (упућивачи) и да ли је дозвољено имати низ референци? Зашто?

б) Шта исписује приложени програм?

в) Која општа ограничења постоје при преклапању оператора?

Поставка задатка 2 (укупно 70 поена) ( решење | почетак)

Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):

(20 поена) Написати на језику C++ програм који читајући податке с главног улаза прво направи редну везу отпорника од неколико отпорника. Затим, све док у редној вези постоји бар један отпорник, испише везу и отпорност везе на главном излазу, смањи вредност сваког садржаног отпорника за један корак и избаци из везе све отпорнике чије су отпорности постале нула.


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

#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
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.20107.