Pascal - Zahlen sortieren in Pascal (Geany)

...komplette Frage anzeigen

1 Antwort

Tja.... also... Was hältst Du denn davon, die Ausgabe zum Schluß nicht nach Buchstaben, sondern nach Häufigkeit ausführen zu lassen?

Also: NICHT den Index, über den Du auf die Häufigkeitswerte zugreifst, einfach starr linear von A bis Z laufen lassen, sondern in der Reihenfolge der Häufigkeit?

Dazu KÖNNTEST Du (als einer der vielen Wege nach Rom) zum Beispiel ein zweites Array anlegen, welches die Buchstaben in der Reihenfolge ihrer Häufigkeit enthält. Zur Ausgabe würdest Du dann den Index auf jenes Array linear durchlaufen lassen, aus jenem Array den jeweiligen Buchstaben auslesen und mit dem dann als Index ins Array Deiner Häufigkeiten gehen. Also einfach eine zusätzliche "Indirektion" einbauen: Statt...

for C := 'A' to 'Z' do

...in der Ausgabe am Schluß schreibst Du sowas wie

for i := 0 to 26 do
    C := Haeufigkeitsreihe[i];
    ...und dann der Rest wie gehabt...

Dann bleibt noch die Frage, wie Du dieses Array mit der Häufigkeits-Reihenfolge aufstellst. Auch da gibt es mindestens zig Wege nach Rom...

Du könntest unter anderem...

  • ganz stupide linear (wie ein kleines Kind, dem man die Aufgabe stellt) vorgehen und ZUERST das allergrößte Häufigkeit ermitteln lassen, deren Buchstaben in das erste Element der "Haeufigkeitsreihe" eintragen und dann den Buchstaben mit der nächst niedrigeren oder gleichgroßen Häufigkeit suchen lassen - bis keiner mehr übrig ist. Also 26 Mal.
  • etwas intelligenter herangehen und einen Sortieralgorithmus ansetzen. Da gibt es zig verschiedene Möglichkeiten - sowohl was den Algorithmus selbst angeht, als auch, wo Du den herbekommst: Im Pascal sollte bereits der Quicksort-Algorithmus eingebaut sein (ähmmm... offenbar nicht: Beim losen Blättern in ein paar Suchergebnissen sieht es so aus, als ob die Laufzeitbibliotheken der üblichen Pascal-Compiler da echt armseelig aussehen). Außerdem gibt es jede Menge Google-Treffer für winzige Codesnippets (so 20-Zeiler), die Sortierung bereitstellen (Google nach "Pascal Sort"). Ein Algorithmus, der ein sortiertes Index-Array erzeugt statt die originalen Daten herumzuschleudern, kann aus jedem x-beliebigen anderen Algorithmus erzeugt werden, indem der Datenzugriff gegen indizierten ausgetauscht wird. Wobei Du Dir das auch für später lassen kannst, nachdem Du die ersten Basics der Sortierung verstanden hast.

Das erstmal als Anregung zum Einarbeiten in die Sortierung. Ist übrigens ein sehr interessantes Thema, sobald Du Dich tiefer reinkniest - weil auch aus Sortierung kann man eine ganze Wissenschaft machen, wenn es darum geht, die schnellsten und platzsparendsten Varianten für verschiedenste Umgebungen zu erzeugen. Na ja: Übertreibe es zu Anfang nicht!

BeneSalvatore 27.05.2013, 15:42
    var
  S: string;
  Buchstaben: array['A'..'Z'] of integer;
  Haeufigkeit: array[1..26] of integer;
  C: char;
  I, Laenge, b: integer;

begin
  { Buchstaben initialisieren }
  for C := 'A' to 'Z' do
    Buchstaben[C] := 0;
  Write('Text eingeben: ');
  ReadLn(S);
  Laenge := Length(S);
  for I := 1 to Laenge do begin
    C := S[I];
    C := UpCase(C);
    { Test, ob 'A' <= C <= 'Z' einbauen! }
    Buchstaben[C] := Buchstaben[C] + 1;
  end;
  for C := 'A' to 'Z' do
    Begin
    b:=1;
    If Buchstaben[C]>0 Then 
                                            Begin
                    Haeufigkeit[b]:=Buchstaben[C]/Laenge;
                    i:=i+1;
                    End;
    End;

so sieht es aus. Doch jetzt kriege ich folgende Fehlermeldung:

Hausaufgabe.pas(29,37) Error: Incompatible types: got "Extended" expected "SmallInt"
Hausaufgabe.pas(37) Fatal: There were 1 errors compiling module, stopping

Woran liegts? Es ist doch alles vom Typ integer ...

0
BeneSalvatore 27.05.2013, 15:47
@BeneSalvatore
Haeufigkeit[b]:=Buchstaben[C]/Laenge;   

Dort liegt wohl der Fehler. Aber es sind doch alle 3 Typen vom Typ integer

0

Was möchtest Du wissen?