Manipulação de datas sem funções JAVA
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?
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
Curtidas 0
Melhor post
Ismael
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
}
}
GOSTEI 1
Mais Respostas
Marcos Paulo
10/11/2015
Acompanhando, estudei usando essas funções.
GOSTEI 0
Ismael
10/11/2015
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
GOSTEI 0
Marcos Paulo
10/11/2015
Entendo a proposta do professor em motivar aos alunos para esse desafio mas nunca vi como fazer isso, que eu lembre.
GOSTEI 0
Marcos Vinicios
10/11/2015
Tem alguma base de como deve começar?
GOSTEI 0
Ismael
10/11/2015
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");
}
}
}
}
}
/*
*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
Ismael
10/11/2015
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?
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
Marcos Paulo
10/11/2015
Estou vendo e procurando entender seu código.
GOSTEI 0
Felipe Moreira
10/11/2015
[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.
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
Ismael
10/11/2015
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.
GOSTEI 0
Jothaz
10/11/2015
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.
E depois obter o valor usando array[Mes - 1], claro que considerando o bissexto.
GOSTEI 0
Ismael
10/11/2015
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?
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
Felipe Moreira
10/11/2015
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?
GOSTEI 0
Ismael
10/11/2015
É 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!
GOSTEI 0
Felipe Moreira
10/11/2015
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?
GOSTEI 0
Ismael
10/11/2015
É Felipe, sem dicas. Ele quer que nós façamos o que estou fazendo aqui, pesquisando, pedindo ajuda etc., cada um por si.
GOSTEI 0
Felipe Moreira
10/11/2015
Complicado mais um pouco hein, boa sorte.
GOSTEI 0
Ismael
10/11/2015
Tenho uma notícia boa e ruim ao mesmo tempo;
Meu código ta quase pronto, ta dando erro ainda na hora que ele troca de ano não ta acumulando, deem uma olhada e sugestões de arrumar se possível:
Meu código ta quase pronto, ta dando erro ainda na hora que ele troca de ano não ta acumulando, deem uma olhada e sugestões de arrumar se possível:
import java.util.Scanner;
class Trabalho_datas
{
public static void main (String[] args) throws java.lang.Exception{
// declara as variaveis usadas para armazenar as datas
int diaInicial, mesInicial, anoInicial, diaFinal, mesFinal, anoFinal;
// variáveis usadas no laço que percorre o período
int ano, mes, dia;
int meses[], diasMes, flag=0, dM=0;
// variáveis que acumulam ou auxiliam o acúmulo do tempo passado
int tD = 0, tM = 0, tA = 0;
/* declara e preenche um vetor com o número de dias de cada mês */
meses = new int[13];
meses[1] = 31;
meses[2] = 28;
meses[3] = 31;
meses[4] = 30;
meses[5] = 31;
meses[6] = 30;
meses[7] = 31;
meses[8] = 31;
meses[9] = 30;
meses[10] = 31;
meses[11] = 30;
meses[12] = 31;
//declara e preenche (vazia) as variáveis de apresentação do processamento final
String texto1 = "", texto2 = "", texto3 = "";
//variavel de entrada de dados (do teclado)
Scanner entrada = new Scanner(System.in);
System.out.println("Digite a data inicial no formato DD/MM/AAAA: ");
//lê e já divide a string nos campos
String dataInicial[] = entrada.next().split("\\/");
//a leitura é uma string, tem que converter para inteiro, para cada numero
diaInicial = Integer.parseInt(dataInicial[0]);
mesInicial = Integer.parseInt(dataInicial[1]);
anoInicial = Integer.parseInt(dataInicial[2]);
System.out.println("Digite a data final no formato DD/MM/AAAA: ");
//mesma coisa para a data final
String dataFinal[] = entrada.next().split("\\/");
diaFinal = Integer.parseInt(dataFinal[0]);
mesFinal = Integer.parseInt(dataFinal[1]);
anoFinal = Integer.parseInt(dataFinal[2]);
/*
AINDA FALTA TESTAR SE A DATA É REALMENTE VÁLIDA:
1 - SE O ANO É BISSEXTO E A DATA INFORMADA NÃO EXISTE
2 - SE O DIA É MAIOR QUE A QUANTIDADE DE DIAS DO MÊS INFORMADO
*/
if (anoFinal < anoInicial
|| // anos negativos
(anoFinal == anoInicial && mesFinal < mesInicial)
|| // anos iguais, meses negativos
(anoFinal == anoInicial && mesFinal == mesInicial && diaFinal < diaInicial))
// anos e meses iguais, dias negativos
{
System.out.println("a data final deve ser posterior a data inical...");
} else {
/*
as datas são válidas, vamos percorrer o período de tempo entre
a data inicial e a final, para isso vamos criar variáveis novas
que integrarão o laço, assim não perdemos as iniciais.
*/
ano = anoInicial;
mes = mesInicial;
dia = diaInicial;
// enquanto não chega nos limites, vai adiante
while (!(ano == anoFinal && mes == mesFinal && dia == diaFinal)) {
// diasMes armazena os dias do mês
// em que o laço está operando
if (mes == 2) { // é fevereiro
if ((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))) {
diasMes = 29;
} else {
diasMes = 28;
}
} else {
diasMes = meses[mes]; // qualquer outro mês
}
// começa contando os dias
if ((mes == mesFinal && ano == anoFinal)
|| (mes == mesInicial && ano == anoInicial)
&& dia < diasMes) {
/*
se as variáveis que percorrem o período coincidirem com o
mêss e ano iniciais ou finais o motivo é termos os extremos
do intervalo, o primeiro e último mês basta somar dias, até
passar para o próximo mês ou chegar no final do período.
*/
tD += 1;
dia += 1;
} else { // é um mês que não se encontra nos limites do intervalo
if (dia == diasMes) {
// final do mês, começa no próximo
tD += 1;
mes += 1;
dia = 1;
flag = 1;
}
else if (dia < diasMes) {
// meio do mês, vai somando
tD += 1;
dia += 1;
}
if (dia == 31 && mes == 12) {
// fim de ano, nothing changes on new years day
// exceto o ano, mês e dia no algoritmo
tD += 1;
ano += 1;
mes = 1;
dia = 1;
flag = 1;
}
}
/*
Um mês equivale ao tempo entre um dia de determinado mês e o
mesmo dia no próximo mês. A não ser que o dia não exista no
próximo mês, o que significa que no final dele, já dá um mês.
*/
if (mes == 3) { // março, retorna fevereiro
if ((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))) {
dM = 29;
} else {
dM = 28;
}
} else if(mes==1) {
dM = 31; // janeiro, retorna dezembro
}else{
dM = meses[mes-1]; // qualquer outro mês
}
if (dia==diaInicial){
/*
Chegou no mesmo dia no próximo mês, ou no final do mês,
se o dia não existir no próximo
*/
tM += 1;
tD = 0;
flag=0;
if (tM == 12) {
/* acumulou 12 meses, incrementa 1 ano, zera o
acumulador de meses */
tA += 1;
tM = 0;
}
}
// fim do código novo
}
}
/*
aí cuidamos da existência dos valores na string final que irá para
a tela, inclusive dos plurais, fica mais apresentável
*/
if (tA != 0) {
if (tA == 1 && tD == 0 && tM == 0) {
texto1 = tA + " ano.";
}
if (tA == 1 && (tD > 0 && tM > 0)) {
texto1 = tA + " ano, ";
} else if (tA == 1 && (tD > 0 || tM > 0)) {
texto1 = tA + " ano e ";
}
if (tA > 1 && tD == 0 && tM == 0) {
texto1 = tA + " anos.";
}
if (tA > 1 && tD > 0 && tM > 0) {
texto1 = tA + " anos, ";
} else if (tA > 1 && (tD > 0 || tM > 0)) {
texto1 = tA + " anos e ";
}
}
if (tM
!= 0) {
if (tM == 1 && tD == 0) {
texto2 = tM + " mês.";
}
if (tM == 1 && tD > 0) {
texto2 = tM + " mês e ";
}
if (tM > 1 && tD > 0) {
texto2 = tM + " meses e ";
}
if (tM > 1 && tD == 0) {
texto2 = tM + " meses.";
}
}
if (tD
!= 0) {
if (tD == 1) {
texto3 = tD + " dia.";
}
if (tD > 1) {
texto3 = tD + " dias.";
}
}
// por fim, escreve o resultado do processamento:
System.out.println(texto1 + texto2 + texto3);
}
}
GOSTEI 0
Edson Venancio
10/11/2015
Cara entra no Youtube, no canal de AlunopraAluno , na parte de programação Java ele ensina como fazer...
GOSTEI 0
Felipe Moreira
10/11/2015
Cara entra no Youtube, no canal de AlunopraAluno , na parte de programação Java ele ensina como fazer...
Obrigado Edson, não conhecia esse canal.
GOSTEI 0
Ismael
10/11/2015
boa noite, é com imensa alegria que escrevo aqui que
CONSEGUIIIIIIIIIIIIIIIIIIIIIIIII!
que p... de algoritmo do c...
mas consegui!
obrigado a todos!
CONSEGUIIIIIIIIIIIIIIIIIIIIIIIII!
que p... de algoritmo do c...
mas consegui!
obrigado a todos!
GOSTEI 0
Daniel
10/11/2015
Muito bom!
Funciona mesmo!
Funciona mesmo!
GOSTEI 1
Felipe Moreira
10/11/2015
Show hein!!!
GOSTEI 0
Ismael
10/11/2015
Obrigado Daniel.
GOSTEI 0