Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wertetabellen und Funktionen (https://www.delphipraxis.net/146925-wertetabellen-und-funktionen.html)

Delphi-Freund 29. Jan 2010 14:05


Wertetabellen und Funktionen
 
Hallo @ all! :hi:
Ich wollte mich mal an ein Programm setzten mit dem es möglich ist aus einer Funktion eine Wertetabelle zu erstellen und vllt. die Funktion zu zeichnen. Daher möchte ich wissen, ob es überhaupt möglich ist eine eingegebene Funktion (also jede beliebige) zu verarbeiten? :?:
Wenn dies nicht möglich ist, könnte man ja am Anfang auswählen von welchem Typ die Funktion ist (z.B.: a*sin(bx+c)+d) und dann die Parameter eingeben und den Definitions und wertebereich und die schrittfolge in der Wertetabelle. Dies müsste doch dann möglich sein oder?
Und dann wollte ich wissen ob man mit Delphi so einfach Funktionen darstellen kann?
Vielen Dank schon mal im Vorraus! :thumb:

mkinzler 29. Jan 2010 14:09

Re: Wertetabellen und Funktionen
 
Hier im Forum suchenMatheParser

Delphi-Freund 29. Jan 2010 20:53

Re: Wertetabellen und Funktionen
 
Danke für die Antwort, aber was ist ein Mathe Praser? In Sachen Programmieren bin ich leider noch ein Anfänger ^^
Danke schonmal für die Antwort (:
:mrgreen:

Delphi-Freund 1. Feb 2010 14:16

Re: Wertetabellen und Funktionen
 
Wie sieht denn der parser für dieses Programm dann aus ? Könnte mir den jemand dann vllt. schicken ? :D
mfg Delphi-Freund

patti 1. Feb 2010 14:32

Re: Wertetabellen und Funktionen
 
Ein Parser analysiert einen eingegebenen String und wandelt diesen in ein für den Computer verständliches "Format" um. Dies ist jedoch aufwendiger, als man vielleicht denken mag, denn man muss einiges beachten und sollte daher schon einbisschen Erfahrung mit dem Programmieren haben. Wenn du schreibst, dass du noch ein Anfänger bist, dann muss man realistischerweise sagen, dass du das wahrscheinlich nicht selber hinbekommts. Fertige Parser lassen sich vielleicht in der DP finden, da musst du mal in den entsprechenden Sparten (wahrscheinlich OpenSource) suchen. Ein weiteres Stichwort wäre "Funktionsplotter".

mfg

Delphi-Freund 1. Feb 2010 15:37

Re: Wertetabellen und Funktionen
 
Hab mir schon gedacht, dass ein Parser zu schwer ist. Vllt. sollte ich ein Programm programmieren, dass eine auswahlmöglichkeit zwischen funktionstypen bietet und man die parameter eingeben muss. somit würde ich den parser vermeiden. jo en funktionsplotter versuche ich auf jeden fall mal. wenn ich probleme hab sag ich bescheid :D
mfg

patti 1. Feb 2010 16:09

Re: Wertetabellen und Funktionen
 
Die Unterscheidung in verschiedene Funktionstypen ist für den Anfang bestimmt einfacher. Die Ausgabe der Funktion ist dann gar nicht mehr so schwierig, aber auch da muss man einiges beachten. Hab im Rahmen meiner Facharbeit ein Programm geschrieben, dass eine spezielle Logarithmusfunktion mathematisch diskutieren und in einem Koordinatensystem graphisch darstellen kann. Obwohl die Ausgabe an sich nicht so kompliziert ist, steckt dennoch einiges an Arbeit dahinter. Zum Üben ist so ein Projekt aber sicher eine gute Idee. Muss ja am Anfang auch nicht perfekt sein.

Delphi-Freund 8. Feb 2010 20:13

Re: Wertetabellen und Funktionen
 
Also ich hab jetzt trotzdem noch probleme mit der Ausgabe der Funktion. Und zwar lass ich ja eine Wertetabelle für die Funktion erstellen. Und nun wollte ich nach der wertetabelle zeichnen lassen. (wertetabelle mit eingegebenen anfangswert, endwert und schrittweite) aber mein problem ist, dass Delphi mit LineTo nur integerwerte verarbeitet. ich habe zwar mit round versucht das problem zu umgehen aber meine repeatschleife die bis zur bedingung geht anfangswert=endwert funktioniert nicht. Könnt ihr mir einen logischen Lösungsweg verklickern, der aus der wertetabelle eine Funktion zeichnet???
Vielen Dank schonmal ;)

mfg Delphi-Freund ;)

Wolfgang Mix 8. Feb 2010 20:25

Re: Wertetabellen und Funktionen
 
Nimm ein TImage oder eine TPaintbox mit z.B. 500x500 Pixeln. Die Mamimalwerte für
x und y sind dann die Maximalwerte Deiner Funktion. Der Rest ist Dreisatz.
Helfen könnte noch Trunc und Round.

Grüß

Wolfgang

patti 9. Feb 2010 12:49

Re: Wertetabellen und Funktionen
 
Das hängt auch davon ab, wie du deine Daten (Wertetabelle) speicherst (ich vermute mal in einem array?). Vielleicht solltest du mal zeigen, was du bisher hast und wo es Probleme gibt. Ich habe gerade mal was getippt, was zu funktionieren scheint, aber ich will dir jetzt erstmal nicht eine komplette Lösung zeigen, ohne zu wissen, was du schon hast und wie du es gemacht hast, ansonsten lernst du nämlich nicht viel dabei ;-)

mfg

Delphi-Freund 9. Feb 2010 20:49

Re: Wertetabellen und Funktionen
 
Also die wertetabelle ist teil meines programmes... man kann eben anfangswert (aw) endwert (ew) und schrittweite (s) eingeben...
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
 var a,b,caw,ew,s,x,y:Real;
    n:Integer;
begin
   a:=StrToFloat(Edit1.Text);
   b:=StrToFloat(Edit2.Text);
   c:=StrToFloat(Edit3.Text);
   aw:=StrToFloat(Edit4.Text);
   ew:=StrToFloat(Edit5.Text);
   s:=StrToFloat(Edit6.Text);
   x:=aw;
   n:=0;
     while x<=ew do
      begin
        n:=n+1;
        y:=a*(sqr(x))+b*x+c;
        StringGrid1.cells[0,n]:=FloatToStrF(x,ffFixed,10,3);
        StringGrid1.cells[1,n]:=FloatToStrF(y,ffFixed,10,3);
        x:=x+s;
      end;
     StringGrid1.RowCount:=n+1;
end;
Und nun bin ich soweit, dass die Funktion "falsch herum" dargestellt wird... nun würde ich aber die Funktion gerne noch skarlieren sprich das man mit ner scrollbar die einheit des koordinatensystems bestimmen kann...
Delphi-Quellcode:
procedure TForm1.BitBtn6Click(Sender: TObject);
var a,b,c,aw,ew,s:Real;
begin
with form1.PaintBox1.Canvas do
  begin
    Brush.Color := clWhite;
    rectangle(-1,-1,form1.PaintBox1.Width+1, form1.PaintBox1.Height+1);
    Pen.Color := clBlack;
    TextOut(form1.PaintBox1.Width-8, form1.PaintBox1.Height Div 2+8, 'x');
    TextOut(form1.PaintBox1.Width DIV 2-8, 8, 'y');
    TextOut(form1.PaintBox1.Width-5, form1.PaintBox1.Height Div 2-7, '>');
    TextOut(form1.PaintBox1.Width DIV 2-3, 0, '^');
    MoveTo(0, form1.PaintBox1.Height div 2);
    LineTo(form1.PaintBox1.Width-1, form1.PaintBox1.Height div 2);
    MoveTo(form1.PaintBox1.Width div 2, 0);
    LineTo(form1.PaintBox1.Width div 2, form1.PaintBox1.Height-1);
  end;
  aw:=StrToFloat(Edit4.Text);
  ew:=StrToFloat(Edit5.Text);
  s:=StrToFloat(Edit6.Text);
  form1.PaintBox1.Canvas.MoveTo(trunc(aw)+form1.PaintBox1.Height div 2,trunc(a*sqr(aw)+b*aw+c)+form1.PaintBox1.Height div 2);
  repeat
    begin
      aw:=aw+s;
      form1.PaintBox1.Canvas.LineTo(trunc(aw)+form1.PaintBox1.Height div 2,trunc(a*sqr(aw)+b*aw+c)+form1.PaintBox1.Height div 2);
      end;
  until aw=ew;
end;
Wäre euch dankbar für hilfe ;)

mfg Delphi-Freund

[edit=mkinzler]Code-Tags durch Delphi-Tags ersetzt; Was spricht den eigentlich gegen den richtigen Tag :gruebel: Mfg, mkinzler[/edit]

sx2008 10. Feb 2010 04:45

Re: Wertetabellen und Funktionen
 
Da sind noch einige Fehler in deinem Code.
1.) du schreibst überall form1. - lass das mal weg, es schadet mehr als es nützt
2.) du wiederholst deine Mathe-Funktion mehrfach in deinem Code; das verhindert, dass die Funktion leicht geändert werden kann
Mach daraus eine Methode:
Delphi-Quellcode:
function TForm1.MeineFunkt(x:Extended):Extended;
begin
  result := a*sqr(x)+b*x+c;
end;
Statt nun überall trunc(a*sqr(aw)+b*aw+c) aufzurufen, verwendest du stattdessen Trunc(MeineFunkt(aw)).
3.) veralteter Datentyp real. stattdessen Double oder Extended verwenden; die haben höhere Genauigkeit und sind schneller,
da sie direkt von der FPU unterstützt werden
4.) du verwendest die Paintbox auf eine falsche Weise
Auf eine Paintbox sollte man nur auf dem Event OnPaint heraus zeichen.
5.) du verwendest keine eigenen Methoden
Überlege dir welche kleineren Aufgaben du in Methoden auslagern könntest (z.B. Beschriftung zeichen, Koordinatenkreuz zeichen,...)

Delphi-Freund 10. Feb 2010 13:23

Re: Wertetabellen und Funktionen
 
Vielen dank für die Tipps. Habe bereits die Funktion eingearbeitet. Danke für den Hinweis. Den Datentyp Real haben wir in der Schule kennengelernt, aber wenn dieser veraltet ist, verwende ich lieber Double. (:
Aber einwas habe ich nicht verstanden:

Zitat:

Zitat von sx2008
4.) du verwendest die Paintbox auf eine falsche Weise
Auf eine Paintbox sollte man nur auf dem Event OnPaint heraus zeichen.

Sry aber ich arbeite zum ersten mal mit Grafiken in Delphi. Hab nur im inet gelesen, dass die Darstellung z.b. mit Images oder PaintBox möglich ist.
Wie verwende ich die PaintBox richtig?

mfg Delphi-Freund ;)

patti 10. Feb 2010 14:09

Re: Wertetabellen und Funktionen
 
Wie sx2008 schon angedeutet hat: Ziehe dir eine PaintBox auf dein Formular, wechsle im Objekt-Inspektor auf den Reiter "Ereignisse" und füge mit Hilfe eines Doppelklicks bei "OnPaint" die entsprechende Behandlungs-Routine für das Paint-Ereignis der Paintbox hinzu. Innerhalb dieser Routine kannst du dann auf die Zeichenfläche ("Canvas") der Paintbox zeichnen. Du musst also alles, was mit dem Zeichnen zu tun hat und bei dir bisher in der Button-Click-Routine drin ist, in diese Routine reinpacken.

mfg

Delphi-Freund 10. Feb 2010 20:54

Re: Wertetabellen und Funktionen
 
Ok Vielen Dank euch allen!! :) Mein Problem hat sich gelöst ;)
DANKE :hello: :firejump:

mfg Delphi-Freund

Luckie 10. Feb 2010 21:12

Re: Wertetabellen und Funktionen
 
Zitat:

Zitat von Delphi-Freund
dass Delphi mit LineTo nur integerwerte verarbeitet.

Überleg mal, warum das wohl so ist. Oder wie willst du 1,56987 Pixel darstellen/ansprechen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz