Werte vertauschen und Ausrechnen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
PhanxD
Beiträge: 9
Registriert: Sa 18. Apr 2015, 17:05

Werte vertauschen und Ausrechnen?

Beitrag von PhanxD »

Hallo :)
Und zwar wollt ich fragen ob mir jmd helfen könnte

Code: Alles auswählen

procedure Tform1.Faktor  ;
var i,t,h:Integer;
begin
 FOR t := 0 TO 250 DO
  BEGIN
  y[t] := yNull + (-g/(2*sqr(vNull))*sqr(t));
  end;                   
 i:=1;
   repeat                  //Faktor ausrechnen  (y)
      begin
      ymax:=0    ;
      if ymax < y[i] then ymax:=y[i] ;
      i:=i+1;
      end;
   until i=250;
   Faktor2 :=250.0 /ymax;
   h:=250 div 50;  //Probe zum nachschauen ob dividieren funktioniert
 
   showmessage (inttostr(h))   ;
 
    for i:=2 to 250                         //Faktor ausrechnen (x)
    do
      begin
      xmax:=1;
      if y[i] =0 then xmax:=i;
 
      end;
    Faktor3:= 250.0 / xmax;
end;                    
Undzwar hab ich das Problem, dass mir Faktor 2 und 3 immer als 250 ausgegeben werden oder ein Fehler kommt, weil ich durch 0 dividiere.
Könnte mir jmd meinen Fehler erklären?
ymax , xmax und y[t] sind als Double definiert!
Im Anhang wäre der komplette Quelltext.
Dateianhänge
unit1.pas
(5.16 KiB) 84-mal heruntergeladen
Zuletzt geändert von PhanxD am Sa 18. Apr 2015, 17:43, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Werte vertauschen und Ausrechnen?

Beitrag von theo »

"Undzwar" ist das ein neues Wort? Wenn ja warum? Fängt man so einen Satz an?

k.meier
Beiträge: 19
Registriert: So 12. Apr 2015, 14:54

Re: Werte vertauschen und Ausrechnen?

Beitrag von k.meier »

theo hat geschrieben:"Undzwar" ist das ein neues Wort? Wenn ja warum? Fängt man so einen Satz an?
"jmd" ist dann wohl auch ein neues Wort ;-)
wir sind die Meiers ;-)

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Werte vertauschen und Ausrechnen?

Beitrag von theo »

k.meier hat geschrieben: "jmd" ist dann wohl auch ein neues Wort ;-)
Wer bist du eigentlich? Bis jetzt kommst du mir vor, wie ein ziemlich gut programmierter Spambot:
http://www.lazarusforum.de/search.php?a ... 8&sr=posts

PhanxD
Beiträge: 9
Registriert: Sa 18. Apr 2015, 17:05

Re: Werte vertauschen und Ausrechnen?

Beitrag von PhanxD »

theo hat geschrieben:"Undzwar" ist das ein neues Wort? Wenn ja warum? Fängt man so einen Satz an?
Ist ein tick von mir was ich öfters sage und sich so bei mir eingebrannt hat wenn ich was nachfrag :P Und ja ich weiß man schreibt es auseinander, habs da nur verpeilt >.<

Mathias
Beiträge: 6906
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Werte vertauschen und Ausrechnen?

Beitrag von Mathias »

Code: Alles auswählen

   repeat                  //Faktor ausrechnen  (y)
      begin
      ymax:=0    ;
      if ymax < y[i] then ymax:=y[i] ; // Wird diese Bedienung einmal aufgerufen, wen nein bleibt ymax immer 0.
      i:=i+1;
      end;
   until i=250;
   Faktor2 :=250.0 /ymax;
Hatt dein y[] einen Wert der grösser 0 ist ?

Dies würde ich zuerst mal prüfen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PhanxD
Beiträge: 9
Registriert: Sa 18. Apr 2015, 17:05

Re: Werte vertauschen und Ausrechnen?

Beitrag von PhanxD »

Mathias hat geschrieben:

Code: Alles auswählen

   repeat                  //Faktor ausrechnen  (y)
      begin
      ymax:=0    ;
      if ymax < y[i] then ymax:=y[i] ; // Wird diese Bedienung einmal aufgerufen, wen nein bleibt ymax immer 0.
      i:=i+1;
      end;
   until i=250;
   Faktor2 :=250.0 /ymax;
Hatt dein y[] einen Wert der grösser 0 ist ?

Dies würde ich zuerst mal prüfen.
Hab mir die Werte von y[] ausgegeben und die lagen immer über 0 , ab einer gewissen Stelle betrug sie aber 0, jedoch sollte es die Zahl 0 doch nicht übernehmen oder?

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Werte vertauschen und Ausrechnen?

Beitrag von magnetron »

Hallo PhanxD,

es ist nun hier nicht ersichtlich, was yNull und vNull ist.
Jedoch könnte am Ende der ersten Schleife durchaus ymax = 0 sein
(zumal in der Formel für y[t] ja ein Minus steht).
Dies erklärte dann den EDIVZERO error. Den könntest Du per code abfangen
(if ymax = 0 then ...) oder evtl. per try/except sofern EDIV0 abgefangen wird.
Hier also am besten die Mathematik etwas überarbeiten und robuster machen...

In der zweiten Schleife dürfte der Knackpunkt sein die Prüfung

Code: Alles auswählen

if y[i] = 0 then xmax := i
y wird vermutlich niemal = 0 sein weil y ein double ist, das steht typischerweise etwas wie
0,0000000000000000001234 drin.
Prüfung besser etwas so:

Code: Alles auswählen

cEpsilon := 1e-6
if (abs(y[i])  < cEpsilon) then xmax := i
Viele Grüße, Stefan

PhanxD
Beiträge: 9
Registriert: Sa 18. Apr 2015, 17:05

Re: Werte vertauschen und Ausrechnen?

Beitrag von PhanxD »

Hey, danke für deine Antwort.
soll ich wegen xmax lieber round benutzen? Kann leider mit abs nichts anfangen :P Haben halt in der Schule nur so einfache Sachen gelernt :P
Das Programm rechnet eine Wurfbewegung aus (Schräger Wurf / Speziell : Waagrechter und Senkrechter noch)
Momentan hab ich es nur im Waagrechten Wurf implementiert, da ich versuche eine Skalierung hinzubekommen!
Wenn ich die Werte jedoch ausgebe,kriege ich weiterhin positive Werte heraus, deswegen wundert es mich, dass ich entweder durch 0 oder durch 1 Teile.

MfG Phan

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Werte vertauschen und Ausrechnen?

Beitrag von magnetron »

Hallo Phan,

wegen der Teilung durch Null vermute ich immer noch, dass der Punkt hier irgendwo liegt:

Code: Alles auswählen

y[t] := yNull + (-g/(2*sqr(vNull))*sqr(t));
if ymax < y[i] then ymax:=y[i] ;
Da in der Klammer ein Minus steht, kann y auch kleiner als yNull werden (das ist dann da, wo der Ball in den Boden einschlägt...).
Wenn nun y kleiner yNull ist, dann bleibt ymax = Null und der Fehler tritt auf.

Der Code in unit 1 ist übrigens anders als im post ?

Du solltest dem ganzen analytisch auf den Grund gehen, entweder mit Debugger (breakpoint setzen und nachsehen was passiert).
Oder ein writeln einfügen und ausgeben lassen was passiert, etwa so:

Code: Alles auswählen

if ymax < y[i] then ymax:=y[i]; 
writeln('ymax: ', FloatToStrF(ymax, ffExponent, 5,5), '    y[i]: ', FloatToStrF(y[i], ffExponent, 5,5); 
Wegen round weis ich leider nicht, ob round(AFloat) zu einer Ganzzahl führt. Das Problem bei doubles (und floats im allgemeinen) ist,
dass die letzten Stellen ganz weit hinterm Komma nicht Null sein müssen wegen der Rundungsfehler, speziell nach irgendwelchen Berechnungen.
Daher prüft man ob der Abstand des double zur Grenze kleiner als soundso ist.
Probier es aus mit round und sehe nach, was in der Variable steht. Die Funktion abs ist aber
auch kein Geheimnis, sie entfernt nur das Vorziechen (also abs(-3.3) ist +3.3), damit spart man sich eine Fallunterscheidung.

Eine fertige Lösung möchte ich nicht liefern, bin aber sicher Du wirst zum Erolg kommen mit debugger, in Ruhe analysieren und ggf. writeln.
Grüße, Stefan

PhanxD
Beiträge: 9
Registriert: Sa 18. Apr 2015, 17:05

Re: Werte vertauschen und Ausrechnen?

Beitrag von PhanxD »

Hi Stefan,
Ja ich hab im Post

Code: Alles auswählen

 FOR t := 0 TO 250 DO
  BEGIN
  y[t] := yNull + (-g/(2*sqr(vNull))*sqr(t));
  end;     

hinzugefügt, damit man weiß , dass ich in ein Array Werte zuweise.
Es kann wirklich an dieser Stelle liegen, jedoch weiß ich nicht wo. Hab mir die Zahlen im Array ausgeben lassen und die sind alle Positiv!

Code: Alles auswählen

if ymax < y[i] then ymax:=y[i] ;

Die Zeile bedeutet doch das wenn ymax kleiner als der Wert vom Array im Fach I ist , dieser diesen übernehmen soll oder?
Da ich ja am Anfang den höchsten Positiven Wert hab ,müsste er doch diesen übernehmen und dann nicht mehr abändern.
Und danke für die Erklärung von abs :)

Grüße, Phan

PS:

Code: Alles auswählen

 repeat                  //Faktor ausrechnen  (y)
      begin
      ymax:=1    ;      
      if ymax < y[i] then ymax:=y[i] ;
      i:=i+1;
      end;      
je nachdem wie ich ymax:=XX zugewiesen hab, ist es gleich geblieben.
Also irgendwie führt er diese If then Anweisung nicht durch , oder ich hab es falsch geschrieben..

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Werte vertauschen und Ausrechnen?

Beitrag von magnetron »

Moin,

ja müsste schon wie geplant zugewiesen werden.
Ausser dem nachfolgenden sehe ich auf die schnelle auch keine Fehler - ausser:

Code: Alles auswählen

 y: array[1..250] of double;
Ist die Definition.
In der ersten FOR Schleife beschreibst Du jedoch das Element y[0],
keine Ahnung was da drin steht. Jedenfalls könnest Du mal probieren das array als [0..250]
zu deklarieren wenn die Schleife ab y[0].
Grüße Stefan

PhanxD
Beiträge: 9
Registriert: Sa 18. Apr 2015, 17:05

Re: Werte vertauschen und Ausrechnen?

Beitrag von PhanxD »

Vielen Dank für deine Hilfe :) Hab meinen Fehler gefunden :)
hatte das

Code: Alles auswählen

ymax:=1; 
in der Schleife gehabt. Der Wert wurde dann immer überschrieben ^^
Hab nur noch das Problem mit dem Teilen :P
Hättest du vllt noch eine Idee, wie ich den x wert zuweisen kann?

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Werte vertauschen und Ausrechnen?

Beitrag von magnetron »

Moin,
schön dess es weitergeht.
Welches Teilproblem ?
Welchen x-Wert zuweisen ?

So tief stecke ich leider nicht in Deinem prog, evtl. könntest Du die Frage
ausführlicher formulieren ?
Ggf. hilft auch der Projektexport "Projekt" -> "Projekt veröffentlichen" um hier ein lauffähiges,
kompilierbares Projekt anzuhängen. Wenn gewünscht natürlich nur..

Grüße, Stefan

PhanxD
Beiträge: 9
Registriert: Sa 18. Apr 2015, 17:05

Re: Werte vertauschen und Ausrechnen?

Beitrag von PhanxD »

Code: Alles auswählen

  //      if (abs(y[i]))> cEpsilon then xmax:=i;       //
Hast mir diese Zeile mal gegeben :)
Und ich wollte fragen, ob du vllt eine andere Methode noch hättest.Aus irgendeinem Grund krieg ich nämlcih die Zeit wann y=0 erreicht nicht darauf gespeicher. Also auf xmax.
Oder hättest du eine Idee wie ich in Canvas bei einem Graphen ne Skalierung hinschriebe? Also so wie ne Beschriftung?

Grüße Phan

Antworten