Erste Klasse funktioniert. Nur die Schleife nicht wie sie soll
-
Dienstag, 29. Mai 2012 17:19
Hallo
Mein Programm läuft jetzt wie gewünscht, aber meine Schleife noch nicht. Ich möchte, dass das Programm endet wenn ich die Null drücke und das Menü
nicht weiter angezeigt wird. Habe ich überhaupt die richtige Schleife dafür gewählt oder muss ich sie an anderen Stellen setzen?
#include "stdafx.h"
using namespace System;
ref class TV_Klasse
{
Int32 an_aus;
Int32 Programm;
Int32 Ton;
public:
Void init(Int32 zustand);
Void programm(Int32 kanal);
Void ton(Int32 aendern);
Void ausgabe();
};
Void TV_Klasse::init(Int32 zustand)
{
if (zustand != 0)
an_aus = 1;
else
an_aus = 0;
Programm = 1;
Ton = 5;
}
Void TV_Klasse::programm(Int32 kanal)
{
if ((Programm + kanal) > 1)
{
Programm = Programm + kanal - 1;
}
else
{
Programm = Programm - kanal;
}
}
Void TV_Klasse::ton(Int32 aendern)
{
if (aendern > 5)
{
Ton = Ton + aendern - 5;
}
else
{
Ton = Ton - aendern;
}
}
Void TV_Klasse::ausgabe()
{
Console::WriteLine("\n\nDas Gerät hat den Zustand {0} ",an_aus);
Console::WriteLine("Aktives Programm {0}",Programm);
Console::WriteLine("Die Lautsärke ist auf {0} \n\n\n",Ton);
}
int main(array<System::String ^> ^args)
{
TV_Klasse^ tivi;
tivi = gcnew TV_Klasse;
Int32 auswahl, x, z, schleife;
schleife = 0;
Console::WriteLine("Vor dem Einschalten.\n\n");
tivi -> ausgabe();
Console::WriteLine("Gerät einschalten: 1");
Console::WriteLine("Gerät ausschalten: 0\n");
auswahl = Console::Read();
Console::ReadLine();
switch (auswahl)
{
case '1':
x = 1;
tivi -> init(x);
Console::WriteLine("Nach dem Einschalten \n");
tivi ->ausgabe();
while (schleife >= 0)
{
Int32 y;
Console::WriteLine("Was möchten Sie tun?\n");
Console::WriteLine("Programm ändern: 1");
Console::WriteLine("Ton andern: 2");
Console::WriteLine("Gerät ausschalten: 0\n\n");
y = Convert::ToInt32(Console::Read());
Console::ReadLine();
switch (y)
{
case '1':
Int32 kanal, i;
Console::WriteLine("ARD: 1");
Console::WriteLine("ZDF: 2");
Console::WriteLine("NDR: 3");
Console::WriteLine("RTL: 4\n");
/*Console::WriteLine("Ausschalten: 0\n");*/
kanal = Convert::ToInt32(Console::Read());
switch (kanal)
{
case '1':
i = 1;
tivi -> programm(i);
break;
case '2':
i = 2;
tivi -> programm(i);
break;
case '3':
i = 3;
tivi -> programm(i);
break;
case '4':
i = 4;
tivi -> programm(i);
break;
}
break;
case '2':
z = 0;
Console::WriteLine("Um die Lautstärke zu änder eine Zahl eingeben.\n");
z = Convert::ToInt32(Console::ReadLine());
tivi -> ton(z);
break;
case '0':
z = 0;
tivi -> init(z);
break;
default:
Console::WriteLine("Falsche Auswahl.");
}
tivi -> ausgabe();
}/*while(schleife != 0);*/
}
Console::ReadKey();
return 0;
}
Bin für jeden Hinweis dankbar
Gruß
lempy
Alle Antworten
-
Mittwoch, 30. Mai 2012 06:56
Beim kurzen überfliegen: Du hast die Variable "schleife" als 0 initialisiert und änderst sie nichtmehr. Und dann hast du als Schleife:
"while (schleife >= 0)"
Ich denke du solltest hier dann erstmal nur >0 und nicht auch =0 als Bedingung machen und außerdem noch irgendwo einbauen, dass die Variable "schleife" geändert werden kann, sonst ist das einfach ne Endlosschleife und du könntest auch einfach "while(1)" schreiben.
Hoffe das hilft dir.
Btw: Wenn du ein Programm hier im Forum einfügst, nutze den "Codeblock einfügen" button, der behält dann auch Einschübe usw. bei. Erleichtert das Codelesen ungemein.
-
Mittwoch, 30. Mai 2012 15:09
Hallo Stippy19
Hilft auf jeden Fall. Werde ich gleich probieren. Hat leider nicht den Effekt, den ich erwartet habe. Hier mal meine Ausgabe des laufenden Programms.
Vor dem Einschalten.
Das Gerät hat den Zustand 0
Aktives Programm 0 Ausgabe OK
Die Lautsärke ist auf 0
Gerät einschalten: 1
Gerät ausschalten: 0 Ausgabe OK
1
Nach dem Einschalten
Das Gerät hat den Zustand 1
Aktives Programm 1 Ausgabe OK
Die Lautsärke ist auf 5
Was möchten Sie tun?
Programm ändern: 1
Ton andern: 2 Ausgabe OK
Gerät ausschalten: 0
1ARD: 1
ZDF: 2 Ausgabe OK
NDR: 3
RTL: 4
2
Das Gerät hat den Zustand 1
Aktives Programm 2 Ausgabe OK
Die Lautsärke ist auf 5
Was möchten Sie tun?
Programm ändern: 1
Ton andern: 2 Ausgabe OK
Gerät ausschalten: 0
2Um die Lautstärke zu änder eine Zahl eingeben. Ausgabe OK
3
Das Gerät hat den Zustand 1
Aktives Programm 2 Ausgabe OK
Die Lautsärke ist auf 3
Was möchten Sie tun?
Programm ändern: 1
Ton andern: 2 Ausgabe OK
Gerät ausschalten: 0
0
Das Gerät hat den Zustand 0
Aktives Programm 1 Ausgabe OK
Die Lautsärke ist auf 5
Was möchten Sie tun?
Programm ändern: 1
Ton andern: 2 Nein!!!! Hier soll entweder nichts stehen oder Auswahlmenü
Gerät ausschalten: 0 Gerät einschalten: 1
Gerät ausschalten: 0
erscheinen.
Wie kann ich das erreichen?
Lieben Dank
lempy
- Bearbeitet lempy Mittwoch, 30. Mai 2012 16:42
-
Donnerstag, 31. Mai 2012 12:25
Poste bitte nochmal den geänderten Code (und dann mit der Codeblock Funktion des Forums zur besseren Lesbarkeit). Es sind ein paar Sachen drin, die mir gerade komisch platziert vorkommen, jedoch kann ich das nur schlecht prüfen, wenn die Einrückungen fehlen.
-
Donnerstag, 31. Mai 2012 15:49
Hey Stippy19
Hey Stipp19
Hier noch mal der Code mit Anmerkungen.
#include "stdafx.h" using namespace System; ref class TV_Klasse // Klasendefinition { Int32 an_aus; // Klassenelemente Int32 Programm; Int32 Ton; public: Void init(Int32 zustand); // Methoden der Klasse (Bekanntmachung) Void setprogramm(Int32 kanal); Void setton(Int32 aendern); Void ausgabe(); }; Void TV_Klasse::init(Int32 zustand) //Methode zur Initialisierung { if (zustand != 0) an_aus = 1; else an_aus = 0; Programm = 1; Ton = 5; } Void TV_Klasse::setprogramm(Int32 kanal) // Methode zum Programm ändern { Programm = kanal; } Void TV_Klasse::setton(Int32 aendern) // Methode um Ton zu ändern { Ton = aendern; } Void TV_Klasse::ausgabe() //Methode für die Ausgabe der Veränderung { Console::WriteLine("\n\nDas Gerät hat den Zustand {0} ",an_aus); Console::WriteLine("Aktives Programm {0}",Programm); Console::WriteLine("Die Lautsärke ist auf {0} \n\n\n",Ton); } int main(array<System::String ^> ^args) { TV_Klasse^ tivi; tivi = gcnew TV_Klasse; Int32 auswahl, x, z; Int32 y = 0; Console::WriteLine("Vor dem Einschalten.\n\n"); // Erster Aufruf der Methode Ausgabe tivi -> ausgabe(); // um an zu zeigen das Gerät aus ist. Console::WriteLine("Gerät einschalten: 1"); // Einschalten des Gerätes Console::WriteLine("Gerät ausschalten: 0\n"); // Ausschalten des Gerätes auswahl = Console::Read(); Console::ReadLine(); switch (auswahl) { case '1': // Case-Zweig zum 1 Einschalten, da nur dann Änderungen möglich x = 1; tivi -> init(x); // Veränderung bei an_aus Console::WriteLine("Nach dem Einschalten \n"); tivi ->ausgabe(); // Ausgabe zeigt Änderungsstatus auf Eingeschaltet while (y != 3) // Beginn der Schleife für die Auswahl zum Ton oder Programm ändern { // Mit Null funktioniert die darauf folgenden Abfragen nicht. Console::WriteLine("Was möchten Sie tun?\n"); Console::WriteLine("Programm ändern: 1"); Console::WriteLine("Ton andern: 2"); Console::WriteLine("Gerät ausschalten: 0\n\n"); //Hier soll das Programm anders Funktionieren y = Convert::ToInt32(Console::Read()); // Erläuterung bei Bildschirmausgbe Console::ReadLine(); switch (y) // Programm ändern { case '1': Int32 kanal, i; Console::WriteLine("ARD: 1"); // Auswahl der Kanäle Console::WriteLine("ZDF: 2"); Console::WriteLine("NDR: 3"); Console::WriteLine("RTL: 4\n"); kanal = Convert::ToInt32(Console::Read()); Console::ReadLine(); switch (kanal) // Die Auswertungen der Kanalauswahl { // damit Methode setprogramm auch case '1': // nach dem eingegebenen Kanal umschaltet i = 1; tivi -> setprogramm(i); break; case '2': i = 2; tivi -> setprogramm(i); break; case '3': i = 3; tivi -> setprogramm(i); break; case '4': i = 4; tivi -> setprogramm(i); break; } // Kanal Auswahl ende break; // stop von Kanal Auswahl case '2': // Hir beginnt Zweit Ton ändern im Auswahlmenü nach Wihle z = 0; Console::WriteLine("Um die Lautstärke zu änder eine Zahl eingeben.\n"); z = Convert::ToInt32(Console::ReadLine()); tivi -> setton(z); // damit Methode setton geändert wird break; case '0': // Hier wird ein_aus zwar auf Null gesetzt // aber Programm nicht beendet z = 0; tivi -> init(z); break; default: Console::WriteLine("Falsche Auswahl."); } tivi -> ausgabe(); // Ausgabe nach Änderungen oder Änderung } } Console::ReadKey(); return 0; }Noch einmal die Ausgabe.
Vor dem Einschalten. // Ausgabe vor dem Einschalten
Das Gerät hat den Zustand 0 // OK
Aktives Programm 0
Die Lautsärke ist auf 0
Gerät einschalten: 1 // OK
Gerät ausschalten: 0
1Nach dem Einschalten // Diese Ausgabe ist OK
Das Gerät hat den Zustand 1
Aktives Programm 1
Die Lautsärke ist auf 5
Was möchten Sie tun? // OK
Programm ändern: 1 // Das Auswahlmenü soll solange erscheinen bis die Null gedrückt wird
Ton andern: 2
Gerät ausschalten: 0
1ARD: 1 // Auswahlmenü für die Kanäle
ZDF: 2
NDR: 3
RTL: 4
4
Das Gerät hat den Zustand 1 // Ausgabe ist OK
Aktives Programm 4
Die Lautsärke ist auf 5
Was möchten Sie tun? // Noch immer im "Ändernmenü ist OK
Programm ändern: 1
Ton andern: 2
Gerät ausschalten: 0
2
Um die Lautstärke zu änder eine Zahl eingeben.
6
Das Gerät hat den Zustand 1 // Ausgabe ist OK
Aktives Programm 4
Die Lautsärke ist auf 6
Was möchten Sie tun? // Noch immer im Ändernmenü, weil noch nicht Null gedrückt
Programm ändern: 1
Ton andern: 2
Gerät ausschalten: 0
0
Das Gerät hat den Zustand 0 // Die Kontrollausgabe für Geräte Zustand ist OK
Aktives Programm 1
Die Lautsärke ist auf 5
Was möchten Sie tun? // Hier soll das Programm beendet werden. Entweder "rausspringen" oder besser noch wieder Menü Einschalten anzeigen.
Programm ändern: 1
Ton andern: 2
Gerät ausschalten: 0
Lieben Dank
lempy
-
Freitag, 1. Juni 2012 07:47
Also, ich schreib einfach mal auf, was mir so auffällt, bzw was ich denke was fehlt.
1. Dein "switch(auswahl)" hat nur "case 1:" aber kein "case 2:" oder mehr. Ich persönlich löse eine Ja/Nein bzw. eine 1/0 Entscheidung immer mit "if(auswahl == 1)" oder kurz auch nur "if(auswahl)" statt mit switch-case, weil ein Programmierer sonst immer noch weitere Fälle sucht, die es aber nicht gibt. Bin nicht sicher, ob das besserer Programmierstil ist, ich persönlich finds schöner =) Deins funktioniert aber auch so, von dem her...
Du könntest aber im Falle des 0-Drückens, also des Nicht-Einschaltens, direkt das Programm beenden lassen. Sonst wäre die Abfrage ein bisschen sinnlos (falls du das nicht in einem größeren implementiert hast).
2. Bei "case 0:", also wenn du das Programm beenden möchtest: Du änderst zwar "an_aus", aber das hat keinerlei Auswirkungen. Du musst entweder in der Funktion "init(int32 zustand)" sowas schreiben:if (zustand != 0) an_aus = 1; else { an_aus = 0; exit(); }Also das "exit();" einfügen (bin nicht 100%ifg sicher, das die Schreibweise stimmt, aber der Gedanke schon^^), oder die while-Schleife die du hast so anpassen, dass sie automatisch nicht mehr erfüllt ist und dadurch endet, z.B. "while (y != 3)" zu "while (y != 3 && z != 0)". Dafür musst du dann aber dafür sorgen, das "z" nur fürs Ausschalten verwendet wird und nicht noch für die Lautstärke.
Bei der if-else Anweisung ist mir aufgefallen, dass du keine Klammern gesetzt hast. Das bedeutet dann immer, dass NUR der nächste Befehl bedingungsabhängig ausgeführt wird. Also bei
if(X)
tue etwas1
tue etwas2
wird etwas1 nur ausgeführt, wenn X erfüllt ist, ertwas2 jedoch immer. Wenn du mehrere Anweisungen an die Bedingung knüpfen willst, musst di "{ }" einsetzen.
Also:
if(X)
{
tue etwas1
tue etwas2
}Genauso verhält es sich bei else. Deswegen wird bei der "init(int32 zustand" Funktion Ton und Programm immer gesetzt, egal ob an_aus 1 oder 0 ist.
Weiß nicht ob das so gewollt war, aber deine Einrückungen lassen darauf schließen, dass du Klammern wolltest.
Hoffe das hilft dir schonmal.
-
Freitag, 1. Juni 2012 17:03
Hallo
Recht lieben Dank für Deine Anmerkungen. Werde mich dran setzen und Deine Hinweise erarbeiten. Melde mich dann wieder.
Schönes Wochenende
lempy
- Als Antwort markiert lempy Mittwoch, 6. Juni 2012 16:25
-
Mittwoch, 6. Juni 2012 16:38
Hallo
Mit einer "Label und Goto-Anweisung" hat es dann endlich geklappt. Zwar nicht super und man sollte es meiden, aber war die einzige Möglichkeit den Ablauf
so zu gestalten, wie ich in haben wollte.
lempy
- Als Antwort markiert lempy Mittwoch, 6. Juni 2012 16:38

