Autor Tema: Ejercicios resueltos ejemplos java juego lotería primitiva clase Random CU00909C  (Leído 4833 veces)

@mayakoski

  • Sin experiencia
  • *
  • Mensajes: 43
    • Ver Perfil
Buenos días a continuación dejo el codigo de los dos ejercicios planteados en la clase CU00909C del tutorial de programación pdf Java avanzado.

Ejercicio 1

Código: [Seleccionar]
package claseCU00908C;

import java.util.Random;
import java.util.Scanner;

public class EjercicioCU00909C1 {
public static void main(String[] args) {

int numA, numB;
int pGanadas=0, pPerdidas=0;
Scanner entradaTeclado = new Scanner(System.in);
Random rnd = new Random();
char seleccion;
boolean valida = false;
do {
do {
numA = (int)(rnd.nextDouble()*11);
numB = (int)(rnd.nextDouble()*11);
}while(numA==numB);

System.out.print("Apuestas por A o por B ? :");
do {
seleccion = entradaTeclado.next().toUpperCase().charAt(0);
if((seleccion == 'A') || (seleccion == 'B')) {
valida = true;
}else {
System.out.print("Elija opcion valida por A o por B ? ");
}
}while(!valida);

System.out.print("A saca un " + numA + " y B saca un " + numB);
if(seleccion =='A' && (numA > numB) || seleccion =='B' && (numB > numA) ) {
System.out.println(" HAS GANADO!!!");
pGanadas+=1;
}else {
System.out.println(" HAS PERDIDO!!!");
pPerdidas+=1;
}

System.out.println("Llevas " + pGanadas + " partidas ganadas y " + pPerdidas + " partidas perdidas");

System.out.print("Quieres probar otra vez ? (S/N) : ");
} while(entradaTeclado.next().toUpperCase().equals("S"));
}
}

Ejercicio 2
Código: [Seleccionar]
package claseCU00908C;

import java.util.Random;
import java.util.Scanner;

public class EjercicioCU00909C2 {

static Scanner entradaTeclado = new Scanner(System.in);

public static void main(String[] args) {
int[] numerosUsuario = new int[6];
int[] numerosGanadores = new int[6];

do {

System.out.println("Elije 6 numero entre el 1 y el 49");
creaNumeros(numerosUsuario, numerosGanadores);

System.out.print("Numero Elejidos : ");
imprimeNumeros(numerosUsuario);

System.out.print("Combinacion ganadora :");
imprimeNumeros(numerosGanadores);

verificaAciertos(numerosUsuario, numerosGanadores);

System.out.print("Quieres probar otra vez? (S/N): ");
} while(entradaTeclado.next().toUpperCase().equals("S"));

System.out.println("Adios");

}

public static void creaNumeros(int[] pNumerosUsuario, int[] pNumerosGanadores) {

Random rnd = new Random();
for (int i = 0; i < pNumerosUsuario.length; i++) {
System.out.print("Elije el numero " + (i+1) + ": ");
pNumerosUsuario[i] = entradaTeclado.nextInt();

while((pNumerosUsuario[i] < 1) || (pNumerosUsuario[i] > 49)) {
System.out.print("El numero esta fuera de rango, elije otro: ");
pNumerosUsuario[i] = entradaTeclado.nextInt();
}

for (int j = 0; j < i; j++) {
while((pNumerosUsuario[j]==pNumerosUsuario[i])) {
System.out.print("El numero ya esta ingresado, elije otro: ");
pNumerosUsuario[i] = entradaTeclado.nextInt();
}
}

pNumerosGanadores[i] = (int) (rnd.nextDouble()*50);
//System.out.println(pNumerosGanadores[i]);
}
}

public static void imprimeNumeros(int[] pListaNumeros) {
for (int i = 0; i < pListaNumeros.length; i++) {
System.out.print(pListaNumeros[i] + " ");
}
System.out.println();
}

public static void verificaAciertos(int[] pNumerosUsuario, int[] pNumerosGanadores) {
int aciertos = 0;
for (int i = 0; i < pNumerosGanadores.length; i++) {
for (int j = 0; j < pNumerosUsuario.length; j++) {
if(pNumerosGanadores[i] == pNumerosUsuario[j]) {
aciertos += 1;
}
}
}
System.out.println("Has acertado: " + aciertos + " números");
}
}

Saludos
« Última modificación: 31 de Agosto 2020, 19:41 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas, para quien revise este hilo, el ejercicio 1 está bien resuelto. No obstante usar algo como numA = (int)(rnd.nextDouble()*11); parece poco elegante, en el sentido de que se genera un double para luego hacer un casting a un entero. ¿Por qué no generar directamente el entero y ahorrarnos el casting? Tampoco tiene demasiada importancia, pero ahí queda como reflexión.

En el ejercicio 2 además de lo indicado hay un defecto. El ejercicio pedía "que introduzca 6 números enteros comprendidos entre el 1 y el 49 ambos incluidos."
Por tanto los números válidos son del 1 al 49.

Sin embargo para crear los números ganadores en el código se utiliza

pNumerosGanadores[ i ] = (int) (rnd.nextDouble()*50);

¿Qué ocurre si el método nextDouble nos devuelve 0? Un número ganador sería el 0, pero esto no es conforme a lo que dice el enunciado.

De hecho, lo he comprobado y haciendo pruebas me ha salido por ejemplo Combinacion ganadora   :31 40 37 39 2 0  donde vemos que aparece el cero, que no es correcto.

Otro aspecto que sería deseable es que los resultados de la combinación ganadora se mostraran en orden ascendente. Por ejemplo en lugar de Combinacion ganadora   :12 9 42 16 43 11
 que saliera Combinacion ganadora   :9 11 12 16 42 43 


Puede verse una solución correcta para este ejercicio en https://aprenderaprogramar.com/foros/index.php?topic=5682.0

Salu2
« Última modificación: 14 de Diciembre 2020, 21:38 por Ogramar »

@mayakoski

  • Sin experiencia
  • *
  • Mensajes: 43
    • Ver Perfil
Saludos

He modificado el código en base a las observaciones, es correcto que no hay razón de generar un double para pasarlo a integer, y he corregido la generación de 0 en la lotería primitiva, además de colocar ordenado el arreglo de la combinación ganadora

Saludos

Ejercicio 1.
Código: [Seleccionar]
package claseCU00908C;

import java.util.Random;
import java.util.Scanner;

public class EjercicioCU00909C1 {
public static void main(String[] args) {

int numA, numB;
int pGanadas=0, pPerdidas=0;
Scanner entradaTeclado = new Scanner(System.in);
Random rnd = new Random();
char seleccion;
boolean valida = false;
do {
do {
numA = rnd.nextInt(100);
numB = rnd.nextInt(100);
}while(numA==numB);

System.out.print("Apuestas por A o por B ? :");
do {
seleccion = entradaTeclado.next().toUpperCase().charAt(0);
if((seleccion == 'A') || (seleccion == 'B')) {
valida = true;
}else {
System.out.print("Elija opcion valida por A o por B ? ");
}
}while(!valida);

System.out.print("A saca un " + numA + " y B saca un " + numB);
if(seleccion =='A' && (numA > numB) || seleccion =='B' && (numB > numA) ) {
System.out.println(" HAS GANADO!!!");
pGanadas+=1;
}else {
System.out.println(" HAS PERDIDO!!!");
pPerdidas+=1;
}

System.out.println("Llevas " + pGanadas + " partidas ganadas y " + pPerdidas + " partidas perdidas");

System.out.print("Quieres probar otra vez ? (S/N) : ");
} while(entradaTeclado.next().toUpperCase().equals("S"));
}
}


Ejercicio 2.
Código: [Seleccionar]
package claseCU00908C;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class EjercicioCU00909C2 {

static Scanner entradaTeclado = new Scanner(System.in);

public static void main(String[] args) {
int[] numerosUsuario = new int[6];
int[] numerosGanadores = new int[6];

do {

System.out.println("Elige 6 numero entre el 1 y el 49");
elegirNumeros(numerosUsuario, numerosGanadores);

System.out.print("Numero Elegidos: ");
imprimeNumeros(numerosUsuario);

System.out.print("Combinacion ganadora: ");
imprimeNumeros(numerosGanadores);

verificaAciertos(numerosUsuario, numerosGanadores);

System.out.print("Quieres probar otra vez? (S/N): ");
} while(entradaTeclado.next().toUpperCase().equals("S"));

System.out.println("Adios");

}

public static void elegirNumeros(int[] pNumerosUsuario, int[] pNumerosGanadores) {

Random rnd = new Random();
for (int i = 0; i < pNumerosUsuario.length; i++) {
System.out.print("Elije el numero " + (i+1) + ": ");
pNumerosUsuario[i] = entradaTeclado.nextInt();

while((pNumerosUsuario[i] < 1) || (pNumerosUsuario[i] > 49)) {
System.out.print("El numero esta fuera de rango, elije otro: ");
pNumerosUsuario[i] = entradaTeclado.nextInt();
}

for (int j = 0; j < i; j++) {
while((pNumerosUsuario[j]==pNumerosUsuario[i])) {
System.out.print("El numero ya esta ingresado, elije otro: ");
pNumerosUsuario[i] = entradaTeclado.nextInt();
}
}

pNumerosGanadores[i] = rnd.nextInt(49)+1;
//System.out.println(pNumerosGanadores[i]);
}
Arrays.sort(pNumerosGanadores);
}

public static void imprimeNumeros(int[] pListaNumeros) {
for (int i = 0; i < pListaNumeros.length; i++) {
System.out.print(pListaNumeros[i] + " ");
}
System.out.println();
}

public static void verificaAciertos(int[] pNumerosUsuario, int[] pNumerosGanadores) {
int aciertos = 0;
for (int i = 0; i < pNumerosGanadores.length; i++) {
for (int j = 0; j < pNumerosUsuario.length; j++) {
if(pNumerosGanadores[i] == pNumerosUsuario[j]) {
aciertos += 1;
}
}
}
System.out.println("Has acertado: " + aciertos + " números");
}
}


 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".