Opa, fala galera!!
Sou iniciante, e estou tentando implementar esse código…
Na pesquisa que fiz verifiquei que existe o métodos Date que faz isso de forma mais prática, porém
o exercício pede que seja feita declarando essas 3 variáveis conforme abaixo:
Escrever um método que receba como parâmetros três inteiros:
• dia
• mês
• ano.
Com base nestes valores, o método deve retornar o número de dias que restam para terminar o ano. Se algum parâmetro for inválido, o método deve lançar uma exceção não verificada.
O código está funcionando, porém gostaria de saber se existe uma forma mais prática
de implementar o código para o cálculo dos meses que tem 31 dias sem ter que listar
todos ai na condição do if.
Meu próximo passo será encaixar os blocos try catch.
Esse foi o código que fiz até agora:
import javax.swing.JOptionPane;
public class CalculaDias {
public static void main(String[] args) {
// Declarando e inicializando as variáveis
int dia = 0;
int mes = 0;
int ano = 0;
dia = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o dia:"));
mes = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o mês:"));
ano = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o ano:"));
int TdiasAno = 365;
int TdiasPassados = 0;
int DifDias = 0;
if (dia > 0 && dia < 32) {
TdiasPassados += dia;
} else {
System.out.println("Dia " + dia + " Inválido");
}
if (mes > 0 && mes < 13) {
if(mes == 2) {
TdiasPassados += 28;
} else {
if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) {
TdiasPassados += 1;
} else {
}
TdiasPassados += (mes - 1) * 30;
}
} else {
System.out.println("Mês " + mes + " Inválido");
}
if (ano > 0) {
// se o ano for maior que 400
if(ano % 400 == 0){
TdiasAno += 1;
// se o ano for menor que 400
} else if((ano % 4 == 0) && (ano % 100 != 0)){
TdiasAno += 1;
} else{
}
}
DifDias = TdiasAno - TdiasPassados;
System.out.println("Dias Passados " + TdiasPassados);
System.out.println("Restam " + DifDias + " Para Terminar o ano " + ano);
}
}
Desde já agradeço a ajuda.
Melhorei o código, agora o cálculo do número de dias está com erro de lógica.
Alguém tem alguma idéia para melhorar?
Grato
import javax.swing.JOptionPane;
public class CalculoDias2 {
public static void main(String[] args) {
try {
// variáveis para armazenar dia, mês e ano
int dia = 0;
int mes = 0;
int ano = 0;
int TdiasAno = 365;
int TdiasPassados = 0;
int DifDias = 0;
dia = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o dia:"));
mes = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o mês:"));
ano = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o ano:"));
// Ve
boolean bissexto = false;
// datas consideradas inválidas são datas cujo ano seja menor que 1 ou maior que
// 2999
// ou que o mês seja menor que 1 ou maior que 12, ou dia menor que 1 ou maior
// que 31
if (ano < 1 || ano > 2999 || mes < 1 || mes > 12 || dia < 1 || dia > 31) {
System.out.println("Data inválida");
} else if ((dia <= 31) && (mes <= 12)) {
// se o mês for 2 e o dia maior que 28, a data é inválida. Ou então se o dia for
// 31
// e o mês for um dos meses que tem 30 dias, a data também é inválida
if (((dia > 28) && (mes == 2))
|| ((dia == 31) && ((mes == 4) || (mes == 6) || (mes == 9) || (mes == 11)))) {
System.out.println("Data inválida");
} else {
// Código para quado a data for válida
// Verificando se o ano é bissexto
if (ano % 4 == 0) {
bissexto = true;
}
if (ano % 100 == 0) {
bissexto = false;
}
if (ano % 400 == 0) {
bissexto = true;
}
if (bissexto == true) {
TdiasAno += 1;
}
// Contagem dos dias
}
} else {
System.out.println("Data inválida");
}
// Contagem dos dias
TdiasPassados += dia + ((mes - 1) * 30);
DifDias = TdiasAno - TdiasPassados;
System.out.println("Faltam " + DifDias);
System.out.println("Bissexto= " + bissexto);
System.out.println("Dias Passados " + TdiasPassados);
System.out.println("Dia= " + dia + " Mês= " + mes + " Ano= " + ano);
System.out.println("Total de dias do ano: " + TdiasAno);
} catch (NumberFormatException e) {
System.out.println(e.getMessage());
}
}
}
Acho que não há a necessidade desses dois ifs:
if (ano % 100 == 0) {
bissexto = false;
}
if (ano % 400 == 0) {
bissexto = true;
}
Pode ser esse o motivo de estar quebrando sua lógica, pq acredito que pode um ano ser bisexto sem deixar de ser divisível por 100 tendo resto zero
e %400 vai ser o mesmo q %4 pois 400%4 tbm é 0(zero)
e esse ii :
if (bissexto == true) {
TdiasAno += 1;
}
poderia ser simplesmente assim:
if (bissexto) {
TdiasAno += 1;
}