Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sortieren von zahlen-aber wie? (https://www.delphipraxis.net/100947-sortieren-von-zahlen-aber-wie.html)

Maja 5. Okt 2007 20:34

Re: Sortieren von zahlen-aber wie?
 
und wie kann ich den fehler beheben?

inherited 5. Okt 2007 20:37

Re: Sortieren von zahlen-aber wie?
 
Gehirn einschalten, ausprobieren, in Zukunft Hausaufgaben rechtzeitig beginnen :roll:

MrSpock 5. Okt 2007 20:47

Re: Sortieren von zahlen-aber wie?
 
Hallo inherited,

wenn du nicht helfen willst, ist das ok, aber solche Beiträge sind nicht zielführend. Beachte bitte, dass hier ein neues Mitglied eine Frage stellt und gibt diesem eine Chance. :zwinker:

DeddyH 5. Okt 2007 21:02

Re: Sortieren von zahlen-aber wie?
 
Mal eine Problemanalyse:

Ausgangssituation
Du hast 3 Eingabefelder, in die Zahlen eingetragen werden sollen. Diese Zahlen sollen verglichen, sortiert und wieder ausgegeben werden (EVA-Prinzip).

1. Teilproblem: die eingegebenen Zahlen sind gar keine Zahlen, sondern Strings. Also brauchst Du 3 Zahlenvariablen (integer), in die die Eingaben erst umgewandelt werden müssen (StrToInt).

2. Teilproblem: diese (nun echten) Zahlen müssen miteinander verglichen und ggf. ausgetauscht werden.
- Teilproblem zum Teilproblem: wenn Du Zahl1 Zahl2 zuweist und anschließend andersherum, haben beide denselben Wert. Du brauchst also eine Puffervariable. Das sähe dann so aus (Tausche a mit b): Puffer = a; a = b; b = Puffer;
- Kernproblem des Teilproblems:
- wenn 1. Zahl größer als 2. Zahl, dann tauschen
- wenn 2. Zahl (evtl. vormals 1. Zahl) anschließend größer als 3. Zahl, dann tauschen
- nun zur Kontrolle noch mal die aktuelle 1. Zahl mit der aktuellen 2. Zahl vergleichen und gff. tauschen
Da es nur 3 Zahlen gibt, bist Du hier mit dem Vergleich schon am Ende.

3. Teilproblem: Ausgabe der sortierten Zahlen in den Eingabefeldern. Dies geschieht analog zum 1. Teilproblem andersherum mittels IntToStr.

Wenn Du das nun noch in Quellcode umsetzt, ist die Hausaufgabe gelöst ;)

Kedariodakon 5. Okt 2007 23:07

Re: Sortieren von zahlen-aber wie?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das was DeddyH schreibt ist schon mal die Lösung für dein Problem!

Wenn du später mal eine Reihe von Zahlen, unbekannter Anzahl, oder generell irgendwelche Sachen Sortieren möchtest, dann kann man diesen oben genannten Lösungsansatz noch vertiefen!

Dazu gibt es 2 Punkte die man im Hinterkopf haben sollte:
  • Sortiert wird durch einfaches Tauschen von Positionen
  • Sachen die Sortiert werden können unterschiedlich viel Speicher verbrauchen, wo durch ein tauschen der Werte große Rechenbelastung bedeuten kann!
Durch diese Punkte kommt man schnell zu dem Ergebnis, dass das Tauschen der Werte nicht immer die güstigste Lösung ist, daher ist es Ratsam die Position zwar zu tauschen, aber nicht die Werte! Sowas erreicht man z.B. indem man nur die Adressen (Pointer) zu den Werten (4 Byte) in einer Liste sortiert und nicht die Werte selbst, welche mit unter auch mal unterschiedlich groß sein können und auch mal ungeante Größen haben könenn (z.B. 100MB).
Damit hätte man schon sehr viel Speichermanagement weniger! Und ein weiterer Vorteil, es ist universel nutzbar!

Universel nutzbar? Ja! Das ganze hört sich jetzt ev. bischen schwer an, im Grunde ist es aber ganz einfach!
1. Man nehme eine Liste von Werten und indiziere sie.
Delphi-Quellcode:
Var MyValues:    Array Of Irgendwas; // Die Werte
    MySortValues: Array Of Pointer;  // Indizierung der Werte

//  **  Werte Indizieren
SetLength( MySortValues, Length( MyValues ) );
For i := 0 To Length( MyValues ) - 1 Do Begin
  MySortValues[ i ] := @MyValues[ i ];
End;
2. Man benötigt eine Funktion die die Werte untereinander vergleicht, sozusagen eine Relation aufbaut.
Diese Funktion definieren wir uns erstmal gleich als Typ.
Delphi-Quellcode:
Type
  TRelationFunction = Function( Const Value1, Value2: Pointer ): Integer; //  <0 = Kleiner, 0 = Gleich, >0 = Größer
eine Funktion um Integer zu vergleichen könnte passend zum definierten Typ so aussehen:
Delphi-Quellcode:
Function IntegerRelation( Const Value1, Value2: Pointer ): Integer;
Begin
  //  <0 = Kleiner, 0 = Gleich, >0 = Größer
  Result := Integer( Value1^ ) - Integer( Value2^ );
End;
3. Man benötigt eine allgemeine Funktion zum sortieren, diese könnte so definiert sein:
Delphi-Quellcode:
Type
  TSortFunction = Procedure( Var ToSort: Array Of Pointer; Const RelationFunction: TRelationFunction );
Eine Implementation wäre dann so eine:
Delphi-Quellcode:
Procedure SimpleBubblesort( Var ToSort: Array Of Pointer; Const RelationFunction: TRelationFunction );
Var Len:     Integer;
    i:       Integer;
    aChange: Boolean;
    Temp:    Pointer;
Begin
  Len := Length( ToSort );
  If Len > 1 Then Begin
    Repeat
      aChange := False;
      For i := 0 To Length( ToSort ) - 2 Do Begin
        If RelationFunction( ToSort[ i ], ToSort[ i + 1 ] ) > 0 Then Begin
          Temp           := ToSort[ i ];
          ToSort[ i    ] := ToSort[ i + 1 ];
          ToSort[ i + 1 ] := Temp;
          aChange        := True;
        End;
      End;
    Until Not aChange;
  End;
End;
Nun kann man viele verschiedene Sortierungen programmieren (TSortFunction's) und mithilfe neuer Relationsmodelle (TRelationFunction's) diese dann ohne wilde Programierung auf verschiedene Typen (Integer, Strings oder Eigene Objecte) verwenden lassen.


Natürlich muss man das Rad nicht neu erfinden, Delphi bietet schon verschiedene Sortierungsfunktionen an, es lohnt sich mal die Function Sort von der Klasse TList (Unit Classes) anzuschauen.

Bye Christian

Edit: Habe mal so eine kleine Konsolen-Anwendung als Beispiel dreingepackt... (nicht schimpfen, ich bin kein Konsolen-Programierer, geht sicher schöner, erfüllt aber seinen Zweck...)

So, damit solltest du alles haben um deine Hausaufgaben meisten zu können...

Hador 5. Okt 2007 23:50

Re: Sortieren von zahlen-aber wie?
 
@Christian (Kedariodakon): Ich glaube, du verwirrst Maja eher, wenn du bei einem Anfänger direkt mit konstanten Pointer-Parametern, arrays, etc. anfängst.

@Maja:
Um dir das sortieren mal anhand einen kleinen Beispiels zu zeigen, hier eine Sortierung von 2 Zahlen:

Ziel: die Variable a soll später den kleineren der beiden Werte aus a und b enthalten.

Delphi-Quellcode:
...
var
  a, b, hilfsvar: Integer;
begin
  //...
  // a und b irgendeinen Wert zuweisen
  //...
  if b < a then // Wenn b kleiner ist müssen die Variablen vertauscht werden
  begin
    hilfsvar := a; // Wert aus a in der Hilfsvariablen zwischenspeichern
    a := b; // Den Wert aus b in a schreiben
    b := hilfsvar; // Den zwischengespeicherten Wert, der ursprünglich in a stand in b schreiben
  end;
Das nun auf drei Variablen zu übertragen sollte eigentlich für nich machbar sein.

Gruß Lars

EDIT:
Zitat:

Zitat von Kedariodakon
Edit: Habe mal so eine kleine Konsolen-Anwendung als Beispiel dreingepackt... (nicht schimpfen, ich bin kein Konsolen-Programierer, geht sicher schöner, erfüllt aber seinen Zweck...)

Meist ist solch eine Anwendung sogar einfacher und leichter verständlich. Und für die Eingabe von drei Zahlen reicht die Konsole bei weitem aus :wink:

DeddyH 6. Okt 2007 10:47

Re: Sortieren von zahlen-aber wie?
 
@Kedariodakon: Es ist zwar richtig, was Du schreibst, trägt aber vermutlich eher zur Verwirrung bei. Sie sollte ihre Lösung IMHO zunächst so einfach wie möglich (und damit für sich selbst nachvollziehbar) gestalten, sonst haben wir bald einen 2. taktaky, der immer den 3. Schritt vor dem 1. machen will (das ist jetzt noch nicht einmal böse gegenüber taktaky gemeint).

[edit] Wieso habe ich den Beitrag von Hador nicht gesehen? :pale: [/edit]

Kedariodakon 6. Okt 2007 11:17

Re: Sortieren von zahlen-aber wie?
 
Die Lösung stand ja schon in dem Beitrag über mir, daher dachte ich mal, vertiefst die Sache ein wenig...
Sortieren muss man ja sehr oft, und meist möchte man noch eigene Objecte sortieren und damit hat man schon einen guten Einstigspunkt.

Ich schau bei solchen Sachen gern ein wenig in die Zukunft, sprich, kann ich die Lösung des Problems später für andere Lösungen ebenfalls verwenden?

Als "Anfänger" hat man immer das Problem, dass man nicht weiß wie man was umsetzen soll, weil man einfach gleich das Ziel erreichen möchte, ohne ev. einen kleinen Umweg zu nehmen.
Für sowas empfehle ich ein leeres Blatt Papier und ein Bleistift, da kann man sich solche Sachen schon strukturiert aufmalen.


Bye Christian

Hador 6. Okt 2007 13:59

Re: Sortieren von zahlen-aber wie?
 
Zitat:

Zitat von Kedariodakon
Für sowas empfehle ich ein leeres Blatt Papier und ein Bleistift, da kann man sich solche Sachen schon strukturiert aufmalen.

Jo das stimmt. Sowas hilft haüfig :-D

Zitat:

Zitat von Kedariodakon
Ich schau bei solchen Sachen gern ein wenig in die Zukunft, sprich, kann ich die Lösung des Problems später für andere Lösungen ebenfalls verwenden?

Naja, bei ihm/ihr handelte es sich ja nur um eine Hausaufgabe und ehrlich gesagt, hätte dein Ansatz vermutlich maximal zwei ehemalige Klassenkameraden meines Informatikkurses am ende der 13 verstanden. Sprich, in der Schuöe lehrnt man meist nicht allzu viel über Pointer etc. (Bei uns konnte man froh sein, wenn die meisten ne einfache Klassendefinition hinbekommen haben) :wink:

DeddyH 6. Okt 2007 14:04

Re: Sortieren von zahlen-aber wie?
 
Statt Papier und Bleistift kann man auch StruktEd benutzen (leider immer noch 16 Bit). Für Struktogramme (ich persönlich hab es nicht so mit PAPs) ist das ein super Programm, auch wenn es sehr altbacken aussieht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.
Seite 2 von 3     12 3      

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