Seite 1 von 1

Die switch case Anweisung

Verfasst: Sa Okt 04, 2014 7:24 pm
von Ivo
]Hallo an alle, ich habe eine Frage.
Ich möchte ein Menü , das submenu (Untermenü) hat.
ich habe hier etwas aber es ist mir nicht alles klar. Wie soll ich alles definieren?
Ich weiß nicht wie fange ich an, die Konstruktion habe ich aber wie geht es weiter
Wenn mir jemand etwas helfen kann um das zu verstehen.
Wenn die Anweisung nicht verschachtelt ist es ist mir klar aber so wie ich das
geschrieben habe ... Ich hoffe hat sin.

Code: Alles auswählen

#include <stdio.h>

int main()
{
 int .....;
 
 switch(....){
	 case  (1):
		switch (...)
		{
				case (1):...  (1.1); break;
				case (2):..... (1.2); break;
				case (3):.... (1.3); break;
				
		}
		break;
		case (2):
			switch (....) 
			{	
				case (1): .... (2.1); break;
				case (2):.... (2.2); break;
				case (3):....(3.3); break;
				
		}
		break;
		case (3):
			switch (.....)
			{
				case (1):.... (3.1); break;
				case (2):....(3.2); break;
				case (3):.....(3.3); break;
					
		}
		
	 }
	return 0;
}

Re: Die switch case Anweisung

Verfasst: Sa Okt 04, 2014 8:00 pm
von Xin
Ivo hat geschrieben:Hallo an alle, ich habe eine Frage.
Ich möchte ein Menü , das submenu (Untermenü) hat.
ich habe hier etwas aber es ist mir nicht alles klar. Wie soll ich alles definieren?
Ich weiß nicht wie fange ich an, die Konstruktion habe ich aber wie geht es weiter
Wenn mir jemand etwas helfen kann um das zu verstehen.
Beschreib mal genau und konkret was Du tun möchtest.
Ivo hat geschrieben:Wenn die Anweisung nicht verschachtelt ist es ist mir klar aber so wie ich das
geschrieben habe ... Ich hoffe hat sin.
Grundsätzlich ist die Verschachtelung schon so in Ordnung. Ich würde hier erstmal Funktionen nehmen, um Ordnung reinzubringen.

Ansonsten würde ich die Funktionen des Programms durchnummerieren, den Funktionsnummern Namen geben, zum Beispiel mit einem enum und dann eine Steuerfunktion aufrufen, die nur ein Switch-Case beinhaltet. Falls das für Dein Problem passt... dafür müsstest Du halt konkreter werden.

Re: Die switch case Anweisung

Verfasst: So Okt 05, 2014 6:58 pm
von Ivo
Hallo Xin, wie würdest du es nummerieren? Ich versuche aber wie soll ich erste switch definieren? Ich versuche die Schleife zu verstehen. Bsp du hast drei verschiedene Sorte Kaffee, Säfte und Tee. Als einfache Sachen. Keine neue Funktionen will ich noch binden, einfach die Schleife. Danke

Re: Die switch case Anweisung

Verfasst: So Okt 05, 2014 9:42 pm
von Xin
Ivo hat geschrieben:Hallo Xin, wie würdest du es nummerieren? Ich versuche aber wie soll ich erste switch definieren? Ich versuche die Schleife zu verstehen. Bsp du hast drei verschiedene Sorte Kaffee, Säfte und Tee. Als einfache Sachen. Keine neue Funktionen will ich noch binden, einfach die Schleife. Danke
Eine technisch nicht perfekte, aber einfache Möglichkeit. Man kann den Typ auch direkt in die Id kodieren.

Code: Alles auswählen

/* Headerfile */
class Command
{
  enum CommandType { Kaffee, Saft, Tee }

  CommandType Type;
  unsigned int    Id;
  
public:
  Command( CommandType type, unsigned int id ) : Type( type ), Id( id ) {}

  unsigned int GetId() const { return Id; }
  CommandType GetType() const { return Type; }

  static Command const Filterkaffee, Expresso, Cappuccino;
  static Command const Orangensaft, Apfelsaft, Kirschsaft;
  static Command const EarlGrey, Pfefferminz, Kamille;
};

/* .cpp */

Command Command::Filterkaffee( Command::Kaffee, 1 );
Command Command::Expresso( Command::Kaffee, 2 );
Command Command::Cappuccino( Command::Kaffee, 3 );
Command Command::Orangensaft( Command::Saft, 4 );
Command Command::Apfelsaft( Command::Saft, 5 );
Command Command::Kirschsaft( Command::Saft, 6 );
Command Command::EarlGrey( Command::Tee, 7 );
Command Command::Pfefferminz( Command::Tee, 8 );
Command Command::Kamille( Command::Tee, 9 );
Du kannst das Command fragen, was für einen Typ es ist (falls Du das brauchst). Du kannst die Id durchswitchen:

Code: Alles auswählen

void DoCommand( Command command )
{
  switch( command.GetId() )
  {
    case 1: DoFilterKaffee();
    case 2: DoExpresso();
  }
}
Oder

Code: Alles auswählen

void DoCommand( Command command )
{
  switch( command.GetType()
  {
    case Command::Kaffee:
    {
      switch( command.GetId() )
      {
        case 1: DoFilterKaffee();
        case 2: DoExpresso();
        ...
      }
    }
    case Command::Saft:
    {
       ...
    ...
  }
}
Du kannst die Kommandos mit enums durchnummerieren, um mit switch besser lesbar arbeiten zu können. Du kannst auch nur ein Enum nehmen. Ich glaube, C++11 hat jetzt eine schicke Lösung (enum-Klassen), aber da bin ich noch nicht sicher, da ich sie noch nicht genutzt habe.

Re: Die switch case Anweisung

Verfasst: Mo Okt 06, 2014 8:03 am
von mfro
Xin hat geschrieben: ...

Code: Alles auswählen

void DoCommand( Command command )
{
  switch( command.GetId() )
  {
    case 1: DoFilterKaffee();
    case 2: DoExpresso();
  }
}
Zu viel Koffein ist gar nicht gesund ;).

Code: Alles auswählen

break;
vergessen!

Re: Die switch case Anweisung

Verfasst: Mo Okt 06, 2014 10:17 am
von Xin
mfro hat geschrieben:Zu viel Koffein ist gar nicht gesund ;).

Code: Alles auswählen

break;
vergessen!
hehehe, stimmt.


Ich benutze Switch recht selten, weil es in C++ nicht möglich ist, Objekten semantisch eine Identität zu verpassen, die "verswitchbar" ist. Man muss aus dem Objekt immer ein GetId() oder vergleichbares holen, aus dem ein int oder ein enum kommt, das man verwitchen kann, weswegen man zur Lesbarkeit das enum nochmal definieren muss oder die Werte für das Int also Konstante/#define nochmal beschreiben muss.

Re: Die switch case Anweisung

Verfasst: Mo Okt 06, 2014 10:36 am
von cloidnerux
Ich benutze Switch recht selten, weil es in C++ nicht möglich ist, Objekten semantisch eine Identität zu verpassen, die "verswitchbar" ist. Man muss aus dem Objekt immer ein GetId() oder vergleichbares holen, aus dem ein int oder ein enum kommt, das man verwitchen kann, weswegen man zur Lesbarkeit das enum nochmal definieren muss oder die Werte für das Int also Konstante/#define nochmal beschreiben muss.
Macht es nicht sinn im Kontext dieser Aufgabe statt einem Switch eine Datenstruktur mit Callback Handlern zu definieren?
Im Endeffekt geht es hier ja nicht um eine logische Verknüpfung(Mache etwas nur, wenn eine Bedingung wahr ist) sonder eine Funktionelle: Rufe Funktion 2 aus Untergruppe 1 auf.

Statt diese funktionelle Verknüpfung hart zu Programmieren, was generell eine sehr unflexible und Fehleranfällige Lösung ist, wird die Verknüpfung über eine Datenstruktur erzeugt und wird dann nur noch Ausgewertet:

Code: Alles auswählen

vector<vector<void (*)()>> CallbackFunctions;
[...]//init vector
CallbackFunctions[0][0].push_back(MyFunction);   //add functions
[...]
int menuId, subMenuId;
(CallbackFunctions[menuId][subMenuId])();    //Call function

Re: Die switch case Anweisung

Verfasst: Mo Okt 06, 2014 6:19 pm
von mfro
Ich glaub' hier geht's um C, nicht um C++.

Re: Die switch case Anweisung

Verfasst: Di Okt 07, 2014 7:11 pm
von Ivo
Danke für die ausführliche Erklärungen. Ich brauche noch etwas um alles zu verstehen aber es hat mir für meine Aufgabe sehr geholfen. :)