dc(1) dc(1)
NAME
dc - Tischrechner (desk calculator)
SYNTAX
dc [datei]
BESCHREIBUNG
Mit dc können Sie im Dialog mit Reliant UNIX die Funktionen eines
Tischrechners nutzen.
datei
Name der Datei, in der die Rechenoperationen stehen, die ausge-
führt werden sollen. dc liest datei bis zu ihrem Ende, dann von
der Standardeingabe.
datei nicht angegeben:
dc liest von der Standardeingabe
ARBEITSWEISE VON DC
dc arbeitet nach dem Prinzip eines Stapelspeichers (stack). Ein Sta-
pelspeicher ist ein linearer Speicher, auf den nur nach dem Prinzip
LIFO (Last In First Out) zugegriffen werden kann. D. h., der zuletzt
in den Stapelspeicher geladene Wert ist der oberste, nur er ist für
Operationen zugänglich. Wenn tieferliegende Werte abgearbeitet werden
sollen, müssen die darüberliegenden gelöscht oder in einem anderen
Speicher zwischengespeichert werden. Dieser Speicher ist wieder ein
Stapelspeicher oder ein Register. Ein Register ist ein Speicher in der
CPU, auf den schnell zugegriffen werden kann. Der Speicher, mit dem dc
arbeitet, wird im folgenden in der Regel nur mit "Stapel" bezeichnet.
Nur dort, wo es erforderlich ist, diesen Arbeitsspeicher von anderen
Speichern zu unterscheiden (wiederum Stapel oder Register), wird er
als "Hauptstapel" bezeichnet.
dc-Eingaben erfolgen in der umgekehrten polnischen Notation (Postfix-
Notation). Wenn Sie z. B. 3 und 4 addieren möchten, geben Sie ein:
3 4 +
Standardmäßig arbeitet dc mit ganzen Dezimalzahlen. Sie können jedoch
auch eine andere Basis für Ein- und Ausgaben festlegen (siehe SYNTAX
VON DC-PROGRAMMEN, i bzw. o) und die Zahl der Nachkommastellen verän-
dern (siehe SYNTAX VON DC-PROGRAMMEN, k).
dc wird von bc aufgerufen [siehe bc(1)]. bc ist ein Präprozessor für
dc, der die Eingabe der Operatoren und Operanden in der normalen
arithmetischen Notation ermöglicht und eine C-ähnliche Syntax zur Rea-
lisierung von Funktionen bietet. Außerdem können bc-Programme Anwei-
sungen zur Ablaufsteuerung enthalten.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
dc(1) dc(1)
SYNTAX VON DC-PROGRAMMEN
c Der gesamte Stapelinhalt wird gelöscht.
d Der oberste Wert im Stapel wird dupliziert (ein weiteres Mal in
den Stapel geladen).
f Alle im Stapel enthaltenen Werte werden ausgegeben, bleiben
jedoch im Stapel erhalten.
i Der oberste Wert im Stapel wird als Basis für weitere Eingaben
verwendet; der Wert wird dabei aus dem Stapel entfernt.
Der voreingestellte Wert für die Basis, in der Eingaben interpre-
tiert werden, ist 10.
I Die aktuell geltende Basis für Eingaben wird in den Stapel gela-
den.
k Der oberste Wert im Stapel wird aus dem Stapel entfernt und als
Skalierungsfaktor benutzt. D. h., bei allen folgenden Ausgaben
wird eine diesem Wert entsprechende Anzahl von Nachkommastellen
ausgegeben, und diese Anzahl wird bei Multiplikationen, Division
und Exponentiationen beibehalten.
lx Der Inhalt des Registers x wird in den Stapel geladen. Das Regi-
ster x bleibt dabei unverändert. Alle Register enthalten am
Anfang den Wert 0.
Lx Der oberste Wert wird vom Stapel x gelöscht und in den Haupt-
Stapelspeicher übertragen.
o Der oberste Wert im Stapel wird als Basis für weitere Ausgaben
verwendet; der Wert wird dabei aus dem Stapel gelöscht.
Der voreingestellte Wert für die Basis, in der Zahlen ausgegeben
werden, ist 10.
O Die aktuell geltende Basis für Ausgaben wird in den Stapel gela-
den.
p Der oberste Wert im Stapel wird ausgegeben, jedoch nicht aus dem
Stapel entfernt.
P Der oberste Wert im Stapel wird als ASCII-Zeichenkette interpre-
tiert und ausgegeben, wobei der Wert aus dem Stapel entfernt
wird.
q Das Programm wird beendet. Wenn eine Schleife ausgeführt wird, so
wird die Rekursionsstufe um zwei verringert.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
dc(1) dc(1)
Q Das Programm wird beendet. Der oberste Wert im Stapel wird aus
dem Stapel entfernt und die Ausführungsstufe der Schleife um die-
sen Wert verringert.
sx Der oberste Wert des Stapels wird gelöscht und in das Register x
geladen, d. h. als oberstes Element im Register x abgelegt. x
kann ein beliebiges Zeichen sein.
Sx Der oberste Wert des Hauptstapels wird gelöscht und in den Stapel
x geladen, d. h. als oberstes Element im Stapel x abgelegt. x
kann ein beliebiges Zeichen sein.
v Der oberste Wert im Stapel wird durch seine Quadratwurzel
ersetzt. Beim Wurzelziehen werden auch alle Nachkommastellen
berücksichtigt (auch wenn der geltende Skalierungsfaktor kleiner
ist als die Anzahl der vorhandenen Nachkommastellen, siehe k).
x Der oberste Wert im Stapel wird als Folge von Anweisungen an das
dc-Kommando interpretiert und ausgeführt.
X Der zuletzt geladene Wert wird durch die aktuell geltende Zahl
der Nachkommastellen ersetzt.
z Die Anzahl der Elemente des Stapels wird in den Stapel geladen.
Z Die oberste Zahl im Stapel wird durch ihre Länge ersetzt.
zahl zahl wird in den Stapel geladen. zahl ist eine Zeichenkette, die
aus den Ziffern 0-9 sowie Punkten bestehen darf und der ein
Unterstrich _ vorangestellt sein kann.
Der erste auftretende Punkt wird als Dezimalpunkt interpretiert,
alle anderen Punkte werden ignoriert.
Ein vorangestellter Unterstrich _ wird als negatives Vorzeichen
interpretiert.
! Der Rest der Zeile nach dem Ausrufezeichen wird als Reliant UNIX
Kommando interpretiert und ausgeführt.
+
-
/
*
%
^ Die beiden obersten Zahlen im Stapel werden mit dem angegebenen
Operator verknüpft. Dabei bedeutet:
+ addieren
- subtrahieren
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
dc(1) dc(1)
/ dividieren
* multiplizieren
% Kongruenzklassen bilden (Rest beim Teilen)
^ potenzieren
Die beiden Zahlen werden aus dem Stapel gelöscht. Das Ergebnis
der ausgeführten Operation wird anstelle der beiden Zahlen in den
Stapel geladen.
;: bc verwendet die Zeichen ; und : für Feldoperationen.
<x
>x
=x Die beiden obersten Werte werden aus dem Stapel geholt und mit-
einander verglichen. Die Relation ist erfüllt, wenn der oberste
Wert im Stapel kleiner bzw. größer ist als der zweitoberste Wert,
bzw. gleich dem zweitobersten Wert ist. Wenn die angegebene Rela-
tion erfüllt ist, dann wird Register x ausgewertet.
? Eine Eingabezeile wird vom Eingabegerät (das ist normalerweise
das Terminal) geholt und ausgeführt.
[...]
Die in eckigen Klammern eingeschlossene ASCII-Zeichenkette wird
in den Stapel geladen.
FEHLERMELDUNGEN
x is unimplemented
x ist eine Oktalzahl, die keine gültige Anweisung für dc ist.
stack empty
Stapelinhalt reicht für auszuführende Operation nicht aus.
Out of space
Kein freier Platz mehr im Stapel (zu viele Ziffern).
Out of headers
Zu viele Zahlen.
Out of pushdown
Zu viele Werte im Stapel.
Nesting Depth
Zu große Schachtelungstiefe bei angeforderten Operationen.
exp not an integer
Exponent beim Potenzieren ist keine ganze Zahl.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
dc(1) dc(1)
BEISPIELE
Beispiel 1
In diesem Beispiel werden die Zahlen 0-9 ausgegeben:
[lip1+sili10>a]sa
0si lax
0
1
2
3
4
5
6
7
8
9
dc arbeitet diese Eingabe folgendermaßen ab: Zunächst wird die Zei-
chenkette lip1+sili10>a als oberster Wert in den Stapel geladen ([ ]).
Dann wird die Zeichenkette im Stapel gelöscht und im Register a
gespeichert (sa). Der Befehl 0si bewirkt, daß die Zahl 0 im Register i
gespeichert wird. Daraufhin wird die Zeichenkette lip1+sili10>a im
Stapel abgelegt, bleibt aber zusätzlich im Register a gespeichert. Der
Befehl x bewirkt, daß nun die Zeichenkette lip1+sili10>a als Folge von
dc-Befehlen interpretiert und entsprechend ausgewertet wird.
Der Ablauf sieht demnach folgendermaßen aus: Die Zahl 0 (Inhalt des
Registers i) wird in den Stapel geladen und ausgegeben usw.
Beispiel 2
In diesem Beispiel werden die ersten zehn Werte von n! ausgegeben:
[la1+dsa*pla10>y]sy
0sa1
lyx
1
2
6
24
120
720
5040
40320
362880
3628800
SIEHE AUCH
bc(1).
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98