Sunteți pe pagina 1din 6

Exámen de LP.

Junio 2004

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


(a) c l a s s ba se1 {
i nt b11 ;
protected :
i nt b12 ;
public :
void a lma cena r b1 ( i nt i , i nt j ) { b11=i ; b12=j ; }
};
c l a s s ba se2 {
i nt b21 ;
protected :
i nt b22 ;
public :
void a lma cena r b2 ( i nt i , i nt j ) { b21=i ; b22=j ; }
};
c l a s s d e r i v a d a : protected base1 , private ba se2 {
i nt d ;
public :
void a lma cena r ( i nt k ) {d=k ; }
void mo str a r ( ) { cout<<b11<<b12<<b21<<b22 ; }
};
main ( ) {
derivada d ;
d . a lma cena r b1 ( 1 , 2 ) ;
d . a lma cena r b2 ( 3 , 4 ) ;
d . a lma cena r ( 5 ) ;
d . mo str a r ( ) ;
}

Solución:

almacenarb1 se hereda como protected, luego no se puede usar desde main


almacenarb2 se hereda como private, luego no se puede usar desde main
b11 de base1 y b21 de base2 son private, luego derivada no puede acceder a ellos en mostrar()

(b) c l a s s r a c i o n a l
{ i nt numerador ;
i nt denominador ;
public :
r a c i o n a l ( i nt n , i nt d ) ;
i s t r e a m &operator <<(i s t r e a m &f , const r a c i o n a l &r ) ;
};
i s t r e a m &operator <<(i s t r e a m &f , const r a c i o n a l &r )
{
f <<numerador<<ends<<denominador ;
}

Solución:

operator<< se define para ostream, no para istream


el método no es de la clase racional, pues el argumento implicito es un ostream. Solo podemos
declararlo como friend, para que pueda acceder a los miembros privados
también faltarı́a definir el constructor que se ha declarado.
el operador ha de devolver la referencia al flujo que recibe, para poder encadenar las llamadas

Página 1 de 6
Exámen de LP. Junio 2004

c l a s s punto
{ i nt x ;
i nt y ;
public :
punto ( i nt x=0 , i nt y ) ;
r e g i s t e r void d i b u j a r x ( )
{ cout<<x ;
void d i b u j a r y ( )
{ cout<<y ; }
}
} p1 ;
i nt i=p1 . d i b u j a r x ( ) ;

Solución:

el constructor ha de tener valores por defecto contiguos hasta el último


un método no puede devolver un tipo register, y además es void, no devuelve nada.
dibujary() serı́a una función anidada. Se permite en C, pero no en C++
si asignamos a i el valor de dibujarx() entonces éste deberı́a declararse devolviendo int y dentro
deberı́a devolver algún valor entero.

(c) union
{
i nt ∗ e l 1 ;
float ∗ el2 ;
} u1 ;
i nt i ( 3 ) ;
u1 . e l 1=&i ;
i nt ∗q=&u1 . e l 1 ;
cout<<” Va lo r e n t e r o a l que apunta q e s : ”<<∗∗q ;
cout<<” Va lo r e n t e r o a l que apunta e l 1 e s : ”<<u1−>e l 1 ;

Solución:

si q es un puntero a int debemos asignarle u1.el1, que también lo és, no su dirección. Si queremos
asignarle la dirección de u1.el1, debe declararse como int **q, en ese caso la siguiente linea
estarı́a correcta.
u1 no es un puntero, luego para acceder a el1 usaremos u1.el1, y no u1->el1

2. (1 punto) Implementa un programa que contenga una función sustituir a la que se le pasa una cadena de
caracteres y un carácter, previamente leı́dos desde el teclado, y reemplace en dicha cadena todos los espacios
en blanco por el carácter indicado. Esta función debe devolver el número total de caracteres sustituidos. 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 ;
i nt s u s t i t u i r e s p a c i o s ( char ∗ cadena , char c ) {
char ∗ s = cadena ;
i nt n= 0 ;

Página 2 de 6
Exámen de LP. Junio 2004

while ( ∗ s ) {
i f ( ∗ s == ’ ’ ) {
∗s = c ;
n++;
}
++s ;
}
return n ;
}
i nt main ( ) {
char cad [ ] = ” cadena con a l g u n o s e s p a c i o s ” ;
i nt num = s u s t i t u i r e s p a c i o s ( cad , ’ ’ ) ;
co ut << e n d l << cad << ” Cambiados ” << num << ” e s p a c i o s . ” << e n d l ;
}

3. (2 puntos) Se desea informatizar la gestión de las cartas que trata una oficina de correos. Concretamente de cada
carta es necesario tratar la siguiente información:
dirección (nombre, ciudad y código postal) del remitente y del destinatario,
si la carta esta o no certificada;
si la carta es o no urgente;
y el tamaño de la carta (puede ser pequeño, mediano, grande, extragrande).
Para ello se debe realizar los siguientes apartados:
(a) Declara la estructura de datos necesaria para almacenar toda la información de una carta (se debe tener
como objetivo primordial el ahorro de espacio y la legibilidad de la estructura);

Solución:
enum Dimension { pequeno , mediano , grande , e x t r a g r a n d e } ;
struct D i r e c c i o n {
char nombre [ 3 0 ] ;
char ciuda d [ 2 0 ] ;
char c p o s t a l [ 6 ] ;
};
struct Carta {
Direccion remite ;
Direccion destino ;
bool c e r t i f i c a d a ;
bool u r g e n t e ;
unsigned i nt dimensio n : 2 ;
};

(b) Suponer que se dispone de un fichero llamado “bandeja”, donde esta almacenada la información correspon-
diente a todas las cartas que dicha oficina de correos trata. Escribe un programa que lea de ese fichero y
almacene en otro, sólo el destinatario de todas aquellas cartas que sean urgentes y cuyo tamaño sea grande
o extragrande.

Solución:
#include <i o s t r e a m>
#include <f s t r e a m>
using namespace s t d ;
void m e z c l a r f i c h e r o s ( ) {
i f s t r e a m ba ndeja ;

Página 3 de 6
Exámen de LP. Junio 2004

ofstream s a l i d a ;
ba ndeja . open ( ” ba ndeja ” , i o s : : i n | i o s : : b i n a r y ) ;
i f ( ! ba ndeja ) return ;
s a l i d a . open ( ” s a l i d a ” , i o s : : out | i o s : : b i n a r y ) ;
i f ( ! s a l i d a ) return ;

Carta c a r t a ;
while ( ( ba ndeja . r ea d ( ( char ∗ ) &c a r t a , s i z e o f ( Carta ) ) && ! ba ndeja . e o f ( ) ) ) {
i f ( ( c a r t a . u r g e n t e ) && ( ( c a r t a . dimensio n == g r a nde ) | |
( c a r t a . dimensio n == e x t r a g r a n d e ) ) ) {
s a l i d a . w r i t e ( ( char ∗ ) &c a r t a . d e s t i n o , s i z e o f ( D i r e c c i o n ) ) ;
}
}
ba ndeja . c l o s e ( ) ;
salida . close ();
}

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 numero determinado pero variable de puntos. Utiliza
reserva dinámica de memoria para almacenar los puntos que forman el polinomio. Implementa las funciones
necesarias (constructores, destructores, ...) y además en la clase polı́gono:
Implementar un constructor de copia
Sobrecargar el operador =
Sobrecargar el operador + para sumar a un entero i un polı́gono p (el resultado serı́a por ejemplo incrementar
en i las coordenadas de todos sus puntos)

Solución:

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


using namespace s t d ;
c l a s s Punto {
public :
Punto ( i nt x=0 , i nt y = 0 ): x ( x ) , y ( y ) {
}
i nt x , y ;
};
class Poligono {
public :
i nt numPuntos ;
Punto ∗ punto s ;

P o l i g o n o ( const P o l i g o n o & p ) {
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 ;
}
}
P o l i g o n o ( i nt n = 0 ): numPuntos ( n ) {
i f ( n>0){
punto s = new Punto [ numPuntos ] ;
}
}

Página 4 de 6
Exámen de LP. Junio 2004

P o l i g o n o & operator= ( P o l i g o n o &p ) {


i f ( punto s ) 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 ;
}
˜ Poligono (){
i f ( punto s )
delete [ ] punto s ;
}
fri end P o l i g o n o & operator +( i nt i , P o l i g o n o &p ) ;

};
P o l i g o n o & operator +( i nt i , P o l i g o n o &p ) {
for ( i nt n=0; n< p . numPuntos ; n++){
p . punto s [ n ] . x+=i ;
p . punto s [ n ] . y+=i ;
}
return p ;
}

5. (2 puntos) Se pretende escribir un programa para calcular la nota media de las calificaciones obtenidas en el
examen de la materia LP. Suponemos que hay dos tipos de alumnos que se califican de diferente modo: (i) alumno
del plan viejo, que tiene dos notas, notaC y notaCPP, y su calificación es la nota media de ambas (ii) alumno
del plan nuevo, que tiene una única nota y su calificación es dicha nota.
(a) Definir la clase base alumno, con un constructor parametrizado que reciba el DNI del alumno.

Solución:
#include <i o s t r e a m>
using namespace s t d ;
c l a s s alumno {
public :
alumno ( const char ∗ d n i ) {
s t r c p y ( this −>dni , d n i ) ;
}
virtual float c a l c u l a r n o t a ()=0;
char d n i [ 1 0 ] ;
};

(b) Definir a partir de la clase alumno la clase alumno planviejo, con un constructor que almacene las dos notas
del alumno y un función calcular nota() que devuelva la calificación del alumno.

Solución:
c l a s s a l u m n o p l a n v i e j o : public alumno {
public :
a l u m n o p l a n v i e j o ( const char ∗ dni , f l o a t notaC , f l o a t notaCPP )
: alumno ( d n i ) , notaC ( notaC ) , notaCPP( notaCPP ){
}
float ca lcula r no ta (){

Página 5 de 6
Exámen de LP. Junio 2004

return ( notaC+notaCPP ) / 2 ;
}
f l o a t notaC , notaCPP ;

};

(c) Definir a partir de la clase alumno la clase alumno plannuevo con un constructor que almacene la nota del
alumno y una función calcular nota() que devuelva dicha calificación.

Solución:
c l a s s a lumno pla nnuevo : public alumno {
public :
a lumno pla nnuevo ( const char ∗ dni , f l o a t no ta )
: alumno ( d n i ) , no ta ( no ta ) {
}
float ca lcula r no ta (){
return no ta ;
}
f l o a t no ta ;

};

(d) Implementar una función calcularnotamedia() que reciba como argumento un vector de punteros a alumnos,
apuntando a cada uno de los alumnos, del plan viejo o del plan nuevo, y el numero total de alumnos, y
calcule utilizando ligadura dinámica la nota media obtenida por todos los alumnos.

Solución:
f l o a t c a l c u l a r n o t a m e d i a ( alumno ∗ alumnos [ ] , i nt c a n t i d a d ) {
float t o t a l = 0 ;
for ( i nt n=0; n< c a n t i d a d ; n++){
t o t a l += alumnos [ n]−> c a l c u l a r n o t a ( ) ;
}
return t o t a l / c a n t i d a d ;
}

(e) Escribe un programa de ejemplo

Solución:
i nt main ( ) {
alumno ∗ a u l a [ 3 ] ;
a u l a [ 0 ] = new a l u m n o p l a n v i e j o ( ” 34000001A” , 9 . 0 , 1 0 . 0 ) ;
a u l a [ 1 ] = new a lumno pla nnuevo ( ” 44433221H” , 1 . 0 ) ;
a u l a [ 2 ] = new a l u m n o p l a n v i e j o ( ” 34000002A” , 9 . 0 , 1 0 . 0 ) ;
co ut << ” no ta media : ” << c a l c u l a r n o t a m e d i a ( a ula , 3)<< e n d l ;
cin . get ( ) ;
}

Página 6 de 6

S-ar putea să vă placă și