Δημοσιεύτηκε: 21 Ιουν 2011, 14:22
Ιδού 
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE !FALSE
#define isleap(y) ( !((y) % 4) && ( (y) % 100 || !((y) % 400) ) )
// ---------------------------------------------------------------------------------
// Έλεγχος έγκυρης ημερομηνίας
//
int validdate( int d, int m, int y, int mdays[] )
{
if ( y < 1582 )
return FALSE;
if ( m < 1 || m > 12 )
return FALSE;
if ( d < 1 || d > mdays[ m-1 ] )
{
if ( isleap(y) && m == 2 && d == 29 )
return TRUE;
return FALSE;
}
return TRUE;
}
// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας d,m,y σε Ιουλιανό αριθμό
//
long int date_2jdn( int d, int m, int y )
{
return ( 1461 * ( y + 4800 + ( m - 14 ) / 12 ) ) / 4 +
( 367 * ( m - 2 - 12 * ( ( m - 14 ) / 12 ) ) ) / 12 -
( 3 * ( ( y + 4900 + ( m - 14 ) / 12 ) / 100 ) ) / 4 +
d - 32075;
}
// ---------------------------------------------------------------------------------
// Μετατροπή Ιουλιανού αριθμού σε ημερομηνία d,m,y
//
void jdn_2date( int *d, int *m, int *y, long int jdn )
{
long int l = jdn + 68569;
long int n = ( 4 * l ) / 146097;
l = l - ( 146097 * n + 3 ) / 4;
long int i = ( 4000 * ( l + 1 ) ) / 1461001;
l = l - ( 1461 * i ) / 4 + 31;
long int j = ( 80 * l ) / 2447;
*d = l - ( 2447 * j ) / 80;
l = j / 11;
*m = j + 2 - ( 12 * l );
*y = 100 * ( n - 49 ) + i + l;
return;
}
// ---------------------------------------------------------------------------------
// Καλλωπισμένο τύπωμα ημερομηνίας
//
void print_prettydate( int d, int m, int y, char *monthnames[], char *daynames[] )
{
long int jdn = date_2jdn( d, m, y ); // υπολογισμός Ιουλιανού αριθμού
// σημείωση: jdn % 7 δίνει την ημέρα της εβδμάδας ( 0=Δευ, ..., 6=Κυρ)
printf( "\tΑντιστοιχεί σε %s, %d %s %d (%ld) ",
daynames[ (jdn % 7) ], d, monthnames[ m-1], y, jdn
);
if ( isleap(y) ) // έχουμε δίεσκτο έτος
printf("ΔΙΣΕΚΤΟ ΕΤΟΣ");
putchar('\n');
return;
}
// ---------------------------------------------------------------------------------
int main( void )
{
int mdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
char *daynames[7] = {"Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"};
char *monthnames[12] = { "ΙΑΝ", "ΦΕΒ", "ΜΑΡ", "ΑΠΡ", "ΜΑΙ", "ΙΟΥΝ", "ΙΟΥΛ", "ΑΥΓ", "ΣΕΠ", "ΟΚΤ", "ΝΟΕ", "ΔΕΚ"};
int d1, m1, y1, d2, m2, y2;
long int jdn1, jdn2=0L;
// διάβασμα 1ης ημερομηνίας (απαίτηση να είναι έγκυρη)
do {
printf("\n1η ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
if ( !validdate( d1, m1, y1, mdays ) )
puts("\tάκυρη ημερομηνία, δοκιμάστε ξανά");
} while ( !validdate( d1, m1, y1, mdays ) );
// καλλωπισμένο τύπωμα της 1ης ημερομηνίας
print_prettydate( d1, m1, y1, monthnames, daynames);
// διάβασμα 2ης ημερομηνίας (απαίτηση να είναι έγκυρη και μικρότερη της 1ης)
jdn1 = date_2jdn( d1, m1, y1);
do {
printf("\n2η ημερομηνία (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
if ( !validdate( d2, m2, y2, mdays ) )
puts("\tάκυρη ημερομηνία, δοκιμάστε ξανά");
else {
jdn2 = date_2jdn( d2, m2, y2); // υπολογισμός Ιουλιανού αριθμού
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της 1ης ημερομηνίας, δοκιμάστε ξανά");
}
} while ( !validdate(d2, m2, y2, mdays) || jdn2 > jdn1);
// καλλωπισμένο τύπωμα της 2ης ημερομηνίας
print_prettydate( d2, m2, y2, monthnames, daynames);
// υπολόγισε & τύπωσε τη διαφορά μεταξύ των ημερομηνιών σε ημέρες
printf("\n\nΟι ημερομηνίες απέχουν μεταξύ τους %ld ημέρες\n", jdn1-jdn2);
// υπολόγισε & τύπωσε καλλωπισμένα την ημερομηνία 10 μέρες πριν την 1η ημ/νία
puts("10 μέρες πριν την 1η ημερμηνία....");
jdn_2date( &d1, &m1, &y1, jdn1-10);
print_prettydate( d1, m1, y1, monthnames, daynames);
// υπολόγισε & τύπωσε καλλωπισμένα την ημερομηνία 15 μέρες μετά την 2η ημ/νία
puts("15 μέρες μετά την 2η ημερμηνία....");
jdn_2date( &d2, &m2, &y2, jdn2+15);
print_prettydate( d2, m2, y2, monthnames, daynames);
printf("\npress ENTER to exit...");
fflush(stdin); getchar();
exit(0);
}