Saltar la navegación

5. Es la hora del estreno de mi reto

Rétor dice:Hasta ahora te hemos presentado cómo se trasmite la información por Internet y cómo se establecen sus comunicaciones. Además hemos visto que esta información tiene muchas amenazas y se hace necesario algún tipo de cifrado. Has conocido varios tipos de cifrado y cuál se utiliza en la actualidad, y lo más importante: cómo puedes utilizarlo también en tus programas en Python.

También has avanzado mucho en este aspecto: la programación. Gracias a las estructuras de control y de datos que has aprendido a utilizar ya puedes afrontar una variedad mucho más amplia de aplicaciones para resolver problemas que se planteen, entre ellos el reto que nos ocupa ahora: la programacióndel sistema de reserva de butacas de un cine. Aprovecha y reutiliza todo lo trabajado hasta ahora... ¡Comenzamos el desarrollo!

1. Planificando el desarrollo

Imagen de planificaciónEmpezamos por planificar el desarrollo del código de nuestro programa. Para ello realizarás el diagrama de flujo del funcionamiento del mismo, que sin duda te aclarará mucho las ideas acerca de su funcionamiento.

Comienza a realizar el diagrama del comportamiento general del programa teniendo en cuenta que vas a hacer el diagrama de flujo del programa principal, sin tener en cuenta el comportamiento de las funciones (trátalas como bloques que reciben unos datos y devuelven otros). El diagrama de flujo de nuestro programa sólo realizará las llamadas a estas funciones, su desarrollo lo acometerás en los próximos ejercicios.

Por tanto, para realizar el esquema del programa principal de nuestro reto tendrás que llevar a cabo los siguientes pasos:

  1. El patio de butacas, la sala, será representado por una variable que funcione como una matriz. Por tanto, tendrás que inicializarla con todos sus valores a "butaca=libre" porque consideramos que acaba de comenzar el sistema de reservas para este día. Para representar a las butacas libres u ocupadas utilizaremos los valores: ocupada= 1, libre = 0, luego nuestra matriz que representa la sala deberá ser inicializada con todos sus valores a cero. Consideraremos una sala de 6 filas y 10 butacas en cada fila. Eso significa un matriz de 6x10.
  2. Inicializa la tabla de usuario y contraseñas.
  3. Pide al usuario que empieza a utilizar el programa su nombre de usuario y la contraseña, y compárala con la que hay para ese usuario en el sistema. Utiliza una llamada a la función "compara_passwd" que recibe el nombre de usuario y la contraseña introducida, y que devuelve 1 si la contraseña es correcta para ese usuario y 0 si no lo es.
  4. Si la contraseña no es correcta, vuelve a pedir usuario y contraseña, sin fin.
  5. Si la contraseña es la correcta ofrece el menú de reserva por pantalla:
    1. Ver asientos libres en la sala (en cuyo caso se llamará a la función ver_sala()). Al terminar debemos volver a mostrar el menú de pantalla.
    2. Reservar butacas (en cuyo caso se llamará a la función reservar()). Al terminar debemos volver a mostrar el menú de pantalla.
    3. Imprimir ticket, si la reserva fue realizada con éxito (en cuyo caso se llamará a la función imprimir()) y si no, se indicará por pantalla. Al terminar debemos volver a mostrar el menú de pantalla.
    4. Salir del programa: opción que devuelve la ejecución del programa al paso 3, a pedir usuario y contraseña.

Como puedes comprobar, se trata de un programa sin final.

Ten en cuenta

  1. Las llamadas a función se ponen en el diagrama de flujo como un rectángulo con el nombre de la función.
  2. Comenzaremos con un ejemplo de 1 usuario que tendrá por nombre: "jgomez" y por contraseña: "elperrodesanroquenotienerabo". ¡No olvides que, por seguridad, esta contraseña deberá almacenarse de forma encriptada!

2. Hora de validar la contraseña

La contraseña de los usuarios en nuestro sistema de gestión de reservas se creó cuando estos en algún momento se dieron de alta en el sistema. Para almacenarla de forma segura se ha encriptado con su clave privada, de esta forma nadie más puede tener acceso al texto de la misma excepto el propio usuario.

ContraseñaCrea la función compara_passwd() que reciba como argumento el usuario, la contraseña y la lista de almacenamiento de usuarios y contraseñas. La función tendrá que buscar en la lista el usuario y comprobar si la contraseña proporcionada coincide con la almacenada.

No olvides que la almacenada está encriptada y ara compararla deberás primero desencriptarla.

La función devolverá:

  • 0 si la contraseña proporcionada no coincide con la almacenada o si el usuario no está en la lista.
  • 1 si la contraseña proporcionada coincide con la existente en el sistema para dicho usuario.

3. ¿Queda sitio libre?

Imagen de no hay sitio.¡El usuario necesita ver los sitios libres! A continuación vas a crear la función ver_sala() que funcionará del siguiente modo:

  • Recibe la variable matriz que representa la sala con sus butacas.
  • Imprime por pantalla la sala con todas las butacas a 0 o a 1 (ocupada/no ocupada).
  • Cuando imprimas la sala por pantalla sacaremos también un mensaje por pantalla indicando al usuario que anote el número de fila y el de butaca/s que deseará para indicárselo a la función de reserva.

¿Necesitas ayuda?

Si tienes dudas sobre cómo programar esta función, puedes ayudarte consultando el código del programa trabajado en el apartado 3.2. Elementos de la trama, "Segundo paso: muestra la sala".

4. Esta sí, esta no...hay que elegir

Es la hora de elegir asiento. Vas a crear la función reservar(), que reserva las butacas. Para ello, su fucionamiento debe ser:

Asientos

  1. La función recibirá como argumento la matriz que representa a la sala de butacas (variable de tipo lista).
  2. Hará falta pedir por pantalla el número de fila deseado, cuántas butacas se quieren reservar y el número de la primera de ellas en la fila.
  3. Entonces, el programa comprobará si están libres las butacas deseadas.
  4. Si están libres, se modificará la variable matriz poniendo a 1 esas butacas (ocupadas) y sacar un mensaje por pantalla que indique "Butacas reservadas correctamente".
  5. Si no están libres, debe sacar un mensaje por pantalla: "Las butacas solicitadas ya se encuentran ocupadas".
  6. La función devolverá 4 valores:
    1. La variable matriz que representa la sala porque puede haber sido modificada, y hay que almacenar dicho cambio.
    2. El número de fila que el usuario ha indicado.
    3. Cuántas butacas ha pedido (número).
    4. El número de la primera de ellas en la fila.

    Los tres últimos datos los necesitará la función de imprimir para que el usuario pueda imprimir su ticket, y deben por tanto almacenarse en variables del programa principal.

Ten en cuenta...

  1. Esta es la función má sensible de todas, ya que debes tener en cuenta si las variables que recibes se modifican dentro de la función, y si esa función debe permanecer (recuerda que las variables de una función son locales a dicha función y no existen en el programa principal).
  2. Puedes ayudarte de los programas trabajados en el apartado 3.2 Elementos de la trama, pasos 3 y 4.

5. ¡No olvides el ticket!

Imagen de ticketVas a crear ahora la función imprimir(), que generará un fichero de texto con el formato que se indica en este fichero de ejemplo.

Dicha función recibirá como argumentos:

  • La matriz que representa la sala de butacas.
  • El número de fila reservada.
  • Cuántas butacas se han reservado.
  • El número de la primera butaca reservada.

¡No olvides sacar por pantalla un mensaje que indique si el fichero ha sido generado correctamente! Usa para ello el tratamiento de excepciones que has conocido en el apartado 3.3. Archiva el contenido.

Pista...

Si necesitas ayuda podrás apoyarte en el código del programa trabajado en el apartado 3.3. Archiva el contenido.

6. Ahora, la parte principal.

¡Llegó la hora del estreno! Ahora codificarás el programa principal en Python: el funcionamiento del diagrama de flujo que creaste en el primer ejercicio teniendo en cuenta los siguientes aspectos:

Imagen estreno

  1. El patio de butacas, la sala, se representará con una variable tipo lista - matriz - de 6 filas con 10 butacas por fil.a (6x10). Los valores que usaremos para representar el estado de las butacas serán: 0 si la butaca está libre, 1 si está ocupada. Inicializaremos todos los valores a 0 porque se entiende que el programa de reservas acaba de empezar a funcionar.
  2. Al inicializar la lista de usuarios con l usuario dado como ejemplo, no olvides que la contraseña hay que almacenarla encriptada.
  3. Cuando el usuario elija la opción de reservar las butacas, tras llamar a la función reservar(), se recibe de vuelta la variable matriz que representa la sala. Ten en cuenta entonces:
    1. Si la variable matriz recibida es igual a la que está en el programa principal significa que la reserva no ha podido hacerse (por estar ocupadas las butacas). En ese caso debes tener una variable flag que esté a 0 para saber después que no podremos imprimir el ticket porque no hay reserva.
    2. Si la variable matriz recibida es diferente a la que está en el programa principal significará que la reserva se ha realizado correctamente. En este caso, la nueva variable matriz debe sustituir a la que existía y la variable flag se pondrá a 1 para indicar que el ticket sí puede imprimirse porque ya hay reserva hecha.
  4. Para llamar a la función imprimir() primero hay que comprobar la variable flag para saber si efectivamente se hizo la reserva. Si no se hizo, no se debe llamar a la función imprimir(), sino que deberá mostrarse un aviso por pantalla que indique: "No hay reserva para imprimir".

Un poco de ayuda

  1. Para la inicialización de butacas puedes consultar el programa que hiciste en el apartado 3.2. Elementos de la trama si necesitas ayuda.
  2. Para inicializar el almacenamiento de contraseña utilizaremos también una variable de tipo lista que será una matriz en la que podrás guardar los pares usuario-contraseña. Al ser una lista sería así fácilmente ampliable en el caso en el que hubiera más de un usuario.