Einzelnen Beitrag anzeigen

phate2613

Registriert seit: 12. Okt 2008
Ort: Berlin
14 Beiträge
 
RAD-Studio 2009 Arc
 
#1

[Gelöst] Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur

  Alt 9. Nov 2010, 16:08
Guten Tag,

für meine Abi-Arbeit(BLL) schreibe ich derzeit an einem Algorithmus, der die Anordnung der Buchstaben auf einer Handytastatur durchprobiert.

Eine Handytastatur sieht so aus:

1 2 3
4 5 6
7 8 9
# 0 *

Auf den Tasten 2 - 9 werden die Buchstaben alphabetisch in 3er- bzw. 4er-Gruppen geordnet. Die Anordnung ist aber nicht optimal und hier beginnt meine BLL.

Mein Programm soll nun ALLE Möglichkeiten der alphabetischen Anordnung durchprobieren.

Dies geschieht nach folgendem Muster:

Auf den Tasten 2-8 wird jeweils ein Buchstabe gelegt, die restlichen befinden sich auf Taste 9 - das ist der Ausgangzustand.

2 - a
3 - b
usw.
9 - h i j k l ... y z

Nun wird pro Schritt ein Buchstabe von Taste 9 auf Taste 8 verschoben, bis auf der Taste 9 nur ein Buchstabe liegt - z. Tritt dieser Fall ein, wird von Taste 8 der erste Buchstabe auf Taste 7 verschoben, der zweite Buchstabe rutscht nach vorne und die restlichen werden wieder auf die Taste 9 gepackt - vor das z natürlich.

Spielt man das weiter durch, ist der erste Buchstabe auf der Taste 8 das y und der erste Buchstabe von Taste 7 rutscht auf Taste 6, der zweite an die erste Stelle, der dritte geht auf Taste 8 und die restlichen wieder auf Taste 9.

Soweit so gut, nur die Umsetzung in Delphicode treibt mich in den Wahnsinn. Es gibt anscheinend noch einige Fehler und ich komme seit einigen Tagen einfach überhaupt nicht weiter und hoffe, ihr könnt mir vielleicht auf die Sprünge helfen.

Der Fehler tritt auf, wenn er anfängt von Taste 6 auf Taste 5 zu verschieben, beim Verschieben auf Taste 9 zurück, "schluckt" er dann das z und damit kommt er dann natürlich nicht mehr klar.

Kommentare zum Code:
- Ich spreche von Ebene und nicht von Taste
- TTaste ist ein Record mit T: array[1..19] of Char
- Tasten ist ein array[2..9] of TTaste
- TEbenenzeiger ist ein Integer
- NOCHAR ist eine Konstante mit dem Wert "-" und dient als Zeichen, dass ein Platz auf der Taste nicht belegt ist

- die Prozedur Schritt wird aus der Gui aufgerufen, die danach den momentanen Status der Tastatur ausgibt.

Delphi-Quellcode:
procedure TSortieren.Schritt;
begin
  Von := HoechsteEbeneMitMehrAlsEinemBuchstaben;
  Nach := Von - 1;

  if Von = 2 then
  begin
    Running := false;
    Exit;
  end;

  if HoechsteEbeneMitMehrAlsEinemBuchstaben <> 9 then
  begin
    VerschiebeZurueckAufEbene9( );
  end
  else
  begin
    VerschiebeErstenBuchstaben( );
  end;

  SpeichereMusterInCache( Tasten );
end;

procedure TSortieren.VerschiebeAlleElementeUmEinsNachVorne( Start: Integer; Ebene: TEbenenZeiger );
var
  J: Integer;
begin
  for J := Start to 18 do
  begin
    Tasten.T[Ebene].T[J] := Tasten.T[Ebene].T[J+1];
  end;
  Tasten.T[Ebene].T[19] := NOCHAR;
end;

procedure TSortieren.VerschiebeErstenBuchstaben();
var
  I, EinfuegePosition: Integer;
begin
  EinfuegePosition := 0;

  for I := 2 to 19 do
  begin
    if Tasten.T[Nach].T[I] = NOCHAR then
    begin
      EinfuegePosition := I;
      Break;
    end;
  end;

  Tasten.T[Nach].T[EinfuegePosition] := Tasten.T[Von].T[1];
  VerschiebeAlleElementeUmEinsNachVorne( 1, Von );
end;

//durchläuft alle Ebenen und sucht die erste Taste deren erster Buchstabe, der ist, den sie höchstens haben kann
function TSortieren.HoechsteEbeneMitMehrAlsEinemBuchstaben: TEbenenZeiger;
var
  res: TEbenenZeiger;
  i: Integer;
begin
  res := 0;

  for i := 3 to 9 do
  begin
    if Tasten.T[i].T[1] = EbenenBuchstaben[i] then
    begin
      res := i-1;
      break;
    end;
  end;

  if res = 0 then
    res := 9;

  result := res;
end;

procedure TSortieren.VerschiebeZurueckAufEbene9();
var
  I,J,K,L: Integer;
  TempTaste: TTaste;
  aEbene: TEbenenZeiger;
begin
  aEbene := Von;

  //Ersten Buchstaben auf Ebene davor verschieben
  VerschiebeErstenBuchstaben( );

  //Taste kopieren
  TempTaste := Tasten.T[aEbene];

  //Ersten Buchstaben behalten und den Rest überschreiben
  Tasten.T[aEbene].T[1] := TempTaste.T[1];
  for I := 2 to 19 do
  begin
    Tasten.T[aEbene].T[I] := NOCHAR;
  end;

  //Nach vorn verschieben
  for L := 1 to 18 do
  begin
    TempTaste.T[L] := TempTaste.T[L+1];
  end;
  TempTaste.T[19] := NOCHAR;

  //Erste leere Position auf der Temptaste suchen und in L speichern
  for I := 1 to 19 do
  begin
    if Temptaste.T[I] = NOCHAR then
    begin
      L := I;
      Break;
    end;
  end;

  //den ersten Buchstaben der Ebene ans Ende der TT kopieren und
  //durch den ersten der TT ersetzen
  for K := aEbene+1 to 9 do
  begin
    TempTaste.T[L] := Tasten.T[K].T[1]; <-------- HIER LAG DER FEHLER
    Inc( L );
  end;

  for K := aEbene+1 to 8 do
  begin
    Tasten.T[K].T[1] := TempTaste.T[1];

    for L := 1 to 18 do
    begin
      TempTaste.T[L] := TempTaste.T[L+1];
    end;
    TempTaste.T[19] := NOCHAR;
  end;

  Tasten.T[9].T := TempTaste.T;
end;
Entwicklungsumgebung ist Delphi 2009
Stefan Rehbein

Geändert von phate2613 ( 9. Nov 2010 um 20:47 Uhr) Grund: Funktion im Quellcode vergessen einzufüge
  Mit Zitat antworten Zitat