Skocz do zawartości


Problem w programie, pomocy.


1 odpowiedź w tym temacie

#1 UltiTHC

    Nowy na forum

  • Użytkownicy
  • 1 Postów:

Napisano czw, 28 sty 2016 - 15:12

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.
Posted Image

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


delphi
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 &#174;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.

#2 Kaczus

    Bywalec

  • Użytkownicy
  • 36 Postów:

Napisano pią, 29 sty 2016 - 08:56

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)