Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "ctype.h"
- #include "string.h"
- #include "stdlib.h"
- #include "math.h"
- int dia=0, mes=0, ano, diaf=0, mesf=0, anof, j=0, x=0; //declaração de variáveis globais
- FILE *dataslidas, *saidaformatada;
- /*========================================================================================================================================================*/
- int datab1(char *str1) //função para converter a data incial com barras para inteiro
- {char str[10];
- int i, j, k, o;
- for(i=0; str1[i]!='/'; i++) //até a primeira barra
- str[i] = str1[i]; //str vai receber o dia
- str[i] = '\0';
- dia = atoi(str); //transforma a string para inteiro
- for(j=i+1, o=0; str1[j]!='/'; j++, o++) //até a primeira barra
- str[o] = str1[j]; //str vai receber o mes
- str[o] = '\0';
- mes = atoi(str); //transforma a string para inteiro
- for(k=j+1, o=0; str1[k]!='\0'; k++, o++) //até o final da string
- str[o] = str1[k]; //str vai receber o ano
- str[o] = '\0';
- ano = atoi(str); //transforma a string para inteiro
- }
- /*========================================================================================================================================================*/
- int datab2(char *str1) //função para converter a data final com barras para inteiro
- {char str[10];
- int i, j, k, o;
- for(i=0; str1[i]!='/'; i++) //até a primeira barra
- str[i] = str1[i]; //str vai receber o dia
- str[i] = '\0';
- diaf = atoi(str); //transforma a string para inteiro
- for(j=i+1, o=0; str1[j]!='/'; j++, o++) //até a primeira barra
- str[o] = str1[j]; //str vai receber o mes
- str[o] = '\0';
- mesf = atoi(str); //transforma a string para inteiro
- for(k=j+1, o=0; str1[k]!='\0'; k++, o++)//até o final da string
- str[o] = str1[k]; //str vai receber o ano
- str[o] = '\0';
- anof = atoi(str); //transforma a string para inteiro
- }
- /*========================================================================================================================================================*/
- int mesfunc(char *mes1)
- {int i;
- for(i=0; mes1[i]!='\0'; i++) //maiuscula recebe
- mes1[i] = tolower(mes1[i]); //minuscula
- if(!strcmp(mes1,"janeiro")) //---------------
- return 1; // |
- if(!strcmp(mes1,"fevereiro")) // |
- return 2; // Função |
- if(!strcmp(mes1,"março")) // |
- return 3; // que |
- if(!strcmp(mes1,"abril")) // |
- return 4; // retorna |
- if(!strcmp(mes1,"maio")) // |
- return 5; // o |
- if(!strcmp(mes1,"junho")) // |
- return 6; // inteiro |
- if(!strcmp(mes1,"julho")) // |
- return 7; // equivalente |
- if(!strcmp(mes1,"agosto")) // |
- return 8; // ao |
- if(!strcmp(mes1,"setembro")) // |
- return 9; // mes |
- if(!strcmp(mes1,"outubro")) // |
- return 10; // escrito |
- if(!strcmp(mes1,"novembro")) // |
- return 11; // |
- if(!strcmp(mes1,"dezembro")) // |
- return 12; //---------------
- return 0;
- }
- /*========================================================================================================================================================*/
- int datad1(char *str1) //função para converter a data inicial por extenso para inteiro
- {int i, j, k, o;
- char str[10], mes1[15];
- for(i=0; str1[i]!=' '; i++) //até o primeiro espaço
- str[i] = str1[i]; //str vai receber o dia
- str[i] = '\0';
- dia = atoi(str); //transforma a string para inteiro
- for(j=i+4, o=0; str1[j]!=' '; j++, o++) //até o primeiro espaço
- mes1[o] = str1[j]; //mes1 vai receber o mes
- mes1[o] = '\0';
- for(k=j+4, o=0; str1[k]!='\0'; k++, o++)//até o final da string
- str[o] = str1[k]; //str vai receber o ano
- str[o] = '\0';
- ano = atoi(str); //transforma a string para inteiro
- mes = mesfunc(mes1);
- }
- /*========================================================================================================================================================*/
- int datad2(char *str1) //função para converter a data final por extenso para inteiro
- {int i, j, k, o;
- char str[10], mes1[15];
- for(i=0; str1[i]!=' '; i++) //até o primeiro espaço
- str[i] = str1[i]; //str vai receber o dia
- str[i] = '\0';
- diaf = atoi(str); //transforma a string para inteiro
- for(j=i+4, o=0; str1[j]!=' '; j++, o++) //até o primeiro espaço
- mes1[o] = str1[j]; //mes1 vai receber o mes
- mes1[o] = '\0';
- for(k=j+4, o=0; str1[k]!='\0'; k++, o++) //até o final da string
- str[o] = str1[k]; //str vai receber o ano
- str[o] = '\0';
- anof = atoi(str); //transforma a string para inteiro
- mesf = mesfunc(mes1);
- }
- /*========================================================================================================================================================*/
- int ledata1() //função para ler a primeira data do teclado
- {int i, j, s;
- char c=' ', str1[100];
- puts("Escreva a data inicial(dd/mm/aaaa ou dia de mes de ano):");
- for(i=0; c!='\n'; i++) //---------------
- { scanf("%c", &c); //'for' para ler|
- str1[i] = c; //a data inicial|
- if((str1[i] == ' ' && str1[i-1] == ' ')||str1[0] == ' ')//e tirar os |
- i = i - 1; //epaços |
- } //---------------
- str1[i-1] = '\0'; //fecha a string
- if(str1[1]=='/'||str1[2]=='/'||str1[3]=='/') //se a data inicial for com barra
- { for(j=0; j<i; j++) //-----------------------
- { if(str1[j] == ' ') // tira os |
- { for(s=j; s<i; s++) // espaços |
- str1[s] = str1[s+1]; // antes |
- } // das barras |
- } //-----------------------
- datab1(str1); //chama a função datab1
- }
- else //se não for com barra
- datad1(str1); //chama a função datad1
- if(ano < 100 && ano <= 50) //------------------
- ano = ano + 2000; //por o ano inicial|
- if(ano < 100 && ano > 50) //com 4 casas |
- ano = ano + 1900; //------------------
- c = ' ';
- }
- /*========================================================================================================================================================*/
- int ledata1arq() //função para ler a primeira data do arquivo
- {int i, j, s;
- char c=' ', str1[100];
- for(i=0; c!='\n'; i++) //---------------
- { if(fscanf(dataslidas, "%c", &c)==1) //'for' para ler|
- str1[i] = c;
- else
- exit(0); //a data inicial|
- if((str1[i] == ' ' && str1[i-1] == ' ')||str1[0] == ' ')//e tirar os |
- i = i - 1; //epaços |
- } //---------------
- str1[i-1] = '\0'; //fecha a string
- if(str1[1]=='/'||str1[2]=='/'||str1[3]=='/') //se a data inicial for com barra
- { for(j=0; j<i; j++) //-----------------------
- { if(str1[j] == ' ') // tira os |
- { for(s=j; s<i; s++) // espaços |
- str1[s] = str1[s+1]; // antes |
- } // das barras |
- } //-----------------------
- datab1(str1); //chama a função datab1
- }
- else //se não for com barra
- datad1(str1); //chama a função datad1
- if(ano < 100 && ano <= 50) //------------------
- ano = ano + 2000; //por o ano inicial|
- if(ano < 100 && ano > 50) //com 4 casas |
- ano = ano + 1900; //------------------
- c = ' ';
- }
- /*========================================================================================================================================================*/
- int ledata2() //função para ler a segunda data do teclado
- {int i, j, s;
- char c=' ', str2[100];
- puts("Escreva a data final(dd/mm/aaaa ou dia de mes de ano):");
- for(i=0; c!='\n'; i++) //---------------
- { scanf("%c", &c); //'for' para ler|
- str2[i] = c; //a data final |
- if((str2[i] == ' ' && str2[i-1] == ' ')||str2[0] == ' ')//e tirar os |
- i = i - 1; //espaços |
- } //---------------
- str2[i-1] = '\0'; //fecha a string
- if(str2[1]=='/'||str2[2]=='/'||str2[3]=='/') //se a data final for com barra
- { for(j=0; j<i; j++) //-----------------------
- { if(str2[j] == ' ') // tira os |
- { for(s=j; s<i; s++) // espaços |
- str2[s] = str2[s+1]; // antes |
- } // das barras |
- } //-----------------------
- datab2(str2); //chama a função datab2
- }
- else //se não for com barra
- datad2(str2); //chama a função datad2
- if(anof < 100 && anof <= 50) //----------------
- anof = anof + 2000; //por o ano final|
- if(anof < 100 && anof > 50) //com 4 casas |
- anof = anof + 1900; //----------------
- c = ' ';
- }
- /*========================================================================================================================================================*/
- int ledata2arq() //função para ler a segunda data do arquivo
- {int i, j, s;
- char c=' ', str2[100];
- for(i=0; c!='\n'; i++) //---------------
- { if(fscanf(dataslidas, "%c", &c)==1) //'for' para ler|
- str2[i] = c;
- else
- exit(0); //a data final |
- if((str2[i] == ' ' && str2[i-1] == ' ')||str2[0] == ' ')//e tirar os |
- i = i - 1; //espaços |
- } //---------------
- str2[i-1] = '\0'; //fecha a string
- if(str2[1]=='/'||str2[2]=='/'||str2[3]=='/') //se a data final for com barra
- { for(j=0; j<i; j++) //-----------------------
- { if(str2[j] == ' ') // tira os |
- { for(s=j; s<i; s++) // espaços |
- str2[s] = str2[s+1]; // antes |
- } // das barras |
- } //-----------------------
- datab2(str2); //chama a função datab2
- }
- else //se não for com barra
- datad2(str2); //chama a função datad2
- if(anof < 100 && anof <= 50) //----------------
- anof = anof + 2000; //por o ano final|
- if(anof < 100 && anof > 50) //com 4 casas |
- anof = anof + 1900; //----------------
- c = ' ';
- }
- /*========================================================================================================================================================*/
- int dataval() //função para ver se uma data dada pelo usuário existe e é válida
- {int k=1, d, m, a;
- 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
- { 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))))
- puts("\nData inválida\n"); //se o dia inserido foi 29 e o ano não é bissexto
- else
- { if((ano>anof)||(ano==anof && mes>mesf)||(ano==anof && mes==mesf && dia>diaf))
- { d = dia; m = mes; a = ano; //a data maior |
- dia = diaf; mes = mesf; ano = anof; //recebe a |
- diaf = d; mesf = m; anof = a; //data menor |
- } //---------------
- 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; //------------------------------------------
- dia--; x=1; //se tanto o dia inicial quanto o dia final|
- diaf--; j=1; //forem 29 e os anos forem bissextos |
- } //------------------------------------------
- else
- { if((ano%4==0&&((ano%100!=0)||(ano%400==0)))&&(dia==29&&mes==2))
- { k = 0; //se somente o dia inicial |
- dia--; x=1; //for 29 e o ano for bissexto|
- } //----------------------------
- else
- { if((anof%4==0&&((anof%100!=0)||(anof%400==0)))&&(diaf==29&&mesf==2))
- { k = 0; //se somente o dia final |
- diaf--; j=1; //for 29 e o anof for bissexto |
- } //-------------------------------
- else
- k = 0; //se for válida
- }
- }
- }
- }
- else
- puts("\nData inválida\n");
- return k;
- }
- /*========================================================================================================================================================*/
- int func(int d, int m, int a, int df, int mf, int af, int n) //função recursiva para calcular os dias passados
- {
- if(d == df && m == mf && a == af) //se o dia chegou no diafinal, o mes chegou no mesfinal e o ano chegou no anofinal
- return n-1; //retorna o número de dias
- 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))
- 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
- else //-------------------------------------------------------
- { if(m == 12 && d == 31) //se for o ultimo dia do ultimo mes do ano |
- func(1, 1, a+1, df, mf, af, n+1); //chama a função com o primeiro dia e mes do próximo ano|
- else //-------------------------------------------------------
- func(d+1, m, a, df, mf, af, n+1); //chama a função acrescentando um dia |
- }
- }
- /*========================================================================================================================================================*/
- int bissexto (int dias) {
- int i;
- for (i=ano; i<=anof; i++)
- if ((i%4==0)&&(i%100!=0)&&(i%400==0))
- if((ano==anof&&mes<=2&&mesf>2)||(ano<anof&&mes<=2)||(i!=ano&&i!=anof)||(i==anof&&mesf>2)||(i=anof&&j))
- dias++;
- return dias;
- }
- /*========================================================================================================================================================*/
- void menu () {
- int i, dias, k=1, z=1, x=1;
- char str[10], res;
- saidaformatada = fopen("formatadas.txt", "a");
- puts("-----------------------\n|(1) - Data do teclado|\n|(2) - Data do arquivo|\n-----------------------");
- scanf("%c%*c", &res); //le o char e limpa o buffer
- if(res == '1')
- { while(k) //enquanto não for válida
- { ledata1(); //chama função para ler a primeira data
- ledata2(); //chama função para ler a segunda data
- k = dataval(); //chama a função para receber a data e verificar se ela é válida
- }
- dias = func(dia, mes, ano, diaf, mesf, anof, 0); //chama a função func para calcular os dias passados
- 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);
- printf("\n%d dia(s)\n\n", dias);
- }
- if(res == '2')
- { dataslidas = fopen("bancoDadosDatas.txt", "r");
- if(dataslidas == NULL)
- { puts("Não existe esse arquivo.");
- dataslidas = fopen("bancoDadosDatas.txt", "w");
- exit(0);
- }
- while(!feof(dataslidas)) //enquanto não for o final do arquivo
- { ledata1arq(); //le a primeira data
- ledata2arq(); //le a segunda data
- x = dataval();
- if(!x)
- { dias = func(dia, mes, ano, diaf, mesf, anof, 0)+1; //chama a função func para calcular os dias passados
- dias = bissexto(dias); //ver se existe anos bissexto
- printf("\n%d/%d/%d - %d/%d/%d = %d dia(s)\n\n", dia, mes, ano, diaf, mesf, anof, dias);
- 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);
- }
- else
- puts("Data do arquivo está incorreta");
- }
- fclose(dataslidas);
- }
- fclose(saidaformatada);
- }
- /*========================================================================================================================================================*/
- main()
- {
- menu ();
- }
- /*========================================================================================================================================================*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement