switch & Bedingungen ???
-
Hallo alle miteinander,
habe ein kleines Verständnisproblem mit einer zu lösenden Aufgabe,
ich komm einfach nicht weiter. Ich verstehe nicht,
wie ich in einer switch-Anweisung Bedingungen überprüfen soll.
Ich hätte nachfolgende Aufgabe einfach mit ein paar verschachtelten if's gelöst...Ich hoffe, ihr könnt mir helfen!
Liebe Grüße
Jens
1.Durchlaufen Sie in einer Schleife die Zahlen 0 bis 10.
Überprüfen Sie in einer switch-Anweisung die folgenden
Bedingungen und geben Sie die zugehörige Meldung aus:Zahl ist 0, 5 oder 10 → „5-teilbar”
Zahl ist 0 oder 10 → „10-teilbar”
Zahl ist 0, 2, 4, 6, 8 oder 10 → „2-teilbar”
Ansonsten → „nichts besonderes”Beachten Sie, dass alle zutreffenden Bedingungen überprüft werden sollen,
also ggf. mehrere Meldungen ausgegeben werden sollen. Verwenden Sie so
wenig wie möglich Anweisungen und break-Befehle.
-
switch(i) { case 0: case 5: case 10: cout << "5 teilbar" << endl; default: cout << "nix besonderes" << endl; }hätte ich so ganz spontan gesagt - allerdings geht das nich so ohne weiteres, da die 0 ja öfter vorkommt... -.-
also müssten wir wohl so etwas machen:
bool zwei = false, fuenf= false, zehn = false; switch(i) { case 0: case 10: zwei = fuenf = zehn = true; break; case 5: fuenf = true; break; case 2: case 4: case 6: case 8: zwei = true; break; } if(zwei) cout << "durch 2 teilbar" << endl; if(fuenf) cout << "durch 5 teilbar" << endl; if(zehn) cout << "durch 10 teilbar" << endl; if(! (zwei || fuenf || zehn) ) cout << "nix besonderes" << endl;bb
PS: Normalerweise gibts hier ja keine HA-Lösungen, aber ich fand die Aufgabe bissl unintuitiv und naja - außerdem hab ich auch gerade keine Lust, zu programmieren : D
-
unskilled schrieb:
...allerdings geht das nich so ohne weiteres, da die 0 ja öfter vorkommt... -.-
Es geht ohne weiteres. Nicht vergessen, nach einem
caseBlock, wo ein Code ausgeführt wird, muss nicht einbreakkommen, sondern können weitere case Bedingungen kommen und damit erneut anderen Code ausgeführt werden. Bsp:switch(i) { case 0 : std::cout << "Die Zahl ist 0" << std::endl; case 1 : std::cout << "Die Zahl ist 0 oder 1" << std::endl; break; }Aber ich denke, dass Poque nun wissen sollte, wie man das in etwa macht. Es ist nun seine Aufgabe die richtige Reihenfolge zu finden.
Grüssli

-
Dravere schrieb:
Es geht ohne weiteres.
nope, geht nicht.
oder zeig mal deine loesung her.
-
Ja - es geht - aber ich bekomms nicht hin, wenn ich nur einmal jeden string im quellcode schreiben darf (bzw falls man es noch mal auslagert nur einmal die jeweilige ausgabe-fkt aufruft)...
und da ich das hässlich fand, hab ichs eben über die booleans gemacht...
bb
edit:
also besser als so bekomm ichs nicht hin:#include <iostream> using namespace std; int main() { for(int i(0), e(11); i != e; ++i) { cout << i << ": " << endl; switch(i) { case 0: case 10: cout << "\tdurch 10 teilbar" << endl; cout << "\tdurch 5 teilbar" << endl; case 2: case 4: case 6: case 8: cout << "\tdurch 2 teilbar" << endl; break; case 5: cout << "\tdurch 5 teilbar" << endl; break; default: cout << "\tnichts besonderes" << endl; } } // system("PAUSE"); }
-
for(int i=0;i<=10;++i) { switch(i) { case 0: cout<<"5-teilbar\n"<<"10-teilbar\n"<<"2-teilbar"<<endl; break; case 10: cout<<"5-teilbar\n"<<"10-teilbar\n"<<"2-teilbar"<<endl; break; case 5: cout<<"5-teilbar"<<endl; break; case 2: case 4: case 6: case 8: cout<<"2-teilbar"<<endl; break; default: cout<<"nichts besonderes"<<endl; }; };Die Lösung passt ja genau wie unskilleds Lösung genau zum Aufgabentext.
EDIT: Code Tags vergessen...
-
unskilled schrieb:
..., wenn ich nur einmal jeden string im quellcode schreiben darf ...
So? Und wo steht diese Einschränkung? Es gibt nur zwei Einschränkung und die lauten:
Beachten Sie, dass alle zutreffenden Bedingungen überprüft werden sollen,
also ggf. mehrere Meldungen ausgegeben werden sollen. Verwenden Sie so
wenig wie möglich Anweisungen und break-Befehle.Und dein zweiter Code hat wohl deutlich weniger Anweisungen als dein erster Code, nicht?

Ich dachte sogar vorhin, dass es noch eine bessere Lösung gibt, aber bin mir jetzt nicht mehr ganz so sicher, bzw. zu faul, weil zu heiss, um das nachzuprüfen.
Grüssli
-
Also erstmal vielen Dank euch allen!
Ich habe es jetzt so gelöst:
#include <iostream> using namespace std; void main() { for (int i = 0; i <= 10; i++) { switch(i) { case 0: cout << i << " " << "10-teilbar " << endl << i << " " << "5-teilbar" << endl << i << " " << "2-teilbar" << endl; break; case 5: cout << i << " " << "5-teilbar" << endl; break; case 10: cout << i << " " << "10-teilbar" << endl << i << " " << "5-teilbar" << endl; case 2: case 4: case 6: case 8: cout << i << " " << "2-teilbar" << endl; break; default: cout << i << " " << "Nichts besonderes" << endl; } } }Besser bekomm ich es nicht hin...
Zum Thema HA lösen
... Sind keine HA, ist alles freiwillig,
aber es lies mir einfach keine Ruhe...Gruß
Poque
-
Dravere schrieb:
unskilled schrieb:
..., wenn ich nur einmal jeden string im quellcode schreiben darf ...
So? Und wo steht diese Einschränkung?
Sie steht nirgendwo - aber hässlich ist es noch immer ^^
@Poque:
Guck dir mal noch ma die anderen Lösungen an (z.bsp. meine) - und dann guck mal noch ma deine an - dann wirst du sehen, dass meine viel kürzer ist und genau so funktioniert... (weil ich das break nicht überall hingesetzt habe - weil es nicht sinnvoll ist, es überall hinzuschreiben ^^z.bsp. solltest du die 0 mal mit zu der 10 schreiben - dann sparst du schon wieder 3 zeilen ^^
@Dravere: Falls du Lust und Zeit hast, dann versuch das mal - ich glaub eigtl nich, dasses was tolleres gibt ^^
bb
-
@unskilled: OK, hast recht! Deins ist wohl echt die kürzeste Variante!

Danke
-
Dravere schrieb:
Ich dachte sogar vorhin, dass es noch eine bessere Lösung gibt, aber bin mir jetzt nicht mehr ganz so sicher, bzw. zu faul, weil zu heiss, um das nachzuprüfen.

Nope du brauchst eine doppel behandlung. ziemlich daemliche aufgabe deswegen. denn damit sind alle loesungen haesslich und wir lernen daraus das code duplizierung nicht schlecht ist.

-
Oki, doki, wie wäre es damit?

switch(i) { case 0 : case 10 : std::cout << "10-teilbar" << '\n'; case 5 : std::cout << "5-teilbar" << '\n'; if(5 == i) break; case 2 : case 4 : case 6 : case 8 : std::cout << "2-teilbar" << '\n'; break; default : std::cout << "nichts besonderes" << '\n'; }Keine Codewiederholung, ziemlich kurz. Gut, die If-Anweisung ist nicht so schön, aber was besseres will mein immernoch kochendes Hirn nicht in den Sinn kommen

Grüssli
-
naja - schöner, aber nicht schön

bb
-
auch nicht schön, nur ein bißchen im sinne der aufgabe gefrickelt.
die endziffer von i hoch 4 ist da recht lecker.
switch(i*i*i*i%10) { case 0: cout << "\tdurch 10 teilbar" << endl; cout << "\tdurch 5 teilbar" << endl; cout << "\tdurch 2 teilbar" << endl; break; case 5: cout << "\tdurch 5 teilbar" << endl; break; case 6: cout << "\tdurch 2 teilbar" << endl; break; case 1: cout<<"\tnichts besonderes"<<endl; break; }und das führt zu
switch(i*i*i*i%10) { case 1: cout<<"\tnichts besonderes"<<endl; break; case 0: cout << "\tdurch 10 teilbar" << endl; cout << "\tdurch 5 teilbar" << endl; default: cout << "\tdurch "<<2+3*(i%2)<<" teilbar" << endl; }
-
ich glaub dir einfach mal x)