Ayer mi ayuda fue solicitada para resolver un ejercicio de Java que más o menos decía así:
Realizar un programa en Java en donde se pueda simular un examen de múltiples respuestas, en donde el usuario elija la respuesta y se indique si ésta fue correcta o no.
Todo se tiene que hacer por consola, incluyendo la entrada de datos.
Así que me puse a pensar y al final, según yo, la mejor solución (aunque no me gustó tanto) era crear dos clases. Una de preguntas y otra de respuestas.
Luego, a cada pregunta asignarle un array de respuestas. Para saber si la respuesta era o no correcta, al objeto Respuesta se le pasaba un booleano que indicaba si ésa era la correcta. Pero bueno, bien dicen por ahí que hablar es de mal gusto, así que aquí dejo el código:
import java.util.Scanner;
public class Preguntas {
public static void main(String[] args) {
Pregunta[] preguntas = {
new Pregunta("Cual es el lenguaje que ha revolucionado la web?", new Respuesta[] {
new Respuesta("Javascript", 'A', true),
new Respuesta("Ruby", 'B', false),
new Respuesta("Python", 'C', false),
new Respuesta("PHP", 'D', false),
new Respuesta("Go", 'E', false),
new Respuesta("C++", 'F', false)
}),
new Pregunta("5 + 5?", new Respuesta[] {
new Respuesta("1", 'A', false),
new Respuesta("2", 'B', false),
new Respuesta("3", 'C', false),
new Respuesta("10", 'D', true),
new Respuesta("20", 'E', false),
new Respuesta("2", 'F', false)
}),
};
for (Pregunta p: preguntas) {
p.preguntar();
}
}
}
class Pregunta {
private String pregunta;
private Respuesta[] respuestasPosibles;
public Pregunta(String pregunta, Respuesta[] respuestasPosibles) {
this.pregunta = pregunta;
this.respuestasPosibles = respuestasPosibles;
}
public void preguntar() {
System.out.println(this.pregunta);
char letraCorrecta = 'A';
for (Respuesta opcion: this.respuestasPosibles) {
if (opcion.esCorrecta()) letraCorrecta = opcion.getLetra();
System.out.print(String.valueOf(opcion.getLetra()) + ")" + opcion.getRespuesta() + " ");
}
System.out.println("\nElige: ");
Scanner sc = new Scanner(System.in);
char letraElegidaPorElUsuario = sc.next().toUpperCase().charAt(0);
if (letraElegidaPorElUsuario == letraCorrecta)
System.out.println("Correcto");
else
System.out.println("Incorrecto, la respuesta correcta era " + String.valueOf(letraCorrecta));
}
}
class Respuesta {
private String respuesta;
private char letra;
private boolean correcta;
public Respuesta(String respuesta, char letra, boolean correcta) {
this.respuesta = respuesta;
this.letra = letra;
this.correcta = correcta;
}
public String getRespuesta() {
return this.respuesta;
}
public char getLetra() {
return this.letra;
}
public boolean esCorrecta() {
return this.correcta;
}
}
Ya sé, ya sé que cuál lleva un acento. Y que las preguntas inician con ¿, pero en mi consola no se ven bien, así que las omití.
Como se puede ver, es un código más o menos expresivo y agradable a la vista del ser humano. Podemos crear un arreglo de preguntas, y por cada una agregar un arreglo de respuestas. Por otro lado, no estamos limitados a las opciones que ponemos.
Es decir, en algunos casos podemos poner sólo los incisos a y b, en otros hasta el c, en otros incluso hasta el z; todo es como queramos.
Finalmente quiero que se note al método preguntar, que como su nombre lo dice, pregunta, lista las opciones e indica si la respuesta fue acertada.
Para que se vea que esto realmente funciona hice otro cuestionario a mi gusto y con mis respuestas (es decir, puede que la información no sea verídica).
Nota: el GIF va muy rápido, pero los datos realmente son leídos por teclado; es decir, el usuario escribe la letra.
Aquí dejo el código por si quieres probarlo por ti mismo:
import java.util.Scanner;
public class CuestionarioParzibyte {
public static void main(String[] args) {
Pregunta[] preguntas = {
new Pregunta("Creador de PHP", new Respuesta[] {
new Respuesta("Bill Gates", 'A', false),
new Respuesta("Steve Jobs", 'B', false),
new Respuesta("Rasmus Lerdorf", 'C', true)
}),
new Pregunta("NetBeans es un lenguaje de programacion", new Respuesta[] {
new Respuesta("Verdadero", 'A', false),
new Respuesta("Falso", 'B', true),
}),
new Pregunta("Funcion Javascript para decodificar una cadena JSON", new Respuesta[] {
new Respuesta("json_decode", 'A', false),
new Respuesta("eval", 'B', false),
new Respuesta("JSON.parse", 'C', true),
new Respuesta("JSON.decode", 'D', false),
}),
new Pregunta("Javascript es lo mismo que Java", new Respuesta[] {
new Respuesta("Verdadero", 'A', false),
new Respuesta("Falso", 'B', true),
}),
new Pregunta("En Javascript no necesitamos punto y coma", new Respuesta[] {
new Respuesta("Verdadero", 'A', false),
new Respuesta("Falso", 'B', true),
}),
new Pregunta("jQuery es un lenguaje de programacion", new Respuesta[] {
new Respuesta("Verdadero", 'A', false),
new Respuesta("Falso", 'B', true),
})
};
for (Pregunta p: preguntas) {
p.preguntar();
}
}
}
class Pregunta {
private String pregunta;
private Respuesta[] respuestasPosibles;
public Pregunta(String pregunta, Respuesta[] respuestasPosibles) {
this.pregunta = pregunta;
this.respuestasPosibles = respuestasPosibles;
}
public void preguntar() {
System.out.println(this.pregunta);
char letraCorrecta = 'A';
for (Respuesta opcion: this.respuestasPosibles) {
if (opcion.esCorrecta()) letraCorrecta = opcion.getLetra();
System.out.print(String.valueOf(opcion.getLetra()) + ")" + opcion.getRespuesta() + " ");
}
System.out.println("\nElige: ");
Scanner sc = new Scanner(System.in);
char letraElegidaPorElUsuario = sc.next().toUpperCase().charAt(0);
if (letraElegidaPorElUsuario == letraCorrecta)
System.out.println("Correcto");
else
System.out.println("Incorrecto, la respuesta correcta era " + String.valueOf(letraCorrecta));
}
}
class Respuesta {
private String respuesta;
private char letra;
private boolean correcta;
public Respuesta(String respuesta, char letra, boolean correcta) {
this.respuesta = respuesta;
this.letra = letra;
this.correcta = correcta;
}
public String getRespuesta() {
return this.respuesta;
}
public char getLetra() {
return this.letra;
}
public boolean esCorrecta() {
return this.correcta;
}
}
Esta es la solución que propongo; seguramente hay más y mejores. Analizando las mejoras que se pueden hacer se me ocurre poner un contador de aciertos y errores.
También se podría calcular el tiempo que se llevó al tomar el examen. Todo queda a nuestra imaginación.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
Una persona desea invertir $3000.00 en un banco, el cual le otorga un 3% de interés mensual. Cuál será la cantidad de dinero que esta persona tendrá al cabo de un año y medio si todo el dinero lo reinvierte?.
en esctrutura while como seria
Hola buen día. Si quieres que resuelva tu tarea puedes ver más información aquí: https://parzibyte.me/blog/resuelvo-tareas-programacion/
Saludos :)
no tendras el formulario para saber si si lo pusimos bien pliss
Hola, no entiendo la pregunta. ¿Podría ser más específico?
Saludos
Hola, esta muy bueno el codigo! ¿conoces alguna forma para hacer que estas preguntas sean aleatorias?
¡Saludos!
Hola, claro que sí. Simplemente necesitaríamos agitar o sacudir el arreglo; es decir, poner los elementos en otro lugar dentro del arreglo. De esta forma siempre saldrían en distinto orden.
Espero poder programar el ejemplo muy pronto. Saludos :-)