Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.00 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "ctype.h"
  3. #include "string.h"
  4. #include "stdlib.h"
  5. #include "math.h"
  6.  
  7. int dia=0, mes=0, ano, diaf=0, mesf=0, anof, j=0, x=0;  //declaração de variáveis globais
  8. FILE *dataslidas, *saidaformatada;
  9. /*========================================================================================================================================================*/
  10. int datab1(char *str1)  //função para converter a data incial com barras para inteiro
  11. {char str[10];
  12.  int i, j, k, o;
  13.     for(i=0; str1[i]!='/'; i++) //até a primeira barra
  14.         str[i] = str1[i];   //str vai receber o dia
  15.     str[i] = '\0';
  16.     dia = atoi(str);    //transforma a string para inteiro
  17.     for(j=i+1, o=0; str1[j]!='/'; j++, o++) //até a primeira barra
  18.         str[o] = str1[j];       //str vai receber o mes
  19.     str[o] = '\0';
  20.     mes = atoi(str);    //transforma a string para inteiro
  21.     for(k=j+1, o=0; str1[k]!='\0'; k++, o++)    //até o final da string
  22.         str[o] = str1[k];           //str vai receber o ano
  23.     str[o] = '\0';
  24.     ano = atoi(str);    //transforma a string para inteiro
  25. }
  26. /*========================================================================================================================================================*/
  27. int datab2(char *str1)  //função para converter a data final com barras para inteiro
  28. {char str[10];
  29.  int i, j, k, o;
  30.     for(i=0; str1[i]!='/'; i++)     //até a primeira barra
  31.         str[i] = str1[i];       //str vai receber o dia
  32.     str[i] = '\0';
  33.     diaf = atoi(str);           //transforma a string para inteiro
  34.     for(j=i+1, o=0; str1[j]!='/'; j++, o++) //até a primeira barra
  35.         str[o] = str1[j];       //str vai receber o mes
  36.     str[o] = '\0';
  37.     mesf = atoi(str);           //transforma a string para inteiro
  38.     for(k=j+1, o=0; str1[k]!='\0'; k++, o++)//até o final da string
  39.         str[o] = str1[k];       //str vai receber o ano
  40.     str[o] = '\0';
  41.     anof = atoi(str);           //transforma a string para inteiro
  42. }
  43. /*========================================================================================================================================================*/
  44. int mesfunc(char *mes1)
  45. {int i;
  46.     for(i=0; mes1[i]!='\0'; i++)        //maiuscula recebe
  47.         mes1[i] = tolower(mes1[i]); //minuscula
  48.     if(!strcmp(mes1,"janeiro")) //---------------
  49.         return 1;       //      |
  50.     if(!strcmp(mes1,"fevereiro"))   //      |
  51.         return 2;       //   Função   |
  52.     if(!strcmp(mes1,"março"))  //      |
  53.         return 3;       //    que   |
  54.     if(!strcmp(mes1,"abril"))   //      |
  55.         return 4;       //  retorna |
  56.     if(!strcmp(mes1,"maio"))    //      |
  57.         return 5;       //     o    |
  58.     if(!strcmp(mes1,"junho"))   //      |
  59.         return 6;       //  inteiro |
  60.     if(!strcmp(mes1,"julho"))   //      |
  61.         return 7;       // equivalente  |
  62.     if(!strcmp(mes1,"agosto"))  //      |
  63.         return 8;       //    ao    |
  64.     if(!strcmp(mes1,"setembro"))    //      |
  65.         return 9;       //    mes   |
  66.     if(!strcmp(mes1,"outubro")) //      |
  67.         return 10;      //  escrito |
  68.     if(!strcmp(mes1,"novembro"))    //      |
  69.         return 11;      //      |
  70.     if(!strcmp(mes1,"dezembro"))    //      |
  71.         return 12;      //---------------
  72.     return 0;
  73. }
  74. /*========================================================================================================================================================*/
  75. int datad1(char *str1)  //função para converter a data inicial por extenso para inteiro
  76. {int i, j, k, o;
  77.  char str[10], mes1[15];
  78.     for(i=0; str1[i]!=' '; i++)     //até o primeiro espaço
  79.         str[i] = str1[i];       //str vai receber o dia
  80.     str[i] = '\0';
  81.     dia = atoi(str);            //transforma a string para inteiro
  82.     for(j=i+4, o=0; str1[j]!=' '; j++, o++) //até o primeiro espaço
  83.         mes1[o] = str1[j];      //mes1 vai receber o mes
  84.     mes1[o] = '\0';
  85.     for(k=j+4, o=0; str1[k]!='\0'; k++, o++)//até o final da string
  86.         str[o] = str1[k];       //str vai receber o ano
  87.     str[o] = '\0';
  88.     ano = atoi(str);            //transforma a string para inteiro
  89.     mes = mesfunc(mes1);
  90. }
  91. /*========================================================================================================================================================*/
  92. int datad2(char *str1)  //função para converter a data final por extenso para inteiro
  93. {int i, j, k, o;
  94.  char str[10], mes1[15];
  95.     for(i=0; str1[i]!=' '; i++)         //até o primeiro espaço
  96.         str[i] = str1[i];           //str vai receber o dia
  97.     str[i] = '\0';
  98.     diaf = atoi(str);               //transforma a string para inteiro
  99.     for(j=i+4, o=0; str1[j]!=' '; j++, o++)     //até o primeiro espaço
  100.         mes1[o] = str1[j];          //mes1 vai receber o mes
  101.     mes1[o] = '\0';
  102.     for(k=j+4, o=0; str1[k]!='\0'; k++, o++)    //até o final da string
  103.         str[o] = str1[k];           //str vai receber o ano
  104.     str[o] = '\0';
  105.     anof = atoi(str);               //transforma a string para inteiro
  106.     mesf = mesfunc(mes1);
  107. }
  108. /*========================================================================================================================================================*/
  109. int ledata1()   //função para ler a primeira data do teclado
  110. {int i, j, s;
  111.  char c=' ', str1[100];
  112.     puts("Escreva a data inicial(dd/mm/aaaa ou dia de mes de ano):");
  113.     for(i=0; c!='\n'; i++)                      //---------------
  114.     {   scanf("%c", &c);                    //'for' para ler|
  115.         str1[i] = c;                        //a data inicial|
  116.         if((str1[i] == ' ' && str1[i-1] == ' ')||str1[0] == ' ')//e tirar os    |
  117.             i = i - 1;                  //epaços   |
  118.     }                               //---------------
  119.     str1[i-1] = '\0';               //fecha a string
  120.     if(str1[1]=='/'||str1[2]=='/'||str1[3]=='/')    //se a data inicial for com barra
  121.     {   for(j=0; j<i; j++)              //-----------------------
  122.         {   if(str1[j] == ' ')          //  tira os     |
  123.             {   for(s=j; s<i; s++)      //  espaços        |
  124.                     str1[s] = str1[s+1];    //  antes       |
  125.             }                   //  das barras  |
  126.         }                       //-----------------------
  127.         datab1(str1);               //chama a função datab1
  128.     }
  129.     else                        //se não for com barra
  130.         datad1(str1);               //chama a função datad1
  131.     if(ano < 100 && ano <= 50)  //------------------
  132.         ano = ano + 2000;   //por o ano inicial|
  133.     if(ano < 100 && ano > 50)   //com 4 casas      |
  134.         ano = ano + 1900;   //------------------
  135.     c = ' ';
  136. }
  137. /*========================================================================================================================================================*/
  138. int ledata1arq()    //função para ler a primeira data do arquivo
  139. {int i, j, s;
  140.  char c=' ', str1[100];
  141.     for(i=0; c!='\n'; i++)                      //---------------
  142.     {   if(fscanf(dataslidas, "%c", &c)==1)         //'for' para ler|
  143.             str1[i] = c;
  144.         else
  145.             exit(0);                    //a data inicial|
  146.         if((str1[i] == ' ' && str1[i-1] == ' ')||str1[0] == ' ')//e tirar os    |
  147.             i = i - 1;                  //epaços   |
  148.     }                               //---------------
  149.     str1[i-1] = '\0';   //fecha a string
  150.     if(str1[1]=='/'||str1[2]=='/'||str1[3]=='/')    //se a data inicial for com barra
  151.     {   for(j=0; j<i; j++)              //-----------------------
  152.         {   if(str1[j] == ' ')          //  tira os     |
  153.             {   for(s=j; s<i; s++)      //  espaços        |
  154.                     str1[s] = str1[s+1];    //  antes       |
  155.             }                   //  das barras  |
  156.         }                       //-----------------------
  157.         datab1(str1);       //chama a função datab1
  158.     }
  159.     else            //se não for com barra
  160.         datad1(str1);   //chama a função datad1
  161.     if(ano < 100 && ano <= 50)  //------------------
  162.         ano = ano + 2000;   //por o ano inicial|
  163.     if(ano < 100 && ano > 50)   //com 4 casas      |
  164.         ano = ano + 1900;   //------------------
  165.     c = ' ';
  166. }
  167. /*========================================================================================================================================================*/
  168. int ledata2()   //função para ler a segunda data do teclado
  169. {int i, j, s;
  170.  char c=' ', str2[100];
  171.     puts("Escreva a data final(dd/mm/aaaa ou dia de mes de ano):");
  172.     for(i=0; c!='\n'; i++)                      //---------------
  173.     {   scanf("%c", &c);                    //'for' para ler|
  174.         str2[i] = c;                        //a data final  |
  175.         if((str2[i] == ' ' && str2[i-1] == ' ')||str2[0] == ' ')//e tirar os    |
  176.             i = i - 1;                  //espaços  |
  177.     }                               //---------------
  178.     str2[i-1] = '\0';   //fecha a string
  179.     if(str2[1]=='/'||str2[2]=='/'||str2[3]=='/')    //se a data final for com barra
  180.     {   for(j=0; j<i; j++)              //-----------------------
  181.         {   if(str2[j] == ' ')          //  tira os     |
  182.             {   for(s=j; s<i; s++)      //  espaços        |
  183.                     str2[s] = str2[s+1];    //  antes       |
  184.             }                   //  das barras  |
  185.         }                       //-----------------------
  186.         datab2(str2);       //chama a função datab2
  187.     }
  188.     else            //se não for com barra
  189.         datad2(str2);   //chama a função datad2
  190.     if(anof < 100 && anof <= 50)    //----------------
  191.         anof = anof + 2000; //por o ano final|
  192.     if(anof < 100 && anof > 50) //com 4 casas    |
  193.         anof = anof + 1900; //----------------
  194.     c = ' ';
  195. }
  196. /*========================================================================================================================================================*/
  197. int ledata2arq()    //função para ler a segunda data do arquivo
  198. {int i, j, s;
  199.  char c=' ', str2[100];
  200.     for(i=0; c!='\n'; i++)                      //---------------
  201.     {   if(fscanf(dataslidas, "%c", &c)==1)         //'for' para ler|
  202.             str2[i] = c;
  203.         else
  204.             exit(0);                    //a data final  |
  205.         if((str2[i] == ' ' && str2[i-1] == ' ')||str2[0] == ' ')//e tirar os    |
  206.             i = i - 1;                  //espaços  |
  207.     }                               //---------------
  208.     str2[i-1] = '\0';   //fecha a string
  209.     if(str2[1]=='/'||str2[2]=='/'||str2[3]=='/')    //se a data final for com barra
  210.     {   for(j=0; j<i; j++)              //-----------------------
  211.         {   if(str2[j] == ' ')          //  tira os     |
  212.             {   for(s=j; s<i; s++)      //  espaços        |
  213.                     str2[s] = str2[s+1];    //  antes       |
  214.             }                   //  das barras  |
  215.         }                       //-----------------------
  216.         datab2(str2);       //chama a função datab2
  217.     }
  218.     else            //se não for com barra
  219.         datad2(str2);   //chama a função datad2
  220.     if(anof < 100 && anof <= 50)    //----------------
  221.         anof = anof + 2000; //por o ano final|
  222.     if(anof < 100 && anof > 50) //com 4 casas    |
  223.         anof = anof + 1900; //----------------
  224.     c = ' ';
  225. }
  226. /*========================================================================================================================================================*/
  227. int dataval()   //função para ver se uma data dada pelo usuário existe e é válida
  228. {int k=1, d, m, a;
  229.     if((mes==1&&dia<32)||(mes==2&&dia<30)||(mes>2&&mes%2==1&&mes<8&&dia<32)||(mes>3&&mes%2==0&&mes<8&&dia<31)||(mes>7&&m<13&&m%2==0&&dia<32)||(mes>7&&m<13&&m%2==1&&dia<31))    //if para saber se o dia é menor ou igual ao ultimo dia do mes escolhido
  230.     {   if((dia==29&&mes==2)&&(ano%4!=0||((ano%100==0)&&(ano%400!=0)))||(diaf==29&&mesf==2)&&(anof%4!=0||((anof%100==0)&&(anof%400!=0))))
  231.             puts("\nData inválida\n"); //se o dia inserido foi 29 e o ano não é bissexto
  232.         else
  233.         {   if((ano>anof)||(ano==anof && mes>mesf)||(ano==anof && mes==mesf && dia>diaf))
  234.             {   d = dia; m = mes; a = ano;      //a data maior  |
  235.                 dia = diaf; mes = mesf; ano = anof; //recebe a  |
  236.                 diaf = d; mesf = m; anof = a;       //data menor    |
  237.             }                       //---------------
  238.             if(((ano%4==0&&((ano%100!=0)||(ano%400==0)))&&(dia==29&&mes==2))&&((anof%4==0&&((anof%100!=0)||(anof%400==0)))&&(diaf==29&&mesf==2)))   {       k = 0;      //------------------------------------------
  239.                     dia--;  x=1;    //se tanto o dia inicial quanto o dia final|
  240.                     diaf--; j=1;    //forem 29 e os anos forem bissextos       |
  241.             }               //------------------------------------------
  242.             else
  243.             {   if((ano%4==0&&((ano%100!=0)||(ano%400==0)))&&(dia==29&&mes==2))
  244.                 {       k = 0;      //se somente o dia inicial   |
  245.                         dia--; x=1;     //for 29 e o ano for bissexto|
  246.                 }               //----------------------------
  247.                 else
  248.                 {   if((anof%4==0&&((anof%100!=0)||(anof%400==0)))&&(diaf==29&&mesf==2))
  249.                     {       k = 0;      //se somente o dia final    |
  250.                             diaf--; j=1;    //for 29 e o anof for bissexto  |
  251.                     }               //-------------------------------
  252.                     else
  253.                         k = 0;  //se for válida
  254.                 }
  255.             }
  256.         }
  257.     }
  258.     else
  259.         puts("\nData inválida\n");
  260.     return k;
  261. }
  262. /*========================================================================================================================================================*/
  263. int func(int d, int m, int a, int df, int mf, int af, int n)    //função recursiva para calcular os dias passados
  264. {
  265.     if(d == df && m == mf && a == af)   //se o dia chegou no diafinal, o mes chegou no mesfinal e o ano chegou no anofinal
  266.         return n-1;             //retorna o número de dias
  267.     if((m>0&&m<8&&m%2==1&&d==31)||(m>0&&m<8&&m%2==0&&d==30)||(m>7&&m<12&&m%2==0&&d==31)||(m>7&&m<12&&m%2==1&&d==30)||(m==2&&a%4==0&&a%400==0&&a%100!=0&&d==29)||(m==2&&a%4!=0&&d==28))
  268.         func(1, m+1, a, df, mf, af, n+1);//se for o ultimo dia do mes, chama a função com o primeiro dia do próximo mes
  269.     else                                //-------------------------------------------------------
  270.     {   if(m == 12 && d == 31)              //se for o ultimo dia do ultimo mes do ano      |
  271.             func(1, 1, a+1, df, mf, af, n+1);   //chama a função com o primeiro dia e mes do próximo ano|
  272.         else                            //-------------------------------------------------------
  273.             func(d+1, m, a, df, mf, af, n+1);   //chama a função acrescentando um dia         |
  274.     }
  275.  
  276.    
  277. }
  278. /*========================================================================================================================================================*/
  279. int bissexto (int dias) {
  280.     int i;
  281.     for (i=ano; i<=anof; i++)
  282.         if ((i%4==0)&&(i%100!=0)&&(i%400==0))
  283.             if((ano==anof&&mes<=2&&mesf>2)||(ano<anof&&mes<=2)||(i!=ano&&i!=anof)||(i==anof&&mesf>2)||(i=anof&&j))
  284.                 dias++;
  285.     return dias;
  286. }
  287. /*========================================================================================================================================================*/
  288. void menu () {
  289.     int i, dias, k=1, z=1, x=1;
  290.  char str[10], res;
  291.     saidaformatada = fopen("formatadas.txt", "a");
  292.     puts("-----------------------\n|(1) - Data do teclado|\n|(2) - Data do arquivo|\n-----------------------");
  293.     scanf("%c%*c", &res);   //le o char e limpa o buffer
  294.     if(res == '1')
  295.     {   while(k)    //enquanto não for válida
  296.         {   ledata1();  //chama função para ler a primeira data
  297.             ledata2();  //chama função para ler a segunda data
  298.             k = dataval();  //chama a função para receber a data e verificar se ela é válida
  299.         }
  300.         dias = func(dia, mes, ano, diaf, mesf, anof, 0);    //chama a função func para calcular os dias passados
  301.         fprintf(saidaformatada, "Data Inicial: %d/%d/%d Data Final: %d/%d/%d => Total de Dias Decorridos: %d dias\n", dia, mes, ano, diaf, mesf, anof, dias);
  302.         printf("\n%d dia(s)\n\n", dias);
  303.     }
  304.     if(res == '2')
  305.     {   dataslidas = fopen("bancoDadosDatas.txt", "r");
  306.         if(dataslidas == NULL)
  307.         {   puts("Não existe esse arquivo.");
  308.             dataslidas = fopen("bancoDadosDatas.txt", "w");
  309.             exit(0);
  310.         }
  311.         while(!feof(dataslidas))    //enquanto não for o final do arquivo
  312.         {   ledata1arq();   //le a primeira data
  313.             ledata2arq();   //le a segunda data
  314.             x = dataval();
  315.             if(!x)
  316.             {   dias = func(dia, mes, ano, diaf, mesf, anof, 0)+1;  //chama a função func para calcular os dias passados
  317.                 dias = bissexto(dias);  //ver se existe anos bissexto
  318.                 printf("\n%d/%d/%d - %d/%d/%d = %d dia(s)\n\n", dia, mes, ano, diaf, mesf, anof, dias);
  319.                 fprintf(saidaformatada, "Data Inicial: %d/%d/%d Data Final: %d/%d/%d => Total de Dias Decorridos: %d dias\n", dia, mes, ano, diaf, mesf, anof, dias);
  320.             }
  321.             else
  322.                 puts("Data do arquivo está incorreta");
  323.         }
  324.         fclose(dataslidas);
  325.     }
  326.     fclose(saidaformatada);
  327. }
  328. /*========================================================================================================================================================*/
  329. main()
  330. {
  331.     menu ();
  332. }
  333. /*========================================================================================================================================================*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement