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.
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.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;
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.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;