Befehl "case"



  • Guten Abend

    ich habe hier ein frage zu dem befehl Case. kann man darin mehrere Regeln einfügen? z.B.
    schreib ein c++ programm, welches dir bei der note 90-100 "sehr gut" schreibt
    bei 80-89 gut bei 70-79 befriedigend usw.

    hier mein erster ansatz. aber leider klappt es nicht.
    ich benutze visual basic 6.0

    # include <iostream.h>
    void main ()
    {   int x;
    cin >> x;
    switch (x)
    {case (x>=90) : cout << "sehr gut";
    break ;
    case (x>=80 && x<90) : cout << "gut";
    	break;
    case ( x>=70 && x<80) : cout << "befriedigend";
    	break;
    default : cout <<"failed";
    }
    }
    


  • Mohamedyarub schrieb:

    ich habe hier ein frage zu dem befehl Case. kann man darin mehrere Regeln einfügen?

    Es gibt keinen case-Befehl, du meinst die switch-Anweisung. Ja, dort kann man mehrere case-Zweige angeben. Das sind aber keine Regeln.

    z.B.
    schreib ein c++ programm, welches dir bei der note 90-100 "sehr gut" schreibt
    bei 80-89 gut bei 70-79 befriedigend usw.

    Würde ich mit einer if-else-Kette machen:

    if (note >= 90 && note <= 100) ...
    else if (note >= 80 && note <= 89) ...
    else usw....
    

    ich benutze visual basic 6.0

    Schön für dich, was tut das zur Sache? Ein Ratespiel, du benutzt also vermutlich auch Visual C++ 6.0?

    Zu deinem Code:

    # include <iostream.h> // <- <iostream> heißt das heutzutage
                                 // using namespace std; wär auch nicht schlecht für cout usw.
    void main ()                 // int main() bitte
    {   int x;
    cin >> x;
    switch (x)
    {case (x>=90) : cout << "sehr gut"; // case-Labels müssen Konstanten sein, also z.B. case 90:
    break ;
    case (x>=80 && x<90) : cout << "gut";
    	break;
    case ( x>=70 && x<80) : cout << "befriedigend";
    	break;
    default : cout <<"failed";
    }
    }
    


  • erst einmal vielen dank für deine schnelle antwort

    ich benutze visual basic 6.0

    Schön für dich, was tut das zur Sache? Ein Ratespiel, du benutzt also vermutlich auch Visual C++ 6.0?

    tut mir leid aber ich hab das nur gesagt, damit ihr wisst, welches programm ich benutze. ich hatte vor ein paar monaten Turbo c++ verwendet und da ist die schreibweise des programms anderes. also nichts für ungut.

    ja mit if else kann ich es machen. aber es wird von mir verlangt, dass ich es mit switch mache.

    case-Labels müssen Konstanten sein, also z.B. case 90:

    aber man kann auch regeln einfügen wie z.B x>0 oder x<0 bei negativen und positiven zahlen.

    ich hoffe ihr könnt mir jetzt weiterhelfen.

    vielen dank



  • Mohamedyarub schrieb:

    ich benutze visual basic 6.0

    Schön für dich, was tut das zur Sache? Ein Ratespiel, du benutzt also vermutlich auch Visual C++ 6.0?

    tut mir leid aber ich hab das nur gesagt, damit ihr wisst, welches programm ich benutze.

    Das Programm heißt aber Visual Studio, der C++-Compiler dazu heißt Visual C++. Visual Basic ist eine andere Programmiersprache, die auch zum Visual Studio gehört.

    ja mit if else kann ich es machen. aber es wird von mir verlangt, dass ich es mit switch mache.

    Dann wird es ziemlich umständlich:

    switch (x) {
      case 80:
      case 81:
      case 82:
      ...
      case 89: cout << "Gut"; break;
      case 90:
      case 91:
      case 92:
      ...
      case 100: cout << "Sehr gut"; break;
      ...
    }
    

    case-Labels müssen Konstanten sein, also z.B. case 90:

    aber man kann auch regeln einfügen wie z.B x>0 oder x<0 bei negativen und positiven zahlen.

    Nein, kann man nicht.



  • stimmt du hast vollommen recht. man kann echt nur konstante einfügen in case
    aber warum hat mein lehrer gesagt, dass sowas geht?

    # include <iostream.h>
    void main ()
    {
    	int n;
    	cin >> n;
    	switch (n)
    	{case (n>0) : cout <<" die nummer ist positive";
    	break ;
    	case (n=0) : cout << die nummer ist null";
    				   break;
    	default: cout << "die nummer ist negative";
    	}
    }
    

    ok dann muss ich es mit if else machen. weil ich werde keine 100 case befehle schreiben



  • Mohamedyarub schrieb:

    stimmt du hast vollommen recht. man kann echt nur konstante einfügen in case
    aber warum hat mein lehrer gesagt, dass sowas geht?

    Vielleicht weil er das von Visual Basic so kennt und bei C++ verwirrt ist? Jedenfalls würde ich dem, was der so sagt, nicht unbedingt viel Vertrauen entgegenbringen. Das mit dem void main() oder iostream.h ist wie gesagt Käse bzw. stark veraltet.



  • Bashar schrieb:

    ja mit if else kann ich es machen. aber es wird von mir verlangt, dass ich es mit switch mache.

    aber man kann auch regeln einfügen wie z.B x>0 oder x<0 bei negativen und positiven zahlen.

    Nein, kann man nicht.

    Natürlich kann man. Mit C++ geht fast alles ...

    int bedingung(int x)
    {
      if(x>=90) return 1;
      if((x>=80) && (x<90)) return 2;
      if(x<80) return 3;
    } 
    
    switch(bedingung(x))
      {
      case 1 : cout << "sehr gut"; 
               break;   
      case 2 : cout << "gut"; 
               break;   
      case 3 : cout << "befriedigend"; 
               break;   
      default : cout <<"failed";
      }
    

    Alternativ könnte man statt Unterprogramm auch ein Makro verwenden.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Makros ❤

    Möglichkeit #1: Default-Case, keine durchfallenden Cases, Keine Blöcke um SWITCH möglich. Bsp.:

    #include <iostream>
    
    #define SWITCH(expr) \
    	for(bool __once_flag = true; __once_flag; __once_flag = false) \
    		for(auto&& _ = expr; __once_flag; __once_flag = false) \
    			if(false) \
    				;
    
    #define CASE(expr) else if(expr)
    #define DEFAULT else
    
    int main()
    {
    	int const i = 42;
    
    	SWITCH(i)
    		CASE(_ < 42)
    			std::cout << "'i' is less than '42'";
    
    		CASE(_ > 42)
    			std::cout << "'i' is greater than '42'";
    
    		DEFAULT
    			std::cout << "'i' is equal to '42'";
    }
    

    Möglichkeit #2: Kein Default-Case, durchfallende Cases, wenn nachfolgenden Bedingungen wahr, Block um Switch erforderlich. Bsp.:

    #include <iostream>
    
    #define SWITCH(expr) \
    	for(bool __once_flag = true; __once_flag; __once_flag = false) \
    		for(auto&& _ = expr; __once_flag; __once_flag = false)
    
    #define CASE(expr) if(expr)
    
    int main()
    {
    	int const i = 42;
    
    	SWITCH(i)
    	{
    		CASE(_ < 42)
    		{
    			std::cout << "'i' is less than '42'";
    			break;
    		}
    
    		CASE(_ > 42)
    		{
    			std::cout << "'i' is greater than '42'";
    			break;
    		}
    
    		CASE(_ == 42)
    		{
    			std::cout << "'i' is equal to '42'";
    			break;
    		}
    	}
    }
    

    "_" steht hier immer für das Argument, das dem SWITCH-Makro übergeben wurde.



  • Pi, wem genau soll das jetzt helfen? Genau, absolut niemandem. Der Lehrer wird meckern, weil er es ganz anders haben wollte. Und weil er mit dem VC6-Compiler deinen neumodischen C++11-Müll nicht übersetzt kriegt.



  • Muss immer alles irgendwem helfen?



  • Bashar schrieb:

    Muss immer alles irgendwem helfen?

    In einem "Ich brauche Hilfe"-Thread? Am besten schon.



  • Die Frage ist doch schon seit ein paar Tagen beantwortet.



  • Man könnte das alles mit modulo-operator und Massivzugriff ( Array, Vector usw ) machen.
    ( Vorausgesetzt es ist so eine Aufgabe wie im Anfangspost ).
    so in der Art:

    size_t index = static_cast< size_t >( note ) %  AnzahlDerElementen
    std::cout << ausgabe[ index  ];
    

    Und sogar generell kann man anstatt vieler case-Anweisungen über einen Massivzugriff nachdenken ( auch wenn es nötig ist mit Funktionspointern )....
    So für die Zukunft...



  • Mohamedyarub schrieb:

    stimmt du hast vollommen recht. man kann echt nur konstante einfügen in case
    aber warum hat mein lehrer gesagt, dass sowas geht?

    Knallhart gesagt würde ich sagen, dass dein Lehrer von der switch Anweisung in C/C++ keine Ahnung hat.



  • _matze schrieb:

    Bashar schrieb:

    Muss immer alles irgendwem helfen?

    In einem "Ich brauche Hilfe"-Thread? Am besten schon.

    Eigentlich schon ja.

    Pi wollte eh nur wieder ein bisschen rumposen mit einem Makro Gefrickel.



  • KiddieKenner schrieb:

    _matze schrieb:

    Bashar schrieb:

    Muss immer alles irgendwem helfen?

    In einem "Ich brauche Hilfe"-Thread? Am besten schon.

    Eigentlich schon ja.

    Pi wollte eh nur wieder ein bisschen rumposen mit einem Makro Gefrickel.

    Blabla.
    Wenn die einzig korrekte Antwort auf den Thread wäre dass der Lehrer ne Niete ist, dann ist es okay die Sache etwas interessanter zu machen.



  • Travor schrieb:

    Man könnte das alles mit modulo-operator und Massivzugriff ( Array, Vector usw ) machen.
    ( Vorausgesetzt es ist so eine Aufgabe wie im Anfangspost ).
    ...

    Wenn es wie in der Anfangsaufgabe immer 10er Blöcke sind, dann kann man auch einfach x durch 10 teilen und 10 cases nehmen.
    Passt wahrscheinlich eher zur Aufgabe.



  • Ok nach einigem Überlegen hab ich mal was zusammen gehackt was funktionieren könnte. Zugegeben keine elegante Lösung aber eine Lösung.

    #include <iostream> // <iostream.h> bei aelteren compilern
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    	unsigned int x;
    	unsigned int y;
    
    	cout << endl << "Eingabe: ";
    	cin >> x;
    	cout << endl;
    
    	y = x / 16; // wir haben nur 6 noten. 100 geteilt durch 6 ergibt 16.667 aber wir arbeiten der einfachheit halber hier nun mit 16
    
    	switch(y)
    	{
    		case 0:
    			cout << "ungenuegend" << endl;
    			break;
    		case 1:
    			cout << "mangelhaft" << endl;
    			break;
    		case 2:
    			cout << "ausreichend" << endl;
    			break;
    		case 3:
    			cout << "befriedigend" << endl;
    			break;
    		case 4:
    			cout << "gut" << endl;
    			break;
    		case 5:
    			cout << "sehr gut" << endl;
    			break;
    		case 6:
    			cout << "sehr gut" << endl;
    			break;
    		default:
    			cout << "Fehler !!" << endl;
    	}
    	return 0;
    }
    

    Gruss Micha



  • Ethon schrieb:

    Pi wollte eh nur wieder ein bisschen rumposen mit einem Makro Gefrickel.

    Blabla.
    Wenn die einzig korrekte Antwort auf den Thread wäre dass der Lehrer ne Niete ist, dann ist es okay die Sache etwas interessanter zu machen.

    Blabla.
    Wenn Pi wieder mal versucht einen auf dicke Hose zu machen, dann versucht Pi eben einen auf dicke Hose zu machen.
    Wieso willst du das schön reden?

    Wobei mich sein gepose hier sogar weniger nervt, als dein Versuch es schönzureden.



  • Ich weiß nicht, ob inzwischen der Switch-Block von VB anders funktioniert wie bei VB6 damals, aber es gab kein break und insofern war jeder neue Case-Block ein break des alten Blocks, also nicht wie in C++.

    Was Makros angeht ist das Problem so billig, das diese den Code einfach unlesbar machen und totaler Overkill ist. Total unangebracht.

    Jeder Programmierer checkt 6 Blöcke mit if-s am schnellsten, wobei auch hier wieder ein wenig Redundanzen beseitigen kann, die nur wieder zu Fehlern führen, wenn sich etwas ändert:

    if(punkte >=PUNKTE_NOTE1)
       note=1;
    else if(punkte >=PUNKTE_NOTE2) // && punkte < PUNKTE_NOTE1
       note=2;
    else if(punkte >=PUNKTE_NOTE3) // && punkte < PUNKTE_NOTE2
       note=3;
    else if(punkte >=PUNKTE_NOTE4) // && punkte < PUNKTE_NOTE3
       note=4;
    else if(punkte >=PUNKTE_NOTE5) // && punkte < PUNKTE_NOTE4
       note=5;
    else
       note=6; // punkte < PUNKTE_NOTE5
    

Anmelden zum Antworten