C++ Zahlen sortieren mit if-else Verknüpfungen

meph!sto

Vice Admiral
Registriert
Nov. 2003
Beiträge
6.287
Hi,
ich lerne gerade im Studium C++ und wir haben die Aufgabe bekommen,
3 eingelesene Zahlen einmal aufsteigend und einmal absteigend zu sortieren.

Ich habe da aber übele Probleme meine Gedanken in die richtige Syntax zu bringen.

Code:
	cout<<" Bitte erste Zahl eingeben\t"; //eingabe der ersten zahl
		cin>>a;
		cout<<" Bitte zweite Zahl eingeben\t"; //eingabe der zweiten zahl
		cin>>b;
		cout<<" Bitte dritte Zahl eingeben\t"; //eingabe der dritten zahl
		cin>>c;

		if (c<b)
		{
			zahl2=c;
			zahl3=b	
			else
				{
					zahl3=c;
					zahl2=b;
					{
						if (c<a)
						{
							zahl1=c;
							zahl2=a;
							else
							{
								zahl2=c;
							}
								if (a<b)
								{
									zahl1=a;
									zahl2=b;
								else
									zahl2=a;
									zahl1=b;
								}
						}
					}
		}

Er soll also erstmal c mit b vergleichen und wenn c kleiner ist als b, dann soll die Variable "zahl2" den Wert von c erhalten und die Variable "zahl3" den Wert von b, wenn nicht dann soll halt zahl2=b und zahl3=c sein.
Im nächsten Schritt soll der Wert, der unter "zahl2" gespeichert ist, mit a verglichen werden.

Ich weiß aber ehrlich gesagt, nicht mal ob meine Gedanken irgendwie richtig sind.
Kann mir bitte einer helfen, danke!

P.S: Bitte verständlich erklären, programmieren ist überhaupt nicht meine Stärke.
 
1. Dass es Mist ist weiß ich auch, weil es nicht funktioniert
2. Wir sollen das mit if-else lösen
3. Dass es Sortieralgorithmen gibt, weiß ich auch, nur sollen wir diese eben nicht nutzen.
4. Auf so dumme Kommentare kann ich echt verzichten. Wenn es doch ein solcher Mist ist, dann zeig mir mal wie man das macht. Ich sitz hier schließlich seit über 2std und kriege es nicht hin.
 
Ich würde einfach mal sagen es hängt sehr genau von der Aufgabenstellung ab was du machen sollst.
Wenn du einen Sortieralgorithmus nutzen sollst, wird das vermutlich auch gesagt worden sein.

So wie ich es sehe sollst du schon IF-Statements verwenden...

mach doch sowas in der Art
Code:
if (a < b) {
  // hier weißt du schon mal, dass a kleiner als b ist
  if (c < a) {
    // a ist kleiner als b, und c ist kleiner als a => cab
  } else {
     // a ist kleiner als b, und c ist größer als a
    if (c < b) {
      // a ist kleiner als b, c ist kleiner als b, c ist größer als a => acb
    } else {
[...]

Skizzier dir doch mal einen Entscheidungsbaum

Edit:
4. Auf so dumme Kommentare kann ich echt verzichten. Wenn es doch ein solcher Mist ist, dann zeig mir mal wie man das macht. Ich sitz hier schließlich seit über 2std und kriege es nicht hin.
Und auf solche Kommentare kannst du auch verzichten. Und du sollst was Lernen, hast du nen Führerschein? Ist dein Fahrschullehrer mit dir rumgefahren um dir zu zeigen wie man fährt?
Und ich weiß ja nicht, wir sind nicht dazu da, dir Haus- oder Übungsaufgaben zu machen. Gibt doch bestimmt Übungsgruppen und Kommiltionen, mit denen du dich austauschen kannst - wenn nicht, fang schnell damit an

Zudem hättest du auch mal sagen können, was ihr denn so nützen dürft.
Sind Logische Und-Verknüpfungen erlaubt?
Weißt du, wir sind leider auch keine Hellseher.

Und wenn du selbst weißt dass Programmieren nicht deine Stärke ist, dann ist der Weg hier her der falsche.
 
Zuletzt bearbeitet:
hier mal eine extrem simple Lösung (aber auch sehr ineffizient ^^)


Code:
     const int nElemente=3;          // anzahl der Feld-Elemente
    int zahl[nElemente]={5,1,3};    // Feld bestehend aus drei int-varibalen 
    bool flg=FALSE;                 // gibt an ob alle Elemente in richtiger Reihenfolge
    int cntr=0;                     // Zähler im Feld
    int temp;
    
    while(flg == FALSE)         // solange wiederholen bis alle Elemente in richtiger Reihenfolge 
    {
        flg=TRUE;                               // erst einmal annehmen das alle Elemente richtig sortiert sind
        cntr = 0;                               // zahler auf das erste Element im Feld setzen
        while(cntr!= (nElemente-1))               // Feld durchlaufen
        {
            if(zahl[cntr] > zahl[cntr+1])       // ist aktuelle Zahl größer als die Nächste im Feld?
            {
                flg=FALSE;                      // die Reihenfolge stimmt nicht -> es muss mindesten noch einmal die innere Schleife durchlaufen werden
                temp=zahl[cntr+1];              //|- vertausche die Elemente imm array
                zahl[cntr+1]=zahl[cntr];        //|
                zahl[cntr]=temp;                //| 
            }
            cntr++;                             // zähler erhöhen
        }
    }
 
Zuletzt bearbeitet:
So eine ähnliche Aufgabe hatte ich auch mal. Hier ist der Code von damals. Ist zwar Java und nicht C++ aber so groß dürfte der Unterschied nicht sein.

Code:
System.out.print("Bitte geben sie die erste Zahl an: ");
		int a = In.readInt();
		System.out.print("Bitte geben sie die zweite Zahl an: ");
		int b = In.readInt();
		System.out.print("Bitte geben sie die dritte Zahl an: ");
		int c = In.readInt();
		
		int min = 0;
		int mit = 0;
		int max = 0;		
		
		if (a <= b && a <= c) {
			min = a;
		} else if (b <= a && b <= c) {
			min = b;
		} else {
			min = c;
		}
		
		if (a >= b && a >= c) {
			max = a;
		} else if (b >= a && b >= c) {
			max = b;
		} else {
			max = c;
		}
		
		if (min != a && max != a) {
			mit = a;
		} else if (min != b && max != b) {
			mit = b;
		} else {
			mit = c;
		}
		
		System.out.println(min + " <= " + mit + " <= " + max);
 
hier das sollte klappen:

Code:
#include <iostream>
using namespace std;

int main()
{
	int a;
	int b;
	int c;

	cout << "Geben Sie die erste Zahl ein: ";
	cin >> a;

	cout << "Geben Sie die zweite Zahl ein: ";
	cin >> b;

	cout << "Geben Sie die dritte Zahl ein: ";
	cin >> c;

	if ( a <= b && a <= c )	cout << "a: " << a << endl;
	if ( b <= a && b <= c )	cout << "b: " << b << endl;
	if ( c <= b && c <= a ) cout << "c: " << c << endl;

	if ( a >= b && a <= c )	cout << "a: " << a << endl;
	if ( b >= a && b <= c ) cout << "b: " << b << endl;
	if ( c >= b && c <= a ) cout << "c: " << c << endl;

	if ( a <= b && a >= c )	cout << "a: " << a << endl;
	if ( b <= a && b >= c ) cout << "b: " << b << endl;
	if ( c <= b && c >= a ) cout << "c: " << c << endl;

	if ( a >= b && a >= c )	cout << "a: " << a << endl;
	if ( b >= a && b >= c ) cout << "b: " << b << endl;
	if ( c >= b && c >= a ) cout << "c: " << c << endl;

	system("pause");
	return 0;
}
 
@BlackMark: Geht aber nicht bei Zahlengleichheit...
Deshalb nicht direkt ausgeben sondern Variablen zuweisen...

@Woey: Ich vermute du hast die Obergrenze falsch gesetzt.
Elemente sind 3, richtig.
D.h. du gehst nur von 0-2.
Du vergleichst aber dann noch immer mit dem Folgeelement, also muss es heißen:
Code:
while(cntr < (nElemente-1))

Und auf (Un)gleichheit hier zu Überprüfen ist schlecht. Bei solchen Dingen ist es sinnvoller, Größer/Kleiner(gleich)-Vergleiche zu machen

so könnte es vielleicht gehen.

wenn cntr = 0 ist wird mit 1 verglichen, bei 1 mit 2, bei 2 gibts kein vergleich also ist das Limit 1 = nElements-2
 
Zuletzt bearbeitet:
Ich hab mal ein Struktogramm entwickelt.
Ich bin der Meinung dass das richtig ist, was ich da zusammengeschustert hab.

struktogramm.76ns.jpg


Btw: ich will ja gar nicht dass ihr mir die Aufgaben macht, nur sitze ich hier seit 2 Stunden mit der Aufgabenstellung und dem Buch "C++ Lernen und professionell anwenden" von Prinz und komme einfach nicht weiter.
Da dachte ich einfach ihr gebt mir vllt. den zündenden Funken.
 
Dein Diagramm ist falsch.

Das sieht man schon daran, dass es folgende Möglichkeiten gibt, 3 Zahlen zu sortieren:

123 132 213 231 312 321

Das sind 6 und bei dir gibt es nur 4 verschiedene Ausgaben.
 
Du kannst nach dem ersten if noch gar keine Zuweisung machen! Du weißt ja nur ob a größer oder kleiner als b ist (gleich ignorieren wir einfach mal, ist das selbe wie größer)...
Aber wo ist c? Das weißt du ja noch gar nicht.
vgl.gif

Aber selbst das hier ist noch falsch.

Wenn du weißt dass a<b ist, wie muss der nächste Vergleich aussehen auf der linken Seite? Kannst du nun durch a<c rausfinden, wie b und c zueinander sind? Wohl kaum.
Setz doch einfach mal Zahlen ein für abc und schau ob den Diagramm überhaupt stimmen kann... Z.B. bei 1/3/2 kommt nicht das raus was du willst

Btw: Der Code den ich oben geschrieben hab, also der Anfang, entspricht dem Struktogramm, das du eigentlich haben willst...
Ich hab die Stellen eingegringelt, die nochmal ein IF brauchen.
 
Zuletzt bearbeitet:
Ich hab nochma meine kleinen, grauen Zellen angestrengt und ich glaube diesmal könnte es sogar passen.

struktogramm.2xcae.jpg
 
Das sollte so funktionieren, aber ich versteh nicht wieso du nun c mit zahl1 und zahl2 vergleichst, auch wenn das zeigt dass die zwei unteren Bereiche sehr ähnlich sind... (und man wohl mit etwas Geschick sogar die beiden Blöcke zusammenfügen kamm)
Aber das macht das ganze nicht übersichtlicher für dich, die 2x2 Zuweisungen nach dem ersten IF kannst du dir wie gesagt auch schenken.
 
Stimmt,
mit dem Struktogramm wirds auch klarer wie ich es zu schreiben hab.
 
Wozu die Zuweisungen an zahl1 und zahl2 nach dem Test a<b? Der Witz der Beschränkung auf if-else-Entscheidungen ist doch, daß man einen Entscheidungsbaum erstellt und abklappert, an dessen Blättern die Reihenfolge der 3 Zahlen klar ist und ausgegeben werden kann. Man muß nichts in zusätzlichen Variablen zwischenspeichern, da die Ergebnisse der bereits gemachten Vergleiche an der aktuellen Position im Baum abgelesen werden können.

Wie schon oben einer schrieb, gibts 6 mögliche Reihenfolgen. Um die richtige Reihenfolge zu erkennen, sind maximal 3 Vergleiche nötig. Man bekommt also 3 if-else-Ebenen.

Ich denke Code erklärt das besser als Text. Die 6 Ausgaben per Makro, da sie sonst nur verwirren würden. OUT(a,b,c) steht für
cout << "aufwaerts: " << a << " " << b << " " << c << "\nabwaerts: " << c << " " << b << " " << a << "\n"

Code:
#include <iostream>

#define OUT(X,Y,Z)  cout << "aufwaerts: " << OUTX(X,Y,Z) << "\nabwaerts: " << OUTX(Z,Y,X) << "\n"
#define OUTX(X,Y,Z) X << " " << Y << " " << Z

using namespace std;

int main() {
        int a,b,c;

        cin >> a;
        cin >> b;
        cin >> c;

        if (a < b) {
                if (b < c) {
                        OUT(a,b,c);
                } else {
                        if (a < c) {
                                OUT(a,c,b);
                        } else {
                                OUT(c,a,b);
                        }
                }
        } else {
                if (a < c) {
                        OUT(b,a,c);
                } else {
                        if (c < b) {
                                OUT(c,b,a);
                        } else {
                                OUT(b,c,a); 
                        }
                }
        }
}
 
Zuletzt bearbeitet:
Oder die 6 möglichen Reihenfolgen etwas übersichtlicher:
Code:
if(a <= b && b <= c) OUT(a,b,c);
if(a <= c && c <= b) OUT(a,c,b);
if(b <= a && a <= c) OUT(b,a,c);
if(b <= c && c <= a) OUT(b,c,a);
if(c <= a && a <= b) OUT(c,a,b);
if(c <= b && b <= a) OUT(c,b,a);

Nachteil: Wenn mind. 2 Zahlen gleich sind wird mehr als einmal die Reihenfolge ausgegeben.
 
Zuletzt bearbeitet:
Zurück
Oben