AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Quicksort eines Datensatzes nach alphabet
Thema durchsuchen
Ansicht
Themen-Optionen

Quicksort eines Datensatzes nach alphabet

Ein Thema von Sai · begonnen am 24. Jan 2008 · letzter Beitrag vom 26. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
Sai

Registriert seit: 24. Jan 2008
7 Beiträge
 
#1

Quicksort eines Datensatzes nach alphabet

  Alt 24. Jan 2008, 13:47
hi leute^^

das ganze is in tp7.0

ich habe folgendes problem:



in meinem adressbuch programm werden profile eingegeben und dauerhaft
in ner externen datei gespeichert (assigne, rewrite, reset etc...)

nun soll mien programm die option bieten alle gespeicherten profile
alphabetisch auszugeben, sortiert nach name, alphabetisch halt


wie is das mit quicksort realisierbar?
meine probleme sind das ich die datei ja irgendwie mit links und rechts usw ins qsort bringen muss und das es wörter isnd und keine zahlen

ich frage hier, weil tp7 ja delphi sehr ähnlich ist und ihr vllt deshlab mir helfen könnt
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#2

Re: Quicksort eines Datensatzes nach alphabet

  Alt 24. Jan 2008, 14:11
verwende statt string char
mit char kannst du vergleichen!

vlt hilfts dir weiter...



MfG Emre
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Quicksort eines Datensatzes nach alphabet

  Alt 24. Jan 2008, 14:15
Oha, ich werde heute abend mal mein TP 7 "reaktivieren", vielleicht kann ich Dir dann helfen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Quicksort eines Datensatzes nach alphabet

  Alt 24. Jan 2008, 14:48
Du wirst die Adressen ja hoffentlich anständig organisiert haben?

Im besten Fall mit Records und besser noch in einer Liste von Records.
Nun kannst Du hier ja einen Sortieralgo drauf loslassen.

Soweit ich mich erinnern kann hat TP7 auch einen StringCompare (oder so ähnlich).
Damit kannst Du Record.Name vergleichen lassen und dann entsprechend sortieren.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#5

Re: Quicksort eines Datensatzes nach alphabet

  Alt 24. Jan 2008, 14:54
Moin, Moin Sai.

Um eine zielgerichtete Antwort zu bekommen, sind einige weitere Informationen notwendig. Ausserdem ist der Titel m. E. etwas irreführend: Du willst doch nicht den Inhalt eines Datensatzes sortieren, sondern doch sicher den Inhalt der Datei - oder?

Wie ist der Datensatz gespeichert? Als Record (also file of) oder zeilenweise? Soll die Ausgabe (auf den Bildschirm?) sortiert werden oder die Datei?

Ich gehe im Augenblick davon aus, dass du eine Datei hast, die Datensätze darin in Form einzelner Records speichert sind und die Ausgabe auf dem Bildschirm nach Namen sortiert erfolgen soll.

Hierzu kannst du im Programm ein Record-Array definieren, die Datei in dieses Array einlesen, das Record-Array sortieren (z. B. mit Quicksort) und anschließend die Records des Arrays auf dem Bildschirm anzeigen lassen.

Wieviele Datensätze sind es denn? Übrigens, was meinst du denn mit...
Zitat:
die datei ja irgendwie mit links und rechts usw ins qsort bringen
???


Gruß Ralph
Ralph
  Mit Zitat antworten Zitat
Sai

Registriert seit: 24. Jan 2008
7 Beiträge
 
#6

Re: Quicksort eines Datensatzes nach alphabet

  Alt 24. Jan 2008, 16:20
aha, das ging ja schnell^^

also die profile sind natürlich in record organsisiert und diese dann als reihe
die anazhl an profielen is nich festgelegt, je nachdem wieviel man eingibt, maximal 100 allerdings

ja, die sollen nach name sortiert werden, also in dem fall record.name

diese ganzen records werden dann mittels FILE OF (also assigne, write, etc...) gespeichert
das ganze soll nun so funktionieren, das wen ich im menü auswähle (alle profile anzeigen), die namen aller profile nacheinander ausgibt -> also will ich in erster linie die ausgabe sortieren

wenn das natürlich auch die orginal sortiert wärs besser, aber das isja noch schwerer
ich häng mal nen code teil an den ich fertig habe, wie ich mir da so gedacht hatte

Delphi-Quellcode:

PROCEDURE hilfsreihe;
VAR nummer : INTEGER;
BEGIN
     RESET(profile);
     nummer :=0; {=Nummer des ersten DS in Orig.-Datei}
     WHILE NOT EOF(profile) DO
           BEGIN
           READ(profile,datenbank);
           WITH (datenbank) DO
              BEGIN
              hilfsdaten[nummer].schl :=nam;
              hilfsdaten[nummer].nr :=nummer;
              END;
           INC(nummer);
     END;
     r_index := nummer - 1;
     {writeln('Anazhl DS in DB;');
    writeln('Zaehlung beginnt mit 0');
    writeln(r_index);
     writeln; }

     GOTOXY(30,8);writeln('Weiter mit Enter!');
     writeln;
END;

PROCEDURE qsort (l,r : INTEGER);
VAR i,j,x,y : INTEGER;
    sz : tHILF;
BEGIN
     hilfsreihe;
     RESET(profile);
     i:=l;
     j:=r;
     x:=(l+r) DIV 2;
     REPEAT
           WHILE hilfsdaten[i] < x DO
           i:=i+1;
           WHILE x < hilfsdaten[j] DO
           j:=j-1;
           IF i<j THEN
           BEGIN
           y:=hilfsdaten[i];
           hilfsdaten[i] := hilfsdaten[j];
           hilfsdaten[j] := y;
           i:=i+1;
           j:=j-1;
           END;
     UNTIL i>j;
     IF l<j THEN
     qsort(l,j);
     IF i<r THEN
     qsort(i,r);
END;

     {FOR k := 0 TO (r_index - 1) DO
        BEGIN
          kleinstes := k;
          FOR l:=k+1 TO r_index DO
            IF hilfsdaten[l].schl < hilfsdaten[kleinstes].schl THEN
            kleinstes := l;
          sz := hilfsdaten[k];
          hilfsdaten[k] := hilfsdaten[kleinstes];
          hilfsdaten[kleinstes] := sz;
     END; }

END;

PROCEDURE hilfsdaten_speichern;
VAR k:INTEGER;
BEGIN
     ASSIGN(datenbanksort,'E:\pfsort.dat');
     REWRITE(datenbanksort);
     qsort(0..nummer);
     FOR k:=0 TO r_index DO
         write(datenbanksort,hilfsdaten[k]);
     CLOSE(datenbanksort);
END;

PROCEDURE sortdat_ausgeben;
VAR k,ke,dz:integer;
    test,test2:string;

BEGIN
     clrscr;
     kopf;
     hilfsdaten_speichern;
     textcolor(yellow);
     GOTOXY(25,6); write('Profile geordnet nach Name');
     GOTOXY(25,7); write('~~~~~~~~~~~~~~~~~~~~~~~~~~');
     textcolor(lightgray);
     writeln; writeln;
     RESET(profile);

     FOR k:=0 TO r_index DO
         dz:=0;
         BEGIN
         SEEK(profile,hilfsdaten[k].nr);
         READ(profile,datenbank);
         WITH (datenbank) DO
            test := datenbank.nam;
            test2:=datenbank.rasse;
            GOTOXY(22,11+(k*3));writeln(k+1,'.','Name: ':10,test:20);
            GOTOXY(24,12+(k*3));writeln(' Rasse: ':(10),test2:19);
            END;
         readln;{
        inc(dz);
        IF dz DIV 5 = 0 THEN
        BEGIN
        clrscr;
        ke:=k;
        kopf;
        GOTOXY(22,11+(ke/dz*3);writeln(k+1,'.','Name: ':(10),test:20);
        GOTOXY(24,12+(k/dz*3);writeln('    Rasse: ':(10),test2:19);
        END
        ELSE
         END;  }

END;
kurz zusammengefasst:

wenn das ausgeben im HP aufgerufen wird, wird zuerst ne hilfsreihe erzeugt aus der gespeicherten datei
danach kommt die qsort prozedur, wo ich keine ahnung habe wie ich die machen sollte dabei
darnter das in kommentarklammern is die "sortieren durch auswahl" lösung fürn notfall
dann wirds die sortierte hilfsreihe gespeichert
und diese ausgegeben


naja, hoffe ihr könnt mir helfen

@wer sich wundert, das da "rasse" steht, das programm geht um das spiel warcraft3, nur zum leichteren verständnis hab ich adressbuch geschrieben
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#7

Re: Quicksort eines Datensatzes nach alphabet

  Alt 25. Jan 2008, 07:29
Moin, Moin Sai!
Ok, mit diesen Informationen kann sicherlich geholfen werden. Wenn du bis heute Nachmittag noch keine andere Hilfestellung erhalten hast, dann schau ich mir das mal in Ruhe an und werde mich wieder melden - habe tagsüber leider keine Zeit und im Büro auch kein TP7 zur Verfügung.
Gruß Ralph
Ralph
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Quicksort eines Datensatzes nach alphabet

  Alt 25. Jan 2008, 08:00
Eigentlich steht doch da Alles
Im auskommentierten MinSort wird das Record-Feld 'schl' verglichen:
 IF hilfsdaten[l].schl < hilfsdaten[kleinstes].schl THEN Im Quicksort dagegen der Record (was nicht funktioniert)
WHILE hilfsdaten[i] < x DO Also ersetzt Du das durch
WHILE hilfsdaten[i].schl < x.schl DO Fertig.

Es wäre allerdings eine gute Idee, eine Funktion 'RecordVergleich' zu schreiben, die das Ergebnis des Vergleiches zurückliefert, so in etwa:

Delphi-Quellcode:
Function RecordVergleich (a, b : TRecord) : Integer; // oder TVergleichsErgebnis = (veKleiner, veGleich, veGrößer)
Begin
       if a.Feld1 < b.Feld1 Then RecordVergleich := -1 // veKleiner
  else if a.Feld1 > b.Feld1 Then RecordVergleich := +1 // veGroeßer
  else if a.Feld2 < b.Feld2 Then RecordVergleich := -1 // veKleiner
  else if a.Feld2 > b.Feld2 Then RecordVergleich := +1 // veGroeßer
  else if a.Feld3 < b.Feld3 Then RecordVergleich := -1 // veKleiner
  else if a.Feld3 > b.Feld3 Then RecordVergleich := +1 // veGroeßer
...
  else RecordVergleich := 0
End;
Diese Funktion vergleicht zwei Records zuerst nach Feld1. Wenn die Records hier identisch sind, dann nach Feld2 und wenn sie da auch identisch sind, nach Feld3. Wenn sie da auch identisch sind, dann definieren wir die beiden Records als gleich (auch wenn in anderen Feldern unterschiedliche Werte stehen).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Sai

Registriert seit: 24. Jan 2008
7 Beiträge
 
#9

Re: Quicksort eines Datensatzes nach alphabet

  Alt 25. Jan 2008, 11:34
also hab nun das gemacht was alzaimar geschrieben hat, allerdings kommt bei genau der zeile der fehler
bei dem teil "x.schl" ungültige qualifizierung
lass ich das .schl weg kommt TYPEN nicht miteinander vereinbar

also geht immernoch nich :/
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#10

Re: Quicksort eines Datensatzes nach alphabet

  Alt 25. Jan 2008, 11:41
Hallo Sai!
Der Fehler ist logisch, es wird ja ein Record mit einem Integer-Wert verglichen - das kann natürlich nicht funktionieren. Ich bin auf dein Konzept nicht eingegangen, da ich die gesamte Vorgehensweise für ungünstig erachte. Wie schon angekündigt, ich mache heute Abend mal einen Alternativvorschlag zur Lösung.
Gruß Ralph
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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