Meine erste Klasse läuft nur mit Schleife Probleme



  • Hallo Leute

    Mein Programm läuft nun so, wie ich es mir vorstelle. Nur die Schleife ist irgendwie missglückt. Habe ich sie an den falschen Stellen gesetzt oder die falsche Schleife gewählt?

    Bin für jeden Hinweis dankbar.

    [cli]#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 👍
    {
    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;
    }

    Gruß

    champman



  • Das ist die lesbare Version
    So erkennt man auch Klammerpaare besser:

    #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; 
                    }
    
                //Ich glaube, die Schleife sollte hier enden, oder?
                }
    
            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(); 
    
        // Wozu das denn? Es gingen doch schon alle Klammern zu
        //}/*while(schleife != 0);*/ 
        //} 
    
        Console::ReadKey(); 
        return 0; 
    }
    

    Allerdings werde ich aus dem Code nicht schlau,
    was bewirkt der 😕 und
    was für Fehlermeldungen kamen?

    Ich hoffe, ich hab das falsch gesetzte Klammerpaar richtig interpretiert...



  • Ich glaub die Schleife soll da nicht enden. Und ich denke auch, dass genau das dann das Problem ist: die ganzen breaks, da erkenn ich jetzt nicht, ob das nun die Schleife oder nur die switch-Anweisung gebreaked (was fürn Wort) werden soll. In der Schleife das switch beenden wird etwas schwerer



  • In einer Schleife kann man ja mit break; auch die Schleife beenden,
    woher soll ich das wissen 😕



  • #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;
                            }// 3. Switch is zu ende 
    
                        break;// Case 1 ist zu ende
    
                    } // 2. Switch is zu ende 
    
                } //Ich glaube, die Schleife sollte hier enden, oder? 
    
            break;//Damit is Case 1 zu ende 
    
            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."); 
    
        } // 1. Switch is zu ende 
        tivi -> ausgabe(); 
    
    /* Das kann man vergessen
        // Wozu das denn? Es gingen doch schon alle Klammern zu 
        //}/*while(schleife != 0);*/ 
        //} 
    */
    
        Console::ReadKey(); 
        return 0; 
    }
    

    @champman:

    Kommentier das Ganze bitte aus, sag uns was genau missglückt is
    und meld dich wieder, ok?
    Ich check den Code überhaupt nicht.

    Weißt du in 4 Monaten noch, was das Ganze bewirken soll??



  • Hey virusscript24!

    Nein, die Schleife soll schon dort enden, wo ich die Klammer gesetzt habe. Setze ich sie dort, wo Du sie mit grün interpretiert hast, dann will das Programm ständig auch den Ton ändern.

    Ich möchte es so, das nur die drei Abfragen als Wiederholung dort auftauchen aber
    das Programm beim eingeben von Null 1. Den Zustand ein auf aus schaltet und
    2. Das Programm beendet oder die erste Abfrage Einschalten oder Ausschalten erscheint. 😕

    Mein Gedanke geht von einer wirklichen Fernbedienung aus. Die Fragt auch nicht Ständig danach den Ton zu ändern und wenn man Power drückt, dann ist der Fernseher entweder an oder aus.

    Gruß und lieben Dank
    champman



  • Oh, sry, aber ich bin aus dem Quelltext nicht schlau geworden...
    Tut mir leid, aber könntest du bitte das ganze kommentieren & uns die Fehler erklären?
    Ich wäre dir sehr dankbar



  • Hallo

    Natürlich! mach ich glatt. Zusätzlich die Bildschirmausgabe.

    #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
    		{						
    			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;
    }
    

    Jetzt die Ausgabe:

    Vor dem Einschalten. (Dies Ausgabe ist OK)

    Das Gerät hat den Zustand 0
    Aktives Programm 0
    Die Lautsärke ist auf 0

    Gerät einschalten: 1 (Das ist OK)
    Gerät ausschalten: 0

    1

    Nach dem Einschalten ( Auch 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
    Ton andern: 2
    Gerät ausschalten: 0

    1

    ARD: 1 ( Immer noch OK )
    ZDF: 2
    NDR: 3
    RTL: 4

    2

    Das Gerät hat den Zustand 1 ( Ausgabe OK )
    Aktives Programm 2
    Die Lautsärke ist auf 5

    Was möchten Sie tun? ( Ist auch OK)

    Programm ändern: 1
    Ton andern: 2
    Gerät ausschalten: 0

    2

    Um die Lautstärke zu änder eine Zahl eingeben. (Wieder OK)

    3

    Das Gerät hat den Zustand 1 (Diese Ausgabe ist auch OK)
    Aktives Programm 2
    Die Lautsärke ist auf 3

    Was möchten Sie tun? (Nochmal OK, weil noch nicht ausgeschaltet)

    Programm ändern: 1
    Ton andern: 2
    Gerät ausschalten: 0

    0

    Das Gerät hat den Zustand 0 (Als Kontrollausgabe OK)
    Aktives Programm 1
    Die Lautsärke ist auf 5

    Was möchten Sie tun? ( Nicht mehr OK )

    Programm ändern: 1 ( Hier möchte ich entweder dass das Programm )
    Ton andern: 2 ( schließt oder das Menü zum Ein und Ausschalten )
    Gerät ausschalten: 0 ( wieder erscheint. z. B. 0 = ende oder so

    Hoffe das es jetzt verständlicher ist und Du mein Problem besser verstehst.

    Herzlichen Dank

    champman



  • champman schrieb:

    Was möchten Sie tun? ( Nicht mehr OK )

    Programm ändern: 1 ( Hier möchte ich entweder dass das Programm )
    Ton andern: 2 ( schließt oder das Menü zum Ein und Ausschalten )
    Gerät ausschalten: 0 ( wieder erscheint. z. B. 0 = ende oder so

    Wenn ich das richtig verstehe, willst du an dieser Stelle
    entweder zum Programmende oder zum ein-/ausschalte menü kommen.

    Das könntest du mit goto machen. Manchmal ganz praktisch,
    aber sehr sparsam einsetzen.

    int main(){
    while(blabla){
        if(blabla){
            goto ende; // Um zum Ende zu Springen
        }
    }
    
    getchar();
    ende:             // Um Sprungmarke zu setzen
    
    return 0;
    }
    

    Ich hoffe, das war das was du gesucht hast...

    Lg virusscript24



  • Hey virusscrip24

    Habe es mit "Label und goto" hinbekommen. Ist zwar nicht die eleganteste Lösung, aber funktioniert zu mindest.

    Großen Dank
    champman



  • Was der Code macht, weiß ich jetzt, aber ich versteh nicht, was das bringen soll 😕

    Hat das Ganze nen Konsolenoutput oder Winforms?



  • Hey

    Nein, war eher als Hinweis was in mir so gedacht habe.

    lempy


Anmelden zum Antworten