Endlosschleife --> was sagt ihr (Mein Informatiklehrer sagt wieder, dass...)
-
[quote="tntnet"]
do { std::cout << "Bitte geben Sie eine Zahl zwischen 0 und 9 ein:"; std::cin >> zahl; if (zahl < 0 || zahl > 9) std::cout << "fehlerhafte Eingabe"; } while (zahl < 0 || zahl > 9);da brauchen wir uns nicht drüber unterhalten...
bool ok = true; do{ std::cout << "Bitte geben Sie eine Zahl zwischen 0 und 9 ein:"; std::cin >> zahl; if (zahl < 0 || zahl > 9) std::cout << "fehlerhafte Eingabe"; else ok = false; }while(ok);denke hier wird schon deutlich das es komplizierter als eigentlich nötig war sonst hättest es doch gleich so gemacht;)
do{ std::cout << "Bitte geben Sie eine Zahl zwischen 0 und 9 ein:"; std::cin >> zahl; if (zahl >= 0 && zahl <= 9) break; std::cout << "fehlerhafte Eingabe"; }while(1);wir wollen ja fair bleiben

lg lolo
-
ich bilde mir ein mal gehört zu haben, dass das was am ehesten eintrifft in den ersten block soll und das andere in den else block da es dann schneller ausgeführt werden kann, also
if(){ //eher oft }else{ //eher selten }und wenn man jetzt davon ausgeht das es stimmt und der ein oder andere user in der lage ist das zu machen was man ihm sagt, ist ein
if(true) break;schneller als
if(false) ... else break;lg lolo
-
Was spricht gegen
for( bool exit=false; !exit; ) { std::cout << "Bitte geben Sie eine Zahl zwischen 0 und 9 ein:"; std::cin >> zahl; if (zahl < 0 || zahl > 9) std::cout << "fehlerhafte Eingabe"; else exit = true; }Für alle break-Hasser. Das Exit-Flag ist nur in der Schleife sichtbar. Wenn die durch ist gibt es die Variable nicht mehr.
Mir gefällt hier allerdings die Variante mit dem break auch besser.
-
schade das ich mich ins c++ forum verirrt habe, sonst könnt ich sagen, for(int x... gibts in c89 nicht :p
guten morgen && lg lolo
-
aber da ist das break oder die flag auch nciht unbedingt notwendig:
template <typename T> T get(std::istream &in, std::ostream &out) { T ret_val; while (! (in >> ret_val) ) { out << "falsch usw."; clear_stream(in); }; clear_stream(in); return ret_val; } template <typename T> T get(std::istream &in, std::ostream &out, const T& lower_bound, const T& upper_bound) { T ret_val = get<T>(in, out); while( (ret_val < lower_bound) || (ret_val > upper_bound) ) { out << "außerhalb der grenzen..."; clear_stream(in); ret_val = get<T>(in, out); }; return ret_val; }und die eine zeile, die ich da doppelt drin habe, kann man imho so und so nur mit verrenkungen vermeiden...
bb
-
kpl. od das jetzt an den templates liegt aber so mit einem blick check ich nicht was du da machst

lg lolo
-
Dann verteufelt er vermutlich auch continue in Schleifen...
-
Hallo,
ich meite eigentlich sowas wie Bashar es in seimem zweiten Beispiel hat. Vielleicht war meine Ausdrucksweise falsch. Strenggenommen ist es keine Endlosschleife...naja, ihr habt mich dennoch verstanden!Kann man sagen, dass eigntlich alle Schlüsselwörter aus C++ zu nutzen sind? Andernfalls könnte man argumentieren, dass es solche sonst ja nicht geben würde. Naja, trotzdem gibt es ja immer wieder "Stilverbesserungen". Heute würde ja auch keiner mehr das schreiben:
void main() { cout << "Hello World" << endl; }lg, freakC++
-
freakC++ schrieb:
Naja, trotzdem gibt es ja immer wieder "Stilverbesserungen". Heute würde ja auch keiner mehr das schreiben:
void main() { cout << "Hello World" << endl; }Das liegt aber nicht daran dass es als nicht schön erachtet wird!
g++ main.cpp -o main main.cpp:4: Fehler: »::main« muss »int« zurückgebenDas ist also einfach nur verboten! Also nix Geschmackssache oder Stilverbesserung.
-
Mmmhh...da haste recht, aber die Nutzung von break, continue wird mir genauso als verboten dargestellt. Einmal sagt es der Compiler...einmal der Lehrer

lg, freakC++
-
Ich verwende immer break & continue wenn es Sinn macht. So einfach ist das.
Die Verwendung von irgendwelchen Abbruchvariablen die in langen Schleifen verwendet werden, führen meist zu viel unübersichtlicheren Verschachtelungen.Was man bei dem ganzen break/continue/return-Gedönse mitten im Code natürlich berückstigen muss ist das freigeben eventuell angeforderten Speichers. Da kann es sonst schnell zu Problemen führen.
-
freakC++ schrieb:
Einmal sagt es der Compiler...
Wenn du mit Compiler den Typen meinst, dem du deinen Quelltext zum Übersetzen gibst, würde ich mir einen anderen suchen. Der soll keinen Kommentar abgeben sondern seine Arbeit erledigen.
Wenn du selber ein soclhes Programm bedienst (z.B. GCC), dann handelt es sich wohl um eine falsche Anwendung, sprich einen tatsächlichen Programmierfehler.
Auf nicht initialisierte Pointer zugreifen ist ja auch böse böse böse, nur - der Compiler meldet das nicht!
-
Ok, ich konnte mir durch eure Antworten und Meinungen ein gutes Meinungsbild verschaffen. Ich werde auch weiterhin mit break etc. arbeiten und vielleicht in der Arbeit mal auf andere Strukturen zurückgreifen.
Ich danke euch allen.
lg, freakC++
-
Fellhuhn schrieb:
Ich verwende immer break & continue wenn es Sinn macht. So einfach ist das.
Die Verwendung von irgendwelchen Abbruchvariablen die in langen Schleifen verwendet werden, führen meist zu viel unübersichtlicheren Verschachtelungen.Dito.
Ich verwende break & continue zwar selten, aber durchaus wenn es der Übersichtlichkeit förderlich ist.
Fellhuhn schrieb:
Was man bei dem ganzen break/continue/return-Gedönse mitten im Code natürlich berückstigen muss ist das freigeben eventuell angeforderten Speichers. Da kann es sonst schnell zu Problemen führen.
Es sei den man setzt ohnehin weitgehend auf Stackvariablen in Schleifen, oder RAII-Mechanismen.
-
freakC++ schrieb:
Kann man sagen, dass eigntlich alle Schlüsselwörter aus C++ zu nutzen sind? Andernfalls könnte man argumentieren, dass es solche sonst ja nicht geben würde.
Nein, so kann man nicht argumentieren. Es gibt z.B. das Schlüsselwort
auto, das völlig überflüssig ist (und in C++0x umgewidmet wird, weil es nie jemand benutzt). Auch von zweifelhaftem Wert istregister. Und in portablen Programmen kann nie das Schlüsselwortasmvorkommen.
Die Funktionensetjmp/longjmpsollte man auch nicht verwenden. Na und so weiter ... die Sprache enthält vieles nur aus historischen Gründen, sie macht auf keinen Fall Stilvorgaben.
-
Stimmt, da haste recht. Bei register ist ja sowieso dem Compiler überlassen, was er damit anstellt.
lg, freakC++
-
Fellhuhn schrieb:
Was man bei dem ganzen break/continue/return-Gedönse mitten im Code natürlich berückstigen muss ist das freigeben eventuell angeforderten Speichers. Da kann es sonst schnell zu Problemen führen.
Sowas löst man ja auch über RAII
-
hustbaer schrieb:
Fellhuhn schrieb:
Was man bei dem ganzen break/continue/return-Gedönse mitten im Code natürlich berückstigen muss ist das freigeben eventuell angeforderten Speichers. Da kann es sonst schnell zu Problemen führen.
Sowas löst man ja auch über RAII
Wenn man schon über Sinn und Unsinn von Keywords etc redet, dann löst "man" das nicht mit RAII.

-
Sehr passend zu diesem Thread, das heutige DailyWTF:
for (int i = 0; i < dtModules.Rows.Count; i++) { if (dtModules.Rows[i]["id"].ToString() == ID.ToString()) { dtModules.Rows.RemoveAt(i); i = 34598; //used to jump out of the for } }
-
Fellhuhn schrieb:
hustbaer schrieb:
Fellhuhn schrieb:
Was man bei dem ganzen break/continue/return-Gedönse mitten im Code natürlich berückstigen muss ist das freigeben eventuell angeforderten Speichers. Da kann es sonst schnell zu Problemen führen.
Sowas löst man ja auch über RAII
Wenn man schon über Sinn und Unsinn von Keywords etc redet, dann löst "man" das nicht mit RAII.

Ich steh grad völlig auf dem Schlauch. Kannst du mir das erklären?
Meinst du "man" wie in "man man" oder "man 3 printf"?
Und wenn ja, wo siehst du da jetzt die Verbindung? Und was hat das ganze mit Keywords zu tun?