Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Dzielenie ułamków zwykłych.

Ostatnio zmodyfikowano 2013-06-13 19:56
Autor Wiadomość
Cariel
Temat założony przez niniejszego użytkownika
C++ Dzielenie ułamków zwykłych.
» 2013-06-13 17:43:58
Witajcie. Chciałam prosić was o pomoc, bo sama już nie wiem co zrobić. Chodzi o wynik dzielenie który wychodzi zły. Pewnie jest to jakiś banalny powód, ale ja niestety nie jestem zbytnio zaprzyjaźniona z programowaniem i nie mam pojęcia co właściwie jest źle.

C/C++
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <conio.h>

using namespace std;

class Ulamek
{
private:
    int licz, mian;
public:
    Ulamek() //pierwszy konstruktor
    {
        licz = 1;
        mian = 1;
    }
   
    Ulamek( int x, int y )
        : licz( x )
        , mian( y )
    { } //drugi konstruktor
    void wypisz();
    void skroc();
    void operator +( Ulamek a );
    void operator -( Ulamek a );
    void operator *( Ulamek a );
    void operator /( Ulamek a );
   
};

void Ulamek::skroc()
{
    int a = abs( licz );
    int b = abs( mian );
    int c;
    while( b != 0 ) {
        c = a % b;
        a = b;
        b = c;
    }
    licz = licz / a;
    mian = mian / a;
   
}

void Ulamek::wypisz()
{
    skroc();
    cout << licz << "/" << mian << endl;
}

void Ulamek::operator +( Ulamek a )
{
    if( mian == a.mian )
    {
        cout <<( licz + a.licz ) << "/" << mian << endl;
    }
    else
         cout <<( licz * a.mian ) +( a.licz * mian ) << "/" <<( mian * a.mian ) << endl;
   
}

void Ulamek::operator -( Ulamek a )
{
    if( mian == a.mian )
    {
        cout <<( licz - a.licz ) << "/" << mian << endl;
    }
    else
         cout <<( licz * a.mian ) -( a.licz * mian ) << "/" <<( mian * a.mian ) << endl;
   
}

void Ulamek::operator *( Ulamek a )
{
    licz = licz * a.licz;
    mian = mian * a.mian;
    wypisz();
}

void Ulamek::operator /( Ulamek a )
{
    licz = licz * a.mian;
    mian = mian * a.licz;
    wypisz();
}


int main()
{
    Ulamek u1( 4, 8 );
    Ulamek u2( 5, 15 );
    u1.wypisz();
    cout << endl;
    u2.wypisz();
    cout << endl;
    cout << "Wynik dodawania dwoch ulamkow: ";
    u1 + u2;
    cout << "Wynik odejmowania dwoch ulamkow: ";
    u1 - u2;
    u2 - u1;
    cout << "Wynik mnozenia dwoch ulamkow: ";
    u1 * u2;
    cout << "Wynik dzielenia dwoch ulamkow: ";
    u2 / u1;
    u1 / u2;
    system( "pause" );
    return 0;
}

Z góry dziękuję za wszelką pomoc. ;)
P-85489
killjoy
» 2013-06-13 18:09:23
C/C++
void Ulamek::operator *( Ulamek a )
{
    licz = licz * a.licz; //Przypisujesz wartość mnożenia
    mian = mian * a.mian; //Przypisujesz wartość mnożenia
    wypisz();
}

Przypisujesz wartość mnożenia do ułamka po lewej stronie znaku *, więc dzielenie działa na jego zmodyfikowanej wersji, zresztą w dzieleniu robisz to samo.
P-85492
Cariel
Temat założony przez niniejszego użytkownika
» 2013-06-13 18:25:04
Dziękuję za wyjaśnienie, ale niestety dalej nie wiem co z tym zrobić.
P-85497
killjoy
» 2013-06-13 18:26:03
A co robisz w dodawaniu, że nie modyfikuje wartości, rusz głową.
P-85498
Cariel
Temat założony przez niniejszego użytkownika
» 2013-06-13 18:29:05
Masz rację, nie ma łatwo. Już myślę ;)
P-85499
Cariel
Temat założony przez niniejszego użytkownika
» 2013-06-13 18:36:41
Zabij mnie, ale naprawdę nie mam pojęcia.

Już wiem, dzięki wielkie za motywację ;)
P-85502
killjoy
» 2013-06-13 18:44:02
Zabijanie jest raczej słabym środkiem dedaktycznym, więc przypatrz się:
C/C++
void Ulamek::operator +( Ulamek a )
{
    if( mian == a.mian )
    {
        cout <<( licz + a.licz ) << "/" << mian << endl; //wypisujesz bezposrednio wynik
        //ponadto operator + nie modyfikuje wartosci zwraca tylko "co by ci wyszlo"
    }
    else
         cout <<( licz * a.mian ) +( a.licz * mian ) << "/" <<( mian * a.mian ) << endl; //to co powyżej
   
}

C/C++
void Ulamek::operator *( Ulamek a )
{
    licz = licz * a.licz; //modyfikujesz wartosc pola obiektu poprzez przypisanie wyniku do zmienej licz
    mian = mian * a.mian; //to samo co u góry
   
    wypisz(); //tu do wypisania uzywasz metody , ktora wymaga modyfikacji wartosci
}

Daj poprostu
cout << licz * a.licz
 bez przypisywania wyniku do
licz
P-85506
Cariel
Temat założony przez niniejszego użytkownika
» 2013-06-13 18:51:00
Tak właśnie zrobiłam :)

A taka piękna śmierć się szykowała ;)
P-85509
« 1 » 2
  Strona 1 z 2 Następna strona