#include int tipoano = 0; /*tipoano 0 eh ano nao biss E tipoano 1 e ano biss */ int ano = 0; float resto = 0; int diasmes = 0; int mes = 0; int dia1 = 0; int dia2 = 0; int mes1 = 0; int mes2 = 0; int ano1 = 0; int ano2 = 0; int erro1 = 0; /*erro que o dia nao pertence ao mes */ int erro2 = 0; /*erro que o dia 29 do 2 nao existe no ano dado ou que o ano e nulo */ int erro3 = 0; /*erro que o dia nao esta primeiramente entre 1 e 31 */ int erro4 = 0; /*erro que o mes nao esta primeiramente entre 1 e 12 */ int primeirodiadomes2 = 1; /*ao inves de tantas variaveis erro eu posso usar break*/ int checano(int ano) { resto = ano % 400; if (resto == 0) { tipoano = 1; } else { float resto2 = 0; float resto3 = 0; resto2 = ano % 4; resto3 = ano % 10; if (resto2 == 0 && resto3 != 0) { tipoano = 1; } else { tipoano = 0; } } return tipoano; } int tipomes(int mes, int ano) { if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) { diasmes = 31; } else if (mes == 4 || mes == 6 || mes == 9 || mes == 11) { diasmes = 30; } else if (mes == 2) { checano(ano); if (tipoano == 1) { diasmes = 29; } else if (tipoano == 0) { diasmes = 28; } } return diasmes; } int main() { do { do { printf ("\nEste programa calcula quantos dias existem entre duas datas.\nDigite o dia da primeira data: "); scanf("%d", &dia1); /*o dia precisa ser entre 1 e 31 inicialmente */ if (dia1 > 31 || dia1 < 1) { printf ("\nO dia precisa estar entre 1 e 31\n Entre novamente com os dados"); erro3 = 1; } else { erro3 = 0; } } while (erro3 == 1); do { do { printf ("\nDigite o mes da primeira data: "); scanf("%d", &mes1); if (mes1 < 1 || mes1 > 12) { printf ("\nO mes precisa ser entre 1 e 12\n Entre novamente com os dados"); erro4 = 1; } else { erro4 = 0; } } while (erro4 == 1); /*primeiro checar se o mes esta entre 1 e 31 */ /*checar se nao tem um erro no dia por mes */ tipomes(mes1, ano1); if (dia1 > diasmes) { printf ("\nO dia %d digitado nao existe no mes %d\n Entre com os dados novamente", dia1, mes1); erro1 = 1; } /*acho que isso nao precisa ja que eu checo se o dia e nulo ou nao no momento em que ele e digitado e deve estar entre 1 e 31 ou 1 e 12 else if ( dia1==0 || mes1==0) { printf("\nNao existem meses ou dias nulos\n Entre com os dados novamente"); erro1=1; } */ else { erro1 = 0; } } while (erro1 == 1); printf("\nDigite o ano (por extenso) da primeira data: "); scanf("%d", &ano1); /*checar se o dia digitado for 29/02 de um ano nao bissexto */ checano(ano1); if (mes1 == 2 && tipoano == 0 && dia1 == 29) { printf ("\nVoce escolheu o dia 29/2 de um ano nao bissexto, entre com os dados novamente"); erro2 = 1; } else if (ano1 == 0) { printf("\nNao existem anos nulos"); erro2 = 1; } else { erro2 = 0; } } while (erro2 == 1); do { printf("\nAgora digite o dia da segunda data: "); scanf("%d", &dia2); if (dia2 > 31 || dia2 < 1) { printf ("\nO dia precisa estar entre 1 e 31\n Entre novamente com os dados"); erro3 = 1; } else { erro3 = 0; } } while (erro3 == 1); do { do { printf("\nDigite o mes da segunda data: "); scanf("%d", &mes2); if (mes2 < 1 || mes2 > 12) { printf ("\nO mes precisa ser entre 1 e 12\n Entre novamente com os dados"); erro4 = 1; } else { erro4 = 0; } } while (erro4 == 1); /*primeiro checar se o mes esta entre 1 e 31 */ /*checar se nao tem um erro no dia por mes */ tipomes(mes2, ano2); if (dia2 > diasmes) { printf ("\nO dia %d digitado nao existe no mes %d\n Entre com os dados novamente", dia1, mes1); erro1 = 1; } /*acho que isso nao precisa ja que eu checo se o dia e nulo ou nao no momento em que ele e digitado e deve estar entre 1 e 31 ou 1 e 12 else if ( dia1==0 || mes1==0) { printf("\nNao existem meses ou dias nulos\n Entre com os dados novamente"); erro1=1; } */ else { erro1 = 0; } } while (erro1 == 1); do { printf("\nDigite o ano (por extenso) da segunda data: "); scanf("%d", &ano2); /*checar se o dia digitado for 29/02 de um ano nao bissexto */ checano(ano2); if (mes2 == 2 && tipoano == 0 && dia2 == 29) { printf ("\nVoce escolheu o dia 29/2 de um ano nao bissexto, entre com os dados novamente"); erro2 = 1; } else if (ano2 == 0) { printf("\nNao existem anos nulos"); erro2 = 1; } else { erro2 = 0; } } while (erro2 == 1); /*-----------==========__comeco do calculo de dias__=======--------------*/ if (ano2 < ano1) { /*inversao de datas no caso do usuario digitar o ano2 menor que o ano1 */ int temp = 0; ano1 = temp; ano1 = ano2; ano2 = temp; mes1 = temp; mes1 = mes2; mes2 = temp; dia1 = temp; dia1 = dia2; dia2 = temp; } else if (ano1 == ano2 && mes2 > mes1) { /*para o caso de anos iguais e meses invertidos */ int temp = 0; mes1 = temp; mes1 = mes2; mes2 = temp; dia1 = temp; dia1 = dia2; dia2 = temp; } else { } /*o programa nao esta continuando, porque? */ int contador = 1; /*para incluir o dia1 nas contas */ /*checar se as datas sao iguais, se forem printar 0 dias */ if (ano1 == ano2 && mes1 == mes2 && dia1 == dia2) { printf("\nExistem 0 dias entre o dia %d e o dia %d.", dia1, dia2); } /*checar se os anos e meses sao iguais, se forem fazer do dia1 ate o dia2 */ else if (ano1 == ano2 && mes1 == mes2) { int numerodiasAMig; /*para numero de dias em que os anos e meses sao iguais */ numerodiasAMig = dia2 - dia1; printf ("O numero de dias entre %d/%d/%d e %d/%d/%d e de %d", dia1, mes1, ano1, dia2, mes2, ano2, numerodiasAMig); } /*aqui calcula-se o intevalo no caso de somente anos iguais*/ else if (ano1 == ano2 && mes1 != mes2 && dia1 != dia2) { /*calcular o numero de dias do dia1 ate o fim do mes1 */ tipomes(mes1, ano1); while (dia1 < diasmes); { contador++; dia1++; } /*checar se os anos sao iguais, se forem fazer do final do mes1 ate o inicio do mes2 e do inicio do mes2 ate o dia2 */ /*nao tem-se que checar se esse ano digitado e ou nao bissexto pois o a funcao tipomes ja faz isso quando checa o mes de fevereiro que e o problema aqui */ /*variavel tipo array nescessaria para a contagem dos dias dos diferentes meses */ int tempmes = 0; /*ou seja ele pega o mes 1 que nao precisa mais contar e vai pro mes1+1 e vai saber quantos dias esse tem */ tempmes = mes1 + 1; /*ate aqui o contador tem o numero de dias do dia1 ate o final do mes1, agora falta saber quantos dias tem do final do mes1 ate o inicio do mes 2 */ while (tempmes < mes2) { tipomes(tempmes, ano1); contador = diasmes + contador; tempmes++; } /*agora o contador tem do dia1 ate o inicio do mes2 */ while (primeirodiadomes2 = dia2) { /*coloquei igual ao inves de menor pois como contou-se o primeiro dia com contador=1 conta-se o ultimo */ contador++; primeirodiadomes2++; } int diasentre = 0; diasentre = contador - 2; printf ("\n Os dias entre a data %d/%d/%d e %d/%d/%d e de %d dias.", dia1, mes1, ano1, dia2, mes2, ano2, diasentre); } else { while (ano1 != ano2 && mes1 != mes2 && dia1 != dia2) { /*a contagem vai parar quando o dia1=dia2 mes1=mes2 ano1=ano2 */ /*zerar o contadorb */ /*calcular quantos dias tem do dia1 ate o final do mes1, se possivel usar o calculo anterior caso ano igual mes diferente */ /*calcular quantos dias tem do final do mes1 ate o fim do ano1 */ /*calcular quantos dias tem do final do ano1 ate o comeco do ano2 */ /*qtos dias tem do comeco do ano2 ate o inicio do mes2 */ /*qtos dias tem do inicio do mes2 ate o dia2 se possivel usar o calculo anterior caso ano igual mes diferente */ } } return 0; }