Fórum Manipulação de datas sem funções JAVA #536873

10/11/2015

0

Boa noite pessoal,

Sou estudante de programação e recebi um desafio na cadeira de Algoritmos onde devo calcular a diferença entre datas no formato dd/mm/aaaa, porém sem usar nenhuma função do JAVA como Date, Calendar etc., posso só usa o Scanner. O problema maior é os anos bissextos. Por gentileza, alguém pode me ajudar?
Ismael

Ismael

Responder

Post mais votado

06/12/2015

Abaixo o trabalho pronto...

package trabalho.datas;

import java.util.Scanner;

class TrabalhoDatas {

    public static void main(String[] args) throws java.lang.Exception {

        int dia_inicio, mes_inicio, ano_inicio, dia_fim, mes_fim, ano_fim;
        int ano, mes, dia;
        int intervalo[], dias_do_mes, dia_do_mes1, dia_do_mes2;
        int cont_dia = 0, cont_mes = 0, cont_ano = 0;

        /* meses do ano = não importa quantos dias o mês possui, o importante é passar o intervalo 
        correto de todo mes, ano e somar cada um deles no fim do mesmo*/
        intervalo = new int[13];
        intervalo[1] = 31;
        intervalo[2] = 28;
        intervalo[3] = 31;
        intervalo[4] = 30;
        intervalo[5] = 31;
        intervalo[6] = 30;
        intervalo[7] = 31;
        intervalo[8] = 31;
        intervalo[9] = 30;
        intervalo[10] = 31;
        intervalo[11] = 30;
        intervalo[12] = 31;

        /* abaixo entrada de dados pelo usuário "obrigatório nesse formato, senão
        o algoritmo não rodará e dará bug */
        String resulta1 = "", resulta2 = "", resulta3 = "";
        Scanner entrada = new Scanner(System.in);
        System.out.println("Digite a data inicial no formato dd/mm/aaaa: ");
        String data_inicio[] = entrada.next().split("\\/");
        dia_inicio = Integer.parseInt(data_inicio[0]);
        mes_inicio = Integer.parseInt(data_inicio[1]);
        ano_inicio = Integer.parseInt(data_inicio[2]);
        System.out.println("Digite a data final no formato dd/mm/aaaa: ");
        String data_fim[] = entrada.next().split("\\/");
        dia_fim = Integer.parseInt(data_fim[0]);
        mes_fim = Integer.parseInt(data_fim[1]);
        ano_fim = Integer.parseInt(data_fim[2]);

        /* abaixo calculo do ano se é bissexto ou não segundo calendario gregoriano 
        Fonte: https://pt.wikipedia.org/wiki/Ano_bissexto */
        if (mes_inicio == 2) {
            if ((ano_inicio % 400 == 0) || ((ano_inicio % 4 == 0) && (ano_inicio % 100 != 0))) {
                dia_do_mes1 = 29;
            } else {
                dia_do_mes1 = 28;
            }
        } else {
            dia_do_mes1 = intervalo[mes_inicio];
        }
        if (mes_fim == 2) {
            if ((ano_fim % 400 == 0) || ((ano_fim % 4 == 0) && (ano_fim % 100 != 0))) {
                dia_do_mes2 = 29;
            } else {
                dia_do_mes2 = 28;
            }
        } else {
            dia_do_mes2 = intervalo[mes_fim];
        }
        
        //abaixo ele processa a entrada de dados e se negativos gera um comentário de bug
        if (ano_fim < ano_inicio
                || (ano_fim == ano_inicio && mes_fim < mes_inicio)
                || (ano_fim == ano_inicio && mes_fim == mes_inicio && dia_fim < dia_inicio)
                || (dia_inicio > dia_do_mes1 || dia_fim > dia_do_mes2)
                || (dia_inicio < 0 || dia_fim < 0 || mes_inicio < 0 || mes_fim < 0 || ano_inicio < 0 || ano_fim < 0)) {
            System.out.println("BUG  -  Favor retornar com uma data válida!");
        } else {
            
            //abaixo inicio da contagem da diferença de datas
            ano = ano_inicio;
            mes = mes_inicio;
            dia = dia_inicio;
            while (!(ano == ano_fim && mes == mes_fim && dia == dia_fim)) {
                if (mes == 2) {
                    if ((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))) {
                        dias_do_mes = 29;
                    } else {
                        dias_do_mes = 28;
                    }
                } else {
                    dias_do_mes = intervalo[mes];
                }
                
                // abaixo começa contando os dias, meses e anos
                if ((mes == mes_fim && ano == ano_fim)
                        || (mes == mes_inicio && ano == ano_inicio)
                        && dia < dias_do_mes) {
                    cont_dia += 1;
                    dia += 1;
                } else {
                    if (dia == 31 && mes == 12) {
                        cont_dia += 1;
                        ano += 1;
                        mes = 1;
                        dia = 1;
                    } else if (dia == dias_do_mes) {
                        cont_dia += 1;
                        mes += 1;
                        dia = 1;
                    } else if (dia < dias_do_mes) {
                        cont_dia += 1;
                        dia += 1;
                    }
                }
                if ((dia_inicio <= dias_do_mes && dia_inicio == dia)
                        || (dia_inicio > dias_do_mes && dia == dias_do_mes)) {
                    cont_dia = 0;
                    cont_mes += 1;
                    if (cont_mes == 12) {
                        cont_ano += 1;
                        cont_mes = 0;
                    }
                }

            }
        }

        //aqui começa os resultados do fim do algoritmo e como aparecerá na impressão
        if (cont_ano != 0) {
            if (cont_ano == 1 && cont_dia == 0 && cont_mes == 0) {
                resulta1 = cont_ano + " ano.";
            }
            if (cont_ano == 1 && (cont_dia > 0 && cont_mes > 0)) {
                resulta1 = cont_ano + " ano, ";
            } else if (cont_ano == 1 && (cont_dia > 0 || cont_mes > 0)) {
                resulta1 = cont_ano + " ano e ";
            }
            if (cont_ano > 1 && cont_dia == 0 && cont_mes == 0) {
                resulta1 = cont_ano + " anos.";
            }
            if (cont_ano > 1 && cont_dia > 0 && cont_mes > 0) {
                resulta1 = cont_ano + " anos, ";
            } else if (cont_ano > 1 && (cont_dia > 0 || cont_mes > 0)) {
                resulta1 = cont_ano + " anos e ";
            }
        }
        if (cont_mes
                != 0) {
            if (cont_mes == 1 && cont_dia == 0) {
                resulta2 = cont_mes + " mês.";
            }
            if (cont_mes == 1 && cont_dia > 0) {
                resulta2 = cont_mes + " mês e ";
            }
            if (cont_mes > 1 && cont_dia > 0) {
                resulta2 = cont_mes + " meses e ";
            }
            if (cont_mes > 1 && cont_dia == 0) {
                resulta2 = cont_mes + " meses.";
            }
        }
        if (cont_dia
                != 0) {
            if (cont_dia == 1) {
                resulta3 = cont_dia + " dia.";
            }
            if (cont_dia > 1) {
                resulta3 = cont_dia + " dias.";
            }
        }

        //aqui somam-se os resultados e imprime na tela
        System.out.println(resulta1 + resulta2 + resulta3);//somam-se os resultados e imprime na tela
    }

}

Ismael

Ismael
Responder

Gostei + 1

Mais Posts

10/11/2015

Marcos Paulo

Acompanhando, estudei usando essas funções.
Responder

Gostei + 0

10/11/2015

Ismael

Pois é Marcos, vamos aprender as funções ainda. O professor disse que ele ganhou premio na universidade por conseguir fazer esse calculo entre datas sem funções e agora quer que aprendamos, só que o cara é muito entendido. Vamos aguardar algum gênio ai no mundo virtual me ajudar. Vlw
Responder

Gostei + 0

10/11/2015

Marcos Paulo

Entendo a proposta do professor em motivar aos alunos para esse desafio mas nunca vi como fazer isso, que eu lembre.
Responder

Gostei + 0

11/11/2015

Marcos Vinicios

Tem alguma base de como deve começar?
Responder

Gostei + 0

11/11/2015

Ismael

Fiz até aqui:


/*
*Aqui é a proposta do professor;
*
* Data inicial (informada pelo usuário)
* dd/mm/aaaa
* Data final (informada pelo usuário)
* dd/mm/aaaa
* Sem usar funções de data do Java
* Calcular a diferença em dias entre a data inicial e hoje:
* Considerar bissextos
* Apresentar: ex: 38 anos, 10 meses e 5 dias
*
*/
package trabalho_datas;

import java.util.Scanner;



public class Trabalho_datas {


public static void main(String[] args) {
// código

Scanner leitor = new Scanner(System.in);

int ano = leitor.nextInt();

if(ano%4!=0){
//não é bissexto
System.out.println("não é bissexto");
}else{
if(ano%100!=0){
//é bissexto
System.out.println("é bissexto");
}else{
if(ano%400==0){
//bissexto
System.out.println("é bissexto");
}else{
//não é bissexto
System.out.println("não é bissexto");
}
}
}
}

}
Responder

Gostei + 0

11/11/2015

Ismael

Pessoal, encontrei como calcular os bissextos. Assim:

public static void main(String[] args){

int ano = 0;
Scanner input = new Scanner(System.in);
ano = input.nextInt();

if((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))){
System.out.println(ano + " é um ano Bissexto!");
}
else{
System.out.println(ano + " não é um ano Bissexto!");
}
}


Agora, tenho que calcular quando os meses tem 31 dias, quando tem 30 dias.

Podem ajudar?
Responder

Gostei + 0

11/11/2015

Marcos Paulo

Estou vendo e procurando entender seu código.
Responder

Gostei + 0

11/11/2015

Felipe Moreira

[url]https://www.devmedia.com.br/forum/classe-calendar/535889[/url]

Não é a solução, mas se puder estudar sobre a classe calendar, eu não tenho certeza se da para visualizar internamente, pode ajudar.
Responder

Gostei + 0

12/11/2015

Ismael

Felipe, segundo o professor, não posso usar essa classe, ou seja, nenhuma função do Java que possa facilitar. Vai ter que ser na unha mesmo. Laços de repetição, condições etc.
Responder

Gostei + 0

12/11/2015

Jothaz

Para definir quais meses tem 30 ou 31 dias, você poder usar um array pois os dados são fixos.
E depois obter o valor usando array[Mes - 1], claro que considerando o bissexto.
Responder

Gostei + 0

12/11/2015

Ismael

Olha só a lógica que tive analisando aqui:

variaveis
Entre com a primeira data
Escreva a primeira data
Digite a segunda data
Escreva a segunda data
Se a primeira data for a partir de 01/01/1582 então calcule
Fórmula do bissexto acima
Se for bissexto o ano tem 366 dias, senão tem 365 dias
Calcular a diferença entre a primeira data em dias, meses e anos
(logicamente terei que definir que ano 365 dias, doze meses)

Quem consegue jogar isso pra JAVA pra ver se dá certo?
Responder

Gostei + 0

12/11/2015

Felipe Moreira

Felipe, segundo o professor, não posso usar essa classe, ou seja, nenhuma função do Java que possa facilitar. Vai ter que ser na unha mesmo. Laços de repetição, condições etc.


Exercicio hardcore Ismael, legal a metodologia.

No enunciado da questão ou trabalho, ele da dicas de algo que possa ser utilizado ou deixou totalmente aberta essa questão?
Responder

Gostei + 0

12/11/2015

Ismael

É mesmo hardcore. Ai que se esconde a coruja, ele só quer que seja no formato dd/mm/aaaa e que não seja usado as funções. Parece-me que tenho colegas que já fizeram e deu certo e outros que fizeram e o algoritmo dá errado. Bem loco!
Responder

Gostei + 0

12/11/2015

Felipe Moreira

Não deu dica?

No enunciado da questão ou trabalho, ele da dicas de algo que possa ser utilizado ou deixou totalmente aberta essa questão?
Responder

Gostei + 0

12/11/2015

Ismael

É Felipe, sem dicas. Ele quer que nós façamos o que estou fazendo aqui, pesquisando, pedindo ajuda etc., cada um por si.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar