HEX-Ausgabe


Gesucht ist eine Ausgaberoutine, die es gestattet, einen gegebenen Wert n vom Typ CARDINAL in der Stellenwertdarstellung zur Basis 16 (hexadezimal) in ein Ausgabefeld der minimalen Breite k auszugeben; als Ziffern für 10 - 15 sollen die Großbuchstaben 'A' - 'F' verwendet werden.

Zuerst bauen wir eine Hilfsroutine auf, die eine einzelne HEX-Ziffer mittels der Standard-Ausgaberoutine Write(c) ausgibt; dabei nutzen wir aus, daß im ASCII-Code (und in allen anderen uns bekannten Codierungen) die Ziffern '0' .. '9' und die Buchstaben 'A' ..'F' jeweils unmittelbar hintereinander liegen. Zur Umwandlung zwischen den Datentypen CARDINAL und CHAR verwenden wir die Transfer-Funktionen ORD und CHR.

FROM InOut IMPORT Write;

PROCEDURE WriteHexDigit(n: CARDINAL);
(* PRE n < 16 *)
BEGIN IF n < 10
      THEN Write(CHR(ORD('0') + n))
      ELSE Write(CHR(ORD('A') + n - 10))
      END
END WriteHexDigit;
Weiterhin nutzen wir die bekannte Tatsache aus, daß bei der Stellenwertdarstellung einer Zahl n zu einer Basis B die letzte Ziffer gerade den Rest (n MOD B) codiert, während die Ziffern davor die Stellenwertdarstellung des Quotienten (n DIV B) darstellen, falls dieser Quotient nicht 0 ist.
PROCEDURE WriteHex(n, k: CARDINAL);
VAR i: CARDINAL;
BEGIN IF n < 16 (* nur eine Stelle; vorne auffuellen *)
      THEN FOR i := 1 TO k-1 DO Write(' ')
           END
      ELSE WriteHex(n DIV 16, k-1) (* vordere Stellen *)
      END;
      WriteHexDigit(n MOD 16)
END WriteHex;
Um führende Zwischenräume auszugeben, haben wir hier eine Zählschleife verwendet. Die Prozedur sollte, obgleich sie rekursiv ist, bei näherer Betrachtung selbsterklärend sein.


zurück | Inhalt | Index | Vorlesung

Klaus Lagally, 22. Februar 2000, 19:36