Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.62 KB | None | 0 0
  1. //Compilador GCC GNU/LINUX - UBUNTU 10.04
  2. #include "stdio.h"
  3. #include "ctype.h"
  4. #include "string.h"
  5. #include "stdlib.h"
  6. #include "math.h"
  7.  
  8.  
  9. int dia=0, mes=0, ano, diaf=0, mesf=0, anof, p=0, x=0;
  10. FILE *dataslidas, *saidaformatada;
  11.  
  12.  
  13. int barras_inicio(char *str1)   //função para converter a data incial com barras para inteiro************************************
  14. {char str[10];
  15.  int i, j, k, o;
  16.     for(i=0; str1[i]!='/'; i++) //até a primeira barra
  17.         str[i] = str1[i];   //str vai receber o dia
  18.     str[i] = '\0';
  19.     dia = atoi(str);    //transforma a string para inteiro
  20.     for(j=i+1, o=0; str1[j]!='/'; j++, o++) //até a primeira barra
  21.         str[o] = str1[j];       //str vai receber o mes
  22.     str[o] = '\0';
  23.     mes = atoi(str);    //transforma a string para inteiro
  24.     for(k=j+1, o=0; str1[k]!='\0'; k++, o++)    //até o final da string
  25.         str[o] = str1[k];           //str vai receber o ano
  26.     str[o] = '\0';
  27.     ano = atoi(str);    //transforma a string para inteiro
  28. }
  29.  
  30.  
  31. int barras_final(char *str1)    //função para converter a data final com barras para inteiro ***************************************8
  32. {char str[10];
  33.  int i, j, k, o;
  34.     for(i=0; str1[i]!='/'; i++)     //até a primeira barra
  35.         str[i] = str1[i];       //str vai receber o dia
  36.     str[i] = '\0';
  37.     diaf = atoi(str);           //transforma a string para inteiro
  38.     for(j=i+1, o=0; str1[j]!='/'; j++, o++) //até a primeira barra
  39.         str[o] = str1[j];       //str vai receber o mes
  40.     str[o] = '\0';
  41.     mesf = atoi(str);           //transforma a string para inteiro
  42.     for(k=j+1, o=0; str1[k]!='\0'; k++, o++)//até o final da string
  43.         str[o] = str1[k];       //str vai receber o ano
  44.     str[o] = '\0';
  45.     anof = atoi(str);           //transforma a string para inteiro
  46. }
  47.  
  48.  
  49. int func_mes(char *mes1) //*******************************************
  50. {int i;
  51.     for(i=0; mes1[i]!='\0'; i++)        //maiuscula recebe
  52.         mes1[i] = tolower(mes1[i]); //minuscula
  53.     if(!strcmp(mes1,"janeiro")) //---------------
  54.         return 1;       //      |
  55.     if(!strcmp(mes1,"fevereiro"))   //      |
  56.         return 2;       //   Função   |
  57.     if(!strcmp(mes1,"março"))  //      |
  58.         return 3;       //    que   |
  59.     if(!strcmp(mes1,"abril"))   //      |
  60.         return 4;       //  retorna |
  61.     if(!strcmp(mes1,"maio"))    //      |
  62.         return 5;       //     o    |
  63.     if(!strcmp(mes1,"junho"))   //      |
  64.         return 6;       //  inteiro |
  65.     if(!strcmp(mes1,"julho"))   //      |
  66.         return 7;       // equivalente  |
  67.     if(!strcmp(mes1,"agosto"))  //      |
  68.         return 8;       //    ao    |
  69.     if(!strcmp(mes1,"setembro"))    //      |
  70.         return 9;       //    mes   |
  71.     if(!strcmp(mes1,"outubro")) //      |
  72.         return 10;      //  escrito |
  73.     if(!strcmp(mes1,"novembro"))    //      |
  74.         return 11;      //      |
  75.     if(!strcmp(mes1,"dezembro"))    //      |
  76.         return 12;      //---------------
  77.     return 0;
  78. }
  79.  
  80. /*Função que recebe uma string relacionada à data inicial em extenso ( DD de Mes de AAAA ) coloca os valores de mes e ano em variáveis int e a de mes em um string para comparação na função func_mes();*/
  81. int extenso_inicio(char *str1) 
  82. {int i, j, k, o;
  83.  char str[10], mes1[15];
  84.     for(i=0; str1[i]!=' '; i++)    
  85.         str[i] = str1[i];      
  86.     str[i] = '\0';
  87.     dia = atoi(str);           
  88.     for(j=i+4, o=0; str1[j]!=' '; j++, o++)
  89.         mes1[o] = str1[j];     
  90.     mes1[o] = '\0';
  91.     for(k=j+4, o=0; str1[k]!='\0'; k++, o++)
  92.         str[o] = str1[k];      
  93.     str[o] = '\0';
  94.     ano = atoi(str);           
  95.     mes = func_mes(mes1);
  96. }
  97.  
  98. /*Função que recebe uma string relacionada à data final em extenso ( DD de Mes de AAAA ) coloca os valores de mes e ano em variáveis int e a de mes em um string para comparação na função func_mes();*/
  99. int extenso_final(char *str1)  
  100. {int i, j, k, o;
  101.  char str[10], mes1[15];
  102.     for(i=0; str1[i]!=' '; i++)        
  103.         str[i] = str1[i];          
  104.     str[i] = '\0';
  105.     diaf = atoi(str);              
  106.     for(j=i+4, o=0; str1[j]!=' '; j++, o++)    
  107.         mes1[o] = str1[j];         
  108.     mes1[o] = '\0';
  109.     for(k=j+4, o=0; str1[k]!='\0'; k++, o++)   
  110.         str[o] = str1[k];          
  111.     str[o] = '\0';
  112.     anof = atoi(str);              
  113.     mesf = func_mes(mes1);
  114. }
  115.  
  116. /*Função que le a data inicial inserida pelo usuário*/
  117. int ins_inicio(){
  118.     int i, j, s;
  119.     char c=' ', str1[100];
  120.     puts("Escreva a data inicial(dd/mm/aaaa ou dia de mes de ano):");
  121.     for(i=0; c!='\n'; i++){                    
  122.         scanf("%c", &c);                   
  123.         str1[i] = c;                       
  124.         if((str1[i] == ' ' && str1[i-1] == ' ')||str1[0] == ' ')
  125.             i = i - 1;                 
  126.     }                              
  127.     str1[i-1] = '\0';              
  128.     if(str1[1]=='/'||str1[2]=='/'||str1[3]=='/'){  
  129.         for(j=0; j<i; j++)  {          
  130.             if(str1[j] == ' ')  {      
  131.                 for(s=j; s<i; s++)     
  132.                     str1[s] = str1[s+1];   
  133.             }                  
  134.         }                      
  135.         barras_inicio(str1);               
  136.     }
  137.     else                       
  138.         extenso_inicio(str1);              
  139.     if(ano < 100 && ano <= 50) 
  140.         ano = ano + 2000;  
  141.     if(ano < 100 && ano > 50)  
  142.         ano = ano + 1900;  
  143.     c = ' ';
  144. }
  145.  
  146. /*Função que le a string de primeira data do arquivo*/
  147. int inicio_arq()    {
  148. int i, j, s;
  149.  char c=' ', str1[100];
  150.     for(i=0; c!='\n'; i++){                
  151.         if(fscanf(dataslidas, "%c", &c)==1)        
  152.             str1[i] = c;
  153.         else
  154.             exit(0);                   
  155.         if((str1[i] == ' ' && str1[i-1] == ' ')||str1[0] == ' ')
  156.             i = i - 1;                 
  157.     }                          
  158.     str1[i-1] = '\0';  
  159.     if(str1[1]=='/'||str1[2]=='/'||str1[3]=='/'){  
  160.         for(j=0; j<i; j++)  {          
  161.             if(str1[j] == ' ')  {      
  162.                 for(s=j; s<i; s++)     
  163.                     str1[s] = str1[s+1];   
  164.             }                  
  165.         }                      
  166.         barras_inicio(str1);       
  167.     }
  168.     else           
  169.         extenso_inicio(str1);  
  170.     if(ano < 100 && ano <= 50) 
  171.         ano = ano + 2000;  
  172.     if(ano < 100 && ano > 50)  
  173.         ano = ano + 1900;  
  174.     c = ' ';
  175. }
  176.  
  177. /*Função que le a data final inserida pelo usuário*/
  178. int ins_final() {
  179.     int i, j, s;
  180.     char c=' ', str2[100];
  181.     puts("Escreva a data final(dd/mm/aaaa ou dia de mes de ano):");
  182.     for(i=0; c!='\n'; i++)      {          
  183.         scanf("%c", &c);                   
  184.         str2[i] = c;                       
  185.         if((str2[i] == ' ' && str2[i-1] == ' ')||str2[0] == ' ')
  186.             i = i - 1;                 
  187.     }                          
  188.     str2[i-1] = '\0';  
  189.     if(str2[1]=='/'||str2[2]=='/'||str2[3]=='/'){  
  190.         for(j=0; j<i; j++)  {          
  191.             if(str2[j] == ' '){        
  192.                 for(s=j; s<i; s++)     
  193.                     str2[s] = str2[s+1];   
  194.             }                  
  195.         }                      
  196.         barras_final(str2);    
  197.     }
  198.     else           
  199.         extenso_final(str2);   
  200.     if(anof < 100 && anof <= 50)   
  201.         anof = anof + 2000;
  202.     if(anof < 100 && anof > 50)
  203.         anof = anof + 1900;
  204.     c = ' ';
  205. }
  206.  
  207. /*Função que le a string de segunda data do arquivo*/
  208. int final_arq(){
  209.     int i, j, s;
  210.     char c=' ', str2[100];
  211.     for(i=0; c!='\n'; i++){                    
  212.         if(fscanf(dataslidas, "%c", &c)==1)        
  213.             str2[i] = c;
  214.         else
  215.             exit(0);                   
  216.         if((str2[i] == ' ' && str2[i-1] == ' ')||str2[0] == ' ')
  217.             i = i - 1;                 
  218.     }                              
  219.     str2[i-1] = '\0';  
  220.     if(str2[1]=='/'||str2[2]=='/'||str2[3]=='/'){
  221.         for(j=0; j<i; j++){        
  222.             if(str2[j] == ' '){    
  223.                 for(s=j; s<i; s++)     
  224.                     str2[s] = str2[s+1];   
  225.             }                  
  226.         }                      
  227.         barras_final(str2);    
  228.     }
  229.     else           
  230.         extenso_final(str2);   
  231.     if(anof < 100 && anof <= 50)   
  232.         anof = anof + 2000;
  233.     if(anof < 100 && anof > 50)
  234.         anof = anof + 1900;
  235.     c = ' ';
  236. }
  237.  
  238. /*Função que determina se as datas analisadas pelo programa (depois de inserido pelo usuário ou pelo arquivo) existem e define qual data é posterior, de modo que, o programa consiga calcular datas de tras para frente e mostre quantos dias existem entre as datas*/
  239. int dataval(){
  240. int k=1, d, m, a;
  241.     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)){
  242.         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))))
  243.             printf("\nA data inserida é inválida.\n");
  244.         else{
  245.             if((ano>anof)||(ano==anof && mes>mesf)||(ano==anof && mes==mesf && dia>diaf)){
  246.                 d = dia; m = mes; a = ano;     
  247.                 dia = diaf; mes = mesf; ano = anof;
  248.                 diaf = d; mesf = m; anof = a;      
  249.             }                       //---------------
  250.             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)))   {      
  251.                     k = 0;
  252.                     dia--;  x=1;   
  253.                     diaf--; p=1;   
  254.             }              
  255.             else{
  256.                 if((ano%4==0&&((ano%100!=0)||(ano%400==0)))&&(dia==29&&mes==2)){
  257.                         k = 0; 
  258.                         dia--; x=1;    
  259.                 }              
  260.                 else{
  261.                     if((anof%4==0&&((anof%100!=0)||(anof%400==0)))&&(diaf==29&&mesf==2)){
  262.                             k = 0;     
  263.                             diaf--; p=1;   
  264.                     }              
  265.                     else
  266.                         k = 0;
  267.                 }
  268.             }
  269.         }
  270.     }
  271.     else
  272.         printf("\nA data inserida é inválida.\n");
  273.     return k;
  274. }
  275.  
  276. /*Função recursiva que recebe os valores inteiros de dia, mes e ano, inicial e final, e recursivamente, vai contando os dias*/
  277. int func(int d, int m, int a, int df, int mf, int af, int n){
  278.     if(d == df && m == mf && a == af)
  279.         return n-1;            
  280.     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))
  281.         func(1, m+1, a, df, mf, af, n+1);
  282.     else{                          
  283.         if(m == 12 && d == 31)             
  284.             func(1, 1, a+1, df, mf, af, n+1);  
  285.         else
  286.             func(d+1, m, a, df, mf, af, n+1);  
  287.     }
  288.  
  289.    
  290. }
  291.  
  292. /*Função que acrescenta os dias dos anos bissextos*/
  293. int ano_bissexto (int dias) {
  294.     int i;
  295.     for (i=ano; i<=anof; i++)
  296.         if ((i%4==0)&&(i%100!=0)&&(i%400==0))
  297.             if((ano==anof&&mes<=2&&mesf>2)||(ano<anof&&mes<=2)||(i!=ano&&i!=anof)||(i==anof&&mesf>2)||(i=anof&&p))
  298.                 dias++;
  299.     return dias;
  300. }
  301.  
  302. /*Função chamada diretamente pela main, que o usuário entra com a opção de seu interesse caso insira a opção 1, o usuario devera inserir as datas necessarias, caso insira a opção 2 o usuário irá receber as datas qe estão presentes no arquivo bancoDadosDatas.txt*/
  303. void menu () {
  304.     int i, dias, k=1, z=1, x=1;
  305.     char str[10], res;
  306.     saidaformatada = fopen("formatadas.txt", "a");
  307.     puts("-----------------------\n|(1) - Data do teclado|\n|(2) - Data do arquivo|\n-----------------------");
  308.     scanf("%c%*c", &res);  
  309.     switch (res){
  310.         case 1: {
  311.             while(k)   
  312.             {   ins_inicio();  
  313.                 ins_final();   
  314.                 k = dataval(); 
  315.             }
  316.             dias = func(dia, mes, ano, diaf, mesf, anof, 0);   
  317.             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);
  318.             printf("\n%d dia(s)\n\n", dias);
  319.         break;
  320.         }
  321.         case 2: {
  322.             dataslidas = fopen("bancoDadosDatas.txt", "r");
  323.             if(dataslidas == NULL)
  324.             {   puts("Não existe esse arquivo.");
  325.                 dataslidas = fopen("bancoDadosDatas.txt", "w");
  326.                 exit(0);
  327.             }
  328.             while(!feof(dataslidas))   
  329.             {   inicio_arq();  
  330.                 final_arq();   
  331.                 x = dataval();
  332.                 if(!x)
  333.                 {   dias = func(dia, mes, ano, diaf, mesf, anof, 0)+1; 
  334.                     dias = ano_bissexto(dias); 
  335.                     printf("\n%d/%d/%d - %d/%d/%d = %d dia(s)\n\n", dia, mes, ano, diaf, mesf, anof, dias);
  336.                     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);
  337.                 }
  338.                 else
  339.                     puts("Data do arquivo está incorreta");
  340.             }
  341.             fclose(dataslidas);
  342.             break;
  343.         }
  344.     fclose(saidaformatada);
  345.     }
  346. }  
  347.  
  348. main(){
  349.     menu ();
  350. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement