Δημοσιεύτηκε: 21 Ιουν 2011, 11:01
Προσπάθησα να στο απλοποιήσω, για ρίξε μια ματιά και πες μου (κάνω και έλεγχο μέσω των Ιουλιανών αριθμών ώστε να μη δέχεται 2η ημερομηνία μεγαλύτερη της 1ης στην είσοδο... επίσης χρειάζεται έλεγχος ώστε οι ημερομηνίες εισόδου να αντιστοιχούν σε έγκυρες ημερομηνίες, αλλά για να μη σε μπερδέψω με όλα μαζί θα το κάνω ξεχωριστά σε άλλο κώδικα).
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας 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;
long int jdn1, jdn2;
// διάβασε την 1η ημερομηνία
printf("1η ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
jdn1 = date_2jdn( d1, m1, y1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn1);
// διάβασε τη 2η ημερομηνία
do {
printf("2η ημερομηνία (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
jdn2 = date_2jdn( d2, m2, y2);
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της 1ης ημερομηνίας, δοκιμάστε ξανά");
} while (jdn2 > jdn1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn2);
// υπολόγισε τη διαφορά μεταξύ των ημερομηνιών σε ημέρες
printf("Οι ημερομηνίες απέχουν μεταξύ τους %ld ημέρες\n", jdn1-jdn2);
// υπολόγισε την ημερομηνία 10 μέρες πριν την 1η ημερομηνία
jdn_2date( &d1, &m1, &y1, jdn1-10);
printf("10 μέρες πριν από την 1η ημερομηνία είναι: %d %d %d\n", d1, m1, y1);
// υπολόγισε την ημερομηνία 15 μέρες μετά τη 2η ημερομηνία
jdn_2date( &d2, &m2, &y2, jdn2+15);
printf("15 μέρες μετά από την 2η ημερομηνία είναι: %d %d %d\n\n", d2, m2, y2);
printf("\npress ENTER to exit...");
fflush(stdin); getchar();
exit(0);
}
clepto έγραψε:ρε συ μπορείς να μου δώσεις ένα πολύ απλό παράδειγμα χρήσης του αλγόριθμου μετατροπής ημερομηνίας σε Ιουλιανό αριθμό;
διάβασα τον κώδικα σου αλλά είναι λίγο δύσκολο να καταλάβω...