Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Einfache Mathe Formel in Delphi Umschreiben
Xearox - Mi 13.01.10 10:44
Titel: Einfache Mathe Formel in Delphi Umschreiben
Ich möchte gerne eine Einfache Mathe Formel in Delphi implemintieren.(hoffe das wort ist richtig...
Jedoch finde ich nicht die passenden Befehle dafür, die Formel sieht so aus:
Kosten=['Abrunden' Basiskosten*['Abrunden'(Stufe+1)*1,5^Stufe]]
Dabei ist es wichtig, das es immer nur abgerunden wird, also bei 1,9 auf 1,0
Kann jemand mir die Formel in Delphi so umschreiben, damit ich die Übernehmen kann?
bisher habe ich nur das hier:
Delphi-Quelltext
1:
| Kosten:=Round((Metall*Round((Stufe+1)*1,5^Stufe; |
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 13.01.2010 um 12:01
Mike19 - Mi 13.01.10 10:53
ein wenig mehr Code wäre bestimmt Hilfreich, zeige doch mal die gesamte Unit.
Xearox - Mi 13.01.10 11:01
Bin noch am Anfang des Programms, aber diese Formel ist der Kernpunkt des Rechners...
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: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Label1: TLabel; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; RadioButton4: TRadioButton; RadioButton5: TRadioButton; RadioButton6: TRadioButton; RadioButton7: TRadioButton; RadioButton8: TRadioButton; RadioButton9: TRadioButton; RadioButton10: TRadioButton; RadioButton11: TRadioButton; RadioButton12: TRadioButton; RadioButton13: TRadioButton; RadioButton14: TRadioButton; RadioButton15: TRadioButton; RadioButton16: TRadioButton; RadioButton17: TRadioButton; RadioButton18: TRadioButton; RadioButton19: TRadioButton; Label2: TLabel; Label3: TLabel; Label4: TLabel; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Label7: TLabel; MStufe: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); procedure StufeAnzeigen; procedure Metallmine; private public end;
var Form1: TForm1;
const Stufe40=40;
implementation
{$R *.dfm}
procedure TForm1.Metallmine; const Metall=125; Kristall=12; Zivis=50;
var MetKosten,KrisKosten,ZiviKosten:integer; basiskosten:integer; Stufe:integer;
begin Stufe:=1; MetKosten:=Round((Metall*Round((Stufe+1)*1,5^Stufe end;
procedure TForm1.StufeAnzeigen; var I:integer; Anzahl:integer; AnzahlStr:string;
begin Anzahl:=0; for I := 0 to Stufe40 - 1 do begin Anzahl:=Anzahl+1; AnzahlStr:=inttostr(Anzahl); MStufe.Text:=MStufe.Text+AnzahlStr+#13#10;
end; end;
procedure TForm1.Button1Click(Sender: TObject); begin StufeAnzeigen; end;
end. |
Gausi - Mi 13.01.10 11:15
Abrunden geht mit Trunc(), Potenzieren mit Power() aus der Unit Math.
D.h. Trunc schneidet die Nachkommastellen ab. Wenn man nur mit positiven Werten arbeitet, passt das so.
Xearox - Mi 13.01.10 11:19
Delphi-Quelltext
1:
| MetKosten:=Trunc((Metall*Trunc((Stufe+1)*Power(1.5,Stufe)))) |
die geht irgendwie nicht...komme da nicht hinter...
so, und nun hab ich den hier...
Delphi-Quelltext
1:
| MetKosten:=Trunc(Metall*(Stufe+1)*Power(1.5,Stufe)) |
Ist das mit Power richtig? will ja die 1,5 und die Stufe mit einander Potenzieren
Nersgatt - Mi 13.01.10 11:37
Die Fehlermeldung wäre durchaus interessant zu erfahren.
Ansonsten: Versuch mal die Formel in die einzelnen Rechenschritte zu zerlegen. So versteht man es meistens besser.
Xearox - Mi 13.01.10 11:48
Also in der Theorie, wie ich das mit Excel ausgerechnet habe müsste nach dem ersten durchlauf die MetKosten bei 375 Liegen.
Ist aber nicht der fall, er liegt bei 2,9618630521e-307...
irgendwie ist da was falsch...
Okay...hab den Fehler gefunden, ich rechne ja nur mit Ganzenzahlen...Hab real Variablen gehabt...
Es kommt aber immer noch ein falschen ergebnis raus...
Gausi - Mi 13.01.10 11:58
Dann führst du anderen Code aus als den, den du uns hier präsentiert hast. Dein Ergebnis ist übrigens (bis auf Rundungsfehler) Null. ;-)
Xearox - Mi 13.01.10 12:10
also, mir ist zu nächst einmal auf gefallen, das der Normale Integer nicht reicht, also der Platz, da ich zahlen bis 22.114.664.625 habe...
das heißt, ich müsste real nehmen, richtig?
das ist mein Momentaner Code:
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: 52: 53:
| procedure TForm1.Metallmine; const Metall=125; Kristall=12; Zivis=50;
var MetKosten,KrisKosten,ZiviKosten:longint; basiskosten:integer; Stufe:integer; I:integer; MetKostenStr:String; KrisKostenStr:String; ZiviKostenStr:string;
begin Stufe:=1; MetKosten:=Metall; KrisKosten:=Kristall; ZiviKosten:=Zivis; MetKostenStr:=inttostr(metkosten); KrisKostenStr:=inttostr(Kriskosten); ZiviKostenStr:=inttostr(ZiviKosten); MMetKosten.Text:=MMetKosten.Text+MetKostenStr+#13#10; MKrisKosten.Text:=MKrisKosten.Text+KrisKostenStr+#13#10; MZiviKosten.Text:=MZiviKosten.Text+ZiviKostenStr+#13#10; for I:=0 to 40 + 1 do begin Stufe:=Stufe+1; MetKosten:=Trunc(Metall*(Stufe+1)*Power(1.5,Stufe)); MetKostenStr:=inttostr(metkosten); MMetKosten.Text:=MMetKosten.Text+MetKostenStr+#13#10; end; Stufe:=1; for I := 0 to 40 + 1 do begin Stufe:=Stufe+1; KrisKosten:=Trunc(Kristall*(Stufe+1)*Power(1.5,Stufe)); KrisKostenStr:=inttostr(Kriskosten); MKrisKosten.Text:=MKrisKosten.Text+KrisKostenStr+#13#10; end; Stufe:=1; for I := 0 to 40 + 1 do begin Stufe:=Stufe+1; ZiviKosten:=Trunc(Zivis*(Stufe+1)*Power(1.5,Stufe)); ZiviKostenStr:=inttostr(ZiviKosten); MZiviKosten.Text:=MZiviKosten.Text+ZiviKostenStr+#13#10; end; end; |
Edit: Hab den Code Bisschen überarbeitet...
elundril - Mi 13.01.10 12:44
wenn du ganzzahlentypen brauchst und integer nicht ausreicht, warum nimmst du dann nicht Int64? das reicht von -9223372036854775808 bis 9223372036854775807.
lg elundril
Martok - Mi 13.01.10 12:52
Wenn man das mal zurückrechnet, stellt man Fest: 843.25 ist Stufe 2.
Was auch klar ist: du initialisiert Stufe auf 1, und addierst am Anfang der Schleife 1. Der erste Wert mit dem gerechnet wird ist also 1+1=2. Stimmt doch alles 8)
Du machst dir das aber auch sinnlos kompliziert: immerhin hast du schon die Durchlaufvariable der for-Schleife, also kannst du auch direkt mit dieser rechnen. Bzw. die Variable mit der du rechnen willst als Schleifenvariable nehmen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for Stufe:=1 to 40 do begin MetKosten:=Trunc(Metall*(Stufe+1)*Power(1.5,Stufe)); MetKostenStr:=inttostr(metkosten); MMetKosten.Text:=MMetKosten.Text+MetKostenStr+#13#10; end; |
Sieht doch gleich viel schöner aus ;)
Xearox - Mi 13.01.10 12:56
dann bekomme ich: Üngültige Gleitkommaoperation
das Problem ist einfach:
in Excel habe ich folgendes ergebnis, nach der Formel, die ich ganz oben stehen habe:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| 125,00 375,00 750,00 1.625,00 3.125,00 5.625,00 9.875,00 17.000,00 28.750,00 48.000,00 |
bei Delphi hab ich ab Stufe 10
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| 125 843 1687 3164 5695 9966 17085 28832 48054 79289 |
merkt ihr den Unterschied?
Ich weiß einfach nicht, wo der Fehler im Code ist....
Edit: Nun mit Double Variablen
Gammatester - Mi 13.01.10 13:22
Du scheinst immer noch integer zu rechnen:
Delphi-Quelltext
1: 2:
| MetKosten:=Trunc(Metall*(Stufe+1)*Power(1.5,Stufe)); MetKostenStr:=inttostr(metkosten); |
Mach' MetKosten double und benutze MetKostenStr:=floattostr(...)
Xearox - Mi 13.01.10 13:25
so, das mit dem Double war eine gute idee, ist wohl mein Delphi 3 buch nicht mehr aktuell... *lach mich weg*
hmm, dennoch will ich verstehen können, wieso 843 raus kommt, und keine 375
Edit: Ahh, kommen wir die sache schon mal näher...
Jetzt ist Stufe 3 und aufwärts Falsch
Stufe 3 muss 750 sein, da kommt aber nun 843 raus
Gammatester - Mi 13.01.10 13:37
Da paßt einiges nicht zusammen: wenn bei Metall*(stufe+1)*1.5^stufe für stufe=1 das Ergebnis 125 sein soll, muß Metall = 41 2/3 sein (Metall = 125/3). Dann ergibt sich für stufe=2 der Wert = (41 2/3) * 3 * 1.5^2 = 125 * 2.25 = 281.25. Das gibt's aber weder bei Excel noch bei Delphi.
Was also ist der Wert von Metall?
Xearox - Mi 13.01.10 13:43
Ich habs hinbekommen...
die lösung nach langem ausprobieren...
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for Stufe:=1 to 39 do begin MetKosten:=Trunc(Metall)*Trunc((Stufe+1)*Power(1.5,Stufe)); MetKostenStr:=floattostr(metkosten); MMetKosten.Text:=MMetKosten.Text+MetKostenStr+#13#10; end; |
ich musste, wie oben in der Formel auch, einfach 2mal Trunc einfügen, das hatte ich aber auch am anfang, nur da hatte ich vergessen, die klamma zu, zu machen...
Also: Trunc(Metall)*Trunc(....)
Und nicht: Trunc (Metall*Trunc(....))
so hatte ich das weiter oben gehabt...
Gammatester hat folgendes geschrieben : |
Da paßt einiges nicht zusammen: wenn bei Metall*(stufe+1)*1.5^stufe für stufe=1 das Ergebnis 125 sein soll, muß Metall = 41 2/3 sein (Metall = 125/3). Dann ergibt sich für stufe=2 der Wert = (41 2/3) * 3 * 1.5^2 = 125 * 2.25 = 281.25. Das gibt's aber weder bei Excel noch bei Delphi.
Was also ist der Wert von Metall? |
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: 52:
| procedure TForm1.Metallmine; const Metall=125; Kristall=12; Zivis=50;
var MetKosten,KrisKosten,ZiviKosten:double; kosten:integer; Stufe:integer; I:integer; Metall2:integer; MetKostenStr:String; KrisKostenStr:String; ZiviKostenStr:string;
begin Stufe:=1; Metall2:=Metall; MetKosten:=Metall; KrisKosten:=Kristall; ZiviKosten:=Zivis; MetKostenStr:=floattostr(metkosten); KrisKostenStr:=floattostr(Kriskosten); ZiviKostenStr:=floattostr(ZiviKosten); MMetKosten.Text:=MMetKosten.Text+MetKostenStr+#13#10; MKrisKosten.Text:=MKrisKosten.Text+KrisKostenStr+#13#10; MZiviKosten.Text:=MZiviKosten.Text+ZiviKostenStr+#13#10; for Stufe:=1 to 39 do begin MetKosten:=Trunc(Metall)*Trunc((Stufe+1)*Power(1.5,Stufe)); MetKostenStr:=floattostr(metkosten); MMetKosten.Text:=MMetKosten.Text+MetKostenStr+#13#10; end; Stufe:=1; for Stufe:=1 to 39 do begin KrisKosten:=Trunc(Kristall)*Trunc((Stufe+1)*Power(1.5,Stufe)); KrisKostenStr:=floattostr(Kriskosten); MKrisKosten.Text:=MKrisKosten.Text+KrisKostenStr+#13#10; end; Stufe:=1; for Stufe:=1 to 39 do begin ZiviKosten:=Trunc(Zivis)*Trunc((Stufe+1)*Power(1.5,Stufe)); ZiviKostenStr:=floattostr(ZiviKosten); MZiviKosten.Text:=MZiviKosten.Text+ZiviKostenStr+#13#10; end; end; |
Xentar - Mi 13.01.10 15:20
[OT]
Rein aus Interesse: Um welches (Browser-)Spiel geht es? Hab früher auch verschiedene gespielt, und würd mich mal interessieren, ob ich das kenne :)
[/OT]
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!