Die hier verwendete Notation ist in einem gesonderten Beitrag zusammengestellt.
Eine moderne Dokumentbearbeitung mit Formatierungen, wie sie mit einem Textverarbeitungsprogramm auf dem PC möglich ist, kann man mit dem HP 49G nicht erledigen.
Aber man kann die eingebauten Befehle zur Textbearbeitung, die man allgemein auch "Stringbearbeitung" nennt (engl.: character string = Zeichenkette), sinnvoll miteinander kombinieren, um eine bescheidene Textbearbeitung zu erreichen. In Verbindung mit Listen und Auswahlmenüs kann man damit sogar Adreß- oder Telefonverzeichnisse anlegen und pflegen.
Anstelle des Wortes "Zeichenkette" wird hier der kurze englische Begriff "String" verwendet.
Nachfolgend werden die grundlegenden String-Befehle in ihrer Wirkung im RPN-Modus erläutert.
Der Objekttyp "String" (Objekttyp 2) wird durch begrenzende Anführungszeichen " " gekennzeichnet. Alle ASCII-Zeichen, die sich innerhalb von 2 begrenzenden Anführungszeichen befinden, gehören zu einem String-Objekt.
Innerhalb eines Strings dürfen keine Anführungszeichen vorkommen, weil sie ja dessen Begrenzer (engl.: delimiter) sind. Ein einzelnes Anführungszeichen innerhalb des Strings beendet den String an dieser Stelle, der Reststring wird als Objektname genommen oder führt zu einer Fehlermeldung. Gibt man zwei Anführungszeichen "" innerhalb eines Strings ein, dann teilen diese den String an dieser Stelle in zwei selbständige Strings auf.
Merkwürdige Tatsache: Edidiert man einen existierenden String nachträglich und gibt dann zwei Anführungszeichen "" ein, dann bleiben sie im String ohne Fehlermeldung stehen.
Einzelne Anführungszeichen innerhalb des Strings können aber trotzdem ordnungsgemäß gesetzt werden, wenn ein Backslash (\) vorangestellt wird. Dieser kann über [ALPHA][rightshift][5] erzeugt werden und wird als Steuerzeichen (engl.: control character) erkannt. Soll ein Backslash im String vorkommen, dann muß diesem auch ein Backslash vorangestellt werden, also müssen zwei \\ eingegeben werden, wenn einer im String dargestellt werden soll.
Folgende beiden Bilder zeigen Quelltext (linkes Bild) und Anzeige (rechtes Bild) eines kleinen Programms, bei dem im String Anführungszeichen und Backslashes enthalten sind:
Das Setzen der Anführungszeichen erfolgt durch [rightshift][×]. Dadurch schaltet der HP 49G in den Befehlszeileneditor, der Cursor steht dann zwischen den Anführungszeichen und der String kann eingegeben werden.
Für die Eingabe der auf der Tastatur zur Verfügung stehenden Buchstaben und Zeichen muß vorher die Taste [ALPHA] einmal oder zweimal gedrückt oder festgehalten werden, wenn anschließend diese Zeichen eingegeben werden. Man kann auch während der Eingabe von Groß- auf Kleinbuchstaben (und umgekehrt) durch [leftshift] umschalten. Die genaue Handhabung ist in Kapitel 2 des Benutzerhandbuchs beschrieben.
Alle Zeichen des HP 49G, auch die nicht auf der Tastatur verfügbaren Zeichen, sind in einer Auswahltabelle zusammengestellt, die über die Tastenkombination [rightshift][CHARS] aufgerufen werden kann (siehe auch Beitrag "Undokumentierte Befehle").
Verkettung durch "+"
Die Taste mit dem Pluszeichen [+] aktiviert bei der Stringbearbeitung die Verkettungsfunktion. Ein Objekt (keine Liste!) kann mit einem String oder zwei Strings können miteinander verkettet (engl.: concatenate) werden.
Im RPN-Modus stehen die zu verkettenden Objekte im Stack, wobei
- das oben stehende Objekt im String vorne (= links) und
- das darunter stehende im String hinten (= rechts) angeordnet wird.
Beispiele:
Typen Verkettung mit [+] ergibt in Stackebene 1 Zwei Strings "ABCDEF"
"GHIJK"
[+]"ABCDEFGHIJK" String und Zahl "ABCD"
1234
[+]"ABCD1234" Objektname und String 'NAME1'
"ABCD"
[+]"NAME1ABCD" Programm und String « ABC 6 + 65 × »
"CDEF"
[+]"« ABC 6 + 65 × »CDEF" Vektor und String [4 5]
"ABCDE"
[+]"[4 5]ABCDE" String und algebraisches Objekt "WW = "
'5*a+7*b'
[+]"WW = '5*a+7*b'" Diese Beispiele mögen zur Erläuterung genügen.
Der Befehl NOT aus der Booleschen Algebra bewirkt, daß alle Bits des Objekts in Stackebene 1 negiert werden. Bei Strings hat dies einen überraschenden Effekt.
Je 8 Bit bilden ein ASCII-Zeichen. Die 256 ASCII-Zeichen haben die Code-Nummern 0 bis 255.
Beispiele:
- Der Großbuchstabe "A" hat den Code 65, binär 0100 0001.
Die Negierung ergibt 1011 1110, Code 190.
Dieser Code gehört zum ASCII-Zeichen "¾".
- Der Kleinbuchstabe "a" hat den Code 97, binär 0110 0001.
Die Negierung ergibt 1001 1110, Code 158.
Dieser Code wird auf dem HP 49G als schwarzes Quadrat dargestellt, siehe Tabelle des HP-Zeichensatzes.In nachfolgendem Bild_1 sind beide Buchstaben als String "Aa" in Stackebene 4 und die Negierung in Stackebene 3 dargestellt.
Bild_1
Beispiel:
In den Stack eingeben: "HP 49G: Strings".
Dann Befehl NOT ausführen.
Die Eingaben verschwinden, das Ergebnis wird in Stackebene 1 angezeigt und enthält außer "·¯ËƸÅ߬" auch Sonderzeichen des HP 49G mit Codierungen >128 . Diese Codierungen werden auf dem HP 49G anders als hier im Text dargestellt, siehe Tabelle des HP-Zeichensatzes.
Nebenstehendes Bild_1 zeigt den (vorher duplizierten) Eingabestring in Stackebene 2 und das
Ergebnis der Negierung in Stackebene 1.
Verknüpfen der Bits durch OR, AND und XOR
Die Booleschen Funktionen OR, AND und XOR werden hier nicht erläutert, entsprechende Informatikkenntnisse werden vorausgesetzt.
Erläuterungen zur Umrechnung von Binärzahlen in Dezimalzahlen sind im Beitrag "Zahlensysteme" zu finden.Diese Befehle aus der Booleschen Algebra wirken auf zwei String-Objekte gleichzeitig. Jedes Bit des String-Objekts in Stackebene 1 wird mit dem entsprechenden Bit des zweiten String-Objekts in Stackebene 2 gemäß der entsprechenden Funktion OR- AND- oder XOR-verknüpft. Deshalb müssen beide Strings dieselbe Länge haben. Bei verschieden langen Strings gibt der HP 49G die Fehlermeldung "Bad Argument Value" aus.
In den nachfolgenden Bildern sind zwei String-Objekte (jetzt in Stackebene 3 und 2 zu sehen) über eine dieser Funktionen verknüpft. Die Eingaben verschwinden vom Stack, das Ergebnis wird in Stackebene 1 angezeigt. (Um die Eingaben in den Bildern sichtbar zu machen, wurden sie vor Aufruf der Befehle dupliziert.)
Das dargestellte LOGIC-Menü (Menü-Nr. 16) ist über die Tastenkombination [rightshift][3][NXT][LOGIC] aufrufbar. In der dritten Spalte der Tabelle wird der jeweils erste Buchstabe "H" und "P" binär und binär verknüpft dargestellt.
OR Bild_2
"H" = 72 = 0100 1000 "P" = 80 = 0101 0000
"H" OR "P" = "X" = 88 = 0101 1000
AND Bild_3
"H" = 72 = 0100 1000 "P" = 80 = 0101 0000
"H" AND "P" = "@" = 64 = 0100 0000
XOR Bild_4
"H" = 72 = 0100 1000 "P" = 80 = 0101 0000
"H" XOR "P" = 24 = 0001 1000
Code 24 ist hier nicht darstellbar.
Das zweiseitige String-Menü erreicht man über die Tastenkombination [leftshift][PRG][NXT][CHARS] oder über die Menünummern 62.01 und 62.02. Bild_1 zeigt die erste Menüseite.
Dieser Befehl zieht aus einem String einen Substring heraus, dessen Anfangs- und Endposition angegeben sein muß.
- Der String steht in Stackebene 3,
- die Anfangsposition des Substrings steht in Stackebene 2,
- die Endposition des Substrings steht in Stackebene 1.
als Ergebnis von SUB steht der Substring im Stack.
Beispiel:
Die Zahl 335 = 50031545098999707 hat 17 Stellen. Es sollen die Stellen 6 bis 12 ausgegeben werden. Zuerst wird die Zahl mit dem Befehl ->STR in einem String verwandelt und dann der Befehl SUB darauf angewendet:
String in Stackebene 3: "50031545098999707" Anfangsposition in Stackebene 2: 6 Endposition in Stackebene 1: 12 Nach Aufruf von SUB. Ergebnis: "5450989"
REPL = Substring einbauen oder anhängen
Dieser Befehl ersetzt (engl.: replace = ersetzen) in einem String ab einer bestimmten Position die Zeichen durch einen vorgegebenen Substring. Die Länge des Substrings wird vollständig übernommen, die vorher vorhandenen Zeichen im zu ändernden String werden überschrieben. Ist der Substring länger als der zu ersetzende Rest des Strings, dann wird der String einfach um die überzähligen Zeichen verlängert. Wird eine Position größer als die Länge des Strings angegeben, so wird der Substring am Ende angehängt.
Beispiel:
In der Zahl 335 = 50031545098999707 sollen ab Position 6 die Ziffern durch das Wort "unlesbar" ersetzt werden.
String in Stackebene 3: "50031545098999707" Startposition in Stackebene 2: 6 Substring als Ersatz in Stackebene 1: "unlesbar" Nach Aufruf von REPL. Ergebnis: "50031unlesbar9707" Nun sollen Ziffern ab der vorletzten Position (16) ersetzt werden durch das Wort "unlesbar". Die Buchstaben "un" ersetzen die beiden letzten Ziffern, der restliche Substring "lesbar" wird ab Position 18 angehängt.
String in Stackebene 3: "50031545098999707" Startposition in Stackebene 2: 16 Substring als Ersatz in Stackebene 1: "unlesbar" Nach Aufruf von REPL. Ergebnis: "500315450989997unlesbar" Man kann auch einen Substring mit REPL an einen String anhängen. Als Startposition nimmt der HP 49G auch eine höhere Zahl als SIZE+1 (SIZE siehe unten!) ohne Meckern, hängt aber dann trotzdem unmittelbar an der letzten Position an, er fügt nichts dazwischen ein.
Diese Möglichkeit des Anhängens durch REPL ist umständlich und unpraktisch. Man sollte Strings nur mit der oben beschriebene Verkettung durch [+] anhängen bzw. zusammenhängen.
POS = Position eines Substrings im String ermitteln
Der Befehl POS ermittelt die Anfangspositon eines Substrings in einem String. Ist der gesuchte Substring nicht im String enthalten, wird Null zurückgegeben.
String in Stackebene 2: "50031545098999707" gesuchter Substring in Stackebene 1: "545" Nach Aufruf von POS. Ergebnis: 6 Es wird nur immer das erste Auftreten des Substrings im String angezeigt.
Mehrfaches Vorkommen eines Substrings, z.B. die "0" in obiger Zahl, kann auf diese Weise nicht ermittelt werden. Dazu müßte man ein Programm unter Zuhilfenahme der unten beschriebenen Befehle HEAD und TAIL erstellen.
SIZE = Länge eines Strings ermitteln
Man stellt den String in den Stack. Nach Aufruf von SIZE wird die Länge des Strings angezeigt.
NUM = ASCII-Code für ein Zeichen ausgeben
Man stellt das ASCII-Zeichen in den Stack. Nach Aufruf von NUM wird der ASCII-Code dieses Zeichens angezeigt.
NUM darf nicht verwechselt werden mit der Tastenfunktion [rightshift][->NUM], die einen symbolischen Ausdruck berechnet und als Zahl ausgibt.Beispiel:
Man stellt "A" in den Stack. Der Aufruf von NUM ergibt 65.
CHR = zum ASCII-Code das zugehörige Zeichen ermitteln
Man stellt einen ASCII-Code in den Stack. Nach Aufruf von CHR steht das ASCII-Zeichen im Stack.
Beispiel:
Mit 65 wird im Stack ergibt der Aufruf von CHR den Buchstaben "A".
OBJ-> = Objekt in seine Komponenten zerlegen
OBJ-> zerlegt ein Objekt in seine Komponenten. Strings werden in einen Objektnamen umgewandelt.
Man kann auch den Befehl STR-> benutzen, der in OBJ-> enthalten ist.Nach dem Aufruf von OBJ-> wird aus dem String "ABCD" ein Objektname gebildet: 'ABCD'.
Dieser Objektname kann mit einem leeren String "" verkettet und damit wieder in einen String verwandelt werden. Der weiter unten besprochene Befehl S~N wandelt auch Strings in Objektnamen um und umgekehrt.
->STR = Objekt in einen String verwandeln
Ein Objekt im Stack, meist eine Zahl, wird durch ->STR in einen String verwandelt. Ein bereits vorhandener String wird durch ->STR nicht verändert.
Beispiel:
Die Zahl 12345.678 wird durch ->STR in einen String "12345.678" verwandelt.
HEAD = erstes Zeichen eines Strings ausgeben
Beispiel:
"ABCD".
Nach Aufruf von HEAD steht "A" im Stack.
TAIL = erstes Zeichen wegnehmen und Rest des Strings anzeigen
Beispiel:
"ABCD".
Nach Aufruf von TAIL steht "BCD" im Stack.
Um diese Bibliothek benutzen zu können, muß sie mit 256 ATTACH aktiviert werden. Erst dann stehen die folgenden beiden Stringbefehle zur Verfügung.
S~N = Objektnamen in einen String umwandeln und umgekehrt.
Aus dem String "ABCD" wird nach Aufruf von S~N der Objektname 'ABCD' erzeugt.
Aus dem Objektnamen 'ABCD' wird nach Aufruf von S~N der String "ABCD" erzeugt.
SREV = Zeichenreihenfolge in einem String umkehren
(engl.: SREV = string reverse).
Beispiel:
Aus "ABCDEFabcdef1234" wird nach Aufruf von SREV der String "4321fedcbaFEDCBA" erzeugt.
Für die Eingabe von Strings während eines Programmlaufs sind die Befehle INPUT, INFORM und PROMPT geeignet.
In den anderen Beiträgen werden die Stringbefehle häufig benutzt, um die Ausgaben über DISP oder MSGBOX entsprechend zu formatieren. Deshalb wird hier darauf verzichtet, weitere Erläuterungen oder Beispiele anzugeben.
Namhafte Autoren haben ausgezeichnete Programme zur Textbearbeitung und Datenspeicherung für den HP 49G geschrieben. Unter www.hpcalc.org findet man genügend Beispiele (Editoren, PIMs, Stringwriter, Telefonmanager, Organizer, Scheduler, Database-Manager).
Zur Inhaltsangabe dieses Beitrags
Zur Beitragsübersicht
Copyright © 2002 Otto Praxl
Alle Rechte vorbehalten!