blob: 041fcf106b869aedb8b0a5e08dd7ac1f89c4a655 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
LET hexziffern = "123456789ABCDEF";
ROW 4 INT CONST faktoren :: ROW 4 INT : (1, 16, 256, 4096);
INT PROC dez (TEXT CONST hex):
INT VAR stellen := LENGTH hex;
IF stellen > 4
OR stellen > 3 AND (hex SUB 1) > "7"
THEN errorstop ("Zahl zu groß")
FI;
INT VAR i :: 0, stelle, ziffpos;
TEXT VAR ziffer;
FOR stelle FROM 1 UPTO stellen REP
ziffer := hex SUB (stellen - stelle + 1);
ziffpos := pos (hexziffern, ziffer);
IF ziffpos <> 0
THEN i INCR ziffpos * faktoren [stelle]
ELIF ziffer <> "0"
THEN errorstop ("Hexadezimalzahl fehlerhaft")
FI
PER;
i
END PROC dez;
{194 + 76 ; kann nicht durch `replace' zu Beginn verkleinert werden }
TEXT PROC hex (TEXT CONST t dez):
IF t dez = "" THEN LEAVE hex WITH "" FI;
INT VAR stelle, hex ziffer, dez := int (t dez);
TEXT VAR hexzahl := "";
FOR stelle FROM 4 DOWNTO 1 REP
hexziffer := dez DIV faktoren [stelle];
IF hexziffer <> 0
THEN hexzahl CAT (hexziffern SUB hexziffer);
dez DECR hexziffer * faktoren [stelle]
ELSE hexzahl CAT "0"
FI
PER;
hexzahl
END PROC hex;
putline (""1""4"Dezimalzahlen schlicht, Hexadezimalzahlen mit schließendem ""h"" eingeben");
line;
TEXT VAR z;
REP put ("Zahl:");
get (z);
IF (z SUB LENGTH z) = "h"
THEN put (dez (subtext (z, 1, LENGTH z - 1)))
ELSE put (hex (z))
FI
UNTIL z = "" PER
|