Curso-lenguaje-C/curso-juantxi/Ejercicios/0701salaCine.c

256 lines
8.8 KiB
C

#include<stdio.h>
#include<stdlib.h>
/*
Nos han pedido un pequeño programa escrito en C para controlar la afluencia de una sala de cine en
la que las butacas se distribuyen en filas y asientos (los asientos serían las columnas). Para ello
utilizaremos un array bidimensional que abarque toda la sala. El encargado nos ha dicho que la sala
cuenta con 10 filas y 8 asientos por cada fila (el array tendrá una dimensión efectiva de 10 filas y 8
columnas).
La manera de indicar si un asiento se encuentra libre o no, es mediante un número entero que tendrá
valores:
0 → el asiento está vacío.
1 → el asiento está ocupado.
A la hora de mostrar la ocupación de la sala en lugar de con 1 y con 0 lo haremos con los símbolos:
O → el asiento está vacío.
X → el asiento está ocupado.
Así pues, cada vez que mostremos la sala, esta debe tener un aspecto similar al siguiente:
X X X O O O O O X X
O O O O O X X O O O
X X O O X X O O O X
Y así con todas las filas.
Al comienzo del programa la sala se encuentra con todas sus posiciones vacías. El programa debe
asegurarse de ello al comienzo (al comienzo el array se carga con todas sus posiciones con valor 0).
Para que el encargado de la sala pueda manejarla, se le presentará un menú con las siguientes
opciones:
1. Comprar entrada. Se le pedirá que indique la fila y el asiento (columna) en el que se quiere
sentar el espectador. Si ese asiento está ocupado se dará un mensaje de error. Si el asiento está libre,
se cambia su posición a ocupado y se da un mensaje de “entrada comprada”. La fila y columna
introducida deben ser válidas (entre 0 y su dimensión máxima), en caso contrario se mostrará un
mensaje de error.
2. Mostrar la ocupación de la sala. Mostrará toda la sala y sus asientos indicando de la manera
descrita cuales están ocupados y cuales están libres.
3. Devolver entrada. Se pedirá que indique la fila y el asiento (columna) que se quiere liberar. Si el
asiento ya estaba libre, se indicará mediante un mensaje de error. Si el asiento estaba ocupado, éste
se libera y se indica un mensaje de “asiento liberado”. La fila y columna introducida deben ser
válidas (entre 0 y su dimensión máxima), en caso contrario se mostrará un mensaje de error.
4. Calcular recaudación de la sala. Se calculará la recaudación total de la sala teniendo en cuenta
solo los asientos ocupados y que cada entrada tiene un valor de 5.5 €.
0. Salir.
El menú se repetirá hasta que el encargado de la sala pulse la opción de salir.
*/
#define FILAS 10
#define ASIENTOS 8
int main(){
// Variables
int sala[FILAS][ASIENTOS]={0};
int i=0;
int j=0;
char estado;
int menu, resFila, resAsiento;
float recauda;
char salir;
// Mostrar el estado de los asientos vacios.
printf("\n------------------------------");
printf("\n| Estado inicial de la sala |");
printf("\n------------------------------\n\n");
printf(" |\t0\t1\t2\t3\t4\t5\t6\t7\t<< Asiento\n");
printf("_____|_____________________________________________________________________________\n");
printf(" |\n");
for(i=0; i<FILAS; i++){
printf(" %d |\t",i);
for(j=0; j<ASIENTOS; j++){
if(sala[i][j]==0){
fflush(stdin);
estado = 'O';
}else{
fflush(stdin);
estado = 'X';
}
printf("%c\t", estado);
}
printf("\n");
}
printf(" |\n ^ |\nFila |\n\n");
// Empieza el menú de opciones
do{
//Elegir opción
printf("\n++++++++++++++\n+ MENÚ +\n++++++++++++++");
printf("\n1 Comprar entrada.");
printf("\n2 Mostrar la ocupación de la sala.");
printf("\n3 Devolver entrada");
printf("\n4 Calcular recaudación de la sala.");
printf("\n0 Salir\n");
printf("\nIntroduce una opción reseñada: ");
fflush(stdin);
scanf("%d", &menu);
// Condicional case para seleccionar el número
switch (menu) {
// OPCIÓN 1
case 1:
printf("\nPara reservar un asiento necesitamos:\nNúmero de fila: ");
// Pedir Fila y control de nº de fila correcto
do{
scanf("%d", &resFila);
if(resFila<0||resFila>=FILAS){
printf("\nSolo tenemos filas del 0 al 9.\nVuelva a intentarlo: ");
}
}while (resFila<=-1||resFila>=FILAS);
printf("Número de asiento: ");
// Pedir Asiento y control de nº de asiento correcto
do{
scanf("%d", &resAsiento);
if(resAsiento<0||resAsiento>=ASIENTOS){
printf("\nSolo tenemos asientos del 0 al 7.\nVuelva a intentarlo: ");
}
}while (resAsiento<=-1||resAsiento>=ASIENTOS);
// Control si el asiento está ocupado o es una reserva correcta
if(sala[resFila][resAsiento]==1){
printf("\n****************************************");
printf("\nLo sentimos, este lugar ya está ocupado.");
printf("\n****************************************\n");
}else{
sala[resFila][resAsiento]=1;
printf("\n*****************************************");
printf("\nSu reserva se ha efectuado correctamente.");
printf("\n¡GRACIAS POR SU COMPRA!");
printf("\n*****************************************\n");
}
break;
// OPCIÓN 2
case 2:
// Mostrar el estado de los asientos vacios.
printf("\n------------------------------");
printf("\n| Estado actual de la sala |");
printf("\n------------------------------\n\n");
printf(" |\t0\t1\t2\t3\t4\t5\t6\t7\t<< Asiento\n");
printf("_____|_____________________________________________________________________________\n");
printf(" |\n");
for(i=0; i<FILAS; i++){
printf(" %d |\t",i);
for(j=0; j<ASIENTOS; j++){
if(sala[i][j]==0){
fflush(stdin);
estado = 'O';
}else{
fflush(stdin);
estado = 'X';
}
printf("%c\t", estado);
}
printf("\n");
}
printf(" |\n ^ |\nFila |\n\n");
break;
// OPCIÓN 3
case 3:
printf("\nPara devolver una entrada necesitamos su ubicación en la sala:\nNúmero de fila: ");
// Pedir Fila y control de nº de fila correcto
do{
scanf("%d", &resFila);
if(resFila<=0||resFila>=FILAS){
printf("\nSolo tenemos filas del 0 al 9.\nVuelva a intentarlo: ");
}
}while (resFila<=-1||resFila>=FILAS);
printf("Número de asiento: ");
// Pedir Asiento y control de nº de asiento correcto
do{
scanf("%d", &resAsiento);
if(resAsiento<=0||resAsiento>=ASIENTOS){
printf("\nSolo tenemos asientos del 0 al 7.\nVuelva a intentarlo: ");
}
}while (resAsiento<=-1||resAsiento>=ASIENTOS);
// Control si el asiento está libre (error) o es una anulación correcta
if(sala[resFila][resAsiento]==0){
printf("\n***********************************");
printf("\nLo sentimos, este lugar está libre,\nno puede ser su liberado.");
printf("\n***********************************\n");
}else{
sala[resFila][resAsiento]=0;
printf("\n*******************************************");
printf("\nSu reserva ha sido cancelada correctamente.");
printf("\n¡HASTA PRONTO!");
printf("\n*******************************************\n");
}
break;
// OPCIÓN 4
case 4:
recauda=0;
for(i=0; i<FILAS; i++){
for(j=0; j<ASIENTOS; j++){
if(sala[i][j]==1){
recauda=recauda+5.5;
}
}
}
printf("\n***********************************************");
printf("\nLa sala lleva recaudado un total de %.2f euros.", recauda);
printf("\n***********************************************\n");
break;
// OPCIÓN SALIR
case 0:
break;
// ERROR EN EL MENÚ
default:
printf("\nNo es un valor correcto para este menu.\nVuelva a intentarlo\n\n");
}
}while ( menu != 0 );
return 0;
}