home *** CD-ROM | disk | FTP | other *** search
- MODULE PiRandom;
- (* schiesse in ein Quadrat, und bestimme damit auch einen Nèherungswert
- fƒr Pi. 22.4.85 P. Fink *)
-
- FROM Terminal IMPORT Write, WriteString, WriteLn, GotoXY,
- BusyRead, ClearTerminal, Read;
- FROM RealTerminal IMPORT WriteR, RFixed;
-
- FROM MathLib1 IMPORT random;
-
- FROM QuickDraw IMPORT TextFont, TextSize;
- FROM QuickDraw IMPORT MoveTo, LineTo, ShowPen, HidePen, PenSize;
-
-
- (* Bildschirm Layout *)
-
- CONST
- vTitel = 20;
- hTitel = 30;
- vPi = 300;
- htot = 30; htot1 = 100;
- himk = 175; himk1 = 235;
- hpi = 310; hpi1 = 370;
- vPrompt = 310;
- hPrompt = 0;
-
- hQuadrat = 120; vQuadrat = 260;
- lQuadrat = 200; (* GrÜsse 200 * 200 Pixel *)
- lExtra = 20;
-
- VAR
- Total, ImKreis, Pi: REAL;
- TotalMod : CARDINAL; (* =Total MOD 10, fƒr Anzeigefrequenz *)
- ch : CHAR;
- PromptFlag: BOOLEAN;
-
-
- PROCEDURE Strecke (hx, vx, hl, vl: INTEGER);
- BEGIN
- MoveTo (hx, vx); LineTo (hx+hl, vx+vl);
- END Strecke;
-
- PROCEDURE Punkt (h,v: INTEGER);
- BEGIN
- MoveTo (h,v); LineTo (h,v)
- END Punkt;
-
-
- PROCEDURE Rahmen;
- BEGIN
- ClearTerminal;
- PenSize (2,2);
- Strecke (hQuadrat, vQuadrat, lQuadrat+lExtra, 0);
- Strecke (hQuadrat, vQuadrat, 0, -lQuadrat-lExtra);
- Strecke (hQuadrat+lQuadrat, vQuadrat,0, -lQuadrat);
- Strecke (hQuadrat, vQuadrat-lQuadrat, lQuadrat, 0);
- PenSize (1,1);
- (* Kreis zeichnen: dummy *)
- GotoXY (hTitel, vTitel);
- WriteString ('Zufallstreffer in einem Quadrat P. Fink, 22.4.85');
- GotoXY(htot,vPi); WriteString ('Schuesse:');
- GotoXY(himk,vPi); WriteString ('im Kreis:');
- GotoXY(hpi, vPi); WriteString ('Pi .....:');
- END Rahmen;
-
- PROCEDURE Schuss;
- VAR hr,vr: REAL;
- h,v: INTEGER;
- BEGIN
- hr := random(); vr := random();
- h := INTEGER (TRUNC (hr*FLOAT(lQuadrat)+0.5) );
- v := INTEGER (TRUNC (vr*FLOAT(lQuadrat)+0.5) );
- Total:=Total+1.0;
- TotalMod := (TotalMod+1) MOD 10;
- IF (hr*hr+vr*vr)<=1.0 THEN (* im Kreis *)
- ImKreis := ImKreis+1.0;
- PenSize (2,2);
- END;
- Punkt (hQuadrat+h,vQuadrat-v);
- PenSize (1,1)
- END Schuss;
-
- PROCEDURE Anzeigen;
- BEGIN
- IF Total=0.0 THEN Pi:=0.0 ELSE Pi:=4.0*(ImKreis/Total) END;
- GotoXY(htot1, vPi); WriteR (Total, 6,0,RFixed);
- GotoXY(himk1, vPi); WriteR (ImKreis,6,0,RFixed);
- GotoXY(hpi1, vPi); WriteR (Pi, 8,5,RFixed)
- END Anzeigen;
-
- PROCEDURE ClearPromptLine;
- BEGIN
- GotoXY (hPrompt, vPrompt); WriteLn;
- WriteString (' ');
- END ClearPromptLine;
-
- PROCEDURE Prompt (VAR s: ARRAY OF CHAR);
- BEGIN
- ClearPromptLine;
- WriteString (s);
- Read (ch); Write(ch);
- ch := CAP (ch)
- END Prompt;
-
- PROCEDURE Steuerung;
- BEGIN
- LOOP
- Total := 0.0; TotalMod := 0; ImKreis := 0.0;
- ch := ' ';
- Rahmen;
- Anzeigen;
- Prompt('Druecke eine Taste, um den Prozess zu beginnen (Q=aufhoeren):');
- WHILE ch<>'Q' DO (* Q von oben, oder von unten *)
- IF PromptFlag THEN
- ClearPromptLine;
- WriteString ('Druecke eine Taste, um eine Pause zu machen');
- PromptFlag := FALSE
- END;
- Schuss;
- IF TotalMod = 0 THEN Anzeigen END;
- BusyRead (ch);
- IF ch<>0C THEN
- Anzeigen;
- Prompt ('Druecke eine Taste, um weiterzufahren (Q=abbrechen):');
- PromptFlag := TRUE;
- END
- END (* while *);
- Prompt ('Nochmals? (Q=nein):');
- IF ch='Q' THEN EXIT END;
- END (*loop*);
-
- END Steuerung;
-
-
- BEGIN
- WriteString ('Schriftart? '); WriteLn;
- WriteString (' k = normal '); WriteLn; (* Monaco 9 *)
- WriteString (' g = groesser '); WriteLn; (* Chicago 12 *)
- WriteString ('Waehle bitte: ');
- Read (ch); IF (ch='g') THEN TextFont(0); TextSize(12) END;
- Steuerung
- END PiRandom.
-