Java - crear clase Numero y clase Tablero

 
Vista:

crear clase Numero y clase Tablero

Publicado por vanesa (6 intervenciones) el 04/09/2019 02:05:36
Me ayudan con este problema...

En el juego de la ruleta, defina la clase número. Luego realice los siguientes métodos:
 Obtener número
 Dado un número, determinar si es par o impar
 Dado un número, determinar a qué docena pertenece
¿Si quisiera crear la clase tablero como podría hacerlo?

tengo el codigo hasta aqui..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Numero {
    int par;
    int impar;
 
    public Numero() {
    }
 
    public Numero(int par, int impar) {
        this.par = par;
        this.impar = impar;
 
    }
 
    public int getPar() {
        return par;
    }
 
    public void setPar(int par) {
        this.par = par;
    }
 
    public int getImpar() {
        return impar;
    }
 
    public void setImpar(int impar) {
        this.impar = impar;
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 766
Plata
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

crear clase Numero y clase Tablero

Publicado por Rodrigo (194 intervenciones) el 04/09/2019 03:50:16
Agrega metodos que retornen Boolean y que sea el mismo objeto el que sepa si es par o impar, sin que tengas que retornar el numero interno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 1.766
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

crear clase Numero y clase Tablero

Publicado por Kabuto (439 intervenciones) el 04/09/2019 10:40:07
De hecho, añadiendo a lo que dice Rodrigo, tu clase número no debería tener dos atributos: par e impar.

Solo debería tener un atributo: el número que representa.

Y un método boolean que determine si el número representado es par o no lo es.
Este método te lo marco en negrita y te lo dejo sin código para que lo escribas tú.
Si no sabes como sería, dilo y te ayudamos a escribirlo.

Luego además, faltaría otro método que informe a que docena del tablero pertenece este número. Aunque quizás esto lo podría hacer la clase Tablero que falta por escribir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Numero {
 
    private int numero;
 
    public Numero() {
    }
 
    public Numero(int numero) {
        this.numero = numero;
    }
 
    public void setNumero(int numero) {
        this.numero = numero;
    }
 
    public int getNumero() {
        return numero;
    }
 
    public boolean esPar() {
        //Código para determinar si este número es PAR o no lo es
    }
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

crear clase Numero y clase Tablero

Publicado por vanesa (6 intervenciones) el 04/09/2019 21:00:56
Gracias Rodrigo Y kabuto, ya pude crear la clase numero, ahora estoy con la clase tablero, puse que heredaba de numero..o sea..

public class Tablero extends Numero { }, con sus constructores getters y setters, ahora mi problema esta de vuelta en el metodo que me diga a que docena pertenece cada numero.

por lo que veo el tablero tiene tres docenas, pero no se como plantearlo en el metodo.

como podria hacerlo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 1.766
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

crear clase Numero y clase Tablero

Publicado por Kabuto (439 intervenciones) el 05/09/2019 01:12:42
Hola.

Ruleta no debería heredar de Numero.
Ruleta ha de incluir a Numero, pero no heredar.

Una clase hereda de otra cuando la clase "Padre" es una versión más generalizada, menos concreta, que la clase "Hija".
Esto se entiende mejor si pensamos en Hombre, Mujer y Persona.

Mujer y Hombre son clases distintas, pero ambas heredan de la clase Persona.
Personas sería la clase "Padre" porque representa un concepto más general. Mujer y Hombre, ambos son Personas, pero representan un concepto mucho más concreto, porque incluirían atributos únicos que no son compartidos entre Hombre y Mujer.

Persona tendría atributos comunes: nombre, edad, peso, estado civil....

Hombre y Mujer heredarían esos atributos, pero añadirían otros que son específicos de cada uno. Por ejemplo, el atributo boolean estaEmbarazada -> true/false, sería único para la clase Mujer.


Dicho esto, pensemos ahora en otra asociación: Persona y Equipo.
¿Tiene sentido decir que Equipo hereda de Persona? ¿Un Equipo es una versión más concreta y específica de una Persona?
No, no tiene sentido.

Un Equipo contiene a varias Persona, pero eso no implica una relación de herencia "Padre" -> "Hija".


Pues esto mismo ocurre con Numero y Ruleta.
Una Ruleta va a incluir a varios Numero, pero no es una asociación de herencia, sino una asociación de inclusión.


¿Cómo modelamos esta asociación?

Pues Ruleta tendrá un atributo asociado a la clase Numero.
Sabemos que una ruleta del mundo real tiene 37 números, que van del 0 al 36.

Pues nuestra clase Ruleta ha de tener 37 objetos Numero. Para poder gestionarlos cómodamente, los agruparemos juntos en algún tipo de colección. Para este caso, nos bastaría con un array simple.

Mira, el enunciado del ejercicio no es muy específico, así que eso nos da un poco de libertad para resolverlo como mejor nos parezca, por tanto, hay varias formas de solucionarlo y te voy a mostrar la que yo he escogido.

Primero te pongo la clase Numero. Finalmente me ha parecido mejor que sea el propio Numero quien informe de a que docena pertenece.
No nos dicen como hacer esto. Se podría hacer que muestre un mensaje en pantalla o que devuelva un String tipo "Pertenece a 1ª Docena"

Yo he pensado que lo ideal sería un método que devuelva un valor int.
Si es de la primera docena (1-12) que devuelva 1, si es de la segunda docena(13-24) que devuelva un 2 y si es de la tercera docena (25-36) que devuelva un 3.
Si es un 0, según la reglas de la ruleta el 0 no pertenece a ninguna docena, así que entonces retornará un 0.

La ventaja de hacer que devuelva un int es que si quisiéramos hacer un juego más completo, con apuestas y todo, es más fácil evaluar un valor int para valorar si ha perdido ganado la apuesta que no un String.

Esta sería la clase Numero

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Numero {
 
    private int numero;
 
    public Numero() {  }
 
    public Numero(int numero) {
        this.numero = numero;
    }
 
    public void setNumero(int numero) {
        this.numero = numero;
    }
 
    public int getNumero() {
        return numero;
    }
 
    public boolean esPar() {
        return numero % 2 == 0;
    }
 
    public int valorDocena() {
    	if (numero == 0)
    		return 0; //El 0 no pertenece a ninguna docena
    	else if (numero >= 1 && numero <= 12)
    		return 1; //Primera docena
    	else if (numero >= 13 && numero <= 24)
    		return 2; //Segunda docena
    	else
    		return 3; //Tercera docena
    }
 
}

La clase Ruleta, como hemos dicho, tendrá un array de 37 objetos Numero.
Su constructor no recibirá ningún parámetro, pero ha de encargarse de inicializar ese array y darle los valores del 0 al 36 a los 37 Numero.

Yo le he puesto un único método, que se encarga de devolver un Numero al azar, es decir, simula el lanzamiento de una bola a la Ruleta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Ruleta {
 
	private Numero[] ruleta;
 
	public Ruleta() {
		//Construimos ruleta con 37 numeros, del 0 al 36
		ruleta = new Numero[37];
		//Asignamos valores del 0 al 36
		for (int i = 0; i < 37; i++)
			ruleta[i] = new Numero(i);
	}
 
	public Numero getNumero() {
		int bola = (int)(Math.random() * 37);
		return ruleta[bola];
	}
 
}

Luego he hecho otra clase con método main(), simplemente para probar.
Le pido a la Ruleta que "tire una bola" (que me de un Numero al azar) y analizo este Numero para informar en pantalla de si es par/impar y a que docena pertenece.
Si recibo un 0, informo de que en este caso, no se considera par/impar ni pertenece a ninguna docena.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ProbarRuleta {
 
	private static Ruleta ruleta;
 
	public static void main(String[] args) {
		ruleta = new Ruleta();
 
		Numero numero = ruleta.getNumero();
 
		System.out.println("Número obtenido: " + numero.getNumero());
		if (numero.getNumero() != 0) {
			System.out.println(numero.esPar()?"Es un par":"Es un impar");
			System.out.println("Pertenece a la Docena: " + numero.valorDocena());
		}
		else
			System.out.println("El valor 0 no es par/impar ni pertenece a ninguna Docena");
 
	}
 
}

Resultado en pantalla:

1
2
3
Número obtenido: 13
Es un impar
Pertenece a la Docena: 2


Como digo, esto es una forma de resolverlo. Hay otras formas, como que por ejemplo sea la propia Ruleta quien analice el Numero obtenido y no el main().
Es cuestión de gustos.

Pregunta cualquier duda que tengas y perdón si me he extendido demasiado con explicaciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

crear clase Numero y clase Tablero

Publicado por Vanesa (6 intervenciones) el 05/09/2019 02:37:10
Gracias..muy buena explicación!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 1.766
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

crear clase Numero y clase Tablero

Publicado por Kabuto (439 intervenciones) el 07/09/2019 11:50:30
Hola.
Me ha llegado un privado tuyo, pero no puedo responderte pro privado, quizás porque no estás registrada. No se..

De todos modos, prefiero responder en público porque así todo el mundo puede aprender y aportar.

Tu mensaje:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
En el siguiente codigo tengo que crear un metodo que me diga cuantos dias faltan para mi cumpleaños y cuantos dias he vivido desde que naci.
Lo tengo hasta aqui..
public class Fecha {
private int dia;
private int mes;
private int año;
 
public Fecha() {
}
 
public Fecha(int dia, int mes, int año) {
this.dia = dia;
this.mes = mes;
this.año = año;
}
 
public int getDia() {
return dia;
}
 
public void setDia(int dia) {
this.dia = dia;
}
 
public int getMes() {
return mes;
}
 
public void setMes(int mes) {
this.mes = mes;
}
 
public int getAño() {
return año;
}
 
public void setAño(int año) {
this.año = año;
}
 
public void calcularEdad(int dia, int mes, int año){
LocalDate fechaNac = LocalDate.of(dia, mes, año);
 
System.out.printf("Desglosando......Dia: $s Nro.Mes: $s Nombre.Mes: $s Año: $s\n", fechaNac.getDayOfMonth(),fechaNac.getMonth(), fechaNac.getYear());
 
LocalDate ahora = LocalDate.now();
 
Period periodo = Period.between(ahora, fechaNac);
 
System.out.printf("Mi edad es: $s años,$s meses y $s dias\n", periodo.getYears(), periodo.getMonths(), periodo.getDays());
}
public int diasQueFaltan(int dia, int mes, int año){
int diasQF=0;
LocalDate fechaNac = LocalDate.of(dia, mes, año);
LocalDate ahora = LocalDate.now();
}
}

Mi respuesta.

Primero, no se si realmente necesitas que esta clase tenga getters y setters para dia, mes y año.
Los getters y setters no son obligatorios, según lo que queramos modelar, unas veces los necesitaremos y otras no.
Como no se cuál es el enunciado original y quizás si te lo están pidiendo, pues los podemos dejar.

Pero vamos, luego verás que de hecho, en los dos métodos que vamos a escribir, ni siquiera hacemos uso de esos tres atributos, así que realmente no parecen necesarios.

Vamos al método de calcularEdad.

Lo primero es comentarte que cuando usamos printf en Java (o C/C++), el carácter "comodín" no es el símbolo de dolar, es el tanto por ciento %
Este va seguido de una letra para indicar el tipo de dato que pondremos en este comodín.
Cuando son números enteros, se usa la letra d, para indicar que es un valor numérico del sistema "decimal"
%d -> 7

Si es una cadena de texto, se pone una s, de "string"

%s -> "siete"

Si es un número real, con decimales, se usa la letra f de "float", porque será un valor con "coma flotante". En Java esto sirve para los tipos double y float.

%f -> 7.4

Bueno, esto es lo básico. Pero hay muchas más posibilidades y reglar para dar formato con este sistema. Busca en Google ejemplos de uso de printf o de String.format() para aprender más.

Vale, para que funcione tu método de calcular edad quedaría así:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void calcularEdad(int dia, int mes, int año){
		LocalDate fechaNac = LocalDate.of(año, mes , dia); //El orden es año, mes, dia...
 
		System.out.printf("Desglosando......Dia: %d Nro.Mes: %d Nombre.Mes: %s Año: %d\n",
				fechaNac.getDayOfMonth(),fechaNac.getMonthValue(), fechaNac.getMonth(), fechaNac.getYear());
 
		LocalDate ahora = LocalDate.now();
 
		Period periodo = Period.between(fechaNac, ahora);//Primero la fechaNacimiento, si no, saldrán valores negativos
 
		System.out.printf("Mi edad es: %d años,%d meses y %d dias\n",
				periodo.getYears(), periodo.getMonths(), periodo.getDays());
	}


Para el método diasQueFaltan(). Es aún más fácil.

Con LocalDate, podemos pedirle que nos diga que "día del año", desde el 1 al 365 (o 366), está representando cada objeto según los valores que le hemos indicado.

Así que nos basta con pedirle que día del año es la del cumpleaños, que día del año es hoy y calcular la diferencia.

Lo único que hay que tener en cuenta es si el cumpleaños ya ha pasado o no.
Esto lo sabemos preguntando si el día de su cumpleaños es mayor (o igual) al día de hoy
Si el usuario aún no ha cumplido años, bastará con restar el día de su cumple, por ejemplo el 320, al día de hoy, por ejemplo, el 280.
320 - 280 = 40 días faltan.

Pero si el cumpleaños ya ha pasado., hay que calcular cuanto falta para el día del año siguiente.
Basta con averiguar cuanto falta para terminar este año --> 365 - hoy

Y esos días que faltan, se suman al día representado por el cumpleaños.

Para ser super exactos, habría que comprobar si el año es bisiesto o no, y si el cumpleaños es antes o después de Febrero... pero no vale la pena tanto esfuerzo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public int diasQueFaltan(int dia, int mes, int año){
 
		LocalDate fechaNac = LocalDate.of(año, mes, dia);
		LocalDate ahora = LocalDate.now();
 
		int hoy = ahora.getDayOfYear();
		int miCumple =  fechaNac.getDayOfYear();
 
		if (miCumple >= hoy) //Aun no ha sido mi cumpleaños, me basta con una simple resta
			return miCumple - hoy;
		else { //Mi cumpleaños ya ha pasado, he de calcular los dias que faltan hasta el próximo año
			//Primero calculamos cuanto falta para terminar este año.
			int diasHastaTerminarAnio = 365 - hoy;
			//Esta diferencia de dias, se suman al dia que representa mi cumpleaños
			return miCumple + diasHastaTerminarAnio;
		}

Si hacemos una clase para Testear.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
 
	public static void main(String[] args) {
 
		Fecha fecha = new Fecha();
 
		System.out.println("--- Probando método CalcularEdad() ---\n");
		fecha.calcularEdad(22,11,1979);
 
		System.out.println("\n--- Probando método diasQueFaltan() ---\n");
		System.out.println("Dias que faltan para mi Cumpleaños: " +
				fecha.diasQueFaltan(22, 11, 1979));
 
	}
 
}

Tenemos esto en pantalla:
1
2
3
4
5
6
7
8
--- Probando método CalcularEdad() ---
 
Desglosando......Dia: 22 Nro.Mes: 11 Nombre.Mes: NOVEMBER Año: 1979
Mi edad es: 39 años,9 meses y 16 dias
 
--- Probando método diasQueFaltan() ---
 
Dias que faltan para mi Cumpleaños: 76

Fíjate que como dije antes, los tres atributos dia, mes y año no se usan para nada. Quizás habría que replantearse si son otros atributos los que vamos a necesitar, o tal vez ninguno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

crear clase Numero y clase Tablero

Publicado por valu (6 intervenciones) el 08/09/2019 05:04:27
Gracias!, bastante claro, entonces si quiero crear un metodo diasVividos deberia hacer uso del LocalDate.now() menos del LocalDate.of("","","")?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 1.766
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

crear clase Numero y clase Tablero

Publicado por Kabuto (439 intervenciones) el 08/09/2019 23:04:47
Sí.

Puedes hacer algo parecido a lo que hicimos aquí:

1
2
3
4
Period periodo = Period.between(fechaNac, ahora);//Primero la fechaNacimiento, si no saldrán valores negativos
 
		System.out.printf("Mi edad es: %d años,%d meses y %d dias\n",
				periodo.getYears(), periodo.getMonths(), periodo.getDays());

Ese objeto Period te da los años, meses y días transcurridos entre la fecha de nacimiento y la de hoy.
Así que puedes coger cada uno de esos datos, convertirlos a días y sumarlos:

(años * 365) + (meses * 30) + días = días Totales Vividos.


Eso te daría una cifra aproximada al total de días vividos, ya que no todos los años tienen 365 días, ni todos los meses duran 30 días.
Sería un valor aproximado, pero al menos es un valor calculado por ti.

Si quieres un valor exacto, Java te lo da ya hecho mediante la clase ChronoUnit

1
2
3
4
5
6
public long diasVividos(int dia, int mes, int año) {
		LocalDate fechaNac = LocalDate.of(año, mes, dia);
		LocalDate ahora = LocalDate.now();
 
		return ChronoUnit.DAYS.between(fechaNac, ahora);
	}

Ojo que no es un valor int lo que devuelve, sino un tipo long.

Por cierto, volviendo al tema de los atributos necesarios para esta clase.
Repito que desconozco el enunciado original, que es quien manda...

Pero si por mi fuera, y puesto que todos los método giran entorno a la fecha nacimiento del usuario, yo lo plantearía con solo dos atributos de tipo LocalDate:
- El ahora
- La fecha nacimiento.

Para la fecha nacimiento necesitaríamos año, mes y día, así que esos serían los datos que pediremos en el constructor.

De este modo, los métodos que escribimos no necesitan recibir ellos también esos datos, tan solo tienen que operar con los atributos LocalDate.

En principio no parece que vayamos a necesitar métodos getter o setter, así que no hay por qué incluirlos..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Fecha {
	LocalDate ahora;
	LocalDate fechaNacimiento;
 
	public Fecha(int dia, int mes, int año) {
		ahora = LocalDate.now();
		fechaNacimiento = LocalDate.of(año, mes , dia);  //El orden es año, mes, dia...
	}
 
	public void calcularEdad() {
 
		System.out.printf("Desglosando......Dia: %d Nro.Mes: %d Nombre.Mes: %s Año: %d\n",
				fechaNacimiento.getDayOfMonth(),fechaNacimiento.getMonthValue(),
				fechaNacimiento.getMonth(), fechaNacimiento.getYear());
 
		LocalDate ahora = LocalDate.now();
 
		Period periodo = Period.between(fechaNacimiento, ahora);//Primero la fechaNacimiento, si no saldrán valores negativos
 
		System.out.printf("Mi edad es: %d años,%d meses y %d dias\n",
				periodo.getYears(), periodo.getMonths(), periodo.getDays());
	}
 
	public long diasVividos() {
		return ChronoUnit.DAYS.between(fechaNacimiento, ahora);
	}
 
	public int diasQueFaltan(){
 
		int hoy = ahora.getDayOfYear();
		int miCumple =  fechaNacimiento.getDayOfYear();
 
		if (miCumple >= hoy) //Aun no ha sido mi cumpleaños, me basta con una simple resta
			return miCumple - hoy;
		else { //Mi cumpleaños ya ha pasado, he de calcular los dias que faltan hasta el próximo año
			//Primero calculamos cuanto falta para terminar este año.
			int diasHastaTerminarAnio = 365 - hoy;
			//Esta diferencia de dias, se suman al dia que representa mi cumpleaños
			return miCumple + diasHastaTerminarAnio;
		}
 
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar