[ fresh.bm @ 22.12.2008. 13:16 ] @
Kako cu realizovati preklapanje operatora >>, za unos podataka sa standardnog ulaza tako da mi ucitava razlomak,
ako imam klasu Razlomak, koja ima privatne argumente brojilac i imenilac;

npr. unesem
8/27 na standardnom ulazu da mi 8 smjesti u brojilac a 27 u imenilac.
Bitna mi je funkcija koja razdvaja ova dva broja. Kako nju realizovati?
[ karas @ 22.12.2008. 21:25 ] @
Pretpostavimo da imaš klasu poput
Code:

class Razlomak
{
  private:

    int brojilac;
    int imenilac;

  public:

    Razlomak(): brojilac(0), imenilac(0)
    {
    }

    Razlomak(int b, int i): brojilac(b), imenilac(i)
    {
    }

    // ostali konstruktori po volji, destruktor, geteri, seteri, itd.
};


Onda bi mogao da se preklopi operator koji ce da čita razlomke poput 1/4 sa:
Code:

istream& operator>> (istream& is, Razlomak& r)
{
  double imenilac, brojilac;
  is >> imenilac;
  is.ignore();// preskoci razlomacku crtu
  is >> brojilac;
  r = Razlomak(imenilac, brojilac);
  return is;
}

Naravno, >> bi trebalo da proveri da li su pročitane vrednosti ispravne (imenilac npr. ne može biti nula), da li je razlomačka crta na mestu, može li biti belina između brojeva i crte i tome slično - sve te varijante bi trebalo da razmotriš i ubaciš u funkciju, ovde je izneta samo ideja.
[ fresh.bm @ 22.12.2008. 23:35 ] @
Hvala, tako sm i ja zamilslio ali nisam znao realizovati.
Da li se na ovaj nacin mogu ucitavati razlomci tipa, 22/35
ili samo jednocifreni razlomci.
Sta oznacava
ignore()?
[ karas @ 23.12.2008. 05:36 ] @
Ispravka, operator>> treba da čita cele brojeve, dakle popravljena verzija je
Code:

istream& operator>> (istream& is, Razlomak& r)
{
  int imenilac, brojilac;
  is >> imenilac;
  is.ignore();// preskoci razlomacku crtu
  is >> brojilac;
  r = Razlomak(imenilac, brojilac);
  return is;
}

Naš operator>> koristi postojeći operator>> za cele brojeve, dakle može da pročita ceo broj sa više cifara. ignore() preskače sledeći znak, pretpostavka je da je to razlomačka crta, vidi http://www.cppreference.com/wiki/io/ignore.
[ Helionprime @ 29.12.2008. 20:13 ] @
Koliko sam shvatio, ovde treba da se unese npr: prvo " 15/ "[ENTER]( za imenilac ) tada se 15 stavlja u imenilac , a " / " se ignoriše, a zatim se unosi brojilac " 17 "[ENTER].

Ono što je nama trebalo je to da operator unosa treba biti preklopljen tako da se razlomak unosi u obliku

" 15/17 " [ENTER], pa iz ovoga da se 15 stavi za imenilac a 17 za brojilac (ili bi obrnuto, nikad ne znam koji je imenilac a koji brojilac )

Ili ovo ignore() radi istu stvar ???
[ Helionprime @ 29.12.2008. 20:40 ] @
Evo kako sam ja zamislio, ( za jednocifrene razlomke , za dvocifrene je komplikovanije):

Code:

istream& operator>>(istream&in, Razlomak&r){
             char temp[3];    // 3 zbog toga što su u pitanju jednocifreni razlomci;
             in >> temp;
             r.brojilac=temp[0]-'0';         // na temp[0] je smješten brojilac
                                             // na temp[1] je smješten '/', preskačemo ga
             r.imenilac=temp[2]-'0';       //na temp[2] je smješten imenilac
             return in;
             }


[ Burgos @ 29.12.2008. 21:15 ] @
Code:
#include <iostream>

using namespace std;

class Razlomak;
istream& operator>>(istream& in, Razlomak &r);
ostream& operator<<(ostream& out, Razlomak& r);

class Razlomak
{
    int m_Brojilac, m_Imenilac;
    
public:
    Razlomak(): m_Imenilac(0), m_Brojilac(0)
    {

    }

    Razlomak(int Brojilac, int Imenilac): m_Brojilac(Brojilac), m_Imenilac(Imenilac)
    {

    }

    void ispisi()
    {
        cout << m_Brojilac << '/' << m_Imenilac;
    }

    friend istream& operator>>(istream& in, Razlomak &r);
    friend ostream& operator<<(ostream& out, Razlomak& r);
};

istream& operator>>(istream& in, Razlomak &r)
{
    int a, b;
    char crta;
    in >> a >> crta >> b;

    if(crta == '/')
        r = Razlomak(a, b);
    else r = Razlomak();

    return in;
}

ostream& operator<<(ostream& out, Razlomak& r)
{
    out << r.m_Brojilac;
    out << '/';
    out << r.m_Imenilac;
    return out;
}

int main()
{
    Razlomak r1;
    cin >> r1;
    cout << r1;
    cout << endl;

    return 0;
}