You are on page 1of 7

Exámen de LP.

Septiembre 2005

1. (2 puntos) Detecta los posibles errores en los siguientes segmentos de programa e intenta corregirlos razonando
su corrección:
(a) c l a s s j u g a d o r
{ unsigned c a s i l l a , dado ;
public :
j u g a d o r ( unsigned c =0 , unsigned d )
{ c a s i l l a =c ; dado=d ; }
i nt mo str a r ( i nt &n , i nt &m) ;
};
void main ( )
{ jugador vecto r [ 3 ] , ∗ j1 ( 3 , 4 ) ;
cout<<” C a s i l l a d e l pr imer j u g a d o r ”<<v e c t o r [ 0 ] . c a s i l l a ;
cout<<” Va lo r : ”<<v e c t o r [ 3 ] . mo str a r ( 1 0 , 2 0 ) ; }

Solución:

El primer parámetro tiene valor por defecto y el segundo no.


main debe devolver int (lo hace si no se pone nada)
j1 no es un jugador, sino un puntero, ha de inicializarse con jugador * j1 = new jugador(3,4);
No se puede acceder al campo casilla desde fuera, no es public
No se puede llamar a mostrar con números, requiere variables o valores-i para tomar sus referen-
cias.
vector[3] se sale fuera de rango

(b) void c a l c u l a r ( )
{ i nt i ( 2 ) , j ( 5 ) ; float c ( 7 , 2 ) ; void x ;
switch ( i+j −c )
{ case −2: case −1: { cout<<” R e s u l t a d o n e g a t i v o ” ; break ; }
case 0 : { cout<<” R e s u l t a d o c e r o ” ; break ; } }
}
void o b t e n e r ( )
{ char ∗nombre ;
cout<<” I n t r o d u c e tu nombre : ” ; c i n >>nombre ; }

Solución:

El float c se construye con punto en lugar de coma


La variable x no puede ser de tipo void.
La expresión i+j-c da como resultado un float. El switch requiere un valor entero
Con cin >> nombre estamos metiendo datos en un lugar de memoria donde no hemos reservado
espacio, se debe hacer char nombre[numchars].

2. (1 punto) Implementa un programa que contenga una función (invertir subcadena) a la que se le pasa una cadena
de caracteres y un número entero previamente leı́dos desde el teclado. Dicha función debe devolver la porción de
la cadena recibida hasta la posición indicada por el número entero de forma invertida.
Por ejemplo: cadena = ”Esto es una prueba”, posición = 6 . Resultado: “e otsE” En el caso de que el número
entero recibido por la función sea superior a la longitud de la cadena original la función deberá devolver el
puntero nulo.
La función debe ser implementada usando sólo aritmética de punteros (sin indexar los punteros ni los vectores),
y sin usar las funciones predefinidas para cadenas (strlen, strcmp, etc). Se supone que el tamaño máximo de la
cadena de caracteres es de 79, y que debe ser tratada como un vector de caracteres.

Página 1 de 7
Exámen de LP. Septiembre 2005

Solución:

#define SIZE 79
char ∗ r e v e r s e ( char ∗ s , i nt l i m i t ) {
char ∗ r e t = new char [ SIZE + 1 ] ;
i nt n = 0 ;
i nt i n d e x ;
while ( n++ < l i m i t )
i f ( ∗ s++ == 0 )
return 0 ;
index = 0 ;
while ( n−− > 0 ) {
∗ ( r e t+i n d e x ) = ∗(−− s ) ;
i n d e x++;
}
∗ ( r e t+i n d e x ) = 0 ;
return r e t ;
}

3. (2 puntos) Supongamos una empresa que lleva el registro de citas solicitadas (concedidas o no) de cada mes de
sus empleados en un fichero denominado “Citas.txt”. La estructura de cada cita está formada por el nombre del
empleado, un dı́a del mes, una hora, el motivo de la cita (una única palabra) y si dicho permiso ha sido o no
concedido. Por ejemplo:
Empleado Dı́a Hora Motivo Permiso
Pepe 23 17 dentista true
Luisa 15 10 conferencia false
Julio 23 17 comida false
Por lo tanto, el fichero responde a la siguiente estructura:
const i nt tam ( 3 0 ) ;
struct T c i t a {
unsigned i nt d i a ;
unsigned i nt ho r a ;
};
struct T c i t a e m p l e a d o {
char empleado [ tam ] ;
Tcita c i t a ;
char motivo [ tam ] ;
bool per miso ;
};

Escribir una función que dé permiso a todas aquellas citas del citado fichero cuyo dı́a y hora correspondan con
los datos recibidos por la función, y que no hayan sido ya concedidas. Teniendo en cuenta el ejemplo anterior, si
la función recibe como dı́a 23 y como hora 17, la función actualizará el fichero quedando de la siguiente forma:
Empleado Dı́a Hora Motivo Permiso
Pepe 23 17 dentista true
Luisa 15 10 conferencia false
Julio 23 17 comida frue

Solución:

#include <f s t r e a m>


#include <i o s t r e a m>
using namespace s t d ;
void m o s t r a r f i c h e r o ( ) ;

Página 2 de 7
Exámen de LP. Septiembre 2005

void a c t u a l i z a r c i t a s ( unsigned i nt dia , unsigned i nt ho r a ) ;

const i nt tam ( 3 0 ) ;
struct T c i t a {
unsigned i nt d i a ;
unsigned i nt ho r a ;
};
struct T c i t a e m p l e a d o {
char empleado [ tam ] ;
Tcita c i t a ;
char motivo [ tam ] ;
bool per miso ;
};

// A c t u a l i z a r en f i c h e r o l a s de un d i a y una hora que no t en gan permiso


void a c t u a l i z a r c i t a s ( unsigned i nt dia , unsigned i nt ho r a ) {
str ea mpo s p o s i c i o n ;
Tcita empleado c i t a ;
fstream f i c h e r o ;
f i c h e r o . open ( ” c i t a s . t x t ” , i o s : : i n | i o s : : out ) ;
i f ( ! f i c h e r o ){
co ut << ” El f i c h e r o no puede a b r i r s e pa r a a c t u a l i z a r ” << e n d l ;
return ;
}
p o s i c i o n = f i c h e r o . t e l l g ( ) ; // gu ardo pos para v o l v e r a t r a s y e s c r i b i r en e l l a
f i c h e r o . r ea d ( ( char∗)& c i t a , s i z e o f ( c i t a ) ) ;
while ( ! f i c h e r o . e o f ( ) ) {
i f ( c i t a . c i t a . d i a == d i a && c i t a . c i t a . ho r a == ho r a && c i t a . permiso == f a l s e ) {
c i t a . per miso = true ;
f i c h e r o . s e e k p ( p o s i c i o n ) ; // v u e l v o a t r a s para e s c r i b i r
f i c h e r o . w r i t e ( ( char ∗ ) &c i t a , s i z e o f ( c i t a ) ) ;
}
p o s i c i o n = f i c h e r o . t e l l g ( ) ; // gu ardo pos para v o l v e r a t r a s y e s c r i b i r en e l l a
f i c h e r o . r ea d ( ( char∗)& c i t a , s i z e o f ( c i t a ) ) ;
}
fichero . close ();
}
void m o s t r a r f i c h e r o ( void ) {
Tcita empleado c i t a ;
fstream f i c h e r o ;
f i c h e r o . open ( ” c i t a s . t x t ” , i o s : : i n ) ;
i f ( ! f i c h e r o ){
co ut << ” El f i c h e r o no puede a b r i r s e pa r a l e e r ” << e n d l ;
return ;
}
while ( f i c h e r o . r ea d ( ( char∗)& c i t a , s i z e o f ( c i t a ) ) && ! f i c h e r o . e o f ( ) ) {
co ut << e n d l ;
co ut << ”Empleado : ” << c i t a . empleado << e n d l ;
co ut << ” Dia : ” << c i t a . c i t a . d i a << e n d l ;
co ut << ” Hora : ” << c i t a . c i t a . hora<< e n d l ;
co ut << ” Motivo : ” << c i t a . motivo << e n d l ;
co ut << ” Permiso : ” << ( char ∗ ) ( c i t a . per miso ? ” v e r d a d e r o ” : ” f a l s o ” ) << e n d l ;
co ut << e n d l ;
}
fichero . close ();
}
i nt main ( void ) {

Página 3 de 7
Exámen de LP. Septiembre 2005

mostrarfichero ( ) ;
actualizarcitas (4 ,3);
mostrarfichero ( ) ;
}

4. (3 puntos) Implementa la clase punto, y la clase polı́gono. Cada objeto de la clase punto tiene dos coordenadas
de tipo entero (x e y). Cada polı́gono está formado por un número determinado pero variable de puntos. Utiliza
reserva dinámica de memoria para almacenar los puntos que forman el polı́gono. Implementa las funciones
necesarias (constructores, destructores, ...) para que la siguiente secuencia de instrucciones sea válida:
void main ( )
{
p o l i g o n o t r i a n g u l o ( 3 ) ; // 3 p u n t o s
c i n >>t r i a n g u l o ; // l e e l a s coorden ada s de l o s p u n t o s
p o l i g o n o temp ( t r i a n g u l o ) ;
i f ( temp <4) // comprueba s i e l numero de p u n t o s e s < 4
cout<<temp ;
p o l i g o n o cuadrado ( 4 ) ;
punto p ;
c i n >>p ;
cuadrado=t r i a n g u l o+p ;
cout<<cuadrado ;
}

Solución:

#include <i o s t r e a m>


using namespace s t d ;
c l a s s Punto {
public :
i nt x , y ;
Punto ( ) {
x=0;
y=0;
}
};
i s t r e a m & operator >> ( i s t r e a m & i s , Punto & p ) {
i s >> p . x ;
i s >> p . y ;
return i s ;
}
class Poligono {
public :
i nt numPuntos ;
Punto ∗ punto s ;

Poligono ( Poligono & p ) ;


P o l i g o n o ( i nt n ) ;
Poligono ( ) ;
P o l i g o n o & operator = ( P o l i g o n o &p ) ;
P o l i g o n o operator + ( Punto p ) ;
bool operator < ( i nt numPuntos ) ;
};
P o l i g o n o : : P o l i g o n o ( P o l i g o n o & p ){
numPuntos = p . numPuntos ;

Página 4 de 7
Exámen de LP. Septiembre 2005

punto s = new Punto [ numPuntos ] ;


for ( i nt n=0; n< numPuntos ; n++){
punto s [ n ] . x = p . punto s [ n ] . x ;
punto s [ n ] . y = p . punto s [ n ] . y ;
}
}
P o l i g o n o : : P o l i g o n o ( i nt n ) {
numPuntos = n ;
punto s = new Punto [ numPuntos ] ;
}
Poligono : : Poligono (){
numPuntos = 0 ;
punto s = 0 ;
}
P o l i g o n o & P o l i g o n o : : operator = ( P o l i g o n o &p ) {
i f (&p == t h i s ) return ∗ t h i s ;
i f ( numPuntos>0 && punto s != 0 ) delete [ ] punto s ;
numPuntos = p . numPuntos ;
punto s = new Punto [ numPuntos ] ;
for ( i nt n=0; n< numPuntos ; n++){
punto s [ n ] . x = p . punto s [ n ] . x ;
punto s [ n ] . y = p . punto s [ n ] . y ;
}
return ∗ t h i s ;
}

P o l i g o n o P o l i g o n o : : operator + ( Punto p ) {
P o l i g o n o nuevo ( numPuntos + 1 );
i nt n ;
for ( n=0; n< numPuntos ; n++){
nuevo . punto s [ n ] = punto s [ n ] ;
}
nuevo . punto s [ n ] = p ;
return nuevo ;
}
bool P o l i g o n o : : operator < ( i nt numPuntos ) {
return P o l i g o n o : : numPuntos < numPuntos ;
}
o str ea m & operator << ( o str ea m & os , P o l i g o n o &p ) {
for ( i nt n=0; n< p . numPuntos ; n++){
o s << ( ” ( ” ) ;
o s << ( p . punto s [ n ] . x ) ;
o s << ( ” , ” ) ;
o s << ( p . punto s [ n ] . y ) ;
o s << ( ” ) ” ) ;
}
return o s ;
}
i s t r e a m & operator >> ( i s t r e a m & i s , P o l i g o n o &p ) {
for ( i nt n=0; n< p . numPuntos ; n++){
i s >> p . punto s [ n ] . x ;
i s >> p . punto s [ n ] . y ;
}
return i s ;
}

i nt main ( void ) {

Página 5 de 7
Exámen de LP. Septiembre 2005

Poligono t r i a n g u l o ( 3 ) ;
co ut << ” T e c l e a 3 punto s ” ;
c i n >> t r i a n g u l o ;
P o l i g o n o temp ( t r i a n g u l o ) ;
i f ( temp < 4 ) co ut << temp ;
P o l i g o n o cuadrado ( 4 ) ;
Punto p ;
co ut << ” T e c l e a un punto mas” ;
c i n >> p ;
cuadrado = t r i a n g u l o+p ;
co ut << cuadrado ;
}

5. (2 puntos) Suponiendo que se tiene implementada una clase Fecha, con un constructor que recibe tres argumentos
dı́a, mes y año:
(a) Define la clase Persona, con una variable dni y otra fecha nacimiento. Implementa el constructor de la clase
y una función visualizar.

Solución:
o str ea m & operator << ( o str ea m & os , Fecha &f ) {
o s << f . d i a << ” / ” << f . mes << ” / ”<< f . anno ;
return o s ;
}
c l a s s P er so na {
public :
long d n i ;
Fecha f e c h a n a c i m i e n t o ;
P er so na ( long dni , i nt dia , i nt mes , i nt anno )
: f e c h a n a c i m i e n t o ( dia , mes , anno ) , d n i ( d n i ) {
}
v i r t u a l void v i s u a l i z a r ( ) {
co ut << ” d n i : ” << d n i << e n d l ;
co ut << ” f e c h a : ” << f e c h a n a c i m i e n t o << e n d l ;
}
};

(b) A partir de la clase Persona define las clases Alumno y Profesor. Define variables especı́ficas para cada clase
e implementa un constructor y una función visualizar para cada una.

Solución:
c l a s s Alumno : public P er so na{
public :
long e x p e d i e n t e ;
Alumno ( long e x p e d i e n t e , i nt dni , i nt dia , i nt mes , i nt anno )
: P er so na ( dni , dia , mes , anno ) , e x p e d i e n t e ( e x p e d i e n t e ) {
}
void v i s u a l i z a r ( ) {
P er so na : : v i s u a l i z a r ( ) ;
co ut << ” e x p e d i e n t e : ” << e x p e d i e n t e << e n d l ;
}
};
c l a s s P r o f e s o r : public P er so na{
public :

Página 6 de 7
Exámen de LP. Septiembre 2005

float sueldo ;
P r o f e s o r ( f l o a t s u e l d o , i nt dni , i nt dia , i nt mes , i nt anno )
: P er so na ( dni , dia , mes , anno ) , s u e l d o ( s u e l d o ) {
}
void v i s u a l i z a r ( ) {
P er so na : : v i s u a l i z a r ( ) ;
co ut << ” s u e l d o : ” << s u e l d o << e n d l ;
}
};

(c) Escribir un ejemplo de ligadura dinámica que haga uso de la función visualizar.

Solución:
i nt main ( void ) {
P er so na ∗ p ;
p = new Alumno ( 1 0 0 0 , 2 3 4 3 2 , 2 , 2 , 2 0 0 6 ) ;
p−>v i s u a l i z a r ( ) ;
p = new P r o f e s o r ( 9 8 8 4 3 , 6 5 4 3 , 3 0 , 1 2 , 1 9 9 9 ) ;
p−>v i s u a l i z a r ( ) ;
}

Página 7 de 7

You might also like