Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zahl in Array (https://www.delphipraxis.net/66759-zahl-array.html)

bonanza 3. Apr 2006 20:34


Zahl in Array
 
Hi,
ich muss eine Zahl in ein Array kriegen...z.b: 2015 wie kriege ich das in ein Array, so das dann da steht:
zahl[1] = 2
zahl[2] = 0
zahl[3] = 1
zahl[4] = 5

und dann muss ich diese Zahlen sortieren, also von klein nach groß also dann: 0125 (er soll dann ausgeben: 125) und von groß nach klein: 5210

oder gibt es noch eine andere möglichkeit die Ziffern einer Zahl zu sortieren ?

danke für eure Hilfe schonmal im voraus !

mfg
bonanza

Flare 3. Apr 2006 20:39

Re: Zahl in Array
 
Wandel doch die Zahl einfach in einen String um.
Delphi-Quellcode:
var textzahl: string;
    zahl,i: integer;
    zahlenarray: array of integer;
begin
  textzahl := inttostr(zahl);
  for i:=1 to strlen(textzahl) do zahlenarray[i-1] := textzahl[i];
end;
Ich gehe jetzt einfach mal davon aus dass du selber sortieren kannst ^^


Flare

bonanza 3. Apr 2006 20:40

Re: Zahl in Array
 
da kommt bei mir ein fehler:

[Error] Unit1.pas(33): Incompatible types: 'String' and 'PAnsiChar'


Ich hab dann einfach :

Delphi-Quellcode:
  textzahl := edit1.text;
genommen, denn ich gebe die zahl ja ein...oder war das falsch ?

Flare 3. Apr 2006 20:45

Re: Zahl in Array
 
Nee, war nicht falsch, mein einer Befehl war falsch! :oops:

Wegen sortieren kannst du mal hier gucken.

und hier noch mal die Korrigierung meinen Codes
Delphi-Quellcode:
var textzahl: string;
    zahl,i: integer;
    zahlenarray: array of integer;
begin
  textzahl := inttostr(zahl);
  for i:=1 to length(textzahl) do zahlenarray[i-1] := strtoint(Copy(textzahl, i, 1));
end;
Ist zwar immer noch ungetestet, aber jetzt müsste es klappen.


Flare

//Edit: Ich haue gerade eindeutig zu viel PHP und Delphi durcheinander, tut mir leid :oops:

bonanza 3. Apr 2006 20:46

Re: Zahl in Array
 
es kommt noch immer der selbe fehler und er bezieht sich auf "strlen(textzahl)"...


also eher auf die komplette zeile denn "Copy((textzahl), i, 1)"
gibt er den fehler aus:

[Error] Unit1.pas(33): Incompatible types: 'Integer' and 'String'


und wenn ich dan ein strtoint vor setze kommt folgendes:
[Error] Unit1.pas(33): Incompatible types

Flare 3. Apr 2006 20:50

Re: Zahl in Array
 
Der Code ist jetzt getestet und in meinem 2. Beitrag korrigiert reingestellt.


Flare

bonanza 3. Apr 2006 20:54

Re: Zahl in Array
 
ok danke...
aber wenn ich jetzt zum beispiel erstmal das array angucken will...
dazu wollte ich folgendes verwenden:

for i:= 1 to 4 do
edit2.text := edit2.text + inttostr(zahlenarray[i])+ ',';

(ich gebe maximal 4 stellige zahlen ein)

dann kommt ein Access violiation fehler

negaH 3. Apr 2006 20:59

Re: Zahl in Array
 
Delphi-Quellcode:

var
  Zahl,I: Integer;
  Count: array[0..9] of Integer;
  Result: String;
begin
  FillChar(Count, SizeOf(Count), 0);

  Zahl := 1234562345;

  while Zahl <> 0 do
  begin
    Inc(Count[Zahl mod 10]);
    Zahl := Zahl div 10;
  end;

  for I := Low(Count) to High(Count) do
    Result := Result + StringOfChar(Char(I + Ord('0')), Count[I]);
end;
Die einfachste und schnellste Sortierung ist ein indiziertes Array. Im Obigen Beispiel zerlegen wir die Zahl in ihre Ziffern 1,2,3,4,5,6,2,3,4,5 und benutzen diese als Index in Count[]. Darin zählen wir einfach das Auftreten jeder Ziffer. Wir haben also im Count[] array schon von Hause aus nach Ziffern 0 bis 9 sortiert und deren Anzahl ihres Auftretens.

In der Ausgabe als sortierter String gehen wir nun einfach dieses Count[] Array von unten nach oben -> von 0 bis 9, durch und bauen den String zusammen.

Gruß Hagen

bonanza 3. Apr 2006 21:06

Re: Zahl in Array
 
das ist super !
aber wie krieg ich die zahlen denn in diesem stil nach größe sortiert also von groß nach klein ?

Flare 3. Apr 2006 21:07

Re: Zahl in Array
 
Das Array wird immer von 0 an gezählt, also musst du deine Anzeige von 0 bis 3 eingrenzen, oder du änderst meinen Programmiertext oben ein bisschen, indem du bei der Zuweisung des Zeichens zahlenarray[i] := strtoint(Copy(textzahl, i, 1)); eingibst


Flare

3_of_8 3. Apr 2006 21:08

Re: Zahl in Array
 
Schau mal bei http://dsdt.info unter Tipps und Algorithmen und BubbleSort. Da findest du nen Sortieralgorithmus, den noch leicht umschreiben und dann passts.

bonanza 3. Apr 2006 21:13

Re: Zahl in Array
 
irgendwei funktionier das von Flare nicht :-\

und von Hagen schon aber da weiß ich noch nicht wie ich das da nach größe sortiere...

negaH 3. Apr 2006 21:27

Re: Zahl in Array
 
Sorry mann, aber ES IST schon sortiert. Defakto musst du garnichts sortieren in diesem Fall, und brauchst keinen Bubblesort oder ähnliches.

Schau die Sache ist doch ganz einfach:

deine Zahl 123456441 besteht aus 8 Ziffern -> 1,2,3,4,5,6,4,4,1 richtig ? Nun zählen wir einfach alle diese Ziffern, wir berechnen deren Anzahl. Das machen wir indem wir einfach die Ziffern als Index in ein Array[0..9] benutzen.

Count[0] = 0;
Count[1] = 2; weil zwei Einsen vorkommen
Count[2] = 1; weil eine Zwei vorkommt
Count[3] = 1; weil eine Drei vorkommt
Count[4] = 3; weil drei Vieren vorkommmen
Count[5] = 1; weil eine Fünf vorkommt
Count[6] = 1; weil eine Sechs vorkommt
Count[7] = 0;
Count[8] = 0;
Count[9] = 0; weil keine 7,8,9 vorkommen.

Nun gehen wir einfach das Array Count[] von unten nach oben durch, also von 0 bis 9 und bauen den String zusammen

'11' + '2' + '3' + '444' + '5' + '6' -> '112344456' weil

2* die '1'
1* die '2'
1* die '3'
3* die '4'
1* die '5'
1* die '6'

kommen im array Count[] vor.

Willst du das andersrum sortiert haben -> '65444321' dann gehst du das Array Count eben einfach von Oben nach Unten in der Schleife durch:

Delphi-Quellcode:
  for I := High(Count) downto Low(Count) do
   ...
fertig. Du musst also im Grunde garnichts sortieren, noch brauchst du viel an Speicher, das Einzigste was du ge-brauchen musst ist dein Hirn, und das Wissen das man manche Dinge auch ohne Bubblesort oder andere komplizierte Techniken lösen kann ;)

Gruß Hagen

negaH 3. Apr 2006 21:32

Re: Zahl in Array
 
Und wenn du das wieder in ein Zahl Umwandeln möchtest, statt einen String dann geht dies so

Delphi-Quellcode:
Result := 0;
for I := Low(Count) to High(Count) do
  while Count[I] > 0 do
  begin
    Result := Result * 10 + I;
    Dec(Count[I]);
  end;
Du hast dann keinen String sondern wieder einen Integer als Resulat.

Gruß Hagen


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

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