Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ulamek.h"
- #include <stdlib.h>
- static int gcd(int a, int b)
- {
- if(b == 0) return a;
- return gcd(b, a % b);
- }
- static void naprawUlamek(Ulamek* u)
- {
- if(u == NULL) return;
- int nwd = gcd(u->mianownik, u->licznik);
- u->licznik /= nwd;
- u->mianownik /= nwd;
- }
- static void znakiWUlamku(Ulamek* u)
- {
- if(u == NULL) return;
- if(u->mianownik < 0)
- {
- u->licznik = -u->licznik;
- u->mianownik = -u->mianownik;
- }
- }
- Ulamek* stworzUlamek(int a, int b)
- {
- if(b == 0)
- return NULL;
- Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
- if(b > 0)
- {
- r->licznik = a;
- r->mianownik = b;
- }
- else
- {
- r->licznik = -a;
- r->mianownik = -b;
- }
- naprawUlamek(r);
- return r;
- }
- Ulamek* dodajUlamki(Ulamek* a, Ulamek* b)
- {
- if(b == NULL)
- return a;
- if(a == NULL)
- return b;
- Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
- r->licznik = (a->licznik * b->mianownik) + (b->licznik * a->mianownik);
- r->mianownik = (a->mianownik * b->mianownik);
- znakiWUlamku(r);
- naprawUlamek(r);
- return r;
- }
- Ulamek* dodajUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
- {
- if(b == NULL)
- {
- b = a;
- return a;
- }
- if(a == NULL)
- return b;
- int licznik = (a->licznik * b->mianownik) + (b->licznik * a->mianownik);
- int mianownik = (a->mianownik * b->mianownik);
- b->licznik = licznik;
- b->mianownik = mianownik;
- znakiWUlamku(b);
- naprawUlamek(b);
- return b;
- }
- Ulamek* odejmijUlamki(Ulamek* a, Ulamek* b)
- {
- if(b == NULL)
- {
- return a;
- }
- if(a == NULL)
- {
- Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
- u->licznik = -b->licznik;
- u->mianownik = -b->mianownik;
- return u;
- }
- Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
- int licznik = (a->licznik * b->mianownik) - (b->licznik * a->mianownik);
- int mianownik = (a->mianownik * b->mianownik);
- r->licznik = licznik;
- r->mianownik = mianownik;
- znakiWUlamku(r);
- naprawUlamek(r);
- return r;
- }
- Ulamek* odejmijUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
- {
- if(b == NULL)
- {
- b = a;
- return a;
- }
- if(a == NULL)
- {
- Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
- u->licznik = -b->licznik;
- u->mianownik = -b->mianownik;
- return u;
- }
- int licznik = (a->licznik * b->mianownik) - (b->licznik * a->mianownik);
- int mianownik = (a->mianownik * b->mianownik);
- b->licznik = licznik;
- b->mianownik = mianownik;
- znakiWUlamku(b);
- naprawUlamek(b);
- return b;
- }
- Ulamek* pomnozUlamki(Ulamek* a, Ulamek* b)
- {
- if(a == NULL || b == NULL)
- {
- Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
- u->licznik = 0;
- u->mianownik = 1;
- return u;
- }
- Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
- r->licznik = a->licznik * b->licznik;
- r->mianownik = a->mianownik * b->mianownik;
- znakiWUlamku(r);
- naprawUlamek(r);
- return r;
- }
- Ulamek* pomnozUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
- {
- if(b == NULL)
- {
- Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
- u->licznik = 0;
- u->mianownik = 1;
- b = u;
- return u;
- }
- if(a == NULL)
- {
- b->licznik = 0;
- b->mianownik = 1;
- return b;
- }
- b->licznik = a->licznik * b->licznik;
- b->mianownik = a->mianownik * b->mianownik;
- znakiWUlamku(b);
- naprawUlamek(b);
- return b;
- }
- Ulamek* podzielUlamki(Ulamek* a, Ulamek* b)
- {
- if(b == NULL || b->licznik == 0) return NULL;
- if(a == NULL)
- {
- Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
- u->licznik = 0;
- u->mianownik = 1;
- return u;
- }
- Ulamek* dziel = (Ulamek*)malloc(sizeof(Ulamek));
- dziel->licznik = b->mianownik;
- dziel->mianownik = b->licznik;
- Ulamek* r = pomnozUlamki(a, dziel);
- free(dziel);
- return r;
- }
- Ulamek* podzielUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
- {
- if(b == NULL || b->licznik == 0)
- {
- free(b);
- b = NULL;
- return NULL;
- }
- if(a == NULL)
- {
- Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
- u->licznik = 0;
- u->mianownik = 1;
- return u;
- }
- Ulamek* dziel = (Ulamek*)malloc(sizeof(Ulamek));
- dziel->licznik = b->mianownik;
- dziel->mianownik = b->licznik;
- free(b);
- b = pomnozUlamki(a, dziel);
- free(dziel);
- return b;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement