Reloj despertador con funcionalidad "sonando" -- java campo con beginner campo con datetime camp codereview Relacionados El problema

Alarm clock with “ringing” functionality


7
vote

problema

Español

Tengo una pregunta con respecto a un programa que es para ejecutar un reloj de alarma y mostrar la hora (HH: mm am / pm) y también desencadenar la alarma y mostrar "sonando" a las 12:00 am.

Soy un principiante en Java y estoy un poco perdido. Creo que tengo la mayor parte del trabajo esquelético hecho. Esto es muy parecido a otra pregunta aquí, pero no pude encontrar una respuesta a mis problemas. Así que me disculpo por la similitud. También soy para crear un "conductor ficticio" para probar el método, ya que uno de los requisitos para este programa es poder ser leído por un conductor general que alguien más haya creado. Por lo tanto, todas mis variables y métodos deben dejarse en la forma en que los tengo para ser leídas por dicho conductor. Desearía poder ser un poco más específico en lo que necesito ayuda, pero cualquier comentario que pueda darme es muy apreciado.

Esto es lo que tengo hasta ahora:

  //dummy driver package program5;  public class Program5 {  public static void main(String[] args) { AlarmClock alarm = new AlarmClock(); System.out.println(alarm.getHour() + ":" + alarm.getMinute() + alarm.getAmOrPM()); System.out.println(alarm.getAlarmHour() + ":" + alarm.getAlarmMinute() + alarm.getAlarmAmOrPm()); System.out.println(alarm.isIsAlarmRinging()); } }   package program5;  public class AlarmClock {  private int hour; private int minute; private String amOrPm; private int alarmHour; private int alarmMinute; private String alarmAmOrPm; private boolean isAlarmRinging;  //constructor: AlarmClock() { hour = 12; alarmHour = 12; minute = 0; alarmMinute = 0; alarmAmOrPm = new String(); amOrPm = new String(); isAlarmRinging = false; }   //getters: public int getHour() { if ((hour >= 1) && (hour <= 12)) { } return hour; }  public int getMinute() { if ((minute >= 0) && (minute <= 59)) { } return minute; }  public String getAmOrPM() { return amOrPm; }  public int getAlarmHour() { return alarmHour; }  public int getAlarmMinute() { return alarmMinute; }  public String getAlarmAmOrPm() { return alarmAmOrPm; }  public boolean isIsAlarmRinging() { if (hour >= 12){ isAlarmRinging = true; } return isAlarmRinging; }  //setters public void setHour(int newHour) { if ((newHour >= 1) && (newHour <= 12)) {     hour = newHour; } }  public void setMinute(int newMinute) { if ((newMinute >= 0) && (newMinute <= 59)) {     minute = newMinute; } }  public void setAmOrPM(String newAmOrPm) { amOrPm = newAmOrPm; }  public void setAlarmHour(int newAlarmHour) { if ((newAlarmHour >= 1) && (newAlarmHour <= 12)) {     alarmHour = newAlarmHour; } }  public void setAlarmMinute(int newAlarmMinute) { if ((newAlarmMinute >= 0) && (newAlarmMinute <= 59)) {     alarmMinute = newAlarmMinute; } }  public void setAlarmAmOrPm(String newAlarmAmOrPm) { alarmAmOrPm = newAlarmAmOrPm; }  public void setIsAlarmRinging(boolean isAlarmRinging) { if (isAlarmRinging = true) {     System.out.println("Ringing!"); } }  public void advanceOneMinute() { minute++; if (minute == 59) {     hour++; } }  public void advanceMinutes(int minutesToAdvance) {  }  public void advanceOneHour() { hour++; if (hour > 12) { hour = 1; }     }  public void advanceHours(int hoursToAdvance) {  }  public void setTime(int newHour, int newMinute, String newAmOrPm) { hour = newHour; amOrPm = newAmOrPm; }  public void setAlarmTime(int newAlarmHour, int newAlarmMinute, String newAlarmAmOrPm) {  if(hour >=0 && hour <= 23 && minute >=0 && minute <= 59) {  newAlarmHour = hour;  newAlarmMinute = minute; }  }  public void turnOffAlarm() { isAlarmRinging = false; }  public void displayTime() {  }  public void displayAlarmTime() {  }   }   

Está lejos de hacerlo, pero es un comienzo. Si puedes decirme lo que pueda hacer, estaré muy agradecido. No estoy seguro exactamente cuál es mi pregunta. Solo si estoy en el camino correcto y lo que estoy haciendo mal. Lo siento, no es una pregunta corta, concisa y clara.

Original en ingles

I have a question regarding a program that is to run an alarm clock and display the time (HH:MM AM/PM) and also trigger the alarm and display "ringing" at 12:00 AM.

I am a beginner in Java and I am a little lost. I believe I have most of the skeletal work done. This is much like another question asked on here but I could not find an answer to my problems. So I apologize for the similarity. I am also to create a "dummy driver" in order to test the method as one of the requirements for this program is to be able to be read by a general driver someone else has created. Therefore, all of my variables and methods must be left the way I have them in order to be read by said driver. I wish I could be a little more specific in what I need assistance with but any feedback you can give me is much appreciated.

This is what I've got so far:

//dummy driver package program5;  public class Program5 {  public static void main(String[] args) { AlarmClock alarm = new AlarmClock(); System.out.println(alarm.getHour() + ":" + alarm.getMinute() + alarm.getAmOrPM()); System.out.println(alarm.getAlarmHour() + ":" + alarm.getAlarmMinute() + alarm.getAlarmAmOrPm()); System.out.println(alarm.isIsAlarmRinging()); } }   package program5;  public class AlarmClock {  private int hour; private int minute; private String amOrPm; private int alarmHour; private int alarmMinute; private String alarmAmOrPm; private boolean isAlarmRinging;  //constructor: AlarmClock() { hour = 12; alarmHour = 12; minute = 0; alarmMinute = 0; alarmAmOrPm = new String(); amOrPm = new String(); isAlarmRinging = false; }   //getters: public int getHour() { if ((hour >= 1) && (hour <= 12)) { } return hour; }  public int getMinute() { if ((minute >= 0) && (minute <= 59)) { } return minute; }  public String getAmOrPM() { return amOrPm; }  public int getAlarmHour() { return alarmHour; }  public int getAlarmMinute() { return alarmMinute; }  public String getAlarmAmOrPm() { return alarmAmOrPm; }  public boolean isIsAlarmRinging() { if (hour >= 12){ isAlarmRinging = true; } return isAlarmRinging; }  //setters public void setHour(int newHour) { if ((newHour >= 1) && (newHour <= 12)) {     hour = newHour; } }  public void setMinute(int newMinute) { if ((newMinute >= 0) && (newMinute <= 59)) {     minute = newMinute; } }  public void setAmOrPM(String newAmOrPm) { amOrPm = newAmOrPm; }  public void setAlarmHour(int newAlarmHour) { if ((newAlarmHour >= 1) && (newAlarmHour <= 12)) {     alarmHour = newAlarmHour; } }  public void setAlarmMinute(int newAlarmMinute) { if ((newAlarmMinute >= 0) && (newAlarmMinute <= 59)) {     alarmMinute = newAlarmMinute; } }  public void setAlarmAmOrPm(String newAlarmAmOrPm) { alarmAmOrPm = newAlarmAmOrPm; }  public void setIsAlarmRinging(boolean isAlarmRinging) { if (isAlarmRinging = true) {     System.out.println("Ringing!"); } }  public void advanceOneMinute() { minute++; if (minute == 59) {     hour++; } }  public void advanceMinutes(int minutesToAdvance) {  }  public void advanceOneHour() { hour++; if (hour > 12) { hour = 1; }     }  public void advanceHours(int hoursToAdvance) {  }  public void setTime(int newHour, int newMinute, String newAmOrPm) { hour = newHour; amOrPm = newAmOrPm; }  public void setAlarmTime(int newAlarmHour, int newAlarmMinute, String newAlarmAmOrPm) {  if(hour >=0 && hour <= 23 && minute >=0 && minute <= 59) {  newAlarmHour = hour;  newAlarmMinute = minute; }  }  public void turnOffAlarm() { isAlarmRinging = false; }  public void displayTime() {  }  public void displayAlarmTime() {  }   } 

It's far from done but it's a start. If you can tell me anything I can do, I'll be very thankful. I'm not sure exactly what my question is. Just if I'm on the right track and what I'm doing wrong. Sorry it's not a short, concise, clear-cut question.

        
 
 

Lista de respuestas

6
 
vote

Calendario

Usted ha creado una celva de alarma, que es realmente una representación de tiempo. A Calendar tiene una fecha y Componente de tiempo. En gran medida, sugiero que lo use, por lo que puede dejar que su usuario defina cómo quiere que su cita esté representada y deje que la API maneje las cosas de lujo como las zonas horarias, las horas de verano, etc.

También puede mirar en el Java 8 Time Api pero creo que podría no ser apropiado todavía.

Enums

Cuando tiene un conjunto limitado de diferentes posibilidades, su mente debe vagar de inmediato a enums . De esta manera, puede representar su AM / PM diciendo DayPart.AM y DayPart.PM en lugar de la cadena literal "AM", que podría ser utilizado de forma errónea como "AM", "AM", "Axe", etc. proporcionará una seguridad de tiempo de compilación y es mucho más agradable para trabajar.

indentación

apégueso a las convenciones. Algunas personas indican un bloque con una pestaña (o 4 espacios), algunos con 2 espacios . Esto mantendrá el código legible para todos.

Métodos sin un cuerpo significativo

Mira tu código aquí:

  public int getHour() { if ((hour >= 1) && (hour <= 12)) { } return hour; }   

con formato Esto se convierte en esto:

  public int getHour() {     if ((hour >= 1) && (hour <= 12)) {     }      return hour; }   

¿Puedes decir qué está mal aquí? Tenga en cuenta que hay varios métodos que tienen este constructo!

Asignación contra comparación de VS

Este es un error muy común:

  if (isAlarmRinging = true)   

Qué haces aquí está configurado isAlarmRinging TO true , nunca lo comparas.

Tenga en cuenta:

  • Comparación: == .
  • Asignación: = .

Parámetros no utilizados

En su método DayPart.AM0 Nunca use el parámetro DayPart.AM1 .
Del mismo modo en el método DayPart.AM2 Nunca usa DayPart.AM3 .

 

Calendar

You created an alarmclock, which is really just a time-representation. A Calendar has both a date and time component. I strongly, strongly suggest you use that so you can let your user define how he wants his date represented and let the API handle fancy stuff like timezones, summer hours, etc.

You can also look into the Java 8 time API but I think that might not be appropriate yet.

Enums

When you have a limited set of different possibilities, your mind should immediately wander to enums. This way you can represent your AM/PM by saying DayPart.AM and DayPart.PM instead of the literal string "AM" which could mistakenly be used as "aM", "am", "AX", etc. It will provide compile-time safety and is a lot more pleasant to work with.

Indentation

Stick to conventions. Some people indent a block with one tab (or 4 spaces), some with 2 spaces. This will keep the code readable for everyone.

Methods without a meaningful body

Look at your code here:

public int getHour() { if ((hour >= 1) && (hour <= 12)) { } return hour; } 

With formatting this becomes this:

public int getHour() {     if ((hour >= 1) && (hour <= 12)) {     }      return hour; } 

Can you tell what's wrong here? Note that there are several methods that have this construct!

Assignment vs Comparison

This is a very common mistake:

if (isAlarmRinging = true) 

What you do here is set isAlarmRinging to true, you never compare it.

Keep in mind:

  • Comparison: ==.
  • Assignment: =.

Unused parameters

In your method setTime you never use the parameter newMinute.
Likewise in method setAlarmTime you never use newAlarmAmOrPm.

 
 
   
   
3
 
vote

Un error es que su constructor inicializa el reloj a un estado no válido: 99887776655443314 se establece en una cadena vacía.

Usted mantiene las siete variables de estado: DayPart.AM5 , DayPart.AM6 , DayPart.AM7 , DayPart.AM8 , 99887776655443319 , DayPart.PM020 , DayPart.PM1 . MANTENIMIENTO DayPart.PM2 y DayPart.PM3 Por separado, hacer el transporte manualmente, es problemático.

Le sugiero la reducción de eso a tres: 99887776655443324 , DayPart.PM5 , 99887766555443326 . Mantenga el tiempo como el número de minutos desde la medianoche.

  DayPart.PM7  

¡Ni siquiera necesitas un constructor explícito! Los valores predeterminados hará que el tiempo se inicialice a medianoche.

Te lo dejaré para rellenar el resto.

Observa la consistencia de su capitalización en DayPart.PM8 . Ya sea DayPart.PM9 o public int getHour() { if ((hour >= 1) && (hour <= 12)) { } return hour; } 0 sería aceptable; Prefiero este último, especialmente porque coincide con la forma en que nombró su public int getHour() { if ((hour >= 1) && (hour <= 12)) { } return hour; } 1 variable.

 

One bug is that your constructor initializes the clock to an invalid state: amOrPm is set to an empty string.

You keep a seven state variables: hour, minute, amOrPm, alarmHour, alarmMinute, alarmAmOrPm, isAlarmRinging. Maintaining hour and minute separately, doing the carrying manually, is troublesome.

I suggest paring that down to three: time, alarmTime, isAlarmRinging. Keep time as the number of minutes since midnight.

public class AlarmClock {     // Time, in minutes since midnight     private int time;      private static final int MINUTES_PER_12_HOURS = 12 * 60,                              MINUTES_PER_DAY = 24 * 60;      /**      * Returns the hour, between 1 and 12 inclusive.      */     public int getHour() {         int h = (this.time / 60) % 12;         return (h == 0) ? 12 : h;     }      public int getMinute() {         return this.time % 60;     }      public String getAmOrPm() {         return (this.time < MINUTES_PER_12_HOURS) ? "AM" : "PM";     }      public void advanceOneHour() {         this.time = (this.time + 60) % MINUTES_PER_DAY;     }      xe2x80xa6 } 

You don't even need an explicit constructor! The default values will cause the time to be initialized to midnight.

I'll leave it to you to fill in the rest.

Watch the consistency of your capitalization in getAmOrPM(). Either getAMOrPM() or getAmOrPm() would be acceptable; I prefer the latter, especially since it matches the way you named your amOrPm variable.

 
 
3
 
vote

No estoy demasiado familiarizado con Java, por lo que no revisaré ningún aspecto específico de eso. Solo quiero abordar la falta de sangría en este código, lo cual es muy importante.

Tomemos la primera parte de su código:

  public class Program5 {  public static void main(String[] args) { AlarmClock alarm = new AlarmClock(); System.out.println(alarm.getHour() + ":" + alarm.getMinute() + alarm.getAmOrPM()); System.out.println(alarm.getAlarmHour() + ":" + alarm.getAlarmMinute() + alarm.getAlarmAmOrPm()); System.out.println(alarm.isIsAlarmRinging()); } }   

Cada vez que tenga algo dentro de {} que están en varias líneas, el código dentro del {} debe ser sangrado para que los lectores sepan que el código pertenece a este bloque. . En esta parte de código, es difícil decir lo que pertenece dentro de qué porque todo está alineado hacia el lado.

En esta parte, cuando tiene una línea que se abre con un { , como

  public class Program5 {   

El código dentro de esta contención debe ser sangrado. El número de espacios para sangrar por no es concreto y, en su mayoría, depende del medio ambiente y el lenguaje. En esta respuesta, usaré cuatro espacios.

Si seguimos esta idea de sangría, esa parte del código debe verse así:

  public class Program5 {      public static void main(String[] args) {         AlarmClock alarm = new AlarmClock();         System.out.println(alarm.getHour() + ":" + alarm.getMinute() + alarm.getAmOrPM());         System.out.println(alarm.getAlarmHour() + ":" + alarm.getAlarmMinute() + alarm.getAlarmAmOrPm());         System.out.println(alarm.isIsAlarmRinging());     } }   

Hay dos { , por lo que el siguiente código para cada una de esas declaraciones está sangrado. Ahora puede ver qué pertenece a qué, aumentando así la legibilidad.

 

I'm not too familiar with Java, so I won't review any specific aspect of that. I just want to address the lack of indentation in this code, which is very important.

Let's take the first portion of your code:

public class Program5 {  public static void main(String[] args) { AlarmClock alarm = new AlarmClock(); System.out.println(alarm.getHour() + ":" + alarm.getMinute() + alarm.getAmOrPM()); System.out.println(alarm.getAlarmHour() + ":" + alarm.getAlarmMinute() + alarm.getAlarmAmOrPm()); System.out.println(alarm.isIsAlarmRinging()); } } 

Whenever you have something inside of {} that are on multiple lines, the code within the {} should be indented so that readers will know that the code belongs in this block. In this code portion, it's hard to tell what belongs inside of what because everything is aligned towards the side.

In this portion, when you have a line that opens with a {, such as

public class Program5 { 

the code within this containment should be indented. The number of spaces to indent by is not concrete and mostly depends on the environment and language. In this answer, I will use four spaces.

If we follow this idea of indentation, that code portion should look like this:

public class Program5 {      public static void main(String[] args) {         AlarmClock alarm = new AlarmClock();         System.out.println(alarm.getHour() + ":" + alarm.getMinute() + alarm.getAmOrPM());         System.out.println(alarm.getAlarmHour() + ":" + alarm.getAlarmMinute() + alarm.getAlarmAmOrPm());         System.out.println(alarm.isIsAlarmRinging());     } } 

There are two {, so the following code for each of those statements is indented. You can now see what belongs to what, thereby increasing readability.

 
 

Relacionados problema

0  Valor numérico para una fecha, DataTado y Datediff  ( Numeric value for a date dateadd and datediff ) 
En MS Excel, una fecha también se representa como un valor numérico, con el 1-enero-1900 como el primer día. También en VBA hay funciones de DataLTD y Datedif...

6  Compara el último tiempo de modificación con tiempo especificado  ( Compare last modification time with specfied time ) 
Estoy escribiendo una función en Python que compara el tiempo de modificación de un archivo en Linux (usando OS.STAT) con un tiempo específico y compare las f...

2  Obtén el primer patrimonio dado por los días de semana y un tiempo de inicio  ( Get first datetime by given weekdays and a starttime ) 
En el trabajo hay un sistema de entrada donde los clientes pueden especificar los días de semana y una hora de inicio para un evento. Los días de semana son e...

5  Calcular el tiempo transcurrido de los tiempos de entrada sin usar declaraciones condicionales  ( Calculate elapsed time from input times without using conditional statements ) 
Acabo de empezar la programación y nos estamos enseñando C ++. Después de nuestra 2ª conferencia, nos dieron una tarea para hacer un programa que tome dos val...

4  Salida de una cuenta regresiva en un div  ( Outputting a countdown in a div ) 
Obtuve este código trabajando con el complemento de cuenta regresiva jQuery para tomar una entrada y salida una cadena cuenta regresiva en un div. ¿Hay una ...

5  Método de cálculo del día del año  ( Day of year calculation method ) 
El ejercicio que quería resolver es de aquí . Copiando desde esa página: public static int dayOfYear(int month, int dayOfMonth, int year) { if (month...

10  Obteniendo tiempo actual con milisegundos  ( Getting current time with milliseconds ) 
Estoy buscando una forma más eficiente o más corta de lograr la siguiente salida utilizando el siguiente código: timeval curTime; gettimeofday(&curTime, NU...

8  Conversión de STD :: Chrono :: Time_Point to / from std :: string  ( Converting stdchronotime point to from stdstring ) 
Considere estas funciones que permitan convertir checkOnline.sh4 a / FROM checkOnline.sh5 Con un formato Fecha de fecha ". checkOnline.sh6 con uso:...

5  Representando el tiempo de apertura y cierre para un negocio  ( Representing the opening and closing time for a business ) 
Tengo una clase de openclose que solo representa las horas de operación de un negocio por la apertura y el tiempo de cierre. Toma los tiempos de apertura y ci...

10  Obteniendo la última fecha donde ocurrió un día de la semana dado  ( Getting the last date where a given week day occurred ) 
Estoy tratando de aprender un poco sobre la programación funcional y como mi herramienta, elegí F # ya que soy un desarrollador de .NET y el medio ambiente es...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos