Probleme mit if schleifen

06/07/2012 11:59 Hildeus#1
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:

[Only registered and activated users can see links. Click Here To Register...]


aber eigentlich sollte ja nur eine ausgabe kommen :(

lg
simon
06/07/2012 12:20 .SkyneT.#2
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 21_0x15_025_NAK#3
Ich wollte dazu noch was sagen:
[Only registered and activated users can see links. Click Here To Register...]

Oh sry hat Skynet ja schon gesagt...
06/07/2012 12:35 xNopex#4
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 Status#5
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 Hildeus#6
danke :)
eine frage noch: wiso benutzt du dauernd else if?

und in welcher header dateie ist _getch(); definiert?
06/08/2012 19:37 xNopex#7
_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 Status#8
Quote:
Originally Posted by ~[Dr.]FuD~ View Post
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 View Post
_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 Hildeus#9
Quote:
Originally Posted by xNopex View Post
_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 Status#10
Quote:
Originally Posted by ~[Dr.]FuD~ View Post
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 xNopex#11
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 Hildeus#12
Quote:
Originally Posted by °Status View Post
Wie nur die Definition von _getch?
ja, da ich den rest aus der .h nicht brauche. (im moment zumindest)
06/08/2012 20:16 .SkyneT.#13
Quote:
Originally Posted by ~[Dr.]FuD~ View Post
ja, da ich den rest aus der .h nicht brauche. (im moment zumindest)
Willst du jetzt die conio.h zerlegen ?
Naja, [Only registered and activated users can see links. Click Here To Register...] 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 xNopex#14
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 Status#15
Quote:
Originally Posted by xNopex View Post
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.