Documentos de Académico
Documentos de Profesional
Documentos de Cultura
*
* Mdulo: Cine
*
* Descripcin:
* Mdulo de gestin de pelculas de un cine.
* Implementa los siguientes datos:
* - titulo: titulo de la pelcula
* - entradas: entradas vendidas (max. 20)
* - fecha: fecha de emisin
*
fecha.dia
*
fecha.mes
*
fecha.anno
* - horario: hora de emisin de la pelcula
*
horario.hora
*
horario.minuto
* - genero: comedia, drama, terror o blica
*
* y las siguientes operaciones:
* - alta_pelicula:alta de pelcula
* - vender_entradas: vender entradas
* - lista_peliculas: Listado de pelculas
* - calendario: Mostrar calendario de pelculas
**********************************************************************/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "Cine.h"
#include "Calendario.h"
int numPeliculas = 0;
int auxIndice = 0;
int gen;
TipoCharGenero auxGenero;
TipoVectorPelicula vectorAuxiliar;
TipoCalendario calendario;
int orden = 0;
/*============================================================================
Procedimiento:
Dar alta a pelculas
Validaciones:
La pelcula a la que se pretende dar alta no est ya grabada (titulo)
La fecha y hora introducidas son vlidas
No existe ninguna pelcula programada en la fecha solicitada
El gnero introducido se corresponde con uno de los 4 vlidos
==============================================================================*/
void TipoGestion::CrearPelicula(TipoVectorPelicula vectorPeliculas) {
TipoPelicula pelicula;
InicializarPelicula( pelicula) ;
/*-- Comprobamos que no tengamos guardadas ya el nmero
mximo de pelculas --*/
if (ComprobarNumPeliculas()) {
system("cls");
printf( "
ALTA DE PELICULAS\n" );
printf( " ============================\n" );
printf( "\n" );
/*-- Comprobamos que el ttulo no est repetido --*/
do {
printf( "Titulo de la pelicula: " );
scanf( " %[^\n]s",pelicula.titulo );
======
Procedimiento: OrdenaVectorPeliculas
Ordena vectorPeliculas por fecha
=====================================================================================
=====*/
void TipoGestion::OrdenaVectorPeliculas( TipoVectorPelicula vectorPeliculas, int auxIndice ) {
TipoPelicula auxPelicula;
int aux = auxIndice-1;
while ((auxIndice>0) && (EsPosterior(vectorPeliculas[aux].fecha,vectorPeliculas[auxIndice].fecha))) {
auxPelicula = vectorPeliculas[aux];
vectorPeliculas[aux] = vectorPeliculas[auxIndice];
vectorPeliculas[auxIndice] = auxPelicula;
auxIndice --;
aux --;
}
}
/
*====================================================================================
======
Funcin:ComprobarHorario
Comprobar que la hora introducida es vlida
True:
False: Imprime mensaje de error
=====================================================================================
=====*/
bool TipoGestion::ComprobarHorario( TipoHorario horario) {
if (horario.hora<0 || horario.hora > 23 || horario.minuto < 0 || horario.minuto > 59) {
printf( "\nLa hora introducida no es correcta" );
printf( "\nIntroduzca un nuevo horario\n" );
return false;
} else {
return true;
}
}
/*====================================================================
Funcin: TituloRepetido
Comprueba si el ttulo de la pelcula est repetido
True: Asigna a la global auxIndice la posicin en el vector
vectorPeliculas del primer elemento libre (titulo = "")
False: Imprime mensaje de error
====================================================================*/
bool TipoGestion::TituloRepetido( TipoPelicula pelicula, TipoVectorPelicula vectorPeliculas) {
for ( int i = 0; i < maxPeliculas; i++) {
if (strcmp (vectorPeliculas[i].titulo, "") == 0) {
auxIndice = i;
/* Posicin del primer elemento del vector libre */
return false;
} else if ( strcmp (pelicula.titulo, vectorPeliculas[i].titulo) == 0) {
printf( "\nYa ha dado alta a una pelicula con ese titulo" );
printf( "\nIntroduzca un nuevo titulo\n" );
return true;
}
}
return false;
}
/*====================================================================
Funcion:comprobarNumPeliculas
Comprueba si se ha rebasado el mximo de pelculas admitidas
====================================================================*/
bool TipoGestion::ComprobarNumPeliculas() {
if (numPeliculas < maxPeliculas) {
return true;
} else {
return false;
}
}
/*====================================================================
Funcin: FechaOcupada
Comprueba si una fecha est ocupada
True: Imprime mensaje de error
False:
====================================================================*/
bool TipoGestion::FechaOcupada( TipoFecha fecha, TipoVectorPelicula vectorPeliculas) {
for ( int i = 0; i < maxPeliculas; i++) {
if ((vectorPeliculas[i].fecha.dia == fecha.dia) && (vectorPeliculas[i].fecha.mes == fecha.mes) &&
(vectorPeliculas[i].fecha.anno == fecha.anno)) {
printf( "\nYa hay una pelcula programada para esta fecha" );
printf( "\nIntroduzca una nueva fecha\n" );
return true;
}
}
return false;
}
/*============================================================================
Funcin: ComprobarGenero
Comprueba si el gnero introducido es correcto.
True: Devuelve el int que corresponde a la posicin en el tipo enum del gnero
False: Imprime mensaje de error
============================================================================*/
bool TipoGestion::ComprobarGenero( TipoCharGenero genero, int & gen ) {
if (strcmp(genero, "comedia")==0) {
gen = 0;
return true;
} else if (strcmp(genero, "drama")==0) {
gen = 1;
return true;
} else if (strcmp(genero, "terror")==0) {
gen = 2;
return true;
} else if (strcmp(genero, "belica")==0) {
gen = 3;
return true;
} else {
printf( "\nEl gnero debe ser comedia, drama, terror o belica" );
printf( "\nIntroduzca un nuevo genero\n" );
return false;
}
}
/*===================================================================
Procedimiento: InicializarVectorPeliculas
===================================================================*/
void TipoGestion::InicializarVectorPeliculas(TipoVectorPelicula vectorPeliculas) {
TipoPelicula pelicula;
InicializarPelicula( pelicula );
for (int i = 0; i < maxPeliculas; i++) {
/* strcpy(vectorPeliculas[i].titulo, "");
vectorPeliculas[i].entradas = 0;
vectorPeliculas[i].fecha.dia = 0;
vectorPeliculas[i].fecha.mes = 0;
vectorPeliculas[i].fecha.anno = 0;
vectorPeliculas[i].horario.hora = 0;
vectorPeliculas[i].horario.minuto = 0; */
vectorPeliculas[i] = pelicula;
}
}
/* ===================================================================
Procedimiento: InicializarPelicula
Procedimiento para inicializar el registro pelicula
===================================================================*/
void TipoGestion::InicializarPelicula(TipoPelicula & pelicula) {
strcpy(pelicula.titulo, "" );
pelicula.entradas = 0;
pelicula.fecha.dia = 0;
pelicula.fecha.mes = 0;
pelicula.fecha.anno = 0;
pelicula.horario.hora = 0;
pelicula.horario.minuto = 0;
}
/*===================================================================
Procedimiento: MostraCalendario
Muestra calendario de un mes/ao dado como entradas
Si no hay pelculas programadas ese mes, se muestra el calendario
sin pelculas, y el emnsaje 'No existen pelculas este mes'
Si existen pelculas:
Muestra VV si quedan entradas por vender
Muestra XX si aforo completo
Lista las pelculas programadas, las entradas restantes o
Aforo completo
===================================================================*/
void TipoGestion::MostrarCalendario(TipoVectorPelicula vectorPeliculas) {
int m = 0;
int a = 0;
system("cls");
printf( "
CALENDARIO DE PELICULAS\n" );
printf( " ============================\n" );
printf( "\n" );
do {
try {
printf( "\nMes: " );
fflush(stdin);
if (scanf( " %2d", &m ) == 0) {
throw true;
}
printf( "\nAnno: " );
fflush(stdin);
if (scanf( " %4d", &a ) == 0) {
throw true;
}
} catch (bool e) {
m = 0;
a = 0;
}
} while (!calendario.EsCorrecta(1, m, a));
calendario.ImprimirCalendario( m, a, vectorPeliculas );
ImprimePeliculasMes( m, a, vectorPeliculas);
printf( "\n" );
system("pause");
}
/*===================================================================
Procedimiento: ImprimePeliculasMes
Listado de pelculas del mes y ao pasados como parmetros
===================================================================*/
void TipoGestion::ImprimePeliculasMes( int mes, int anno, TipoVectorPelicula vectorPeliculas ) {
bool hayPeliculas = false;
for (int i=0; i<maxPeliculas; i++) {
if ((vectorPeliculas[i].fecha.mes == mes) && (vectorPeliculas[i].fecha.anno == anno)) {
ImprimePelicula( vectorPeliculas[i] , 1 );
hayPeliculas = true;
}
}
if (!hayPeliculas) {
printf( "\n\nNo existen peliculas este mes\n" );
}
}
/*===================================================================
Procedimiento: ListarPeliculas
Listado de pelculas del gnero pasado como entrada
Lista genero, ttulo, fecha, hora y entradas vendidas
Si se han vendido todas, muestra el mensaje 'Aforo compelto'
===================================================================*/
void TipoGestion::ListarPeliculas( TipoVectorPelicula vectorPeliculas ) {
bool hayPeliculas = false;
system("cls");
do {
gen = 0;
printf( "\nGenero de la pelicula: " );
scanf( "%s", &auxGenero );
} while (!(ComprobarGenero( auxGenero, gen ))); /* Pasamos gen por referencia */
for (int i=0; i<maxPeliculas; i++) {
if (vectorPeliculas[i].genero == TipoGenero(gen)) {
ImprimePelicula( vectorPeliculas[i], 0 );
hayPeliculas = true;
}
}
if (!hayPeliculas) {
printf( "\nNo hay peliculas del genero introducido\n" );
}
system("pause");
}
/*===================================================================
Procedimiento: ImprimePelicula
Imprime, en una lnea:
Gnero
Ttulo
Fecha programada
Hora programada
Nmero de entradas por vender o 'Aforo completo'
Parmetro:
orden:
0 - Primer campo: gnero
1 - Prime3r campo: fecha;
==================================================================*/
void TipoGestion::ImprimePelicula( TipoPelicula pelicula, int orden ) {
TipoCharGenero gen;
switch (int(pelicula.genero)) {
case 0:
strcpy( gen,"Comedia" );
break;
case 1:
strcpy( gen, "Drama" );
break;
case 2:
strcpy( gen,"Terror" );
break;
case 3:
strcpy( gen,"Belica" );
break;
}
if (orden == 0) {
printf( "\n%s. %s. %02d-%02d-%02d. %02d:%02d horas. ",
gen, pelicula.titulo, pelicula.fecha.dia, pelicula.fecha.mes,