Fórum Manipulação de datas sem funções JAVA #536873
10/11/2015
0
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
Curtir tópico
+ 0Post mais votado
06/12/2015
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
Gostei + 1
Mais Posts
10/11/2015
Marcos Paulo
Gostei + 0
10/11/2015
Ismael
Gostei + 0
10/11/2015
Marcos Paulo
Gostei + 0
11/11/2015
Marcos Vinicios
Gostei + 0
11/11/2015
Ismael
/*
*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");
}
}
}
}
}
Gostei + 0
11/11/2015
Ismael
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?
Gostei + 0
11/11/2015
Marcos Paulo
Gostei + 0
11/11/2015
Felipe Moreira
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.
Gostei + 0
12/11/2015
Ismael
Gostei + 0
12/11/2015
Jothaz
E depois obter o valor usando array[Mes - 1], claro que considerando o bissexto.
Gostei + 0
12/11/2015
Ismael
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?
Gostei + 0
12/11/2015
Felipe Moreira
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?
Gostei + 0
12/11/2015
Ismael
Gostei + 0
12/11/2015
Felipe Moreira
Gostei + 0
12/11/2015
Ismael
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)