Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit zkryskomwdole;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
- Spin, Math;
- type
- TTryb = (trybKart, trybStop, trybRad);
- { TZKryskomWDole }
- // Zamiast przekazywać wartość rzeczywistą i urojoną, wygodniej będzie
- // operować na jednej zmiennej. O ile wiem, Pascal nie ma wbudowanego typu
- // do liczb zespolonych, dlatego stworzymy sobie klasę zawierającą dane i
- // pożyteczne metody – jak Button1, mnożenie, konwersje między
- // reprezentacjami i in.
- TZKryskomWDole = object
- public
- Re: double;
- Im: double;
- procedure Kart(Realis, Imaginaris: double);
- procedure Tryg(Modul, Faza: double);
- procedure Dodaj(Druga: TZKryskomWDole);
- procedure Odejmij(Druga: TZKryskomWDole);
- procedure Pomnoz(Druga: TZKryskomWDole);
- procedure Podziel(Druga: TZKryskomWDole);
- function Modul: double;
- function Faza: double;
- end;
- { TFrm }
- TFrm = class(TForm)
- Button1: TButton;
- Button2: TButton;
- TrybX: TComboBox;
- TrybY: TComboBox;
- TrybZ: TComboBox;
- Wybor: TComboBox;
- X1: TFloatSpinEdit;
- X2: TFloatSpinEdit;
- Y1: TFloatSpinEdit;
- Y2: TFloatSpinEdit;
- Z1: TFloatSpinEdit;
- Z2: TFloatSpinEdit;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure Oblicz(Sender: TObject);
- procedure TrybZChange(Sender: TObject);
- procedure Ustaw(A: TZKryskomWDole; A1, A2: TFloatSpinEdit; Postac: integer);
- procedure Sczytaj(var A: TZKryskomWDole; A1, A2: TFloatSpinEdit; Postac: integer);
- procedure SczytajWszystko;
- procedure UstawWszystko;
- private
- { private declarations }
- public
- { public declarations }
- end;
- var
- Frm: TFrm;
- Tryb: TTryb;
- X, Y, Z: TZKryskomWDole;
- // Pomocniczo – funkcje do konwersji radiany i stopni.
- function RadianyNaStopnie(Radiany: double): double;
- function StopnieNaRadiany(Stopnie: double): double;
- implementation
- function RadianyNaStopnie(Radiany: double): double;
- begin
- Result := Radiany * 180 / pi;
- end;
- function StopnieNaRadiany(Stopnie: double): double;
- begin
- Result := 1.0 * Stopnie * pi / 180;
- end;
- {$R *.lfm}
- { TFrm }
- procedure TFrm.Oblicz(Sender: TObject);
- begin
- SczytajWszystko;
- Z.Re := X.Re;
- Z.Im := X.Im;
- case Wybor.Items[Wybor.ItemIndex] of
- '+':
- begin
- Z.Dodaj(Y);
- end;
- '-':
- begin
- Z.Odejmij(Y);
- end;
- '*':
- begin
- Z.Pomnoz(Y);
- end;
- '/':
- begin
- if (Y.Re = 0) and (Y.Im = 0) then
- begin
- MessageDlg('Nie dziel przez zero, pamiętaj cholero!!!', mtError, [mbOK], 0);
- Exit;
- end;
- Z.Podziel(Y);
- end;
- end;
- UstawWszystko;
- ActiveControl := X1;
- end;
- procedure TFrm.TrybZChange(Sender: TObject);
- begin
- Ustaw(Z, Z1, Z2, TrybZ.ItemIndex);
- end;
- procedure TFrm.Button1Click(Sender: TObject);
- begin
- Oblicz(Sender);
- end;
- procedure TFrm.Button2Click(Sender: TObject);
- begin
- X.Kart(0,0);
- Y.Kart(0,0);
- Z.Kart(0,0);
- UstawWszystko;
- end;
- procedure TFrm.FormCreate(Sender: TObject);
- begin
- end;
- procedure TFrm.Ustaw(A: TZKryskomWDole; A1, A2: TFloatSpinEdit; Postac: integer);
- begin
- case Postac of
- 0: begin
- A1.Value := A.Re;
- A2.Value := A.Im;
- end;
- 1: begin
- A1.Value := A.Modul;
- A2.Value := Round(RadianyNaStopnie(A.Faza));
- end;
- 2: begin
- A1.Value := A.Modul;
- A2.Value := A.Faza;
- end;
- end;
- end;
- procedure TFrm.Sczytaj(var A: TZKryskomWDole; A1, A2: TFloatSpinEdit;
- Postac: integer);
- begin
- case Postac of
- 0: begin
- A.Kart(A1.Value, A2.Value);
- end;
- 1: begin
- A.Tryg(A1.Value, StopnieNaRadiany(A2.Value));
- end;
- 2: begin
- A.Tryg(A1.Value, A2.Value);
- end;
- end;
- end;
- procedure TFrm.SczytajWszystko;
- begin
- Sczytaj(X, X1, X2, TrybX.ItemIndex);
- Sczytaj(Y, Y1, Y2, TrybY.ItemIndex);
- Sczytaj(Z, Z1, Z2, TrybZ.ItemIndex);
- end;
- procedure TFrm.UstawWszystko;
- begin
- Ustaw(X, X1, X2, TrybX.ItemIndex);
- Ustaw(Y, Y1, Y2, TrybY.ItemIndex);
- Ustaw(Z, Z1, Z2, TrybZ.ItemIndex);
- end;
- { TZKryskomWDole }
- procedure TZKryskomWDole.Kart(Realis, Imaginaris: double);
- begin
- Re := Realis;
- Im := Imaginaris;
- end;
- procedure TZKryskomWDole.Tryg(Modul, Faza: double);
- begin
- Re := Modul * Cos(Faza);
- Im := Modul * Sin(Faza);
- end;
- procedure TZKryskomWDole.Dodaj(Druga: TZKryskomWDole);
- begin
- Re := Re + Druga.Re;
- Im := Im + Druga.Im;
- end;
- procedure TZKryskomWDole.Odejmij(Druga: TZKryskomWDole);
- begin
- Re := Re - Druga.Re;
- Im := Im - Druga.Im;
- end;
- procedure TZKryskomWDole.Pomnoz(Druga: TZKryskomWDole);
- var
- R: double;
- begin
- R := Re;
- Re := Re * Druga.Re - Im * Druga.Im;
- Im := R * Druga.Im + Im * Druga.Re;
- end;
- procedure TZKryskomWDole.Podziel(Druga: TZKryskomWDole);
- var
- R: double;
- begin
- R := Re;
- Re := (Re * Druga.Re + Im * Druga.Im) / sqr(Druga.Modul);
- Im := (Im * Druga.Re - R * Druga.Im) / sqr(Druga.Modul);
- end;
- function TZKryskomWDole.Modul: double;
- begin
- Result := Sqrt(Re * Re + Im * Im);
- end;
- function TZKryskomWDole.Faza: double;
- begin
- Result := arctan2(Im, Re);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement