Sei sulla pagina 1di 7

Exámen de LP.

Septiembre 2004

1. (2 puntos) Detecta los errores de los siguientes trozos de código:


(a) c l a s s ba se1 {
void b11 ;
protected :
i nt b12 ;
public :
ba se1 ( i nt n )
{ cout<<” C o n s t r u c t o r . Argumento ”<<n ; }
void a lma cena r b1 ( i nt i , i nt j ) { b11=i ; b12=j ; }
ba se1 operator++(ba se1 ) ;
};
c l a s s ba se2 {
char b21=” a ” ;
protected :
i nt b22 ;
public :
void a lma cena r b2 ( char c , i nt j ) { b21=c ; b22=j ; }
};
c l a s s d e r i v a d a : private base1 , public ba se2 {
float d ;
public :
derivada ( float x)
{ d=x ;
cout<<” C o n s t r u c t o r . Argumento ”<< x ; }
void mo str a r ( ) { cout<<b22<<b12 ; }
};
main ( ) {
derivada d ;
d . a lma cena r b1 ( 1 , 2 ) ;
d . a lma cena r b2 ( 3 , 4 ) ;
d . mo str a r ( ) ;
}

Solución:

b11 no puede ser de tipo void


b21 no puede ir entre comillas, sino entre apóstrofes. Tampoco puede inicializarse con ningún
valor, pues no es static, tampoco debe ir donde va, si no será privada. Pasarlo al bloque protected
Al crear un constructor parametrizado para base1 se elimina el constructor por defecto luego en
la construcción de las clases derivadas hemos de aclarar cuál deseamos ejecutar
El método almacenarb1 se ha heredado de base1 como privado, no se puede acceder desde fuera.
El parámetro del operator ++ posfijo ha de ser un int

(b) c l a s s j u g a d o r
{ unsigned c a s i l l a ;
unsigned dado ;
public :
j u g a d o r ( unsigned c =0 , unsigned d )
{ c a s i l l a =c ; dado=d ; }
void mo str a r ( )
{ cout<<” C a s i l l a : ”<<c ; cout<<” dado : ”<<d ; }
movimiento ( i nt v ) ;
};
main ( )
{

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

jugador vecto r [ 3 ] ;
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 ;
jugador ∗ j1 (3 , 4 ) ;
j1 −>mo str a r ( ) ; }

Solución:

movimiento no declara qué devuelve.

mostrar ha de usar las variables casilla y dado, no c y d


casilla es privada, no se puede acceder desde fuera
El vector llama al constructor por defecto, que ya no existe porque hemos creado uno.
j1 es un puntero, en todo caso serı́a jugador * j1 = new jugador(3,4);

2. (1 punto) Implementa un programa que contenga una función (pares) a la que se le pasa una cadena de caracteres
previamente leı́da desde el teclado, y devuelva otra cadena que contenga solo los caracteres que se encuentran
en posiciones con ı́ndice par dentro de la cadena aceptada. Para realizar dicho programa no se puede 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.

Solución:

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


using namespace s t d ;
char ∗ p a r e s ( char ∗ s ) {
char ∗ r = new char [ 8 0 ] ;
i nt s i =0; // i n d i c e de s
i nt r i =0; // i n d i c e d e l r e t o r n o
while ( ∗ ( s+s i ) != ’ \0 ’ ) {
i f ( s i % 2 != 0 ) {
∗ ( r+r i )= ∗ ( s+s i ) ;
r i ++;
}
s i ++;
}
∗ ( r+r i )= ’ \0 ’ ;
return r ;
}
i nt main ( void ) {
char l e t r a s [ 8 0 ] ;
co ut << ” E s c r i b a una f r a s e : ” ;
cin . g etline ( letras ,8 0 ) ;
char ∗ s ;
s = pares ( l e t r a s ) ;
co ut << ” C a r a c t e r e s p a r e s : ” << s << e n d l ;
cin . get ( ) ;
}

3. (2 puntos) Se desea informatizar la gestión de los pedidos de un centro comercial por parte del almacén del
mismo. Concretamente de cada pedido es necesario tratar la siguiente información:
identificador del pedido-tienda (esta compuesto por el identificador de la tienda que son tres caracteres y el
identificador propio del pedido que es un número entero)
dirección del cliente (nombre y apellidos, calle y número),

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

importe total del pedido,


número de bultos que comprende el pedido (no puede ser más de 7 bultos),
si el pedido esta o no pagado,
y el tratamiento que se le debe dar (puede ser muy frágil, frágil, normal y duro)
Para ello se debe realizar los siguientes apartados:
Declara la estructura de datos necesaria para almacenar toda la información de un pedido (se debe tener
como objetivo primordial el ahorro de espacio y la legibilidad de la estructura)
Suponer que se dispone de un fichero llamado “almacen”, donde esta almacenada la información correspon-
diente a todos los pedidos que gestiona el almacén. Escribe un programa que lea de ese fichero e incremente
en un 10 % el importe total a todos aquellos pedidos que no hayan sido pagados y cuyo tratamiento sea
muy frágil o frágil.

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 a c t u a l i z a r f i c h e r o ( ) ;
void c r e a r f i c h e r o ( ) ;
void m o s t r a r f i c h e r o ( ) ;
enum Tr a ta miento{ m u y f r a g i l , f r a g i l , normal , duro } ;
struct IdP edido {
char idTienda [ 3 ] ;
i nt i d P e d i d o ;
};
struct D i r e c c i o n {
char nombre [ 3 0 ] ;
char a p e l l i d o s [ 4 0 ] ;
char c a l l e [ 4 0 ] ;
i nt numero ;
};
struct Pedido {
IdP edido i d ;
Direccion direccion ;
f l o a t impo r te ;
unsigned i nt numBultos : 3 ;
unsigned i nt pagado : 1 ;
Tr a ta miento t r a t a m i e n t o ;
};

void a c t u a l i z a r f i c h e r o ( ) {
f s t r e a m almacen ;
almacen . open ( ” almacen . dat ” , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
Pedido pedido ;
str ea mpo s a c t u a l ;
a c t u a l = almacen . t e l l g ( ) ;
almacen . r ea d ( ( char∗)& pedido , s i z e o f ( Pedido ) ) ;
while ( ! almacen . e o f ( ) ) {
i f ( ! ( pedido . pagado ) && ( pedido . t r a t a m i e n t o == f r a g i l | | pedido . t r a t a m i e n t o == m u y
pedido . impo r te += pedido . impo r te ∗ 0 . 1 ;
almacen . s e e k p ( a c t u a l ) ;
almacen . w r i t e ( ( char ∗)& pedido , s i z e o f ( Pedido ) ) ;
}

a c t u a l = almacen . t e l l g ( ) ;

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

almacen . r ea d ( ( char∗)& pedido , s i z e o f ( Pedido ) ) ;


}
almacen . c l o s e ( ) ;
}
void c r e a r f i c h e r o ( ) {
f s t r e a m almacen ;
almacen . open ( ” almacen . dat ” , i o s : : out | i o s : : b i n a r y ) ;
Pedido pedido ;

s t r c p y ( pedido . i d . idTienda , ”ABC” ) ;


pedido . i d . i d P e d i d o = 1 ;
s t r c p y ( pedido . d i r e c c i o n . nombre , ” Juan” ) ;
s t r c p y ( pedido . d i r e c c i o n . a p e l l i d o s , ” P er ez ” ) ;
s t r c p y ( pedido . d i r e c c i o n . c a l l e , ” T e l l e i r a ” ) ;
pedido . d i r e c c i o n . numero = 1 0 ;
pedido . impo r te = 1 2 3 ;
pedido . numBultos = 3 ;
pedido . pagado = 1 ;
pedido . t r a t a m i e n t o = f r a g i l ;

almacen . w r i t e ( ( char∗)& pedido , s i z e o f ( Pedido ) ) ;

s t r c p y ( pedido . i d . idTienda , ”DEF” ) ;


pedido . i d . i d P e d i d o = 1 ;
s t r c p y ( pedido . d i r e c c i o n . nombre , ” L u i s ” ) ;
s t r c p y ( pedido . d i r e c c i o n . a p e l l i d o s , ” P er ez ” ) ;
s t r c p y ( pedido . d i r e c c i o n . c a l l e , ” T e l l e i r a ” ) ;
pedido . d i r e c c i o n . numero = 2 0 ;
pedido . impo r te = 1 2 3 ;
pedido . numBultos = 3 ;
pedido . pagado = 0 ;
pedido . t r a t a m i e n t o = f r a g i l ;

almacen . w r i t e ( ( char∗)& pedido , s i z e o f ( Pedido ) ) ;

s t r c p y ( pedido . i d . idTienda , ”GHI” ) ;


pedido . i d . i d P e d i d o = 1 ;
s t r c p y ( pedido . d i r e c c i o n . nombre , ” Manuel ” ) ;
s t r c p y ( pedido . d i r e c c i o n . a p e l l i d o s , ” P er ez ” ) ;
s t r c p y ( pedido . d i r e c c i o n . c a l l e , ” T e l l e i r a ” ) ;
pedido . d i r e c c i o n . numero = 3 0 ;
pedido . impo r te = 1 2 3 ;
pedido . numBultos = 2 ;
pedido . pagado = 0 ;
pedido . t r a t a m i e n t o = m u y f r a g i l ;

almacen . w r i t e ( ( char∗)& pedido , s i z e o f ( Pedido ) ) ;

almacen . c l o s e ( ) ;
}
void m o s t r a r f i c h e r o ( ) {
f s t r e a m almacen ;
almacen . open ( ” almacen . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
Pedido pedido ;
str ea mpo s a c t u a l ;
almacen . r ea d ( ( char∗)& pedido , s i z e o f ( Pedido ) ) ;
while ( ! almacen . e o f ( ) ) {

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

co ut << ”−−−−−−−−pedido −−−−−−−−−−−−−−” << e n d l ;


co ut << ” i d P e d i d o : ” << pedido . i d . i d P e d i d o << e n d l ;
co ut << ”nombre : ” << pedido . d i r e c c i o n . nombre << e n d l ;
co ut << ” a p e l l i d o s : ” << pedido . d i r e c c i o n . a p e l l i d o s << e n d l ;
co ut << ” c a l l e : ” << pedido . d i r e c c i o n . c a l l e << e n d l ;
co ut << ”numero : ”<< pedido . d i r e c c i o n . numero << e n d l ;
co ut << ” impo r te : ” << pedido . impo r te << e n d l ;
co ut << ” b u l t o s : ” << pedido . numBultos << e n d l ;
co ut << ” pagado : ” ;
switch ( pedido . pagado ) {
case 1 : co ut << ” s i ” ; break ;
case 0 : co ut << ”no ” ; break ;
}
co ut << e n d l ;

co ut << ” t r a t a m i e n t o : ” ;
switch ( pedido . t r a t a m i e n t o ) {
case m u y f r a g i l : co ut << ”muy f r a g i l ” ; break ;
case f r a g i l : co ut << ” f r a g i l ” ; break ;
case normal : co ut << ” normal ” ; break ;
case duro : co ut << ” duro ” ; break ;
}
co ut << e n d l ;

almacen . r ea d ( ( char∗)& pedido , s i z e o f ( Pedido ) ) ;


}
almacen . c l o s e ( ) ;

}
i nt main ( ) {
crearfichero ();
mostrarfichero ( ) ;
actualizarfichero ();
mostrarfichero ( ) ;
}

4. (3 puntos) Implementa la clase Fecha para que la siguiente secuencia de instrucciones sea posible.
Fecha f e c h a a l t a , hoy ( 1 7 , 9 , 2 0 0 4 ) ;
o f s t r e a m f l u j o ( ” Vida La bo r a l . t x t ” ) ;
i nt n u m e r o d i a s ;
c i n >>f e c h a a l t a ;
i f ( f e c h a a l t a >hoy ) n u m e r o d i a s=f e c h a a l t a −hoy ;
f l u j o <<f e c h a a l t a <<ends<<hoy<<ends<<e n d l ;

Solución:

#include <f s t r e a m>


#include <i o s t r e a m>
using namespace s t d ;
c l a s s Fecha {
private :
i nt d i a ;
i nt mes ;
i nt anno ;

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

public :
Fecha ( ) ;
Fecha ( i nt dia , i nt mes , i nt anno ) ;
bool operator >(Fecha & f e c h a ) ;
i nt operator −(Fecha & f e c h a ) ;

fri end Fecha & operator >>(i s t r e a m &in , Fecha &f e c h a ) ;


fri end o str ea m & operator <<(o str ea m &out , Fecha &f e c h a ) ;
};

Fecha : : Fecha ( )
: d i a ( 1 ) , mes ( 1 ) , anno ( 2 0 0 5 ) {
}
Fecha : : Fecha ( i nt dia , i nt mes , i nt anno )
: d i a ( d i a ) , mes ( mes ) , anno ( anno ) {
}
bool Fecha : : operator >(Fecha & f e c h a ) {
i f ( anno > f e c h a . anno ) return true ;
i f ( anno < f e c h a . anno ) return f a l s e ;
i f ( mes > f e c h a . mes ) return true ;
i f ( mes < f e c h a . mes ) return f a l s e ;
i f ( d i a > f e c h a . d i a ) return true ;
i f ( d i a < f e c h a . d i a ) return f a l s e ;
// e n t o n c e s son i g u a l e s
return f a l s e ;
}
i nt Fecha : : operator −(Fecha & f e c h a ) {
return ( ( Fecha : : anno − f e c h a . anno ) ∗ 365
+ ( Fecha : : mes − f e c h a . mes ) ∗ 31
+ ( Fecha : : d i a −f e c h a . d i a ) ) ;
}
Fecha & operator >>(i s t r e a m &in , Fecha &f e c h a ) {
i n >> f e c h a . d i a ;
i n >> f e c h a . mes ;
i n >> f e c h a . anno ;
return i n ;
}
o str ea m & operator << ( o str ea m &out , Fecha &f e c h a ) {
out << f e c h a . d i a << ” /” << f e c h a . mes << ” / ” << f e c h a . anno ;
return out ;
}

5. (2 puntos) Modificar la definición de la clase Tvector para hacerla genérica.


c l a s s Tvecto r
{
i nt ∗ Elementos ; // Puntero a l o s e l e m e n t o s d e l v e c t o r
i nt NumElementos ; // Numero de e l e m e n t o s d e l v e c t o r
public :
Tvecto r ( i nt Num) ;
i nt &operator [ ] ( i nt Num ) ; // s o b r e c a r g a d e l o p e r a d o r [ ]
˜ Tvecto r ( ) ;
};

Añadir a la definición de la clase Tvector una función para contar cuantas veces aparece un determinado elemento
en el vector entre dos posiciones determinadas. Implementar dicha función.

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

Solución:

#include <f s t r e a m>


#include <i o s t r e a m>
using namespace s t d ;

template <typename T>


c l a s s TVector {
T∗ e l e m e n t o s ;
i nt numElementos ;
public :
TVector ( i nt num ) ;
T& operator [ ] ( i nt n ) ;
i nt co unt ( T elem , i nt desde , i nt h a s t a ) ;
˜ TVector ( ) ;
};

template <typename T>


TVector<T> : : TVector ( i nt num) {
e l e m e n t o s = new T[ num ] ;
numElementos = num ;
}

template <typename T>


TVector<T> : : ˜ TVector ( ) {
delete [ ] e l e m e n t o s ;
}

template <typename T>


T& TVector<T> : : operator [ ] ( i nt n ) {
return e l e m e n t o s [ n ] ;
}

template <typename T>


i nt TVector<T> : : co unt (T elem , i nt desde , i nt h a s t a ) {
i f ( desde < 0 ) desde = 0 ;
i f ( h a s t a > numElementos ) h a s t a = numElementos ;
i nt t i m e s =0;
for ( i nt n = desde ; n< h a s t a ; n++){
i f ( e l e m e n t o s [ n ] == elem ) {
t i m e s ++;
}
}
return t i m e s ;
}

Página 7 de 7

Potrebbero piacerti anche