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:
https://pastebin.com/URRvKZpt
Byłby ktoś w stanie powiedziec mi co sie dzieje, ze takie liczby mi wyswietla? :/
Zacznij powoli, Przetestuj dla małych liczb dodawanie, potem odejmowanie, etc., Obok kalkulatora.
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.
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 zakresuint
), więc podczas obliczeń wykraczasz poza zakresint
i masz zwykły int overflow.
Jak moge to naprawic?
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.
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
}