Zum Inhalt springen

Este Klasse!! Was mache ich falsch und was habe ich nicht verstanden?


lempy

Empfohlene Beiträge

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von lempy
Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...