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:
(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:
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:
Página 2 de 7
Exámen de LP. Septiembre 2005
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 ;
};
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:
Página 4 de 7
Exámen de LP. Septiembre 2005
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