#include #include #include #include #include "sonnenverlauf.h" #include "zeit.h" int strtod_error( const char *str, double *value ) { char *endptr; if ( *str == '\0' ) return 1; *value = strtod( str, &endptr); if ( *endptr != '\0' ) return 1; return 0; } int main( int argc, char *argv[] ) { struct tm t = { .tm_mday = 1, .tm_mon = 0, .tm_year = 0, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 }; double Zeitzone = 1.0; Sonnenverlauf_t Sonnenverlauf; double GeographischeBreite; double GeographischeLaenge; int opt; int GeographischeBreiteGelesen = 0; int GeographischeLaengeGelesen = 0; double a_min, a_max, u_min, u_max; int Stunde, Minute; int init; while ( ( opt = getopt( argc, argv, "b:l:z:" ) ) != -1 ) { switch ( opt ) { case 'b': if ( strtod_error( optarg, &GeographischeBreite ) ) { fprintf( stderr, "Geographische Breite konnte nicht gelesen werden. Parameter -b ist fehlerhaft!\n" ); return 1; } GeographischeBreiteGelesen = 1; break; case 'l': if ( strtod_error( optarg, &GeographischeLaenge ) ) { fprintf( stderr, "Geographische Laenge konnte nicht gelesen werden. Parameter -l ist fehlerhaft!\n" ); return 1; } GeographischeLaengeGelesen = 1; break; case 'z': if ( strtod_error( optarg, &Zeitzone ) ) { fprintf( stderr, "Zeitzone konnte nicht gelesen werden. Parameter -z ist fehlerhaft!\n" ); return 1; } break; default: return 1; } } if ( !GeographischeBreiteGelesen ) { fprintf( stderr, "Geographische Breite wurde nicht angegeben. Parameter -b fehlt.\n" ); return 1; } if ( !GeographischeLaengeGelesen ) { fprintf( stderr, "Geographische Laenge wurde nicht angegeben. Parameter -l fehlt.!\n" ); return 1; } for ( t.tm_mon = 0; t.tm_mon < 12; t.tm_mon++ ) { for ( t.tm_mday = 1; t.tm_mday <= Monatstage[1][t.tm_mon]; t.tm_mday++ ) { init = 1; for ( t.tm_year = 2022; t.tm_year < 2033; t.tm_year++ ) { if ( ( t.tm_mday == 29 ) && ( t.tm_mon == 1 ) && !Schaltjahr(t.tm_year) ) { continue; } else { Sonnenverlauf = BerechneSonnenverlauf( t.tm_mday, t.tm_mon + 1, t.tm_year, Zeitzone, GeographischeBreite, GeographischeLaenge ); if ( init ) { a_min = Sonnenverlauf.Aufgang; a_max = Sonnenverlauf.Aufgang; u_min = Sonnenverlauf.Untergang; u_max = Sonnenverlauf.Untergang; init = 0; } else { if ( Sonnenverlauf.Aufgang < a_min ) a_min = Sonnenverlauf.Aufgang; else if ( Sonnenverlauf.Aufgang > a_max ) a_max = Sonnenverlauf.Aufgang; if ( Sonnenverlauf.Aufgang < a_min ) a_min = Sonnenverlauf.Aufgang; else if ( Sonnenverlauf.Aufgang > a_max ) a_max = Sonnenverlauf.Aufgang; if ( Sonnenverlauf.Untergang < u_min ) u_min = Sonnenverlauf.Untergang; else if ( Sonnenverlauf.Untergang > u_max ) u_max = Sonnenverlauf.Untergang; if ( Sonnenverlauf.Untergang < u_min ) u_min = Sonnenverlauf.Untergang; else if ( Sonnenverlauf.Untergang > u_max ) u_max = Sonnenverlauf.Untergang; } } } Stunde = ( a_min + a_max ) / 2; Minute = 60 * ( ( a_min + a_max ) / 2 - Stunde ) + 0.5; printf( "%02d;", Stunde ); printf( "%02d;", Minute ); Stunde = ( u_min + u_max ) / 2; Minute = 60 * ( ( u_min + u_max ) / 2 - Stunde ) + 0.5; printf( "%02d;", Stunde ); printf( "%02d;\n", Minute ); } } return 0; }