Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sortieren mit direktem Auswahlort (https://www.delphipraxis.net/183041-sortieren-mit-direktem-auswahlort.html)

rebellxsky 7. Dez 2014 13:15

AW: Sortieren mit direktem Auswahlort
 
Erstmal möchte ich mich für die Antworten bedanken.
Trotzdem habe ich noch ein paar Fragen:
1. Um die Zahlen in das Array (sort) einzufügen habe ich das so gemacht:
Delphi-Quellcode:
zahl:= strtoint(edteingabe.caption);
 for a:= min + 1 to bis do
       begin
            sort[a]:= zahl;
       end;
Delphi-Quellcode:
bis := High(sort);
 min := low (sort);
Frage: Funktioniert das so?

2. Um die Zahlen zu sortieren:
Delphi-Quellcode:
For i:= 1 to N-1 Do
   Begin
     min:= i;
     For j:= i+1 To N Do
       If (sort[j] < sort[min]) Then
       min:= j;
bis dahin bin ich gekommen(vgl.http://www.delphipraxis.net/281-tuto...hmen-i-ii.html)
Dort steht nun aber die Werte i und min müssen getauscht werden (Dreieckstausch?). Aber wieso und wie sieht das dann aus?
Und wie kann man dann das sortierte Array auf ein Label ausgeben???

Ich bedanke mich schonmal für alle Antworten.

humbuck 7. Dez 2014 13:35

AW: Sortieren mit direktem Auswahlort
 
Also:
Zitat:

1. Um die Zahlen in das Array (sort) einzufügen habe ich das so gemacht:



Delphi-Quellcode:

zahl:= strtoint(edteingabe.caption);
for a:= min + 1 to bis do
begin
sort[a]:= zahl;
end;
Leider ist nicht genau zu erkennen, wie die chronologische Abfolge deines Quellcodes ist.
Sei mal so nett und poste ihn mal vollständiger...
Im ersten Moment sieht es nämlich so aus, als würde dein Array nach dem Buttonclick immer mit dem jeweiligen Caption Wert gefüllt werden können: d.H. die Felder des Arrays hätten dann alle den selben Wert, wie er nach dem letzten Buttonclick übergeben würde...

Zitat:

Dort steht nun aber die Werte i und min müssen getauscht werden (Dreieckstausch?). Aber wieso und wie sieht das dann aus?
Keine Ahnung... wie du das meinst?

Zitat:

Und wie kann man dann das sortierte Array auf ein Label ausgeben???
Du könntest dein Array mit einer For-Schleife durchlaufen und den jeweiligen Wert nach Umwandlung in ein String (IntToStr(STRING)) + einem Trenner wie einer Leerstelle, Bindestrich oder was weiß ich deinem Label anfügen:

Delphi-Quellcode:
Label1.Caption := '';
For I := 0 To Length(Array)-1 do
  begin
    Label1.Caption := Label1.Caption + IntToStr(Array[i]) + ' ';
  end;

rebellxsky 7. Dez 2014 13:49

AW: Sortieren mit direktem Auswahlort
 
Also das mit dem sortieren klappt erstmal soweit. Denke ich. Siehe hier:
Delphi-Quellcode:
procedure TForm1.btnsortClick(Sender: TObject);
begin
   For i:= 1 to 10-1 Do
   Begin
     min:= i;
     For j:= i+1 To 10 Do
       If (sort[j] < sort[min]) Then
       begin
         h       :=sort[j] ;
         sort[j] :=sort[min];
         sort[min]:=h       ;
       end;
   end;
lblsort.caption := '';
   For i := 0 To Length(sort) do
     begin
       lblsort.caption := lblsort.caption + IntToStr(sort[i]) + ' ';
     end;
end;
Aber das Einfügen geht wirklich nicht.
Hier mal alles von Implementation an:

Delphi-Quellcode:
implementation

{$R *.lfm}

{ TForm1 }
var sort       : array[1..10]of integer;
    zahl, bis, i, a, j, h, min : integer ;
procedure TForm1.FormCreate(Sender: TObject);
begin
 bis := High(sort);
 min := low (sort);
end;

procedure TForm1.btnhinzuClick(Sender: TObject);
begin
 zahl:= strtoint(edteingabe.caption);
 for a:= min + 1 to bis do
       begin
            sort[a]:= zahl;
       end;
 lblunsort.caption := inttostr(sort[1]) + ' hinzugefügt';


end;
Zitat:

Im ersten Moment sieht es nämlich so aus, als würde dein Array nach dem Buttonclick immer mit dem jeweiligen Caption Wert gefüllt werden können: d.H. die Felder des Arrays hätten dann alle den selben Wert, wie er nach dem letzten Buttonclick übergeben würde...
also das array hat nach dem sortieren die ersten beiden Werte = 0; Und die letzten (8) = so groß wie der zuletzt eingegebene Wert.

Ich weiß, das kann eigentlich nicht so schwer sein. Aber ich kenne mich damit nicht aus...

humbuck 7. Dez 2014 14:16

AW: Sortieren mit direktem Auswahlort
 
Zitat:

var sort : array[1..10]of integer;
Das sagt mir ja schon mal, es handelt sich bei dir um statisches Array mit 10 Werten... (Ein Array fängt übrigens bei 0 : Array[0..9])

Auf jeden Fall macht es das schon insgesamt einfacher.

Du musst jetzt nur systematisch vorgehen:

1) Der erste Wert soll nach dem Button-Click an deine Array übergeben werden, natürlich dann auch gleich einsortiert werden.
Das Problem ist, dass, wenn du z.B. drei Mal per Button-Click jeweils unterschiedliche Werte an deine Array übergibst, bekommst du folgendes Ergebnis (Allerdings nicht mit deiner Routine...):

0 0 0 0 0 0 0 14 47 81

Liegt da dran, dass du ja immer noch 7 unbelegte Werte im Array hast.

2) Voraussetzung dafür, dass du überhaupt einen Wert per Button-Click an dein Array gesichert übergeben kannst ist:
a) verhindern, dass du über 10 Werte hinausschießt
b) dass du mithilfe eines für a) notwendigen Zählers ERST alle Werte mit jedem Button-Click an dein Array übergibst und danach oder zwischendurch per zweiten Schalter dein Array sortierst und dann zur Ausgabe an ein Label übergibst.
Sollten dich dann möglicherweise die '0'-Werte bei der Ausgabe stören, kannst du diese ja herausfiltern (alles außer 0 darf dem Label angefügt werden)...
3) Vielleicht solltest du bei der Eingabemöglichkeit für einzelne Werte noch verhindern, dass im TEdit was anderes, außer Ganzahlen eingegeben werden kann, da dein Array ja OF INTEGER ist...

humbuck 7. Dez 2014 14:24

AW: Sortieren mit direktem Auswahlort
 
Noch ein Nachtrag:

Wenn du z.B. drei Werte übergeben hast, dann mal 'kurz' sortierst fehlt dir plötzlich die Position, wo du weitere in dein Array füllen kannst, da dann deine Zählerposition hinfällig ist.

Daher wäre es das Einfachste, erst alle Werte zu übergeben und danach zu sortieren.

Alles Andere macht dein Projekt deutlich komplexer... außer du arbeitest tatsächlich mit einem ZWEITEN Array, dass dann nur ein sortiertes Ergebnis enthält...

Sir Rufo 7. Dez 2014 14:25

AW: Sortieren mit direktem Auswahlort
 
Ein dynamisches Array
Delphi-Quellcode:
var Foo : array of integer;
fängt bei 0 an.
Ein statisches Array
Delphi-Quellcode:
var Foo : array[42..45] of integer
fängt bei der angegebenen unteren Grenze an (hier 42)!

humbuck 7. Dez 2014 14:40

AW: Sortieren mit direktem Auswahlort
 
Zitat:

Ein statisches Array var Foo : array[42..45] of integer fängt bei der angegebenen unteren Grenze an (hier 42)!
Da hast du zweifellos Recht, fängt aber intern trotzdem bei 0 an. Erwähnt hatte ich das auch nur, viele Anfänger meinen, dass man mit 1 anfängt zu zählen, das in der Programmierung aber etwas anders ist.

Aber dein Einwand ist sinnvoll und berechtigt.

rebellxsky 7. Dez 2014 15:30

AW: Sortieren mit direktem Auswahlort
 
Zitat:

Das sagt mir ja schon mal, es handelt sich bei dir um statisches Array mit 10 Werten... (Ein Array fängt übrigens bei 0 : Array[0..9])
Das habe ich mal versucht anzupassen:
Delphi-Quellcode:
var sort       : array[0..9]of integer;
procedure TForm1.btnsortClick(Sender: TObject);
begin
   For i:= 0 to 9-1 Do
   Begin
     min:= i;
     For j:= i+1 To 9 Do
       If (sort[j] < sort[min]) Then
       begin
         h       :=sort[j] ;
         sort[j] :=sort[min];
         sort[min]:=h       ;
       end;
   end;
lblsort.caption := '';
   For i := 0 To Length(sort) -1 do
     begin
       lblsort.caption := lblsort.caption + IntToStr(sort[i]) + ' ';
     end;

end;
Das scheint jetzt zu funktionieren. Ausprobiert habe ich das, indem ich die Werte des Arrays erstmal im Quellcode definiert habe.
Zitat:

a) verhindern, dass du über 10 Werte hinausschießt
b) dass du mithilfe eines für a) notwendigen Zählers ERST alle Werte mit jedem Button-Click an dein Array übergibst
Man könnte den Button doch nach zehnmaligen betätigen deaktiviern, oder?
Wenn man anstatt integer --> real nimmt ginge es ja auch mit dezimalzahlen?
Trotzdem weiß ich nicht wie man die Werte übergibt. Nach jedem betätigen des Buttons würde dieser doch das gesammte Array überlaufen?

Sir Rufo 7. Dez 2014 15:52

AW: Sortieren mit direktem Auswahlort
 
Dann musst du dir halt merken wieweit das Array gefüllt ist. Dafür gibt es Variablen.

Daran kannst du auch festmachen, ob das Array komplett gefüllt ist (keine weitere Eingabe möglich, aber Sortieren jetzt möglich). Mit einem Reset-Button kannst du dann die Variable wieder zurücksetzen.

Sir Rufo 7. Dez 2014 15:58

AW: Sortieren mit direktem Auswahlort
 
Es macht überigens Sinn, für einzelne Teile separate Methoden zu erstellen:
Delphi-Quellcode:
procedure TForm1.SortArray;
begin
  // hier der Code zum Sortieren
end;

function TForm1.ArrayToString : string;
begin
  // hier der Code um aus dem Array einen String zu machen
  Result := ...
end;

procedure TForm1.Button1Click( Sender : TObject );
begin
  SortArray;
  lblsort.Caption := ArrayToString;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz