Advertisement
Guest User

Untitled

a guest
Jan 24th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.29 KB | None | 0 0
  1. unit zkryskomwdole;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  9.   Spin, Math;
  10.  
  11. type
  12.  
  13.   TTryb = (trybKart, trybStop, trybRad);
  14.  
  15.   { TZKryskomWDole }
  16.  
  17.   // Zamiast przekazywać wartość rzeczywistą i urojoną, wygodniej będzie
  18.   // operować na jednej zmiennej. O ile wiem, Pascal nie ma wbudowanego typu
  19.   // do liczb zespolonych, dlatego stworzymy sobie klasę zawierającą dane i
  20.   // pożyteczne metody – jak Button1, mnożenie, konwersje między
  21.   // reprezentacjami i in.
  22.   TZKryskomWDole = object
  23.   public
  24.     Re: double;
  25.     Im: double;
  26.     procedure Kart(Realis, Imaginaris: double);
  27.     procedure Tryg(Modul, Faza: double);
  28.     procedure Dodaj(Druga: TZKryskomWDole);
  29.     procedure Odejmij(Druga: TZKryskomWDole);
  30.     procedure Pomnoz(Druga: TZKryskomWDole);
  31.     procedure Podziel(Druga: TZKryskomWDole);
  32.     function Modul: double;
  33.     function Faza: double;
  34.   end;
  35.  
  36.   { TFrm }
  37.  
  38.   TFrm = class(TForm)
  39.     Button1: TButton;
  40.     Button2: TButton;
  41.     TrybX: TComboBox;
  42.     TrybY: TComboBox;
  43.     TrybZ: TComboBox;
  44.     Wybor: TComboBox;
  45.     X1: TFloatSpinEdit;
  46.     X2: TFloatSpinEdit;
  47.     Y1: TFloatSpinEdit;
  48.     Y2: TFloatSpinEdit;
  49.     Z1: TFloatSpinEdit;
  50.     Z2: TFloatSpinEdit;
  51.     procedure Button1Click(Sender: TObject);
  52.     procedure Button2Click(Sender: TObject);
  53.     procedure FormCreate(Sender: TObject);
  54.     procedure Oblicz(Sender: TObject);
  55.     procedure TrybZChange(Sender: TObject);
  56.     procedure Ustaw(A: TZKryskomWDole; A1, A2: TFloatSpinEdit; Postac: integer);
  57.     procedure Sczytaj(var A: TZKryskomWDole; A1, A2: TFloatSpinEdit; Postac: integer);
  58.     procedure SczytajWszystko;
  59.     procedure UstawWszystko;
  60.   private
  61.     { private declarations }
  62.   public
  63.     { public declarations }
  64.   end;
  65.  
  66. var
  67.   Frm: TFrm;
  68.   Tryb: TTryb;
  69.   X, Y, Z: TZKryskomWDole;
  70.  
  71. // Pomocniczo – funkcje do konwersji radiany i stopni.
  72. function RadianyNaStopnie(Radiany: double): double;
  73. function StopnieNaRadiany(Stopnie: double): double;
  74.  
  75. implementation
  76.  
  77. function RadianyNaStopnie(Radiany: double): double;
  78. begin
  79.   Result := Radiany * 180 / pi;
  80. end;
  81.  
  82. function StopnieNaRadiany(Stopnie: double): double;
  83. begin
  84.   Result := 1.0 * Stopnie * pi / 180;
  85. end;
  86.  
  87. {$R *.lfm}
  88.  
  89. { TFrm }
  90.  
  91. procedure TFrm.Oblicz(Sender: TObject);
  92. begin
  93.   SczytajWszystko;
  94.   Z.Re := X.Re;
  95.   Z.Im := X.Im;
  96.  
  97.   case Wybor.Items[Wybor.ItemIndex] of
  98.     '+':
  99.     begin
  100.       Z.Dodaj(Y);
  101.     end;
  102.     '-':
  103.     begin
  104.       Z.Odejmij(Y);
  105.     end;
  106.     '*':
  107.     begin
  108.       Z.Pomnoz(Y);
  109.     end;
  110.     '/':
  111.     begin
  112.       if (Y.Re = 0) and (Y.Im = 0) then
  113.       begin
  114.         MessageDlg('Nie dziel przez zero, pamiętaj cholero!!!', mtError, [mbOK], 0);
  115.         Exit;
  116.       end;
  117.       Z.Podziel(Y);
  118.     end;
  119.   end;
  120.  
  121.   UstawWszystko;
  122.   ActiveControl := X1;
  123. end;
  124.  
  125. procedure TFrm.TrybZChange(Sender: TObject);
  126. begin
  127.   Ustaw(Z, Z1, Z2, TrybZ.ItemIndex);
  128. end;
  129.  
  130. procedure TFrm.Button1Click(Sender: TObject);
  131. begin
  132.   Oblicz(Sender);
  133. end;
  134.  
  135. procedure TFrm.Button2Click(Sender: TObject);
  136. begin
  137.   X.Kart(0,0);
  138.   Y.Kart(0,0);
  139.   Z.Kart(0,0);
  140.   UstawWszystko;
  141. end;
  142.  
  143. procedure TFrm.FormCreate(Sender: TObject);
  144. begin
  145.  
  146. end;
  147.  
  148. procedure TFrm.Ustaw(A: TZKryskomWDole; A1, A2: TFloatSpinEdit; Postac: integer);
  149. begin
  150.   case Postac of
  151.     0: begin
  152.       A1.Value := A.Re;
  153.       A2.Value := A.Im;
  154.     end;
  155.     1: begin
  156.       A1.Value := A.Modul;
  157.       A2.Value := Round(RadianyNaStopnie(A.Faza));
  158.     end;
  159.     2: begin
  160.       A1.Value := A.Modul;
  161.       A2.Value := A.Faza;
  162.     end;
  163.   end;
  164. end;
  165.  
  166. procedure TFrm.Sczytaj(var A: TZKryskomWDole; A1, A2: TFloatSpinEdit;
  167.   Postac: integer);
  168. begin
  169.   case Postac of
  170.     0: begin
  171.       A.Kart(A1.Value, A2.Value);
  172.     end;
  173.     1: begin
  174.       A.Tryg(A1.Value, StopnieNaRadiany(A2.Value));
  175.     end;
  176.     2: begin
  177.       A.Tryg(A1.Value, A2.Value);
  178.     end;
  179.   end;
  180. end;
  181.  
  182. procedure TFrm.SczytajWszystko;
  183. begin
  184.   Sczytaj(X, X1, X2, TrybX.ItemIndex);
  185.   Sczytaj(Y, Y1, Y2, TrybY.ItemIndex);
  186.   Sczytaj(Z, Z1, Z2, TrybZ.ItemIndex);
  187. end;
  188.  
  189. procedure TFrm.UstawWszystko;
  190. begin
  191.   Ustaw(X, X1, X2, TrybX.ItemIndex);
  192.   Ustaw(Y, Y1, Y2, TrybY.ItemIndex);
  193.   Ustaw(Z, Z1, Z2, TrybZ.ItemIndex);
  194. end;
  195.  
  196. { TZKryskomWDole }
  197.  
  198. procedure TZKryskomWDole.Kart(Realis, Imaginaris: double);
  199. begin
  200.   Re := Realis;
  201.   Im := Imaginaris;
  202. end;
  203.  
  204. procedure TZKryskomWDole.Tryg(Modul, Faza: double);
  205. begin
  206.   Re := Modul * Cos(Faza);
  207.   Im := Modul * Sin(Faza);
  208. end;
  209.  
  210. procedure TZKryskomWDole.Dodaj(Druga: TZKryskomWDole);
  211. begin
  212.   Re := Re + Druga.Re;
  213.   Im := Im + Druga.Im;
  214. end;
  215.  
  216. procedure TZKryskomWDole.Odejmij(Druga: TZKryskomWDole);
  217. begin
  218.   Re := Re - Druga.Re;
  219.   Im := Im - Druga.Im;
  220. end;
  221.  
  222. procedure TZKryskomWDole.Pomnoz(Druga: TZKryskomWDole);
  223. var
  224.   R: double;
  225. begin
  226.   R := Re;
  227.   Re := Re * Druga.Re - Im * Druga.Im;
  228.   Im := R * Druga.Im + Im * Druga.Re;
  229. end;
  230.  
  231. procedure TZKryskomWDole.Podziel(Druga: TZKryskomWDole);
  232. var
  233.   R: double;
  234. begin
  235.   R := Re;
  236.   Re := (Re * Druga.Re + Im * Druga.Im) / sqr(Druga.Modul);
  237.   Im := (Im * Druga.Re - R * Druga.Im) / sqr(Druga.Modul);
  238. end;
  239.  
  240. function TZKryskomWDole.Modul: double;
  241. begin
  242.   Result := Sqrt(Re * Re + Im * Im);
  243. end;
  244.  
  245. function TZKryskomWDole.Faza: double;
  246. begin
  247.   Result := arctan2(Im, Re);
  248. end;
  249.  
  250. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement