Δημοσιεύτηκε: 22 Ιουν 2011, 23:26
από clepto
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <math.h>
#include <string.h>

#define isleap(y) ( !((y) % 4) && ( (y) % 100 || !((y) % 400) ) )


// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας 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;
}


// ---------------------------------------------------------------------------------

int main(void)
{
int d1, m1, y1, d2, m2, y2, days, months, years;
long int jdn1, jdn2;
int mdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };


// διάβασε την 1η ημερομηνία
printf("Ποια είναι η σημερινή ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
jdn1 = date_2jdn( d1, m1, y1);


// διάβασε τη 2η ημερομηνία
do {
printf("Ποια ημερομηνία γεννηθήκατε (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
jdn2 = date_2jdn( d2, m2, y2);
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της τωρινής ημερομηνίας, δοκιμάστε ξανά");
} while (jdn2 > jdn1);


// υπολογισμός ηλικίας

days = (d1-d2);
months = (m1-m2);
years = (y1-y2);

if (months <0) {
months += 12;
years--;
}

if (days < 0) {
days += mdays[m2-1];
if ( m2 == 2 && isleap(y2) )
days++;
months--;
}


printf("\nΕίστε %d χρονών, %d μηνών και %d ημερών \n", years, months, days);

getchar();
printf("\npress ENTER to exit...");
fflush(stdin); getchar();

return 0;
}


κάποια παρατήρηση πρόταση;