Mikrowelle Praktikum



  • Hallo,

    ich soll für ein Unipraktikum folgenede Aufgabe realisieren:

    Erwärmen eines Tiefkühlgerichts in einer Mikrowelle
    Realisieren Sie eine Klasse Microwave sowie eine Klasse FrozenMeal:
    Microwave
    - power : int
    - volume : int
    - period : double
    + Microwave(int)
    + ~Microwave()
    + morePower() : void
    + lessPower() : void
    + setPeriod(double) : void
    + heatMeal(FrozenMeal) : void
    + getPower() : int
    + getPeriod() : double

    FrozenMeal
    - name : string
    - volume : int
    - temperature : double
    - coeffizient : double
    + FrozenMeal(string, int)
    + ~FrozenMeal()
    + changeTemperature(double) : void
    + getName() : string
    + getVolume() : int
    + getCoeffizient() : double
    + getTemperature() : double

    Besonderheiten der Methoden sind:

    • Durch morePower() und lessPower() soll die Leistung im Bereich von minimal 200 W bis maximal 1000 W in Schritten von 200 W geändert werden.
    • Das Erwärmen eines Gerichtes wird durch folgenden Zusammenhang beschrieben:
      Temperatur = Anfangstemperatur + ( Koeffizient * Leistung * Zeitdauer / Volumen)
    • Als Erwärmungskoeffizient soll der Wert für Wasser verwendet werden: Koeffizient = 0.24 cm3 * Grad / Ws.
    • Achten Sie auf die Einheiten: am einfachsten ist es, wenn Volumen von Mikrowelle und Tiefkühlgericht in cm3 vom Anwendungsprogramm übernommen werden.
    • Beim Erzeugen soll ein Tiefkühlgericht eine Temperatur von -18 Grad haben.
    • Die Destruktoren sollen den Endzustand des jeweiligen Objektes am Bildschirm ausgeben.
    • Keine Methode der beiden Klassen liest irgendwelche Daten von Tastatur ein oder gibt etwas auf den Bildschirm aus. Dafür ist allein das Anwendungsprogramm
      zuständig.

    Realisieren Sie zum Testen Ihrer Klassen ein Anwendungsprogramm, das mit verschiedenen Tiefkühlgerichten und einer geeigneten Mikrowelle die vorhandenen
    Methoden benutzt.

    Bis dato habe ich folgendes Realisiert:

    Microwave.h

    #pragma once
    #include <string>
    #include <iostream>
    #include <cassert>
    using namespace std;
    
    class Microwave
    {
    private:
    	int power;		
    	int volume;		
    	double period;
    
    public:
    	Microwave(int power, int volume);
    	Microwave(Microwave&);
    	~Microwave(void);
    	void morePower(int soMuch);
    	void lessPower(int soMuch);
    	void setPeriod(double );
    	void heatMeal(FrozenMeal);
    	int getPower( ;
    	double getPeriod();
    };
    

    FrozenMeal.h

    #pragma once
    #include <string>
    #include "Microwave.h"
    using namespace std;
    
    class FrozenMeal
    {
    private:
    	string name;
    	int volume;
    	double temperature;
    	double coefficient;
    
    public:
    	FrozenMeal(string name, int volume);
    	FrozenMeal(FrozenMeal&);
    	~FrozenMeal();
    	void changeTemperature(int ct);
    	string getName();
    	int getVolume();
    	int getCoeffizient();
    	int getTemperature();
    };
    

    Microwave.cpp

    #include "Microwave.h"
    
    Microwave::Microwave(int aPower, int aVolume)
    {
    	power = aPower;
    	volume = aVolume;
    	assert ((power >= 200) && (power <= 2000) && (power % 200 == 0));
    }
    
    Microwave::~Microwave(void)
    {
    		<< "Die Mikrowelle hat eine eingestellte Leistung von: " << power << "W" << endl
    
    }
    
    void Microwave::morePower(int soMuch)
    {
    	bool correctInput;
    	correctInput = ((soMuch >= 200) && (power + soMuch <= 2000) && (soMuch % 200 == 0)) ? true : false;
    	correctInput == true ? power += soMuch : soMuch = 0;
    	//cout << (correctInput == false ? "Falsches Paramter" : "");
    	//cout << endl << "Leistung wurde um " << soMuch << " W erhoeht." << endl << endl;
    	assert ((power >= 200) && (power <= 2000) && (power % 200 == 0));
    }
    
    void Microwave::lessPower(int soMuch)
    {
    	bool correctInput;
    	correctInput = ((soMuch >= 200) && (power - soMuch >= 0) && (soMuch % 200 == 0)) ? true : false;
    	correctInput == true ? power -= soMuch : soMuch = 0;
    	//cout << (correctInput == false ? "Falsches Paramter" : "");
    	//cout << endl << "Leistung wurde um " << soMuch << " W vermindert." << endl << endl;
    	assert ((power >= 200) && (power <= 2000) && (power % 200 == 0));
    }
    
    void Microwave::heatMeal()
    {
    
    }
    

    FrozenMeal.cpp

    #include "FrozenMeal.h"
    
    FrozenMeal::FrozenMeal(string aName, int aVolume)
    {
    	name = aName;
    	volume = aVolume;
    	temperature = -18;
    	coeffizient = 0.24*temperature/;
    }
    
    FrozenMeal::FrozenMeal(FrozenMeal& f)
    {
    	name = f.name;
    	volume = f.volume;
    	temperature = l.temperature;
    	coeffizient = l.coeffizient;
    }
    
    FrozenMeal::~FrozenMeal(void)
    {
    	cout << "Folgende FrozenMeal wird vernichtet: "
    		<< "Name: " << name << endl
    		<< "Ladestrom: " << ladestrom << endl
    		<< "Akkumulierte Ladedauer: " << akkumulierteLadedauer << endl
    }
    
    void FrozenMeal::changeTemperature()
    {
    	temperature= temperature + coeffizient * Power* /volume;
    }
    
    void FrozenMeal::getName()
    {
    	cout << "Der Name des Gerichts lautet: " << name;
    }
    
    void FrozenMeal::getVolume() const
    {
    	cout << "Das Volumen des Gerichts: " << name << "betraegt " << volume endl;
    }
    
    void FrozenMeal::getCoeffizient() const
    {
    	cout << "Der Koeffizient des Gerichts: " << name << "betraegt " << volume endl;
    }
    
    void FrozenMeal::getTemperature()
    {
    	cout << "Die TRemperatur des Gerichts: " << name << "betraegt " << volume endl;
    }
    

    Da ich im Moment ehrlich gesagt nciht weiter weiss (ich weiss z.B auch nicht was die "Ws" hinter dem Koeffizenten bzw bei dessen Errechnung bedeuten soll). Ich das Programm aber so noch nicht testen kann, wollte ich mal hier anfragen, ob ich bis hier denn (einigermaßen) korrekt gearbeitet habe?

    Freundliche Grüße und ein nachträgliches Frohes Neues Jahr

    Gunnar



  • Du bist an der Uni und weisst nicht das Ws in obigem Zusammenhang Watt Sekunde bedeutet?

    Ich glaub ich geh ne Runde weinen... Gruß nach Pisa...



  • Erstmal passt deine Implementation nicht zur Aufgabe - morePower() und lessPower() sollen die Leistungsänderung nicht als Paremeter übernehmen, sondern konstant als +/-200W angeben.

    Zweitens: Die Formel zur Berechnung der Endtemperatur ist doch vorgegeben (und Ws = Watt*Sekunde ist nur eine weitere Einheit, die sich letztendlich aus der Formel rauskürzt) - allerdings würde ich bei deinen Vorgaben die neue Temperatur in Microwave::heatMeal() berechnen.



  • Außerdem solltest du die Aufgabenstellung beachten:

    Keine Methode der beiden Klassen liest irgendwelche Daten von Tastatur ein oder gibt etwas auf den Bildschirm aus. Dafür ist allein das Anwendungsprogramm zuständig.

    Also kein "cout" in deinen Klassen-Methoden verwenden!!!

    Bastel dir am besten eine Test-Klasse, welche die ganzen Methoden aufruft und dann die Werte über Tastatur einliest und die Rückgabewerte der Methoden am Bildschirm ausgibt.



  • Okay ich hab nun mal folgende Änderungen:

    FrozenMeal.h

    #pragma once
    #include <string>
    #include "Microwave.h"
    using namespace std;
    
    class FrozenMeal
    {
    private:
    	string name;
    	int volume;
    	double temperature;
    	double coefficient;
    
    public:
    	FrozenMeal(string name, int volume);
    	FrozenMeal(FrozenMeal&);
    	~FrozenMeal();
    	void changeTemperature(int ct);
    	string getName();
    	int getVolume();
    	int getCoeffizient();
    	int getTemperature();
    };
    

    FrozenMeal.cpp

    #include "FrozenMeal.h"
    
    FrozenMeal::FrozenMeal(string aName, int aVolume)
    {
    	name = aName;
    	volume = aVolume;
    	temperature = -18;
    	coeffizient = 0.24*temperature/;
    }
    
    FrozenMeal::FrozenMeal(FrozenMeal& f)
    {
    	name = f.name;
    	volume = f.volume;
    	temperature = l.temperature;
    	coeffizient = l.coeffizient;
    }
    
    FrozenMeal::~FrozenMeal(void)
    {
    }
    
    void FrozenMeal::changeTemperature()
    {
    	temperature= temperature + coeffizient * Power* /volume;
    }
    
    void FrozenMeal::getName()
    {
    	return name;
    }
    
    int FrozenMeal::getVolume() const
    {
    	return volume;
    }
    
    double FrozenMeal::getCoeffizient() const
    {
    	return coeffizient;
    }
    
    void FrozenMeal::getTemperature()
    {
    	return temperature;
    }
    

    Microwave.h

    #pragma once
    #include <string>
    #include <iostream>
    #include <cassert>
    using namespace std;
    
    class Microwave
    {
    private:
    	int power;		
    	int volume;		
    	double period;
    
    public:
    	Microwave(int power, int volume);
    	Microwave(Microwave&);
    	~Microwave(void);
    	void morePower();
    	void lessPower();
    	void setPeriod(double);
    	void heatMeal(FrozenMeal);
    	int getPower( ;
    	double getPeriod();
    };
    

    microwave.cpp

    #include "Microwave.h"
    
    Microwave::Microwave(int aPower)
    {
    	power = aPower;
    	assert ((power >= 200) && (power <= 1000) && (power % 100 == 0));
    }
    
    Microwave::~Microwave(void)
    {
    	cout << "Die Mikrowelle hat eine eingestellte Leistung von: " << power << "W" << endl
    
    }
    
    void Microwave::morePower()
    {
    	if (power <=800)
    		{
    			power=power+200;
    		} 
    }
    
    void Microwave::lessPower()
    {
    	if (power <=400)
    		{
    			power=power-200;
    		} 
    }
    
    void setPeriod()
    {
    
    }
    
    void Microwave::heatMeal()
    {
    
    }
    
    int getPower()
    {
    	return power;
    }
    
    double getPeriod()
    {
    	return period;
    }
    




  • Hach ja, das schöne englische Wort "coeffizient". "so much" is natürlich auch nicht schlecht als Bezeichner.

    Und was bitte soll folgender Code?!

    correctInput = ((soMuch >= 200) && (power + soMuch <= 2000) && (soMuch % 200 == 0)) ? true : false;
    correctInput == true ? power += soMuch : soMuch = 0;
    

    Das ist ja pure Obfuscation.



  • ThaRealMatix schrieb:

    void Microwave::lessPower()
    {
    	if (power <=400)
    		{
    			power=power-200;
    		} 
    }
    
    void Microwave::lessPower()
    {
       power -= 200;
       if (power < 200)
          power = 200;
    }
    

    😉 :xmas2:



  • Tipp: Konstanten



  • FachmannFürMikrowellen schrieb:

    Tipp: Konstanten

    #define POWER_MAX 1000
    #define POWER_MIN 200
    #define POWER_INCREMENT 200
    :xmas2:



  • ähm mal ganz piano... ihr wertft mir jetzt Sachen um die Ohren ohne das mir das wirklich weiterhilft ^^'

    Wieso wäre das von ten besser? Es ist ja zumindest schonmal mehr zeilen code.

    Was hätte ich von define Power_max etc... eine definiertes maximum von power okay. aber ich muss immer noch einen vergleichsoperator benutzen, um zu sehen ob es übertreten wird oder nicht?

    Weiss jemand vielleicht wie ich die heat funktion umsetzen könnte?



  • ThaRealMatix schrieb:

    Wieso wäre das von ten besser?

    weil deine funktion nicht das tut, was du vielleicht glaubst 😉



  • Hm also ich habs nun wie folgt, aber immer noch keine Heat Funktion (ich weiss auch nicht, wozu ich eine change temperature funktion brauche, wenn ich eine heat, also erwärmen funktion habe)

    FrozenMeal.h

    #pragma once
    #include <string>
    #include "Microwave.h"
    using namespace std;
    
    class FrozenMeal
    {
    private:
    	string name;
    	int volume;
    	double temperature;
    	double coefficient;
    
    public:
    	FrozenMeal(string name, int volume);
    	FrozenMeal(FrozenMeal&);
    	~FrozenMeal();
    	void changeTemperature(int ct);
    	string getName();
    	int getVolume();
    	int getCoeffizient();
    	int getTemperature();
    };
    

    FrozenMeal.cpp

    #include "FrozenMeal.h"
    
    FrozenMeal::FrozenMeal(string aName, int aVolume)
    {
    	name = aName;
    	volume = aVolume;
    	temperature = -18;
    	coeffizient = 0.24*temperature/power*period;
    }
    
    FrozenMeal::FrozenMeal(FrozenMeal& f)
    {
    	name = f.name;
    	volume = f.volume;
    	temperature = l.temperature;
    	coeffizient = l.coeffizient;
    }
    
    FrozenMeal::~FrozenMeal(void)
    {
    }
    
    void FrozenMeal::changeTemperature()
    {
    	temperature= temperature + (coeffizient * Power* period/volume);
    }
    
    void FrozenMeal::getName()
    {
    	return name;
    }
    
    int FrozenMeal::getVolume() const
    {
    	return volume;
    }
    
    double FrozenMeal::getCoeffizient() const
    {
    	return coeffizient;
    }
    
    void FrozenMeal::getTemperature()
    {
    	return temperature;
    }
    

    microwave.h

    #pragma once
    #include <string>
    #include <iostream>
    #include <cassert>
    using namespace std;
    
    class Microwave
    {
    private:
    	int power;		
    	int volume;		
    	double period;
    
    public:
    	Microwave(int power, int volume);
    	Microwave(Microwave&);
    	~Microwave(void);
    	void morePower();
    	void lessPower();
    	void setPeriod(double);
    	void heatMeal(FrozenMeal);
    	int getPower( ;
    	double getPeriod();
    };
    

    Microwave.cpp

    #include "Microwave.h"
    
    Microwave::Microwave(int aPower)
    {
    	power = aPower;
    	assert ((power >= 200) && (power <= 1000) && (power % 100 == 0));
    }
    
    Microwave::~Microwave(void)
    {
    	cout << "Die Mikrowelle hat eine eingestellte Leistung von: " << power << "W" << endl
    
    }
    
    void Microwave::morePower()
    {
    	if (power <=800)
    		{
    			power=power+200;
    		} 
    }
    
    void Microwave::lessPower()
    {
       power -= 200;
       if (power < 200)
          power = 200;
    }
    
    void setPeriod()
    {
    
    }
    
    void Microwave::heatMeal()
    {
    
    }
    
    int getPower()
    {
    	return power;
    }
    
    double getPeriod()
    {
    	return period;
    }
    


  • Der Punkt mit der heatMeal() ist ganz einfach - power und period sind Member deiner Mikrowelle, da kommst du von deiner Mahlzeit aus nicht dran (besonders da die Mahlzeit nicht weiß, womit du sie kochen willst). Umgekehrt kann die Mikrowelle aber auch die Anfangstemperatur und den Wärmekoeffizienten des Essens erfragen und dann die Temperatur aktualisieren:

    void FrozenMeal::changeTemperature(double zuwachs)
    { temperature += zuwachs; }
    
    void MicroWave::heatMeal(FrozenMeal& meal)
    {
      //Eventuell benötigst du noch eine Abfrage, ob das Mahl in den Ofen passt
      meal.changeTemperature(meal.getCoefficient()*power*period/meal.getVolume());
    }
    


  • Okay Danke... 🙂

    Das Volumen soll, sowie ich das sehe nicht überprüft werden.

    Hm... ich verstehe nur nicht, wie ich eine main aufbaue. Erhlich gesagt hab ich erst einmal mit Klassen und Co gearbeitet. Dort hatte ich Handy und Ladestation, bei denen ich bei beiden mehrere Objekte hatte. Wenn ich diese Aufgabe richtig verstehe, habe ich aber nur 1 Mikrowelle. Deswegen verstehe ich nicht so ganz wie ich sie aufrufen soll. ganz einfach wie jedes Objekt auch?

    also z.B

    Microwave m1( 400 );
    

    ?

    Und wie bekomme ich die Bezeichner von power und period, die ja in der Microwave.h definiert sind in die ForzenMeal, da brauche ich Sie ja um den Koeffizienten auszugeben?



  • ThaRealMatix schrieb:

    Was hätte ich von define Power_max etc... eine definiertes maximum von power okay. aber ich muss immer noch einen vergleichsoperator benutzen, um zu sehen ob es übertreten wird oder nicht?

    Ja, aber du oder auch ein anderer kann es viel schneller ändern. Und wenn du mal ein größeres Programm hast, indem 100 mal 200 steht und das 30 verschiedene Bedeutungen hat, dann wird es lustig.



  • Mal ein kleines Programmfragment:

    MicroWave mw(400);//Mikrowelle anlegen
    FrozenMeal dinner("Thunfisch",250);//Essen bereitlegen
    
    //Mikrowelle einstellen:
    while(mw.getPower()<1000) mv.morePower();
    mv.setPeriod(25);
    
    //und schließlich - Essen zubereiten:
    mv.heatMeal(dinner);
    

    Aber du scheinst massive Probleme mit den Grundlagen von C++ zu haben - eventuell solltest du mal die vorigen Kapitel deines Leerbuches durcharbeiten 😉



  • Hm sorry ich hatte auch die Aufgabenstellung falsch verstanden. Der Coefficient ist wohl konstant 0.24 und das dahinter nur ein Beispiel, wie e errechnet wurde.

    -.-

    Leider bekomme ich folgende Fehlermeldung beim kompilieren:

    Die Zwischen- und Ausgabedateien für das Projekt "microwave" mit der Konfiguration "Debug|Win32" werden gelöscht.
    Kompilieren...
    FrozenMeal.cpp
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum5\microwave\frozenmeal.cpp(45) : error C2470: "FrozenMeal::getCoefficient": Sieht wie eine Funktionsdefinition aus, es ist aber keine Parameterliste vorhanden; sichtbarer Funktionstext wird übersprungen.
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum5\microwave\frozenmeal.cpp(51) : warning C4244: 'return': Konvertierung von 'double' in 'int', möglicher Datenverlust

    double FrozenMeal::getCoefficient
    {
    	return coefficient;
    }
    

    P.S mit deinem PRogramm läuft es auch nicht 😞



  • d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum5\microwave\frozenmeal.cpp(45) : error C2470: "FrozenMeal::getCoefficient": Sieht wie eine Funktionsdefinition aus, es ist aber keine Parameterliste vorhanden; sichtbarer Funktionstext wird übersprungen.

    Auch wenn die Funktion keine Parameter entgegennehmen soll, mußt du eine (leere) Parameterliste (entweder als () oder als (void) ) bei der Definition angeben.

    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum5\microwave\frozenmeal.cpp(51) : warning C4244: 'return': Konvertierung von 'double' in 'int', möglicher Datenverlust

    [/quote]Welche Methode betrifft das denn? Du hast dort vermutlich (ziemlich sicher) ein double-Element (Gleitkomma-Zahl) als int (Ganzzahl) zurückgegeben.

    PS: Das da oben ist kein Programm, sondern nur ein Ausschnitt, wie du die Klassen verwenden kannst. Das Programm darfst du gerne selber schreiben.

    PPS: Und noch einmal: LERN DIE GRUNDLAGEN VON C++!!



  • Hm... ich weiss ja das ich nachholbedarf habe, aber ich muss diese Aufgaben halt abgeben 😕

    was ich nciht verstehe, ist, dass etwas ziemlich ähnliches, das in einer aufgabe funktionierte, nun nicht mehr zu funktionieren scheint.

    ich hab nun wie flgt abgeändert

    Microwave::Microwave(int aPower, int aVolume)
    {
    	power = aPower;
            volume= aVolume;
    }
    

    ich bekomme nun folgende Fehlermeldung:

    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum5\microwave\microwave.h(26) : error C2061: Syntaxfehler: Bezeichner 'FrozenMeal'

    die header hat den eintrag

    void heatMeal(FrozenMeal);
    


  • Kannst du mal bitte etwas mehr posten als die paar Fragmente? (und häufig liegt der tatsächliche Fehler ein paar Zeilen über der gemeldeten Stelle)

    Mir könnte als Grund nur einfallen, daß der Bezeichner "FrozenMeal" (noch) nicht bekannt ist - entweder du vertauschst die Klassendefinitionen im Header oder du setzt eine Forward-Deklaration class FrozenMeal; vor die MicroWave-Klasse.

    Hm... ich weiss ja das ich nachholbedarf habe, aber ich muss diese Aufgaben halt abgeben 😕

    Dann mußt du halt ein leeres Blatt abgeben und deinem Prof erklären, daß du im Unterricht nicht aufgepasst hast 🕶


Anmelden zum Antworten