Galera, boa tarde.
Sou iniciante em java, e tô tentando criar um despertador APENAS com o que já aprendi, que é o que consta no código abaixo.
Porém, estou recebendo erro ao tentar utilizar WHILE.
A lógica seria que enquanto horaatual for diferente de horareal E minutoatual for diferente de minutoreal, o programa não faz nada e, SE horaatual for igual horareal E minutoatual for igual a minutoreal, o programa imprime uma mensagem no console.
Podem me ajudar a achar onde está errado?
package teste;
import java.util.Scanner;
public class Teste {
public static void main(String[] args) {
long totalMilisegundos = System.currentTimeMillis() - 10800000;
long totalSegundos = totalMilisegundos / 1000;
long segundosAtual = totalSegundos % 60;
long totalMinutos = totalSegundos / 60;
long minutosAtual = totalMinutos % 60;
long totalHoras = totalMinutos / 60;
long horasAtual = totalHoras % 24;
long horasAtualVerao = horasAtual + 1;
System.out.println("Horário Atual: " + horasAtualVerao + ":" + minutosAtual + ":" + segundosAtual);
Scanner input = new Scanner(System.in);
System.out.println("Digite a hora para despertar:");
long hora = input.nextLong();
System.out.println("Digite os minutos para despertar:");
long minutos = input.nextLong();
System.out.println("Você configurou o despertador para: " + hora + ":" + minutos);
System.out.println("Digite a tarefa à agendar:");
String agenda = input.next();
long x = 0;
while(horasAtualVerao != hora & x = 0 ){
}
if (horasAtualVerao = hora || minutosAtual = minutos) {
System.out.println(agenda);
long x = 1;
}
}
}
}
Todos erramos, mas devemos sempre nos lembrar que = e == são duas coisas diferentes. = atribui valor a variavel e == compara. Exemplo:
int x = 0 //atribui o valor 0 a variavel x if(x == 0) //compara se o valor de x é igual a 0
e no lugar de ‘&’ o certo é ‘&&’
acho que o loop que você procura é algo do tipo:
long x = 1; //você declarou essa variavel dentro do loop, então ela não existe para o sistema
while(horasAtualVerao != hora && x == 0 ){ //enquanto horasAtualVerao for DIFERENTE de hora e x for igual a 0
}
//essas linhas abaixo estão FORA do loop(não sei se é sua intenção ou se foi um erro)
if (horasAtualVerao == hora || minutosAtual == minutos) { //se horasAtualVerao for igual hora OU minutosAtual for igual minutos
System.out.println(agenda);
}
me desculpe se eu entendi errado, mas se for, por favor explique com mais detalhes.
Não tenho certeza se o IF - ELSE deve ficar dentro do loop neste caso.
Na minha lógica (que nem sei se está correta), o programa deveria ficar em LOOP enquanto a hora e o minuto atual forem diferentes do informado pelo usuário e “sair do loop”, ou seja, executar o Syso(agenda) quando, e apenas SE a hora e o mínuto forem iguais aos informados.
A variável X foi criada apenas pra parar o programa quando o IF for executado, desta forma, eu escolho a HORA, o MINUTO e escrevo uma frase que será mostrada quando essa hora e minuto chegar na vida real, tipo um agendador de tarefas.
A principal dúvida além da sintaxe é se o While, If e Else estão com a lógica correta para a aplicação.
nesse caso acho que isso é o necessário:
while(true){ //vai rodar o loop infinitamente
if (horasAtualVerao == hora && minutosAtual == minutos) { //só printa agenda se hora e minuto obtidos for igual da sua variavel(executando esse if infinitamente)
System.out.println(agenda);
break; // sem o break vai printar agenda varias vezes durante um minuto inteiro
}
}
ou se você quiser interromper o loop em algum momento (caso não queira que seja infinito) pode fazer assim:
boolean qqrCoisa = true;
while(qqrCoisa == true){
if (horasAtualVerao == hora && minutosAtual == minutos) {
System.out.println(agenda);
break;
}
if(a condição que vc quiser para interromper o loop) {
qqrCoisa = false;
}
}
Utilizei a primeira opção, porém ele fica em loop pra sempre, não executa o if depois… nao sei se é algum problema com o IF ou com o while /=
se o if não foi executado é porque a condição não foi satisfeita.
coloca dentro do while mas fora do if um println com as quatro variáveis pra termos certeza que estão iguais:
while(true){
println("horasAtualVerao = " + horasAtualVerao + "hora = " + hora + "minutosAtual = " + minutosAtual + "minutos = " + minutos );
if (horasAtualVerao == hora && minutosAtual == minutos) {
System.out.println(agenda);
break;
porque só vai entrar no if se as duas condições forem satisfeitas
Fiz alguns testes aqui.
Se eu colocar exatamente a hora real, no campo que o usuário escolhe a hora, e o mesmo para os minutos, o programa roda.
Acredito que o programa não esteja atualizando a hora real no método criado no começo.
Exemplo:
o programa vê o horario de acordo com a era Unix, e depois ele roda o while até que a hora UNIX que ele leu seja igual a criada pelo usuário, porém ele não atualiza essa hora unix constantemente, apenas na execução do programa.
Acredito que tenha que incluir o método pra verificar o horário dentro de um loop, procede ?
a hora e todas as outras variaveis são definidas corretamente no inicio do programa?
Sim, olha o programa:
package teste;
import java.util.Scanner;
public class Teste {
public static void main(String[] args) {
long totalMilisegundos = System.currentTimeMillis() - 10800000;
long totalSegundos = totalMilisegundos / 1000;
long segundosAtual = totalSegundos % 60;
long totalMinutos = totalSegundos / 60;
long minutosAtual = totalMinutos % 60;
long totalHoras = totalMinutos / 60;
long horasAtual = totalHoras % 24;
long horasAtualVerao = horasAtual + 1;
System.out.println("Horário Atual: " + horasAtualVerao + ":" + minutosAtual + ":" + segundosAtual);
Scanner input = new Scanner(System.in);
System.out.println("Digite a hora para despertar:");
long hora = input.nextLong();
System.out.println("Digite os minutos para despertar:");
long minutos = input.nextLong();
System.out.println("Digite a tarefa à agendar:");
String agenda = input.next();
System.out.println("Você configurou o despertador para " + hora + "h" + minutos
+ "m para realizar a tarefa: " + agenda + ".");
while(true){
if (horasAtualVerao == hora || minutosAtual == minutos) {
System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m .");
System.out.println("Tarefa: " + agenda + ".");
break;
}
}
}
}
Tenho quase certeza que o problema está no fato de que a hora está sendo gerada apenas no inicio do programa, e fica estática, o programa não lê de novo o método.
se for questão de estar sempre atualizando a hora, tente desse jeito:
package teste;
import java.util.Scanner;
public class Teste {
public static void main(String[] args) {
long totalMilisegundos;
long totalSegundos;
long segundosAtual;
long totalMinutos;
long minutosAtual;
long totalHoras;
long horasAtual;
long horasAtualVerao;
System.out.println("Horário Atual: " + horasAtualVerao + ":" + minutosAtual + ":" + segundosAtual);
Scanner input = new Scanner(System.in);
System.out.println("Digite a hora para despertar:");
long hora = input.nextLong();
System.out.println("Digite os minutos para despertar:");
long minutos = input.nextLong();
System.out.println("Digite a tarefa à agendar:");
String agenda = input.next();
System.out.println("Você configurou o despertador para " + hora + "h : " + minutos + "m para realizar a tarefa: " + agenda + ".");
while(true){
totalMilisegundos = System.currentTimeMillis() - 10800000;
totalSegundos = totalMilisegundos / 1000;
segundosAtual = totalSegundos % 60;
totalMinutos = totalSegundos / 60;
minutosAtual = totalMinutos % 60;
totalHoras = totalMinutos / 60;
horasAtual = totalHoras % 24;
horasAtualVerao = horasAtual + 1;
if (horasAtualVerao == hora && minutosAtual == minutos) { // se vc usar || ele vai entrar mesmo que só 1 dsas condições seja verdadeira
System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m .");
System.out.println("Tarefa: " + agenda + ".");
break;
}
}
}
}
Não funciona… ele finaliza o programa conforme abaixo:
Digite a hora para despertar:
17
Digite os minutos para despertar:
42
Digite a tarefa à agendar:
teste
Você configurou o despertador para 17h42m para realizar a tarefa: teste.
Você agendou a tarefa abaixo para 17h40m .
Tarefa: teste.
Por algum motivo agora o programa recebe a variável do usuário mas desconsidera ela.
Consegui, velho!
Fiz umas mudanças aqui, e ficou assim:
package teste;
import java.util.Scanner;
public class Teste {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Digite a hora para despertar:");
long hora = input.nextLong();
System.out.println("Digite os minutos para despertar:");
long minutos = input.nextLong();
System.out.println("Digite a tarefa à agendar:");
String agenda = input.next();
while(true){
long totalMilisegundos = System.currentTimeMillis() - 10800000;
long totalSegundos = totalMilisegundos / 1000;
long segundosAtual = totalSegundos % 60;
long totalMinutos = totalSegundos / 60;
long minutosAtual = totalMinutos % 60;
long totalHoras = totalMinutos / 60;
long horasAtual = totalHoras % 24;
long horasAtualVerao = horasAtual + 1;
if (horasAtualVerao == hora & minutosAtual == minutos) {
System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m .");
System.out.println("Tarefa: " + agenda + ".");
break;
}
}
}
}
Valeu pela ajuda!
Fico feliz em ajudar, eu executei aqui ficou legal, mas se vc quiser uma sugestão, só pra não parecer que o programa ficou parado, adicione um println dizendo que deu certo:
if (horasAtualVerao == hora & minutosAtual == minutos) {
System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m .");
System.out.println("Tarefa: " + agenda + ".");
System.out.println("Tarefa agendada com sucesso, aguardando o momento para notificar...");
break;
}
e marque o topico como resolvido
O print “Você agendou a tarefa…” já tinha esse propósito, mas valeu a sugestão!
Vou resolver o tópico aqui, obrigado pela ajuda.
Só não achei onde resolver o tópico… é minha primeira participação aqui no GUJ