Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi [Gelöst] Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur (https://www.delphipraxis.net/155822-%5Bgeloest%5D-kombinatorik-anordnung-von-buchstaben-auf-einer-handytastatur.html)

phate2613 9. Nov 2010 15:08


[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:
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

Ruio 9. Nov 2010 18:34

AW: Kombinatorik / Anordnung von Buchstaben auf einer Handytastatur
 
Bei mir passiert gar nichts.
Beim starten:
Code:
---------------------------
informatikbll
---------------------------
Ungültiger Dateiname - %s.
---------------------------
OK  
---------------------------
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.
Beim beenden versucht das Programm auf Adresse 00000000 zuzugreifen

phate2613 9. Nov 2010 18:48

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.

hathor 9. Nov 2010 18:53

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 BUCHSTABENHÄUFIGKEIT berücksichtigen und für die
Wortvorschläge (Autocomplete) die WORTHÄUFIGKEIT.
.
Download der häufigsten Wörter
.

phate2613 9. Nov 2010 18:57

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!

phate2613 9. Nov 2010 19:45

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