Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Innerhalb eines Strings Characters sortieren (https://www.delphipraxis.net/122564-innerhalb-eines-strings-characters-sortieren.html)

Mr. General 18. Okt 2008 10:16


Innerhalb eines Strings Characters sortieren
 
Hallo!

Ich muss innerhalb eines Strings die einzelnen Character alphabetisch sortieren.

Das ganze soll so gemacht werden:

# Alphabet in einem Array speichern (Kleinbuchstaben sind ausreichend)
# Eingabestring Buchstaben für Buchstaben mit Array vergleichen
# Alphabetisch geordneten Ausgabestring generieren. Dieser String soll dieselben Zeichen enthalten wie der Eingabestring (nicht weniger, nicht mehr)

sollte ja eigentlich nicht so schwer sein.

höchstwahrscheinlich werde ich dabei geschachtelte schleifen brauchen, weil wir das gerade in der schule wiederholen.

mein code sieht so aus

Delphi-Quellcode:
var
  Form1: TForm1;

const
  abc:string=('abcdefghijklmnopqrstuvwxyz');

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: Integer;
begin
for i := 1 to length(edit1.text) do
  for j := 1 to 26 do
    if edit1.text[i] = abc[j] then

end;
ich denke schon das ich auf dem richtigen weg bin, aber mir fehlt einfach der denkansatz wie ich hier die buchstaben sortieren soll...

ich würde mich über jede hilfe freuen :)

DeddyH 18. Okt 2008 10:20

Re: Innerhalb eines Strings Characters sortieren
 
Versuch es mal mit einem Bubblesort, bei dem das Tauschkriterium die Position der Zeichen innerhalb des Vergleichsstrings ist.

Apollonius 18. Okt 2008 10:30

Re: Innerhalb eines Strings Characters sortieren
 
Bei dieser Aufgabenstellung bietet sich Bucketsort an.

jfheins 18. Okt 2008 10:35

Re: Innerhalb eines Strings Characters sortieren
 
Oder du nimmst ein array['a'..'z'] of Integer dass du mit 0 initialisiertst, und dann den String durchgehst
Delphi-Quellcode:
var
  arr: array['a'..'z'] of Integer;
  str: String;
  i: Integer;
  c: Char;
begin
for c=low(arr) to high(arr) do
  arr[c] = 0;

for i=1 to length(str) do
  inc(arr[str[i]]);

for c=low(arr) to high(arr) do
  edit1.text = edit1.text + StringOfChar(c, arr[c]);
Oder so ähnlich.

Der Code zählt erst die Vorkommen der jeweiligen Buchstaben und gibt dann alle Buchstaben alphabetissch aus ;)

Mr. General 18. Okt 2008 11:38

Re: Innerhalb eines Strings Characters sortieren
 
die bubblesort variante denke ich wird am besten sein, weil ich bucketsort noch nicht kenne und das andere eher nicht der aufgabe entspricht.

ich kann mir den bubblesort code aber in der praxis nicht vorstellen...

Apollonius 18. Okt 2008 11:47

Re: Innerhalb eines Strings Characters sortieren
 
jfheins' Code ist eine Art von Bucketsort. ;-)

Mr. General 18. Okt 2008 11:56

Re: Innerhalb eines Strings Characters sortieren
 
hmmm^^ ok aber den haben wir noch nicht gelernt. ich werd das wohl irgendwie mit bubblesort machen müssen.

SirThornberry 18. Okt 2008 12:20

Re: Innerhalb eines Strings Characters sortieren
 
Naja, man lernt auch nicht alle algorythmen. Manche Dinge sind so einfach das fast jeder drauf kommt. Zum Beispiel muss man nicht lernen 25 Zahlen zu addieren. Es genügt wenn man weiß wie addieren geht und bekommt es somit allein hinn. Ähnlich ist es mit dem Bubblesort. Man schaut einfach ob das nachfolgende kleiner ist und tauscht die Positionen wenn es nicht stimmt.

Mr. General 18. Okt 2008 15:47

Re: Innerhalb eines Strings Characters sortieren
 
danke für eure hilfe. ich habs jetzt aber doch ganz anders gemacht^^

nach langem nachdenke kam mir diese idee.

ich verwende einen zähler, der zählt wie oft ein buchstabe vorkommt. dann gebe ich die buchstaben einfach (edit: in der richtigen reihenfolge) in ein edit aus.

mfg general

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  abc:string=('abcdefghijklmnopqrstuvwxyz');
var
  i,j: Integer;
  feld:array [1..26] of byte; //dient als Zähler
begin
for i := 1 to 26 do //in das array werden nullen geschrieben
  feld[i]:=0;

for i := 1 to length(edit1.text) do
  for j := 1 to 26 do
    if edit1.text[i] = abc[j] then
      inc(feld[j]);
//es wird edit1 mit dem abc string verglichen und bei übereinstimmungen das zähler-feld um 1 erhöht

edit2.text:=''; //edit2 wird gelöscht

for i := 1 to 26 do
  if feld[i] > 0 then
    repeat
      begin
        edit2.text:=edit2.text+abc[i];
        dec(feld[i]);
      end;
    until feld[i] = 0;
//wenn ein zähler > 0 ist,
//dann wird der richtige buchstabe dazu so oft in edit2 geschrieben bis der zähler 0 ist
end;

jfheins 18. Okt 2008 16:05

Re: Innerhalb eines Strings Characters sortieren
 
Zitat:

Zitat von Mr. General
danke für eure hilfe. ich habs jetzt aber doch ganz anders gemacht^^

Wenn ichs dir sagen darf: Hast du nicht ;)

Das was du gemacht hast ist das, was ich dir oeben vorgeschlagen habe, und was sich Bucketsort nennt. Du hast es zwar etwas umständlich gemacht, aber es ist die gleiche Logik ;)

Ich habe nur das Array nicht als
Delphi-Quellcode:
feld:array [1..26] of byte;
deklariert, sondern als
Delphi-Quellcode:
feld:array ['a'..'z'] of byte;
Delphi-Quellcode:
for i := 1 to length(edit1.text) do
  for j := 1 to 26 do
    if edit1.text[i] = abc[j] then
      inc(feld[j]);
Das geht dan nämlich auch viel einfacher so:
Delphi-Quellcode:
for i := 1 to length(edit1.text) do
  inc(feld[edit1.text[i]]);
;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.
Seite 1 von 2  1 2      

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