Autor Tema: Ejercicio 1 - Semana 11 "Curso Fundamentos de programación"  (Leído 5021 veces)

JValero

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 27
    • Ver Perfil
Ejercicio 1 - Semana 11 "Curso Fundamentos de programación"
« en: 24 de Septiembre 2014, 11:50 »
Buenos días,

Se me pide realizar un psudocódigo donde aparezca un menú con 3 opciones 1. Solicitar la contraseña, 2. Ver una pista y 3. Salir del programa.

El programa debería de servir para solicitar una contraseña y mostrar un mensaje de acierto en el caso de introducir la password correcta y un mensaje de error en el caso de introducirla erroneamente. No hay número de intentos, pero cada vez que introducimos la clave erronea el programa debe de volver al menú inicial. Si insertamos la contraseña correcta el programa debería de finalizar.

Tengo dudas de que este psudocódigo realmente funcionara y, sobre todo, finalizara el programa en el caso de acertar la contraseña.

1.   Inicio
2.   Mientras E <> 3 Hacer
2.1   Mostrar “Menú: 1. Intentar averiguar nombre secreto  - 2. Ver pista - 3. Salir”
2.2   Pedir E
2.3   Si E = 1 Entonces
2.3.1   Clave = “Albert Einstein”
2.3.2   Si Clave = “Albert Einstein” entonces
Mostrar “ Has acertado”
FinSi
Unload Form
2.3.3   Mientras Clave <> “Albert Einstein” Hacer
Mostrar “Has fallado”
Salir Mientras
2.4   Si E=2 Entonces
Mostrar “Es el físico más influyente del siglo XX”
FinSi
3.   Fin

Gracias por vuestra ayuda.

Un saludo.
« Última modificación: 29 de Septiembre 2014, 10:32 por Alex Rodríguez »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio 1 - Semana 11 "Fundamentos de programación"
« Respuesta #1 en: 24 de Septiembre 2014, 17:10 »
Hola, paso a comentar las cuestiones que habría que tener en cuenta.

- Unload Form no es una forma sintáctica válida en pseudocódigo, en su lugar podrías escribir Finalizar.

- Si se elige la opción 1, habrá que pedir al usuario que introduzca el nombre que él propone, por tanto ten en cuenta la necesidad de dos líneas: una para mostrar un mensaje al usuario y otra para pedir que el usuario introduzca la respuesta y se almacene en una variable, por ejemplo:

Mostrar "Intente averiguar el nombre secreto. Introduzca el nombre: "
Pedir Clave

- Si el usuario acierta el programa debe terminar. Esto debes controlarlo a través del bucle principal mejor que con una instrucción Finalizar.

- Cada instrucción Mientras tiene que tener un cierre (en otra línea del código) con Repetir, de la misma forma que cada Si ... debe llevar su cierre FinSi. Esto independientemente de que exista un SalirMientras, aunque es preferible que no existan SalirMientras porque es una forma de salida anómala de un bucle. Recuerda que el formato es:

Código: [Seleccionar]
Mientras [Condición] Hacer
Instrucción 1
Instrucción 2
.
.
.
Instrucción n

Repetir


- Tienes que probar el pseudocódigo mentalmente. Por ejemplo con tu pseudocódigo voy a probar a entrar al programa y entrar la respuesta correcta. El proceso sería el siguiente: El programa se inicia. Entramos en el bucle Mientras E<>3 ya que E valdrá cero (no establecido). En el bucle se muestra el menú. Se pide al usuario la elección y se almacena en la variable E. Supongamos que elijo la opción 1. Se cumple E=1, ahora Clave = "Albert Einstein". En la siguiente línea comprueba si la clave es Albert Einstein, y como es así, muestra "Has acertado" --- PROCESO ERRÓNEO ¿Por qué muestra has acertado si el usuario no ha introducido una respuesta? --- Con la revisión mental de lo que hace el algoritmo somos capaces de comprobar si funcionará o no, en este caso hemos comprobado que no funcionará bien.

Te doy una estructura de programa para que tú la completes.

Código: [Seleccionar]
1. Inicio
2. RespuestaAcertada = falso;
3. Clave = “Albert Einstein”
4.   Mientras (E <> 3 y RespuestaAcertada=falso) Hacer  [El bucle se repetirá siempre que E sea distinto de 3 y RespuestaAcertada sea igual a falso. En el caso de que E valga 3 ó de que RespuestaAcertada sea verdadero, el bucle no se repetirá)

Mostrar “Menú: 1. Intentar averiguar nombre secreto  - 2. Ver pista - 3. Salir”


Si E = 1 Entonces

[ // Complétalo tú: ¿qué debería ocurrir cuando el usuario elige la opción 1 ]


Si E=2 Entonces
[ // Complétalo tú: ¿qué debería ocurrir cuando el usuario elige la opción 2 ]
FinSi

[Si E valiera 3 ¿hacemos algo o simplemente dejamos que el bucle vaya al comienzo a comprobar si se cumple la condición para repetirse?]

Repetir

[El bucle ha terminado: hay dos posibles motivos para que haya terminado. O bien que el usuario haya acertado la clave, o bien que haya escogido salir. ¿Cómo sabemos qué ha ocurrido? Porque en el bucle tenemos una variable que controla si el usuario ha acertado, la variable RespuestaAcertada. Después de la ejecución del bucle esta variable tendrá un valor según qué haya ocurrido. Ahora tenemos que comprobar qué ha pasado]

Si RespuestaAcertada = verdadero Entonces

[ //Mostrar un mensaje de felicitación]

SiNO

[ // Mostrar un mensaje de despedida, en este caso estamos en la opción de que el usuario eligió la opción 3 para salir del programa ]
FinSi
Fin

Importante: fijarse cómo lo que ha ocurrido en el bucle lo comprobamos después de salir del bucle, no dentro y forzando su finalización de forma no natural.

Inténtalo y responde aquí mismo con la solución que plantees para volver a revisarla, o si no puedes completarlo, comenta dónde están las dudas para irlas resolviendo.

Saludos

JValero

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 27
    • Ver Perfil
Re:Ejercicio 1 - Semana 11 "Fundamentos de programación"
« Respuesta #2 en: 25 de Septiembre 2014, 10:43 »
Hola Mario,

Gracias por tus comentarios y sugerencias.

La verdad es que sigo teniendo dudas de cómo estructurar el pseudocódigo. Te facilito el psudocódigo y más abajo de pregunto:

Código: [Seleccionar]
1. Inicio
2. RespuestaAcertada=falso
3. Clave=”Albert Einstein”
4. Mientras E <> 3 Hacer y RespuestaAcertada=falso Hacer
4.1 Mostrar “Menú: 1. Intentar averiguar nombre secreto  - 2. Ver pista - 3. Salir”
4.2 Pedir E
4.3 Si E = 1 Entonces
4.3.1 Mostrar “Por favor, introduzca el nombre secreto”
4.3.2 Pedir Clave
4.3.3 Si Clave = “Albert Einstein” entonces
4.3.4 RespuestaAcertada=verdadero
Mostrar “ Has acertado.”
Sino
Mostrar “Has fallado”
FinSi
4.4 Si E=2 Entonces
Mostrar “Es el físico más influyente del siglo XX”
FinSi
Repetir
5. Fin

- ¿Sería correcto el uso de las lineas 4.3.3 y 4.3.4? Entiendo que si la variable Clave toma el valor de "Albert Einstein" RespuestaAcertada es igual a Verdadero. Lo que no entiendo es por qué me pusiste en tus notas la linea Si RespuestaAcertada = verdadero Entonces detrás de la linea Repetir

- Entiendo que cuando E=2 no sería necesario hacer ningún tipo de condicionante ya que simplemente debería mostrarnos un mensaje indicando la pista para averiguar la contraseña. ¿Es correcto?

Un saludo.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio 1 - Semana 11 "Fundamentos de programación"
« Respuesta #3 en: 25 de Septiembre 2014, 12:26 »
El pseudocódigo que has planteado es correcto y lo puedes dar por bueno.

Lo que al mirarlo he pensado que carece de utilidad es la línea 3. Yo diría que si la eliminas no pasa nada. Revísalo tú y si piensas lo mismo la eliminas. Si piensas que debe mantenerse, mantenla y coméntame el por qué.


Código: [Seleccionar]
1. Inicio
2. RespuestaAcertada=falso
3. Clave=”Albert Einstein”
4. Mientras E <> 3 Hacer y RespuestaAcertada=falso Hacer
4.1 Mostrar “Menú: 1. Intentar averiguar nombre secreto  - 2. Ver pista - 3. Salir”
4.2 Pedir E
4.3 Si E = 1 Entonces
4.3.1 Mostrar “Por favor, introduzca el nombre secreto”
4.3.2 Pedir Clave
4.3.3 Si Clave = “Albert Einstein” entonces
4.3.4 RespuestaAcertada=verdadero
Mostrar “ Has acertado.”
Sino
Mostrar “Has fallado”
FinSi
4.4 Si E=2 Entonces
Mostrar “Es el físico más influyente del siglo XX”
FinSi
Repetir
5. Fin

Sobre la duda "Lo que no entiendo es por qué me pusiste en tus notas la linea Si RespuestaAcertada = verdadero Entonces detrás de la linea Repetir"

Es porque hay varias alternativas para plantear el pseudocódigo, es decir, no hay una sola solución sino muchas soluciones según cómo se plantee el problema. La que yo te proponía era algo similar a esto:

Código: [Seleccionar]
1. Inicio
2. RespuestaAcertada = falso;
3. Clave = “Albert Einstein”
4.   Mientras (E <> 3 y RespuestaAcertada=falso) Hacer  [El bucle se repetirá siempre que E sea distinto de 3 y RespuestaAcertada sea igual a falso. En el caso de que E valga 3 ó de que RespuestaAcertada sea verdadero, el bucle no se repetirá)

Mostrar “Menú: 1. Intentar averiguar nombre secreto  - 2. Ver pista - 3. Salir”


Si E = 1 Entonces
    Mostrar “Por favor, introduzca el nombre secreto”
    Pedir ClaveUsuario
    Si ClaveUsurio = Clave Entonces
        RespuestaAcertada = verdadero
    FinSi
FinSi

Si E=2 Entonces
Mostrar “Es el físico más influyente del siglo XX”
FinSi

[Si E valiera 3 no hay nada que hacer sino dejar que se repita el bucle]

Repetir

[El bucle ha terminado: hay dos posibles motivos para que haya terminado. O bien que el usuario haya acertado la clave, o bien que haya escogido salir. ¿Cómo sabemos qué ha ocurrido? Porque en el bucle tenemos una variable que controla si el usuario ha acertado, la variable RespuestaAcertada. Después de la ejecución del bucle esta variable tendrá un valor según qué haya ocurrido. Ahora tenemos que comprobar qué ha pasado]

Si RespuestaAcertada = verdadero Entonces
Mostrar “ Has acertado, enhorabuena.”
SiNO

Mostrar “Adiós, gracias por utilizar este programa.”
FinSi
Fin

Ambos pseudocódigos son similares. La diferencia está en si durante el bucle una vez detectas que ocurre algo ejecutas ciertas instrucciones estando dentro del propio bucle, o si por el contrario durante el bucle una vez detectas algo guardas esa información de que ha ocurrido algo en una variable, y una vez fuera del bucle compruebas esa variable para saber lo que ha pasado y ejecutas las instrucciones oportunas.

En este caso, lo que ha pasado dentro del bucle lo sabemos a través de la variable RespuestaAcertada. Pero cuando salimos del bucle no sabemos si se ha salido porque se ha acertado la respuesta o porque se ha elegido la opción "Salir". ¿Cómo averiguarlo? Haciendo la comprobación:

Si RespuestaAcertada = verdadero Entonces
    [El usuario acertó]
SiNO
    [El usuario eligió salir]
FinSi

Mira ambos códigos con detenimiento y si te quedan dudas coméntalas para aclararlas.

Saludos.


JValero

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 27
    • Ver Perfil
Re:Ejercicio 1 - Semana 11 "Fundamentos de programación"
« Respuesta #4 en: 25 de Septiembre 2014, 18:46 »
Gracias por las aclaraciones Mario.

si, estoy de acuerdo contigo en quitar la linea 3 pues supongo que tiene la misma funcionalidad que la 4.3.3

Creo que ya está todo más o menos claro...veré que ocurre al crear el código.

Gracias de nuevo.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio 1 - Semana 11 "Fundamentos de programación"
« Respuesta #5 en: 26 de Septiembre 2014, 07:48 »
De acuerdo. Para implementarlo con Visual Basic te aconsejo que utilices la instrucción inputbox cuando tengas que pedir datos como forma de hacer que el bucle se detenga en el momento de petición de datos. Si lo hicieras con textbox, el bucle no se detendrá y tendrías que forzarlo de alguna forma poco ortodoxa.


 

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".