Autor Beitrag
mick
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Sa 08.04.06 23:25 
ich bin doch tatsaechlich nicht in der lage den fehler in folgendem pascal-code (hoffentlich stellt das jetzt kein problem dar) zu finden.
zwei insertionsort-implementierungen sind da zur wahl, beide machen die gleichen mucken: die fuehrende zahl im array wird nicht wegsortiert. warum? liegt der fehler im testhauptprogramm oder in der prozedur oder was?

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:
program MiJoZi_Test;
uses crt;
var
  i,j : integer;
  feld: array[1..10of longint;

{ ************************************************************************** }

{ Uebergabe: Zu sortierendes Feld, das an den Stellen 1 bis n mit natuerlichen Zahlen belegt ist }

(* FEHLERHAFT!!! SORTIERT ERSTES ELEMENT NICHT WEG, BZW. VORNE BLEIBT EINE ZAHL STEHEN,
   DIE DORT NICHT HINGEHOERT!!! *)


Procedure InsertionSort(Var Feld: Array Of LongInt);
Var
  i, j: LongInt;  { Zaehlvariablen }
  Temp: LongInt;  { Zwischenspeicher }
Begin
  For i := 2 To High(Feld) Do Begin  { High liefert (Nummer vom) hoechsten Feldindex }
    Temp := Feld[i];
    j := i - 1;
    While (Feld[j] > Temp) And (j > 0Do Begin
      Feld[j+1] := Feld[j];
      j := j - 1;
    End;
    Feld[j+1] := Temp;
  End;
End;

(* Alternativ (funktioniert auch nicht mit dem untigem Test-Hauptprogramm):
Procedure InsertionSort(Var Feld: Array Of LongInt);
Var
  i, j: LongInt;  { Zaehlvariablen }
  Temp: LongInt;  { Zwischenspeicher }
Begin
  For i := 2 To High(Feld) Do Begin  { High liefert (Nummer vom) hoechsten Feldindex }
    Temp := Feld[i];
    j := i;
    While (Feld[j-1] > Temp) And (j <> 1) Do Begin
      Feld[j] := Feld[j-1];
      j := j - 1;
    End;
    Feld[j] := Temp;
  End;
End; *)


{ ************************************************************************** }


begin
  clrscr;
  randomize;
  for i := 1 to 5 do begin  { 5 Testdurchlaeufe }
    for j := 1 to 10 do feld[j] := random(10);  { Fuellen mit Ziffern 0 bis 9 }
    write (i:2,') Unsortiert: ');  { Unsortiert ausgeben }
    for j := 1 to 10 do write (' ',feld[j]);
    writeln;
    Insertionsort(feld);  { Sortieren }
    write ('    Sortiert  : ');  { Sortiert ausgeben }
    for j := 1 to 10 do write (' ',feld[j]);
    writeln; writeln;
  end;
  writeln;
  readln;
end.


ciao,
mick.


Zuletzt bearbeitet von mick am Sa 08.04.06 23:39, insgesamt 2-mal bearbeitet
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 08.04.06 23:27 
Zeile 19: warum fängst du bei i = 2 an zu zählen? Dynamische Arrays beginnen immer mit dem Index 0, wenn sie an eine Prozedur übergeben werden.

AXMD
mick Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Sa 08.04.06 23:33 
danke. sollte es dann i := 1 heissen? das klappt bei mir auch nicht.

ciao,
mick.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 08.04.06 23:38 
Kannst du "klappt nicht" vielleicht etwas genauer beschreiben :roll: ? Außerdem würde ich dich bitten, das "bloed oder was?!" aus dem Titel zu entfernen.

Danke
AXMD
mick Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Sa 08.04.06 23:44 
klappt nicht bedeutet, dass ich nach wie vor dasselbe problem habe: die vorderste zahl wird nicht wegsortiert.

eine moeglichkeit waere jedoch folgende modifiktion, wie ich grade sehe:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{...}
For i := 1 To High(Feld) Do Begin  { High liefert (Nummer vom) hoechsten Feldindex }
    Temp := Feld[i];
    j := i - 1;
    While (Feld[j] > Temp) And (j > -1Do Begin
{...}


das muesste jetzt "klappen".
weiss nur noch nicht, was das alles mit dynamischen arrays zu tun hat. die gibt es doch noch nicht bei pascal, oder? wie kann mein compiler hier dann (und: wo?) dynamische arrays akzeptieren?

ciao,
mick.


ps: titel editiert. (hui, seid ihr restriktiv.)


Zuletzt bearbeitet von mick am So 09.04.06 00:07, insgesamt 1-mal bearbeitet
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 08.04.06 23:46 
user profile iconmick hat folgendes geschrieben:
weiss nur noch nicht, was das alles mit dynamischen arrays zu tun hat. die gibt es doch noch nicht bei pascal, oder? wie kann mein compiler hier dann (und: wo?) dynamische arrays akzeptieren?


Was ist dann das Array in Zeile 14 :gruebel:? Sieht nicht sehr statisch aus...

AXMD
mick Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Sa 08.04.06 23:57 
hm, ok, wenn das auch unter die kategorie dynamische arrays faellt, ok. ich glaube ich muss da mal ein paar luecken schliessen. hatte in erinnerung, dass turbopascal dyn. arrays nicht kennt und es sich hier um eine "gewoehnliche" variablenuebergabe an ein unterprogramm handelt (wie sollte ich die auch anders (nicht dynamisch) gestalten, die array-uebergabe?).

jedenfalls funzt nun das programm. auch wenn dies nicht mehr vielen abgedrucken idealloesungen in skripten etc. entspricht (die erste in meinem ersten posting ist eine). wollte im grunde naemlich wissen, warum ich diese loesungen nicht 1:1 kopieren kann. du sagst wg. dyn. arrays. das scheint zu stimmen, aber ich verstehe es nicht.

danke fuer die programmiertechnische aufklaerung,

ciao,
mick.


Zuletzt bearbeitet von mick am So 09.04.06 00:07, insgesamt 1-mal bearbeitet