Advertisement
iggnaccy

ułamek.c

Mar 1st, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. #include "ulamek.h"
  2. #include <stdlib.h>
  3.  
  4. static int gcd(int a, int b)
  5. {
  6. if(b == 0) return a;
  7. return gcd(b, a % b);
  8. }
  9.  
  10. static void naprawUlamek(Ulamek* u)
  11. {
  12. if(u == NULL) return;
  13. int nwd = gcd(u->mianownik, u->licznik);
  14. u->licznik /= nwd;
  15. u->mianownik /= nwd;
  16. }
  17.  
  18. static void znakiWUlamku(Ulamek* u)
  19. {
  20. if(u == NULL) return;
  21. if(u->mianownik < 0)
  22. {
  23. u->licznik = -u->licznik;
  24. u->mianownik = -u->mianownik;
  25. }
  26. }
  27.  
  28. Ulamek* stworzUlamek(int a, int b)
  29. {
  30. if(b == 0)
  31. return NULL;
  32. Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
  33. if(b > 0)
  34. {
  35. r->licznik = a;
  36. r->mianownik = b;
  37. }
  38. else
  39. {
  40. r->licznik = -a;
  41. r->mianownik = -b;
  42. }
  43. naprawUlamek(r);
  44. return r;
  45. }
  46.  
  47. Ulamek* dodajUlamki(Ulamek* a, Ulamek* b)
  48. {
  49. if(b == NULL)
  50. return a;
  51. if(a == NULL)
  52. return b;
  53. Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
  54. r->licznik = (a->licznik * b->mianownik) + (b->licznik * a->mianownik);
  55. r->mianownik = (a->mianownik * b->mianownik);
  56. znakiWUlamku(r);
  57. naprawUlamek(r);
  58. return r;
  59. }
  60.  
  61. Ulamek* dodajUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
  62. {
  63. if(b == NULL)
  64. {
  65. b = a;
  66. return a;
  67. }
  68. if(a == NULL)
  69. return b;
  70. int licznik = (a->licznik * b->mianownik) + (b->licznik * a->mianownik);
  71. int mianownik = (a->mianownik * b->mianownik);
  72. b->licznik = licznik;
  73. b->mianownik = mianownik;
  74. znakiWUlamku(b);
  75. naprawUlamek(b);
  76. return b;
  77. }
  78.  
  79. Ulamek* odejmijUlamki(Ulamek* a, Ulamek* b)
  80. {
  81. if(b == NULL)
  82. {
  83. return a;
  84. }
  85. if(a == NULL)
  86. {
  87. Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
  88. u->licznik = -b->licznik;
  89. u->mianownik = -b->mianownik;
  90. return u;
  91. }
  92. Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
  93. int licznik = (a->licznik * b->mianownik) - (b->licznik * a->mianownik);
  94. int mianownik = (a->mianownik * b->mianownik);
  95. r->licznik = licznik;
  96. r->mianownik = mianownik;
  97. znakiWUlamku(r);
  98. naprawUlamek(r);
  99. return r;
  100. }
  101.  
  102. Ulamek* odejmijUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
  103. {
  104. if(b == NULL)
  105. {
  106. b = a;
  107. return a;
  108. }
  109. if(a == NULL)
  110. {
  111. Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
  112. u->licznik = -b->licznik;
  113. u->mianownik = -b->mianownik;
  114. return u;
  115. }
  116. int licznik = (a->licznik * b->mianownik) - (b->licznik * a->mianownik);
  117. int mianownik = (a->mianownik * b->mianownik);
  118. b->licznik = licznik;
  119. b->mianownik = mianownik;
  120. znakiWUlamku(b);
  121. naprawUlamek(b);
  122. return b;
  123. }
  124.  
  125. Ulamek* pomnozUlamki(Ulamek* a, Ulamek* b)
  126. {
  127. if(a == NULL || b == NULL)
  128. {
  129. Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
  130. u->licznik = 0;
  131. u->mianownik = 1;
  132. return u;
  133. }
  134. Ulamek* r = (Ulamek*)malloc(sizeof(Ulamek));
  135. r->licznik = a->licznik * b->licznik;
  136. r->mianownik = a->mianownik * b->mianownik;
  137. znakiWUlamku(r);
  138. naprawUlamek(r);
  139. return r;
  140. }
  141.  
  142. Ulamek* pomnozUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
  143. {
  144. if(b == NULL)
  145. {
  146. Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
  147. u->licznik = 0;
  148. u->mianownik = 1;
  149. b = u;
  150. return u;
  151. }
  152. if(a == NULL)
  153. {
  154. b->licznik = 0;
  155. b->mianownik = 1;
  156. return b;
  157. }
  158. b->licznik = a->licznik * b->licznik;
  159. b->mianownik = a->mianownik * b->mianownik;
  160. znakiWUlamku(b);
  161. naprawUlamek(b);
  162. return b;
  163. }
  164.  
  165. Ulamek* podzielUlamki(Ulamek* a, Ulamek* b)
  166. {
  167. if(b == NULL || b->licznik == 0) return NULL;
  168. if(a == NULL)
  169. {
  170. Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
  171. u->licznik = 0;
  172. u->mianownik = 1;
  173. return u;
  174. }
  175. Ulamek* dziel = (Ulamek*)malloc(sizeof(Ulamek));
  176. dziel->licznik = b->mianownik;
  177. dziel->mianownik = b->licznik;
  178. Ulamek* r = pomnozUlamki(a, dziel);
  179. free(dziel);
  180. return r;
  181. }
  182.  
  183. Ulamek* podzielUlamkiDoDrugiego(Ulamek* a, Ulamek* b)
  184. {
  185. if(b == NULL || b->licznik == 0)
  186. {
  187. free(b);
  188. b = NULL;
  189. return NULL;
  190. }
  191. if(a == NULL)
  192. {
  193. Ulamek* u = (Ulamek*)malloc(sizeof(Ulamek));
  194. u->licznik = 0;
  195. u->mianownik = 1;
  196. return u;
  197. }
  198. Ulamek* dziel = (Ulamek*)malloc(sizeof(Ulamek));
  199. dziel->licznik = b->mianownik;
  200. dziel->mianownik = b->licznik;
  201. free(b);
  202. b = pomnozUlamki(a, dziel);
  203. free(dziel);
  204. return b;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement