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.