Java - Necesito que me pregunte si los padres son socios o no

 
Vista:
sin imagen de perfil
Val: 13
Ha aumentado su posición en 7 puestos en Java (en relación al último mes)
Gráfica de Java

Necesito que me pregunte si los padres son socios o no

Publicado por Toni (6 intervenciones) el 25/10/2019 18:41:10
Como pongo para que si son los padres socios o no en este codigo



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
58
59
60
61
62
import java.util.Scanner;
 
public class ejercicio3 {
 
	public static void main(String[] args) {
 
		int edad,nombre;
 
		double cuotafinal;
		double cuota,porcentaje1, porcentaje2, porcentaje3;
		cuotafinal= 0;
		cuota= 500;
		porcentaje1= 0.50;
		porcentaje2= 0.25;
		porcentaje3= 0.35;
		boolean familiar1= true;
		boolean familiar2= false;
 
 
		Scanner sc =new Scanner(System.in);
		System.out.println("Dime tu nombre: ");
		String name =sc.nextLine();
		System.out.println("Dime tu edad: ");
		edad=sc.nextInt();
 
 
		if(edad>=18) {
		cuotafinal=cuota;
		System.out.println("Tienes que pagar: "+cuotafinal+"€");
		}else {
		if(edad>=65) {
			cuotafinal=cuota*porcentaje1;
			System.out.print("Tienes que pagar: "+cuotafinal+"€");
		}
		}
 
	    String familiar11 = "Si";
  	  System.out.println("¿Tus padres son socios?");
	  	String familiar = sc.nextLine();
 
	    Boolean padres = false;
 
	      if(familiar11.equalsIgnoreCase(familiar11)){
	    	padres = true;
 
	      System.out.println("Los padres si pertenecen al club ");
	        cuotafinal= cuota-(cuota*porcentaje3);
	        System.out.println("Tienes que pagar:"+cuotafinal+"€");
 
	    }else{
 
	       	System.out.println("Los padres no pertenecen al club");
	       	cuotafinal= cuota-(cuota*porcentaje2);
	        System.out.println("Tienes que pagar:"+cuotafinal+"€");
	      }
 
 
 
	  }
 
 
		}
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Necesito que me pregunte si los padres son socios o no

Publicado por Kabuto (1385 intervenciones) el 25/10/2019 20:27:16
Hola Toni.

Tu problema es a causa de la clase Scanner y TODOS nos hemos tropezado con este problema cuando estamos aprendiendo.

La clase Scanner que usamos para leer datos de teclado tiene algunas peculiaridades. Una de ellas es, que después de leer un dato numérico con nextInt(), nextDouble(), etc..., si luego queremos leer un dato String con nextLine(), esta lectura fallará irremediablemente.

Por eso tras leer la edad, cuando preguntas si los padres son familiares o no, el usuario no podrá introducir la respuesta.

El motivo de por qué ocurre esto es un poquito farragoso de explicar y seguramente por Google encontrarás mejores explicaciones de las que yo te pueda dar.
Pero lo que si te voy a dar es la solución.

Para evitar esto, siempre que en un programa vayamos a necesitar leer valores numéricos y datos String, lo mejor es hacer todas las lecturas con el método .nextLine()
Y cuando necesitemos un valor numérico, lo que hacemos es parsear el String que nos devuelve ese método al tipo de dato que necesitamos.

Por ejemplo, para leer la edad necesitamos un valor int:
1
2
3
4
5
Scanner sc =new Scanner(System.in);
System.out.println("Dime tu nombre: ");
String name =sc.nextLine();
System.out.println("Dime tu edad: ");
edad=sc.nextInt();

Ese nextInt() marcado en negrita, será quien luego nos de problemas para poder leer un dato String.
Para evitarlo, lo cambiamos por un nextLine() y automáticamente se lo pasamos al método parseInt() de la clase Integer para que lo convierta (parsing) a un valor de tipo int.

1
2
3
4
5
Scanner sc =new Scanner(System.in);
System.out.println("Dime tu nombre: ");
String name =sc.nextLine();
System.out.println("Dime tu edad: ");
edad=Integer.parseInt(sc.nextLine());

De este modo, obtenemos un valor int y no tendremos problemas para posteriormente leer datos String.
Al principio puede parecer algo complicado hacerlo así, pero en realidad no lo es y además es recomendable de cara al futuro, pues cuando algún día empieces a crear programas con interfaz gráfica, ahí los datos siempre los obtenemos como String y tendremos que estar parseando continuamente.
Además otros lenguajes similares como C# es la forma habitual de hacer lecturas por teclado, así que ya lo tienes aprendido.


Dicho esto, te propongo un código escrito por mí para resolver el ejercicio. Tu código no iba demasiado mal, aunque se estaban usando muchas variables innecesarias. Además haces un System.out.println() para cada posibilidad, cuando no es necesario y basta con hacer uno solo al final del programa.
En mi programa ordeno y separo lo que son variables de las que van a ser "constantes" (variables cuyo valor no debe ser modificado).

En realidad el programa se puede resolver sin utilizar estas constantes y así ahorrar líneas de código, pero no está de más usarlas, sobre todo al tratarse de un ejercicio de aprendizaje.

Aquí te dejo el código, pregunta cualquier cosa que no entiendas. Pero vamos, es similar al tuyo, solo que algo mejor ordenado y prescindiendo de variables innecesarias (como las Boolean..).

Para preguntar si los padres son socios o no, le indico al usuario que ha de introducir "SI" o "NO". Lo correcto sería añadir más código para controlar que el usuario nos da una respuesta adecuada, pero bueno, tampoco vamos a complicar más el ejercicio. Si el usuario teclea cualquier tontería, el programa lo interpretará como un "NO". Y entonces obtendrá el peor descuento, por tonto.. xD

Un saludo.

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
import java.util.Scanner;
 
public class Ejercicio3 {
 
	public static void main(String[] args) {
 
		//Variables
		String nombre = "";
		int edad = 0;
		double cuotaFinal = 0;
 
		//Constantes (en mayúsculas por convenciones de programación)
		final double CUOTA = 500;
		final double PORCENTAJE1= 0.50;
		final double PORCENTAJE2= 0.25;
		final double PORCENTAJE3= 0.35;
 
 
		Scanner sc =new Scanner(System.in);
		System.out.println("Dime tu nombre: ");
		nombre =sc.nextLine();
		System.out.println("Dime tu edad: ");
		edad= Integer.parseInt(sc.nextLine());
 
		/*
		 * Hay tres tipos de clientes según la edad:
		 * - mayores de 65, tienen 50% descuento
		 * - entre 18 y 65 años, no tienen descuento
		 * - menores de 18, tienen descuento variable:
		 *     -25% si padres NO son socios
		 *     -35% si padres SI son socios
		 */
 
		if (edad > 65)
			cuotaFinal = CUOTA * PORCENTAJE1;
		else if (edad < 18) { //Es un menor, su descuento dependerá de la membresía de sus padres
			System.out.println("¿Tus padres son SOCIOS del club?(SI/NO): ");
			String sonSocios = sc.nextLine().toUpperCase();
			if (sonSocios.equals("SI"))
				cuotaFinal = CUOTA * PORCENTAJE3;
			else
				cuotaFinal = CUOTA * PORCENTAJE2;
 
		} else //No hay descuentos
			cuotaFinal = CUOTA;
 
		//Cuota calculada. Informamos.
		System.out.println("\nBienvenido " + nombre);
		System.out.println("Tienes que pagar: "+cuotaFinal+"€");
		sc.close();
 
	}
}
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