Delphi-PRAXiS

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:13


Sortieren von zahlen-aber wie?
 
Hey ihr lieben Dephi-interessierte!

ich hab ein riesenproblem. ich soll einen algorithmus erstellen, welcher drei einzugende Zahlen vergleicht und in der Reihenfolge ihrer Größe wieder ausgibt. Jetzt hab ich schon ein programm, aber er macht nicht das, was er soll.
ich kopiers mal rein:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;


procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:Integer;
begin
       //Eingabe
       a:=StrToInt(Edit1.Text);
       b:=StrToInt(Edit2.Text);
       c:=StrToInt(Edit3.Text);

       //Verarbeitung
       IF (a<b) AND (b<c) THEN
       begin
       Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);
       end
       ELSE
       IF (a<c) AND (c>b) THEN
       begin
       Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);
       end
       ELSE
       IF (b>a) AND (a<c) THEN
       begin
       Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);
       end
       ELSE
       IF (b<c) AND (c>a) THEN
       begin
       Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);
       end
       ELSE
       IF (c>a) AND (a<b) THEN
       begin
       Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);
       end
       ELSE
       IF (c<b) AND (b<a) THEN
       begin
       Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);
       end
       ELSE

       



end;

end.
ich habe a=1, b=2,c=3 und dafür gibt es ja 6 varianten: 123,132,213,231,312 und 321. bitte bitte helft mir!!!!
ich bin total am verzweifeln!!!!!!!!!!!

[edit=MrSpock]Code Tags gesetzt. Mfg, MrSpock[/edit]

Dax 5. Okt 2007 20:16

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
Willkommen in der DP :dp:

Hier wird dir niemand deine Hausaufgaben machen, auch nicht, wenn du uns im Titel anschreist ;) Was dir allerdings helfen könnte wäre Daniels Tutorial zu Hier im Forum suchenSortieralgortihmen.

mkinzler 5. Okt 2007 20:17

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
Versuch es mal mit einem Sortieralgorithmus ( BubbleSort, QuickSort, ShellSort, ...)

DeddyH 5. Okt 2007 20:18

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
Hallo Maja,
1. willkommen in der DP :dp:
2. lösen wir hier keine Hausaufgaben, sondern geben höchstens Hilfestellungen.
3. Formatiere bitte Deinen Quelltext (Du kannst Deinen Beitrag editieren, vor den Quelltext klicken, dann oben auf den Button "Delphi-Code", dann an das Ende des Quelltextes Klicken und wieder o.a. Button betätigen).
4. ist das eine ganz einfache Sortierfunktion.

[edit] Punkt 3 bereits durch den Vulkanier erledigt :zwinker: [/edit]

MrSpock 5. Okt 2007 20:18

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
Hallo Maja,

herzlich willkommen in der Delphi-PRAXiS.

Wir haben in unseren Regeln festgelegt, dass der Titel einen Hinweis auf das Problem geben soll, zu dem du eine Lösung benötigst. Ändere doch bitte den Titel entsprechend. Außerdem solltest du nicht nur Großbuchstaben verwenden, dass wäre so als schreist du uns an, und das willst du sicher nicht. :zwinker:

Daniel 5. Okt 2007 20:21

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
ich bin total am verzweifeln!!!!!!!!!!!


... ich ebenfalls, wenn ich sowas lesen muss.

(1) Du überlegst Dir mal konkrete Fragen. Schöne Ansatzpunkte wären: "Was macht das Programm?", "Was macht es nicht?" und "Was sollte das Programm machen?"

(2) Du stellst Dir selber die Fragen, was die einzelnen Zeilen machen. Deine Lösung ist nicht gerade elegant, aber im Wesentlichen hast Du alle Befehle beisammen, um zur Lösung zu kommen. Du kannst die Eingaben in Zahlen wandeln, sie vergleichen und wieder zurückschreiben. Mehr musst Du nicht (zwingend) können.

(3) Um das Problem zu verstehen, reduzierst Du die Anzahl an Zahlen auf 2. Die Technik klappt ja, offenbar hast Du Dich nur in der Logik verheddert.

malo 5. Okt 2007 20:26

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
Ist dir schonmal aufgefallen, dass das Programm immer das gleiche macht?
Delphi-Quellcode:
Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);
Dein Programm führt nur diese Anweisung aus, egal, in welchem Verhältnis a,b und c stehen.

Maja 5. Okt 2007 20:29

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
ich möchte keinen ärgern oder anschreien, sorry! danke für eure antworten! ja, ich hab mich verheddert und hänge irgendwie fest:-(
wie kann ich das thema ändern?

MrSpock 5. Okt 2007 20:31

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
Über den "Edit" Button.

inherited 5. Okt 2007 20:32

Re: BRAUCHE GANZ DRINGEND HILFE FÜR HAUSAUFGABE!!!!!!!BITTE
 
Mit dem Edit-Knopf oben rechts über deinem Beitrag.

Und malo hat im Wesentlichen schon gesagt was du falsch machst.

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.

Kedariodakon 6. Okt 2007 14:08

Re: Sortieren von zahlen-aber wie?
 
Nunja, immerhin hat er/sie am Freitag Abend schon versucht die Hausaufgaben zu lösen, welche wohl für die kommende Woche gedacht waren, spricht doch schon mal dafür dass sie was lernen will :)

Nunja, mit Blatt uns Papier mein ich eigentlich nicht Struktugramme aufzumalen, mal ehrlich, wer macht das, wenn er es nicht muß?
Ich mach das meist nach der guten Mathematischen Lösungsfindung, erstmal das Gegeben notieren, dann das Gesucht und daraus bastle ich ne schematische Lösung die meist nix mit einem Struktugram gemeinsam hat ;)


Aber genug OT.

Bye Christian

inherited 6. Okt 2007 15:56

Re: Sortieren von zahlen-aber wie?
 
Zitat:

Zitat von Kedariodakon
Nunja, immerhin hat er/sie am Freitag Abend schon versucht die Hausaufgaben zu lösen, welche wohl für die kommende Woche gedacht waren, spricht doch schon mal dafür dass sie was lernen will :)

Nein, nicht unbedingt. Wir müssen die Hausaufgaben auch per Mail am Freitag abschicken.

Kedariodakon 6. Okt 2007 16:06

Re: Sortieren von zahlen-aber wie?
 
:gruebel:
Zeiten haben sich wohl geändert... Zu meiner Zeit sind wir noch lächtsend den Lehrern hinterher um noch mehr zu erfahren :wink:

Thorben_Ko 6. Okt 2007 18:03

Re: Sortieren von zahlen-aber wie?
 
[OT]

Natürlich und ihr habt immer eure Hausaufgaben rechtzeitig gemacht, und nie abgeschrieben ;)

Wers glaubt :P
[/OT]

Hador 6. Okt 2007 18:14

Re: Sortieren von zahlen-aber wie?
 
Ich denke, Christian meinte eher, um vom Lehrer noch mehr von der Lösung zu erfahren :lol:

bitsetter 6. Okt 2007 19:08

Re: Sortieren von zahlen-aber wie?
 
Hallo,

so ein ähnliches Thema gab es hier schon mal mit 4 Zahlen Zahlenreihenfolge mit 4 Zahlen ordnen und anzeigen lassen?

Maja 9. Okt 2007 13:42

Re: Sortieren von zahlen-aber wie?
 
hallo ihr lieben!
vielen dank für eure hilfe!
ich hab jetzt folgenden algorithmus genommen:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label5: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;


procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,hilf:Integer;
begin
       //Eingabe
       a:=StrToInt(Edit1.Text);
       b:=StrToInt(Edit2.Text);
       c:=StrToInt(Edit3.Text);

       //Verarbeitung
       IF a>b THEN
       begin
       hilf:=a; a:=b; b:=hilf;
       end;
       IF b>c THEN
       begin
       hilf:=b; b:=c; c:=hilf;
       end;
       IF a>b THEN
       begin
       hilf:=a; a:=b; b:=hilf;
       end;

       Edit5.Text:=IntToStr(a);
       Edit4.Text:=IntToStr(b);
       Edit6.Text:=IntToStr(c);

       end;

end.
glg und bis bald!

[edit=MrSpock]Code Tags eingefügt. Mfg, MrSpock[/edit]

DeddyH 9. Okt 2007 13:58

Re: Sortieren von zahlen-aber wie?
 
Bravo, damit hast Du 1:1 umgesetzt, was ich hier gepostet hatte. Setze aber bitte noch Delphi-Tags ein (geht über editieren), damit Dein Code lesbarer wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr.

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