Skocz do zawartości
Zaloguj się, aby obserwować  
UltiTHC

Problem w programie, pomocy.

Polecane posty

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.

d4fe4b2d422a8.jpg

 

Przyznaję się bez bicia - nie programuję zbyt wiele, ale ten problem wydaje mi się być trochę z dupy xdd

 

 

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.

 

 

Liczę na pomoc jeżeli ktoś ma jakikolwiek pomysł co tutaj może być nie tak.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie jestem na 100% pewien, ale przy q3 masz dzielenie przez liczbę bliską 0.... (rozsądne nazywanie zmiennych pomogłoby szybciej i pewniej zanalizować problem)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
Zaloguj się, aby obserwować  

×