lempy Geschrieben 21. Mai 2012 Teilen Geschrieben 21. Mai 2012 Hallo, ich mal wieder Ich soll ein Programm entwickeln in dem ich ein Fernsehgerät mindestens einmal einschalte und nur im eingeschalteten Zustand das Programm und die Lautstärke ändern kann. Der jeweilige Zustand soll in der "Funktion?" ausgabe() ausgegeben werden. Mein Programm sieht bis jetzt so aus, ist aber nur ein erster Gehversuch. #include "stdafx.h" using namespace System; ref class TV_klasse { Int32 ein_aus; Int32 programm; Int32 ton; TV_klasse^ tivi; public: //Void init(Int32 zustand); //Void ein_aus(Int32 zustand); Void programmaendern(Int32 waehlen); Void lautstaerke(Int32 aendern); Void ausgabe(); }; //Void TV_klasse::init(Int32 zustand) //{ // ein_aus = zustand; //} Void TV_klasse::programmaendern(Int32 waehlen) { Console::WriteLine("Das Programm ändern."); } Void TV_klasse::lautstaerke(Int32 aendern) { Console::WriteLine("Die Lautstärke ändern."); } Void TV_klasse::ausgabe() { Int32 aendern; Console::WriteLine("Gerät ist eingeschaltet.\n\n\n\n"); Console::WriteLine("Was möchten Sie ändern?\n\n"); Console::WriteLine("Gerät ausschalten: 0\n"); Console::WriteLine("Programm: 2\n"); Console::WriteLine("Lautstärke: 3\n"); aendern = Console::Read(); switch (aendern) { case '2': tivi -> programmaendern(programm); break; case '3': tivi -> lautstaerke(ton); break; case '0': Console::WriteLine("Das Gerät ist ausgeschaltet worden."); break; default: Console::WriteLine("Falsche Taste gedrückt."); } } n "main" rufen ich in dem Case-Zweig die "Funktion" ausgabe auf, um das nächste Auswahlmenüh zu erhalten. Das klappt. Nur, wenn ich dann die 2 wähle um das Programm zu ändern springt es raus und zeigt mir wieder meinen geschriebenen Code an. Also nicht die Funktion zum Ändern des Programms. Aufgaben Hinweise sind folgende: Eigenschaften: Lautstärke, Programm und ein- bzw. ausgeschaltet Alle drei Eigenschaften sollen geändert werden können. 1. Änder von Programm und Lautstärke nur dann möglich, wenn Gerät eingeschaltet ist. 2. Gerät mindestens einmal einschalten umd Programm und Lautstärke zu ändern. Dan Gerät wieder ausschalten. 3. Änderung des aktuellen Zustandes auf dem Bildschirm ausgeben 4. Instand auf dem verwalteten Heap erstellen (Bei mir in main TV) 5. Nur über die Methoden ("Funktionen") der klasse auf die Attribute zugreifen. Auch bei der Ausgabe der Werte. Genau dass schien ich nicht zu verstehen. Denke ich zumindest. Warum ruft mein Programm nicht die Methode Programmaendern auf, sonder bricht ab? Kann ich in den Methoden wie in den vor Programmen der Structuren arbeiten. Mit Hilfshandle usw.? Wie würde das mit "get" und "set" funktionieren? Habe ich nicht so ganz verstanden. Ach so Kapselung, Vererbung und was noch kommen mag war noch nicht. Das letzte im Heft war die Instanz, also quasi Klasse in Form von Strukturen? Kann man das so ausdrücken? Bin für Eure Hilfestellung sehr dankbar lieber Gruß lempy int main(array<System::String ^> ^args) { TV_klasse^ TV; TV = gcnew TV_klasse; Int32 auswahl; Console::WriteLine(" Einschalten: 1"); Console::WriteLine("\n Ausschlaten: 0"); auswahl = Console::Read(); switch(auswahl) { case '1': //TV -> ein_aus(); TV -> ausgabe(); //Console::WriteLine("Test"); break; case '0': //TV -> ein_aus(); Console::WriteLine("TV ist aus"); break; default: Console::WriteLine("Sie haben die falsche Taste gedrückt"); } Console::ReadKey(); return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thelvan Geschrieben 21. Mai 2012 Teilen Geschrieben 21. Mai 2012 Deine Methode zum ändern des Programms macht ja auch nix mit dem Parameter. Und du übergibst sowieso den aktuellen Wert. Der Benutzer wird gefragt, was er ändern will, aber nicht auf welchen Wert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Mai 2012 Teilen Geschrieben 21. Mai 2012 Deine Klasse enthält aus unerfindlichen Gründen einen Verweis auf dieselbe Klasse, namens tivi. Dieser Objektverweis wird nirgends initialisiert, daher bewirkt der Zugriff darauf in der Methode ausgabe, dass dein Programm mit einer NullReferenceException aussteigt. Dieses tivi brauchst du nicht, wirf es raus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lempy Geschrieben 21. Mai 2012 Autor Teilen Geschrieben 21. Mai 2012 Lieben Dank. "tivi" raus. OK funktioniert auch ohne. Mein Problem besteht aber immer noch. Wenn ich in dem Auswahlmenüh die 2 wähle, dann springt das Programm raus. Ruft also nicht die Methode (Funktion) Programmaendern auf. Habe die Methode Programmaendern so aufgebaut: Void TV_klasse::programmaendern(Int32 waehlen) (Programmaendern(Int32 waehlen) { Console::WriteLine("Das Programm ändern.\n\n"); Console::WriteLine("ARD: 1\n"); Console::WriteLine("ZDF: 2\n"); Console::WriteLine("NDR: 3\n"); Console::WriteLine("RTL: 4\n"); waehlen = Console::Read(); switch (waehlen) { case '1': Console::WriteLine("Sie sehen jetzt ARD."); break; case '2': Console::WriteLine("Sie sehen jetzt ZDF."); break; case '3': Console::WriteLine("Sie sehen jetzt NDR."); break; case '4': Console::WriteLine("Sie sehen jetzt RTL."); default: Console::WriteLine("Falsche Auswahl."); break; } } Ungefär so sollte die Auswahl aussehen, aber ich denke es würde eher funktonieren wenn ich den Aufruf so schreiben würde "programmaendern(2)" die zwei würde dann für ARD oder so stehen. Nur so würde ich die Zahl ja nicht eingeben können, weil sie ja im Programm schon vorgegeben ist. Wie würde das ganze mit "get" und "set" aussehen? Könnte man damit eine Auswahl für Tastatureingabe aufbauen? Habe dazu noch nichts verständliches gefunden. Oder muss ich mir etwas ausdenken, wo ich das ganze über "main" steuern kann? Mit Auswahlmenü würde ich das ganze für mich irgendwie sinnvoller laufen. Lieben Dank und Gruß lempy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Mai 2012 Teilen Geschrieben 21. Mai 2012 Lass die Sendernamen weg, die machen es nur unnötig kompliziert, arbeite erst einmal mit Programmnummern. In der Ausgabemethode soll der aktuelle Zustand ausgegeben werden, sonst nichts. Da soll nichts eingelesen und schon gar nicht geändert werden. Grundsätzlich haben Eingaben nichts in den Klassenmethoden verloren. Sowohl das Einlesen dessen, was gemacht werden soll, als auch des neue Wertes, sollten außerhalb der Klasse (also in main) stattfinden. Für die drei Werte braucht deine Klasse noch Getter-Methoden, denn du sollst in der Ausgabemethode ja nicht direkt auf die Member zugreifen, sondern Methoden benutzen. Was das Absturzproblem angeht, müsstest du den aktuellen Code zeigen. Da hat sich ja offenbar einiges geändert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lempy Geschrieben 22. Mai 2012 Autor Teilen Geschrieben 22. Mai 2012 (bearbeitet) Hallo Das war doch mal eine ganz große Hilfe!! Also wenn möglich alles in main schreiben und ändern, so das die Ausgabe nur noch die Änderungen anzeigt. Programm ist im Grunde noch so geblieben, aber werde heute Abend daran arbeiten und hoffe, das ich morgen Abend eine andere "Version" fertig habe. Aber erst nach der Schule. Ist es generell so, dass man in Klassen diese Änderungen und Eingaben in main verfasst? Oder ist zu Anfang nur leichter zu lernen? Danke lempy Bearbeitet 22. Mai 2012 von lempy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 22. Mai 2012 Teilen Geschrieben 22. Mai 2012 Sowohl das Einlesen dessen, was gemacht werden soll, als auch des neue Wertes, sollten außerhalb der Klasse (also in main) stattfinden. Also wenn möglich alles in main schreiben und ändern, so das die Ausgabe nur noch die Änderungen Nein. So war es sicher nicht von Klotzkopp gemeint;) In der Regel ist es so, das man Klassen nach Aufgaben aufsplittet: Du hast Deine Klasse Fernseher, die die Methoden "Einschalten", "Ausschalten" etc. pp. besitzt. Diese Klasse wird von aussen bedient. In so einer "kleinen" Anwendung wie Deiner kann man das in die Main-Funktion packen - was auch gemeint war. Allerdings werden bei komplexeren Programmen auch die Designs komplexer: Dann hast Du eine Klasse die die Kommunikation zwischen Benutzer und Fernseher steuert, so daß die "Eingaben" von dort kommen und nicht aus einer Main-Funktion. Btw. guck mal in der Doku zu C++. Da gibt es einen wunderbaren Datentyp: enum. Der eignet sich prima dazu, sprechende Werte zu entwickeln á la enum Zustand{ An, Aus} ... Zustand Zustand_des_Fernsehers; Zustand_des_Fernsehers=Aus; [/php] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lempy Geschrieben 23. Mai 2012 Autor Teilen Geschrieben 23. Mai 2012 Hey!! Bin leider noch nicht zur Änderung gekommen, aber den enum-Hinweis finde ich super. Melde mich dann wieder, wenn ich Programm geändert habe. Hoffe ja, dass ich das ganze nachher besser verstehe, wenn es tiefer in den Bereich der Klassen geht. lieben Dank lempy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lempy Geschrieben 24. Mai 2012 Autor Teilen Geschrieben 24. Mai 2012 Hallo Glaube es so auch geschafft zu haben. Währe nett, wenn Ihr mich informiert, wenn die Anforderungen nicht korrekt sind. // Test.cpp: Hauptprojektdatei. #include "stdafx.h" using namespace System; ref class TV_Klasse { Int32 an_aus; Int32 programm; Int32 ton; public: Void init(Int32 zustand); Void Kanal(Int32 waehlen); Void lautstaerke(Int32 aendern); Void ausgabe(); }; Void TV_Klasse::ausgabe() { //TV_Klasse::init(); Console::WriteLine("\n\nDas Gerät hat den Zustand {0}\n ",an_aus); Console::WriteLine("Aktives Programm {0}\n",programm); Console::WriteLine("Die Lautsärke ist auf {0} \n\n\n",ton); } Void TV_Klasse::init(Int32 zustand) { an_aus = 1; programm = 1; ton = 5; } Void TV_Klasse::Kanal(Int32 waehlen) { //programm = waehlen; //Int32 i; if ((programm + waehlen) > 1) { programm = programm + waehlen - 1; } else { programm = programm - waehlen; } } Void TV_Klasse::lautstaerke(Int32 aendern) { if ((ton + aendern) > 5) { ton = ton + aendern - 5; } else { ton = ton - aendern; } } int main(array<System::String ^> ^args) { TV_Klasse^ tivi; tivi = gcnew TV_Klasse; Int32 auswahl; Console::WriteLine("Vor dem Einschalten.\n\n"); tivi -> ausgabe(); Console::WriteLine("Gerät einschalten: 1\n"); Console::WriteLine("Gerät ausschalten: 0\n"); auswahl = Console::Read(); Console::WriteLine("\n\nNach dem Einschalten \n"); switch(auswahl) { case '1': tivi -> init(1); tivi ->ausgabe(); Console::WriteLine("\n\nJetzt wird das Progamm geändert\n\n"); tivi -> Kanal(3); tivi -> ausgabe(); Console::WriteLine("\n\nJetzt der Ton"); tivi -> lautstaerke(9); tivi -> ausgabe(); break; case '0': Console::WriteLine("Das Gerät ist ausgeschlatet"); break; default: Console::WriteLine("Falsche Taste gewählt"); } Console::ReadKey(); return 0; } lieben Dank lempy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.