Anda di halaman 1dari 6

Ex´amen de LP. Junio 2004

Ex´amen de LP. Junio 2004

1. (2 puntos) Detecta los errores de los siguientes trozos de c´odigo:

(a) c l a s s int ba se1 { b11 ; protected : int
(a)
c
l a s s
int
ba se1 {
b11 ;
protected :
int b12 ;
public :
void almacena rb1
(
int
i
,
int
j
) { b11=i
;
b12=j ; }
}
;
c
l a s s
int
ba se2 {
b21 ;
protected :
int b22 ;
public :
void almacena rb2
(
int
i
,
int
j
) { b21=i
;
b22=j ; }
}
;
c
l a s s
int
d e ri v a d a : protected base1
d ;
,
pr ivate ba se2 {
public :
void
almacena r (
int k ) { d=k ; }
void
mo s tr a r ( ) { cout <<b11 <<b12 <<b21 <<b22 ; }
}
;
main
( )
{
d
e ri v a d a d
;
d
. almacena rb1 ( 1 , 2 ) ;
d
. almacena rb2 ( 3 , 4 ) ;
d
. almacena r ( 5 ) ;
d
.
mo s tr a r (
)
;
}
Soluci´on:
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
{ int
int
numerador ;
denominador ;
public :
r
a c i o n a l ( int n , int d ) ;
i s t r e am &operator <<(i s t r e am &f , const
r a c i o n a l &r ) ;

} ;

i s t r e am &operator <<(i s t r e am &f ,

{

const r a c i o n a l &r )

f <<numerador <<ends <<denominador ;

}

Soluci´on:

operator<< se define para ostream , no para istream

el m´etodo no es de la clase racional , pues el argumento implicito es un ostream . Solo podemos declararlo como friend, para que pueda acceder a los miembro s privados

tambi´en 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´agina 1 de 6

Ex´amen de LP. Junio 2004

Ex´amen de LP. Junio 2004

c l a s s

punto

{ int

x ;

int

y ;

public :

punto ( int x=0, int y ) ; reg i s t er void di b u j a r x ( )

{ cout <<x ; void di b u j a r y

( )

{ cout <<y ; } } } p1 ; int i=p1 . di b u
{ cout <<y
;
}
}
} p1 ;
int
i=p1 . di b u j a r x
(
)
;
Soluci´on:
el constructor ha de tener valores por defecto contiguos has ta el ultimo´
un m´etodo no puede devolver un tipo register, y adem´as es vo id, no devuelve nada.
dibujary() ser´ıa una funci´on anidada. Se permite en C, pero no en C++
si asignamos a i el valor de dibujarx() entonces ´este deber´ıa declararse devolviendo int y dentro
deber´ıa devolver alg´un valor entero.
(c) union
{
int
e l 1 ;
f l o a t ∗ e l 2 ;
} u1 ;
int
i
( 3 ) ;
u1 . e l 1=&i
int ∗ q=&u1
;
.
cout <<” Valo r
cout <<” Valo r
e l 1 ;
e n t e r o
e n t e r o
a
l
que
apunta q e s :
” <<∗∗q ;
a l
que
apunta e l 1 e s : ”<<u1 −> e l 1
;
Soluci´on:
si q es un puntero a int debemos asignarle u1.el1, que tambi´en lo ´es, no su direcci´on. Si queremos
asignarle la direcci´on 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´o n sustituir a la que se le pasa una cadena de caracteres y un car´acter, previamente le´ıdos desde el tec lado, y reemplace en dicha cadena todos los espacios en blanco por el car´acter indicado. Esta funci´on debe devo lver el n´umero 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˜no m´aximo de la cadena de caracteres es de 79, y que debe ser tratada como un vector de caracteres.

Soluci´on: #include < i o s t r e am > using namespace s t
Soluci´on:
#include < i o s t r e am >
using namespace s t d ;
int s u s t i t u i r e s p a c i o s ( char ∗ cadena , char c ) {
char ∗ s = cadena ;
int n= 0 ;

P´agina 2 de 6

Ex´amen de LP. Junio 2004

Ex´amen de LP. Junio 2004
while ( ∗ s ) { i f ( ∗ s == ’ = ’
while ( ∗ s ) {
i f ( ∗ s == ’
=
) {
∗ s
c ;
n++;
}
++s ;
}
return
n ;
}
int main ( )
char cad [
{
] = ” cadena con
al g u n o s e s p a c i o s ” ;
int num = s u s t i t u i r e s p a c i o s ( cad , ’ ’ ) ;
cout
<< endl << cad << ”Cambiados ” << num << ” e s p a c i o s . ” << endl ;
}
mediano , grande , e x t r a g r a n d e
mediano , grande , e x t r a g r a n d e } ;
[ 2 0 ] ;
6 ]
;

3. (2 puntos) Se desea informatizar la gesti´on de las cartas que trata una oficina de correos. Concretamente de cada carta es necesario tratar la siguiente informaci´on:

direcci´on (nombre, ciudad y c´odigo postal) del remitente y del destinatario,cada carta es necesario tratar la siguiente informaci´on: la carta esta o no certificada; si la

la carta esta o no certificada;ciudad y c´odigo postal) del remitente y del destinatario, si la carta es o no urgente;

si

la carta es o no urgente;y del destinatario, la carta esta o no certificada; si si el tama˜no de la carta

si

el tama˜no de la carta (puede ser peque˜no, mediano, grande, extragrande).esta o no certificada; si la carta es o no urgente; si y Para ello se

y

Para ello se debe realizar los siguientes apartados:

(a)

Declara la estructura de datos necesaria para almacenar toda la informaci´on de una carta (se debe tener como objetivo primordial el ahorro de espacio y la legibilidad de la estructura);

Soluci´on: enum Dimension { pequeno , struct Di r e c ci o n {
Soluci´on:
enum Dimension { pequeno ,
struct Di r e c ci o n {
char
nombre [ 3 0 ] ;
char
ciudad
char
c p o s t a l [
} ;
struct Carta {
Di
r e c ci o n
r emi t e ;
Di
r e c ci o n
d e s ti n o ;
bool c e r t i f i c a d a ;
bool
u r g e n t e ;
unsigned
int dimension : 2 ;
} ;

(b)

Suponer que se dispone de un fichero llamado “bandeja”, donde esta almacenada la informaci´on correspon- diente a todas las cartas que dicha oficina de correos trata. E scribe un programa que lea de ese fichero y

almacene en otro, s´olo el destinatario de todas aquellas ca rtas que sean urgentes y cuyo tama˜no sea grande

o

extragrande.

 

Soluci´on:

#include

< i o s t r e am > < f s t r e am >

#include

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 bande ja ;

P´agina 3 de 6

Ex´amen de LP. Junio 2004

Ex´amen de LP. Junio 2004
o f s t r e am s a l i d a ; bande
o f s t r e am s a l i d a ;
bande ja . open
( ” bande ja ” , i o s : : i n
|
i
o s : : bin a r y
)
;
i
f ( ! bande ja )
return ;
s
a l i d a .
open ( ” s a l i d a ” , i o s :
:
out |
i
o
s
:
:
bin a r y
)
;
i
f ( ! s a l i d a
)
return ;
Carta
;
( ( bande ja . read ( (
c a r t a
while
i f ( (
char ∗ ) &c a r t a
(
Carta ) ) && !
c a r t a .
u r g e n t e ) && (
(
c
a
r
t
a .
, s i z e o f
dimension
== g r ande
)
|
bande ja . e o f ( ) ) ) {
|
( c a r t a .
dimension == e x t r a g r a n d e ) ) ) {
s
a l i d a .
w ri t e
( ( char ∗ )
&c a r t a
. d e s ti n o , s i z e o f ( Di r e c ci o n ) ) ;
}
}
bande ja
. c l o s e
s
a l i d a .
c l o s e
}
( ) ; ( ) ; ) y adem´as e n la clase pol´ıgono: )
( )
;
( )
;
) y adem´as e n la clase pol´ıgono:
)
,
y
( y ) {

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´a formado por un numero determinado pero variable de puntos. Utiliza reserva din´amica de memoria para almacenar los puntos que forman el polinomio. Implementa las funciones

necesarias (constructores, destructores,

Implementar un constructor de copialas funciones necesarias (constructores, destructores, Sobrecargar el operador = Sobrecargar el operador + para

Sobrecargar el operador =destructores, Implementar un constructor de copia Sobrecargar el operador + para sumar a un entero i

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)un constructor de copia Sobrecargar el operador = Soluci´on: #include < i o s t r

Soluci´on: #include < i o s t r e am > using namespace s t
Soluci´on:
#include < i o s t r e am >
using
namespace s t d ;
c l a s s
Punto {
public :
Punto
( int x=0, int y= 0 ): x ( x
}
int
x ,
y ;
} ;
c l a s s
P oli g o n o {
public :
int numPuntos ;
Punto ∗
punto s ;
P
oli g o n o ( const
P oli g o n o & p ) {
numPuntos = p . numPuntos ;
punto s = new Punto [ numPuntos ] ;
for ( int n=0; n< numPuntos ; n++){
punto s [ n
punto s [ n
]
.
x
=
p .
]
.
y
= p .
punto s [ n ] . x ;
punto s [ n ] . y ;
}
}
P
oli g o n o ( int
n= 0 ):numPuntos ( n ) {
i
f
( n > 0) {
punto s = new Punto [ numPuntos
]
;
}
}

P´agina 4 de 6

Ex´amen de LP. Junio 2004

Ex´amen de LP. Junio 2004
P oli g o n o & operator= ( P oli g o n o
P oli g o n o &
operator= ( P oli g o n o &p ) {
i f ( punto s
) de lete [ ] punto s ;
numPuntos = p . numPuntos ;
punto s = new Punto [ numPuntos ] ;
for ( int n=0; n<
numPuntos ; n++){
punto s [ n
]
.
x
=
p .
punto s [
n
]
.
x ;
punto s
[ n
] . y = p . punto s [ n ] . y ;
}
return
th i s ;
}
˜
P oli g o n o ( ) {
i
f ( punto s )
de lete [ ] punto s
;
}
fr iend P oli g o n o & operator +( int i , P oli g o n o &p ) ;
} ;
P oli g o n o & operator
+( int i , P oli g o n o &p ) {
for ( int n=0;
n< p . numPuntos ; n++){
p
. punto s [ n ] . x+=i
;
p
. punto s [ n ] . y+=i
;
}
return p ;
}
] . x+=i ; p . punto s [ n ] . y+=i ; } return

Definir la clase base alumno, con un constructor parametr izado que reciba el DNI del alumno.

Soluci´on: #include < i o s t r e am > using namespace s t
Soluci´on:
#include < i o s t r e am >
using
namespace s t d ;
c l a s s
alumno {
public :
alumno ( const char
s t r c p y
( th is −>dni
∗ dni ) {
, dni ) ;
}
v irtua l f l o a t c a l c u l a r n o t a ( )= 0;
char dni
[ 1
0 ] ;
} ;

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 alumno s que se califican de diferente modo: (i) alumno del plan viejo, que tiene dos notas, notaC y notaCPP, y su calificaci´on es la nota media de ambas (ii) alumno del plan nuevo, que tiene una unica´ nota y su calificaci´on es dicha nota.

(a)

(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´on calcular nota() que devuelva la calificaci´on del alumno.

Soluci´on: c l a s s al um n o pl a n vi e
Soluci´on:
c l a s s al um n o pl a n vi e j o : public
public :
alumno {
al um n o pl a n vi e j o
( const char ∗ dni , f l o a t notaC
, f l o a t notaCPP )
: alumno ( dni ) , notaC ( notaC ) , notaCPP( notaCPP ) {
}
f l o a t c a l c u l a r n o t a ( ) {

P´agina 5 de 6

Ex´amen de LP. Junio 2004

Ex´amen de LP. Junio 2004

return ( notaC+notaCPP ) / 2 ;

}

f l o a t notaC , notaCPP ;

} ;

(c)

(d)

(e)

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

Soluci´on: c l a s s alumno plannuevo : public public : alumno plannuevo (
Soluci´on:
c l a s s alumno plannuevo : public
public :
alumno plannuevo (
:
alumno (
}
f l o a t c a l c u l a r n o t a ( ) {
return no ta ;
}
f l o a t no ta ;
} ;
alumno { const char ∗ dni , f l o a t no ta )
alumno {
const char ∗ dni
, f l o a t no ta )
dni ) ,
no ta ( no ta ) {
/ c a n tid a d ;

Implementar una funci´on 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´amica la nota media obtenida por todos los alumnos.

Soluci´on: f l o a t c al c ul a r n o t
Soluci´on:
f l o a t
c al c ul a r n o t am e di a ( alumno ∗ alumnos [ ] , int c a n tid a d ) {
f l o a t t o t a l = 0 ;
for
(
int
n=0; n< c a n tid 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
}

Escribe un programa de ejemplo

Soluci´on: int main ( ) { alumno ∗ a ul a [ 3 ] ;
Soluci´on:
int main
( ) {
alumno ∗
a ul a [ 3 ] ;
a ul a [
a ul a [
a ul a [
0 ] =
new
1 ]
=
new
2 ] = new
al um n o pl a n vi e j o ( ” 34000001A” , 9 . 0 , 1 0 . 0 ) ;
alumno plannuevo ( ” 44433221H” , 1 . 0 ) ;
al um n o pl a n vi e j o ( ” 34000002A” , 9 . 0 , 1 0 . 0 ) ;
cout << ” no ta media : ” << c al c ul a r n o t am e di a ( aula , 3) << endl ;
ci n . g e t (
)
;
}

P´agina 6 de 6