[ timi263057 @ 30.10.2011. 23:22 ] @
/*1. Napisati klasu Razlomak s parametrima int b, n - predstavljaju brojnik i nazivnik.
Za zadanu klasu potrebno je napisati konstruktore (podrazumijevajući, koji postavlja razlomak na 1,
te konstruktor sa dva parametra), funkciju za ispis razlomka void ispis , te funkciju za overload operatora za zbrajanje i oduzimanje.
U main funkciji kreirati dva razlomka, te ispisati na ekran njihov zbroj i razliku, koristeći funkciju za ispis i definirane operatore.*/

Ovo sam napravio ali fakat ne kužim kako i šta dalje i to me živcira.

Code:
#include<conio.h>
#include<iostream>
using namespace std;

class Razlomak{
  
  public: float b,n,aa,bb;    
  
  Razlomak () {b=1; n=1;}
  Razlomak (float x, float y) {aa=x; bb=y; }

  
  friend Razlomak operator+(Razlomak &b, Razlomak &n);
  friend Razlomak operator-(Razlomak &b, Razlomak &n);
 
   
  float ispis ()
  {
     
  }
    
};

  Razlomak operator+(Razlomak &b, Razlomak &n) {return Razlomak ( b+n );}
  //Razlomak operator-(Razlomak &b, Razlomak &n) {return Razlomak (b+n);}
  
int main()
{
    
    Razlomak b, C;
    Razlomak n(6,3);

    C=b+n;
    cout<<C;
getch();
    
    }

[ Mihajlo Cvetanović @ 30.10.2011. 23:54 ] @
U zadatku piše da klasa treba da ima dva inta, b i n, a ne četiri floata. Konstruktor s parametrima verovatno treba da prima dva inta, a članice aa i bb ti ne trebaju. Dalje, u operatorima + i - treba da imaš malo matematike. Kako se sabiraju dva razlomka? Ovo je jednačina:

b1 / n1 + b2 / n2 = (b1 * n2 + b2 * n1) / (n1 * n2)

Rezultantni objekat treba da ima svoj b = b1 * n2 + b2 * n1, i svoj n = n1 * n2. Bilo bi zgodno i kad bi skratio brojeve tako da budu nedeljivi, ali to se trenutno ne traži. Možda će to biti zadatak za sledeći čas. Uzgred, ti operatori treba da imaju const parametre (const Razlomak &levi, const Razlomak &desni), jer ih samo čitaš, ali im ne menjaš sadržaj. Ovde bih samo napomenuo da ne valja da se "recikliraju" imena promenljivih, jer evo trenutno imaš zbunjujuću situaciju da su promenljive b i n objekti koji imaju članove b i n, to jest trebalo bi da barataš sa intovima b.b, b.n, n.b, n.n. To je vrlo zbunjujuće. Bolje je levi.b, levi.n, desni.b, desni.n.

Dalje, u zadatku kaže da funkcija ispis treba da ne vraća ništa (to jest povratna vrednost je void), ali da treba da ispiše nešto. Onom cout mesto je, dakle u funkciji ispis, a u funkciji main bi zato trebalo da stoji C.ispis(). Funkcija ispis verovatno treba da radi nešto nalik ovome: cout << b << " / " << n << endl;
[ chaami @ 31.10.2011. 03:52 ] @
Ja pravo da vam kažem nešto i nisam viđao ovu varijantu operatora+ u friend funkciji. Kod mene se preklapanje binarnih operatora uvek radilo ovako.
Code:
class Razlomak{

  private: int b,n;

  public:
  Razlomak () {b=1; n=1;}
  Razlomak (int x, int y) {b=x; n=y; }

  Razlomak operator+(Razlomak &desni);

  void ispis ();
};

Razlomak Razlomak::operator+ (Razlomak &desni)
{
    Razlomak temp;
    temp.b=b*desni.n+n*desni.b;
    temp.n=n*desni.n;
    return temp;
}

... zanimljivo ... može i sa friend funkcijom. Znači kod tebe bi to bilo
Code:
Razlomak operator-(Razlomak &levi, Razlomak &desni)
{
    Razlomak temp;
    temp.b=levi.b*desni.n-levi.n*desni.b;
    temp.n=levi.n*desni.n;
    return temp;
}


[Ovu poruku je menjao chaami dana 31.10.2011. u 05:07 GMT+1]
[ timi263057 @ 31.10.2011. 10:26 ] @
hvala ti, ali možeš li mi objasniti to sa "temp" ne shvaćam šta se radi tu

i kako na kraju ispisati njihov zbroj? O.o
[ Mihajlo Cvetanović @ 31.10.2011. 10:41 ] @
Nema razloga da postoji privremena promanljiva nazvana temp, jer sve može da se reši direktno sa return:

Code:
Razlomak operator-(Razlomak &levi, Razlomak &desni)
{
    return Razlomak(levi.b * desni.n - levi.n * desni.b, levi.n * desni.n);
}

[ Mihajlo Cvetanović @ 31.10.2011. 10:43 ] @
Citat:
timi263057: i kako na kraju ispisati njihov zbroj? O.o


Pročitaj moj prvi odgovor. Funkcija void Razlomak::ispis() treba da ispiše b i n, a u funkciji main samo pozoveš C.ispis();
[ timi263057 @ 31.10.2011. 10:55 ] @
aha, sad shvaćam.
kako program zna koji je levi a koji desni "n" odnosno "b"

[Ovu poruku je menjao timi263057 dana 31.10.2011. u 12:14 GMT+1]
[ Mihajlo Cvetanović @ 31.10.2011. 11:37 ] @
Kada se u kodu napiše x + y, gde su x i y objekti klase Razlomak, onda će kompajler pozvati operator+(Razlomak&, Razlomak&) i prvom parametru će dodeliti vrednost x, a drugom parametru biće dodeljena vrednost y. O tome brine kompajler.
[ timi263057 @ 31.10.2011. 12:00 ] @
e odlično. i samo još jedna stvar me zanima. kako korisniku omogućiti koje brojeve da unese i da se ti brojevi koriste za zbrajanje?
hvala puno, sad sam shvatio
[ Mihajlo Cvetanović @ 31.10.2011. 13:40 ] @
Kao što postoji cout postoji i cin, i on se koristi za unos podataka. Recimo cin >> b će dodeliti broju b ono što se unese preko tastature. Da bi stvorio jedan objekat tipa Razlomak trebaju ti dva broja tipa int. Učitaj dva broja i stvori objekat (koristeći konstruktor sa parametrima).