Befehl "case"
-
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
-
Ich würd's mit if/else implementieren und, weil der Lehrer sicherlich auch noch stur ist, aus nem Standard-Draft den Abschnitt zu möglichen Angaben nach case ausdrucken und ihm bei Bedarf hinknallen. Dann gibt's auch die 1,0 für zusätzliche Recherche.
Edit: Oder er fühlt sich angegriffen und gibt ihm dort (oder zukünftig) immer die schlechteste Note.

-
Am "streberhaftesten" wäre wohl, 2 Lösungen zu präsentieren. Eine nach Aufgabenstellung (mit 100 cases) und eine vernünftige, mit einer ordentlichen Erklärung, warum die switch-Variante in C++ für diese Aufgabe suboptimal ist.