Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.11 KB | None | 0 0
  1. //---------------------------------------------------------------------------
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <limits.h>
  5.  
  6. #define JULI_MAX 578196
  7. #define GREG_MAX
  8. #define JULIAN 0
  9. #define GREGOR 1
  10.  
  11. typedef struct {
  12.                 int den;
  13.                 int mesic;
  14.                 long long int rok;
  15.                } datum;
  16. //---------------------------------------------------------------------------
  17. int           PrestupnyRok(datum date, char jul_greg);
  18. char          Check(datum date);
  19. void          Konec(int chyba);
  20. long long int VypocetJuliansky(datum date_1, datum date_2);
  21. long long int VypocetGregoriansky(datum date_1, datum date_2);
  22. long long int VypocetJulGregor(datum date_1, datum date_2);
  23. long long int PocetDnu(datum date, char jul_greg);
  24. long long int PocetDnuVLetech(datum date, char jul_greg);
  25. //---------------------------------------------------------------------------
  26. int main(void)
  27. {
  28.   datum datum_1, datum_2;
  29.   long long int celkovy_pocet_dnu;
  30.  
  31. /*Zadani dvou datumu a overeni spravnosti zadanych dat*/
  32.   printf("Zadejte prvni datum - den mesic rok:\n");
  33.   fflush(stdin);
  34.   if((scanf("%i %i %lld", &datum_1.den, &datum_1.mesic, &datum_1.rok) != 3) || Check(datum_1) == 1)
  35.     Konec(1);
  36.   else {
  37.     printf("Zadejte druhe datum - den mesic rok:\n");
  38.     fflush(stdin);
  39.     if((scanf("%i %i %lld", &datum_2.den, &datum_2.mesic, &datum_2.rok) != 3)  || Check(datum_2) == 1)
  40.       Konec(1);
  41.     else
  42.       if((datum_1.rok > datum_2.rok) ||
  43.         ((datum_1.rok == datum_2.rok) && (datum_1.mesic > datum_2.mesic)) ||
  44.         ((datum_1.rok == datum_2.rok) && (datum_1.mesic == datum_2.mesic) && (datum_1.den > datum_2.den)))
  45.           Konec(2);
  46.   }
  47.  
  48. /*Datum je jen Julianske*/
  49.   if(((datum_1.rok == 1584 && datum_1.mesic == 1 && datum_1.den == 6) || (datum_1.rok < 1584)) && ((datum_2.rok == 1584 && datum_2.mesic == 1 && datum_2.den == 6) || datum_2.rok < 1584))
  50.     celkovy_pocet_dnu = VypocetJuliansky(datum_1, datum_2);
  51.   else
  52.   /*Datum je jen Gregorianske*/
  53.     if(((datum_1.rok == 1584 && datum_1.mesic == 1 && datum_1.den >= 17) || (datum_1.rok == 1584 && datum_1.mesic > 2) || (datum_1.rok > 1584)) && ((datum_2.rok == 1584 && datum_2.mesic == 1 && datum_2.den >= 17) || (datum_2.rok == 1584 && datum_2.mesic > 2) || (datum_2.rok > 1584)))
  54.       celkovy_pocet_dnu = VypocetGregoriansky(datum_1, datum_2);
  55.   /*Datum je smisene*/
  56.     else
  57.       celkovy_pocet_dnu = VypocetJulGregor(datum_1, datum_2);
  58.  
  59.   printf("Mezi %d.%d.%lld a %d.%d.%lld ubehlo %lld dni.\n", datum_1.den, datum_1.mesic, datum_1.rok, datum_2.den, datum_2.mesic, datum_2.rok, celkovy_pocet_dnu);
  60.  
  61.   #ifndef __PROGTEST__
  62.     system ("pause");
  63.   #endif /* __PROGTEST__ */
  64.   exit(EXIT_SUCCESS);
  65. }
  66. //---------------------------------------------------------------------------
  67. int PrestupnyRok(datum date, char jul_greg)
  68. {
  69.   switch(jul_greg) {
  70.     case 0: /*JUlIANSKY*/
  71.             if(date.rok % 4 == 0)
  72.               return 1;
  73.             else
  74.               return 0;
  75.     case 1: /*GREGORIANSKY*/
  76.             if((date.rok % 4 == 0) && (date.rok % 100 != 0 || date.rok % 400 == 0) && date.rok % 4000 != 0)
  77.               return 1;
  78.             else
  79.               return 0;
  80.   }
  81.  
  82.   return -1;
  83. }
  84. //---------------------------------------------------------------------------
  85. long long int PocetDnu(datum date, char jul_greg)
  86. {
  87.   switch(date.mesic) {
  88.     case  1: return date.den +   0 + PocetDnuVLetech(date, jul_greg);
  89.                                     //Pokud je rok prestupny, pricitam 1, jinak prictu 0
  90.     case  2: return date.den +  31 + PrestupnyRok(date, jul_greg) + PocetDnuVLetech(date, jul_greg);
  91.  
  92.     case  3: return date.den +  59 + PocetDnuVLetech(date, jul_greg);
  93.  
  94.     case  4: return date.den +  90 + PocetDnuVLetech(date, jul_greg);
  95.  
  96.     case  5: return date.den + 120 + PocetDnuVLetech(date, jul_greg);
  97.  
  98.     case  6: return date.den + 151 + PocetDnuVLetech(date, jul_greg);
  99.  
  100.     case  7: return date.den + 181 + PocetDnuVLetech(date, jul_greg);
  101.  
  102.     case  8: return date.den + 212 + PocetDnuVLetech(date, jul_greg);
  103.  
  104.     case  9: return date.den + 243 + PocetDnuVLetech(date, jul_greg);
  105.  
  106.     case 10: return date.den + 273 + PocetDnuVLetech(date, jul_greg);
  107.  
  108.     case 11: return date.den + 304 + PocetDnuVLetech(date, jul_greg);
  109.  
  110.     case 12: return date.den + 334 + PocetDnuVLetech(date, jul_greg);
  111.   }
  112.  
  113.   return -1;
  114. }
  115. //---------------------------------------------------------------------------
  116. long long int PocetDnuVLetech(datum date, char jul_greg)
  117. {
  118.   if(jul_greg == 0)
  119.     if(PrestupnyRok(date, jul_greg))
  120.       if(date.mesic == 2 && date.den >= 28)
  121.         return date.rok * 365 + (date.rok) / 4 - 3;
  122.       else
  123.         return date.rok * 365 + (date.rok) / 4 - 1;
  124.     else
  125.       return date.rok * 365 + (date.rok) / 4;
  126.   else
  127.     if(PrestupnyRok(date, jul_greg))
  128.       if(date.mesic == 2 && date.den >= 28)
  129.         return date.rok * 365 + (date.rok / 4 - date.rok / 100 + date.rok / 400 - date.rok / 4000) -3;
  130.       else
  131.         return date.rok * 365 + (date.rok / 4 - date.rok / 100 + date.rok / 400 - date.rok / 4000) -1;
  132.     else
  133.       return date.rok * 365 + (date.rok / 4 - date.rok / 100 + date.rok / 400 - date.rok / 4000);
  134.  
  135. }
  136. //---------------------------------------------------------------------------
  137. long long int VypocetJuliansky(datum date_1, datum date_2)
  138. {
  139.   return PocetDnu(date_2, JULIAN) - PocetDnu(date_1, JULIAN);
  140. }
  141. //---------------------------------------------------------------------------
  142. long long int VypocetGregoriansky(datum date_1, datum date_2)
  143. {
  144.   return PocetDnu(date_2, GREGOR) - PocetDnu(date_1, GREGOR);
  145. }
  146. //---------------------------------------------------------------------------
  147. long long int VypocetJulGregor(datum date_1, datum date_2)
  148. {
  149.   datum date_help_jul, date_help_gregor;
  150.  
  151. //Dny neexistuji
  152.   if((date_1.den >= 7 && date_1.mesic == 1 && date_1.rok == 1584) &&
  153.     (date_2.den <= 16 && date_2.mesic == 1 && date_2.rok == 1584))
  154.       return 0;
  155.  
  156.   date_help_jul.rok   = 1584;
  157.   date_help_jul.mesic = 1;
  158.   date_help_jul.den   = 6;
  159.  
  160.   date_help_gregor.rok   = 1584;
  161.   date_help_gregor.mesic = 1;
  162.   date_help_gregor.den   = 17;
  163.  
  164.   return (PocetDnu(date_help_jul, JULIAN) - PocetDnu(date_1, JULIAN)) + (PocetDnu(date_2, GREGOR) - PocetDnu(date_help_gregor, GREGOR)) + 1;
  165. }
  166. //---------------------------------------------------------------------------
  167. char Check(datum date)
  168. {
  169.   char jul_greg;
  170.  
  171.   if(date.den <= 0 || date.mesic <= 0 || date.mesic > 12 || date.rok <= 0)
  172.     return 1;
  173.  
  174.   if((date.rok == 1584 && date.mesic == 1 && date.den == 6) || (date.rok < 1584))
  175.     jul_greg = 0;
  176.   else
  177.     jul_greg = 1;
  178.  
  179.   switch(date.mesic) {
  180.     case  2: if(PrestupnyRok(date, jul_greg)) {
  181.                if(29 >= date.den)
  182.                  return 0;
  183.              }
  184.              else
  185.                if(28 >= date.den)
  186.                  return 0;
  187.                else
  188.                  return 1;
  189.     case  1:
  190.     case  3:
  191.     case  5:
  192.     case  7:
  193.     case  8:
  194.     case 10:
  195.     case 12: if(31 >= date.den)
  196.                return 0;
  197.              else
  198.                return 1;
  199.  
  200.     case  4:
  201.     case  6:
  202.     case  9:
  203.     case 11: if(30 >= date.den)
  204.                return 0;
  205.              else
  206.                return 1;
  207.   }
  208.  
  209.   return -1;
  210. }
  211. //---------------------------------------------------------------------------
  212. void Konec(int chyba)
  213. {
  214.   switch(chyba) {
  215.     case 1: printf("Nespravny vstup.\n");                     break;
  216.     case 2: printf("Prve datum je vetsi nez datum druhe.\n"); break;
  217.   }
  218.  
  219.   #ifndef __PROGTEST__
  220.     system ("pause");
  221.   #endif /* __PROGTEST__ */
  222.  
  223.   exit(EXIT_FAILURE);
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement