Cuando uno empieza puede costar ver las cosas de un modo diferente que como una enorme ensalada... un plato donde se sirve toda la comida.
Mejor si cada plato contiene un solo manjar...
Míralo bajo este prisma:
Tu programa contiene unos datos...
Imagina 5 cines, todos de 10 filas y 15 butacas que proyectan pelis en 3 horarios distintos.
Procede pues crear algún tipo de datos que mantenega ese conjunto...
Al empezar (el aprendiz) no controla las clases, así que ese tipo queda inicialmente descartado. Al empezar el 'tipo de datos de contenedor' reina suele ser el array (y al poco tiempo las estructuras y enumeraciones).
Una forma rápida... sería un array Cines, con dimensiones para 'salas, horarios, filas y butacas'. El orden de tales dimensiones, inicialmente no es tan importante, con la experiencia verás que surge naturalmente.
Los horarios, consíderalos como sesiones: 1,2,3 sean cuales sean sus horarios. Aunque luego ese valor conviene mantenerlo interno, cada sala podría tener su propio horario, y a la hora de imprimir el billete, conviene adjuntar bajo la sesión la hora exacta, asi como el día. Sin embargo la 'sesión' nos permite manejar cómodamente el array.
Una estructura con los datos: sala, sesión (incluye fecha y hora), fila y butaca resulta muy útil, para imprimir cada billete comprado.
Adjunto a cada sala y sesión puede haber asignado un precio por butaca.... o puede ser el mismo precio para todas las salas y sesiones. El precio debe imprimirse con cada billete. Igualmente se asocia con una película (el título de la misma que se proyecta), incluso una duración de la misma, aunque esto último no es obligatorio.
Ahora tu programa podría tener estos métodos:
1 - Crear sesion - (sala, sesión, horario, fecha, precio, pelicula): A la sala para esa sesión puede asignarse un precio por butaca y el título de la película, opcionalmente una duración para la misma y marcar todas las butacas de la sala como libres.
Al inicio del programa un bucle debería invocar la función 'crearSesion', para establecer sus horarios, fecha, etc... a cada sala.
2 - Vender Billete - (sala, sesion, fila, butaca) - Una vez se ha elegido una butaca en una sala y sesión libres, se marca como 'ocupada'. Comprueba además si quedan o no butacas libres. Al datallar esto más abajo se explica.
El array definitivamente puede contener un buleano (o si lo prefieres un int, byte o incluso char), donde 0 es libre y 1 es ocupada. o FALSE y TRUE, sírvete al gusto.
Esta función además de marcar la butaca como vendida, manda imprimir el billete comprado (incluído el precio de la butaca).
3 - Imprimir Billete - (sala sesion, fila, butaca). esta función imprime el billete de una única butaca, indicando la sala, la sesión (+ hora y día), la fila, butaca, precio, titulo y duración.
4 - Butaca ocupada - (sala, sesion, fila butaca) . Esta función preguntaría si la butaca deseada esta libre u ocupada.
5 - Buscar Butacas: (sala, sesion, fila, numbutacas, otrasFilas) . Esta función trata de ver si hay x butacas libres seguidas, en la fila deseada. Si no se encuentran libres esas x butacas libres, y el parámetros 'otrasFilas' es TRUE, está señalando que se busque si se localizan esas butacas libres en otra fila (mirará en el resto de filas mientra no se encuentre en la actual). Devuelve TRUE o FALSE, y por referencia la fila donde se localizan (solo si se encontró).
6 - Comprar billetes (sala, sesión, fila, numButacas). Esta funcion intenta comprar billetes para sala y sesión indicadas, en la fila deseada y la cantidad de butacas solicitadas. Esta función devuelve un buleano, indicando si se pudo comprar o no.
7 - Reservar Asientos. Esta función es la función principal de interacción con el usuario, la que solicita los datos al usuario... y va invocando al resto según se precise...
8 - Cerrar Sesion (sala, sesion). Llegada la hora indicada de inicio de la proyección en la sala (quizás más un margen de por ejemplo 15 minutos), se marca las butacas libres como ocupadas (en este caso no se imprimen billetes vendidos, pero puede imprimirse otro tipo de ticket asociado a la sala). También puede considerarse como sesión cerrada, si se han vendido todas las butacas de la sala, antes del inicio de su proyección.
Puede imprimirse un ticket donde se señale: sala, sesión, butacas vendidas, saldo recaudado.
Básicamente esas son las funciones principales, ahora explicar un poco el 'ritmo' (las dependencias y el flujo entre las funciones)...
0 - Abrir cine. Como se ha indicado más arriba, al empezar el programa, se crean-abren las salas:
funcion AbrirCine
Por cada sala
por cada sesión
Crear sesion(sala, sesion) //sesion.Indice, sesion.horario, sesion.fecha, sesion.precio, sesion.Pelicula
siguiente
siguiente
fin funcion
Ves como a cada sesión ya se asocia una estructura de forma natural?. Un índice, que antes se concebía como el dato 'sesion' es quien lo referencia...
Ya esta abierto el cine, de hecho la función que crea todas las sesiones puede llamarse así ' Abrir salas-cine'.
La función
Crear Sesión: pone a FALSE (ó 0), cada butaca de la sala, además establece el número de butacas totales libres, es decir si hay 10 filas y 15 butacas por fila establece: butacasLiberas = (filas * butacasxFila) = 150 (supuesto el mismo número de filas y butacas por fila para cada sala).
Ahora puede
Reservar Asientos: Esta es la función princiapal... es como presentarse ante la taquila/ventanilla de ventas y interaccionar con el vendedor. La función tras recabar datos, invocará la función 'buscar butacas'.
Si un usuario elige esa función (reservar asientos), se le piden los datos de elegir sala, sesión, fila y numero de butacas... y se invoca la función 'buscar butacas', si se encuentran libres devuelve TRUE. Si no se encuentran todas esas butacas se informa al usuario y se le pide si acepta buscarlos en otra filas... si dice que no, se aborta la operación diciéndole que no se encuentran todas esas butacas libres juntas en la fila solicitada... tendrá opción de intentar buscar o bien en otras filas o bien menos butacas en esa fila. Si acepta cambio de filas, se vuelve a intentar la compra pero ahora con el parámetro 'otrasFilas' = TRUE)... el resultado ya está descrito.
Cuando se encuentran las butacas solicitadas libres, se invoca la función 'comprar billetes'... más abajo se detalla.
La funcion
buscar butacas, consulta a la función 'Butaca ocupada', por cada butaca en numbutacas. Solo devuelve TRUE, si todas las butacas buscadas se encuentras libres, si no devuelve false.
La funcion
Butaca ocupada, consulta si para la sala y sesión solicitada, se encuentra libre la butaca de la fila solicitada, es decir es una consulta y devuelve TRUE o FALSE (1 o 0).
No hace nada más, es quizás la función más simple pero fundamental de todas. Cuanto más importante es un función, tratar de que sea lo más simple posible, es crucial para el 'buenseguir' del resto de operatoria... no te sientas tentado de integrarla en una función más grande, solo porque ocupe 1-3 líneas de código.
Cuando se invoca la funcion
Comprar Billetes (lo cual se hará sólo si 'buscar butacas' dio por resultado TRUE) calcula el importe y solicita el pago. Si se hace el pago total, se devuelve el cambio. En tal caso devuelve TRUE, si no devuelve FALSE. Si no se encuentran los asientos, también devuelve FALSE.
y entonces se invoca por cada butaca ahí, 'vender billete'...
Cuando se invoca la función
Vender billete (se invoca desde 'Comprar billetes'), la cuenta de butacas se reduce en 1. Butacaslibres -=1 y comprueba si quedan butacas libres, en caso negativo, cierra la sesión. La venta de 1 billete supone invocar 'imprimir billete'.
Cuando se invoca la función
Imprimir Billete, se imprime el billete de una única butaca, indicando la sala, la sesión (+ hora y día), la fila, butaca, precio, titulo y duración. No hace nada más.
Cerrar sesión, es una función que cuando se invoca impide vender más billetes para la sala y sesión actual.
Una sala ha finalizado una película, por tanto libera todas sus butacas, y dicha sesión queda libre para el día seguiente (es decir aumenta en 1 el día, según el mes). Si te complica el calendario y no se exige, elimina la fecha.
Teóricamente al cerrar sesión podría abrirse nueva sesión (invocar la función 'Crear Sesion'), para el día siguiente, esto permite la 'venta anticipada), o puede delegarse esa parte solo para la función 'Crear Sesion'. Cerrar seisón establece butacaslibres = 0, aunque ya tenga ese valor, y puede tener la funcionalidad extra, de imprimir un resumen del uso de la sala, básicamente indicar las butacasa vendidas y el total acumulado por la venta de dichas butacas...
Con toda esta descripción resulta sencillo hacer un pseudocódigo que describa toda la funcionalidad y luego es fácil ir implementando cada función e ir enganchándola (el código de la función que la llama) al resto...
Y eso es todo... Ahora, ¿puedes adaptar tu código para descibir toda esta funcionalidad?. Por simplicidad, puedes evitar las partes que no te hayan solicitado.