Delphi-programm für uni

AWg_ndhkig

Grünschnabel
Hallo leute....

bin erstganz frisch bei euch...sowie in der delphiprogrammierung. muß für ide uni ein programm schreiben....und unsere lehrveranstaltungen beinhalten alles was man braucht, bloß nicht dephi. hab mir jetzt schon ein buch geholt...aber zu richtig bringt das auch nix., also könnt ihr mir helfen.

1. Aufgabenstellung

es sind nullstellen einer vorgegeben kubischen funktion

f(x)= ax³+bx²+cx+d

mittels der regala falsi verfahren zu bestimmen. Dazu ist die funktion, zuerst graphisch darzustellen. Die hierfür benötigten reellen koeffizenten sind a,b,c,d sind über edit fenster einzugeben. der algorhyitmus des regula falsi verfahren ist zu programmieren.. der linke und rechte startwert sollen aus der grafischen darstellung der funktion per mausklick ermittelt und eingegeben werden. die berechnete nullstelle sowie und die erreichte geneuigkeit sind über edit-fenster auszugenbn.



also dich hab schon eien oberfläche und das wars auch schon...könnt ihr mir bitte helfen
 
also ich hab vier edit fenster...durch die ich variablen eingebe....wie kann ich jetzt diese variablen dazu verwenden im tchart fenster die funktion darzustellen
 
Ich denke, wenn du überhaupt keine Ahnung von Delphi hast, können wir uns hier halbtotreden, und es wird trotzdem nichts nützen, weil du nichts davon verstehst. Du müsstest dich also erst einmal in Delphi einarbeiten. Dann können wir dir gerne bei Fragen und Problemen weiterhelfen.

Wenn du hingegen bereits Anfängerstatus in Delphi hast, dann ist die Lösung deines Problems die folgende: Du solltest bei den Editfeldern einen Button erstellen und als dessen OnClick-Handler eine Prozedur schreiben, die die Strings in den Editfeldern in Zahlen umwandelt (mit der StrToFloat-Funktion). Mit diesen Zahlen programmierst du dann ganz normal die regula falsi. Die Grafikausgabe erfolgt auf dem Canvas des Fensters (Canvas ist ein Member des Fensters). Wie die Klasse TCanvas angewandt wird, erfährst du in der (sehr guten und ausführlichen) Hilfe von Delphi!

(Übrigens sind das keine Editfenster, sondern Editfelder.)

Gawayn
 
Zuletzt bearbeitet:
so hier mein programm... wenn ihr verbesserungsvorschläge habt:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type
TForm1 = class(TForm)
Series1: TFastLineSeries;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
TChart: TChart;
Button4: TButton;
Button5: TButton;
Series2: TFastLineSeries;
Series3: TFastLineSeries;
Series4: TFastLineSeries;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure showx(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure links(Sender: TObject);
function XtoY(x: real): real;
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
e,b: boolean;
links,rechts,x,y,x0: real;
xlinks,ylinks,xrechts,yrechts : real;

implementation

{$R *.dfm}

// Y aus X berechnen
function TForm1.XtoY(x: real): real;
var a,b,c,d : real;
begin
a:=StrToFloat (Edit1.text);
b:=StrToFloat (Edit2.text);
c:=StrToFloat (Edit3.text);
d:=StrToFloat (Edit4.text);
result:=(a*x*x*x)+(b*x*x)+(c*x)+d;
end;

// Programm beenden
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

// Graph zeichnen
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,d :real;
i: integer;
begin
a:=StrToFloat (Edit1.text);
b:=StrToFloat (Edit2.text);
c:=StrToFloat (Edit3.text);
d:=StrToFloat (Edit4.text);
i:=0;
series1.clear;
while i<=12000 do
begin
x:=(i-6000)/1000;
y:=(a*x*x*x)+(b*x*x)+(c*x)+d;
series1.addxy(x,y);
i:=i+1;
end;
label4.Visible:=true;
edit5.Visible:=true;
e:=false;
end;

// Zurücksetzen
procedure TForm1.Button2Click(Sender: TObject);
begin
series1.clear;
series2.clear;
series3.Clear;
series4.Clear;
Edit1.text:='3';
Edit2.text:='4';
Edit3.text:='-3';
Edit4.text:='-1';
label4.Visible:=false;
label5.Visible:=false;
label6.Visible:=false;
label7.Visible:=false;
label8.Visible:=false;
edit5.Visible:=false;
edit6.Visible:=false;
edit7.Visible:=false;
edit8.Visible:=false;
edit9.Visible:=false;
button4.Visible:=false;
button5.Visible:=false;
e:=true;
end;

// x bei Mausbewegung anzeigen
procedure TForm1.showx(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
x1: real;
xstr: string;
begin
x1:=round(-(412-x)/60.5*100);
xstr:=FloatToStr(x1/100);
Edit5.text:=xstr;
end;

// Grenzen auswählen
procedure TForm1.links(Sender: TObject);
begin
if e=false then
begin
if b=true then
begin
label5.visible:=true;
edit6.visible:=true;
edit6.Text:=edit5.Text;
b:=false;
end
else
begin
label6.visible:=true;
edit9.Visible:=true;
edit9.Text:=edit5.Text;
xlinks:=StrToFloat(edit6.text);
xrechts:=StrToFloat(edit9.text);
ylinks:=XtoY(xlinks);
yrechts:=XtoY(xrechts);
if ((yrechts>0) AND (ylinks<0)) OR ((yrechts<0) AND (ylinks>0)) then
begin
button4.Visible:=true;
button4.Enabled:=true;
end
else
begin
button4.Visible:=true;
button4.Enabled:=false;
end;
b:=true;
end;
end;
end;

// "Berechnen"
procedure TForm1.Button4Click(Sender: TObject);
begin
button4.enabled:=false;
e:=true;
label7.Visible:=true;
edit7.Visible:=true;
button5.Visible:=true;
series2.addxy(xlinks,10);
series2.addxy(xlinks,-10);
series3.addxy(xrechts,10);
series3.addxy(xrechts,-10);
series4.addxy(xlinks,ylinks);
series4.addxy(xrechts,yrechts);
x0:=xlinks-(ylinks*((xrechts-xlinks)/(yrechts-ylinks)));
edit7.Text:=FloatToStr(round(x0*1000000)/1000000);
end;

// "Weiter"
procedure TForm1.Button5Click(Sender: TObject);
var x_ : real;
begin
x_:=x0;
edit8.Visible:=true;
label8.Visible:=true;
series2.clear;
series3.clear;
series4.clear;
if (XtoY(x0)*XtoY(xlinks))<0 then
begin
series2.addxy(xlinks,10);
series2.addxy(xlinks,-10);
series3.addxy(x0,10);
series3.addxy(x0,-10);
series4.addxy(xlinks,ylinks);
series4.addxy(x0,XtoY(x0));
x0:=xlinks-(ylinks*((x0-xlinks)/(XtoY(x0)-ylinks)));
end
else
begin
series2.addxy(xrechts,10);
series2.addxy(xrechts,-10);
series3.addxy(x0,10);
series3.addxy(x0,-10);
series4.addxy(xrechts,yrechts);
series4.AddXY(x0,XtoY(x0));
x0:=x0-(XtoY(x0)*((xrechts-x0)/(yrechts-XtoY(x0))));
end;
edit7.Text:=FloatToStr(round(x0*1000000)/1000000);
edit8.Text:=FloatToStr(round((x_-x0)*1000000)/1000000);
end;

// main-prog
begin
b:=true;
e:=true;


end.
 
Es wäre auf jeden Fall hilfreich, wenn du deinen Code in code-Tags einschließen würdest, damit man das ganze auch lesen kann.

Eine Sache seh ich aber schon jetzt: Du solltest den Typ Real nicht verwenden. Der kommt noch aus Turbo-Pascal-Zeiten und nutzt nicht die FPU des Prozessors, sondern wird in Software emuliert. Das macht das Programm weit langsamer. Du solltest immer entweder Single (32 Bit) oder Double (64 Bit) verwenden, um die FPU zu nutzen!

Gawayn
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück