Examen Teorico IA sep00

Anuncio
Escuela Politécnica Superior
Ingeniería Industrial
EXAMEN DE INFORMÁTICA APLICADA
15 de septiembre de 2000
Duración: 2 horas
1. El siguiente fragmento de código se compila correctamente, pero tiene errores que pueden provocar
resultados inesperados durante la ejecución. Indicar dónde están estos errores y explicar brevemente
por qué se pueden producir.
(2,5 puntos)
void main(void)
{
int i,j,v[50],*p;
char *s;
float f;
s = “Una cadena”;
p = v;
p++;
*p = f;
p =
(int)malloc(50*sizeof(int));
p = &i;
*p = 20;
free(p);
j=10;
for (i=0;i<=10;i++)
{
v[i] = 0;
v[j] = 5;
j-=2;
}
}
2. Indicar la salida del siguiente programa en C++
#include <iostream.h>
#include <string.h>
const int Max = 60;
(2,5 puntos)
float Elemento::Precio(void)
{
return(precio);
}
class Elemento
{
private:
float precio;
char nombre[Max];
public:
Elemento(float,char *);
float Precio(void);
float operator+(Elemento& e);
float operator+(float f);
};
float Elemento::operator+(Elemento &e)
{
cout << "Elemento::operator+(Elemento&)\n";
return( Precio() + e.Precio() );
}
Elemento::Elemento(float p, char *n)
{
precio = p;
strcpy(nombre,n);
cout <<
"Elemento::Elemento(float,char*)\n";
}
void main(void)
{
Elemento primerPlato(1000,"arroz");
Elemento segundoPlato(700,"carne");
float complemento=300;
float Elemento::operator+(float f)
{
cout << "Elemento::operator+(float)\n";
return( Precio() + f );
}
cout << primerPlato + segundoPlato << endl;
cout << primerPlato + complemento << endl;
}
Escuela Politécnica Superior
Ingeniería Industrial
3. Responder brevemente a las siguientes cuestiones:
(2 puntos)
(a) ¿Se modifica el valor de la variable a en el siguiente fragmento de código en C++ después
de la llamada a la función? ¿Por qué?
void f(int &c)
{
c *= 10;
}
void main(void)
{
int a=2;
f(a);
}
(b) ¿Son correctas las siguientes sentencias en C++? Razonar brevemente la respuesta.
float *p;
*p = new float[20];
(c) Explicar brevemente la diferencia que existe entre las variables ps y s en el código siguiente
en C.
int *ps;
ps = (int)malloc(50*sizeof(int));
int s[50];
(d) Supongamos que primero es un puntero que apunta al primer nodo de una lista enlazada.
¿Se libera la memoria de toda la lista con la sentencia delete primero? ¿Y si la lista es
doblemente enlazada? ¿Y si la lista se representa con un vector estático?
4. En el siguiente programa se define una clase base y una clase derivada, C1 y C2. En la función main
se declaran dos objetos v, w, de tal forma que a continuación se asigna w a v, v = w.
Se pide:
(3 puntos)
(a) ¿Qué valores tienen v.a, v.b, w.a, w.b después de la asignación v = w?
(b) ¿Se han asignado todos los valores de los datos de w a los datos de v? En caso afirmativo,
explicar brevemente la respuesta. En caso negativo, modificar el programa para que la
asignación se realice correctamente, utilizando herencia.
class C1
{
protected:
int a;
public:
C1(int i = 0);
C1& operator=(C1 &aux);
};
class C2 : public C1
{
private:
int b;
public:
C2(int i = 0);
C2& operator=(C2 &aux);
};
C1::C1(int i)
{
a = i;
}
C1& C1::operator=(C1 &aux)
{
a = aux.a;
return (*this);
}
C2::C2(int i) : C1(i)
{
b = i;
}
C2& C2::operator=(C2 &aux)
{
b = aux.b;
return (*this);
}
void main(void)
{
C2 v, w(5);
v = w;
}
Descargar