C++ Zwei zahlen vergleichen

AirForce

Lt. Junior Grade
Registriert
Okt. 2010
Beiträge
296
Bei diesem Programm vergleicht zwei Zahlen, was die kleinste oder die größte Zahl ist. Doch jetzt muss man folgendes machen. Ich habe zwei Variablen definiert. Das will ich bei jeden Schleifendurchlauf ausgeben. Wenn es der bisher kleinste wert war, dann wird das ausgegeben : bisher der kleinste Wert, und wenn es der größte Wert ist dann: bisher der größte Wert. Und hier brauche ich eure Hilfe.
Code:
int main()
{
	cout << "Bitte geben Sie zwei int Werte ein!\n";
	
	double a;
	int b;
	double c = 0;  // hier die Variablen mit denen man das vergleichen muss
	int d = 0; 
	
	while(cin>>a>>b)
	{
		if(a == '|' || b == '|')
		{
			break;
		}
		else if(a < b)
		{
			cout << "Der groessere Wert ist: " << b << "\n";
			cout << "Der kelinere Wert ist: " << a << "\n";
		}
		else if(a > b)
		{
			cout << "Der groessere Wert ist: " << a << "\n";
			cout << "Der kelinere Wert ist: " << b << "\n";
		}
		else if(a == b)
		{
			cout << "Die Zahlen sinnd gleich!\n";
		}			
	}
        keep_window_open();
}
 
Jeweils für den bisher kleinsten und bisher größten Wert eine neue Variable hernehmen und mit diesen in jedem Schleifendurchlauf vergleichen. Mehr Hilfe gibt's erst, wenn du es zumindest im Ansatz selbst versuchst. Zwei neue Variablen zu deklarieren und dann von anderen den Rest zu erwarten ist der falsche weg, um es zu lernen ;)

btw, Hausaufgabe?
 
Zuletzt bearbeitet:
Nein das ist keine Hausaufgabe! Zu 100% ist das keine Hausaufgabe! Ich will C++ lernen auf eigene faust. Und das aus einen Buch. Wenn ich nicht weiter komme dann frage ich nach Hilfe.
 
Und was genau ist dein Problem?
Wie razor schon sagte - du speicherst die kleinste bisher eingegebene Zahl in einer Variable und die grösste eingegebene Zahl in einer anderen Variablen.
Liest nun eine neue Zahl ein (warum sollte man zwei eingeben) - und vergleichst die Werte.

Warum liest du einmal double und einmal int? Und wozu Zeile 12-15?
 
Ist es Vorgabe deines Buches, zwei verschiedene Datentypen herzunehmen? Falls c und d deine Variablen für "größter" und "kleinster" sind, dann solltest du dir mal überlegen, welche Genauigkeit deren Datentypen haben, welche Datentypen verarbeitet werden und ob es nicht sinnvoller wäre, für beide den gleichen herzunehmen...

Für die ersten Schritte wäre pures C übrigens angebrachter. Das vermittelt einen solideren Eindruck als das unübersichtliche rumgepfusche mit iostreams. Oder könntest du mir anhand der Zeile "cin>>a>>b;" sofort sagen, welcher Wert zuerst eingelesen wird?
 
Zuletzt bearbeitet:
Zeile 12-15 ist das man die Schleife beenden kann oder in Programm aus der schleife kommt und dann sich das Programm beendet. Habe hier etwas versucht aber das geht auch nicht so richtig. Überlege ob ich die Werte doch im einen Vector geben soll. Die Übung verlangt einen int und einen double wert.
Code:
                 if(c < a)
		{
			c = a;
			cout << "Bisher der kleinste Wert " << c << "\n";
		}
		if(c > a)
		{
			c = a;
			cout << "Bisher der groesste Wert " << c << "\n";
		}
		if(d < b)
		{
			d = b;
			cout << "Bisher der kleinste Wert " << d << "\n";
		}
		if(d > b)
		{
			d = b;
			cout << "Bisher der groesste Wert " << d << "\n";
		}
 
Du speicherst für den kleinsten Wert immer den größten und für den größten immer den kleinsten.... ;)
 
Aussagekräftige Variablennamen wären auch keine schlechte Sache ... ;)
Ergänzung ()

razor90 schrieb:
Für die ersten Schritte wäre pures C übrigens angebrachter. Das vermittelt einen solideren Eindruck als das unübersichtliche rumgepfusche mit iostreams. Oder könntest du mir anhand der Zeile "cin>>a>>b;" sofort sagen, welcher Wert zuerst eingelesen wird?


Papperlappapp, was ist denn daran unübersichtlicher als an scanf() & co?
 
So jetzt stürzt das Programm ab. Habe das gemacht:
Code:
int main()
{
	cout << "Bitte geben Sie zwei int Werte ein!\n";

	double a;
	int b;
	int max,min;
	vector<double> num; 
	
	while(cin>>a>>b)
	{
		num.push_back(a);
		num.push_back(b);
		if(a == '|' || b == '|')
		{
			break;
		}
		else if(a < b)
		{
			cout << "Der groessere Wert ist: " << b << "\n";
			cout << "Der kelinere Wert ist: " << a << "\n";
		}
		else if(a > b)
		{
			cout << "Der groessere Wert ist: " << a << "\n";
			cout << "Der kelinere Wert ist: " << b << "\n";
		}
		else if(a == b)
		{
			cout << "Die Zahlen sinnd gleich!\n";
		}
		sort(num.begin(),num.end());
		for (int i = 0;i<num.size();++i)                            
	        {
	        if(num[i]>max) max = num[i];
                if(num[i]<min) min = num[i];
         
		        cout << "Bisher der kleinste Wert:" << min << "\n";
		        cout << "Bisher der groesste Wert:" << max << "\n";
		}
	}

	keep_window_open();
}
 
Häng dich mit dem Debugger dran, dann weißt du genau WO er abschmiert. Warum weigern sich hier so viele, ihren Debugger zu nutzen?? :freak:

Weil's mich interessiert hat, habe ich dein Programm mal eben debuggt. In deinem Code kracht's in Zeile 35, weil du dort lesend auf die Variable max zugreifst, ohne sie vorher initialisiert zu haben.
 
Zuletzt bearbeitet:
Der Debugger sagt das die Variablen min und max nicht initialisiert sind.
 
In den man min und max initialisiert. Doch wenn ich einen Wert gebe wird die Ausgabe nicht korrekt. Wenn ich min mit 0 initialisiere dann wird die 0 immer als die kleinste Zahle ausgeben, und das gleiche mit max.
 
AirForce schrieb:
In den man min und max initialisiert. Doch wenn ich einen Wert gebe wird die Ausgabe nicht korrekt. Wenn ich min mit 0 initialisiere dann wird die 0 immer als die kleinste Zahle ausgeben, und das gleiche mit max.


Genau. Deshalb mußt du min mit dem größt-möglichen Wert intialisieren, den ein int haben kann. Umgekehrt mußt du max mit dem kleinst-möglichen Wert initialisieren.

Also

Code:
#include <limits>

// ...
int min = std::numeric_limits< int >::max();
int max = std::numeric_limits< int >::min();
 
Ich habe das gemacht:
Code:
int max = 0;
int min = 9999999;
Und es geht jetzt. Oder so wie du geschrieben hast.
 
Wenn man es schon von Hand machen will - ich halt es für sinnvoll, min und max einfach jeweils mit dem ersten Element zu initialisieren (und das erste Element eben zu Beginn dann auch als größtes und kleinstes zu betrachten...)

Willkürlich gewählte Werte wie diese können später mal mehr Probleme machen als man vielleicht zunächst denkt...
 
wenn er sie aber auf die limits setzt ist es definitiv nicht falsch
da im ersten durchgang eigentlich nichts anderes passiert
also
min = zahl
max = zahl

da zahl kleiner maxint und zahl größer minint
 
Dann wird der Datentyp mal von int auf long geändert und wieder vergessen die Limits anzupassen... oder man stelle sich mal eine generische Template-Klasse mit einer solchen Methode vor...
Das einzige, was bei meinem Ansatz ein Problem darstellt, ist wenn die Liste leer ist, aber ob es da richtig ist die Grenzen zu ermitteln ist genauso fraglich...
 
Zurück
Oben