Archiv verlassen und diese Seite im Standarddesign anzeigen : Datensätze sortieren
Hi,
also ich wollte die dateien eines datensatzes alphabetisch sortieren. zuerst hatte ich ein array, welches ich gefüllt habe, jedoch habe ich mittlerweile eine datei erstellt und möchte diese nun einlesen, das programm zum füllen hab ich schon geschrieben.
jetzt häng ich leider dabei, die datei einzulesen, und die eingegebenen daten alphabetische zu ordnen (name, vname, str)
ich brauche dazu ne kopfgesteuerte schleife die die ersten und vielleicht 2. buchstaben vergleicht welche grösser sind.
jedoch weiss ich leider nicht genau wie ich das bewerkstelligen soll. falls jmd ein beispielprogramm oder schonmal das gleiche gemacht hat, wäre ich dankbar, auch wenns mit array gelöst wäre :)
edit: wenn ich dann einmal nach name, vname, str per case auswahl sortieren lassen will, rufe ich dann einfach die procedure auf, mit einer anderen variable? also 3x die selbe procedure mit anderen variablen?
Suchst du einen Sortieralgorithmus oder ne Einleseroutine ?
eigentlich beides :)
zuerst muss ich die datei einlesen, und dann die daten auslesen
so das die angezeigt werden können, und diese möchte ich dann nach case auswahl entweder, nach strasse, name, vname sortieren lassen.
dazu muss ich halt die ersten zeichen vergleichen, mein erstes problem ist das ich es nicht schaffe, die daten die ich in einwohner.txt gespeichert habe, so einzulesen, das ich damit arbeiten kann. also wie ich dann die einzelnen strings anspreche, deswegen wollte ich zuerst array benutzen, aber es ist mühsam jedesmal die daten erneut einzugeben.
Procedure Eingabe_menue;
Begin
Repeat
clrscr;
gotoxy(20,2);
Write('Menü für die Eingabe');
gotoxy(20,3);
Write('============================');
gotoxy(20,4);
Write('1 Nach Name Sortieren');
gotoxy(20,5);
Write('2 Nach Vornamen Sortieren');
gotoxy(20,6);
Write('3 Nach Strasse Sortieren');
gotoxy(20,7);
Write('4 Ende');
gotoxy(20,9);
Write('Ihre Wahl: ');
Readln(Auswahl);
Case Auswahl of
1: sortname;
2: sortvname;
3: sortstrasse;
End;
until Auswahl=4;
End;
so menü habe ich, ich werde dann einfach einzelne proceduren benutzen um jeweils nach wunsch zu sortieren.
ich hab mich aber nun entschieden mit nem array zu arbeiten da mir das wohl einfacher fällt :)
procedure vertauschen;
begin
a:= feld [i,1];
b:= feld [i,2];
c:= feld [i,3];
feld [i, 1]:= feld [i+1, 1];
feld [i, 2]:= feld [i+1, 2];
feld [i, 3]:= feld [i+1, 3];
feld [i+1, 1]:= a;
feld [i+1, 2]:= b;
feld [i+1, 3]:= c ;
end;
procedure sortieren;
begin
FOR i:= 1 TO last-1 DO IF feld [i] > feld [i+1] THEN vertauschen;
end;
Program datensortieren;
Uses crt;
Type TAdresse = Record
Name: String[20];
Vorname: String[20];
strasse: String[20];
End;
Var Person: Array [1..4] of TAdresse;
f: File of TAdresse;
tauschvar: TAdresse;
Auswahl, i ,n , k, g: integer;
a: char;
Nachname: String;
Procedure Datei_oeffnen;
Begin
assign (f, 'einwohner.txt');
reset(f);
end;
Procedure Ausgabe;
Begin
clrscr;
i:=1;
Reset (f);
While NOT EOF(f) Do {EOF=End of File}
Begin
Read (f,Person[i]);
Writeln ('');
Writeln (' Name ', i ,': ',Person[i].Name);
Writeln (' Vorname ', i ,': ',Person[i].Vorname);
Writeln (' Strasse ', i ,': ',Person[i].strasse);
i:=i+1;
writeln;
End;
Readln;
End;
Procedure Eingabe_neu;
Begin
Clrscr;
close (f);
assign (f, 'einwohner.txt');
Rewrite (f);
For i:= 1 To 4 Do
Begin
clrscr;
gotoxy(15,2);
Write ('Name ',i,' eingeben: ');
Readln (Person[i].Name);
gotoxy(15,3);
Write ('Vorname ',i,' eingeben: ');
Readln (Person[i].Vorname);
gotoxy(15,4);
Write ('Alter ',i,' eingeben: ');
Readln (Person[i].strasse);
Write (f,Person[i]);
End;
close (f);
ausgabe;
End;
procedure sortname;
Begin
clrscr;
reset(f);
g:=filesize(f);
FOR i:=1 TO g-2 DO
BEGIN
FOR k:=i+1 TO g-1 DO
BEGIN
IF Person[k+1].name < Person[k].name THEN
BEGIN
tauschvar:=Person[k+1];
Person[k+1]:=Person[k];
Person[k]:=tauschvar;
END;
END;
END;
writeln('Die sortierten Daten lauten: ');
FOR i:=1 to g-1 do
writeln(Person[i].name);
readln;
End;
procedure sortvname;
Begin
clrscr;
reset(f);
g:=filesize(f);
FOR i:=1 TO g-2 DO
BEGIN
FOR k:=i+1 TO g-1 DO
BEGIN
IF Person[k+1].name < Person[k].name THEN
BEGIN
tauschvar:=Person[k+1];
Person[k+1]:=Person[k];
Person[k]:=tauschvar;
END;
END;
END;
writeln('Die sortierten Daten lauten: ');
FOR i:=1 to g-1 do
writeln(Person[i].name);
readln;
End;
procedure sortstrasse;
Begin
clrscr;
reset(f);
g:=filesize(f);
FOR i:=1 TO g-2 DO
BEGIN
FOR k:=i+1 TO g-1 DO
BEGIN
IF Person[k+1].name < Person[k].name THEN
BEGIN
tauschvar:=Person[k+1];
Person[k+1]:=Person[k];
Person[k]:=tauschvar;
END;
END;
END;
writeln('Die sortierten Daten lauten: ');
FOR i:=1 to g-1 do
writeln(Person[i].name);
readln;
End;
Procedure Eingabe_menue;
Begin
Repeat
clrscr;
gotoxy(20,2);
Write('Menü für die Eingabe');
gotoxy(20,3);
Write('============================');
gotoxy(20,4);
Write('1 Nach Name Sortieren');
gotoxy(20,5);
Write('2 Nach Vornamen Sortieren');
gotoxy(20,6);
Write('3 Nach Strasse Sortieren');
gotoxy(20,7);
Write('4 Neuen Datensatz eingeben');
gotoxy(20,8);
Write('5 Ende');
gotoxy(20,11);
Write('Ihre Wahl: ');
Readln(Auswahl);
Case Auswahl of
1: sortname;
2: sortvname;
3: sortstrasse;
4: eingabe_neu;
End;
until Auswahl=5;
End;
Begin
clrscr;
datei_oeffnen;
eingabe_menue;
end.
________________________________________
array war mir doch zu schwer, so jetzt hab ichs soweit das die datei geöffnet wird, jedoch hab ich beim sortieren wohl völligen brainshit gebaut, weil das funzt 0.
ich hab schon so nen kopf, ist denn keiner hier der mir helfen kann? :(
Am besten ist, du schaust dir erstmal ein paar Sortieralgorithmen an.
Diogenes
31.01.2004, 16:17
Stichwort "Sortieren": Sieh mal unter Algo-Grundalgen (http://www.coding-board.de/board/showthread.php?threadid=2036) nach.
Stichwort "Sortierkriterien wechseln":
Wenn Dein array of record etwa folgende Struktur hat:
type
TAdresse = record
Name, Vorname, Strasse: string[ 20]
end;
TListe = array[ 0 .. MaxList] of TAdresse;
dann kommt noch ein Array dazu:
TSortAry = array[ 0 .. 2] of string[20];
Wir haben das so gebaut, damit es die gleiche Größe wir TAdresse hat. Die Vergleichsfunktion ist dann (unter der Vorraussetzung, daß eine zur Funktion globale Variable Liste:TListe existiert, die die unsortierten Daten enthält):
function GroesserAls( Kriterium, Elem1, Elem2: Integer): Boolean;
begin
GroesserAls :=
TSortAry( Liste[ Elem1])[Kriterium] >=
TSortAry( Liste[ Elem2])[Kriterium]
end;
In Kriterium wird 0 übergeben, wenn nach Name sortiert werden soll, 1, wenn nach Vorname sortiert werden soll, und 2, wenn nach Straße sortiert werden soll.
Der seltsame Ausdruck TSortAry( Liste[ Elem1]) wechselt die Interpretation der in der runden Klammer gesetzten Struktur. Das nennt man value type casting und geht nur, wenn die beiden Größen gleich sind. eine TSortAry-Variable muß so viel Platz verbrauchen wie eine TAdresse-Variable, oder das value type casting ist verboten. Dies ist der Grund für die Größe des Arrays.
Alle Klarheiten beseitigt?
Hat jemand mehr Informationen zum Thema Sortieralgorithmen?
http://de.wikipedia.org/wiki/Sortieralgorithmen
Da sind welche aufgefuehrt, wenn du Sourcebespiele bruachst, geh zu Google und suche nach "<name des sortieralgorithmus> pascal"
Diogenes
25.01.2008, 15:26
...oder stell die Zeh-Beispiele um.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.