You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Construirás un programa en JavaScript que permita a los usuarios crear encuestas, votar y ver los resultados en tiempo real. El programa debe cumplir con los siguientes requisitos:
Permitir a los usuarios crear encuestas con opciones de respuesta.
Permitir a los usuarios votar en las encuestas.
Mostrar los resultados de las encuestas en tiempo real.
Almacenar los datos de las encuestas y los votos en una variable.
Implementar la solución utilizando programación orientada a objetos (POO) y programación funcional (PF).
SOLUCION EXPLICADA PASO A PASO (PF)
1. El código define un arreglo de objetos llamado preguntas. Cada objeto representa una pregunta de un cuestionario, con las siguientes propiedades:
pregunta: Contiene el texto de la pregunta.
opciones: Es un arreglo que lista las posibles respuestas para la pregunta.
respuestaCorrecta: Es un string que contiene la respuesta correcta a la pregunta.
constpreguntas=[{pregunta: "¿En que disciplina deportiva juega Leo Messi?",opciones: ["Futbol","Tenis","Ping Pong"],respuestaCorrecta: "Futbol"},{pregunta: "¿Quien es el presidente actual de Chile (2025)?",opciones: ["Gabriel Boric","Maite Orsini","Sebastian Piñera"],respuestaCorrecta: "Gabriel Boric"},{pregunta: "¿Nombra una figura geometrica con 4 lados?",opciones: ["Rombo","Triangulo","Cuadrado"],respuestaCorrecta: "Cuadrado"},{pregunta: "¿Donde se encuentra la famosa Torre de Pisa?",opciones: ["Milán","Roma","Pisa"],respuestaCorrecta: "Pisa"},{pregunta: "¿A cuantos grados celsius hierve el agua?",opciones: ["100","95","400"],respuestaCorrecta: "100"},{pregunta: "¿Cual es el oceano mas grande del mundo?",opciones: ["Pacifico","Atlantico","Indico"],respuestaCorrecta: "Pacifico"},{pregunta: "¿Quien es el maximo goleador en la historia del futbol?",opciones: ["Cristiano Ronaldo","Lionel Messi","Pele"],respuestaCorrecta: "Cristiano Ronaldo"},{pregunta: "¿Cuanto es 4 + 4?",opciones: ["8","12","14"],respuestaCorrecta: "8"}];
2. La función normalizarRespuesta sirve para procesar una cadena de texto (respuesta) y estandarizarla. Esto se hace eliminando acentos y convirtiendo todos los caracteres a minúsculas.
respuesta.toLowerCase(): Convierte el texto a minúsculas para que no haya diferencia entre mayúsculas y minúsculas.
respuesta.normalize("NFD"): Descompone los caracteres acentuados en su forma base más los diacríticos.
.replace(/[\u0300-\u036f]/g, ""): Usa una expresión regular para eliminar los diacríticos generados por la normalización (como acentos, tildes, etc.).
3. La función esRespCorrecta determina si una respuesta proporcionada por el usuario es correcta comparándola con la respuesta correcta de una pregunta.
4. Este código define una función llamada recibirRespuestaUsuario que solicita la respuesta del usuario para una pregunta y valida que no esté vacía mediante un bucle do...while.
functionrecibirRespuestaUsuario(pregunta){letrespuesta="";do{respuesta=prompt(pregunta.pregunta+"\n"+pregunta.opciones.join(", "));if(!respuesta){console.log("Por favor, ingresa una respuesta válida.");}}while(!respuesta);// Se repite hasta que la respuesta no esté vacíareturnrespuesta;}
5. La función preguntar se encarga de realizar una pregunta al usuario, verificar si su respuesta es correcta y mostrar un mensaje indicando el resultado. Tambien se inician dos contadores que almacenan la cantidad de respuestas correctas e incorrectas para mostrarlas como resultados de la encuesta al final de la ejecucion
letrespuestasCorrectas=0;letrespuestasIncorrectas=0;functionpreguntar(pregunta){console.log(pregunta.pregunta);constrespuestaUsuario=recibirRespuestaUsuario(pregunta);if(esRespCorrecta(pregunta,respuestaUsuario)){console.log("¡Correcto!");respuestasCorrectas++;}else{console.log("Incorrecto. La respuesta correcta es "+pregunta.respuestaCorrecta);respuestasIncorrectas++;}}
6. La función agregarPregunta() permite al usuario agregar una nueva pregunta al cuestionario
Utiliza varios prompt() para pedirle al usuario que ingrese los detalles de la nueva pregunta: el texto de la pregunta, las tres opciones posibles y la respuesta correcta.
Después de obtener los datos, se crea un objeto llamado nuevaPregunta que tiene pregunta, opciones, respuestaCorrecta
El objeto nuevaPregunta se agrega al arreglo preguntas usando push(). Esto permite que la nueva pregunta sea parte del cuestionario y se pueda usar en el juego.
Finalmente, se muestra un mensaje en la consola indicando que la nueva pregunta fue añadida con éxito.
functionagregarPregunta(){constpreguntaTexto=prompt("Introduce la pregunta:");constopcion1=prompt("Introduce la opción 1:");constopcion2=prompt("Introduce la opción 2:");constopcion3=prompt("Introduce la opción 3:");constrespuestaCorrecta=prompt("Introduce la respuesta correcta:");// Crear una nueva preguntaconstnuevaPregunta={pregunta: preguntaTexto,opciones: [opcion1,opcion2,opcion3],respuestaCorrecta: respuestaCorrecta};// Agregarla al arreglo de preguntaspreguntas.push(nuevaPregunta);console.log("¡Pregunta añadida con éxito!");}
7. Mediante un prompt se le pregunta al usuario si desea o no agregar una pregunta al questionario. Si la respuesta es "Si" procede a pedir que se ingrese la pregunta, luego que ingrese las 3 opciones y al final que agregue la respuesta correcta. Si la respuesta es "no", simplemente avanza con el cuestionario ya creado.
constdeseaAgregarPregunta=prompt("¿Quieres agregar una nueva pregunta al cuestionario? (si/no)");if(deseaAgregarPregunta.toLowerCase()==="si"){agregarPregunta();}
8. Este código utiliza el método forEach para recorrer todas las preguntas del arreglo preguntas y realizar la acción de hacer la pregunta al usuario.
// Paso 1: Definir el array con preguntas y respuestas ademas de la respuesta correctaconstpreguntas=[{pregunta: "¿En que disciplina deportiva juega Leo Messi?",opciones: ["Futbol","Tenis","Ping Pong"],respuestaCorrecta: "Futbol"},{pregunta: "¿Quien es el presidente actual de Chile (2025)?",opciones: ["Gabriel Boric","Maite Orsini","Sebastian Piñera"],respuestaCorrecta: "Gabriel Boric"},{pregunta: "¿Nombra una figura geometrica con 4 lados?",opciones: ["Rombo","Triangulo","Cuadrado"],respuestaCorrecta: "Cuadrado"},{pregunta: "¿Donde se encuentra la famosa Torre de Pisa?",opciones: ["Milán","Roma","Pisa"],respuestaCorrecta: "Pisa"},{pregunta: "¿A cuantos grados celsius hierve el agua?",opciones: ["100","95","400"],respuestaCorrecta: "100"},{pregunta: "¿Cual es el oceano mas grande del mundo?",opciones: ["Pacifico","Atlantico","Indico"],respuestaCorrecta: "Pacifico"},{pregunta: "¿Quien es el maximo goleador en la historia del futbol?",opciones: ["Cristiano Ronaldo","Lionel Messi","Pele"],respuestaCorrecta: "Cristiano Ronaldo"},{pregunta: "¿Cuanto es 4 + 4?",opciones: ["8","12","14"],respuestaCorrecta: "8"}];// Función para normalizar o aceptar las respuestas del usuario independiente si lo escriben con minusculas o sin tildefunctionnormalizarRespuesta(respuesta){returnrespuesta.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"");}// Paso 2: Crear la función que comprueba si la respuesta es correctafunctionesRespCorrecta(pregunta,respuesta){returnnormalizarRespuesta(respuesta)===normalizarRespuesta(pregunta.respuestaCorrecta);}// Paso 3: Definir la función que recibe la respuesta del usuario por medio de un prompt y genera un bucle para no avanzar mientras no reciba respuesta (o este vacio)functionrecibirRespuestaUsuario(pregunta){letrespuesta="";do{respuesta=prompt(pregunta.pregunta+"\n"+pregunta.opciones.join(", "));if(!respuesta){console.log("Por favor, ingresa una respuesta válida.");}}while(!respuesta);// Se repite hasta que la respuesta no esté vacíareturnrespuesta;}// Paso 4: Crear la función preguntarletrespuestasCorrectas=0;letrespuestasIncorrectas=0;functionpreguntar(pregunta){console.log(pregunta.pregunta);constrespuestaUsuario=recibirRespuestaUsuario(pregunta);if(esRespCorrecta(pregunta,respuestaUsuario)){console.log("¡Correcto!");respuestasCorrectas++;}else{console.log("Incorrecto. La respuesta correcta es "+pregunta.respuestaCorrecta);respuestasIncorrectas++;}}// Paso 5: Crear un método para agregar nuevas preguntasfunctionagregarPregunta(){constpreguntaTexto=prompt("Introduce la pregunta:");constopcion1=prompt("Introduce la opción 1:");constopcion2=prompt("Introduce la opción 2:");constopcion3=prompt("Introduce la opción 3:");constrespuestaCorrecta=prompt("Introduce la respuesta correcta:");// Crear una nueva preguntaconstnuevaPregunta={pregunta: preguntaTexto,opciones: [opcion1,opcion2,opcion3],respuestaCorrecta: respuestaCorrecta};// Agregarla al arreglo de preguntaspreguntas.push(nuevaPregunta);console.log("¡Pregunta añadida con éxito!");}// Paso 6: Preguntar si el usuario quiere agregar una nueva preguntaconstdeseaAgregarPregunta=prompt("¿Quieres agregar una nueva pregunta al cuestionario? (si/no)");if(deseaAgregarPregunta.toLowerCase()==="si"){agregarPregunta();}// Paso 7: Utilizar la función preguntar para cada preguntapreguntas.forEach((pregunta)=>{preguntar(pregunta);});// Paso 8: Mostrar el resultado finalconsole.log(`Respuestas correctas: ${respuestasCorrectas}`);console.log(`Respuestas incorrectas: ${respuestasIncorrectas}`);
SOLUCION EXPLICADA PASO A PASO (POO)
1. Este código define una clase llamada Pregunta, que sirve como una plantilla para crear objetos que representen preguntas con opciones y una respuesta correcta.
class Pregunta: Define una clase que encapsula la información relacionada con una pregunta.
constructor(pregunta, opciones, respCorrecta): Es un método especial que se ejecuta automáticamente cuando se crea un nuevo objeto de la clase.
this.pregunta, this.opciones, this.respCorrecta: Asigna los valores recibidos como parámetros a las propiedades del objeto que se está creando.
2. La función esRespCorrecta verifica si la respuesta proporcionada por el usuario es correcta, comparándola con la respuesta correcta de la pregunta.
normalize: Es una función interna que toma un string (str), lo normaliza para eliminar acentos y convierte todos los caracteres a minúsculas. Usa normalize("NFD") para descomponer caracteres acentuados en su forma base (por ejemplo, "á" se convierte en "a" + acento) y luego elimina los diacríticos (acentos, tildes) con .replace(/[\u0300-\u036f]/g, ""). Luego, .toLowerCase() convierte todo el texto a minúsculas.
normalize(respUsuario): Normaliza la respuesta del usuario.
normalize(this.respCorrecta): Normaliza la respuesta correcta (almacenada en this.respCorrecta).
3. La clase Cuestionario es una estructura que permite organizar y manejar un conjunto de preguntas en un cuestionario.
constructor(preguntas): El constructor recibe un parámetro llamado preguntas, que debe ser un arreglo de objetos o instancias de la clase Pregunta. Este parámetro se asigna a la propiedad this.preguntas del objeto que se crea.
this.preguntas: Es una propiedad del objeto Cuestionario que almacena el arreglo de preguntas.
4. El método hacerPreguntas() recorre todas las preguntas del cuestionario y se encarga de mostrar cada pregunta al usuario, solicitando una respuesta.
this.preguntas.forEach((pregunta) => { ... }): recorre cada objeto pregunta en el arreglo preguntas y ejecuta una función para cada una.
console.log(pregunta.pregunta);: muestra la pregunta en la consola
respCorrecta = prompt(pregunta.pregunta + "\n" + pregunta.opciones.join(", "));: muestra la pregunta junto con las opciones en un cuadro de texto (prompt), pidiendo al usuario que ingrese su respuesta.
Se usa un ciclo do...while para asegurarse de que el usuario ingrese una respuesta no vacía. Si la respuesta está vacía (!respCorrecta), muestra un mensaje de advertencia y vuelve a pedir la respuesta.
Después de recibir la respuesta, se llama a pregunta.esRespCorrecta(respCorrecta) para verificar si la respuesta del usuario es correcta.
Si la respuesta es correcta, muestra "¡Correcto!" en la consola, y si no lo es, muestra el mensaje "Incorrecto. La respuesta correcta es ..." con la respuesta correcta.
hacerPreguntas(){this.preguntas.forEach((pregunta)=>{console.log(pregunta.pregunta);letrespCorrecta;// Pedir respuesta hasta que el usuario ingrese algo no vacíodo{respCorrecta=prompt(pregunta.pregunta+"\n"+pregunta.opciones.join(", "));if(!respCorrecta){console.log("Por favor, ingresa una respuesta.");}}while(!respCorrecta);// Si la respuesta está vacía, se repite el cicloif(pregunta.esRespCorrecta(respCorrecta)){console.log("¡Correcto!");this.respuestasCorrectas++;}else{console.log(`Incorrecto. La respuesta correcta es ${pregunta.respCorrecta}`);this.respuestasIncorrectas++;}});// Mostrar el resultado finalconsole.log(`Respuestas correctas: ${this.respuestasCorrectas}`);console.log(`Respuestas incorrectas: ${this.respuestasIncorrectas}`);}
5. El método agregarPregunta() permite al usuario agregar una nueva pregunta al cuestionario
Utiliza prompt() para pedir al usuario que ingrese el texto de la pregunta (preguntaTexto), las tres opciones posibles (opcion1, opcion2, opcion3), y la respuesta correcta (respuestaCorrecta).
Con los valores ingresados por el usuario, se crea una nueva instancia de la clase Pregunta usando new Pregunta(). Se le pasan la pregunta, las opciones y la respuesta correcta.
La nueva pregunta se agrega al arreglo this.preguntas utilizando el método push(), lo que permite que la nueva pregunta se almacene en el cuestionario
Se muestra un mensaje en la consola diciendo "¡Pregunta añadida con éxito!" para informar al usuario que la pregunta se ha agregado correctamente
agregarPregunta(){constpreguntaTexto=prompt("Introduce la pregunta:");constopcion1=prompt("Introduce la opción 1:");constopcion2=prompt("Introduce la opción 2:");constopcion3=prompt("Introduce la opción 3:");constrespuestaCorrecta=prompt("Introduce la respuesta correcta:");// Crear una nueva instancia de la clase PreguntaconstnuevaPregunta=newPregunta(preguntaTexto,[opcion1,opcion2,opcion3],respuestaCorrecta);// Agregar la nueva pregunta al arreglo de preguntasthis.preguntas.push(nuevaPregunta);console.log("¡Pregunta añadida con éxito!");}}
6. Este código define un arreglo llamado preguntas que contiene varias instancias de la clase Pregunta. Cada elemento del arreglo es una pregunta con sus opciones y la respuesta correcta asociada.
constpreguntas=[newPregunta("¿En que continente se encuentra Chile?",["Europa","Asia","Sudamerica"],"Sudamerica"),newPregunta("¿Cuál es el planeta mas cercano al sol?",["Mercurio","Venus","Tierra"],"Mercurio"),newPregunta("¿Cuanto es 2 + 2?",["2","4","6"],"4"),newPregunta("¿Cual es el pais con mas campeonatos mundiales de futbol?",["Brasil","Alemania","Argentina"],"Brasil"),newPregunta("¿Quien es conocido como el Rey del Pop?",["Michael Jackson","Elvis Presley","Justin Bieber"],"Michael Jackson"),newPregunta("¿Cual es el pais mas grande del mundo?",["Rusia","Brasil","Estados Unidos"],"Rusia"),newPregunta("¿Que animal es conocido como el rey de la selva?",["Tigre","Oso","Leon"],"Leon"),newPregunta("¿Cual es el animal terrestre mas grande del mundo?",["Jirafa","Elefante","Toro"],"Elefante"),];
7. Este código crea un objeto de la clase Cuestionario , luego procede a preguntar al usuario si desea agregar o no alguna pregunta con sus respectivas opciones y respuesta correcta por medio del prompt, si la respuesta es no, simplemente avanza y luego ejecuta el método hacerPreguntas para realizar el cuestionario.
constcuestionario=newCuestionario(preguntas);// Permitir al usuario agregar una pregunta si lo deseaconstdeseaAgregarPregunta=prompt("¿Quieres agregar una nueva pregunta al cuestionario? (si/no)");if(deseaAgregarPregunta.toLowerCase()==="si"){cuestionario.agregarPregunta();}//iniciamos el juegocuestionario.hacerPreguntas();
El codigo completo de la solucion POO aqui abajo:
//creamos la clase preguntaclassPregunta{constructor(pregunta,opciones,respCorrecta){this.pregunta=pregunta;this.opciones=opciones;this.respCorrecta=respCorrecta;}//validamos la respuesta del usuario aparte de validar la misma independiente si esta escrita en minusculas o sin tildeesRespCorrecta(respUsuario){constnormalize=(str)=>str.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase();returnnormalize(respUsuario)===normalize(this.respCorrecta);}}//creamos la clase cuestionarioclassCuestionario{constructor(preguntas){this.preguntas=preguntas;this.respuestasCorrectas=0;this.respuestasIncorrectas=0;}//creamos el metodo hacerPreguntas para recorrer las preguntas y validar las respuestashacerPreguntas(){this.preguntas.forEach((pregunta)=>{console.log(pregunta.pregunta);letrespCorrecta;// Pedir respuesta hasta que el usuario ingrese algo no vacíodo{respCorrecta=prompt(pregunta.pregunta+"\n"+pregunta.opciones.join(", "));if(!respCorrecta){console.log("Por favor, ingresa una respuesta.");}}while(!respCorrecta);// Si la respuesta está vacía, se repite el cicloif(pregunta.esRespCorrecta(respCorrecta)){console.log("¡Correcto!");this.respuestasCorrectas++;}else{console.log(`Incorrecto. La respuesta correcta es ${pregunta.respCorrecta}`);this.respuestasIncorrectas++;}});// Mostrar el resultado finalconsole.log(`Respuestas correctas: ${this.respuestasCorrectas}`);console.log(`Respuestas incorrectas: ${this.respuestasIncorrectas}`);}// Método para permitir al usuario agregar una nueva pregunta al cuestionarioagregarPregunta(){constpreguntaTexto=prompt("Introduce la pregunta:");constopcion1=prompt("Introduce la opción 1:");constopcion2=prompt("Introduce la opción 2:");constopcion3=prompt("Introduce la opción 3:");constrespuestaCorrecta=prompt("Introduce la respuesta correcta:");// Crear una nueva instancia de la clase PreguntaconstnuevaPregunta=newPregunta(preguntaTexto,[opcion1,opcion2,opcion3],respuestaCorrecta);// Agregar la nueva pregunta al arreglo de preguntasthis.preguntas.push(nuevaPregunta);console.log("¡Pregunta añadida con éxito!");}}//creamos las preguntasconstpreguntas=[newPregunta("¿En que continente se encuentra Chile?",["Europa","Asia","Sudamerica"],"Sudamerica"),newPregunta("¿Cuál es el planeta mas cercano al sol?",["Mercurio","Venus","Tierra"],"Mercurio"),newPregunta("¿Cuanto es 2 + 2?",["2","4","6"],"4"),newPregunta("¿Cual es el pais con mas campeonatos mundiales de futbol?",["Brasil","Alemania","Argentina"],"Brasil"),newPregunta("¿Quien es conocido como el Rey del Pop?",["Michael Jackson","Elvis Presley","Justin Bieber"],"Michael Jackson"),newPregunta("¿Cual es el pais mas grande del mundo?",["Rusia","Brasil","Estados Unidos"],"Rusia"),newPregunta("¿Que animal es conocido como el rey de la selva?",["Tigre","Oso","Leon"],"Leon"),newPregunta("¿Cual es el animal terrestre mas grande del mundo?",["Jirafa","Elefante","Toro"],"Elefante"),];//creamos el objeto cuestionario y llamamos al metodo hacerPreguntas para iniciar el juegoconstcuestionario=newCuestionario(preguntas);// Permitir al usuario agregar una pregunta si lo deseaconstdeseaAgregarPregunta=prompt("¿Quieres agregar una nueva pregunta al cuestionario? (si/no)");if(deseaAgregarPregunta.toLowerCase()==="si"){cuestionario.agregarPregunta();}//iniciamos el juegocuestionario.hacerPreguntas();