Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Preklapanje operatora, ucitavanje razlomaka

[es] :: C/C++ programiranje :: C/C++ za početnike :: Preklapanje operatora, ucitavanje razlomaka

[ Pregleda: 3221 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

fresh.bm

Član broj: 162156
Poruke: 182
*.broadband.blic.net.



+1 Profil

icon Preklapanje operatora, ucitavanje razlomaka22.12.2008. u 13:16 - pre 186 meseci
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?
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: Preklapanje operatora, ucitavanje razlomaka22.12.2008. u 21:25 - pre 186 meseci
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.
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."
 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.broadband.blic.net.



+1 Profil

icon Re: Preklapanje operatora, ucitavanje razlomaka22.12.2008. u 23:35 - pre 186 meseci
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()?
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: Preklapanje operatora, ucitavanje razlomaka23.12.2008. u 05:36 - pre 186 meseci
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.
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."
 
Odgovor na temu

Helionprime
Bajic Dusko
Banja Luka

Član broj: 206638
Poruke: 57
*.teol.net.



+1 Profil

icon Re: Preklapanje operatora, ucitavanje razlomaka29.12.2008. u 20:13 - pre 186 meseci
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 ???
"Dont worry about thing, 'cause every lil' thing is gonna be allright" Bob Marley
 
Odgovor na temu

Helionprime
Bajic Dusko
Banja Luka

Član broj: 206638
Poruke: 57
*.teol.net.



+1 Profil

icon Re: Preklapanje operatora, ucitavanje razlomaka29.12.2008. u 20:40 - pre 186 meseci
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;
             }



"Dont worry about thing, 'cause every lil' thing is gonna be allright" Bob Marley
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Preklapanje operatora, ucitavanje razlomaka29.12.2008. u 21:15 - pre 186 meseci
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;
}
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Preklapanje operatora, ucitavanje razlomaka

[ Pregleda: 3221 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.