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)^x

    Also nach 3.5 Minuten ist der Gegenstand 29,028548302796273869209939903151 Grad warm
    Bis jetzt hab ich in C++ folgenden Ansatz

    int 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.


Anmelden zum Antworten