Autor Beitrag
Schadowmaster
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mi 13.05.09 19:11 
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:

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  eingabe, ausgabe: array [1..10000of 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-1then 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 user profile iconNarses: 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. ;)