Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //---------------------------------------------------------------------------
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- #define JULI_MAX 578196
- #define GREG_MAX
- #define JULIAN 0
- #define GREGOR 1
- typedef struct {
- int den;
- int mesic;
- long long int rok;
- } datum;
- //---------------------------------------------------------------------------
- int PrestupnyRok(datum date, char jul_greg);
- char Check(datum date);
- void Konec(int chyba);
- long long int VypocetJuliansky(datum date_1, datum date_2);
- long long int VypocetGregoriansky(datum date_1, datum date_2);
- long long int VypocetJulGregor(datum date_1, datum date_2);
- long long int PocetDnu(datum date, char jul_greg);
- long long int PocetDnuVLetech(datum date, char jul_greg);
- //---------------------------------------------------------------------------
- int main(void)
- {
- datum datum_1, datum_2;
- long long int celkovy_pocet_dnu;
- /*Zadani dvou datumu a overeni spravnosti zadanych dat*/
- printf("Zadejte prvni datum - den mesic rok:\n");
- fflush(stdin);
- if((scanf("%i %i %lld", &datum_1.den, &datum_1.mesic, &datum_1.rok) != 3) || Check(datum_1) == 1)
- Konec(1);
- else {
- printf("Zadejte druhe datum - den mesic rok:\n");
- fflush(stdin);
- if((scanf("%i %i %lld", &datum_2.den, &datum_2.mesic, &datum_2.rok) != 3) || Check(datum_2) == 1)
- Konec(1);
- else
- if((datum_1.rok > datum_2.rok) ||
- ((datum_1.rok == datum_2.rok) && (datum_1.mesic > datum_2.mesic)) ||
- ((datum_1.rok == datum_2.rok) && (datum_1.mesic == datum_2.mesic) && (datum_1.den > datum_2.den)))
- Konec(2);
- }
- /*Datum je jen Julianske*/
- 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))
- celkovy_pocet_dnu = VypocetJuliansky(datum_1, datum_2);
- else
- /*Datum je jen Gregorianske*/
- 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)))
- celkovy_pocet_dnu = VypocetGregoriansky(datum_1, datum_2);
- /*Datum je smisene*/
- else
- celkovy_pocet_dnu = VypocetJulGregor(datum_1, datum_2);
- 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);
- #ifndef __PROGTEST__
- system ("pause");
- #endif /* __PROGTEST__ */
- exit(EXIT_SUCCESS);
- }
- //---------------------------------------------------------------------------
- int PrestupnyRok(datum date, char jul_greg)
- {
- switch(jul_greg) {
- case 0: /*JUlIANSKY*/
- if(date.rok % 4 == 0)
- return 1;
- else
- return 0;
- case 1: /*GREGORIANSKY*/
- if((date.rok % 4 == 0) && (date.rok % 100 != 0 || date.rok % 400 == 0) && date.rok % 4000 != 0)
- return 1;
- else
- return 0;
- }
- return -1;
- }
- //---------------------------------------------------------------------------
- long long int PocetDnu(datum date, char jul_greg)
- {
- switch(date.mesic) {
- case 1: return date.den + 0 + PocetDnuVLetech(date, jul_greg);
- //Pokud je rok prestupny, pricitam 1, jinak prictu 0
- case 2: return date.den + 31 + PrestupnyRok(date, jul_greg) + PocetDnuVLetech(date, jul_greg);
- case 3: return date.den + 59 + PocetDnuVLetech(date, jul_greg);
- case 4: return date.den + 90 + PocetDnuVLetech(date, jul_greg);
- case 5: return date.den + 120 + PocetDnuVLetech(date, jul_greg);
- case 6: return date.den + 151 + PocetDnuVLetech(date, jul_greg);
- case 7: return date.den + 181 + PocetDnuVLetech(date, jul_greg);
- case 8: return date.den + 212 + PocetDnuVLetech(date, jul_greg);
- case 9: return date.den + 243 + PocetDnuVLetech(date, jul_greg);
- case 10: return date.den + 273 + PocetDnuVLetech(date, jul_greg);
- case 11: return date.den + 304 + PocetDnuVLetech(date, jul_greg);
- case 12: return date.den + 334 + PocetDnuVLetech(date, jul_greg);
- }
- return -1;
- }
- //---------------------------------------------------------------------------
- long long int PocetDnuVLetech(datum date, char jul_greg)
- {
- if(jul_greg == 0)
- if(PrestupnyRok(date, jul_greg))
- if(date.mesic == 2 && date.den >= 28)
- return date.rok * 365 + (date.rok) / 4 - 3;
- else
- return date.rok * 365 + (date.rok) / 4 - 1;
- else
- return date.rok * 365 + (date.rok) / 4;
- else
- if(PrestupnyRok(date, jul_greg))
- if(date.mesic == 2 && date.den >= 28)
- return date.rok * 365 + (date.rok / 4 - date.rok / 100 + date.rok / 400 - date.rok / 4000) -3;
- else
- return date.rok * 365 + (date.rok / 4 - date.rok / 100 + date.rok / 400 - date.rok / 4000) -1;
- else
- return date.rok * 365 + (date.rok / 4 - date.rok / 100 + date.rok / 400 - date.rok / 4000);
- }
- //---------------------------------------------------------------------------
- long long int VypocetJuliansky(datum date_1, datum date_2)
- {
- return PocetDnu(date_2, JULIAN) - PocetDnu(date_1, JULIAN);
- }
- //---------------------------------------------------------------------------
- long long int VypocetGregoriansky(datum date_1, datum date_2)
- {
- return PocetDnu(date_2, GREGOR) - PocetDnu(date_1, GREGOR);
- }
- //---------------------------------------------------------------------------
- long long int VypocetJulGregor(datum date_1, datum date_2)
- {
- datum date_help_jul, date_help_gregor;
- //Dny neexistuji
- if((date_1.den >= 7 && date_1.mesic == 1 && date_1.rok == 1584) &&
- (date_2.den <= 16 && date_2.mesic == 1 && date_2.rok == 1584))
- return 0;
- date_help_jul.rok = 1584;
- date_help_jul.mesic = 1;
- date_help_jul.den = 6;
- date_help_gregor.rok = 1584;
- date_help_gregor.mesic = 1;
- date_help_gregor.den = 17;
- return (PocetDnu(date_help_jul, JULIAN) - PocetDnu(date_1, JULIAN)) + (PocetDnu(date_2, GREGOR) - PocetDnu(date_help_gregor, GREGOR)) + 1;
- }
- //---------------------------------------------------------------------------
- char Check(datum date)
- {
- char jul_greg;
- if(date.den <= 0 || date.mesic <= 0 || date.mesic > 12 || date.rok <= 0)
- return 1;
- if((date.rok == 1584 && date.mesic == 1 && date.den == 6) || (date.rok < 1584))
- jul_greg = 0;
- else
- jul_greg = 1;
- switch(date.mesic) {
- case 2: if(PrestupnyRok(date, jul_greg)) {
- if(29 >= date.den)
- return 0;
- }
- else
- if(28 >= date.den)
- return 0;
- else
- return 1;
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12: if(31 >= date.den)
- return 0;
- else
- return 1;
- case 4:
- case 6:
- case 9:
- case 11: if(30 >= date.den)
- return 0;
- else
- return 1;
- }
- return -1;
- }
- //---------------------------------------------------------------------------
- void Konec(int chyba)
- {
- switch(chyba) {
- case 1: printf("Nespravny vstup.\n"); break;
- case 2: printf("Prve datum je vetsi nez datum druhe.\n"); break;
- }
- #ifndef __PROGTEST__
- system ("pause");
- #endif /* __PROGTEST__ */
- exit(EXIT_FAILURE);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement