home *** CD-ROM | disk | FTP | other *** search
- (* ---------------------------------------------------------------- *)
- (* ASTRODAT.PAS *)
- (* mit der Astro-Bibliothek die Zeit im Griff: *)
- (* ---------------------------------------------------------------- *)
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Winkel (Stunden, Minuten, Sekunden) nach dezimal: *)
-
- FUNCTION WinkelToDez (Winkel: Astro_Winkel): REAL;
-
- BEGIN
- WITH Winkel DO
- WinkelToDez := Grad + Min/60.0 + Sek/3600.0
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Winkel < 0.0 oder > 360.0 korrigieren: *)
-
- FUNCTION NormWinkel (Winkel: REAL): REAL;
-
- VAR negativ: BOOLEAN;
-
- BEGIN
- negativ := (Winkel < 0.0);
- Winkel := Abs(Winkel);
- Winkel := Winkel - Trunc(Winkel / 360.0) * 360.0;
- IF negativ THEN Winkel := 360.0 - Winkel;
- NormWinkel := Winkel;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Winkel (Dezimal) nach Stunden, Minuten, Sekunden: *)
- (* Die Turbo-Funktion 'Frac(x)' gibt den Bruchteil von x aus: *)
- (* Frac(x) = x - Int(x); Int(x) liefert ganzzahligen Anteil von x. *)
-
- PROCEDURE DezToWinkel (DezWinkel: REAL; VAR Winkel: Astro_Winkel);
-
- BEGIN
- DezWinkel := NormWinkel(DezWinkel);
- Winkel.Grad := Trunc(DezWinkel);
- Winkel.Min := Trunc(Frac(DezWinkel)*60.0);
- Winkel.Sek := Trunc(Frac(Frac(DezWinkel)*60.0)*60.0);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Zeit (Stunden, Minuten, Sekunden) nach dezimal: *)
-
- FUNCTION ZeitToDez (Zeit: Astro_Zeit): REAL;
-
- BEGIN
- WITH Zeit DO
- ZeitToDez := Stunden + Minuten/60.0 + Sekunden/3600.0
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Zeit (Dezimal) nach Stunden, Minuten, Sekunden: *)
-
- PROCEDURE DezToZeit (DezZeit: REAL; VAR Zeit: Astro_Zeit);
-
- BEGIN
- Zeit.Stunden := Trunc(DezZeit);
- Zeit.Minuten := Trunc(Frac(DezZeit)*60.0);
- Zeit.Sekunden:= Trunc(Frac(Frac(DezZeit)*60.0)*60.0);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Sternzeit nach Sonnenzeit: *)
-
- FUNCTION Sonnenzeit (Zeit: REAL): REAL;
-
- BEGIN
- Sonnenzeit := 366.2422 / 365.2422 * Zeit;
- END ;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Sonnenzeit nach Sternzeit: *)
-
- FUNCTION Sternzeit (Zeit: REAL): REAL;
-
- BEGIN
- Sternzeit := 365.2422 / 366.2422 * Zeit;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Winkel (Dezimal) nach Zeit (Dezimal): *)
-
- FUNCTION WinkelToZeit (DezWinkel: REAL): REAL;
-
- BEGIN
- WinkelToZeit := DezWinkel * 24.0 / 360.0;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Zeit (Dezimal) nach Winkel (Dezimal): *)
-
- FUNCTION ZeitToWinkel (DezZeit: REAL): REAL;
-
- BEGIN
- ZeitToWinkel := 360.0 / 24.0 * DezZeit;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Winkel (Dezimal) nach Bogenmass: *)
-
- FUNCTION Bogenmass (Phi: REAL): REAL;
-
- BEGIN
- Bogenmass := Pi / 180.0 * Phi;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Bogenmass nach Winkel (Dezimal): *)
-
- FUNCTION Winkelmass (Bogen: REAL): REAL;
-
- BEGIN
- Winkelmass := Bogen * 180.0 / Pi;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Gregorianisches Datum nach Julianisches Datum: *)
-
- FUNCTION Jul_Datum (Greg_Dat: Astro_Datum): REAL;
-
- VAR JD, J1, J2: REAL;
-
- BEGIN
- J1 := Greg_Dat.Jahr - Jul_Ref_Jahr;
- JD := Jul_Referenz + J1 * 365.0;
- JD := JD + Int(J1 / 4.0) - Int(J1 / 100.0) + Int(J1 / 400.0);
- IF Greg_Dat.Monat >= 3 THEN
- BEGIN
- JD := JD + Int(30.6 * Greg_Dat.Monat - 32.3);
- J2 := Greg_Dat.Jahr;
- IF Trunc(J2) MOD 100 = 0 THEN J2 := Int(J2 / 100.0);
- IF Trunc(J2) MOD 4 = 0 THEN JD := JD + 1.0;
- END
- ELSE
- JD := JD + 31.0 * Greg_Dat.Monat - 31.0;
- JD := JD + Greg_Dat.Tag;
- Jul_Datum := JD;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Umrechnung Julianisches Datum nach Gregorianisches Datum: *)
-
- PROCEDURE Greg_Datum (Jul_Dat: REAL; VAR Greg_Dat: Astro_Datum);
-
- VAR Jahr, Diff, Monat, Tage, Laenge, Hilfe, J: REAL;
-
- BEGIN
- Jahr := Jul_Ref_Jahr;
- Diff := Jul_Dat - Jul_Referenz;
- Tage := Int(Diff);
- IF Tage > 146097.0 THEN
- BEGIN
- Hilfe := Int(Tage / 146097.0);
- Tage := Tage - 146097.0 * Hilfe;
- Jahr := Jahr + 400.0 * Hilfe;
- END;
- IF Tage > 36524.0 THEN
- BEGIN
- Hilfe := Int(Tage / 36524.0);
- Tage := Tage - 36524.0 * Hilfe;
- Jahr := Jahr + 100.0 * Hilfe;
- END;
- IF Tage > 1461.0 THEN
- BEGIN
- Hilfe := Int(Tage / 1461.0);
- Tage := Tage - 1461.0 * Hilfe;
- Jahr := Jahr + 4.0 * Hilfe;
- END;
- IF Tage > 365.0 THEN
- BEGIN
- Hilfe := Int(Tage / 365.0);
- Tage := Tage - 365.0 * Hilfe;
- Jahr := Jahr + Hilfe;
- END;
- IF Tage <> 0.0 THEN
- BEGIN
- Hilfe := 0.0; Monat := 0.0; Laenge := 0.0;
- REPEAT
- Tage := Tage - Laenge;
- Monat := Monat + 1.0;
- Hilfe := 1.0 - Hilfe;
- IF Monat = 8.0 THEN Hilfe := 1.0;
- Laenge := 30.0 + Hilfe;
- IF Monat = 2.0 THEN
- BEGIN
- Laenge := Laenge - 2.0;
- J := Jahr;
- IF Trunc(J) MOD 100 = 0 THEN J := J / 100.0;
- IF Trunc(J) MOD 4 = 0 THEN Laenge := Laenge + 1.0;
- END;
- UNTIL Tage <= Laenge;
- Greg_Dat.Tag := Trunc(Tage);
- Greg_Dat.Jahr := Trunc(Jahr);
- Greg_Dat.Monat := Trunc(Monat);
- END
- ELSE
- BEGIN
- Greg_Dat.Jahr := Trunc(Jahr) - 1;
- Greg_Dat.Monat := 12;
- Greg_Dat.Tag := 31;
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Berechnung der Tagesdifferenz: *)
-
- FUNCTION Tagesdifferenz (Dat_1, Dat_2: Astro_Datum): INTEGER;
-
- VAR f1, f2: REAL;
-
- BEGIN
- f1 := Jul_Datum(Dat_1);
- f2 := Jul_Datum(Dat_2);
- Tagesdifferenz := Trunc(abs(f2 - f1));
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Bestimmung des Wochentages: *)
-
- FUNCTION Wochentag (Datum: Astro_Datum): Astro_String;
-
- VAR Wert: Astro_Tage;
- F : REAL;
-
- BEGIN
- F := Jul_Datum(Datum) ;
- Wert := Trunc (F-7 * Int(F/7));
- CASE Wert OF
- 0 : Wochentag := 'Dienstag';
- 1 : Wochentag := 'Mittwoch';
- 2 : Wochentag := 'Donnerstag';
- 3 : Wochentag := 'Freitag';
- 4 : Wochentag := 'Samstag';
- 5 : Wochentag := 'Sonntag';
- 6 : Wochentag := 'Montag';
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Einlesen der Ortsdatei: *)
-
- PROCEDURE Lese_Astro_File;
-
- VAR Hilfe: STRING [30];
- Error: INTEGER;
- Ort : Astro_OrtPtr;
-
- BEGIN
- Astro_Orte := NIL;
- (* der Dateivariablen 'Astro_File' die physik. Datei 'ASTROORT.DAT'
- zuweisen: *)
- Assign(Astro_File, 'ASTROORT.DAT');
- {$I-} (* I/O-Fehlerbehandlung durch Laufzeitsystem abschalten *)
- ReSet(Astro_File); (* Datei zu oeffnen versuchen *)
- {$I+} (* I/O-Fehlerbehandlung wieder aktivieren *)
- IF IOResult = 0 THEN (* Operation gelungen, Orte in eine dyna- *)
- WHILE NOT Eof(Astro_File) DO (* mische Liste einlesen... *)
- BEGIN
- New(Ort);
- WITH Ort^ DO
- BEGIN
- ReadLn(Astro_File, Ortsname);
- ReadLn(Astro_File, Laengengrad);
- ReadLn(Astro_File, Breitengrad);
- END;
- Ort^.naechster := Astro_Orte;
- Astro_Orte := Ort;
- END
- ELSE
- BEGIN
- WriteLn; WriteLn;
- WriteLn('Datei ASTROORT.DAT nicht gefunden !');
- WriteLn; WriteLn('Bitte <CR> eingeben !');
- ReadLn;
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Durchsuchen der Ortsliste: *)
-
- PROCEDURE Suche_Ort (Name: Astro_String;
- VAR Ort: Astro_Ort; VAR Gefunden: BOOLEAN);
-
- VAR OrtPtr: Astro_OrtPtr;
-
- BEGIN
- OrtPtr := Astro_Orte;
- Gefunden := FALSE;
- WHILE (OrtPtr <> NIL) AND NOT Gefunden DO
- BEGIN
- Gefunden := (Name = OrtPtr^.Ortsname);
- IF NOT Gefunden THEN OrtPtr := OrtPtr^.naechster;
- END;
- IF Gefunden THEN Ort := OrtPtr^;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Bestimmung der aktuellen Ortszeit: *)
-
- FUNCTION Ortszeit (Ort1, Ort2: Astro_Ort; Referenzzeit: REAL): REAL;
-
- VAR Delta, Zeitdifferenz: REAL;
-
- BEGIN
- Delta := NormWinkel(Ort2.Laengengrad - Ort1.Laengengrad);
- Zeitdifferenz := ZeitToWinkel(Delta * 4.0 / 60.0);
- Referenzzeit := ZeitToWinkel(Referenzzeit);
- IF Ort1.Laengengrad <> Ort2.Laengengrad THEN
- Referenzzeit := NormWinkel(Referenzzeit + Zeitdifferenz);
- Ortszeit := WinkelToZeit(Referenzzeit);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Ende von ASTRODAT.PAS *)
-