Java - Ayuda para un ejercicio

 
Vista:
Imágen de perfil de bobopachita

Ayuda para un ejercicio

Publicado por bobopachita (5 intervenciones) el 12/08/2022 12:53:41
Hola estoy haciendo este ejercicio pero me he quedado pillado para sacar el porcentaje de cada respuesta.
El ejercicio es el siguiente:
n centro de estudios nos ha solicitado que realicemos un algoritmo para saber la motivación que tienen los alumnos para estudiar programación.

Para ello quiere realizar una serie de preguntas y según la respuesta valorar su interés por estos estudios.

Cada respuesta tendrá un valor de 0 o 1 siendo el resultado el porcentaje total la suma de los valores obtenidos.

Si el valor obtenido en el primer intento es superior al 80% el ejercicio le dará la enhorabuena, si es inferior le pedirá volver a realizar el test con todas las preguntas dos veces mas. (El alumno solo podrá realizar la prueba tres veces).

Una vez realizado el test la tres veces, si la media de los resultados es inferior al 50%, se le pedirá que se lo comente a su profesor. Si es superior el programa terminara y le dará la enhorabuena.

Las preguntas para realizar son:

Te gustan las computadoras. Si(1) No(0)
Disfrutas con la resolución de problemas. Si(1) No(0)
Quieres trabajar en equipo. Si(1) No(0)
Te agrada aprender por descubrimiento o prefieres que te indiquen las cosas paso a paso. Si(1) No(0)
Eres creativo. Si(1) No(0)
Eres resolutivo. Si(1) No(0)
Te rindes al primer intento Si(0) No(1)
Estas dispuesto a tener que actualizar tu conocimiento a lo largo de tu vida Si(1) No(0)


Y este es mi codigo!

package ejercicio1;

import java.util.Scanner;

public class principal {

public static void main(String[] args) {
// TODO Auto-generated method stub

//Declaramos las variables.
String resp;
double respondidas = 0;
double respuesta = 0;
int intentos =0;

//Activamos el scanner para el modo lectura.
Scanner sc = new Scanner(System.in);

//Solicitamos el nombre del usuario y le damos la bienvenida.
System.out.println("Cual es tu nombre de alummno? ");
String nombre = sc.nextLine();
System.out.println("Bienvenido " +nombre);
System.out.println();



//creamos el menu para realizar el test.
System.out.println("-------- MENU PRINCIPAL -----");
System.out.println("-------- 1 Realizar test -----");
System.out.println("-------- 2 Salir -----");
System.out.println("-------------------------");
int opcion = sc.nextInt();

System.out.println("Responde a las siguientes preguntas donde 1 es SI y 0 es NO ");
System.out.println();

switch (opcion)
{

case 1: {
System.out.println("Realizar test");
System.out.println();
break;
}

case 2: {
System.out.println("Salir");
;
break;
}

default:
{
System.out.println("Opcion invalida pulsa una tecla para continuar....");
sc.nextLine();
break;
}

}
//HACEMOS BUCLE DO WHILE PARA QUE EL TEST SE PUEDA HACER MAXIMO 3 VECES Y HACEMOS LAS PREGUNTAS

do {

System.out.println("Te gustan los ordenadores? ");
int respuesta1 = sc.nextInt();
if (respuesta == 1 + respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;

System.out.println("Perfecto, siguiente pregunta... ");
System.out.println();
}
else
if (respuesta == 0) {
System.out.println("Has respondido NO.");

}

System.out.println("Disfrutas con la resolucion de problemas. ");
int respuesta2 = sc.nextInt();
if (respuesta == 1 +respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;

System.out.println("Perfecto, siguiente pregunta... ");
}
else
if (respuesta2 == 0) {
System.out.println("Has respondido NO.");

}

System.out.println("Quieres trabajar en equipo ");
int respuesta3 = sc.nextInt();
if (respuesta == 1 + respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;

}
else
if (respuesta == 0) {
System.out.println("Has respondido NO.");

}
System.out.println("Te agrada aprender por descubrimiento o prefieres que te indiquen las cosas paso a paso. ");
int respuesta4 = sc.nextInt();
if (respuesta ==1 + respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;
}

else
if (respuesta4 ==0) {
System.out.println("Has respondido NO ");

}

System.out.println("Eres creativo. ");
int respuesta5 = sc.nextInt();
if (respuesta ==1 + respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;

}

else
if (respuesta5 ==0) {
System.out.println("Has respondido NO ");

}

System.out.println("Eres resolutivo. ");
int respuesta6 = sc.nextInt();
if (respuesta ==1 + respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;

}

else
if (respuesta6 ==0) {
System.out.println("Has respondido NO ");

}

System.out.println("Te rindes al primer intento. ");
int respuesta7 = sc.nextInt();
if (respuesta ==1 + respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;

}

else
if (respuesta ==0) {
System.out.println("Has respondido NO ");

}

System.out.println("Estas dispuesto a tener que actualizar tu conocimiento a lo largo de tu vida. ");
int respuesta8 = sc.nextInt();
if (respuesta ==1 + respondidas++) {
respondidas = respondidas + (respuesta * 9) /100;

}
else
if (respuesta ==0) {
System.out.println("Has respondido NO ");

}

int resultado = (int) respuesta;
System.out.println("Enhorabuena!" + respondidas);

System.out.println("Quieres repetir el cuestionario? ");
sc.nextLine();
resp = sc.nextLine();

} while (resp.equals("si"));
intentos =+1;
if (intentos >3);

}

}




Como puedo sacar el porcentaje // seria algo así?
% = cantidad de preguntas respondidas con si / total preguntas contestadas

Muchas gracias.
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

Ayuda para un ejercicio

Publicado por Kabuto (1381 intervenciones) el 13/08/2022 02:05:06
El programa no pide realizar un menú para elegir hacer o no el test.
Si quieres incluirlo por deseo tuyo, ok, pero no entiendo que el proceso donde se realiza el test, esté FUERA del switch y no DENTRO.
En ese caso, da igual lo que elijamos en el menú, el test se va a hacer sí o sí, porque no está regulado por el switch donde hacemos una selección.

Por cierto, el test sería mucho mejor si lo escribieras en un método separado del programa principal. Un método que se ocupe única y exclusivamente de hacer las preguntas test, recoger las respuestas y retornar el porcentaje.

Esos porcentajes retornados has de guardarlos en variables distintas, ya que en el caso de no superar el primer test, el usuario tiene que repetirlo obligatoriamente dos veces más.
Esto significa que en total tendremos TRES resultados y habrá que calcular la media para decidir si lo ha superado finalmente o no.
Así que necesitas tener esos tres resultados guardados.
Por tanto necesitas tres variables de tipo int, o aún mejor, un array de 3 int.

Lo que no necesitas es una variable para recoger cada respuesta, ya que no necesitas analizarlas.
Si te da un 1, lo sumas. Y si te da un 0, pues lo sumas también, que es lo mismo que no sumar nada. Así que en lugar de preguntar si te da un 1 o un 0 para decidir si se suma o no, no importa, tu suma lo que te haya dado y ya está.

Además, las preguntas IF que haces no tienen mucha lógica
1
if (respuesta ==1 + respondidas++) {
Ahí preguntas: Si el valor de "respuesta" es igual a la suma de 1 + el valor de "respondidas". Y luego incrementas "respondidas"

Y bueno, la decisión para el IF, tampoco tiene sentido:
1
respondidas = respondidas + (respuesta * 9) /100;
Entonces: a "respondidas" súmale el 9% de respuesta


Te propongo otra solución.
Hay un método que se encarga de hacer el test y devolver el porcentaje de respuestas

El programa principal comienza con un bucle cuya repetición se decide mediante un boolean.
Se hace el primer test y se guarda en el primer elemento de un array de 3 int (ya que máximo serán 3 test)
Tras el primer test, se evalua el resultado
Si supera el 80%, el alumno ha superado la prueba, se le da la enhorabuena y cambiamos el valor del boolean para termine el bucle, pues el programa termina aquí.

Si no supera el 80%, entonces obligatoriamente el test ha de repetirse dos veces más, para completar el total de 3 resultados.
Cada resultado se guarda en una posición distinta del array de 3 elementos.
Al terminar los dos test, se suman esos 3 resultados y se calcula la media.

Si está por debajo del 50%, se le pide al alumno que hable con su profesor.
En caso contrario, se le da la enhorabuena.

En ambos casos, el bucle ha de terminar así que cambiamos el boolean.
Y fin de programa.

Aquí te dejo el código, míralo a fondo, pruébalo y pregunta lo que no entiendas o cualquier cosa que quieras comentar.
Sobre todo fíjate en lo cómodo que es realizar el test en un método separado. Esto permite hacer un programa principal más legible y despejado, ya que no necesita contener las numerosas líneas de código que requiere hacer el test.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
public class Encuesta {
 
	//Variables de ámbito global
	private static Scanner teclado = new Scanner(System.in);
	private static int[] porcentajes = new int[3]; //Máximo 3 tests
 
	public static void main(String[] args) {
		int testActual = 0; //0 es el primer test
		boolean finalizado = false;
 
		while(!finalizado) {
			//Primer test, solo superable si obtiene más de un 80%
			porcentajes[testActual] = test();
			//Comprobamos si lo ha superado
			if (porcentajes[testActual] > 80) {
				System.out.println("\nResultado: " + porcentajes[testActual]);
				System.out.println("¡Enhorabuena! Test Superado");
				finalizado = true;
			}
			else {
				//Si no supera primer test, ha de repetirse DOS VECES MÁS
				System.out.println("\nDebes repetir el test dos veces más.\n");
				for (int i = 0; i < 2; i++) {
					testActual++; //Siguiente test
					porcentajes[testActual] = test();
				}
				//Ya se han realizado el total de 3 test.
				//La prueba se supera si la media de los 3 resultados es 50% o superior
				int sumaResultados = 0;
				for (int i = 0; i < porcentajes.length; i++)
					sumaResultados += porcentajes[i];
 
				int media = sumaResultados / 3;
				System.out.println("\nResultado: " + media);
				if (media < 50)
					System.out.println("Comenta este resultado con tu profesor.");
				else
					System.out.println("¡Enhorabuena! Test Superado");
 
				finalizado = true;
			}
		}
 
		System.out.println("\n\t\tFIN DE PROGRAMA");
	}
 
	/*
	 * Método que realiza el test y
	 * retorna el porcentaje de respuestas.
	 */
	private static int test() {
 
		int sumaRespuestas = 0;
		System.out.println("\n\tTEST DE MOTIVACION");
		System.out.println("\t---- -- ----------\n");
		System.out.println("¿Te gustan las computadoras? Si(1) No(0)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		System.out.println("¿Disfrutas con la resolución de problemas? Si(1) No(0)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		System.out.println("¿Quieres trabajar en equipo? Si(1) No(0)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		System.out.println("¿Te agrada aprender por descubrimiento o prefieres que te indiquen las cosas paso a paso? Si(1) No(0)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		System.out.println("¿Eres creativo? Si(1) No(0)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		System.out.println("¿Eres resolutivo? Si(1) No(0)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		System.out.println("¿Te rindes al primer intento? Si(0) No(1)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		System.out.println("¿Estas dispuesto a tener que actualizar tu conocimiento a lo largo de tu vida? Si(1) No(0)");
		System.out.print("Respuesta: ");
		sumaRespuestas += teclado.nextInt();
		//Test completado, retornamos el porcentaje de respuestas
		return sumaRespuestas * 100 / 8;
	}
 
}
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 bobopachita

Ayuda para un ejercicio

Publicado por bobopachita (5 intervenciones) el 14/08/2022 11:31:03
Muchas gracias por tu respuesta, he empezado con lo básico y voy a terminar la clases de los bucles. Hay algunas cosas que aun no entiendo pero muchas gracias por ayudarme, ahora lo veo mucho mejor!!!

Gracias por tu tiempo.!
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
sin imagen de perfil

Ayuda para un ejercicio

Publicado por will (2 intervenciones) el 20/03/2023 22:29:08
Hola me ha servido mucho tu codigo, lo he realizado pero tengo un detalle, al fallar el test cuando hacer el tercero y dar los resultados se activa nuevamente el test , es decir no termina el programa. Solo lo hace si aprueba al primer intento, te dejo mi codigo a ver si me puedes ayudar para ejecutarlo correctamente.[code]
package testMotivacion;

import java.util.Scanner;

public class Principal {

// declaro variables
private static int[] porcentaje = new int[3]; //solo permite 3 intentos
private static Scanner ingresoRespuesta = new Scanner(System.in); //ingreso de respuestas del test por el estudiante

public static void l_pantalla() {
for (int i=0;i<200;i++) {
System.out.println("");
}
}


//Creo un metodo para ejecutar el test

private static int test() {
int acumulado =0; // ira sumandolos valores de las respuestas si=1 no =0
System.out.println(" Test de Motivacion debe responder con los valores entre parentesis ");

System.out.println("Te gustan las computadoras SI (1) NO (0)");
acumulado += ingresoRespuesta.nextInt();
System.out.println("Disfrutas con la resoluciòn de problemas SI (1) NO (0)");
acumulado += ingresoRespuesta.nextInt();
System.out.println("Quieres trabajar en equipo SI(1) NO(0)");
acumulado += ingresoRespuesta.nextInt();
System.out.println("Te agrada aprender por descubrimiento o prefieres que te indiquen las cosas pasoa paso SI(1) NO(0)");
acumulado += ingresoRespuesta.nextInt();
System.out.println("Eres creativo SI(1) NO(0)");
acumulado += ingresoRespuesta.nextInt();
System.out.println("Eres resolutivo SI(1) NO(0)");
acumulado += ingresoRespuesta.nextInt();
System.out.println("Te rindes en el primer intento SI (0) NO(1) ");
acumulado += ingresoRespuesta.nextInt();
System.out.println("Estas dispuesto a tener queactualizar tu conocimiento a lo largo de tu vida SI(1) NO(0)");
acumulado += ingresoRespuesta.nextInt();

return acumulado * 100/8;
}



public static void main(String[] args) {
// TODO Auto-generated method stub

int testMot =0; // 0 es el primer intento se sumaran si no se aprueba en el primer intento
boolean aprobado =false;

// bucle del test superable si es >80%

while(!aprobado) {
porcentaje [testMot] = test();
if (porcentaje[testMot]>80) {
System.out.println("!Test Superado Enhorabuena " + porcentaje[testMot]);
aprobado = true;

} else {
l_pantalla();
System.out.println("No haz superado el test. Debes realizarlo 02 veces mas");
for (int i=0; i<2;i++) {
testMot++; // contador de test
porcentaje[testMot]= test(); // guardo en el array porcentaje el contador o veces ejecutadas del test

}
// test realizado en 3 intentos promediamos y damos resultados

int promedioFinal=0; // se suman los intentos almacenados en el array para promediar e imprime los tres resultados
for (int j=0; j<porcentaje.length;j++) {
promedioFinal += porcentaje[j];

int resultadoMedia = promedioFinal/3;
System.out.println("Tu promedio final es " +resultadoMedia);

if (resultadoMedia<50) {
System.out.println("Comenta este resultado con tu profesor ");

}else {
System.out.println("Test Superado.. !Enhorabuena..!");
aprobado = true;
}
}

}
}


}

}
/code]
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: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un ejercicio

Publicado por Kabuto (1381 intervenciones) el 21/03/2023 11:32:02
Hola.
Creo que se debe a un pequeño detalle semántico de nuestro lenguaje, y no tanto de Java je je...

Verás, para el boolean que decide cuándo ha de terminar el bucle, yo escogí el nombre "finalizado":
1
2
3
4
5
public static void main(String[] args) {
		int testActual = 0; //0 es el primer test
		boolean finalizado = false;
 
		while(!finalizado) {

Tu en cambio, has elegido el nombre "aprobado":
1
2
3
4
5
boolean aprobado =false;
 
// bucle del test superable si es >80%
 
while(!aprobado) {

En teoría el nombre da igual, porque es algo que escogemos nosotros y a Java le da igual como bautizamos a nuestra variables.

Pero en la práctica, a veces según el significado de un nombre escogido nos puede hacer equivocar al desarrollar la lógica del programa.


Yo lo llamé "finalizado" porque esa variable no indica si el usuario ha aprobado o no. Solo indica cuándo ha terminado el test, y el test puede terminar tanto si lo aprueba como si no.
Así que yo al desarrollar la lógica, lo escribí para que tras el primer intento fallido, el test finalizase independientemente de si aprueba o no.

1
2
3
4
5
6
7
8
9
int media = sumaResultados / 3;
				System.out.println("\nResultado: " + media);
				if (media < 50)
					System.out.println("Comenta este resultado con tu profesor.");
				else
					System.out.println("¡Enhorabuena! Test Superado");
 
				finalizado = true;
			}
Fíjate que mi variable "finalizado" esta fuera del IF ELSE. Este IF ELSE solo decide cuál mensaje se va a mostrar en pantalla, pero no decide si "finalizado" ha de adquirir valor TRUE.
"finalizado" siempre va a pasar a TRUE y por tanto el bucle terminará.


Tú en cambio, al llamar a tu variable "aprobado", le has dado un significado diferente. Va a representar si el usuario a aprobado o no el test.

Por eso al desarrollar la lógica de tu programa, tras el primer intento fallido, sí has incluido el boolean dentro del IF ELSE.

1
2
3
4
5
6
7
8
9
10
int resultadoMedia = promedioFinal/3;
System.out.println("Tu promedio final es " +resultadoMedia);
 
if (resultadoMedia<50) {
System.out.println("Comenta este resultado con tu profesor ");
 
}else {
System.out.println("Test Superado.. !Enhorabuena..!");
aprobado = true;
}

Por tanto, solo recibe valor TRUE si el usuario supera el test. Pero si no lo supera, "aprobado" sigue siendo FALSE, y entonces el bucle se vuelve a repetir.

En ese punto del programa, el bucle ha de terminar tanto si aprueba como si no.
Así que has de colocar la asignación del boolean fuera del IF ELSE,
1
2
3
4
5
6
7
8
9
10
11
int resultadoMedia = promedioFinal/3;
System.out.println("Tu promedio final es " +resultadoMedia);
 
if (resultadoMedia<50) {
System.out.println("Comenta este resultado con tu profesor ");
 
}else {
System.out.println("Test Superado.. !Enhorabuena..!");
}
 
aprobado = true;

Y casi mejor también si le cambias al nombre, para que quede claro que en realidad este boolean no significa que el usuario ha superado el test.
Puedes llamarlo "finalizado", "terminar", "salir",..... porque su significado es indicar cuándo el test ha de terminar, sin que importe si el test se ha superado o no.


Espero haberme explicado bien.
Un saludo.
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
sin imagen de perfil

Ayuda para un ejercicio

Publicado por will (2 intervenciones) el 21/03/2023 13:23:11
Muchas gracias, muy buena y detallada la explicación. Tomo tus notas y lo arreglo.
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