![]() |
[Gelöst] Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur
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:
Entwicklungsumgebung ist Delphi 2009
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; |
AW: Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur
Bei mir passiert gar nichts.
Beim starten:
Code:
Beim Klick auf Schritt gibts ne AV(Zugriffsverletzung bei Adresse 00467707 in Modul 'informatikBll.exe'. Lesen von Adresse 0000793E.) und bei GO passiert gar nichts.
---------------------------
informatikbll --------------------------- Ungültiger Dateiname - %s. --------------------------- OK --------------------------- Beim beenden versucht das Programm auf Adresse 00000000 zuzugreifen |
AW: Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur
Das liegt daran, dass der jedes Muster in einer Datei abspeichert, ich habe jetzt alle entsprechenden Funktionen auskommentiert und die aktualisierte Version hochgeladen
Bei Klick auf GO soll bisher auch nichts passieren, diese Funktionen ist noch nicht geschrieben. |
AW: Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur
EXE geht bei mir nicht. (WIN XP SP3)
Die Idee, die Texteingabe zu verbessern, ist grundsätzlich gut! Aber: ich würde die ![]() Wortvorschläge (Autocomplete) die ![]() . ![]() . |
AW: Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur
Funktioniert inwiefern nicht?
Ja, ich werde im nächsten Schritt auch die Buchstabenhäufigkeit beachten, aber es geht bei diesem Programm nur darum, alle Möglichkeiten der Anordnung zu berechnen, um aus diesen dann den effektivsten auszuwählen. Aber trotzdem danke! |
AW: Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur
Problem ist gelöst, wens interessiert:
Die temporäre Taste hatte ebenfalls nur 19 Plätze zur Verfügung, (19 deswegen, weil das für die normalen Tasten die maximale Anzahl Buchstaben ist) es werden allerdings mehr benötigt bzw. dadurch dass nicht genug Plätze da waren, kopierte er mehrmals an den 19ten Platz... Trotzdem danke für dich Hilfe. Wünscht mir viel Glück bei der BLL :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz