Wątek przeniesiony 2016-01-28 16:44 z Delphi i Pascal przez furious programming.

Program obliczający powiększenie obrazu przechodzącego przez pięć soczewek

0

Witam :)

Otóż mój problem wygląda następująco:

Napisałem program, który oblicza powiększenie obrazu przechodzącego przez 5 soczewek.
Wartości pierwszych 2 soczewek są obliczane dobrze, natomiast problem pojawia się przy parametrze "Y" soczewki 3 (w programie zmienna "p3". Później jak wiadomo część rzeczy sypie się tylko i wyłącznie przez złe obliczenie "p3".

Poniżej zdjęcie problemu, a jeszcze niżej kod.

problempascal.jpg

 unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, ComCtrls, Buttons;

var wielkosc,y,z,zs1,zs2,zs3,zs4,zs5,f,f2,f3,f4,f5,d,g,opos,o,o2,o3,o4,o5,l,l2,l3,l4,l5: real;
    t: real;

type

  { TForm1 }

  TForm1 = class(TForm)
    answer: TButton;
    Image1: TImage;
    inf: TButton;
    inst: TButton;
    clear: TButton;
    exxit: TButton;
    Label1: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label2: TLabel;
    Label20: TLabel;
    Label4: TLabel;
    Label6: TLabel;
    Labelf1: TLabel;
    Labelf2: TLabel;
    Labelf3: TLabel;
    Labelf4: TLabel;
    Labelf5: TLabel;
    Labelp1: TLabel;
    Labelp2: TLabel;
    Labelp3: TLabel;
    Labelp4: TLabel;
    Labelp5: TLabel;
    Labelx1: TLabel;
    Labelx2: TLabel;
    Labelx3: TLabel;
    Labelx4: TLabel;
    Labelx5: TLabel;
    Labely1: TLabel;
    Labely2: TLabel;
    Labely3: TLabel;
    Labely4: TLabel;
    Labely5: TLabel;
    line10: TLabel;
    line11: TLabel;
    line12: TLabel;
    line13: TLabel;
    line14: TLabel;
    line15: TLabel;
    line5: TLabel;
    line6: TLabel;
    line7: TLabel;
    line8: TLabel;
    line9: TLabel;
    wynik: TLabel;
    LabelPow5: TLabel;
    LabelPow4: TLabel;
    LabelPow3: TLabel;
    LabelPow2: TLabel;
    LabelPow1: TLabel;
    line4: TLabel;
    p: TLabel;
    line: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    line1: TLabel;
    line2: TLabel;
    line3: TLabel;
    opos: TEdit;
    wielkosc: TEdit;
    zs1: TEdit;
    zs2: TEdit;
    zs3: TEdit;
    zs4: TEdit;
    zs5: TEdit;
    zzzz: TLabel;
    procedure answerClick(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure infClick(Sender: TObject);
    procedure instClick(Sender: TObject);
    procedure clearClick(Sender: TObject);
    procedure exxitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Label6Click(Sender: TObject);
    procedure LabelPow1Click(Sender: TObject);
    procedure line1Click(Sender: TObject);
    procedure oposChange(Sender: TObject);
    procedure oposKeyPress(Sender: TObject; var Key: char);
    procedure wielkoscChange(Sender: TObject);
    procedure wielkoscKeyPress(Sender: TObject; var Key: char);
    procedure zs1KeyPress(Sender: TObject; var Key: char);
    procedure zs2KeyPress(Sender: TObject; var Key: char);
    procedure zs3KeyPress(Sender: TObject; var Key: char);
    procedure zs4KeyPress(Sender: TObject; var Key: char);
    procedure zs5KeyPress(Sender: TObject; var Key: char);
  private
    { private declarations }
  public
    { public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.answerClick(Sender: TObject);
var
  z, z2, z3, z4, z5, f, f2, f3, f4, f5, w, q, q2, q3, q4, q5, p1, p2, p3, p4, p5, odl, odl2, odl3, odl4 ,odl5 : single;
  MaxFF: Integer;

begin

  z:=StrToFloat (zs1.Text);
  z2:=StrToFloat (zs2.Text);
  z3:=StrToFloat (zs3.Text);
  z4:=StrToFloat (zs4.Text);
  z5:=StrToFloat (zs5.Text);
  odl:=StrToFloat (opos.Text);
  w:=StrToFloat (wielkosc.Text);
  f:=100*(1/z);
  f2:=100*(1/z2);
  f3:=100*(1/z3);
  f4:=100*(1/z4);
  f5:=100*(1/z5);

  p1:= (f*odl) / (odl-f);

  odl2:=p1;

  p2:= (f2*odl2) / (odl2-f2);

  odl3:=p2;

  p3:= (f3*odl3) / (odl3-f3);

  odl4:=p3;

  p4:= (f4*odl4) / (odl4-f4);

  odl5:=p4;

  p5:= (f5*odl5) / (odl5-f5);

  q:=(Abs(p1) / odl)*w;
  q2:=(Abs(p2) / odl2)*w;
  q3:=(Abs(p3) / odl3)*w;
  q4:=(Abs(p4) / odl4)*w;
  q5:=(Abs(p5) / odl5)*w;


  if

  odl < f = true then

  ShowMessage('Odleglosc przedmiotu od soczewki mniejsza od ogniskowej SOCZEWKI 1. Obraz nie powstanie! ! !')

  else
  if w<=0 = true then

  ShowMessage('Wielkosc przedmiotu musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')

  else
  if z<=0 = true then

  ShowMessage('Zdolnosc skupiajaca "SOCZEWKI 1" musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')

  else
  if odl<=0 = true then

  ShowMessage('Odleglosc przedmiotu od soczewki musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')

  else
  if z2<=0 = true then

  ShowMessage('Zdolnosc skupiajaca "SOCZEWKI 2" musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')

  else
  if z3<=0 = true then

  ShowMessage('Zdolnosc skupiajaca musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')

  else
  if z4<=0 = true then

  ShowMessage('Zdolnosc skupiajaca musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')

  else
  if z5<=0 = true then

  ShowMessage('Zdolnosc skupiajaca musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')

  else


  Labelx1.Caption := FloatToStrF(odl,ffFixed,10,2);
  Labelx2.Caption := FloatToStrF(odl2,ffFixed,10,2);
  Labelx3.Caption := FloatToStrF(odl3,ffFixed,10,2);
  Labelx4.Caption := FloatToStrF(odl4,ffFixed,10,2);
  Labelx5.Caption := FloatToStrF(odl5,ffFixed,10,2);

  Labelf1.Caption := FloatToStrF(f,ffFixed,10,2);
  Labelf2.Caption := FloatToStrF(f2,ffFixed,10,2);
  Labelf3.Caption := FloatToStrF(f3,ffFixed,10,2);
  Labelf4.Caption := FloatToStrF(f4,ffFixed,10,2);
  Labelf5.Caption := FloatToStrF(f5,ffFixed,10,2);

  Labely1.Caption := FloatToStrF(p1,ffFixed,10,2);
  Labely2.Caption := FloatToStrF(p2,ffFixed,10,2);
  Labely3.Caption := FloatToStrF(p3,ffFixed,10,2);
  Labely4.Caption := FloatToStrF(p4,ffFixed,10,2);
  Labely5.Caption := FloatToStrF(p5,ffFixed,10,2);

  Labelp1.Caption := FloatToStrF(q,ffFixed,10,2);
  Labelp2.Caption := FloatToStrF(q2,ffFixed,10,2);
  Labelp3.Caption := FloatToStrF(q3,ffFixed,10,2);
  Labelp4.Caption := FloatToStrF(q4,ffFixed,10,2);
  Labelp5.Caption := FloatToStrF(q5,ffFixed,10,2);

  LabelPow1.Caption := FloatToStrF(q,ffFixed,10,2);
  LabelPow2.Caption := FloatToStrF(q2,ffFixed,10,2);
  LabelPow3.Caption := FloatToStrF(q3,ffFixed,10,2);
  LabelPow4.Caption := FloatToStrF(q4,ffFixed,10,2);
  LabelPow5.Caption := FloatToStrF(q5,ffFixed,10,2);
  wynik.Caption := FloatToStrF(q*(Abs(p2) / odl2)*(Abs(p3) / odl3)*(Abs(p4) / odl4)*(Abs(p5) / odl5),ffFixed,10,2);


end;

procedure TForm1.Image1Click(Sender: TObject);
begin

end;

procedure TForm1.infClick(Sender: TObject);
begin
  ShowMessage('Program obliczajacy wartosc powiekszenia obrazu przez 5 soczewek skupiajacych. Produced By Oskar Dolowy ®2016');
end;

procedure TForm1.instClick(Sender: TObject);
begin
  ShowMessage('INSTRUKCJE:  '#10'1. Do liczb dziesietnych uzywaj PRZECINKA.'#10'2. Po obliczeniu mozesz wyczyscic okienka do wprowadzania danych przyciskiem "Wyczysc" w lewym dolnym rogu aplikacji.'#10'3. Informacje na temat programu znajdziesz w prawym gornym rogu aplikacji.'#10'4. Po zakonczeniu obliczen mozesz wyjsc z programu za pomoca przycisku "Wyjdz" w prawym dolnym rogu aplikacji.');
end;







procedure TForm1.clearClick(Sender: TObject);
begin
  wielkosc.clear;
  zs1.clear;
  zs2.clear;
  zs3.clear;
  zs4.clear;
  zs5.clear;
  opos.clear;
  wielkosc.SetFocus;
end;

procedure TForm1.exxitClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.Label6Click(Sender: TObject);
begin

end;

procedure TForm1.LabelPow1Click(Sender: TObject);
begin

end;

procedure TForm1.line1Click(Sender: TObject);
begin

end;

procedure TForm1.oposChange(Sender: TObject);
begin

end;

procedure TForm1.oposKeyPress(Sender: TObject; var Key: char);
begin
      if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
  Key := #0;
  ShowMessage('Sprawdz czy poprawnie wprowadziles odleglosc przedmiotu od soczewki lub zajrzyj do Instrukcji.');
end;
end;

procedure TForm1.wielkoscChange(Sender: TObject);
begin

end;

procedure TForm1.wielkoscKeyPress(Sender: TObject; var Key: char);
begin
  if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
  Key := #0;
  ShowMessage('Sprawdz czy poprawnie wprowadziles Wielkosc Obiektu lub zajrzyj do Instrukcji.');
end;
end;

procedure TForm1.zs1KeyPress(Sender: TObject; var Key: char);
begin
    if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
  Key := #0;
  ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI1 lub zajrzyj do Instrukcji.');
end;
end;

procedure TForm1.zs2KeyPress(Sender: TObject; var Key: char);
begin
      if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
  Key := #0;
  ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI2 lub zajrzyj do Instrukcji.');
end;
end;

procedure TForm1.zs3KeyPress(Sender: TObject; var Key: char);
begin
      if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
  Key := #0;
  ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI3 lub zajrzyj do Instrukcji.');
end;
end;

procedure TForm1.zs4KeyPress(Sender: TObject; var Key: char);
begin
      if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
  Key := #0;
  ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI4 lub zajrzyj do Instrukcji.');
end;
end;

procedure TForm1.zs5KeyPress(Sender: TObject; var Key: char);
begin
      if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
  Key := #0;
  ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI5 lub zajrzyj do Instrukcji.');
end;
end;



end. 
3

Zapoznaj się z tablicami i przerób ten kod używając zdobytej wiedzy.

0

Noo właśnie jestem trochę amatorem programowania, ale skoro polecasz to tak zrobię :)
To program po prostu buguje ten wynik czy jak xd? Bo tylko z tą 1 wartością coś jest nie tak.

1

No to debugier i szukać.
Lub przerobić po ludzku i jak w trakcie przeróbki nie znajdziesz błędu to ktoś ci na na pewno pomoże.
W tym co podałeś prawie na 100% nikt nie zechce się babrać.

0

No rozumiem :) To może jeżeli ktoś się skusi to konkretniej chodzi o te obliczenia (one tyczą się Y3, czyli "p3" w programie):

 
  z:=StrToFloat (zs1.Text);
  z2:=StrToFloat (zs2.Text);
  z3:=StrToFloat (zs3.Text);
  z4:=StrToFloat (zs4.Text);
  z5:=StrToFloat (zs5.Text);
  odl:=StrToFloat (opos.Text);
  w:=StrToFloat (wielkosc.Text);
  f:=100*(1/z);
  f2:=100*(1/z2);
  f3:=100*(1/z3);
  f4:=100*(1/z4);
  f5:=100*(1/z5);
 
  p1:= (f*odl) / (odl-f);
 
  odl2:=p1;
 
  p2:= (f2*odl2) / (odl2-f2);
 
  odl3:=p2;
 
  p3:= (f3*odl3) / (odl3-f3);
 
  odl4:=p3;
 
  p4:= (f4*odl4) / (odl4-f4);
 
  odl5:=p4;
 
  p5:= (f5*odl5) / (odl5-f5);
 
  q:=(Abs(p1) / odl)*w;
  q2:=(Abs(p2) / odl2)*w;
  q3:=(Abs(p3) / odl3)*w;
  q4:=(Abs(p4) / odl4)*w;
  q5:=(Abs(p5) / odl5)*w;

Przypominam - wali się obliczenie "p3" :) Wezmę się za te tablice w takim razie, może ktoś w międzyczasie zaradzi coś na to.
Dzięki za podpowiedź _13th_Dragon :)

1

W klasie: zs:array[1..5]of TEdit;
w konstruktorze: for i:=low(zs) to high(zs) do zs[i]:=TEdit(FindComponent("zs"+IntToStr(i)));
dalej możesz się posługiwać: zs[i].Text

1 użytkowników online, w tym zalogowanych: 0, gości: 1