MODULE printerplot; FROM InOut IMPORT Write, WriteLn; FROM Terminal IMPORT WriteString; FROM MathLib0 IMPORT exp, cos; CONST xscale = 32; yscale = 50; yshift = 65; twopi = 6.2831833071796; TYPE Double = RECORD CASE BOOLEAN OF TRUE: r:REAL| FALSE: h,l:CARDINAL END END; VAR i,n: CARDINAL; k,j: INTEGER; x,y: REAL; PROCEDURE WriteBits(x: REAL); VAR high,low: BITSET; i: CARDINAL; w: Double; BEGIN w.r := x; high := BITSET(w.h); FOR i := 0 TO 15 DO IF i IN high THEN Write('1') ELSE Write('0') END END; low := BITSET(w.l); FOR i := 0 TO 15 DO IF i IN low THEN Write('1') ELSE Write('0') END END END WriteBits; BEGIN n := 0; REPEAT x := FLOAT(n)/FLOAT(xscale); i := 0; WriteString('x = '); WriteBits(x); WriteLn; y := exp(-x)*cos(x*twopi); WriteString('y = '); WriteBits(y); WriteLn; k := TRUNC((y*FLOAT(yscale))+0.5); WriteString('k = '); WriteBits(k); WriteLn; IF k < 0 THEN FOR j := 0 TO yshift + k DO Write(' ') END; Write('*'); k := -k - 1; IF k > 0 THEN FOR j := 0 TO k DO Write(' ') END; Write('|'); END ELSE FOR j := 0 TO yshift DO Write(' ') END; IF k > 0 THEN Write('|'); DEC(k); IF k > 0 THEN FOR j := 0 TO k DO Write(' ') END END END; Write('*'); END; WriteLn; INC(n); UNTIL n > 96; END printerplot.