fork download
  1. /*
  2. Opracować zestaw operacji na liczbach zespolonych potrzebny do prawidłowego działania tego programu.
  3. W tym celu należy prototypy (nagłówki) podanych tam funkcji, realizujących działania, zastąpić lub uzupełnić pełnymi definicjami działań.
  4. Oczywiście dla napisania tych funkcji, potrzebne jest zastosowanie własnej wiedzy o liczbach zespolonych (np. z algebry).
  5. */
  6.  
  7. /* gcc -Wall zad1.c -o zad1 -lm */
  8.  
  9. #include <stdio.h>
  10. #include <math.h>
  11. #include <ctype.h>
  12. #include <stdlib.h>
  13. #include <complex.h>
  14.  
  15.  
  16. //"struktura" liczby zespolonej :
  17. typedef struct
  18. {
  19. double rea, ima;
  20. } zespol;
  21.  
  22. /*
  23. pomocnicza funkcja przy uzyskaniu błedu wywołana w elsie (w funkcji zespol zesp_get(void),
  24. gdy uzytkownik niepoprawnie wpisze postac liczby zespolonej.
  25. */
  26.  
  27. void err(char s[])
  28. {
  29. printf("\n!!! FUNKCJA zesp_get: %s !!!\n\n", s);
  30. exit(1);
  31. }
  32.  
  33. zespol zesp_zestawic(double r, double i)
  34. {
  35. zespol z;
  36. z.rea=r;
  37. z.ima=i;
  38. return z;
  39. }
  40. zespol zesp_get(void)
  41. {
  42. /* wczytanie liczby zespolonej;
  43.   w postaci (X + Yi), gdzie X, Y - rzeczywiste, dopisanie "i" wymagane (liczba imaginalis) */
  44. char ch;
  45. zespol z;
  46. int znak_im;
  47. do{ch=getchar();} while(isspace(ch));
  48. if(ch=='(')
  49. {
  50. if(scanf("%lf", &(z.rea))==1)
  51. {
  52. do{ch = getchar();} while(isspace(ch));
  53. if(ch=='+' || ch=='-')
  54. {
  55. if(ch=='+') znak_im=1;
  56. else znak_im=-1;
  57. if(scanf("%lf", &(z.ima))==1)
  58. {
  59. do{ch=getchar();} while(isspace(ch));
  60. if(ch=='i')
  61. {
  62. do{ch=getchar();} while(isspace(ch));
  63. if(ch==')')
  64. {
  65. if(znak_im==-1) z.ima=-z.ima;
  66. } else err("brak koncowego nawiasu");
  67. } else err("brak 'i' na koncu czesci urojonej");
  68. } else err("niepoprawna czesc urojona");
  69. } else err("po czesci rzeczywistej brak znaku '+' lub '-'");
  70. } else err("niepoprawna czesc rzeczywista");
  71. } else err("brak rozpoczynajacego nawiasu");
  72. return z;
  73. }
  74. void zesp_print(zespol z)
  75. {
  76. if(z.ima>=0) printf("(%.2lf+%.2lfi)", z.rea, z.ima);
  77. else printf("(%.2lf-%.2lfi)", z.rea, -z.ima);
  78. }
  79.  
  80. /*
  81. Postac liczb zespolonych :
  82. z1 = a + bi;
  83. z2 = c + di;
  84. gdzie a, b, c, d sa rzeczywiste
  85. Wykorzystane wzory do utworzenia funkcji :
  86. - Dodawanie : z1 + z2 = (a + c) + (b + d)i;
  87. - Odejmowanie : z1 - z2 = (a - c) + (b - d)i;
  88. - Mnożenie : z1 * z2 = (ac - bd) + (ad + bc)i;
  89. - Sprzezenie : z1S = a - bi;
  90. - Moduł : |z| = |a + bi| = sqrt/pierwiastek (a^2 + b^2);
  91. */
  92.  
  93.  
  94. // dodawanie liczb zespolonych :
  95. zespol zesp_dodac(zespol z1, zespol z2)
  96. {
  97. zespol wynik;
  98. wynik.rea=z1.rea+z2.rea;
  99. wynik.ima=z1.ima+z2.ima;
  100. return wynik;
  101. }
  102.  
  103. // odejmowanie liczb zespolonych :
  104. zespol zesp_odjac(zespol z1, zespol z2)
  105. {
  106. zespol wynik;
  107. wynik.rea=z1.rea-z2.rea;
  108. wynik.ima=z2.ima-z2.ima;
  109. return wynik;
  110. }
  111.  
  112. // mnozenie liczb zespolonych :
  113. zespol zesp_razy(zespol z1, zespol z2)
  114. {
  115. zespol wynik;
  116. wynik.rea=z1.rea*z2.rea-z1.ima*z2.ima;
  117. wynik.ima=z1.rea*z2.ima+z1.ima*z2.rea;
  118. return wynik;
  119. }
  120.  
  121. // liczba sprzezona do danej zespolonej :
  122. zespol zesp_sprzez(zespol z)
  123. {
  124. zespol wynik;
  125. wynik.ima=-z.ima;
  126. return wynik;
  127. }
  128.  
  129. // wartosc bezwzgledna liczby zespolonej , tzw. "moduł":
  130. double zesp_abs(zespol z)
  131. {
  132. double wynik;
  133. wynik=sqrt(z.rea*z.rea+z.ima*z.ima);
  134. return wynik;
  135. }
  136.  
  137.  
  138. int main()
  139. {
  140. zespol z1, z2;
  141. printf("Zespolona Z1 == "); z1 = zesp_get();
  142. printf("Zespolona Z2 == "); z2 = zesp_get();
  143. printf("\nZ1+Z2 == "); zesp_print(zesp_dodac(z1, z2));
  144. printf("\nZ1-Z2 == "); zesp_print(zesp_odjac(z1, z2));
  145. printf("\nZ1*Z2 == "); zesp_print(zesp_razy(z1, z2));
  146. printf("\n|Z1+Z2| == %.4lf\n", zesp_abs(zesp_dodac(z1, z2)));
  147. return 0;
  148. }
  149.  
Runtime error #stdin #stdout 0s 2116KB
stdin
Standard input is empty
stdout
Zespolona Z1 == 
!!! FUNKCJA zesp_get: brak rozpoczynajacego nawiasu !!!