C++ Zwei zahlen vergleichen

AirForce

Lt. Junior Grade
Dabei seit
Okt. 2010
Beiträge
293
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();
}
 

razor90

Cadet 3rd Year
Dabei seit
Feb. 2006
Beiträge
38
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:

AirForce

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
293
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.
 

inter2k3

Lieutenant
Dabei seit
Juni 2004
Beiträge
807
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?
 

razor90

Cadet 3rd Year
Dabei seit
Feb. 2006
Beiträge
38
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:

AirForce

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
293
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";
		}
 

razor90

Cadet 3rd Year
Dabei seit
Feb. 2006
Beiträge
38
Du speicherst für den kleinsten Wert immer den größten und für den größten immer den kleinsten.... ;)
 

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
Aussagekräftige Variablennamen wären auch keine schlechte Sache ... ;)
Ergänzung ()

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?
 

AirForce

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
293
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();
}
 

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
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:

AirForce

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
293
Der Debugger sagt das die Variablen min und max nicht initialisiert sind.
 

AirForce

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
293
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.
 

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
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();
 

AirForce

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
293
Ich habe das gemacht:
Code:
int max = 0;
int min = 9999999;
Und es geht jetzt. Oder so wie du geschrieben hast.
 
1

1668mib

Gast
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...
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
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
 
1

1668mib

Gast
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...
 
Top