Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Informatik in der Schule (http://www.informatikerboard.de/board/board.php?boardid=21)
--- C++ (http://www.informatikerboard.de/board/thread.php?threadid=1388)


Geschrieben von info am 18.03.2013 um 13:12:

 

Diese Zeile wirkt auf mich irgendwie komisch:
for(int i = 0; i < n-1; i++)
{
for(int j = 0; j < n-1; j++)
{

Warum ist da einmal j und einmal i ???



Geschrieben von eulerscheZahl am 18.03.2013 um 15:58:

 

Das hängt mit der Funktionsweise des Bubblesort zusammen:
In einem Durchgang wird eine Zahl immer nur mit einem Nachbarn vertauscht:
Bsp.:
Zahlen sind 1, 4, 3, 2 -> geordnet: 1, 2, 3, 4.
Aber der Algorthmus schiebt die 4 nicht direkt ans Ende, weil immer nur mit den Nachbarn vergleichen wird:
1 < 4, es wird also nicht getauscht
4 > 3 -> tauschen: 1, 3, 4, 2
4 > 2 -> tauschen: 1, 3, 2, 4

so sieht die Zahlenfolge nach einem Durchlauf aus, es muss nochmal sortiert werden. Dafür die äußere Schleife.

Zitat:
Warum ist da einmal j und einmal i

Die Frage ist vorallem: WO i und WO j?
Da habe ich nämlich auch einen Fehler eingebaut.



Geschrieben von info am 18.03.2013 um 17:49:

 

Stimmts so?

[ code]
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
int n;
int zahl[5];
cout << "Anzahl der einzulesenden Elemente: ";
cin >> n;
if (n > 5)//Plausibilitaetskontrolle
{
cout << "Es sind nicht genug Elemente verfügbar" << endl;
}
else
{
cout<<"Elemente eingeben\n";
for (int i = 0; i < n; i++)//Eingabe der Arrayelemente
{
cout << i+1 << ". Zahl: ";
cin >> zahl[i];
}

//Bubblesort
//größtes nach oben
for(int i = 0; j < n-1; j++)
{
for(int i = 0; i < n-1; i++)
{
if(zahl[i] > zahl[i+1])
{//tauschen
int tmp = zahl[i];
zahl[i] = zahl[i+1];
zahl[i+1] = tmp;
}
}
}
cout << "\nsortiert:" << endl;
for(int i = 0; i < n; i++)
{
cout << zahl[i]<< endl;
}
}
system("PAUSE");
return 0;
} [ /code]



Geschrieben von Karlito am 18.03.2013 um 18:02:

 



code:
1:
2:
3:
4:
5:
g++ narf.c 
narf.c: In Funktion »int main()«:
narf.c:28:18: Fehler: »j« wurde in diesem Gültigkeitsbereich nicht definiert


Editg: Schau dir die äußere Schleife noch einmal an!



Geschrieben von info am 18.03.2013 um 22:08:

 

Oh nein jetzt habe ich auch keine Ahnung .

Was mache ich jetzt?



Geschrieben von Karlito am 18.03.2013 um 22:51:

 

Schau dir die Zeile 28 noch mal genau an. Was stimmt da nicht? Danach stimmt glaube alles (habe nicht komplett getestet und nachvollzogen)

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
	int n;
	int zahl[5];
	cout << "Anzahl der einzulesenden Elemente: ";
	cin >> n;
	if (n > 5)//Plausibilitaetskontrolle
	{
		cout << "Es sind nicht genug Elemente verfügbar" << endl;
	}
	else
	{
		cout<<"Elemente eingeben\n";
		for (int i = 0; i < n; i++)//Eingabe der Arrayelemente
		{
			cout << i+1 << ". Zahl: ";
			cin >> zahl[i];
		}

		//Bubblesort
		//größtes nach oben
		for(int i = 0; j < n-1; j++)
		{
			for(int i = 0; i < n-1; i++)
			{
				if(zahl[i] > zahl[i+1])
				{//tauschen
					int tmp = zahl[i];
					zahl[i] = zahl[i+1];
					zahl[i+1] = tmp;
				}
			}
		}
		cout << "\nsortiert:" << endl;
		for(int i = 0; i < n; i++)
		{
			cout << zahl[i]<< endl;
		}
	}
	system("PAUSE");
	return 0;
}



Geschrieben von info am 20.03.2013 um 22:37:

 

In zeile 28 müsste das stehen oder:

for(int i = 0; i < n-1; i++)

Richtig?



Geschrieben von eulerscheZahl am 21.03.2013 um 15:56:

 

Du sollst hier nicht wild drauflosraten, sondern logisch überlegen und das Resultat dieser Überlegungen testen, statt hier zu fragen - dann musst du auch keine 17 Stunden auf eine Antwort warten.

Nein, das ist so nicht richtig.
Bei dem, was Karlito dir zusammengefasst hat, musst du nur noch einen Buchstaben ändern.



Geschrieben von info am 21.03.2013 um 20:24:

 

Äh int j = 0. oder?



Geschrieben von eulerscheZahl am 22.03.2013 um 06:57:

 

Aus dem Fragezeichen schließe ich, dass du das Programm wieder nicht getestet hast.
Aber ja, so funktioniert es.

Was müsstest du ändern, damit genau anders herum sortiert wird, also die größte Zahl zuerst?



Geschrieben von info am 25.03.2013 um 18:18:

 

Ok auf zum letzten Teil der Aufgabe:

2) Es ist ein Programm zu erstellen, in welchem genau drei Zahlen in drei Variable (z.B. a,b,c)
eingelesen werden. Diese drei Werte sollen so in drei neue Variable (z.B. x,y,z) umgespeichert
werden, dass diese sortiert sind. Für die neuen Variablem muss also gelten: x<=y<=z .
Danach sind diese drei Zahlen sortiert auszugeben.
Dieses Programm ist damit ein Spezialfall der Aufgabe aus 1).
Achten Sie in dem Programm auf
ausreichend Kommentare
einrücken bei den Abfragen
gefällige Ausgabe unter Verwendung von Manipulatoren.

Es ist ein Programm zu erstellen, in welchem genau drei Zahlen in drei Variable (z.B. a,b,c)
eingelesen werden. Diese drei Werte sollen so in drei neue Variable (z.B. x,y,z) umgespeichert



Kann man das nicht so machen:

int a;

int b;

int c;


int a = x;

int b = y;

int c = z ;

Würde das umspeichern so gehen ?



Geschrieben von eulerscheZahl am 25.03.2013 um 20:09:

 

Mein Compiler sagt: der Bezeichner "x" ist nicht definiert.
Das ist auch nicht verwunderlich, es müsst schließlich heißen int x=a;

Sortiert ist damit aber immer noch nichts.
Wenn in der Variablen x der kleinste Wert stehen soll, geht das am einfachsten mit
int x = min(a, min(b, c)); //davor #include <cmath>



Geschrieben von info am 26.03.2013 um 08:29:

 

OK dann mache ich das wohl so oder:

int x = a;

int y = b;

int z = c;


Kann ich nicht zum sortieren auch die if schleife benutzen oder while?



Geschrieben von Karlito am 26.03.2013 um 08:58:

 

Hallo,

du kannst testen ob das richtig ist, indem du zuerst a, b und c einliest und nachdem du umgespeichert hast, x y und z ausgibst. Die Sortierung würde ich mit If-Abfragen realisieren. Es gibt keine if-schleifen!

VG,

Karlito



Geschrieben von Karlito am 26.03.2013 um 13:30:

 

Falls Du keine Lust hast ist hier ein Programm, was die Aufgabe löst:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char **argv){
	int r = 0;
	int a, b, c, x, y, z;

	cout << "Bitte Zahlen eingeben!" << endl;
	cout << "Zahl 1: ";
	cin >> a;
	cout << "Zahl 2: ";
	cin >> b;
	cout << "Zahl 3: ";
	cin >> c;

	r = (a<b)<<2|(a<c)<<1|(b<c);

	x = ((r==0x7)|(r==0x6))*a|((r==0x3)|(r==0x1))*b|((r==0x4)|(r==0x0))*c;
	y = ((r==0x3)|(r==0x4))*a|((r==0x7)|(r==0x0))*b|((r==0x6)|(r==0x1))*c;
	z = ((r==0x1)|(r==0x0))*a|((r==0x6)|(r==0x4))*b|((r==0x7)|(r==0x3))*c;

	cout << x << "," << y << "," << z << endl;

}


VG,

Karlito


Forensoftware: Burning Board, entwickelt von WoltLab GmbH