Kalkulator ułamkowy problem

0

Witam!
Dzisiaj napisałem kalkulator ułamkowy. Odpala sie bez problemu i normalnie moge wpisac wartosci i znak. Lecz potem wynik przyjmuje dziwna wartość. Dałem printf w paru strukturach żeby dokladniej zobaczyc co sie dzieje. Załączam screeny i kod:screenshot-20191121152624.png
https://pastebin.com/URRvKZpt
Byłby ktoś w stanie powiedziec mi co sie dzieje, ze takie liczby mi wyswietla? :/

0

Zacznij powoli, Przetestuj dla małych liczb dodawanie, potem odejmowanie, etc., Obok kalkulatora.

1

int ma 32 bity ze znakiem. Ergo max to: 2^31 - 1 = 2147483647 (10 cyfr).
Twoje dane wejściowe mają też 10 cyfr (na granicy zakresu int), więc podczas obliczeń wykraczasz poza zakres int i masz zwykły int overflow.

0
MarekR22 napisał(a):

int ma 32 bity ze znakiem. Ergo max to: 2^31 - 1 = 2147483647 (10 cyfr).
Twoje dane wejściowe mają też 10 cyfr (na granicy zakresu int), więc podczas obliczeń wykraczasz poza zakres int i masz zwykły int overflow.

Jak moge to naprawic?

2

To zależy od wymagań (specyfikacji).
Najprościej wykonywać obliczenia na long long int (64 bity).
Możesz też poprawić kod tak, by zmniejszyć szansę na integer overflow (np przez używanie najmniejszego wspólnego mianownika, a nie redukowanie wyniku po naiwnym dodawaniu ułamków).
W wersji bardziej skomplikowanej, możesz zrealizować arytmetykę wielkich liczb.

BTW jak na początkującego to bardzo dobrze ci to wychodzi (małe proste funkcje z dobrymi nazwami), miło popatrzeć na kod, który nie wygląda na spaghetti, szczególnie jak ktoś zaczyna.
Jeśli chodzi o styl, masz małe niedociągnięcia:

  • nie mieszaj języków - używaj tylko nazw angielskich
  • doczytaj o formatowaniu kodu (wcięcia, styl nazywania: UPPER_CASE camelCase, PascalCase, itp), bo troszkę jesteś niekonsekwentny.
0

Aby pozbyć się switch

typedef para OP(const para a,const para b);

para add(const para a,const para b) {  ... }
para sub(const para a,const para b) {  ... }
para mul(const para a,const para b) {  ... }
para div(const para a,const para b) {  ... }

struct { char op; Op *func; } tb[]=
{
   {'+',&add},
   {'-',&sub},
   {'*',&mul},
   {'/',&div},
};

para execute(const para a,char op,const para b)
{
   for(int i=0;i<sizeof(tb)/sizeof(*tb);++i) if(tb[i].op==op) return tb[i].func(a,b);
   // tu nie znaleziono operacji
}

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