Mathematik-Aufgabe
-
Es handelt sich um eine _sehr_ leichte Aufgabe der ExponentialRechnung:
Theorie:
Man nimmt einen Gegenstand aus einer Kühltruhe, dieser ist 6°C warm,
der Raum ist 30°C warm der Temperatur-Unterschied ist immer 4/10 der Differenz
von Warm und Kalt.Funktionsgleichung für das Beispiel:
Temperatur des Gegenstands nach x Minuten:
f(x)=30-24*(4/10)^xAlso nach 3.5 Minuten ist der Gegenstand 29,028548302796273869209939903151 Grad warm
Bis jetzt hab ich in C++ folgenden Ansatzint calculate(float ZTEMP, float GTEMP, float FAKT, int TIMES) { float DIF = 0; if(ZTEMP > GTEMP) DIF = ZTEMP - GTEMP; //Differenz Ermitteln else DIF = GTEMP - ZTEMP; //Differenz Ermitteln float RESULT = 0; //RESULT = DIF * (FAKT^TIMES); //So geht das komischerweise nicht! while(TIMES < 1) //Wie viele Minuten? { --TIMES; //Schleife... DIF = DIF * FAKT; //PotenzialFunktion } RESULT = ZTEMP - DIF; return RESULT; //Ergebnis Ausgeben }Nun habe ich zwei gravierende Probleme,
1:Bis jetzt kenne ich nur GetDlgItemInt, damit kann ich keine Float werte ermitteln, wenn ich GetDlgItemText nehme, kommt nen char raus
Ich hab noch sehr viel Angst vor diesen Unformungen, da diese oft Fehler verursachen (das Programm crasht einfach)
2.Ich kann wegen der Schleife nur gerade Exponenten wählen,
4/10^3,5 geht also garnicht, ich kann also nicht ermitteln wie warm
der Gegenstand nach 3,5 Minuten ist!Ich hoffe ihr habt Rat,
ich beginne grad erst Mathematikaufgaben mit C++ zu lösen,
da es mit Scriptsprachen einfacher ist, weil Exponentialfunktionen
schon implantiert sind und es keine Typumwandlung gibt,
aber sagt jetzt bitte nicht ich soll bei der Scriptsprache bleiben
Der Windows-Taschenrechner muss das ja auch iergendwie schaffen

Grüße
-
zu 1: Da kommst du um Umwandlungen nicht herum (außer du findest eine GetDlgItemDouble()) - sieh mal in der FAQ unter "Einmal Zahl und zurück" nach.
zu 2: potenzieren kannst du mit der Funktion man: pow
-
Listing schrieb:
...
1:Bis jetzt kenne ich nur GetDlgItemInt, ...
2.Ich kann wegen der Schleife nur gerade Exponenten wählen,...Hi,
zu 1.) Ich würde lieber eine Konsolenanwendung schreiben; ist eigentlich viel geeigneter für solche Aufgaben. Da gibt es dann Einlesen via "std::cin >> f;" in einen (letztlich) beliebigen Typ.
zu 2.) Wenn Du keine beliebige Genauigkeit brauchst, kannst Du Deine Formel auch entsprechend umstellen (z.B. intern mit Sekunden ganzzahlig rechnen).Soweit meine Ideen.
BTW: Es ist in C++ üblich, Variablen klein zu schreiben. Mit "komplett Großschreibung" assoziiert der C/C++-Programmierer reflexartig "Präprozessor-Kram" oder "Konstanten". Du machst es uns also leichter mit Variablen wie "dif", "ztemp", ....

Gruß,
Simon2.
-
Ok, vielen Dank schonmal,
hier meine Verbesserung:float calculate(float ZTemp, float GTemp, float Fakt, float Times) { float Dif = 0; if(ZTemp > GTemp) Dif = ZTemp - GTemp; else Dif = GTemp - ZTemp; float Result = 0; Result=powf(Fakt, Times); Dif = Dif * Result; Result = ZTemp - Dif; return Result; }Das scheint zu klappen, compilt mit 0 Warnings, 0 Fehler.
Mein Problem liegt nun hier:
char *ztemp1; char *gtemp1; char *fakt1; char *times1; case BTN_SOLVE: { GetDlgItemText(hWin,EDT_TIMES,times1,100); GetDlgItemText(hWin,EDT_ZTEMP,ztemp1,100); GetDlgItemText(hWin,EDT_GTEMP,gtemp1,100); GetDlgItemText(hWin,EDT_FAKT,fakt1,100); int result = calculate(atoi(ztemp1),atoi(gtemp1),atoi(fakt1),atoi(times1));<-- das Haut nicht hin ;), da atoi mir nur integers liefert
-
Was meinst du, wofür das 'i' in atoi() steht
Für float's nimmt man natürlich atof().
-
Hi,
es gibt auch noch "atof()"
....
Und liefert "calculate()" wirklich ein int zurück ? Und brauchst Du das da ?Gruß,
Simon2.
-
Naja es funktioniert so iergendwie auch nicht:
char *ztemp1; char *gtemp1; char *fakt1; char *times1; ztemp1 = new char[100]; gtemp1 = new char[100]; fakt1 = new char[100]; times1 = new char[100];GetDlgItemText(hWin,EDT_TIMES,times1,100); GetDlgItemText(hWin,EDT_ZTEMP,ztemp1,100); GetDlgItemText(hWin,EDT_GTEMP,gtemp1,100); GetDlgItemText(hWin,EDT_FAKT,fakt1,100); float result1 = calculate(atof(ztemp1),atof(gtemp1),atof(fakt1),atof(times1));SetDlgItemInt(hWin,EDT_RESULT1,result1,1);Das Dialog-Fenster zeigt immer "1" an !?
-
Konvertier das Ergebnis zurück in einen String und schreib den dann mit SetDlgItemText() in dein Edit-Feld.
(oder du denkst über Simon's Vorschlag nach und arbeitest in der Konsole)
-
CStoll schrieb:
Konvertier das Ergebnis zurück in einen String und schreib den dann mit SetDlgItemText() in dein Edit-Feld.
(oder du denkst über Simon's Vorschlag nach und arbeitest in der Konsole)
Naja, das hilft auch nicht weiter, denn:
char *solution; solution = new char[100];sprintf(solution, "%f\0", result1); SetDlgItemText(hWin,EDT_RESULT1,solution);Jetzt wird statt "1", "1.00000" angezeigt

EDIT:
Sorry ich habs, lag an einem Resourcen Fehler, ein Feld hat mir meine ID geklaut :-), Vielen Dank jetzt geht alles!Ich denke das erklärt mir jetzt einiges

-
was sagt der Debugger? Vielleicht sind deine Werte ja so, daß dort gerade 1 herauskomm1.