Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 6 odgovora
  • 4.192 pregleda

Najnovija ↓

Preklapanje operatora, ucitavanje razlomaka 22.12.2008. u 14:16 · pre 217 meseci #1
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?
Re: Preklapanje operatora, ucitavanje razlomaka 22.12.2008. u 22:25 · pre 217 meseci #2
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.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Preklapanje operatora, ucitavanje razlomaka 23.12.2008. u 00:35 · pre 217 meseci #3
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()?
Re: Preklapanje operatora, ucitavanje razlomaka 23.12.2008. u 06:36 · pre 217 meseci #4
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.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Preklapanje operatora, ucitavanje razlomaka 29.12.2008. u 21:13 · pre 217 meseci #5
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 ???
Potpis
"Dont worry about thing, 'cause every lil' thing is gonna be allright" Bob Marley
Re: Preklapanje operatora, ucitavanje razlomaka 29.12.2008. u 21:40 · pre 217 meseci #6
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;
             }


Potpis
"Dont worry about thing, 'cause every lil' thing is gonna be allright" Bob Marley
Re: Preklapanje operatora, ucitavanje razlomaka 29.12.2008. u 22:15 · pre 217 meseci #7
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;
}
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme