Jump to content
Sign in to follow this  
UltiTHC

Problem w programie, pomocy.

Recommended Posts

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.

Share this post


Link to post
Share on other sites

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)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...