Advertisement
Guest User

Compnum

a guest
Jan 28th, 2020
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.82 KB | None | 0 0
  1. #include "Complex_num.h"
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #define pi 3.141596
  7.  
  8. COMPLEX Add(COMPLEX* p1, COMPLEX* p2) {
  9.     COMPLEX res = { 0, 0 };
  10.     res.Re = (p1->Re + p2->Re);
  11.     res.Im = (p1->Im + p2->Im);
  12.     return res;
  13. }
  14.  
  15. COMPLEX Sub(COMPLEX* p1, COMPLEX* p2) {
  16.     COMPLEX res = { 0, 0 };
  17.     res.Re = (p1->Re - p2->Re);
  18.     res.Im = (p1->Im - p2->Im);
  19.     return res;
  20. }
  21.  
  22. COMPLEX Multi(COMPLEX* p1, COMPLEX* p2) {
  23.     COMPLEX res = { 0, 0 };
  24.     res.Re = (p1->Re * p2->Re - p1->Im * p2->Im);
  25.     res.Im = (p1->Re * p2->Im + p1->Im * p2->Re);
  26.     return res;
  27. }
  28.  
  29. COMPLEX Div(COMPLEX* p1, COMPLEX* p2) {
  30.     COMPLEX res = { 0, 0 };
  31.     COMPLEX binded = { p2->Re, -(p2->Im) };
  32.     double Im_down = p2->Re * binded.Im + p2->Im * binded.Re;
  33.     double Re_down = p2->Re * binded.Re - p2->Im * binded.Im;
  34.  
  35.     if ((Re_down) == 0 && (Im_down) != 0)
  36.         res.Re = ((p1->Re * binded.Re - p1->Im * binded.Im) / (Im_down));
  37.     else if ((Re_down) != 0)
  38.         res.Re = ((p1->Re * binded.Re - p1->Im * binded.Im) / (Re_down));
  39.  
  40.     if (Im_down == 0 && Re_down != 0)
  41.         res.Im = ((p1->Re * binded.Im + p1->Im * binded.Re) / (Re_down));
  42.     else if ((Im_down) != 0)
  43.         res.Im = ((p1->Re * binded.Im + p1->Im * binded.Re) / (Im_down));
  44.  
  45.     return res;
  46. }
  47.  
  48. void Print(const COMPLEX* p) {
  49.     printf("%.lf", p->Re);
  50.     if (p->Im > 0) printf("+%.lfi\n", p->Im);
  51.     else if (p->Im < 0) {
  52.         printf("%.lfi\n", p->Im);
  53.     }
  54. }
  55.  
  56. int IsEqual(const COMPLEX* p1, const COMPLEX* p2) {
  57.     if (p1->Re == p2->Re && p1->Im == p2->Im) return 1;
  58.     else return 0;
  59. }
  60.  
  61. void PrintAsAbsPhase(const COMPLEX* p) {
  62.     double abs_phase = sqrt(pow(p->Re, 2) + pow(p->Im, 2));
  63.     double cosa = p->Re / abs_phase;
  64.     //double angle_cos = acos(cosa);
  65.     double angle_cos = (acos(cosa));// / pi * 180); //просто acos без учета pi; с добавлением - в градусах.
  66.     double sina = p->Im / abs_phase;
  67.     double angle_sin = (asin(sina));// / pi * 180);
  68.     printf("%.2lf(cos(%.3lf + 2%ck)+isin(%.3lf + 2%cn))", abs_phase, angle_cos,/* 175, */175, angle_sin,/* 175,*/ 175);
  69. }
  70.  
  71. void EnterNum(COMPLEX* p) {
  72.     char Im_part[10];
  73.     char* Im_num = (char*)calloc(sizeof(char*), 5);
  74.     scanf("%lf%s", &p->Re, Im_part);
  75.     for (size_t i = 0; Im_part[i] != '\0'; i++)
  76.     {
  77.         Im_num[i] = Im_part[i];
  78.         if (i > 0 && Im_part[i] == 'i' && Im_part[i - 1] == '-' || Im_part[i - 1] == '+') Im_num[i] = '1';
  79.     }
  80.     p->Im = atof(Im_num);
  81.     free(Im_num);
  82. }
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89. Header:
  90. #ifndef COMPLEX_H
  91. #define COMPLEX_H
  92.  
  93. typedef struct complex
  94. {
  95.     double Re, Im;
  96.  
  97. } COMPLEX;
  98.  
  99. COMPLEX Add(COMPLEX* p1, COMPLEX* p2);
  100. COMPLEX Sub(COMPLEX* p1, COMPLEX* p2);
  101. COMPLEX Multi(COMPLEX* p1, COMPLEX* p2);
  102. COMPLEX Div(COMPLEX* p1, COMPLEX* p2);
  103. void Print(const COMPLEX* p);
  104. void EnterNum(COMPLEX* p);
  105. int IsEqual(const COMPLEX* p1, const COMPLEX* p2);
  106. void PrintAsAbsPhase(const COMPLEX* p);
  107.  
  108. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement