Das Deutsche Casio-Taschenrechner Forum wurde zum 31.12.2013 geschlossen und kann weiterhin als Nachschlagewerk verwendet werden.
Wer mehr erfahren möchte: Ein sehr guter Beitrag von Elias

Nochmal die Zeichenketten ;)

Hilfe beim Programmieren in Casio Basic.

Nochmal die Zeichenketten ;)

Beitragvon neobusy » Mi 18. Mai 2011, 17:03

Ich habe mich voller Nostalgie mal wieder an meinen CFX9850GC gesetzt und ein paar Sachen probiert. Ich poste einfach mal meine Ideen, vielleicht hat ja jemand Lust mitzudiskutieren...

Will man die Zeichen in Listen speichern, fällt der Trick mit dem Imaginärteil weg. Somit stehen einem 15 Ziffern zur Verfügung.

Dort paßt 2^49 (562.949.953.421.312) mit 15 Stellen gerade so rein. Man hätte entsprechend 49 Bit zur Verfügung. Nutzt man noch den Exponenten und die Vorzeichen als Statusbits, so läßt sich noch etwas mehr herauskitzeln, darauf will ich aber im Moment nicht eingehen.

Es gibt 26 Buchstaben, deshalb müssen wir mit 5 Bit arbeiten. (2^5 = 32 Zeichen) Also 5 ungenutzt?
Nicht wirklich, mir fiel spontan noch das Leerzeichen und diverse Interpunktionszeichen ein, die 5 zusätzlichen Plätze sind schnell vergeben.

Nimmt man das Vorzeichen noch mit dazu kommen wir auf 50 Bit und damit lassen sich exakt 10 Zeichen in einer Zahl kodieren. Ein Listeneintrag nimmt 10 Bytes weg, dafür haben wir 10 Zeichen. Klingt fair, ist es allerdings nicht, da wir lediglich mit 5 statt 8 Bit arbeiten müssen.

Immerhin etwas. Das nächste Problem war die Frage wie kommt man vom Tastencode zum Zeichen? Dazu habe ich mir eine kleine Proof-of-Concept Lookup Tabelle angelegt, die in etwa so aussieht {76,66,56,46,36,26} und den Tasten A B C D E F entspricht. Die Position innerhalb der Tabelle entspricht dann dem Zeichenindex.

Wird die 66 gedrückt, ist dies unser B. Es steht an zweiter Stelle und bekommt den Index 2. Usw.

Als nächstes wird die 15 Stellen Zahl, also unsere 50 Bits zusammengesetzt. Das sollte durch Maskierung und Bitschieberei geschehen. Maskierung ist durch die Binäroperatoren im base Modus möglich, Verschiebung durch Multiplikation mit 2er Potenzen. Das muß ich mir noch genauer anschauen, insbesondere das letzte Bit im Vorzeichen muß gesondert behandelt werden. Zur Not erstmal mit 45 Bit probieren.

Die Dekodierung geschieht analog und die Ausgabe über die berüchtigte Kette:

C=1=>Locate A,B,"A"
C=2=>Locate A,B,"B"
C=3=>Locate A,B,"C"
C=4=>Locate A,B,"D"
C=5=>Locate A,B,"E"
C=6=>Locate A,B,"F"

Soweit meine Ideen zum Thema, bevor ich weitergrübel die Frage an euch, was gibts zu verbessern, wo habe ich Denkfehler drin?

Danke!
neobusy
 
Beiträge: 6
Registriert: Di 26. Okt 2010, 11:40
Taschenrechner:

Re: Nochmal die Zeichenketten ;)

Beitragvon elias.koegel » Mi 18. Mai 2011, 18:36

Guck dir bei dieser Gelegenheit mal folgende Seiten an:
(Guck auch mal in die Kommentare, wo das Ganze noch weiter vertieft wurde.)


Desweiteren habe ich deine Erklärung nicht ganz verstanden, wie die 10 Byte für den Listeneintrag verteilt sind. Als Tipp: Der GTR speichert BCD-codiert. Damit sollte klar sein, dass du nicht alle Bits verwenden kannst. Die 4 Bit für eine Ziffer können nur für 10 Kombinationen verwendet werden. Damit entfallen 6 mögliche Kombinationen!

Und die Rechnung mit den 26 Buchstaben geht auch nicht auf. Du brauchst noch Zahlen und Satzzeichen. Groß und Klein-Schreibung wären auch ganz nett. Orientiere dich lieber an der ASCII-Tabelle. Das wären 128 Zeichen, wobei du ca. die ersten 20 vergessen kannst. Einige andere kannst du ja auch mit wegfallen lassen, so dass du vielleicht auf 90 oder 100 kommst. (PS: Ich würde 89 Zeichen verwenden und jedem Zeichen eine Zahl von 10 bis 99 zuordnen. Damit ist klar, dass für jedes Zeichen genau 2 Ziffern verwendet werden. Und man hat keine Probleme mit dem Spezialfall "führende Null".)
Benutzeravatar
elias.koegel
 
Beiträge: 296
Registriert: Mo 8. Dez 2008, 18:16
Taschenrechner:

Re: Nochmal die Zeichenketten ;)

Beitragvon neobusy » Mi 18. Mai 2011, 20:13

Den Sticky hier im Board habe ich gelesen, deine Strategie auf Casigo ist allerdings so einfach wie genial! 2 Zahlen zu nehmen und direkt zuzuordnen ist simpel und deutlich schneller im Code, ich denke ich lasse meine Bitschiebereien sein und mache es so wie du. Danke für den Tip!

Was mich allerdings richtig nervt ist diese Codewurst hier

C=1=>Locate A,B,"A"
C=2=>Locate A,B,"B"
C=3=>Locate A,B,"C"

Das geht bei Groß-/Kleinschreibung + Zahlen ja locker über 60 Vergleiche. Die auch noch alle ausgeführt werden, weil kein else oder jmp drin steckt.
Läßt sich das wirklich gar nicht optimieren?

PS: Meine Bitrechnung war folgende, 15 Zeichen von 0 bis 10 umgerechnet ins Binärsystem entspricht 15 * ln 10 / ln 2. Das sind 49.8 Bit. Da es keine geteilten Bits gibt, kommen wir auf 49. Mit Exponent wären es dann 56. Mit meiner Idee 11 Zeichen, allerdings nur aus einem 32 Zeichen Alphabet. Hin wie her, deine Lösung ist eleganter und einfacher. Mal wieder den Wald nicht vor Bäumen gesehen...
neobusy
 
Beiträge: 6
Registriert: Di 26. Okt 2010, 11:40
Taschenrechner:

Re: Nochmal die Zeichenketten ;)

Beitragvon elias.koegel » Do 19. Mai 2011, 17:02

Die Vergleiche für das Rückwärtige Umwandeln in Schrift habe ich auch nie besser hinbekommen. Vor allem hat mich gestört, dass das relativ langsam ist. Evtl. könnte man die Abfragen in bestimmte Bereiche teilen. Damit würde der im Worst-Case deutlich weniger Abfragen durchführen.
if (A>9 AND A<30)
Then
A=10 => Locate B,C,'A'
...
EndIf
if (A>29 AND A<50)
Then
A=30 => Locate B,C,'9'
...
EndIf

Evtl. könnte man vor das EndIf noch ein Return setzen, um das Unterprogramm zu beenden und zu verhindern, dass der nachfolgende Code, der ja eh nichts mehr sinnvolles macht, nicht ausgeführt wird. Aber evtl. gibt das einen Error am Ende des Programms, weil dann die If-Schleife nicht sauber beendet wird.

Meine Idee ist noch lange nicht das non plus Ultra. Da kann man noch viel verbessern. Du bist hiermit herzlichst aufgefordert, da noch mehr Hirnschmalz hineinzustecken.

Was übrigens auch ein geniales Projekt wäre, einen Interpreter zu schreiben. Also dass man als Text irgendwas eingibt wie "TEXT 'Hallo Welt' " und der Interpreter wandelt das um und gibt dann Hallo Welt auf dem Bildschirm aus. Da könnte man eine eigene Programmiersprache entwickeln. Oder auch ein CAS. Über Sinn und Unsinn kann man sich streiten. Reizvoll ist es aber, aus dieser einfachsten Programmiersprache so viel wie möglich rauszuholen.
Benutzeravatar
elias.koegel
 
Beiträge: 296
Registriert: Mo 8. Dez 2008, 18:16
Taschenrechner:

Re: Nochmal die Zeichenketten ;)

Beitragvon neobusy » Do 19. Mai 2011, 22:00

neobusy
 
Beiträge: 6
Registriert: Di 26. Okt 2010, 11:40
Taschenrechner:


Zurück zu Casio Basic (Alle Modelle, die dies unterstützen)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste