home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
EFFO
/
forum5.lzh
/
SPRACHEN
/
FORTRAN
/
BIORY
/
biory.f
< prev
Wrap
Text File
|
1988-04-04
|
10KB
|
310 lines
OPTIONS CPU=68000
PROGRAM BIORY
C
C++----------------------------------------------------------------------------
C
C+1 BESCHREIBUNG :
C BIORY berechnet den Biorhythmus fuer ein oder mehrere Jahre sowie
C fuer eine oder mehrere Personen.
C Der Benutzer wird nach dem Programmaufruf nach dem Namen, Geburts-
C Datum sowie der gewuenschten Zeitspanne gefragt. Die Eingabeformate
C sind selbsterklaerend.
C Die Ergebnisse werden in ein File (Biory.Lis) geschrieben.
C-1
C+2 PARAMETER :
C-2
C+3 GERUFENE SUBROUTINEN/FUNCTIONS :
C DATCON, DATCO1
C-3
C+4 CALL-BEISPIEL :
C-4
C+5 BEMERKUNGEN :
C Da die verwendete RTF-Version noch etwas muehsam in Bezug auf File-IO
C ist, muss mit der "OPEN/CLOSE/CALL shell('del ...')"-Kombination erst
C einmal ein eventuell vorhandenes Listing-File weggeputzt werden.
C (--> Hoffen auf baldige Besserung !)
C-5
C+6 COPYRIGHT :
C Nur fuer nichtkommerzielle Nutzung freigegeben !
C-6
C+7 HARDWARE :
C GEPARD 68000, 1 Sony-Laufwerk 3.5", 1.5MB RAM, 30 MB Harddisk,
C 80-Zeichen-Karte, Seriell-Parallel-Karte MTH3
C-7
C+8 BETRIEBSSYSTEM/VERSION, COMPILER/VERSION :
C Professional OS-9 V2.1, RTF-Fortran V2.14
C-8
C+9 AUTOR(EN), ADRESSE, KURZZEICHEN :
C EGA : Andreas Eggenberger, Butzenstrasse 30, Tel-P: 01/761 42 27
C CH-8910 Affoltern a/A Tel-G: 01/249 24 96
C-9
C+A DATUM, AENDERUNGEN, VERSION :
C 02.04.88/EGA : V1.0 Urversion
C-A
C------------------------------------------------------------------------------
C
IMPLICIT NONE
C
SAVE MONBEZ, PERIODE, ART, MAXTAG, PERZAHL, FILENAME
C
INTEGER LEN
INTEGER ETAG, EMON, EJAHR, EVON, EBIS, ISTART, IJETZT
INTEGER I, J, L, IP, IM, IJ, IFLAG, IX, IDIFF, IANZ
INTEGER MAXTAG(12)
INTEGER PERZAHL(3)
CHARACTER*28 ENAME
CHARACTER*31 TAGE
CHARACTER*9 MONBEZ(12)
CHARACTER*7 ART(3)
CHARACTER*66 PERIODE(3)
CHARACTER*30 FILENAME
C
DATA MAXTAG / 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /
C
DATA MONBEZ / 'Januar', 'Februar', 'Maerz', 'April',
1 'Mai', 'Juni', 'Juli', 'August',
1 'September', 'Oktober', 'November', 'Dezember' /
C
DATA PERZAHL / 23, 28, 33 /
C
DATA ART / 'Koerper', 'Seele', 'Geist' /
C
DATA PERIODE /
1 'K**********K K**********K K**********K ',
1 'K*************K K*************K K*********',
1 'K***************K K***************K' /
C
DATA FILENAME / 'Biory.Lis' /
C
C---------------------------------code-----------------------------------------
C
L = LEN(FILENAME(:-1))
OPEN (10, FILE=FILENAME(:L)) ! File muss zum loeschen auf jeden
CLOSE (10) ! Fall existieren, da sonst
CALL shell ('del '//FILENAME(:L), I) ! Fehlermeldungen entstehen !
C
OPEN (10, FILE=FILENAME(:L))
type *, ' Ausgabe im Listingfile "' // FILENAME(:L) // '"'
C
DO FOREVER
WRITE (*,8091)
READ (*,9001,END=999) ENAME
IF (ENAME .EQ. ' ') THEN
CLOSE (10)
STOP 'BIO / NORMAL END'
END IF
WRITE (*,8092)
READ (*,9002) ETAG, EMON, EJAHR
EJAHR = EJAHR + 1900
WRITE (*,8093)
READ (*,9003) EVON, EBIS
EVON = EVON + 1900
EBIS = EBIS + 1900
IF (EBIS .LT. EVON) EBIS = EVON
CALL DATCON(ETAG,EMON,EJAHR,ISTART,IFLAG)
DO IJ = EVON, EBIS
WRITE (10,8001) ENAME, ETAG, EMON, EJAHR-1900
MAXTAG(2) = 28
IF (MOD(IJ,4) .EQ. 0) MAXTAG(2) = 29
IF (MOD(IJ,100) .EQ. 0) MAXTAG(2) = 28
IF (MOD(IJ,400) .EQ. 0) MAXTAG(2) = 29
CALL DATCON(1,1,IJ,IJETZT,IFLAG)
IDIFF = IJETZT - ISTART
IANZ = 0
DO IM = 1,12
WRITE (10,8002) MONBEZ(IM), IJ
DO IP = 1,3
IX = MOD(IDIFF+IANZ,PERZAHL(IP)) + 1
IF (IX .LT. 1) IX = IX + PERZAHL(IP)
TAGE = PERIODE(IP)(IX:IX+MAXTAG(IM)-1)
WRITE (10,8003) TAGE, ART(IP)
END DO
IANZ = IANZ + MAXTAG(IM)
END DO
WRITE (10,8004)
WRITE (10,*) CHAR(12) ! FormFeed
END DO
END DO
999 CONTINUE
C
8001 FORMAT (' ', T10, 'Biorhythmogramm fuer ', A28,
1 T60, '(', I2.2, '.', I2.2, '.', I2.2, ')', /,
1 ' ', T10, 60('='))
C
8002 FORMAT (/, ' ', T10, A9, T20, I4, ' :',
1 T30, '1...5...10...15...20...25...30.')
C
8003 FORMAT (' ', T30, A31, T63, A7)
C
8004 FORMAT (/, ' ', T10, 'Erklaerungen :',
1 T30, '- K = kritisch (+- 1 Tag)', /,
1 ' ', T30, '- *** = Hochphase', /,
1 ' ', T30, '- = Tiefphase')
C
8091 FORMAT (' Name Vorname (RETURN=Ende) : $')
8092 FORMAT (' Geburtsdatum (TTMMJJ) : $')
8093 FORMAT (' Gueltigkeitsbereich (JJ-JJ) : $')
C
9001 FORMAT (A28)
9002 FORMAT (I2,I2,I2)
9003 FORMAT (I2,1X,I2)
C
END
C
C==============================================================================
C
SUBROUTINE DATCON (TT, MM, JJ, T, E0)
C
C++----------------------------------------------------------------------------
C
C+1 BESCHREIBUNG :
C DATCON berechnet die Anzahl Tage zwischen dem 1.1.1801 und TT.MM.JJ
C-1
C+2 PARAMETER :
C TT, MM, JJ : Tag, Monat, Jahr
C T : Ergebnis : Anzahl Tage
C E0 : Error-Flag : 1 = Datum nicht moeglich, 0 = Okay
C-2
C+3 GERUFENE SUBROUTINEN/FUNCTIONS :
C-3
C+4 CALL-BEISPIEL :
C CALL DATCON (11, 1, 1988, IANZ, IERR)
C-4
C+5 BEMERKUNGEN :
C-5
C+6 COPYRIGHT :
C Nur fuer nichtkommerzielle Nutzung freigegeben !
C-6
C+7 HARDWARE :
C GEPARD 68000, 1 Sony-Laufwerk 3.5", 1.5MB RAM, 30 MB Harddisk,
C 80-Zeichen-Karte, Seriell-Parallel-Karte MTH3
C-7
C+8 BETRIEBSSYSTEM/VERSION, COMPILER/VERSION :
C Professional OS-9 V2.1, RTF-Fortran V2.14
C-8
C+9 AUTOR(EN), ADRESSE, KURZZEICHEN :
C EGA : Andreas Eggenberger, Butzenstrasse 30, Tel-P: 01/761 42 27
C CH-8910 Affoltern a/A Tel-G: 01/249 24 96
C-9
C+A DATUM, AENDERUNGEN, VERSION :
C 02.04.88/EGA : V1.0 Urversion
C-A
C------------------------------------------------------------------------------
C
IMPLICIT NONE
C
INTEGER IT, TT, MM, JJ, T, TTAB(12), E0, X0, X1, X2, X3, X4, X5, I
SAVE TTAB
DATA TTAB / 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /
C
E0 = 0 ! Return-Code auf Null (kein Fehler)
C
IF (JJ.LT.1801 .OR. JJ.GT.2099) THEN
WRITE (*,*) 'Fehler : Jahreszahl ungueltig !'
E0 = 1 ! Fehler !
END IF
IF (MM.LT.1 .OR. MM.GT.12) THEN
WRITE (*,*) 'Fehler : Monat ungueltig !'
E0 = 1 ! Fehler !
END IF
TTAB(2) = 28
IF (MOD(JJ,4) .EQ. 0) TTAB(2) = 29 ! Schaltjahr
IF (MOD(JJ,100) .EQ. 0) TTAB(2) = 28 ! bzw. doch kein Schaltjahr
IF (MOD(JJ,400) .EQ. 0) TTAB(2) = 29 ! trotzdem ein Schaltjahr
IF (TT.LT.1 .OR. TT.GT.TTAB(MM)) THEN
WRITE (*,*) 'Fehler : Tag ungueltig !'
E0 = 1 ! Fehler !
END IF
IF (E0 .NE. 0) RETURN ! ***** ERROR EXIT ***** !
C
C*** eigentliche Rechnung :
C
X0 = JJ - 1801
X1 = INT(X0/4) * 1461
X2 = MOD(X0,4) * 365
T = X1 + X2 - INT(X0/100) + INT((X0+200)/400)
C
I = 1
C
DO WHILE (I .LT. MM)
T = T + TTAB(I)
I = I + 1
END DO
C
T = T + TT
C
RETURN ! ... und zurueck
END
C
C==============================================================================
C
SUBROUTINE DATCO1 (T, TT, MM, JJ)
C
C++----------------------------------------------------------------------------
C
C+1 BESCHREIBUNG :
C DATCO1 ist die komplementaere Funktion zu DATCON : Es wird das Datum
C (TT, MM, JJ) berechnet, das vom 1.1.1801 "T" Tage entfernt ist.
C-1
C+2 PARAMETER :
C T : Anzahl Tage
C TT, MM, JJ : Ergebnis : Tag, Monat, Jahr
C-2
C+3 GERUFENE SUBROUTINEN/FUNCTIONS :
C-3
C+4 CALL-BEISPIEL :
C CALL DATCO1 (IANZ, TT, MM, JJ)
C-4
C+5 BEMERKUNGEN :
C-5
C+6 COPYRIGHT :
C Nur fuer nichtkommerzielle Nutzung freigegeben !
C-6
C+7 HARDWARE :
C GEPARD 68000, 1 Sony-Laufwerk 3.5", 1.5MB RAM, 30 MB Harddisk,
C 80-Zeichen-Karte, Seriell-Parallel-Karte MTH3
C-7
C+8 BETRIEBSSYSTEM/VERSION, COMPILER/VERSION :
C Professional OS-9 V2.1, RTF-Fortran V2.14
C-8
C+9 AUTOR(EN), ADRESSE, KURZZEICHEN :
C EGA : Andreas Eggenberger, Butzenstrasse 30, Tel-P: 01/761 42 27
C CH-8910 Affoltern a/A Tel-G: 01/249 24 96
C-9
C+A DATUM, AENDERUNGEN, VERSION :
C 02.04.88/EGA : V1.0 Urversion
C-A
C------------------------------------------------------------------------------
C
IMPLICIT NONE
C
INTEGER IT, TT, MM, JJ, T, TTAB(12), E0, X0, X1, X2, X3, X4, X5, I
SAVE TTAB
DATA TTAB / 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /
C
IT = T
IF (IT .GT. 36524) IT = IT + 1
X1 = INT((IT-1)/1461) ! Anzahl 4-Jahres Gruppen
X2 = MOD(IT-1,1461) + 1 ! verbleibende Tage
X3 = 0
C
DO WHILE (X3 .LT. 2 .AND. X2 .GT. 365)
X2 = X2 - 365
X3 = X3 + 1
END DO
C
JJ = X1*4 + X3 + 1801
TTAB(2) = 28
IF (MOD(JJ,4) .EQ. 0) TTAB(2) = 29 ! Schaltjahr
IF (MOD(JJ,100) .EQ. 0) TTAB(2) = 28 ! bzw. doch kein Schaltjahr
IF (MOD(JJ,400) .EQ. 0) TTAB(2) = 29 ! trotzdem ein Schaltjahr
DO MM = 1, 12
IF (X2 .LE. TTAB(MM)) GOTO 200
X2 = X2 - TTAB(MM)
END DO
200 CONTINUE
TT = X2
RETURN ! ... und zurueck
END