SpaceCreator

Complex

Dec 21st, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.33 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stddef.h>
  4. #include <stdbool.h>
  5.  
  6. enum regard {
  7.     Like, Dislike
  8. };
  9. typedef enum regard regard_t;
  10.  
  11. typedef struct Frac {
  12.     int num;
  13.     int denom;
  14.     char sign;
  15. } Frac;
  16.  
  17. typedef struct Complex {
  18.     Frac re;
  19.     Frac im;
  20. } Complex;
  21.  
  22. Complex complex_create(int re_n, int re_d, int im_n, int im_d);
  23.  
  24. Complex complex_sum(const Complex *first, const Complex *second);
  25.  
  26. Complex complex_sub(const Complex *first, const Complex *second);
  27.  
  28. Complex complex_mult(const Complex *first, const Complex *second);
  29.  
  30. regard_t complex_div(const Complex *first, const Complex *second, Complex *result);
  31.  
  32. void complex_print(const Complex *my_complex);
  33.  
  34. Frac frac_create(int num, int denom);
  35.  
  36. Frac frac_sum(const Frac *f1, const Frac *f2);
  37.  
  38. Frac frac_sub(const Frac *f1, const Frac *f2);
  39.  
  40. Frac frac_mult(const Frac *f1, const Frac *f2);
  41.  
  42. regard_t frac_div(const Frac *f1, const Frac *f2, Frac *res);
  43.  
  44. void frac_print(const Frac *f);
  45.  
  46. int NoD(int left, int right);
  47.  
  48. void normalize_frac(Frac *my_Frac);
  49.  
  50. void complex_input(Complex *my_num);
  51.  
  52. int main() {
  53.     Frac f1, f2;
  54.     int num = 0;
  55.     int denom = 0;
  56.     /*scanf("%d%d", &num, &denom);
  57.     f1 = frac_create(num, denom);
  58.  
  59.     scanf("%d%d", &num, &denom);
  60.     f2 = frac_create(num, denom);
  61.  
  62.     Frac sum = frac_sum(&f1, &f2);
  63.     frac_print(&sum);
  64.  
  65.     Frac sub = frac_sub(&f1, &f2);
  66.     frac_print(&sub);*/
  67.  
  68.     Complex com_1, com_2;
  69.     complex_input(&com_1);
  70.     complex_input(&com_2);
  71.  
  72.     Complex sum = complex_sum(&com_1, &com_2);
  73.     complex_print(&sum);
  74.  
  75.     Complex sub = complex_sub(&com_1, &com_2);
  76.     complex_print(&sub);
  77.  
  78.     Complex mult = complex_mult(&com_1, &com_2);
  79.     complex_print(&mult);
  80.  
  81.     Complex div;
  82.     regard_t R = complex_div(&com_1, &com_2, &div);
  83.     R == Like ? complex_print(&div) : printf("There is zero division in div, I can not calculate result :(");
  84.  
  85.     return 0;
  86. }
  87.  
  88. Frac frac_create(int num, int denom) {
  89.     char sign = (char) (num > 0 ? 1 : - 1);
  90.     Frac result = {.num = num * sign, .denom = denom, .sign = sign};
  91.     return result;
  92. }
  93.  
  94. Frac frac_sum(const Frac *f1, const Frac *f2) {
  95.     int denom = f1->denom * f2->denom;
  96.     int num = f1->sign * f1->num * f2->denom + f2->sign * f2->num * f1->denom;
  97.     char sign = (char) (num > 0 ? 1 : - 1);
  98.     num = num * sign;
  99.     Frac result = {.num = num, .denom = denom, .sign = sign};
  100.     normalize_frac(&result);
  101.     return result;
  102. }
  103.  
  104. Frac frac_sub(const Frac *f1, const Frac *f2) {
  105.     Frac f3 = *f2;
  106.     f3.sign = (char) (f3.sign * (- 1));
  107.     Frac res = frac_sum(f1, &f3);
  108.     normalize_frac(&res);
  109.     return res;
  110. }
  111.  
  112. Frac frac_mult(const Frac *f1, const Frac *f2) {
  113.     Frac result = {.sign = f1->sign * f2->sign, .num = f1->num * f2->num, .denom = f1->denom * f2->denom};
  114.     normalize_frac(&result);
  115.     return result;
  116. }
  117.  
  118. regard_t flip_frac(Frac *f) {
  119.     int temp = f->num;
  120.     f->num = f->denom;
  121.     f->denom = temp;
  122.     return temp == 0 ? Dislike : Like;
  123. }
  124.  
  125. regard_t frac_div(const Frac *f1, const Frac *f2, Frac *res) {
  126.     Frac f22 = *f2;
  127.     regard_t nruter = flip_frac(&f22);
  128.     *res = frac_mult(f1, &f22);
  129.     return nruter;
  130. }
  131.  
  132. void frac_print(const Frac *f) {
  133.     printf(" Frac :  %d / %d \n", f->num * f->sign, f->denom);
  134. }
  135.  
  136. void swap(int *a, int *b) {
  137.     int temp = *a;
  138.     *a = *b;
  139.     *b = temp;
  140. }
  141.  
  142. int NoD(int left, int right) {
  143.     if (left < right) {
  144.         swap(&left, &right);
  145.     }
  146.     while (left * right > 0) {
  147.         left = left % right;
  148.         swap(&left, &right);
  149.     }
  150.     return left + right;
  151. }
  152.  
  153. void normalize_frac(Frac *my_Frac) {
  154.     int nod = NoD(my_Frac->num, my_Frac->denom);
  155.     my_Frac->num = my_Frac->num / nod;
  156.     my_Frac->denom = my_Frac->denom / nod;
  157. }
  158.  
  159. Complex complex_create(int re_n, int re_d, int im_n, int im_d) {
  160.     Complex result = {.re = frac_create(re_n, re_d), .im = frac_create(im_n, im_d)};
  161.     return result;
  162. }
  163.  
  164. Complex complex_sum(const Complex *first, const Complex *second) {
  165.     Complex result = {.re = frac_sum(&first->re, &second->re), .im = frac_sum(&first->im, &second->im)};
  166.     return result;
  167. }
  168.  
  169. Complex complex_sub(const Complex *first, const Complex *second) {
  170.     Complex third = *second;
  171.     third.re.sign = (char) (third.re.sign * (- 1));
  172.     third.im.sign = (char) (third.im.sign * (- 1));
  173.     Complex result = complex_sum(first, &third);
  174.     return result;
  175. }
  176.  
  177. Complex complex_mult(const Complex *first, const Complex *second) {
  178.     Frac res_of_mults[] = {frac_mult(&first->re, &second->re), frac_mult(&first->re, &second->im),
  179.                            frac_mult(&first->im, &second->re), frac_mult(&first->im, &second->im)};
  180.     Complex result = {.re = frac_sub(&res_of_mults[0], &res_of_mults[3]), .im = frac_sum(&res_of_mults[1],
  181.                                                                                          &res_of_mults[2])};
  182.     return result;
  183. }
  184.  
  185. regard_t complex_div(const Complex *first, const Complex *second, Complex *result) {
  186.     regard_t nruter;
  187.     Complex conjugated = *second;
  188.     conjugated.im.sign = (char) (conjugated.im.sign * (- 1));
  189.     Frac mults[] = {frac_mult(&conjugated.re, &conjugated.re), frac_mult(&conjugated.im, &conjugated.im)};
  190.     Frac denom = frac_sum(&mults[0], &mults[1]);
  191.     Complex res = complex_mult(first, &conjugated);
  192.     nruter = frac_div(&res.re, &denom, &result->re);
  193.     if (nruter == Dislike) {
  194.         return nruter;
  195.     }
  196.     nruter = frac_div(&res.im, &denom, &result->im);
  197.     return nruter;
  198. }
  199.  
  200. void complex_print(const Complex *my_complex) {
  201.     printf("%d / %d  +  %d * i / %d\n", my_complex->re.num * my_complex->re.sign, my_complex->re.denom,
  202.            my_complex->im.num * my_complex->im.sign, my_complex->im.denom);
  203. }
  204.  
  205. regard_t problems(Complex *c) {
  206.     if ((c->re.denom == 0) || (c->im.denom == 0)) {
  207.         return Dislike;
  208.     } else {
  209.         return Like;
  210.     }
  211. }
  212.  
  213. void complex_input(Complex *my_num) {
  214.     regard_t r = Dislike;
  215.     int input[4] = {0};
  216.     while (r == Dislike) {
  217.         printf("Enter the number : \n");
  218.         scanf("%d%d%d%d", &input[0], &input[1], &input[2], &input[3]);
  219.         *my_num = complex_create(input[0], input[1], input[2], input[3]);
  220.         r = problems(my_num);
  221.         if (r == Dislike) {
  222.             printf("Something wrong :/ Your zero feels bad. Try again...\n");
  223.         }
  224.     }
  225. }
Advertisement
Add Comment
Please, Sign In to add comment