Sumowanie ułamków zwykłych

0

Witam,
Od razu piszę, że początkujący jestem. Chcę napisać program sumujący ułamki zwykłe i wyświetlający wynik w formie licznik/mianownik.
Proszę o wskazanie lepszych rozwiązań, pomysłów jak też i uwag.

Oto moje wypociny:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    signed int a, b, c, d, e, f;
    cout << "Pierwszy ułamek: " << endl << endl;
    cout << "Licznik: " << endl;
    cin >> a;
    cout << "Mianownik: " <<endl;
    cin >> b;
    cout << endl;
    
    cout << "Drugi ułamek: " << endl << endl;
    cout << "Licznik: " << endl;
    cin >> c;
    cout << "Mianownik: " << endl;
    cin >> d;
    cout << endl;
    
    if(a == 0)
    cout << "Podałeś a = 0" << endl;
    else
    if(b == 0)
    cout << "Podałeś b = 0" << endl;
    else
    if(c == 0)
    cout << "Podałeś c = 0" << endl;
    else
    if(d == 0)
    cout << "Podałeś d = 0" << endl;
    else
    {
    e=(a*d)+(c*b);
    f=(b*d);
    cout << endl << "Suma to: " << endl;
    cout << " " << e << "/" << f << endl << endl;
    }
    system("PAUSE");
    return 0;
}
0
  1. Rozważ skrócenie otrzymanego ułamka, wynik 1/4 + 1/4 = 8/16 wygląda dość ekstrawagancko.
  2. Dlaczego nie dopuszczasz ułamków z licznikiem równym 0?
0
  1. Jeszcze jedno wyniki typu 3/-6 oraz -8/-40 też wyglądają dziwnie. Można to prosto naprawić
if(f<0)
{
    e=-e;
    f=-f;
}
0

Na koncu skroc ulamek przez nwd(licznik, mianownik), zadbaj tez o odpowiednie wyswietlanie minusa

0

Trochę w nocy główkowałem i to mi wyszło:

#include <cstdlib>
#include <iostream>

using namespace std;
int NWD(unsigned long e, unsigned long f)
{
  while(e != f) if(e > f) e -= f; else f -= e;
  return(e);
}
int main()
{
    signed int a, b, c, d, e, f;
           cout << "Pierwszy ułamek: " << endl << endl;
           cout << "Licznik: " << endl;
    cin >> a;
        cout << "Mianownik: " <<endl;
    cin >> b;
        cout << endl;
    
         cout << "Drugi ułamek: " << endl << endl;
         cout << "Licznik: " << endl;
    cin >> c;
        cout << "Mianownik: " << endl;
    cin >> d;
        cout << endl;
    
    if(a == 0)
         cout << "Podałeś licznik = 0" << endl;
    else
    if(b == 0)
         cout << "Podałeś mianownik = 0" << endl;
    else
    if(c == 0)
         cout << "Podałeś licznik = 0" << endl;
    else
    if(d == 0)
         cout << "Podałeś mianownik = 0" << endl;
    else
    if(b == d)
    {
           cout << "Suma to: " << (a+c) << "/" << b << endl;
    }
    else
    {
    e=(a*d)+(c*b);
    f=(b*d);
    if(f<0)
    {
    e=-e;
    f=-f;
    }
    else
            cout << endl << "Suma to: " << endl;
            cout << " " << e << "/" << f << endl;
    }
    cout << endl << endl;
    {

  cout <<"Podaj licznik = ";
  cin  >> e;
  cout <<"Podaj mianownik = ";
  cin  >> f;
  cout << endl;

  if((e == 0) || (f == 0))
	 cout << "Zle dane!";
  else
  {
  cout << "NWD (" << e << "," << f << ") = " << NWD(e,f) << endl << endl;
  cout << "Wynik skrócony to: ";
  cout << e/NWD(e,f);
  cout << "/";
  cout << f/NWD(e,f);
  cout << endl << endl;
  }
    system("PAUSE");
    return 0;
}
}

Tylko tak, gdzie muszę dać if żeby mógł poprawnie wyświetlać wyniki ujemne?
I chciałbym aby nie trzeba było ręcznie wpisywać licznika i mianownika żeby zostały skrócone, jaka rada na to ?

0

Powiem tak:
Zamiast tych ifów mógłbyś zrobić jedną pętle, która się będzie wykonywać dopóki ktoś nie wpisze poprawnych danych.
Przypadku if(b == d) nie musisz rozpatrywać. Skróci się za pomocą NWD. Zamiast stosować odejmowanie w NWD mógłbyś dać modulowanie
Tu jest poprawiona wersja ( na szybko )

#include <cstdlib>
#include <iostream>

using namespace std;
int NWD( long e, long f)
{
    if(e < 0) return NWD(-e,f);
    if(f < 0) return NWD(e,-f);
    if(f>e) return NWD(f,e);
    if(f==0) return e;
    return NWD(f,e%f);
}
int main()
{
     int a, b, c, d, e, f;
     bool zle=true;
     while(zle)
     {
         zle=false;
         cout << "Pierwszy ułamek: " << endl << endl;
         cout << "Licznik: " << endl;
              cin >> a;
         cout << "Mianownik: " <<endl;
             cin >> b;
         cout << endl;

         cout << "Drugi ułamek: " << endl << endl;
         cout << "Licznik: " << endl;
             cin >> c;
        cout << "Mianownik: " << endl;
             cin >> d;
        cout << endl;
        if(b == 0 || d == 0)
        {
             cout << "Podałeś mianownik = 0" << endl;
             zle=true;
         }
    }
    e=(a*d)+(c*b);
    f=(b*d);
    if(f<0)
    {
    e=-e;
    f=-f;
    }

    cout << endl << "Suma to: " << endl;
    cout << " " << e << "/" << f << endl << endl;

  cout << "NWD (" << e << "," << f << ") = " << NWD(e,f) << endl << endl;
  cout << "Wynik skrócony to: ";
  cout << e/NWD(e,f);
  cout << "/";
  cout << f/NWD(e,f);
  cout << endl << endl;

    system("PAUSE");
    return 0;

}
0

bo, iksarp i marseel dziękuję bardzo za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1