|
You last visited: Today at 12:27
Advertisement
Probleme mit if schleifen
Discussion on Probleme mit if schleifen within the C/C++ forum part of the Coders Den category.
06/07/2012, 11:59
|
#1
|
elite*gold: 26
Join Date: Apr 2011
Posts: 1,532
Received Thanks: 130
|
Probleme mit if schleifen
hey,
muss bei meinem Buch grad folgende aufgabe lösen:
Quote:
|
Schreiben Sie ein Programm, das den Benutzer auffordert, drei Integer-Werte einzugeben, und dann die Werte in numerischer Reihenfolge getrennt durch Komma ausgibt. Wenn der Benutzer die Werte 10 4 6 eingibt, sollte die ausgabe "4, 6, 10" lauten. Wenn zwei werte gleich sind, sollten sie zusammen stehen. Das heißt die eingabe 4 5 4 sollte "4, 4, 5" ergeben.
|
nun habe ich folgenden code:
Code:
int main()
{
int n1;
int n2;
int n3;
cout << "Geben sie 3 zahlen nacheinander ein: ";
cin >> n1 >> n2 >> n3;
if (n1<n2<n3)
cout << n1 << ", " <<n2 << ", " << n3 << endl;
if (n1<n3<n2)
cout << n1 << ", " <<n3 << ", " << n2 << endl;
if (n2<n1<n3)
cout << n2 << ", " <<n1 << ", " << n3 << endl;
if (n2<n3<n1)
cout << n2 << ", " <<n3 << ", " << n1 << endl;
if (n3<n1<n2)
cout << n1 << ", " <<n2 << ", " << n3 << endl;
if (n3<n2<n1)
cout << n1 << ", " <<n2 << ", " << n3 << endl;
als Ausgabe kommt:
aber eigentlich sollte ja nur eine ausgabe kommen
lg
simon
|
|
|
06/07/2012, 12:20
|
#2
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Als aller erstes, es gibt keine If-Schleife !
Afaik musst du die Werte so vergleichen:
Code:
if (n1<n2 && n2<n3) // && ... Logisches Und
|
|
|
06/07/2012, 12:24
|
#3
|
elite*gold: 0
Join Date: Feb 2011
Posts: 248
Received Thanks: 45
|
Ich wollte dazu noch was sagen:
Oh sry hat Skynet ja schon gesagt...
|
|
|
06/07/2012, 12:35
|
#4
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Code:
if (n1<n2<n3)
cout << n1 << ", " <<n2 << ", " << n3 << endl;
Darum ist C++ so gemein. Der Compiler meckert nicht, weil das syntaktisch korrektes C++ ist:
Ausgewertet wird zuerst n1<n2. In deinem Fall also 6<4. Das ist falsch, also gibt dieser Ausdruck 0 zurück. Jetzt wird verglichen 0<n3, also 0<10. Das ist natürlich wahr, also gibt der gesamte Ausdruck 'wahr' und die Bedingung ist erfüllt.
Gute Compiler würden an dieser Stelle evtl. eine Warnung ausspucken. Vllt. hast du so eine erhalten?
Ansonsten wurde ja richtig beschrieben, wie du den Fehler behebst, nur so zum Verständnis.
|
|
|
06/08/2012, 19:31
|
#5
|
elite*gold: 11
Join Date: Feb 2010
Posts: 8,312
Received Thanks: 4,589
|
Wenn ich mich nicht vertan habe, sollte so alles funktionieren. (Bei dem 4 und 6 Vergleich hattest du noch kleinere Fehler)
Code:
#include <iostream>
#include <conio.h> // Für _getch();
using namespace std;
int main()
{
int n1;
int n2;
int n3;
cout << "Geben sie Zahl 1 ein: ";
cin >> n1;
cout << "Geben sie Zahl 2 ein: ";
cin >> n2;
cout << "Geben sie Zahl 3 ein: ";
cin >> n3;
if (n1<n2 && n2<n3)
cout << n1 << ", " <<n2 << ", " << n3 << endl;
else if (n1<n3 && n3<n2)
cout << n1 << ", " <<n3 << ", " << n2 << endl;
else if (n2<n1 && n1<n3)
cout << n2 << ", " <<n1 << ", " << n3 << endl;
else if (n3<n2 && n1<n2)
cout << n3 << ", " <<n1 << ", " << n2 << endl;
else if (n3<n1 && n1<n2)
cout << n1 << ", " <<n2 << ", " << n3 << endl;
else if (n3<n2 && n2<n1)
cout << n3 << ", " <<n2 << ", " << n1 << endl;
else if (n1==n2 && n2<n3)
cout << n1<< "," <<n2<< "," <<n3<< endl;
else if (n1==n2 && n2>n3)
cout << n3<< "," <<n1<< "," <<n2<< endl;
else if (n1==n3 && n2<n3 )
cout << n1<< "," <<n3<< "," <<n2<< endl;
else if (n1==n3 && n1>n3)
cout << n1<< "," <<n3<< "," <<n2<< endl;
else if (n2==n3 && n1>n3)
cout << n2<< "," <<n3<< "," <<n1<< endl;
else if (n2==n3 && n1<n3)
cout << n1<< "," <<n2<< "," <<n3<< endl;
_getch(); // wartet auf einen Tastendruck - Damit die Console sich nach der Arbeit nicht sofort schließt
return 0;
}
Mit 'case' und float Werten könntest du das ganze nun noch modifizieren, damit Gleitkommazahlen unterstützt werden & du durch case die Möglichkeit hast, das Programm weiterlaufen zu lassen, nachdem der erste Vergleich getätigt wurde. Als Zusatz könntest du die Console sich auch selber 'säubern' lassen, damit die Übersichtlichkeit erhalten bleibt.
|
|
|
06/08/2012, 19:34
|
#6
|
elite*gold: 26
Join Date: Apr 2011
Posts: 1,532
Received Thanks: 130
|
danke 
eine frage noch: wiso benutzt du dauernd else if?
und in welcher header dateie ist _getch(); definiert?
|
|
|
06/08/2012, 19:37
|
#7
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
_getch() in der conio.h.. Aber bitte NICHT verwenden. Gewöhne dir das erst gar nicht an. Die conio.h ist von nichts und niemanden standard. Und du brauchst sie in den allermeisten Fällen auch nicht. Sie wird nichtmal von allen Compilern EINER Plattform unterstützt. Also vergiss sie schnell wieder..
|
|
|
06/08/2012, 19:37
|
#8
|
elite*gold: 11
Join Date: Feb 2010
Posts: 8,312
Received Thanks: 4,589
|
Quote:
Originally Posted by ~[Dr.]FuD~
danke 
eine frage noch: wiso benutzt du dauernd else if?
und in welcher header dateie ist _getch(); definiert?
|
Durch das else erhälst du nur eine Ausgabe (sonst, wenn: ) ist also eine Klammer nicht erfüllt, springt er zur nächsten. Deswegen erhälst du 6 Reihen - Pro Reihe eine Ausgabe, das wird durch das else verhindert.
Hab zum _getch was in dem Code geschrieben.
Quote:
Originally Posted by xNopex
_getch() in der conio.h.. Aber bitte NICHT verwenden. Gewöhne dir das erst gar nicht an. Die conio.h ist von nichts und niemanden standard. Und du brauchst sie in den allermeisten Fällen auch nicht. Sie wird nichtmal von allen Compilern EINER Plattform unterstützt. Also vergiss sie schnell wieder..
|
Bei anfänglichen Consolen Programmen, welche in keiner Schleife sind und nicht durch eine spezielle Eingabe beendet werden, ist es durchaus hilfreich. Sobald er das nötige Wissen hat, wird er schnell selber feststellen, wie man es anders besser machen kann.
|
|
|
06/08/2012, 19:42
|
#9
|
elite*gold: 26
Join Date: Apr 2011
Posts: 1,532
Received Thanks: 130
|
Quote:
Originally Posted by xNopex
_getch() in der conio.h.. Aber bitte NICHT verwenden. Gewöhne dir das erst gar nicht an. Die conio.h ist von nichts und niemanden standard. Und du brauchst sie in den allermeisten Fällen auch nicht. Sie wird nichtmal von allen Compilern EINER Plattform unterstützt. Also vergiss sie schnell wieder..
|
könntest du mir dann bitte nur die definition für das _getch() geben?
dann mach ich nur diesen ausdruck in eine eigene .h
danke
|
|
|
06/08/2012, 19:50
|
#10
|
elite*gold: 11
Join Date: Feb 2010
Posts: 8,312
Received Thanks: 4,589
|
Quote:
Originally Posted by ~[Dr.]FuD~
könntest du mir dann bitte nur die definition für das _getch() geben?
dann mach ich nur diesen ausdruck in eine eigene .h
danke 
|
Wie nur die Definition von _getch?
|
|
|
06/08/2012, 19:54
|
#11
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Quote:
|
könntest du mir dann bitte nur die definition für das _getch() geben?
|
Die "Definition" ist...
a) von Plattform zu Plattform verschieden
b) mir auch nicht bekannt.
|
|
|
06/08/2012, 19:56
|
#12
|
elite*gold: 26
Join Date: Apr 2011
Posts: 1,532
Received Thanks: 130
|
Quote:
Originally Posted by °Status
Wie nur die Definition von _getch?
|
ja, da ich den rest aus der .h nicht brauche. (im moment zumindest)
|
|
|
06/08/2012, 20:16
|
#13
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Quote:
Originally Posted by ~[Dr.]FuD~
ja, da ich den rest aus der .h nicht brauche. (im moment zumindest)
|
Willst du jetzt die conio.h zerlegen ?
Naja,  ist der msdn Eintrag zu _getch.
Code:
else if (n1==n2 && n2<n3)
cout << n1<< "," <<n2<< "," <<n3<< endl;
else if (n1==n2 && n2>n3)
cout << n3<< "," <<n1<< "," <<n2<< endl;
else if (n1==n3 && n2<n3 )
cout << n1<< "," <<n3<< "," <<n2<< endl;
else if (n1==n3 && n1>n3)
cout << n1<< "," <<n3<< "," <<n2<< endl;
else if (n2==n3 && n1>n3)
cout << n2<< "," <<n3<< "," <<n1<< endl;
else if (n2==n3 && n1<n3)
cout << n1<< "," <<n2<< "," <<n3<< endl;
Statt dem könnte man diese Operatoren (schon bei den ersten
paar Abfragen) verwenden:
<= kleiner gleich
>= größer gleich
Die "bessere Lösung" wären dann Arrays, falls du dich damit
schon auseinandergesetzt hast.
Quote:
|
_getch() in der conio.h.. Aber bitte NICHT verwenden. Gewöhne dir das erst gar nicht an. Die conio.h ist von nichts und niemanden standard. Und du brauchst sie in den allermeisten Fällen auch nicht. Sie wird nichtmal von allen Compilern EINER Plattform unterstützt. Also vergiss sie schnell wieder..
|
Gibt es dafür auch gute Gründe ? (außer die Plattform(un)abhängigkeit)
Außerdem fällt mir auf die schnelle nicht einmal eine Alternative ein,
die genauso wie _getch funktioniert.
|
|
|
06/08/2012, 20:35
|
#14
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Es geht nicht um die Plattformunabhängigkeit, sondern darum, dass die conio.h kein Teil irgendeines Standards ist. Du kannst nichmal sicher sein, dass alle Compiler für Windows das unterstützen..
|
|
|
06/08/2012, 21:16
|
#15
|
elite*gold: 11
Join Date: Feb 2010
Posts: 8,312
Received Thanks: 4,589
|
Quote:
Originally Posted by xNopex
Es geht nicht um die Plattformunabhängigkeit, sondern darum, dass die conio.h kein Teil irgendeines Standards ist. Du kannst nichmal sicher sein, dass alle Compiler für Windows das unterstützen..
|
Wenn man zimperlich ist, sollte man auch 'std::' verwenden und 'using namespace std' weglassen.
Aber für die ersten Programme ist es ganz praktisch, wie '_getch();' finde ich.
Aber jeder hat seine eigene Weise zu programmieren, insofern macht es erst Sinn über sowas zu diskutieren, wenn durch eine falsche Entscheidung zu 100% Fehler entstehen, was, wie gesagt, hier nicht der Fall sein sollte.
|
|
|
 |
|
Similar Threads
|
While Schleifen parallel?
02/24/2012 - AutoIt - 9 Replies
nabend leute!
ich beschäftige mich seit wenigen Stunden mit AutoIt hauptsächlich um mir erstmal selbst nen Bot zu basteln für Swtor.
nun meine Frage zu diesem Script hier ist, wie schaff ich es das er nach der ersten While Schleife die 2te macht? bzw. die letzte sollte immer (falls "true") vor den 2 starten.
hier das script:
WinActive ("Star Wars: The Old Republic")
|
Messer schleifen
01/21/2012 - Off Topic - 2 Replies
Hab ein Taschenmesser mit einer Schwarzen klinge...
die Klinge ist langsam Stumpf.
Die Klinge ist etwa so :
http://www.gagravarr.de/images/messer_vtech_titan x_1.jpg
Ich will sie schleifen, aber als ich letztens eine Schwarze Klinge geschliffen hab war sie dann ca 1 cm nach oben Silber und das will ich nicht.
Hat jemand eine Idee wie man die Klinge schleift?
Mit der Hand ? Schleifstein halt?
|
While Schleifen Problem
12/31/2010 - AutoIt - 24 Replies
Hi Com.,
ich habe einen Fritzbox ip changer geschrieben.
Alles klappt wunderbar, nur macht mir die while schleife zu schaffen.
Hier mein Script.
#include <INet.au3>
|
Probleme mit den Schleifen x.x
07/23/2010 - AutoIt - 18 Replies
Ja, hallo. :D
Mein Problem ist das ich gerne einen Bot bauen würde der einnen Tastendruck ausführt wenn sich ein bestimmer Pixel auf dem Bildschirm verändert.
Nur ist das Problem das AutoIt zu lahm ist da der Pixel sich schnell beweget und somit auch seine Farbe ändert und der Bot dann es nichtmehr schafft zuzuschlagen. :P
Was ich nun versucht hab ist das man vll. sozusagen eine Tolleranz einbaut wie z.b. bei dem Pixelsearch Befehl nur ich hab ka. wie ich das anstellen soll.
Ich...
|
All times are GMT +1. The time now is 12:28.
|
|