moin,
Wir sollen für Informatik ein Sortierprogramm schreiben.
Unser Lehrer hat uns eine Datenbank mit 10.000 Zahlen von 1-10.000 gegeben (also theoretisch alles in integer-Bereich^^) und wir sollen ein Programm schreiben, das diese sortiert.
Ich habe das jetzt wie folgt gemacht:
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: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); procedure sortieren(Sender: TObject); procedure schreiben(Sender: TObject); function position(gesamt,unten,oben: integer): integer; procedure schieben(i,a: integer); private public end;
var Form1: TForm1; eingabe, ausgabe: array [1..10000] of integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); var datei : file of integer; i,zahl : integer;
begin assignfile(datei,'c:\sorttest.dat'); reset(datei); i:=1; while not eof(datei) do begin read(datei,zahl); eingabe[i] := zahl; i:=i+1; end; closefile(datei); sortieren(Sender); schreiben(Sender); end;
procedure TForm1.sortieren(Sender: TObject); var i: integer; begin ausgabe[1] := eingabe[1]; for i := 2 to 10000 do begin if eingabe[i] >= ausgabe[i-1] then ausgabe[i] := eingabe[i] else schieben(i,i); end; end;
procedure TForm1.schieben(i,a : integer); begin repeat begin i := i-1; ausgabe[i+1] := ausgabe[i]; end; until i = position(a,0,a); ausgabe[i] := eingabe[a]; end;
function TForm1.position(gesamt,unten,oben : integer): integer; var a : integer; begin if (unten+1) = oben then result := oben else begin a := round(oben-((oben-unten)/2)); if eingabe[gesamt] > ausgabe[a] then result := position(gesamt,a,oben) else if eingabe[gesamt] = ausgabe[a] then result := a else if eingabe[gesamt] < ausgabe[a] then result := position(gesamt,unten,a); end; end;
procedure TForm1.schreiben(Sender: TObject); var i : integer; begin for i := 1 to 10000 do listbox1.Items.Add(inttostr(i)+ '. ' +inttostr(ausgabe[i])) end; end. |
Das Programm läuft auch ganz gut und schön schnell, sortiert auch alles korrekt, jedoch liefert er mir jedes mal bei ca. der 336. Stelle die Fehlermeldung:
"Project Datensort.exe raised exeption class with message ". Process stopped. Use step or run to continue."
in Zeile 62.
(ja,ja, ich weiß, ich hohl mir bald ein Delphi auf Deutsch, amt hab ich noch Delphi 3, falls das relevant ist^^
edit: wieso geht eigendlich der Delphi 2005-Download nichtmehr? -.-)
Hat jemand eine Idee, woran das liegen könnte und wie man das wieder los wird?
thx für Hilfe
MfG
Schadowmaster
PS: Ich hoffe die (gewünschte) Funktionsweise des Programms ist selbsterklärend, falls nicht einfach nachfragen
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
edit: So, mit vereinter Kraft des Informatikkurses wurde der Fehler, wenn auch nicht behoben, so doch umgangen.^^
Das Problem lag scheinbar darin, dass die Abruchbedingung der repeat-Schleife jedesmal eine eigene Funktion aufruft und durchlaufen lässt...
Jedenfalls habe ich die Funktion "position" nur einmal, vor der repeat-Schleife, ausgeführt und das Programm läuft.
Von dahher sorry, euch damit genervt zu haben und kann geclosed werden.
