fork(1) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /* http://a...content-available-to-author-only...y.mil/data/docs/JulianDate.php */
  4. /* http://c...content-available-to-author-only...a.com/wiki/Julian_day_number */
  5. double jd( int m, int d, int y ) {
  6. y += 8000;
  7. if ( m < 3 ) { y--; m += 12; }
  8. return y*365.0 + (y/4) - (y/100) + (y/400) + (m*153+3)/5 + d - 1200913.5;
  9. }
  10. double mjd( int m, int d, int y ) { return jd( m, d, y ) - 2400000.5; }
  11. int leap( int year ) {
  12. return year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 );
  13. }
  14. int invalid( int month, int day, int year ) {
  15. static const int days[]= { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  16. if ( month < 1 || month > 12 || day < 1 ) return 1;
  17. if ( (month != 2 || !leap( year )) && day > days[month-1] ) return 1;
  18. return day > 29;
  19. }
  20. int main( void ) {
  21. int d1, m1, y1, d2, m2, y2;
  22. char temp, buf[200];
  23. for ( ; ; ) {
  24. for ( ; ; ) {
  25. printf( "\nEnter first date in 'mm/dd/yyyy' format: " );
  26. fgets( buf, sizeof( buf ), stdin );
  27. if ( sscanf( buf, "%d%c%d%c%d", &m1, &temp, &d1, &temp, &y1 ) != 5 ) exit( 0 );
  28. if ( !invalid( m1, d1, y1 ) ) break;
  29. printf( "Invalid input!!!\n" );
  30. }
  31. for ( ; ; ) {
  32. printf( "\nEnter second date in 'mm/dd/yyyy' format: " );
  33. fgets( buf, sizeof( buf ), stdin );
  34. if ( sscanf( buf, "%d%c%d%c%d", &m2, &temp, &d2, &temp, &y2 ) != 5 ) exit( 0 );
  35. if ( !invalid( m2, d2, y2 ) ) break;
  36. printf( "Invalid input!!!\n" );
  37. }
  38. printf( "\n%.0lf\n", mjd( m2, d2, y2 ) - mjd( m1, d1, y1 ) );
  39. }
  40. return 0;
  41. }
  42.  
Success #stdin #stdout 0s 1836KB
stdin
1/1/1900
1/1/1901
1/1/2000
1/1/2001
1/1/1900
1/1/2000
1/1/1900
1/1/2300
2/30/1999

stdout
Enter first date in 'mm/dd/yyyy' format: 
Enter second date in 'mm/dd/yyyy' format: 
365

Enter first date in 'mm/dd/yyyy' format: 
Enter second date in 'mm/dd/yyyy' format: 
366

Enter first date in 'mm/dd/yyyy' format: 
Enter second date in 'mm/dd/yyyy' format: 
36524

Enter first date in 'mm/dd/yyyy' format: 
Enter second date in 'mm/dd/yyyy' format: 
146097

Enter first date in 'mm/dd/yyyy' format: Invalid input!!!

Enter first date in 'mm/dd/yyyy' format: