UltiTHC Posted January 28, 2016 Report Share Posted January 28, 2016 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. 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. Link to comment Share on other sites More sharing options...
Kaczus Posted January 29, 2016 Report Share Posted January 29, 2016 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) Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.