Die switch case Anweisung

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Ivo
Beiträge: 26
Registriert: Fr Sep 26, 2014 3:54 pm

Die switch case Anweisung

Beitrag von Ivo » Sa Okt 04, 2014 7:24 pm

]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;
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Die switch case Anweisung

Beitrag von Xin » Sa Okt 04, 2014 8:00 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ivo
Beiträge: 26
Registriert: Fr Sep 26, 2014 3:54 pm

Re: Die switch case Anweisung

Beitrag von Ivo » So Okt 05, 2014 6:58 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Die switch case Anweisung

Beitrag von Xin » So Okt 05, 2014 9:42 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Die switch case Anweisung

Beitrag von mfro » Mo Okt 06, 2014 8:03 am

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!
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Die switch case Anweisung

Beitrag von Xin » Mo Okt 06, 2014 10:17 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Die switch case Anweisung

Beitrag von cloidnerux » Mo Okt 06, 2014 10:36 am

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Die switch case Anweisung

Beitrag von mfro » Mo Okt 06, 2014 6:19 pm

Ich glaub' hier geht's um C, nicht um C++.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Ivo
Beiträge: 26
Registriert: Fr Sep 26, 2014 3:54 pm

Re: Die switch case Anweisung

Beitrag von Ivo » Di Okt 07, 2014 7:11 pm

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. :)

Antworten