File: BIORYT.PS of Tape: Various/Decus/decus-3
(Source file text) 

PROGRAM BIORHYTHMUS(INPUT,OUTPUT);

   CONST AMP=30;
         ZWEIPI=6.283185308;

   TYPE  DATUM=RECORD  TAG,MONAT,JAHR: INTEGER  END;

   VAR   GEB,VON,BIS,HEUTE: DATUM;
         ALTER,LIMIT: INTEGER;
         ZEILE: ARRAY[-AMP..+AMP] OF CHAR;


   PROCEDURE LIESDATUM(VAR X: DATUM);
            (* EINGABEFORMAT:  JJ-MM-TT *)
      VAR C: CHAR;
      BEGIN
         READ(X.JAHR,C,X.MONAT,C,X.TAG)
      END (* LIESDATUM *);


   PROCEDURE DRUCKEDATUM(X: DATUM);

      PROCEDURE WRITE00(N: INTEGER);
         BEGIN WRITE(N DIV 10 :1, N MOD 10 :1) END;

      BEGIN
         WRITE00(X.JAHR); WRITE("-");
         WRITE00(X.MONAT);WRITE("-");
         WRITE00(X.TAG)
      END (* DRUCKEDATUM *);


   FUNCTION TAGESANZAHL(X: DATUM): INTEGER;
      VAR F,G: INTEGER;
      BEGIN
         IF X.MONAT>2
            THEN BEGIN G:=1900 + X.JAHR;     F:=X.MONAT + 1  END
            ELSE BEGIN G:=1900 + X.JAHR - 1; F:=X.MONAT + 13 END;
         TAGESANZAHL:=TRUNC(365.25*G) + TRUNC(30.6*F) + X.TAG - 621049
      END (* TAGESANZAHL *);


   PROCEDURE NAECHSTERTAG(VAR X: DATUM);

      FUNCTION MONATSTAGE(X: DATUM): INTEGER;
         BEGIN
             CASE X.MONAT OF
                1,3,5,7,8,10,12: MONATSTAGE:=31;
                4,6,9,11:        MONATSTAGE:=30;
                2:      IF X.JAHR MOD 4 = 0 THEN MONATSTAGE:=29
                                            ELSE MONATSTAGE:=28
             END
         END (* MONATSTAGE *);

      BEGIN
         X.TAG := X.TAG + 1;
         IF X.TAG>MONATSTAGE(X)
            THEN BEGIN  X.MONAT := X.MONAT + 1;
                        X.TAG := 1;
                        IF X.MONAT>12
                           THEN BEGIN X.JAHR := X.JAHR +1;
                                      X.MONAT := 1
                                END
                 END
      END (* NAECHSTERTAG *);


   PROCEDURE LOESCHEZEILE;
      VAR I: INTEGER;
      BEGIN
         FOR I := -AMP TO AMP DO ZEILE[I] := " "
      END (* LOESCHEZEILE *);


   PROCEDURE DRUCKEZEILE;
      VAR I: INTEGER;
      BEGIN
         WRITE("-" :4);
         FOR I := -AMP TO AMP DO WRITE( ZEILE[I] );
         WRITELN("-")
      END (* DRUCKEZEILE *);


   PROCEDURE KOPFLEISTE;
      VAR I: INTEGER;
      BEGIN
        WRITELN; WRITELN;
        WRITELN("JJ-MM-TT   -1", "0":AMP, "1":AMP);
        WRITE("^":13);
        FOR I:=1 TO AMP-1 DO WRITE(".");
        WRITE("^");
        FOR I:=1 TO AMP-1 DO WRITE(".");
        WRITELN("^")
      END (* KOPFLEISTE *);




BEGIN  (* H A U P T P R O G R A M M *)

   WRITE("GEBURTSDATUM"); LIESDATUM(GEB);
   WRITE("BIORHYTHMEN VON"); LIESDATUM(VON);
   WRITE("            BIS"); LIESDATUM(BIS);
   HEUTE := VON;
   ALTER := TAGESANZAHL(HEUTE) - TAGESANZAHL(GEB);
   LIMIT := TAGESANZAHL( BIS ) - TAGESANZAHL(GEB);
   KOPFLEISTE;
   REPEAT
      LOESCHEZEILE;
      ZEILE[ ROUND(AMP*SIN(ALTER*ZWEIPI/23)) ] := "P";
      ZEILE[ ROUND(AMP*SIN(ALTER*ZWEIPI/28)) ] := "S";
      ZEILE[ ROUND(AMP*SIN(ALTER*ZWEIPI/33)) ] := "I";
      DRUCKEDATUM(HEUTE);
      DRUCKEZEILE;
      NAECHSTERTAG(HEUTE);
      ALTER := ALTER + 1
   UNTIL ALTER>LIMIT
END.