Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Formeln einbauen in Prozeduren mit Parametern


Danf - Do 04.02.10 11:51
Titel: Formeln einbauen in Prozeduren mit Parametern
Servus,

Ich hatte jetzt ein 2-wöchiges Praktikum. Erster Tag wieder Schule, Informatik.. und alles ist wie weggefegt.

Folgende Aufgabe hab ich bekommen:
Zitat:
Schreibe ein Programm mit Hilfe von Prozedur oder Funktion mit Parametern, dass Zinsen/Zinssatz/Kapital ausrechnet.

// Das Programm soll, je nachdem was man eingibt, die entsprechende Zahl ausrechnen.

Nun heißt es zuerst Formel raussuchen (ohne n (n = Jahre)) die da lautet

Z = K*p/100
Nun die oben genannte Formel umstellen, damit alle 3 Formeln vorhanden sind

Z = K*p/100
K = 100*Z/p
p = Z*100/K

Z = Zinsen
K = Kapital
p = Zinsatz in %

Soweit sogut...

Ohne Prozedur mit Parameter wäre die Aufgabe soweit im Rahmen des Möglichen:

... An dieser Stelle merk ich grade das ich des irgendwie gar net auf die reihe kriege, auch ohne proceudre mit parameter... sieht aber in etwa so aus:

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:
procedure TForm1.Button1Click(Sender: TObject);
  VAR K, Z, p : real;
  begin

 IF edit1.Text = ' '
 THEN
 begin
  K := strtofloat(edit1.Text);
  Z := strtofloat(edit2.text);
  p := strtofloat(edit3.Text);
  K := 100*Z/p;
  edit1.text:=FloatToStr(K);
  edit2.text:=FloatToStr(Z);
  edit3.text:=FloatToStr(p);
 end
   ELSE
     IF edit2.Text = ' '
     THEN
     begin
      K := strtofloat(edit1.Text);
      Z := strtofloat(edit2.text);
      p := strtofloat(edit3.Text);
      Z := K*p/100;
      edit1.text:=FloatToStr(K);
      edit2.text:=FloatToStr(Z);
      edit3.text:=FloatToStr(p);
     end
       ELSE
         IF edit3.Text = ' '
         THEN
         begin
          K := strtofloat(edit1.Text);
          Z := strtofloat(edit2.text);
          p := strtofloat(edit3.Text);
          p := Z*100/K;
          edit1.text:=FloatToStr(K);
          edit2.text:=FloatToStr(Z);
          edit3.text:=FloatToStr(p);
         end;

 end;
end

Das sieht aber auch irgendwie falsch aus.. hab auch noch andere Versionen geschrieben, aber die wollen alle nicht wie ich will :(.

Kann mir evtl jmd helfen :!

Mit freundlichen Grüßen
Danf

Moderiert von user profile iconNarses: Quote-Tags eingefügt.


Blackheart666 - Do 04.02.10 12:16

Hier mal ein einfaches Beispiel, vieleicht hilft dir das etwas weiter.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function Rechne(Zahl1, Zahl2:Integer):String;
begin
  Result:=IntToStr(Zahl1 + Zahl2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label.Caption:=Rechne(5,5);
end;


elundril - Do 04.02.10 12:19

Angesichts dessen das dir viele Grundlagen fehlen empfehle ich dir mal das Delphi-Wikibook [http://de.wikibooks.org/wiki/Programmierkurs:_Delphi] und Christian's Crashkurs [http://www.christian-stelzmann.de/index_tutorials_crashkurs.html]. Damit solltest du, denk ich, deine Probleme aus der Welt schaffen können. ;)

lg elundril


martin300 - Do 04.02.10 12:20

Ist hier ein Leerzeichen zuviel?

Delphi-Quelltext
1:
IF edit1.Text = ' '                    


elundril - Do 04.02.10 12:26

das dürfte wohl das geringste Problem sein denn ob ich jetzt versuche ein leerzeichen in eine zahl umzuwandeln oder gar kein zeichen is dem programm schnuppe und in beiden fällen sollte er ne exception werfen. ;)

lg elundril


martin300 - Do 04.02.10 12:34

Die Exception wird doch erst zur Laufzeit auftreten. Bei der Abfrage wird aber nie eine Berechnung durchgeführt.


Danf - Do 04.02.10 12:53

Sooo.. ich hab jetzt erstmal nen Kaffee getrunken, gefrühstückt, eine geraucht und mich nochmal drangesetzt...

Ich habs nun hingekriegt, dass das Programm einwandfrei funktioniert, allerdings ohne Prozedur mit Parameter.



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:
procedure TForm1.Button1Click(Sender: TObject);
  VAR K, Z, p : real;
  begin

 IF edit1.Text = ''
 THEN
 begin
  Z := strtofloat(edit2.text);
  p := strtofloat(edit3.Text);
  K := 100*Z/p;
  edit1.text:=FloatToStr(K);
 end
    ELSE
     IF edit2.Text = ''
     THEN
     begin
      K := strtofloat(edit1.Text);
      p := strtofloat(edit3.Text);
      Z := K*p/100;
      edit2.text:=FloatToStr(Z);
     end
       ELSE
         IF edit3.Text = ''
         THEN
         begin
          K := strtofloat(edit1.Text);
          Z := strtofloat(edit2.text);
          p := Z*100/K;
          edit3.text:=FloatToStr(p);
         end;

 end;

end.


@Blackheart666
jo, eine einfache Funktion geht ja noch.. baer diese auf das oben genannte Programm anzuwenden... That's the problem.

@all
Danke für die Antworten, probiere es jetzt nochmal mit function und procedure

LG
Danf


Danf - Do 04.02.10 13:27

So, ich hbas noch ne runde probiert, und es klappt einfach nicht, es ist zum heulen.


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:
procedure TForm1.Rechne(K, Z, p : real);
  begin

 IF edit1.Text = ''
 THEN
 begin
  Z := strtofloat(edit2.text);
  p := strtofloat(edit3.Text);
  K := 100*Z/p;
  edit1.text:=FloatToStr(K);
 end
    ELSE
     IF edit2.Text = ''
     THEN
     begin
      K := strtofloat(edit1.Text);
      p := strtofloat(edit3.Text);
      Z := K*p/100;
      edit2.text:=FloatToStr(Z);
     end
       ELSE
         IF edit3.Text = ''
         THEN
         begin
          K := strtofloat(edit1.Text);
          Z := strtofloat(edit2.text);
          p := Z*100/K;
          edit3.text:=FloatToStr(p);
         end;

 end;



procedure TForm1.Button1Click(Sender: TObject);
VAR K, Z, p : real;
begin

K := strtofloat(edit1.text);
Z := strtofloat(edit2.text);
p := strtofloat(edit3.text);

Rechne(K, Z, p)
end;

end.


Wo liegt nun der Fehler :(?

PS:
Hilfen hab ich mir durchgelesen.. baer da sind überall nur "einfache" Beispiele aus denen ich nur relativ wenig ersehen kann.


elundril - Do 04.02.10 13:30

ganz einfach, was passiert wenn in allen feldern was drin steht? ;) dann wird dein code die ausgeführt weil die bedingungen in den if-teilen immer false sind ;)

lg elundril


platzwart - Do 04.02.10 13:32

Was konkret "klappt nicht"? Fehlermeldungen?


Danf - Do 04.02.10 13:35

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
ganz einfach, was passiert wenn in allen feldern was drin steht? ;) dann wird dein code die ausgeführt weil die bedingungen in den if-teilen immer false sind ;)

lg elundril


Leider nicht

(beispiel)
Edit1 = 1000 (Kapital)
Edit2 = 50 (Zinsen)
Edit3 = (Leer) (Zinssatz)

*Auf Button drück*

Krach bum Programm abgestürzt die alte Leier halt ...


elundril - Do 04.02.10 13:36

ja, weil du versuchst einen nix in einen float umzuwandeln. was isn die gleitkommadarstellung von der zeichenkette ''? eben, der compiler weiß das auch ned ;)


Danf - Do 04.02.10 13:44

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
ja, weil du versuchst einen nix in einen float umzuwandeln. was isn die gleitkommadarstellung von der zeichenkette ''? eben, der compiler weiß das auch ned ;)


Achso, jetzt versteh ich. Das heißt ich muss auch im unteren Teil des Programms eine IF-Verschachtelung anwenden nicht wahr?

Also so:



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:
procedure TForm1.Button1Click(Sender: TObject);
VAR K, Z, p : real;
begin

 IF edit1.Text = ''
 THEN
 begin
  Z := strtofloat(edit2.text);
  p := strtofloat(edit3.Text);
 end
    ELSE
     IF edit2.Text = ''
     THEN
     begin
      K := strtofloat(edit1.Text);
      p := strtofloat(edit3.Text);
     end
       ELSE
         IF edit3.Text = ''
         THEN
         begin
          K := strtofloat(edit1.Text);
          Z := strtofloat(edit2.text);
         end;

Rechne(K, Z, p)  // aber dann ist dich hier ein Fehler?

 end;


Oder?


Marc. - Do 04.02.10 13:45


Delphi-Quelltext
1:
procedure TForm1.Rechne(K, Z, p : real);                    

Drei Paramater stehen Deiner Funktion zur Verfügung.
Zwar übergibst Du Deiner Funktion entsprechende Werte bei Aufruf:

Delphi-Quelltext
1:
2:
3:
4:
5:
K := strtofloat(edit1.text);
Z := strtofloat(edit2.text);
p := strtofloat(edit3.text);

Rechne(K, Z, p)

überschreibst diese jedoch wieder zu Beginn der Funktion, was deren Nutzen vollkommend relativiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
IF edit1.Text = ''
 THEN
 begin
  Z := strtofloat(edit2.text);
  p := strtofloat(edit3.Text);

Des Weiteren, überlege Dir, wie das Programm entscheiden soll, welcher Wert zu berechnen ist, falls alle Edits einen Wert beinhalten. Sofern überhaupt sinnvolle Werte übergeben werden. (Stichwort TryStrToFloat oder StrToFloatDef) ;)
Was kann passieren, wenn k oder p = 0 ist? ;)


Danf - Do 04.02.10 13:52

Jawoll, es hat geklappt...

Dank die nochmal, elundril, für deinen entscheidenen Typ und Ty an die anderen natürlich auch :D