Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Exponentialfunktion in Delphi


wayne123 - So 16.01.11 22:14
Titel: Exponentialfunktion in Delphi
Ich hab ein Problem. Ich weiß nicht wie ich die Potez in Delphi machen soll, sodass die Hochzahl eine Variabel ist. Weiß hier vllt jemand, wie man das möglichst unkompliziertt machen kann?


Moderiert von user profile iconMartok: Topic aus Sonstiges (Delphi) verschoben am So 16.01.2011 um 22:40


Xion - So 16.01.11 22:20

http://www.epinasoft.com/delphikurs/dkk_reference_libsurvey.html hat folgendes geschrieben:

Power math function Power(const Base, Exponent: Extended): Extended;
Berechnet die Potenz zu einer beliebigen Basis.


wayne123 - So 16.01.11 22:30

Und wie würde das bei einem Beispiel aussehen? Bei mir kommt nämlich immer: Undefinierter Bezeichner Power.


jaenicke - So 16.01.11 22:32

Steht doch da...
Zitat:
Unit
math
Die musst du auch in die uses schreiben... :roll:


wayne123 - So 16.01.11 22:42

Verdammt, vergessen ^^. Aber Power kann ich ja nicht in Verbindung mit einer For-Schleife benutzen, oder, wegen Integer und Extended? Wie könnte ich das dann machen, dass der die Werte für ganz viele unterschiedliche z(Hochzahl) Werte ausrechnet?


platzwart - So 16.01.11 22:47

Ehm... wie bitte? Was willst du?


jaenicke - So 16.01.11 22:49

Du kannst auch eine ganze Zahl (Integer) als Kommazahl (Extended) übergeben. Das ist eigentlich kein Problem. Nur das Ergebnis ist natürlich wieder Extended und nicht Integer.

Wenn du dazu schreiben würdest was du versucht hast (hast du ja hoffentlich...), könnten wir dir auch sagen was da falsch ist.


wayne123 - So 16.01.11 22:52


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Edit4: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Edit5: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
const w=1.54;
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var x,y,z: extended;
begin
x:= StrToFloat(Edit1.Text);
y:= StrToFloat(Edit2.Text);
Edit3.Text:= FloatToStr((2*x*y)/(x+y));
for z:= 1 to 25 do
begin
Power(w,z):=extended;
end;
Edit4.Text:= FloatToStr(223*Power)
end;

end.


Moderiert von user profile iconMartok: Delphi-Tags gesetzt


wayne123 - So 16.01.11 23:10

Okay, ich seh schon, dass ich da nur Mist gemacht habe, war wohl zu müde, weil ich in den etzten paar Tage immer sehr spät im Bett war. Ich guck mir das morgen nochmal an und falls ich wieder Probleme mit Integer und Extended bei der for-Schleife habe, melde ich mich hier nochmal, da ich ja weiß, dass mir hier ständig meine groben Fehler beim Programmieren aufgezeigt werden.


Martok - So 16.01.11 23:24

Hallo!

Bitte verwende für Quellcode die entsprechenden [delphi]-Tags, dann wird er "schöner" dargestellt als im Fließtext. Beispiel:

Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG107ac9c8fe676154cf7b2d002a022f5b}</span></span>                    

Wird:

Delphi-Quelltext
1:
var Test: integer;                    


Oben Rechts neben deinem Beitrag findest du dazu die "Bearbeiten"-Funktion, dort einfach ändern und speichern. Danke!

Viele Grüße,
Martok


Tranx - Mo 17.01.11 03:38

Hallo, habe mir mal Deine Prozedur vorgenommen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var x,y,z: extended;
begin
  x:= StrToFloat(Edit1.Text);
  y:= StrToFloat(Edit2.Text);
  Edit3.Text:= FloatToStr((2*x*y)/(x+y));
  for z:= 1 to 25 do 
  begin
    Power(w,z):=extended;
  end;
  Edit4.Text:= FloatToStr(223*Power)
end;


Also zwei Zeilen ergeben für mich gar keinen Sinn.

1.

Delphi-Quelltext
1:
  Power(w, z) := extended;                    


Extended ist keine Variable, sondern ein Variablentyp, somit hat dies keinen Wert. Und auf der rechten Seite der Zuweisung müssen nun mal Werte stehen. Es muss ja etwas zugewiesen werden.
Dann ist das nächste: Power ist eine Funktion, ihr kann also nichts zugewiesen werden. Power kann nur auf der rechten Seite stehen, denn sie liefert als Funktion einen Wert:


Delphi-Quelltext
1:
  y := Power(w,z);                    


Das wäre in Deinem Fall eine mögliche korrekte Zeile.

2.

Delphi-Quelltext
1:
  Edit4.Text := FloatToStr(223*Power)                    


Hier wird zwar Power auf der richtigen Seite, jedoch ohne Parameter benutzt. Entweder ist in diesem Fall Power eine Variable, was dann jedoch zur Konfusion führt, wenn man Variablen (Die jedoch in dem Cosde nicht definiert ist) und Funktionen gleich benennt, oder es ist eben doch die Funktion, und dann benötigt Power zwei Parameter, nämlich Basis und Exponent. Nebenbei: Bei der letzten Zeile vor "end;" kann man das abschließende Komma weglassen. Ich schließe jedoch alle Zeilen, welche ein Komma erlauben, mit diesem ab. Denn wenn ich den Text erweitere, vergesse ich nicht, das Komma in der Zeile hinzuzufügen. In jedem Fall merkt der Compiler den Fehler, falls er auftritt.

Allerdings verstehe ich nicht, was die Schleife soll. Du berechnest irgendwelche Werte und gibst letztendlich einen Wert aus. Wofür dann die Schleife? Da ist nicht mal eine Summenbildung des Typs:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  Summe := 0.0;
  for z := 1 to 25 do
  begin
    Summe := Summe + Power(w,z);
  end;
  Edit4.Text:= FloatToStr(Summe);


oder ähnliche Konstrukte. Klär uns hierin doch mal auf! ;)


Fiete - Mo 17.01.11 17:06

Moin wayne123,
Dein Problem ist auch ohne die Unit Math lösbar:

Delphi-Quelltext
1:
x:=exp(3*ln(2));                    

entspricht x=2^3
wobei x vom Typ extended sein muß.
exp ist die e-Funktion, ln der Logarithmus zur Basis e
Gruß
Fiete


wayne123 - Mo 17.01.11 19:32

Ja, ich hab gemerkt, dass ich da völligen Quatsch gemacht habe. Habs jetzt auch einfacher gelöst, musste deswegen nur mehr schreiben. Ich hätte noch die Werte vergleichen lassen müssen für mein Programm, damit am Ende der Wert rauskommt, der am nahesten an dem Wert ist, der eingegeben wird, aber das geht ja durch if-then. Wäre doch:
X=Eingabewert y=jeweiliger Wert, der rauskommt z= Variabel für Rechnung mit Ergebnis y


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
KlErgebnis:= 99999
for z:= 1 to 25 do
begin
Rechnung
if y<=x then
begin
Differenz:= x-y
if Differenz<KlErgebnis then
begin
KlErgebnis:=Differenz
end;
else 
Differenz:= y-x
if Differenz<KlErgebnis then
begin
KlErgebnis:=Differenz
end;


Moderiert von user profile iconMartok: Delphi-Tags gesetzt