O que consegui fazer até agora foi isso, não consigo instanciar o método getHora1, e não faço a minima ideia de como colocar o horário em AM/PM, lembrando que AM/PM seria formato 12 horas.
package hora;
import java.util.Scanner;
public class Hora
{
Scanner ler = new Scanner(System.in);
private int hora = 0;
private int min = 0;
private int seg = 0;
public Hora()
{
do {
System.out.println("Digite a hora: ");
hora = ler.nextInt();
} while (hora > 24 || hora < 1);
do {
System.out.println("Digite os minutos: ");
min = ler.nextInt();
} while (min > 60 || min < 0);
do {
System.out.println("Digite os segundos: ");
seg = ler.nextInt();
} while (seg > 60 || seg < 0);
}
public Hora(int h, int m, int s)
{
this.hora = h;
this.min = m;
this.seg = s;
}
public void setHor(int h)
{
this.hora = h;
}
public void setMin(int m)
{
this.min = m;
}
public void setSeg(int s)
{
this.seg = s;
}
public void setHor()
{
do {
System.out.println("Digite a hora: ");
hora = ler.nextInt();
} while (hora > 24 || hora < 1);
}
public void setMin()
{
do {
System.out.println("Digite os minutos: ");
min = ler.nextInt();
} while (min > 60 || min < 0);
}
public void setSeg()
{
do {
System.out.println("Digite os segundos: ");
seg = ler.nextInt();
} while (seg > 60 || seg < 0);
}
public int getHor(int hora)
{
return hora;
}
public int getMin(int min)
{
return min;
}
public int getSeg(int seg)
{
return seg;
}
public String getHora1 ()
{
String formatado;
formatado = (this.hora+":"+this.min+":"+this.seg);
return formatado;
}
public void getHora2()
{
}
public void getSegundos()
{
int calcH = hora * 3600;
int calcM = min * 60;
int horario = seg + calcH + calcM;
System.out.println("Qt segundos: "+horario);
}
public static void main(String[] args) {
Hora Exibir = new Hora ();
System.out.println(Exibir);
}
}
Eu preciso fazer isso:
O construtor Hora() deve permitir ao usuário digitar os valores de hora, minuto e
segundos e com eles inicializar os atributos da classe. Os valores digitados deverão ser
consistidos e só aceitos se válidos, caso contrário, exigir ao usuário redigitar;
O construtor Hora(int h, int m, int s) deverá receber os valores de hora, minuto e
segundos e com eles inicializa as propriedades da classe;
Os métodos setHor(int h), setMin(int h) e setSeg(int h) devem receber um valor e
atribuí-lo ao respectivo atributo;
Os métodos setHor(), setMin() e setSeg() devem permitir que o usuário digite um
valor e atribuí-lo ao respectivo atributo. Os valores digitados deverão ser consistidos e
só aceitos se válidos, caso contrário, exigir ao usuário redigitar;
Os métodos getHor(), getMin() e getSeg() devem devolver as respectivas
propriedades;
O método getHora1() deve nos devolver a hora no formato: hh:mm:ss;
O método getHora2() deve nos devolver a hora no formato: hh:mm:ss (AM/PM);
O método getSegundos() deve nos devolver a quantidade de segundos expressa na
hora em questão, (exemplo: 01:00:01 = 3601 segundos) .
Conveniente colocar tratamento de exceção para as possíveis inconsistências na
entrada de dados.
Quantas horas tem o nosso formato de hora? E quantas horas tem o formato americano, que usa os indicadores AM e PM? Quais horas estão no AM e quais estão no PM?
Outra coisa, você instancia objetos, nunca métodos. Métodos são invocados. Para isso, você precisa chamar a partir de uma instância de objeto:
Hora hora = new Hora(); //Antes do = você declara e depois, no new, você instancia
hora.getHora1(); // aqui você invoca o método getHora1();
então o certo seria eu chamar o objeto de Hora ? no exercício pede que o método tenha um retorno e que quando o usuário digite a hora/minuto/segundo, mostre naquela formatação, depois em AMP/PM e a Qtd de segundos daquela hora.
Veja, se dentro do main você fizer isso:
public static void main(String[] args) {
getHora1();
}
O código ficará sublinhado em vermelho, acusando a tentativa de acessar um método não estático em um contexto estático. O mesmo ocorre com variáveis.
Agora, você já tem o objeto da classe Hora
public static void main(String[] args) {
Hora Exibir = new Hora ();
Logo, já tem o primeiro passo para tudo. Ah, antes de mais nada, você precisa se atentar as convenções de nomes do java, classes com letras maiúsculas e variáveis e métodos com minúsculas, sempre seguindo o camelCase. No caso, o nome correto para o objeto seria “exibir” e não “Exibir”. Aliás, o nome mais adequado seria “hora”.
public static void main(String[] args) {
Hora hora = new Hora ();
hora.getHora1();
Entendeu? A ideia é usar objetos, então use o objeto.
Para deixar no formato HH:MM:SS, ainda não esta completo !
public String getHora1(String A)
{
A = (this.hora+":"+this.min+":"+this.seg);
return A;
}
Eu não estou conseguindo chamar o retorno do método getHora1.
public static void main(String[] args) {
Hora hora = new Hora ();
hora.getHora1();
System.out.println(hora.getHora1);
System.out.println(hora);
}
Veja, você nunca vai conseguir fazer isso:
Simplesmente por que você precisa indicar que está chamando o método, então, deve adicionar os parênteses
System.out.println(hora.getHora1());
Ou, você faz isso
String horaFormatada1 = hora.getHora1();
System.out.println(horaFormatada1);
Certo.
O usuário entra com os valores aqui :
public Hora()
{
do {
System.out.println("Digite a hora: ");
hora = ler.nextInt();
} while (hora > 24 || hora < 1);
do {
System.out.println("Digite os minutos: ");
min = ler.nextInt();
} while (min > 60 || min < 0);
do {
System.out.println("Digite os segundos: ");
seg = ler.nextInt();
} while (seg > 60 || seg < 0);
}
Eu faço a formatação no método getHora1(), alterando o formato da hora para HH:MM:SS, lembrando que eu tenho a obrigação no exercício de retornar uma String.
public String getHora1(String A)
{
A = (this.hora+":"+this.min+":"+this.seg);
return A;
}
Agora, no Main, eu queria exibir a hora já formatada que o usuário digitou.
public static void main(String[] args) {
Hora hora = new Hora ();
System.out.println(hora.getHora1);
System.out.println(hora);
}
Releia meu comentário anterior, com atenção, e reproduza o que sugeri lá.
Desculpa, eu já tinha feito, apresentou um erro e esqueci de colocar.
public String getHora1(String A)
{
A = (this.hora+":"+this.min+":"+this.seg);
return A;
}
public static void main(String[] args) {
Hora hora = new Hora ();
String horaFormatada1 = hora.getHora1();
System.out.println(horaFormatada1);
System.out.println(hora);
Agora ele apresenta esse erro:
method getHora1 in class Hora cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length
Pelo que eu entendi, eu não passei nenhum parâmetro para o método que estou chamando, é isso ?
Acontece que, ou você mudou o método getHora1 e agora ele espera um parâmetro do tipo String ou o método que você colocou na postagem original é diferente do que você tem.
na postagem acima eu coloquei o método getHora1, modificado já !
KKKKKKKK, cara, não sei nem como me desculpar, só fui entender agora, obrigadão mesmo, me salvou, deu certo essa bagaça.
Sucesso cara.
import java.util.Scanner;
public class Hora
{
Scanner ler = new Scanner(System.in);
private int hora;
private int min;
private int seg;
public Hora()
{
setHor();
setMin();
setSeg();
}
public Hora(int h, int m, int s)
{
this.hora = h;
this.min = m;
this.seg = s;
}
public void setHor(int h)
{
this.hora = h;
}
public void setMin(int m)
{
this.min = m;
}
public void setSeg(int s)
{
this.seg = s;
}
public void setHor()
{
do {
System.out.println("Digite a hora: ");
hora = ler.nextInt();
} while (hora > 24 || hora < 0);
}
public void setMin()
{
do {
System.out.println("Digite os minutos: ");
min = ler.nextInt();
} while (min > 60 || min < 0);
}
public void setSeg()
{
do {
System.out.println("Digite os segundos: ");
seg = ler.nextInt();
} while (seg > 60 || seg < 0);
}
public int getHor()
{
return hora;
}
public int getMin()
{
return min;
}
public int getSeg()
{
return seg;
}
public String getHora1()
{
String A = (this.hora+":"+this.min+":"+this.seg);
return A;
}
AQUI É ONDE COMEÇA A TRETA, ONDE BUGUEI
Se o 1º IF, for verdadeiro, ele não ira executar mais nada ?
Ele esta executando apenas o 1º IF, quando o número é menor que 10, apenas “hora” fica no formato HH
public String getHora2()
{
if (hora < 12)
{
else if (hora < 10)
{
if (min < 10)
{
if(seg < 10)
{
return "0"+hora+":0"+min+":0"+seg+" AM";
}
return "0"+hora+":0"+min+":"+seg+" AM";
}
return "0"+hora+":"+min+":"+seg+" AM";
}
return hora+":"+min+":"+seg+" AM";
}
if (hora >= 12)
{
if (hora < 10)
{
if (min < 10)
{
if(seg < 10)
{
return "0"+hora+":0"+min+":0"+seg+" PM";
}
return "0"+hora+":0"+min+":"+seg+" PM";
}
return "0"+hora+":"+min+":"+seg+" PM";
}
return hora+":"+min+":"+seg+" PM";
}
else
{
return "Horário Inválido !";
}
}
public int getSegundos()
{
int calcH = hora * 3600;
int calcM = min * 60;
int horario = seg + calcH + calcM;
return horario;
}
public static void main(String[] args)
{
Hora hora = new Hora ();
hora.getHora1();
hora.getSegundos();
hora.getHora2();
System.out.println("Horário AM/PM: "+hora.getHora2());
System.out.println("Horário: "+hora.getHora1());
System.out.println("Quantidade de segundos: "+hora.getSegundos());
}
}
Não, fera. Não precisa dessa montoeira de ifs…
Vamos supor que você tenha as horas: 08:24:16 e 22:15:1234:
A primeira, como a hora é menor que 12, você devolve tudo, seguido de AM.
Na segunda, você só precisa tirar 12 das horas e devolver o resultado concatenado aos minutos e segundos e PM.
Ou seja, só valie as horas!
if(hora < 12) {
return formataPadrao(hora) + ":" + formataPadrao(min) + ":" + formataPadrao(seg) + "AM";
} else {
return formataPadrao(hora - 12) + ":" + formataPadrao(min) + ":" + formataPadrao(seg) + "PM";
}
E o formataPadrao
public String formataPadrao(int num) {
return num < 10 ? "0" + num : "" + num;
}
Então Darlan, por ser um exercício acadêmico, não posso criar outro método, todos os métodos já foram determinados, e outra, existe a possibilidade do cliente colocar “8h:8m:8s” ai só colocaria um zero na frente da hora, mas não colocaria na frente dos minutos nem dos segundos!
Ok, substitua todas as chamadas ao método sugerido pelo conteúdo do método sugerido
Ao invés disso:
return formataPadrao(hora) + ":" + formataPadrao(min) + ":" + formataPadrao(seg) + "AM";
Use isso
return (hora < 10 ? "0" + hora : hora) + ":" + (min < 10 ? "0" + min : min) + ":" + (seg < 10 ? "0" + seg : seg) + "AM";
Ficou claro?
Ficou sim, porém agora surgiu outro problema:
Eu fiz dessa forma, ficou exato o horário, o problema é que como eu faço “hora - 12”, ele acaba voltando ao primeiro IF, sendo assim, ele sempre é AM. Na verdade, estou extremamente bugado nisso, pq mesmo que eu coloque apenas um if e um else, ele sempre mostra AM, sinceramente, não estou entendendo mais nada, pq num primeiro momento o IF é falso, pois foi digitado 23hrs, ai ele executa o “else if”, formata o horário certinho tirando as 12 horas das 23 que foi digitada, porém mesmo assim sai como AM.
String getHora2()
{
if (hora < 12)
{
return (hora < 10 ? "0" + hora : hora) + ":" + (min < 10 ? "0" + min : min) + ":" + (seg < 10 ? "0" + seg : seg) + " AM";
}
else if (hora >= 12)
{
return (hora < 10 ? "0" + (hora = hora - 12) : (hora = hora - 12)) + ":" + (min < 10 ? "0" + min : min) + ":" + (seg < 10 ? "0" + seg : seg) + " PM";
}
else
{
return "Horário Inválido";
}
Bom dia, finalmente deu certo Darlan, obrigadão, fiz da seguinte forma
public String getHora2()
{
String hr;
String min;
String seg;
String periodo;
int hr2;
if(this.hora > 12)
{
hr2 = this.hora - 12;
}
else
{
hr2 = this.hora;
}
if(hr2 < 10)
{
hr = "0"+hr2;
}
else
{
hr = ""+hr2;
}
if(this.min < 10)
{
min = "0"+this.min;
}
else
{
min = ""+this.min;
}
if(this.seg < 10)
{
seg = "0"+this.seg;
}
else
{
seg = ""+this.seg;
}
if(this.hora < 12)
{
periodo = "AM";
}
else
{
periodo = "PM";
}
return hr+":"+min+":"+seg+"("+periodo+")";
}
Eu tenho um quê de agonia quando vejo código java com as chaves desta maneira…hahahaha.
hahahahahahha não é uma boa prática ?