Sortieralgorithmus
-
Hi,
Ich soll für die Schule ein Programm schreiben, dass so aufgebaut ist:[ ] [ ] [ ] [EINGABE] [ ] [ ] [ ] [SORTIEREN] [ ] [ ] [ ] [AUSGABE]
Das alles mit einer GUI. Also Buttons und Edit Felder. Mann soll die oben aufgefürten Felder nun mit Zahlen auffüllen, auf "Eingabe", "Sortieren" und "Ausgabe" klicken. Die Zahlen werden jetzt nach größe in den Feldern sortiert. Das alles mit einem Bubblesort-Algorithmus.
Das habe ich schon:Eingabe:
void __fastcall TForm1::BtnEigabeClick(TObject *Sender) { Feld[0][0]=Edit1->Text.ToInt(); Feld[0][1]=Edit2->Text.ToInt(); Feld[0][2]=Edit3->Text.ToInt(); Feld[1][0]=Edit4->Text.ToInt(); Feld[1][1]=Edit5->Text.ToInt(); Feld[1][2]=Edit6->Text.ToInt(); Feld[2][0]=Edit7->Text.ToInt(); Feld[2][1]=Edit8->Text.ToInt(); Feld[2][2]=Edit9->Text.ToInt();
Sortieren:
while(blSortiertV==false && blSortiertH==false) { for(int i=0;i<3;i++) { for(int j=0;j<2;j++) { if(Feld[i][j]>Feld[i][j+1]) { int SpeicherStelle=Feld[i][j+1]; Feld[i][j]=Feld[i][j+1]; Feld[i][j+1]=SpeicherStelle; } else { nSortiertV=nSortiertV+1; } if(nSortiertV==6) { blSortiertV=true; } } } nSortiertV=0; for(int i=0;i<3;i++) { for(int j=0;j<2;j++) { if(Feld[j][i]>Feld[j][i+1]) { int SpeicherStelle=Feld[j][i+1]; Feld[j][i]=Feld[j][i+1]; Feld[j][i+1]=SpeicherStelle; } else { nSortiertH=nSortiertH+1; } if(nSortiertH==6) { blSortiertH=true; } } } nSortiertH=0; }
Ausgabe:
edt1->Text=Feld[0][0]; edt2->Text=Feld[0][1]; edt3->Text=Feld[0][2]; edt4->Text=Feld[1][0]; edt5->Text=Feld[1][1]; edt6->Text=Feld[1][2]; edt7->Text=Feld[2][0]; edt8->Text=Feld[2][1]; edt9->Text=Feld[2][2];
Das Programm startet zwar, allerdings werden alle Felder mit 1en ausgefüllt statt sortiert.
Weiß jemand wo der Fehler liegt?
Danke
-
Hallo,
ich hoffe ich habe mich auf die Schnelle nicht verrannt, ich habe deinen Code mal kommentiert:
while(blSortiertV==false && blSortiertH==false) { for(int i=0;i<3;i++) { for(int j=0;j<2;j++) { // Edit: 1. Durchgang, [0][0] ist größer als [0][1]: // => Danke @ RandomAccess85 für die Korrektur if(Feld[i][j]>Feld[i][j+1]) { int SpeicherStelle=Feld[i][j+1]; // speichert Feld[0][1] Feld[i][j]=Feld[i][j+1]; // schreibt Feld[0][1] in Feld[0][0] // => Feld[0][0] ist verloren gegangen, du solltest also [0][0] speichern (bzw. [i][j]) Feld[i][j+1]=SpeicherStelle; // schreibt gespeicherten Inhalt von [0][1] in [0][1] // ==>> merkste was? ;) } else { nSortiertV=nSortiertV+1; // Hinweis: => auch möglich: nSortiertV++ (erhöht die Variable um 1) } if(nSortiertV==6) { blSortiertV=true; } } } nSortiertV=0; // = false; => damits einheitlich ist // ... reicht erstmal ... }
2 Sachen vielleicht als Anmerkung:
1. Benutze den Debugger, er ist ein einfaches aber mächtiges Werkzeug. Platziere Haltepunkte in den Schleifen und schau dir bei jedem Durchgang die Werte an. Auf diese Weise findest du viele Fehler von allein. Probier es aus, den Debugger zu benutzen ist echt nicht schwer!
2. zur Ausgabe: Ich denke es muss so aussehen:
edt1->Text=IntToStr(Feld[0][0]);
Ich hoffe das hilft dir weiter
MfG
-
Wie ist denn Feld deklariert?
-
Feld[0][0]=Edit1->Text.ToInt();
dem Code nach zu urteilen müsste es int sein... aber warten wir's ab.
-
Ich spekuliere auf TVariant mit Casten nach bool ?!
-
n Zehner oder was? Wer schlägt durch?
-
Kolumbus schrieb:
if(Feld[i][j]>Feld[i][j+1]) { // 1. Durchgang, [0][1] ist größer als [0][0]: }
Hi,
<schönheitskorrektur an>
wenn [i][j] = [0][1] ist kann [i][j+1] nicht [0][0] seinif(Feld[i][j]>Feld[i][j+1]) { // 1. Durchgang, [0][0] ist größer als [0][1]: }
</und wieder aus>
mfg, Micha ^^
-
@RandomAccess85:
[GrummelModus]
Ja, hast Recht.
[/GrummelModus]MfG