[C con Clase] AYUDA URGENTE POR FAVOR!!!

Davidson, Steven srd4121 en njit.edu
Lun Ene 28 19:56:35 CET 2013


Hola Sara,

2013/1/28 Sara Castilla Guilllén <saricg en hotmail.es>

>  HOLA, MAÑANA TENGO QUE ENTREGAR UNA PRÁCTICA Y LA VERDAD QUE ME ESTOY
> VOLVIENDO LOCA PUES NO CONSIGO SOLUCIONAR LOS PROBLEMAS DE COMPILACIÓN.
>

Veamos el código fuente y todos los errores que hay:

* enum peliculas { ElHobbit, ¡RompeRalph!, ElCuerpo,
ElAlucinanteMundoDeNorman, LoImposible };

El error está en: ¡RompeRalph!  Recuerda que estás definiendo constantes
para C++. Los nombres o identificadores sólo pueden contener letras
(mayúsculas o minúsculas), dígitos, y el subrayado (_); además, el primer
carácter no puede ser un dígito.

Por lo tanto, simplemente elimina las exclamaciones para este nombre; o
sea, escribe:

enum peliculas { ElHobbit, RompeRalph, ElCuerpo, ElAlucinanteMundoDeNorman,
LoImposible };

* struct TpHorario{
salas numero_sala;
hora hora_sesion;
peliculas peli
}horario;

Necesitas el punto y coma al final de la declaración de 'peli'; es decir,

struct TpHorario{
salas numero_sala;
hora hora_sesion;
peliculas peli;
}horario;

* bool SalirDelPrograma(salir);

No has definido 'salir', que debería ser un tipo de dato, ya que esta
sentencia intenta declarar una función: su prototipo. Como realmente no
necesita un valor (entrante), puedes obviarlo.

Al final, puedes escribir:

bool SalirDelPrograma();


* En 'main()':

** case 0: cartelera = LeerPelicula();

El error está en que no pasas un parámetro a esta función. El prototipo de
'LeerPelicula()' es:

void LeerPelicula( const TpInfopeli &informacion );

El otro error es que intentas asignar el valor retornado de
'LeerPelicula()' a la variable 'cartelera'. Sin embargo, viendo el
prototipo, esta función no retorna ningún valor (void).

Por lo tanto, o bien cambias el prototipo 'LeerPelicula()' y obviamente su
definición para que retorne un valor de tipo 'TpCines', o bien no haces
esta asignación.

** case 1: VisualizarInformacion( cartelera );

Pasas la variable incorrecta, ya que esta función requiere un valor de tipo
'TpInfopeli', como indica su prototipo:

void VisualizarInformacion( const TpInfopeli &informacion );

Esto sugiere que deberías pasar 'informacion'; esto es,

case 1: VisualizarInformacion( informacion );

** case 1: //VisualizarInformacion

Duplicas el caso de 1. Simplemente, elimina esta sentencia.

** cin >> pelicula;
BuscarPelicula( cartelera, pelicula, encontrado, informacion );

No has definido 'pelicula'. Sospecho que querías usar 'nombre'; esto sería,

cin >> nombre;
BuscarPelicula( cartelera, nombre, encontrado, informacion );

** case 3: ListarPeliculas( informacion.pelicula );

Según el prototipo, esta función requiere un valor de tipo 'TpInfopeli'.
Supongo que quieres hacer esto:

case 3: ListarPeliculas( informacion );

** SalirDelPrograma( salir );

No defines 'salir', pero como dije antes, seguramente no necesites pasar
ningún parámetro, así que invoca esta función así:

SalirDelPrograma();


* En 'LeerPelicula()':

** cin >> informacion.nombre_cine;
    ...

cin >> intentará modificar el objeto que indiques. Sin embargo, esta
función acepta un objeto constante; escribes:

void LeerPelicula( const TpInfopeli &informacion );

No podemos modificar algo que es constante.

Sugiero eliminar 'const' del tipo del parámetro tanto en el prototipo como
en esta definición.


El otro problema es que algunos campos en 'informacion' son de tipo
enumerado. En la reciente revisión del estándar de C++, no podemos
convertir tipos enumerados implícitamente a enteros.

De todas maneras, no deberías usar tipos enumerados para lo que necesitas,
sino cadenas de caracteres - de tipo 'string', por ejemplo.

** return informacion;

No tiene sentido retornar algo, cuando dijiste que esta función no retorna
un valor, porque indicaste 'void' para el tipo de retorno.


* En 'InsertarPelicula()':

** void InsertarPelicula(TpCines &cartelera, const TpInfopeli
&informacion);{

Has colocado el punto y coma al final de la firma de esta función, creando
un prototipo, pero te interesa definir la función. Por lo tanto, elimina
este punto y coma.

** if
(Buscar(cartelera,informacion.nombre_cine.pelicula.protagonistas.calificacion_edades)
== -1){

No definiste la función 'Buscar()', por lo que me imagino que querías
decir, 'BuscarPelicula()'.

Sin embargo, no pasas la información correcta a esta función.

** while(i < MAX_CINES && cartelera[i].ocupada) // Buscar hueco
      i++;
    if (i < MAX_CINES){
      cartelera[i].informacion = info;
      cartelera[i].ocupada = true;
    }

El error está en el uso de 'cartelera[i]'. Accedes a campos que no existen
en este objeto.


* En 'VisualizarInformacion()':

** if (informacion[i].ocupada)

LeerPelicula(informacion[i].nombre_cine.pelicula.protagonistas.calificacion_edades);

Usas 'informacion' como un array, pero no se define como tal.

Además, pasas información incorrecta a 'LeerPelicula()'.


* En 'BuscarPelicula()':

** if (cartelera[i].ocupada && cartelera[i].informacion.pelicula ==
pelicula)
      encontrado = true;
...
if (encontrado){
    informacion = cartelera[i].informacion;

'cartelera[i]' no tiene estos campos.


* En 'ListarPeliculas()':

** if (cartelera[i].ocupada)
EscribirPelicula(cartelera[i].informacion);

Aquí tienes el mismo error anterior: 'cartelera[i]' no tiene definido estos
campos.

** EscribirPelicula(cartelera[i].informacion);

No has definido la función 'EscribirPelicula()'


* En 'SalirDelPrograma()':

** bool SalirDelPrograma(salir){

Elimina este parámetro que no necesitas.

** if (salir = S){

Recuerda que el operador =  es de asignación. Aquí te interesa el operador
de comparación de igualación ==. Esto es,

if (salir == S)

Sin embargo, debes definir correctamente 'salir'. Sospecho que debería ser
un carácter; por ejemplo,

char salir;

cin >> salir;

if( salir == 'S' )

Aunque también podría ser una cadena de caracteres; por ejemplo,

string salir;
...
if( salir == "S" )

** if (salir = S){
salir = true;
}else salir = false;

El objeto 'salir' no puede ser un carácter (o cadena) y también booleano.
En C++, las entidades definidas NO pueden adoptar nuevos tipos de datos: si
declaras que 'salir' es un carácter, no puede ser un booleano; ni viceversa.

De todas maneras, lo que te interesa es retornar la veracidad, por lo que
necesitas una sentencia 'return'. Esto sería:

if( salir == 'S' )
  return true;
else
  return false;

Sin embargo, esto complica las cosas demasiado y aconsejo hacer esto, en su
lugar:

return salir == 'S';


Bueno, Salvador se me ha adelantado, pero tiene razón. Necesitas usar
cadenas de caracteres y no tipos enumerados, para permitir al usuario
introducir los datos, para que tu programa los guarde y los pueda manipular.


Espero que todo esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130128/6deac8d6/attachment.html>


Más información sobre la lista de distribución Cconclase