Ordnen dreier Zahlen - If-Anweisungen falsch ?
-
Abend,
Langsam gehe ich euch glaub ich auf die Nerven

Sitze schon seit 6h vor dem Computer und übe wie verrückt.
Und manchmal kommen tükische Fehler, auf die ich keine Antwort finde :S
Schlage im dicken Buch nach und finde nicht die Antwort nicht
Der Compiler meldet mir 3x den Fehler:
Zeile 27,39,51:
Fehler 1 error C2181: Ungültiges 'else' ohne zugehöriges 'if'#include <iostream> using namespace std; int main() { int zahl1, zahl2, zahl3, zwsp; cout << "Gib die 1. Zahl ein!" << endl; cin >> zahl1; cout << "Gib die 2. Zahl ein!" << endl; cin >> zahl2; cout << "Gib die 3. Zahl ein!" << endl; cin >> zahl3; //1. Zahl Überprüfung if(zahl1 > zahl2) { if(zahl1 > zahl3) cout << "Größte: " << zahl1 << endl; //2. Zahl ist Mittlere? if(zahl2 > zahl3) cout << "Mittlere: " << zahl2 << endl; cout << "Kleinste: " << zahl3 << endl; else cout << "Mittlere: " << zahl3 << endl; cout << "Kleinste: " << zahl2 << endl; } //2. Zahl Überprüfung else if(zahl2 > zahl1) { if (zahl2 > zahl3) cout << "Größte: " << zahl2 << endl; //1. Zahl ist Mittlere? if(zahl1 > zahl3) cout << "Mittlere: " << zahl1 << endl; cout << "Kleinste: " << zahl3 << endl; else cout << "Mittlere: " << zahl3 << endl; cout << "Kleinste: " << zahl1 << endl; } //3. Zahl Überprüfung else if(zahl3 > zahl1) { if(zahl3 > zahl2) cout << "Größte: " << zahl3 << endl; //1. Zahl ist Mittlere? if(zahl1>zahl2) cout << "Mittlere: " << zahl1 << endl; cout << "Kleinste: " << zahl2 << endl; else cout << "Mittlere: " << zahl2 << endl; cout << "Kleinste: " << zahl1 << endl; } }Lg Mentras
-
Hallo
Zeile 22 und 24 sollen ja ausgeführt werden falls "if(zahl1 > zahl3)" in Zeile 21 gilt.
Wenn du nach einer if-Abfrage jedoch keinen Block öffnenst ( mit { } ) wird nur die erste Zeile nach der if-Abfrage ausgeführt.
Ergo: Zusätzliche geschweifte Klammern einfügen.
Selbe Verfahrensweise für "2.Zahl" und "3.Zahl" überprüfen.Gruss!
DudePS: Besonders effizient / schön ist der Code aber nicht

-
Einrückung ist KEIN syntaktisches Element (das ist kein Python hier!), Du musst schon geschweifte Klammern setzen.
-
Tja, so ist C++

Allerdings hättest du nur auf die Synatx acht geben müssen:if(...) { // Klammer auf // bla bla bla } // Klammer zu else { // Klammer auf // bla bla bla } // Klammer zuWenn du keine geschweiften Klammern hinsetzt, dann passiert das:
#include <iostream> int main() { if(false) std::cout << "Das kommt nicht!" << std::endl; std::cout << "Und das?" << std::endl; return 0; }Ich verrate es mal im voraus, das zweite kommt

Dieser "Spezialfall" schaut man sich am besten so an:
if(false) std::cout << "Das kommt nicht!" << std::endl; // Semikolon, If-Bedingung zuende. std::cout << "Und das?" << std::endl;Mit Blöcken kann man halt mehrere Zeilen zusammennehmen. Es empfiehlt sich allerdings immer Blöcke zu nehmen, ist übersichtlicher und klarer

Grüssli
-
Hmpf,...
Dravere, deine Posts sind immer hilfreich (Also, welche ich bis jetzt gelesen habe)
Ich hab ja extra Blöcke verwendet oder nicht?
//1. Zahl Überprüfung if(zahl1 > zahl2) { if(zahl1 > zahl3) cout << "Größte: " << zahl1 << endl; //2. Zahl ist Mittlere? if(zahl2 > zahl3) cout << "Mittlere: " << zahl2 << endl; cout << "Kleinste: " << zahl3 << endl; else cout << "Mittlere: " << zahl3 << endl; cout << "Kleinste: " << zahl2 << endl; }Hoffe jemand hat die Geduld um mir das noch genauer zu erklären (Also für den wirklichen Anfänger³...)
@LaDispute:
Jap, ich weiß, das der Code wirklich hässlich ist^^
Könnte das ja dann mit dem ?-Operator machen...Mir ist jetzt wichtig mich in den Schleifen, if-else, switch, usw... zu vertiefen... damit mir solche Missgeschicke nicht noch einmal passieren...
Lg Mentras
-
@Mentras,
Jedes if-else braucht Blöcke, nicht nur das äusserste :pDie Problematik dahinter ist nämlich relativ einfach. Whitespaces (Leerzeichen) werden ignoriert, hier mal etwas Pseudocode:
if(a) if(b) ... else (1) ...(1) Zu welchem if gehört dieses else? Deshalb verwendet man in C++ geschweifte Klammern, damit alles schön gebunden ist
if(a) { if(b) { } else { } } // oder if(a) { if(b) { } } else { }Andere Sprachen machen es anders, zum Beispiel die Makros in C und C++:
#if a ... #if b ... #else // gehört zu b ... #endif // gehört zu b #endif // gehört zu a // oder #if a ... #if b ... #endif // gehört zu b ... #else // gehört zu a ... #endif // gehört zu aGrüssli
-
Perfekt erklärt

Dank dir Dravere
fürDich: http://de.dreamstime.com/ich-liebe-dich-thumb22958.jpg
€dit: Den ?-Operator gibt es doch in C++ oder nicht? :S
Lg Mentras
-
Dravere hat dir sicher schon gut erklärt wozu du Blöcke brauchst. Für den Lerneffekt ist es am besten wenn du jetzt selbst überlegst welche Bereiche du mit {} kapseln musst.
Zur Effizient deines Codes: Natürlich ist es bei heutigen Prozessoren egal, ob man ein wenig umständlich programmiert.
Stelle dir aber vor, es wird nicht einfach nur ein Satz ausgegeben oder eine einfach Bedingung gecheckt sondern stattdessen tatsächliche Rechenlast erzeugt von deiner if-Anweisung (zB Videobearbeitung, komplexe wissenschaftliche/numerische Anwendungen) dann bist du gut beraten vorher das Problem zu durchdenken bevor du mit dem Programmieren anfängst.Du hast einfach eine Menge Redundanz in deinem Code.
Eine kleine Frage am Rande: Was wird denn ausgeben wenn zahl1 und zahl2 gleichgroß sind?
-
War mir klar, je weniger Schaltungen, desto schneller ist das Programm...
Jap, das muss ich noch einbauen, allerdings wird mir das zuviel "if-elseif-else"...
Hat C++ den "(a > b) ? a : b " Operator noch?
Dann könnte ich mir solche if-else ersparen...Lg Mentras
-
LaDispute schrieb:
Eine kleine Frage am Rande: Was wird denn ausgeben wenn zahl1 und zahl2 gleichgroß sind?
Und was, wenn zahl1 und zahl2 verschieden, zahl3 aber die größte ist?
-
"(a > b) ? a : b" kannst du zwar verwenden, wirklich lesbar wird dein Code dadurch aber auch nicht. Und Lesbarkeit ist genau das, was man sich wünscht wenn man nach einem halben Jahr wieder mal in Code reinschaut.
Zudem: Wenn du beim Erfüllen / Nichterfüllen deines Vergleiches mehr als eine Zeile Code ausführen möchtest, kommst du ums Kapseln sowieso nicht drumrum.
C++ und ?:
http://en.wikipedia.org/wiki/Conditional_operator#C.2B.2B
-
Die Verschönerungsvorschläge sind zwar angebracht, aber ich weiss nicht, ob es dafür nicht noch zu früh ist

Ich meine, am schönsten wäre hier ein kleines Array, ein
std::sortaus der Standardbibliothek und eine Ausgabe des Arrays. Das wären dann noch ca. 10 Zeilen und überhaupt keine if-else Dinge
Es ist sicher gut mal zu sagen, dass man schönen Code schreiben sollte, aber ein Anfänger sollte vielleicht auch einfach zuerst mal die Sprache vollständig erlernen. Denn erst später hat man mehr und mehr Wissen, welches man einsetzen kann, um Code zu verschönern.
Meint ihr nicht auch?
Grüssli
-
Da hast du natürlich Recht. Am Anfang soll man gerne "sinnlose" Dinge programmieren, oder vielleicht auch umständliche um dann zu verstehen, wie es einfacher ginge. Mir geht es ja nicht um "schönen Code".
Es ist meiner Meinung einfach von Anfang an wichtig die Probleme vorher zu durchdenken. Man lernt so nämlich "Programmieren/Problemlösen" anstatt "nur" C++
Workflow und analytisches Denken sind wichtiger als Operator XYZ zu kennen.
-
LaDispute schrieb:
"(a > b) ? a : b" kannst du zwar verwenden, wirklich lesbar wird dein Code dadurch aber auch nicht.
Das ist Ansichtssache. Ich mag zum Teil kompakten Code, und finde auch, er kann die Lesbarkeit erhöhen. Für gewisse Dinge ist der
operator?:sogar notwendig. Zwei Beispiele:1. Anweisungen im gleichen Scope.
Das folgende Beispiel funktioniert mitifnicht, ohne ein standardkonstruiertes Objekt, Zeiger oder den Zuweisungsoperator zu verwenden.MyClass Var = Condition ? MyClass("hoi") : MyClass('t', 4);2. Template-Metaprogrammierung.
Zur Kompilierzeit gibt es keinif. Da behilft man sich unter anderem mitoperator?:bei boolschen Bedingungen.template <int N> struct abs { static const int value = (N >= 0) ? N : -N; };
-
Ich gib´s zu,...
Der Code wurde mir zu unübersichtlich.
STRG + A und dann ENTF...
Morgen mach ich´s mit einer hübschen Funktion...
Lg Mentras
-
@Nexus: Absolut richtig. Ging aber eher um den konkreten Fall hier und das Erlernen von Kapselung.
@Mentras: Strg+S danach nicht vergessen
