83 lines
2.1 KiB
Plaintext
83 lines
2.1 KiB
Plaintext
MODULE BoxTheCompass;
|
|
FROM FormatString IMPORT FormatString;
|
|
FROM RealStr IMPORT RealToStr;
|
|
FROM Terminal IMPORT WriteString,WriteLn,Write,ReadChar;
|
|
|
|
PROCEDURE expand(cp : ARRAY OF CHAR);
|
|
VAR i : INTEGER = 0;
|
|
BEGIN
|
|
WHILE cp[i] # 0C DO
|
|
IF i=0 THEN
|
|
CASE cp[i] OF
|
|
'N': WriteString("North") |
|
|
'E': WriteString("East") |
|
|
'S': WriteString("South") |
|
|
'W': WriteString("West") |
|
|
'b': WriteString(" by ")
|
|
ELSE
|
|
WriteString("-");
|
|
END;
|
|
ELSE
|
|
CASE cp[i] OF
|
|
'N': WriteString("north") |
|
|
'E': WriteString("east") |
|
|
'S': WriteString("south") |
|
|
'W': WriteString("west") |
|
|
'b': WriteString(" by ")
|
|
ELSE
|
|
WriteString("-");
|
|
END;
|
|
END;
|
|
INC(i)
|
|
END;
|
|
END expand;
|
|
|
|
PROCEDURE FormatReal(r : REAL);
|
|
VAR
|
|
buf : ARRAY[0..63] OF CHAR;
|
|
u,v : INTEGER;
|
|
w : REAL;
|
|
BEGIN
|
|
u := TRUNC(r);
|
|
w := r - FLOAT(u);
|
|
v := TRUNC(100.0 * w);
|
|
|
|
FormatString("%6i.%'02i", buf, u, v);
|
|
WriteString(buf);
|
|
END FormatReal;
|
|
|
|
VAR
|
|
cp : ARRAY[0..31] OF ARRAY[0..4] OF CHAR = {
|
|
"N", "NbE", "N-NE", "NEbN", "NE", "NEbE", "E-NE", "EbN",
|
|
"E", "EbS", "E-SE", "SEbE", "SE", "SEbS", "S-SE", "SbE",
|
|
"S", "SbW", "S-SW", "SWbS", "SW", "SWbW", "W-SW", "WbS",
|
|
"W", "WbN", "W-NW", "NWbW", "NW", "NWbN", "N-NW", "NbW"
|
|
};
|
|
buf : ARRAY[0..63] OF CHAR;
|
|
i,index : INTEGER;
|
|
heading : REAL;
|
|
BEGIN
|
|
WriteString("Index Degrees Compass point");
|
|
WriteLn;
|
|
WriteString("----- ------- -------------");
|
|
WriteLn;
|
|
FOR i:=0 TO 32 DO
|
|
index := i MOD 32;
|
|
heading := FLOAT(i) * 11.25;
|
|
CASE i MOD 3 OF
|
|
1: heading := heading + 5.62; |
|
|
2: heading := heading - 5.62;
|
|
ELSE
|
|
(* empty *)
|
|
END;
|
|
FormatString("%2i ", buf, index+1);
|
|
WriteString(buf);
|
|
FormatReal(heading);
|
|
WriteString(" ");
|
|
expand(cp[index]);
|
|
WriteLn
|
|
END;
|
|
|
|
ReadChar
|
|
END BoxTheCompass.
|