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