Sunteți pe pagina 1din 28

qwertyuiopasdfghjklzxcvbnmqwerty

uiopasdfghjklzxcvbnmqwertyuiopasd
fghjklzxcvbnmqwertyuiopasdfghjklzx
Preguntas examen de la asignatura
"Fundamentos de programacin"
cvbnmqwertyuiopasdfghjklzxcvbnmq
UNED
wertyuiopasdfghjklzxcvbnmqwertyui
(Grado en Ingeniera Informtica Grado en
Ingeniera de las Tecnologas de la
Informacin).
opasdfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmqwertyuiopasdfghjklzxc
vbnmqwertyuiopasdfghjklzxcvbnmq
wertyuiopasdfghjklzxcvbnmqwertyui
opasdfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmqwertyuiopasdfghjklzxc
vbnmqwertyuiopasdfghjklzxcvbnmq
wertyuiopasdfghjklzxcvbnmqwertyui
opasdfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmrtyuiopasdfghjklzxcvbn
mqwertyuiopasdfghjklzxcvbnmqwert
yuiopasdfghjklzxcvbnmqwertyuiopas
07/02/2015

Ana Mara Vzquez

Del foro: http://www.aprenderaprogramar.com/foros/index.php?topic=401.0


PREGUNTA: En el lenguaje C, la sentencia catch:
a) Agrupa las sentencias para el tratamiento de la excepcin
b) Agrupa las sentencias para la deteccin de la excepcin
c) Devuelve el resultado de la excepcin
d) Devuelve el resultado de la excepcin y termina el programa

RESPUESTA: La correcta es la a). Dentro de una sentencia catch escribimos todas las instrucciones que deben ejecutarse cuando se
captura una excepcin, es decir, nos sirve para agrupar las sentencias para el tratamiento de la excepcin.
PREGUNTA: Qu imprime la siguiente sentencia escrita en C/C++?:
printf("Descuento: %5.2f%c\n" ,12.5,'%');
a) Descuento: 12.50
b) Descuento: 12.5%
c) Descuento: 12.50%
d) Descuento: 12.5
RESPUESTA: La correcta es la c). Tener en cuenta que la expresin %5.2f y %c\n no son interpretadas como textos a mostrar debido
a que estn precedidas del carcter especial %. Luego lo que aparece detrs de esta expresin %5.2f tiene el siguiente significado: 5
representa el nmero de espacios que ocupar la salida por pantalla, .2 representa el nmero de decimales con que se mostrar el
valor numrico; f representa "fixed point" o tipo de valor que se va a mostrar es "nmero real";
Lo que aparece detrs de %c\n tiene el significado: c, se va a insertar un carcter (que ser el smbolo %) y \n salto de lnea y
retorno de carro.
PREGUNTA: Si a = true y b = false, la expresin:
!(!(a || b) && !(a))
Toma el mismo resultado que:
a) a && b
b) !(a || !b)
c) b ll (a&&b)
d) !(!a || b) || !b
RESPUESTA: la respuesta correcta es la d). Hay que tener en cuenta que el orden de precedencia de los operadores es:
1)
2)
3)
4)
5)
6)
7)

Operadores unarios como ! y Operadores multiplicativos *, /, %


Operadores aditivos: +, Comparacin matemtica: >, >=, <, <=
Comparacin de igualdad: ==, !=
Conjuncin &&
Disyuncin ||

Y tambin que dentro de un mismo nivel, la ejecucin es de izquierda a derecha.


Si a= true y b=false y evaluamos la expresin inicial tenemos:
! ( !( true || false) && !(true))
!(true) devuelve false
x && false devuelve false, luego la expresin interior !(a || b) && !(a) devuelve false. Al tener toda la expresin negada, el resultado
final es true.
La opcin a) plantea true && false, que devuelve false, con lo cual no puede ser solucin.
La opcin b) plantea !(true || !false), lo interior devuelve true y el resultado global es false con lo cual no puede ser solucin.
La opcin c) plantea false || ... que devolver false.

Conclusin: la opcin correcta es la d), que nos permite obtener true (aparte del dolor de cabeza)
PREGUNTA:La sentencia del lenguaje C/C++:
scanf("mes%2d", &mes);
a) Se ejecuta correctamente si se lee el dato: mes3
b) Siempre se ejecuta correctamente
c) Se ejecuta correctamente si se lee el dato: 03
d) No se ejecuta correctamente si se lee el dato: mes1234
RESPUESTA: La respuesta correcta es la a). El procedimiento scanf sirve para pedir datos al usuario y es accesible gracias al mdulo
de librera stdio. El dato solicitado se almacena en la variable indicada precedida del smbolo &, en este caso la variable es mes y el
tipo de la variable no lo sabemos a priori. El trmino %2d indica que se espera un tipo entero (decimal es entero) con nmero de
caracteres ledos o "tamao del dato" de 2 caracteres. En este caso "cuidado": al indicar dentro del scanf mes%2d significa que la
entrada de usuario esperada es mesXX donde XX representa hasta dos dgitos. scanf se suele utilizar sin texto (el texto se suele
poner en un printf anterior) por lo que es fcil confundirse con esta pregunta.
En la opcin a) se recibe mes3, es decir, mes y un dgito, lo que coincide con lo esperado.
La opcin b) no es cierta porque si lo introducido por el usuario no corresponde a lo esperado la ejecucin no es correcta.
La opcin c) no es correcta porque no se recibe lo esperado.
La opcin d) no es correcta porque la ejecucin s sera correcta, truncndose los dos ltimos caracteres.
Pregunta nada sencilla de responder, y adems con cierta ambiguedad (porque la opcin d) sera discutible). Paciencia.
Se pueden hacer pruebas con este programita:
#include <stdio.h>
#include <stdlib.h>
int main(){
int mes;
printf("Introduzca mes seguido de uno o dos enteros:\n");
scanf("mes%2d", &mes);
printf("El valor despus de mes es %d", mes);
return 0;
}

PREGUNTA: En el lenguaje C/C++, los registros con variantes necesitan:


a) Slo la definicin de un tipo struct
b) Slo la definicin de un tipo union
c) La definicin de al menos un tipo struct y un tipo unin
d) La definicin de varios tipos struct o bien de un nico tipo union

RESPUESTA: la opcin correcta es la c).


Hay ocasiones en que nos puede interesar que una variable funcione segn las circunstancias como si fuese de un tipo u otro. En
estos casos hacemos una declaracin typedef union Nombre donde typedef union funciona como palabra clave. Ejemplo:
typedef union Numerico {
int entero;
float real;
};
Las llaves se cierran con un ;. Una vez definido el tipo podemos usarlo as por ejemplo:
Numerico numeroaprocesar;
numeroaprocesar.entero = 243;
printf ("El valor de numeroaprocesar es %d", numeroaprocesar);
Solo puede haber en uso en un momento dado una de las alternativas del union.
Un tipo union se puede introducir dentro de un tipo struct y a esto se le denomina "registro con variantes". Por tanto para definir un
registro con variantes necesitamos un tipo union y un tipo struct al menos, como indica la opcin c).
PREGUNTA: En el lenguaje C/C++, un argumento de tipo vector abierto pasado por valor se especifica:
a) const Tipo v[]
b) Tipo v[]
c) const Tipo v[n]
d) Tipo v[n]
RESPUESTA: la opcin correcta es la a). En C/C++ no es posible declarar vectores abiertos (sin un nmero de elementos
predefinido), pero s es posible incluirlos como argumentos de subprogramas siempre que al mismo tiempo se pase como argumento
al subprograma un parmetro que represente el nmero de elementos de que consta el vector que se pasa. Las formas de hacer esto
son (ponemos ejemplos):
TratarVector (float v[], int n) ... el vector se pasa por referencia
TratarVector (const float v[], int n) ... el vector se pasa por valor
Las cadenas de texto (vectores de caracteres) son un caso especial que no se atienen exactamente a lo expuesto.
PREGUNTA: Cul de las siguientes funciones NO puede llamarse desde otro fichero de implementacin en C/C++?
a) void mifuncion() { ... }
b) static void mifuncion() { ... }
c) extem void mifuncion() { ... }
d) const void mifuncion() { ... }

RESPUESTA: La opcin correcta es la b). Llamamos mdulo a un fragmento de un programa desarrollado de forma independiente.
Para un programa podemos definir:
a) Un mdulo de especificacin (interfaz) que dice qu se hace (en C/C++, el fichero .h), es decir, define abstracciones.
b) Un mdulo de realizacin (implementacin) que define cmo se hace (en C/C++ fichero .cpp), donde se desarrollan las
abstracciones declaradas.
La palabra clave static dentro de un mdulo restringe la visibilidad de una variable o funcin al fichero fuente del mdulo, de modo
que esas variables o funciones no pueden ser llamadas desde fuera.

PREGUNTA: El valor que determina la seleccin en la sentencia switch en C/C++ no puede ser de tipo:
a) int
b) float
c) Enumerado
d) char
RESPUESTA: la opcin correcta es la b). switch puede usarse con valores enteros (int) o que sean asimilables a enteros, como son los
enumerados y los char. En cambio, los float son reales, continuos y no discretos, no asimilables a enteros.
PREGUNTA:
Supongamos el fragmento de cdigo en C/C++:
int a;
........ ........
void Func_1(int & b) {
a= 3;
b = a*b;
}
..........
a=2;
Func_1(a);
Despus de la ejecucin de este fragmento:
a) La variable a vale 3
b) La variable a vale 2
c) La variable a vale 6
d) La variable a vale 9
RESPUESTA: La opcin correcta es la d). Un poco liosa la pregunta, vamos a verla con calma.
Lo primero a tener en cuenta es que la declaracin de la funcin como void Func_1(int& b) supone que el parmetro b se pasa por
referencia (siendo conocido y modificable dentro de la funcin, cosa que no ocurrira si lo pasramos por valor).
Recorramos ahora el cdigo. Se declara la variable entera a (queda con valor 0). Se define la funcin. Se hace la valor a igual a 2 y
se invoca la funcin pasndole por referencia la variable a, con valor inicial 2.
En la funcin se modifica el valor de a y se establece en 3, y se calcula b como a*b = 3*3 = 9, pero b es un parmetro que apunta
por referencia a la variable a, con lo cual al modificarse el parmetro dentro de la funcin se est modificando la variable que se ha
pasado por referencia. En consecuencia, al concluir la ejecucin la variable a queda con valor 9.
Pregunta enredada, la clave est en ver que a la funcin le entra la variable a pasada por referencia, al ocurrir esto a y b dentro de la
funcin apuntan al mismo espacio de memoria, primero se establece a (y b) con valor 3 y luego se establece b (y a) con valor 9. La
variable b desaparece una vez concluye la ejecucin de la funcin, quedando la variable a con valor 9.
PREGUNTA: En el lenguaje C/C++, la sentencia continue:
a) Finaliza la iteracin en curso y el bucle
b) No se puede utilizar dentro de un bucle for
c) Finaliza la iteracin en curso de un bucle
d) No se puede utilizar dentro de una sentencia condicional

RESPUESTA: La opcin correcta es la c).

PREGUNTA: Dado el siguiente bucle for en C/C++:


for (int i=-5; i>=-7; i--){
printf (Hola);
}
El nmero de veces que aparecer la palabra hola ser:
a)

b)

c)

d)

Existe un error de tipos

RESPUESTA: la opcin correcta es la b. El bucle avanza de -5 a -7 e imprime hola para los casos -5, -6 y -7, es decir, tres veces.
Cuando la variable de control toma valor -8 no se cumple la condicin y no se imprime hola.
PREGUNTA: En C/C++ el smbolo &:
a)

Es un smbolo que se utiliza para pasar argumentos por referencia.

b)

Es un identificador predefinido que se utiliza para declarar variables.

c)

Es un smbolo que se utiliza para pasar argumentos por valor.

d)

Es un identificador predefinido que se utiliza para pasar argumentos por valor.

RESPUESTA: La opcin correcta es la a). Se usa para pasar argumentos a procedimientos o funciones por referencia. En caso de no
incluirse & los argumentos se pasaran por valor.

PREGUNTA: En C/C++ para convertir el carcter 5 en el nmero entero correspondiente usara la sentencia:
a) int('5') int ('0')
b)

int ( int(5))

c)

int ('5')

d)

char(5)

RESPUESTA: la opcin correcta es la c. Esto es una cuestin de mera sintaxis, un caracter en C/C++ se escribe entre comillas
simples. Cada carcter tiene un nmero entero asociado, y esta es una forma para conocerlo. No es lo mismo el carcter '5' que el
valor numrico 5.
PREGUNTA: En C/C++ qu operacin de las siguientes es correcta?:
a)

25 * 3,5

b)

33.7 % 5.0

c)

33 / 5.3

d)

10,5 % -15,4E2

RESPUESTA: La opcin correcta es la c). La a) la desechamos por no usar separador decimal el punto. La b) y d) usan el operador
mdulo o mod, que devuelve el resto de una divisin entre nmeros enteros. Al intervenir en ambos casos nmeros no enteros, no
seran correctas. Nos queda como opcin viable la c).
PREGUNTA: En C/C++ el modelo de programacin que se sigue es:
a) El modelo de programacin funcional
b) El modelo de programacin imperativa
c) El modelo de programacin de flujo de datos
d) El modelo de programacin lgica
RESPUESTA: la opcin correcta es la b). La programacin funcional (p.ej. lenguaje Haskell), de flujo de datos (p.ej. labView) y lgica
(p.ej. Prolog) corresponden a otros paradigmas y lenguajes.

PREGUNTA: Supongamos el fragmento de cdigo en C/C++:


void CuaCubo (int &x, int &x2, int &x3){
x2 = x*x;
x3 = x*x*x;}
B = 1; A = 4; CuaCubo (A, A, B);

Despus de la ejecucin de este fragmento:


a)

A vale 16 y B vale 64

b)

A vale 16 y B vale 4096

c)

A vale 4 y B vale 1

d)

A vale 16 y B vale 1

RESPUESTA: la opcin correcta es la b). Recorramos el cdigo. Las variables x, x2 y x3 se pasan por referencia al procedimiento ya
que estn precedidas del smbolo &. La llamada al procedimiento se realiza con A=4, B=1 e invocacin CuaCubo (A, A, B) lo cual
supone que x y x2 referencian a la misma posicin de memoria. En la primera lnea x2, que en nuestra invocacin es A, pasa a valer
x*x, que en nuestra invocacin es A*A, resultando x2 = 4*4 = 16, y A=16. En la segunda lnea x3 = A*A*A = 16*16*16 = 4096 y
B= 4096. Conclusin: despus de la ejecucin del fragmento A vale 16 y B vale 4096. Esta pregunta no puede decirse que sea
complicada. Lo nico que hay que tener claro es el concepto de paso por valor y paso por referencia de variables y sus diferencias.
PREGUNTA: La ejecucin de un programa mediante interpretacin cumple que...
a)

Es ms lenta que mediante compilacin y necesita al menos dos etapas de procesado

b)

Es ms rpida que mediante compilacin y necesita al menos dos etapas de procesado

c)

Es ms lenta que mediante compilacin y necesita slo una etapa de procesado

d)

Es ms rpida que mediante compilacin y necesita slo una etapa de procesado

RESPUESTA: La opcin correcta es la c). El intrprete ha de realizar la transformacin en cdigo mquina y la ejecucin, lo que lo
hace ms lento que disponer del cdigo mquina ya compilado y proceder a su ejecucin. C/C++ son lenguajes que usan
compilacin.
PREGUNTA:

La reutilizacin se consigue con el desarrollo de programas:

a)

Por refinamiento usando abstracciones

b)

Solo ascendente

c)

Solo descendente

d)

Solo ascendente o solo descendente

RESPUESTA: La opcin correcta es la a). Las opciones b), c) y d) podramos decir que no son una respuesta coherente. De todas
formas esta pregunta ejem... ejem..., no tiene digamos que una redaccin muy coherente en s. Lo que s es verdad es que el uso de
abstracciones favorece la reutilizacin.

PREGUNTA: Los argumentos de tipo vector abierto:


a)

Solo pueden pasarse por referencia

b)

Pueden pasarse por valor y por referencia

c)

Solo pueden pasarse por valor

d)

Solo pueden utilizarse en funciones

RESPUESTA: La opcin correcta es la b). En C/C++ los argumentos que se pasan a procedimientos o funciones en general pasan por
valor. Los vectores son una excepcin y como argumentos pasan por defecto por referencia aunque no se indique explcitamente.
Para pasar vectores por valor debe usarse la palabra clave const antecediendo al tipo. Por ejemplo: void OperarVector (const
TipoVector v) { ... }
En C/C++ no es posible declarar vectores abiertos (con un nmero de elementos indefinidos) pero s es posible incluirlos como
argumentos de subprogramas siempre que al mismo tiempo se pase al subprograma (funcin o procedimiento) como argumento un
parmetro que represente el nmero de elementos de que consta el vector que se pasa. Ejemplo: TratarVector (int v[], int n) es una
llamada donde el vector pasa por referencia.
TratarVector (const float v[], int n) es una llamada donde el vector pasa por valor.
Las cadenas de texto (vectores de caracteres) son un caso especial donde no hace falta especificar el nmero de elementos de que
constan.
PREGUNTA:

Si a = true, b = false, c = false seale la expresin verdadera:

a)

!(! a || c || !b)

b)

!(! c || b && a)

c)

a && ! (a || ! c)

d)

a && ! c || b

RESPUESTA: la opcin correcta es la d).


Si analizamos las opciones, para la a) el interior del parntesis es (falso falso verdadero), devuelve verdadero, y con la negacin
exterior resulta falso. Para la b el interior del parntesis devuelve verdadero ... que es verdadero y con la negacin exterior resulta
falso. La opcin c): el parntesis devuelve verdadero ... que resulta verdadero, al negarlo nos queda falso y a && falso es falso. La
opcin d) es verdadero y verdadero falso, lo cual resulta verdadero.
PREGUNTA:

Dado el siguiente subprograma en C/C++:

int Oper (float x, float & y){


x = x/2.0 + y*2.0;
y = y + x;
return int (y);
}
Si a = 5.0 y b = 3.0, los valores de a y b despus de la llamada Oper(a,b) son respectivamente:
a)

8.5 y 11.5

b)

5.0 y 11.0

c)

5.0 y 11.5

d)

8.5 y 11.0

RESPUESTA: La respuesta correcta es la c). a se pasa por valor, b se pasa por referencia. En la primera lnea a=2.5 + 6=8.5; en la
segunda lnea b=3+8.5=11.5; Se devuelve 11.5. Pero atencin! Hay que prestar atencin a si nos pregunta qu valor devuelve la
funcin o con qu valor se quedan las variables. En este caso la funcin devuelve 11 (parte entera de 11.5) pero la variable b se
haba pasado por referencia y la a por valor. a se queda valiendo 5 pues no se modifica mientras que b se queda valiendo 11.5. Un
poco lioso, pero si se piensa con calma, sale.

PREGUNTA:

Cul de las siguientes afirmaciones es falsa?:

a) Con los mdulos se definen tipos abstractos.


b) Todo dato encapsulado es de tipo abstracto.
c) Todo tipo static es de tipo abstracto.
d) Todo tipo abstracto es dato encapsulado.
RESPUESTA: La respuesta correcta es d). Ojo al error ms habitual que podemos cometer con una pregunta de este tipo: no darnos
cuenta de que preguntan por la falsa en vez de por la verdadera (que es lo habitual). Si preguntan cul es falsa se supone que quiere
decir que hay tres verdaderas y hay que responder la falsa. En consecuencia: a), b) y d) son verdaderas (o se supone, porque esta
pregunta es un poco confusa).
Nota: en algunas ocasiones hay erratas en los enunciados de los exmenes, es decir, preguntas mal formuladas. En ese caso, la
pregunta puede ser invalidada una vez hecho el examen cuando se descubre la errata. De cualquier manera recomendacin: no te
centres en tratar de determinar si hay una errata o no (perder el tiempo), cntrate en estudiar y tratar de responder lo mejor
posible.
PREGUNTA:

Dada la declaracin typedef enum TipoColor {rojo, amarillo, azul, negro); sealar la expresin verdadera:

a) TipoColor(int(rojo)) = amarillo;
b)

TipoColor(int(TipoColor(2)) = 1;

c)

TipoColor(0) = rojo;

d)

int(azul) = 3;

RESPUESTA: La opcin correcta es la c)


La declaracin que se presenta es la de un tipo enumerado en C/C++. Los tipos enumerados son ordinales, es decir, tienen un orden
y equivalente numrico que en este caso son 0 para el rojo, 1 para el amarillo, 2 para el azul y 3 para el negro. La opcin a) sera
suponer que TipoColor(0) = amarillo, lo cual es falso. La opcin b) sera suponer que TipoColor(int(azul)) = 1, lo cual es falso. La
opcin 3 es verdadera. La opcin d) es falsa ya que el azul se corresponde con el 2.
PREGUNTA: En C/C++ un tipo static se declara slo en el mdulo:
a) De implementacin
b) De definicin
c) Principal del programa
d) Principal y en el de definicin
RESPUESTA: La correcta es la opcin a). Llamamos mdulos no principales a los mdulos de un programa que no contienen la funcin
main() y no permiten generar un ejecutable por s solos. Su cdigo est destinado a ser usado por el programa principal o por otros
mdulos. Un mdulo no principal consta de dos sub-mdulos o ficheros: el .h, interfaz o "parte pblica" y el .cpp, implementacin o
parte "privada". Si son necesarias variables privadas (locales) en el sub-mdulo de implementacin se declararn usando la palabra
clave static, por ejemplo static int miNumero = 33;
Para acordarse de esto, memoria y haber hecho unos cuantos ejercicios porque si no difcil acordarse de algo as.

PREGUNTA: Cunto vale la variable x despus de ejecutar el siguiente cdigo?:


x = 0;
for (int i = 1; i <= 10; i++){
for (int j = 1; j <= 10; j++){
for (int k = 1; k <= 10; k++){
x++;
}
x--;
}
if (x % 2 !=0){
x--;
}
}

a) 890
b) 900
c) 895
d) 899
RESPUESTA: La opcin correcta es la b). Si recorremos el cdigo tenemos lo siguiente: x comienza valiendo cero. Partimos con i=1,
j=1, k=1 y x toma valor 10 con el bucle k y se reduce a 9 al terminar el bucle j. En el siguiente paso i=1, j=2, K=1 y se repite el
proceso hasta que x termina valiendo 9+9 = 18 ... se repite el proceso hasta que x termina valiendo 9*10 = 90. A continuacin se
alcanza la parte final del bucle i y se evala si x es impar, como 90 es par el valor de x no se reduce, es decir, no se ejecuta el cdigo
asociado al condicional if. La repeticin del proceso 10 veces (bucle i) da lugar a que x termine con el valor 900. Nota: es
recomendable marcar con fluorescente el alcance de cada for: no hay que dejarse llevar por las tabulaciones (nos las pueden poner
mal establecidas). Lo que determina la ejecucin son las llaves de apertura y cierre que delimitan el alcance de cada bucle o
condicional. En este caso el condicional if est asociado al bucle ms exterior.
PREGUNTA: En C/C++ al usar un registro con variantes en un programa:
a) Puede omitirse el nombre del discriminante
b) Puede omitirse el tipo del discriminante en la declaracin
c) Es obligatoria la alternativa final con ELSE
d) El uso de variantes no consistentes con el valor del discriminante es detectado por el compilador

RESPUESTA: La opcin correcta es la d).


Hay ocasiones en que nos puede interesar que una varible funcione segn las circunstancias como si fuese de un tipo u otro. En estos
casos hacemos una declaracin typedef union Nombre donde typedef union funciona como palabra clave.
Un tipo union se puede introducir dentro de un tipo struct y a esto se le denomina registro con variantes. Es habitual que exista un
campo indicador de qu variante de las previstas en el tipo union es la actual en un momento dado.
La variante actual del union se denomina discriminante y solo puede haber una. Por ejemplo, si el union es:
typedef union Numerico {
int entero;
float real;
};
Y luego usamos:
Numerico numeroaprocesar;
numeroaprocesar.entero = 243;
El discriminante ahora es "entero".
Una invocacin ahora a numeroaprocesar.real sera errnea y detectada por el compilador porque un tipo union tiene
alternativamente un tipo de valor u otro, pero no existen los dos valores simultneamente.
Pregunta un poco enrevesada...

10

PREGUNTA: En C/C++ el operador %


a) Puede dar error para valores de tipo cardinal
b) Nunca da error para valores de tipo int
c) Nunca da error para valores de tipo float
d) Est definido para cualquier tipo de datos
RESPUESTA: la opcin correcta es la b). El operador % es el operador mdulo o mod, que devuelve el resto de una divisin slo
permitindose el uso de enteros. Si analizamos respuesta a respuesta tenemos lo siguiente: nmeros cardinales son 1, 2, 3, 4 ... por
tanto no dan error. Los tipo float (opcin c) no son enteros y no se pueden usar con el operador %. Respecto a la opcin d) es falsa
por lo que hemos expuesto anteriormente.
PREGUNTA: La doble referencia se produce cuando:
a) Un mismo elemento se utiliza con dos nombres distintos
b) Dos punteros apuntan al mismo tipo de elemento
c) Se produce una redefinicin de elementos
d) Dos ndices indexan al mismo elemento de una formacin
RESPUESTA: La opcin correcta es la a). Esta pregunta alude a una definicin y por tanto lo que hay es que sabrsela de memoria, ya
que si no lo hacemos as podra pensarse que cualquier respuesta es vlida. Qu significa que un mismo elemento se utiliza con dos
nombres distintos? Pues una variable por ejemplo referencia a un espacio de memoria. Supongamos que el espacio de memoria
denominado @363H3 tiene por contenido "jota". Si las variables A y B referencian al mismo espacio de memoria, ambas son una
misma cosa con dos nombres distintos.
PREGUNTA: En C/C++ respecto a los punteros podemos decir:
a) No se pueden utilizar
b) Son elementos de programacin de muy alto nivel
c) No estn tipados
d) Su valor no es representable como un nmero o texto
RESPUESTA: la opcin correcta es la d. Si analizamos las alternativas, la a) es falsa ya que s se pueden utilizar. La b) es falsa, ya
que son elementos de programacin de bajo nivel. Nos quedan dos opciones.
La definicin de puntero (referencia) es la siguiente: "variable simple especfica que apunta a una variable dinmica. Su contenido es
una referencia no representable como nmero o texto". Con esto queda claro que la opcin correcta es la d) y que para poder
responder esta pregunta necesitamos haberla memorizado porque si no lo hemos hecho... difcil de responder. De la opcin c)
diramos que los punteros s estn tipados: su tipo es "puntero".
PREGUNTA:

La regla sintctica para la cual es vlida el valor E5.0, siendo digito::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 es:

a) Real ::= {digito}E{digito}


b) Real ::= digito{digito}.{digito}[E digito {digito} ]
c) Real ::= {digito}[E]{digito}[.]{digito}
d) Real ::= {digito}.digito[E[+|-]digito.{digito}
RESPUESTA: la opcin correcta es la c). Para responder a esta pregunta tenemos que recordar la notacin BNF (notacin basada en
metasmbolos que sirve para definir la sintaxis de lenguajes de programacin). En este sentido, ::= es el metasmbolo de definicin, |
es el metasmbolo de alternativa, {} es el metasmbolo de repeticin (los elementos dentro del metasmbolo se pueden repetir o no),
[] es el metasmbolo de opcin y () es el metasmbolo de agrupacin. La opcin a) no es vlida porque nos falta el punto. La opcin
b) no es vlida porque obliga a empezar con un dgito y E5.0 no empieza por un dgito. La opcin c) satisface la expresin, ya que el
que aparezca un dgito opcional repetido n veces es opcional, y cumple lo establecido. La opcin d) obliga a empezar con un punto o
con un dgito, aspecto que no se cumple en la expresin propuesta.

11

PREGUNTA: Cul de las siguientes afirmaciones es CORRECTA?


a) El tipo int es exacto y sin lmites
b) El tipo int es exacto pero con lmites
c) El tipo float es exacto y sin lmites
d) El tipo float es exacto pero con lmites
RESPUESTA: La opcin correcta es la b). int es exacto al carecer de decimales. La a) es falsa porque int s tiene lmites (no puede
superarse determinado valor). La c) es falsa porque float tambin tiene lmites y no es exacto al representar valores decimales o
fraccionarios. La d) es falsa porque float no es exacto.
PREGUNTA: En la instruccin de asignacin en C/C++ definida por A=B:
a) A debe ser variable y B constante
b) Tanto A como B deben ser variables
c) Debe haber compatibilidad de tipos entre A y B
d) A y B deben ser de tipo simple
RESPUESTA: la opcin correcta es la c). Si analizamos las posibilidades, la a) no tiene por qu ser as. La B tampoco tiene por qu ser
as, uno de los dos puede ser constante. La d) no se sabe muy bien a qu se refiere. La c es cierta: debe haber compatibilidad de
tipos para realizar una asignacin.
PREGUNTA: En la prctica, la verificacin:
a) Garantiza que en el programa no hay ningn error
b) Se hace mediante ensayos del programa
c) Aumenta la complejidad del programa
d) Garantiza la eficiencia del programa

RESPUESTA: la opcin correcta es la b). La c) es claramente falsa ya que verificar un programa no hace que tenga mayor ni menor
complejidad. La d) tambin es falsa, ya que con la verificacin se trata de comprobar la correccin del programa, es decir, que
cumpla con los objetivos de la especificacin, no su eficiencia. Tampoco garantiza que en el programa no exista algn error. Esta
pregunta se basa en conceptos tericos que hay que saberse de memoria porque de otra manera no podremos responder porque la
terminologa es un poco ambigua.

12

PREGUNTA: Dado el siguiente procedimiento en C/C++:


void proc( int a,int b, int & c)
{
int aux;
aux=a+b+c;
c=aux;
}
Para que fuese puro:
a) Es ya un procedimiento puro
b) bastara con pasar las variables a y b por referencia
c) la variable c se debera pasar por referencia
d) Todas las variables, incluida aux, deben pasarse por referencia
RESPUESTA: la opcin correcta es la a). Por qu? Para poder responder esto tendremos que conocer la definicin de "procedimiento
puro" porque si no est difcil
Muchos programadores profesionales no sabran responder a esto porque es algo bastante terico,
pero veamos la definicin. Para ello tenemos que ver algn concepto previo:
Transparencia referencial: existe transparencia referencial si el resultado de una llamada a un subprograma puede predecirse con
la informacin del cdigo de la llamada, es decir, si siempre que se pasan los mismos argumentos se obtienen los mismos resultados.
La transparencia referencial se garantiza si el subprograma utiliza solo variables o elementos locales. Si un subprograma modifica una
variable externa (global) se dice que est produciendo efectos secundarios o laterales (side effects) y que no existe transparencia
referencial.
Procedimiento puro: el que no tiene efectos laterales, es decir, el que es tranparente referencialmente. No se exige el paso de
argumentos por valor para considerar un procedimiento puro (en cambio para considerar una funcin pura s se exige el paso de
argumentos por valor).
En resumen, el procedimiento propuesto es puro porque solo usa elementos o variables locales (independientemente de que reciba
dos parmetros por valor y uno por referencia). Si fuera una funcin, no sera pura.

PREGUNTA: Dado el siguiente fragmento de cdigo en C/C++:


n=0;
if (n<2) {
n=n+1;
}
Despus de su ejecucin n contiene el valor:

a) 3
b) 1
c) 2
d) 0

RESPUESTA: La opcin correcta es la b). Consideremos el cdigo. n empieza valiendo 0. Entramos en el condicional, y como
n es menor que 2 se ejecuta que n incrementa su valor en una unidad pasando a valer 1. Esta est clarita!

13

PREGUNTA: Dado el siguiente fragmento de cdigo:


switch (j) {
case lunes: case martes: case mircoles: case jueves: j = TipoDia(int(j)+1); break;
case viernes: case sabado: case domingo: j = TipoDia(int(j)-1); break;
}
a) Falta una sentencia else
b) La sentencia else no se puede usar dentro de una instruccin
c) La variable j tiene que ser de tipo TipoDia para ser correcto
d) Los rangos establecidos son incorrectos

RESPUESTA: la opcin correcta es la c). Analicemos las opciones. En un switch no aparecen elses luego desechamos la
opcin a). La opcin b) es un poco confusa, cosas que aparecen de vez en cuando. Pensemos que un else puede aparecer
acompaando a un if que puede estar dentro de otra instruccin, luego desechamos la b). j es el parmetro en que se basa
la evaluacin del switch. Recordar que un switch solo admite ciertos tipos de parmetros como enteros, enumerados,
caracteres (aquello con equivalencia numrica). La expresin TipoDia(int(j)+1); indica que dentro del parntesis se obtiene
el valor numrico equivalente a j ms una unidad, suponemos que ser el siguiente da de la semana. Luego ese equivalente
numrico lo transforma en tipo TipoDia. Por tanto la variable j tiene que ser de tipo TipoDia, en caso contrario no se podra
realizar la asignacin.
PREGUNTA: La complejidad de un algoritmo:
a) Depende del programador
b) Depende del anidamiento de bucles
c) Depende del invariante
d) Aumenta con el uso del LOOP

RESPUESTA: La opcin correcta es la b). Tener en cuenta lo siguiente: para un tamao de problema n, la complejidad de un
2

algoritmo en general est en O(n) cuando tenemos un bucle de tratamiento de datos, en O(n ) cuando tenemos un bucle
3

anidado dentro de otro, en O(n ) cuando tenemos un triple anidamiento de bucles y as sucesivamente. La verdad es que
esta pregunta es poco correcta porque habra mucho que matizar, pero en fin, as son las cosas y as se las hemos
contado
PREGUNTA: Un tipo vector abierto:
a) Necesita utilizar un centinela
b) Omite el tamao explcito del vector
c) Se utiliza para declarar variables de tipo ristra
d) Simplifica las condiciones de contorno

RESPUESTA: La opcin correcta es la b). Recordar lo siguiente: En C/C++ no es posible declarar vectores abiertos (con un
nmero de elementos indefinidos) pero s es posible incluirlos como argumentos de subprogramas siempre que al mismo
tiempo se pase al subprograma (funcin o procedimiento) como argumento un parmetro que represente el nmero de
elementos de que consta el vector que se pasa. Ejemplo: TratarVector (int v[], int n) es una llamada donde el vector pasa
por referencia.
TratarVector (const float v[], int n) es una llamada donde el vector pasa por valor.
Las cadenas de texto (vectores de caracteres) son un caso especial donde no hace falta especificar el nmero de elementos
de que constan.

14

PREGUNTA: Del mdulo de interfaz:


#pragma once
void uno();
void dos();
Se puede afirmar:
a) Faltan argumentos a los procedimientos
b) Es un tipo abstracto
c) Falta una declaracin de tipo
d) Es un dato encapsulado

RESPUESTA: La opcin correcta es la d). Recordar que hablbamos de mdulo en alusin a un fragmento de un programa
desarrollado de forma independiente y que distinguamos dos tipos de mdulos:
- Especificacin o interfaz: define qu hace el programa (abstracciones). Fichero .h, parte "pblica"
- Realizacin o implementacin: define cmo lo hace el programa. Fichero .cpp. Desarrolla las abstracciones, parte
"privada".
Hablamos de dato encapsulado en alusin a que si una abstraccin de datos no requiere el uso de distintas variables sino
solo una, se puede implementar como dato encapsulado. Un dato encapsulado declara en el .h slo interfaces de
operaciones, mientras que en el cpp ir el typedef struct que define el dato como static TipoDato... , y adems el cdigo de
implementacin de las operaciones.
En el programa principal, para un dato encapsulado no declararemos variables, sino que simplemente haremos llamadas.
En resumen, un dato encapsulado funciona se puede invocar sin declarar la variable en el programa principal; en su lugar, se
declara la variable como esttica en el .cpp.
Respecto a las otras opciones: la a) no es cierta ya que en un .h podemos tener procedimientos sin argumentos. La b) no es
cierta porque si fuera un tipo abstracto tendramos una declaracin de un tipo (typedef...). La c) no es cierta, si no hay
declaracin de tipo ser porque es un dato encapsulado.
Comentarios: los nombres de los procedimientos, uno y dos, podramos calificarlos de inadecuados o con intencin de
despistar, pero que los nombres no sean adecuados no cambia nada.
PREGUNTA: La sentencia:
P-> = P->siguiente + 1;

a) Es correcta
b) Es correcta cuando siguiente es un puntero
c) Es incorrecta
d) Es correcta cuando siguiente es de tipo int

RESPUESTA: la opcin a responder es la c), es decir, la sentencia propuesta es incorrecta. El smbolo -> no es vlido en
C/C++, con lo cual ninguna de las otras opciones puede ser vlida.

15

PREGUNTA: En C/C++, los vectores abiertos:


a) Slo pueden utilizarse en la definicin de funciones
b) Slo pueden utilizarse en la definicin de procedimientos
c) Pueden utilizarse en la definicin de funciones y en la definicin de procedimientos
d) No pueden utilizarse ni en la definicin de procedimientos ni en la definicin de funciones

RESPUESTA: La opcin correcta es la c). Recordar lo siguiente: En C/C++ no es posible declarar vectores abiertos (con un
nmero de elementos indefinidos) pero s es posible incluirlos como argumentos de subprogramas siempre que al mismo
tiempo se pase al subprograma (funcin o procedimiento) como argumento un parmetro que represente el nmero de
elementos de que consta el vector que se pasa. Ejemplo: TratarVector (int v[], int n) es una llamada donde el vector pasa
por referencia.
TratarVector (const float v[], int n) es una llamada donde el vector pasa por valor.
Las cadenas de texto (vectores de caracteres) son un caso especial donde no hace falta especificar el nmero de elementos
de que constan.
PREGUNTA: El siguiente fragmento de cdigo en C/C++:
x = 2;
do{
printf("%d ", x);
x = x+1*2/3-1;
}while(x > 0);

a) Imprime: 2
b) Imprime: 2 1
c) Imprime: %d
d) Entra en un bucle infinito
RESPUESTA: La opcin correcta es la b), se imprimir 2 1. Analicemos lo que hace el programa: x comienza valiendo 2,
entramos en el bucle, se muestra 2 por pantalla. Se ejecuta la operacin que resulta ser x = 2 + 0,6667 - 1 = 1,6667 pero
como x est declarada de tipo entero se trunca y queda valiendo 1 (hemos dicho se trunca, que no es redondear sino
truncar). Ahora x entra valiendo 1, se imprime 1 y la operacin es 1 + 0,6667 - 1 = 0,6667. Se trunca y ahora x vale cero.
Se analiza la condicin del while, y como x no es mayor que cero, se sale del bucle.
Fjate si preguntramos: Qu ocurre al ejecutar esto?
int main(){
int x;
x = 2.85;
do{
printf("%d ", x);
x = x+1*2/3-1;
}while(x > 0);
return 0;
}
Pues que se imprime tambin 2 y 1. Como hemos dicho, aunque a x se le asigne 2.85 al estar declarada como tipo entero se
trunca a la parte entera y x comienza valiendo 2. Resultado, se imprime 2 1.
Qu ocurre si truncamos un negativo como -2.85? Que nos trunca siempre a la parte entera, en este caso a -2.

16

PREGUNTA: La tcnica de desarrollo mediante refinamientos sucesivos consiste en:


a) Descomponer acciones en otras ms simples en pasos sucesivos
b) Depurar los errores del cdigo en pasos sucesivos
c) Reducir el tiempo de compilacin de un programa en pasos sucesivos
d) Reducir el tiempo de ejecucin de un programa en pasos sucesivos

RESPUESTA: la opcin correcta es la a). La pregunta es quizs ms de memorizar que de otra cosa. De todas formas
despus de haber ledo los contenidos de la asignatura b), c) y d) son ms o menos fcilmente descartables.
PREGUNTA: El esquema de datos formacin se corresponde con el esquema de accin:
a) Secuencia
b) Iteracin
c) Seleccin
d) Tupla

RESPUESTA: la opcin correcta es la b). Esta pregunta implica que tenemos que haber memorizado algunas cosas. En
primer lugar que "formacin" equivale a "array". En segundo lugar lo siguiente: si consideramos que los esquemas de accin
son secuencia, seleccin e iteracin la analoga entre esquemas de datos y acciones sera la siguiente:
Secuencia <---> Tupla o registro
Seleccin <---> Union
Iteracin <---> Formacin (array)
Tratando de buscarle algo de lgica a esto, podramos pensar que un registro nos permite definir una secuencia de variables,
un union nos permite seleccionar entre tipos alternativos, y un array nos permite iterar una variable valindonos de ndices.
PREGUNTA: Dadas las variables A y B de tipo vector de tres elementos, si queremos copiar todos los elementos
de A en B, en C/C++ escribimos:
a) B=A;
b) for(int i=1; i<=3; i++){ B[ i ] = A[ i ]; }
c) A=B;
d) for(int i=0; i<3; i++){ B[ i ] = A[ i ]; }

RESPUESTA: la opcin correcta es la d). Segn esta opcin se asigna a cada elemento de B el contenido correspondiente de
cada elemento de A. En algunos lenguajes se puede asignar directamente el contenido de un vector a otro, pero en C/C++
no. En C/C++ hemos de realizar la asignacin elemento a elemento recorriendo el vector con un for. Recordar que los
ndices de vectores en c/c++ comienzan en cero, por lo que la opcin b) no es correcta.
PREGUNTA: En C/C++, dentro de un subprograma, un argumento:
a) No puede cambiar de tipo
b) Puede cambiar de tipo si se pasa por referencia
c) Puede cambiar de tipo si se pasa por valor
d) Nunca puede cambiar de valor
RESPUESTA: La opcin correcta es la a). Si analizamos las otras opciones, el paso por referencia o valor afecta a que un
argumento pueda ser modificado en su valor, pero nunca podr ser modificado en su tipo. Por tanto las opciones b, c y d no
son correctas.

17

PREGUNTA: Qu caractersticas tienen los elementos locales?

a) Son visibles en su mbito y fuera


b) Son invisibles en su mbito y fuera
c) Son invisibles en su mbito y visibles fuera
d) Son visibles en su mbito e invisibles fuera

RESPUESTA: La opcin correcta es la d). Analicemos una por una. Los elementos locales son visibles en su mbito y no son
visibles fuera de su mbito luego la a) es incorrecta y la b) y c) tambin. Un "elemento local" tpico es una variable declarada
dentro de una funcin. Puede haber algo de confusin si pensamos en parmetros (que se pueden pasar por valor o por
referencia), pero el asunto aqu est en pensar que un parmetro es un parmetro y un elemento local una variable local.
PREGUNTA: El modelo de programacin lgica:

a) Imita la arquitectura de Von Newmann


b) Se basa en el uso de funciones
c) Se basa en la declaracin de hechos y reglas
d) Es el que utiliza C/C++

RESPUESTA: La opcin correcta es la c). La programacin lgica es un tipo de programacin declarativa: se basa en declarar
hechos y reglas que permiten resolver, por inferencia lgica, un problema. Es un tipo de programacin bastante peculiar (y
con ms uso en investigacin que en el mercado laboral donde prcticamente no se trabaja con ella).
PREGUNTA: En C/C++, cuando se utiliza:
typedef struct Uno{Dos Tres; Cuatro Cinco;};

a) Uno y Cuatro son identificadores de tipo


b) Tres y Cinco son identificadores de tipo
c) Dos y Cinco son identificadores de tipo
d) Uno y Tres son identificadores de tipo

RESPUESTA: la opcin correcta es la a). Uno define el tipo registro que consta de dos variables internas, una variable
denominada Tres que es de tipo Dos y una variable denominada Cinco que es de tipo Cuatro. La opcin b) es incorrecta
porque Tres no es un identificador de tipo, sino un nombre o identificador de variable. La opcin c) no es correcta porque
Cinco no es un identificador de tipo, sino un nombre o identificador de variable. La opcin d) no es correcta porque Tres no
es un identificador de tipo, sino un nombre o identificador de variable. En resumen, los identificadores de tipo son Uno, Dos
y Cuatro. Todas las opciones donde interviene Tres y Cinco son incorrectas. La dificultad de esta pregunta est en los
nombres de variables y tipos que se utilizan: parece un trabalenguas.

18

PREGUNTA: Tras la ejecucin del siguiente fragmento de cdigo en C/C++:


int a;
void proc (int &b, int &c){
b = 2;
c = a%2;
b = a+b * c;
}
a = 1;
proc (a,a);
printf ("Variable a = %d , a);

a) La variable a vale 3
b) La variable a vale 2
c) La variable a vale 1
d) La variable a vale 0

RESPUESTA: la opcin correcta es la d).


Analicemos el cdigo, empezando por el procedimiento proc. Este procedimiento recibe dos parmetros que se pasan por
variable: parmetros b y c. El parmetro b (y la variable asociada) toman valor 2. A continuacin el parmetro c (y la
variable asociada) toman el valor del resto de dividir el valor que tenga la variable a entre 2, que puede ser 0 si a es par 1
si a es impar. En este caso a se declara en la parte inferior del cdigo y vale 1, es decir, es impar, con lo cual c toma valor 1.
A continuacin se establece que b es igual a -- > a+b*c que ser en nuestro caso 1+b*1, es decir, b termina con un valor
igual a b+1 mientras que c termina con un valor 1.
El problema o dificultad radica en que el procedimiento se invoca pasndole a como parmetro con lo cual tenemos que
atender a lo que pasa a medida que evoluciona el cdigo. Dado que a se pasa por referencia tanto como parmetro b como
como parmetro c, a ser sobreescrita cada vez que se modifique b o c. En la primera lnea b = 2 con lo cual a toma valor 2.
En la segunda lnea del procedimiento c = 2%2 = 0 con lo cual a toma valor cero; En la tercera lnea b toma valor a + b*c =
0 + b * 0 = 0, con lo cual a=0, b=0, c=0. Un poco lioso, pero analizndolo con detenimiento se puede sacar.

PREGUNTA: En C/C++, cuando se utiliza:

#pragma once

a) Se debe indicar un nombre del mdulo


b) Tenemos una directiva del programa
c) Es una declaracin del mdulo
d) Hay una expresin del programa

RESPUESTA:
Un fichero .h (interfaz de un TAD) debe comenzar con las palabras clave #pragma once. Pero qu es pragma once y para
qu sirve? En los lenguajes de programacin C y C++, #pragma once es una directiva del preprocesador. Est diseada
para asegurar que el cdigo no se cargue mltiples veces, sino solo una vez, aunque sea invocado muchas veces.
La opcin a) es falsa. Las opciones b, c y d podramos decir que son un tanto confusas en el enunciado. La opcin d) vamos
a considerarla no vlida ya que no se trata de una expresin, sino en todo caso de una directiva o una declaracin.
Suponiendo que el trmino declaracin lo reservamos para declarar variables, constantes, etc. responderamos la opcin b).
No obstante, ante preguntas que se vean de enunciado dudoso recomendamos incluir una hoja de aclaracin en el examen
dejando constancia de lo que hemos entendido y por qu hemos respondido lo que hemos respondido. Es la nica
oportunidad para poder reclamar despus en caso de que efectivamente se pueda considerar que la redaccin de la pregunta
era ambigua o confusa. En este caso respondemos la b) ya que formalmente pragma once es una directiva, pero en un
examen quizs no tengamos claro si puede haber un error en el enunciado de la pregunta, de ah el comentario que hemos
hecho.

19

PREGUNTA: Qu se muestra por pantalla despus de ejecutar el siguiente cdigo en C/C++?


#include <stdio.h>
int main(){
int i, j;
i = 0;
j = 12;
do {
printf("%d-" ,i*j);
i = i+2;
j = j-2;
} while(i != j);
}
a) 0-16-24b) 0-20-32c) 0-20-24d) Se ejecuta infinitamente

RESPUESTA: la respuesta correcta es la b), se muestra 0-20-32Analicemos por qu. Inicialmente i vale cero y j vale 12. Comienza el bucle do y se muestra por pantalla el resultado de la
operacin 0*12 seguido de un guin, es decir, 0-.
A continuacin i vale 2 y j vale 10. Se evala la condicin del bucle y al ser i distinto de j se produce la repeticin. En esta
pasada se muestra 2*10 que es 20 junto al guin, ya tenemos 0-20-. Ahora i vale 4 y j vale 8. No se cumple que sean
iguales y se repite el bucle. Se muestra el resultado de 4*8 seguido de un guin y ya tenemos 0-20-32-.
Ahora i vale 6 y j vale 6. Al ser iguales no cumplen la condicin de repeticin y la ejecucin termina.
------------------------------------------------------------------------------------------------------------PREGUNTA: La programacin estructurada sugiere el uso de tres esquemas generales denominados:
a) Secuencia, seleccin y objetos
b) Seleccin, recursividad y objetos
c) Secuencia, seleccin y recursividad
d) Secuencia, seleccin e iteracin

RESPUESTA: La opcin correcta es la d). Esta pregunta es bsica, quien no la tenga clara es que le falta estudio o prctica!

20

PREGUNTA: Dada la siguiente funcin en C/C++:


int suma (int x) {
if (x == 0) { return 0; }
else { return (x+suma(x-1) - 1); }
}

a) La llamada suma(5) devuelve 0


b) La llamada suma(5) devuelve 5
c) La llamada suma(5) devuelve 10
d) La llamada suma(5) devuelve 15

RESPUESTA: la opcin correcta es la c), la llamada devuelve 10.


Esta pregunta es un tanto compleja porque es un caso de recursin (funcin que se llama a s misma). No te desesperes si
no lo ves a la primera porque la recursin es algo trabajoso incluso para programadores con muchos aos de experiencia. En
esta funcin el caso base que da lugar a la terminacin de la recursin es que el parmetro pasado valga cero. Para analizar
la recursin tenemos:
Primera invocacin: no estamos en el caso base ya que x vale 5 y el resultado obtenido es 5 + suma(4) -1
Segunda invocacin: el resultado obtenido es 4 + suma(3) -1
Tercera invocacin: el resultado obtenido es 3 + suma(2) -1
Cuarta invocacin: el resultado obtenido es 2 + suma(1) 1
Quinta invocacin: el resultado obtenido es 1 + suma(0) 1, en este caso estamos en el caso base y salimos directamente y
podemos decir que suma(1) vale 1 + 0 - 1 = 0
Salida de la cuarta invocacin: 2 + 0 1 = 1
Salida de la tercera invocacin: 3 + 1 -1 = 3
Salida de la segunda invocacin: 4 + 3 -1 = 6
Salida de la primera invocacin: 5 + 6 - 1 = 10
Por tanto el valor devuelto es 10. Si no lo entiendes a la primera, trata de hacerlo paso a paso siguiendo la traza del
algoritmo.
PREGUNTA: La complejidad es una medida:
a) De la eficiencia de un programa
b) De la memoria utilizada en un programa
c) Del coste de desarrollo de un programa
d) De la dificultad de comprensin de un programa

RESPUESTA: la opcin correcta es la a), es una medida de la eficiencia de un programa.


En este caso podemos responder por descarte, ya que un programa puede tener muy poca complejidad y consumir gran
cantidad de memoria luego la b) es falsa. Tampoco mide el coste de desarrollo, un programa puede ser costoso simplemente
por ser extenso o por manejar muchos datos, no por ser complejo. Finalmente la dificultad de comprensin no tiene que ver
con la complejidad ya que un programa donde los nombres de variables estn deliberadamente puestos para confundir
puede ser muy difcil de comprender y sin embargo su complejidad computacional ser baja.
Tambin podemos responder si recordamos la definicin de complejidad: la funcin de complejidad es aquella que nos indica
la eficiciencia de un programa (generalmente medida en trminos de tiempo de ejecucin) en funcin del tamao del
problema.

21

PREGUNTA: Para declarar un registro con variantes:


a) Uno de los campos del tipo struct debe ser un tipo union
b) Uno de los campos del tipo union debe ser un tipo struct
c) Todos los campos del tipo struct deben ser un tipo union
d) Todos los campos del tipo union debe ser un tipo struct

RESPUESTA: la opcin correcta es la a)


Un tipo union se puede introducir dentro de un tipo struct y a esto se le denomina registro con variantes.
El tipo union permite declarar un tipo donde existe un campo indicador de qu variante de las previstas es la actual en un
momento dado. Ejemplo: declaramos un union como:
typedef union Numerico {
int entero;
float real;
};
Adems declaramos otro tipo: typedef char TipoCadena[40];
Luego declaramos un registro con variantes por ejemplo:
Typedef struct Parametro {
Numerico valorNumerico;
TipoCadena valorCadena;
}
En el registro con variantes, uno de los campos del struct es de tipo union. Un poco de trabalenguas
PREGUNTA: En C/C++, cuando se utiliza:
void Uno(Dos Tres, Cuatro Cinco)
a) Uno es un identificador de funcin
b) Tres y Cinco pueden ser el mismo identificador
c) Uno es un identificador de variable
d) Dos y Cuatro pueden ser el mismo identificador

RESPUESTA:
Pregunta bastante enrevesada, hasta difcil de entender. Dado que los nombres son bastante confusos, si le ponemos
nombres razonables es ms fcil responder a esta pregunta. Por ejemplo: void Calcular (int Preciokg, double Pesokg) sera
una posible declaracin de procedimiento. Calcular es un identificador de procedimiento, no de funcin, luego la respuesta a)
es falsa. Preciokg y Pesokg pueden ser el mismo identificador? En principio diremos que no porque son parmetros a usar
en el procedimiento y habra una colisin de nombres, de hecho si intentas compilar esto:
void Calcular(int Preciokg, double Preciokg) {
printf("Hola");
}
El resultado es error: tipos en conflicto
Calcular es un identificador de funcin luego la c) es falsa. Dos y Cuatro pueden ser el mismo identificador? Podramos
escribir void Calcular (double Preciokg, double Pesokg) de modo que Dos y Cuatro seran el mismo identificador.
Respondemos esta por descarte de las anteriores, porque si quisiramos darle vueltas nos podramos aqu pasar un rato
discutiendo para llegar a la conclusin de que este enunciado es un tanto confuso, y por tanto no merece la pena pararse
demasiado en l

22

PREGUNTA: Si a = true, b = true, y c = true, cul de las siguientes expresiones se evala como verdadera?
a)

!(!a || c || !b)

b)

a && !c || b

c)

! (!c || b && a)

d)

a && !(a || !c)

RESPUESTA: La opcin correcta es la b). Veamos por qu.


Para la opcin a) empezamos evaluando por partes. !a es false, c es true y !b es false. Por tanto dentro del parntesis
tenemos (false OR true OR false) y esto es true. Al aplicar la negacin el resultado es que a) resulta false.
Para la opcin b) tenemos true AND false OR true. Debemos recordar la prioridad de operadores que es conjuncin >
disyuncin. Por tanto hacemos true AND false resultando false. false OR true es lo que evaluamos a continuacin por lo que
resulta true.
Para la opcin c) tenemos dentro del parntesis (false OR true AND true) que resulta (true AND true) que resulta true. Con
la negacin inicial obtenemos false.
Para la opcin d) tenemos dentro del parntesis (true OR false) que resulta true, pero con la negacin que precede al
parntesis queda en false. Ahora nos queda true AND false resultando false.
PREGUNTA: Cuando un argumento se pasa por referencia en C/C++:
a) No se podr usar una expresin como argumento real
b) No se puede modificar el argumento real en el subprograma
c) Es siempre una variable global
d) Slo puede ser de tipo entero

RESPUESTA: La opcin correcta es la a)


El argumento real es el valor o expresin que se pasa a un subprograma cuando se invoca. Cuando se pasa un argumento
por valor el subprograma recibe un valor y esto puede hacerse pasndole una variable o una expresin, o un nmero, un
carcter, etc. ya que este argumento no es modificado en el subprograma. Cuando se pasa un argumento por referencia ha
de pasarse una variable que podr ser modificada en el subprograma. No se puede pasar una expresin ya que esto no
tendra sentido en un paso por referencia.
La opcin b) es falsa, si se pasa por referencia, el argumento real que es la variable s se puede modificar en el
subprograma.
La opcin c) no es cierta, no tiene por qu ser una variable global.
La opcin d) no es cierta, no tiene por qu ser un tipo entero, puede ser otro tipo.

23

PREGUNTA: Tras la ejecucin del siguiente fragmento de cdigo en C/C++:


int local;
void Producto (int & x, int & y) {
x = 2;
y = x+1;
local = local*x*y;
}

local = 1;
Producto(local,local);

a) La variable local vale 6


b) La variable local vale 0
c) La variable local vale 27
d) La variable local vale 9

RESPUESTA: La opcin correcta es la c).


Local comienza valiendo 1 y en ese momento se invoca el procedimiento producto pasndole por referencia local tanto como
parmetro x como parmetro y. En la primera lnea se ejecuta local = 2; en la segunda lnea se ejecuta local = local + 1 = 2
+ 1 = 3. Ahora local vale 3. En la tercera lnea se ejecuta local = local * local * local = 3*3*3 = 27
Tener en cuenta que al pasar por referencia en dos parmetros distintos cada vez que se modifica alguno de los parmetros
se est modificando la variable en s. Esto no ocurrira si el paso de argumento fuera por valor.
PREGUNTA: En el lenguaje C/C++, la sentencia: algo++;
Se puede utilizar:
a) En la parte declarativa pero no en la ejecutiva de un programa
b) En la parte ejecutiva pero no en la declarativa de un programa
c) Tanto en la parte declarativa como en la ejecutiva de un programa
d) Slo formando parte de un bucle for

RESPUESTA: la opcin correcta es la b. La pregunta parece simple, pero no lo es tanto. En primer lugar hay que saber que
algo no es una sentencia de C/C++, por tanto debe ser un nombre de variable. Si a una variable le aplicamos
nombreVar++; lo que hacemos es incrementar en una unidad su valor. La expresin algo++; equivale a algo = algo +1; En
la parte declarativa no tendra sentido usar esta sentencia as, a secas. Sin embargo podramos preguntarnos si una
expresin como int var = algo++; var = algo++; sera admisible. El resultado que obtenemos con el compilador es que no
se admite esta expresin ni en la parte declarativa ni en la ejecutiva. Lgico, si intentamos la traslacin de var = algo++;
obtendramos var = algo = algo+1; y esto no tendra sentido. Una expresin como algo++; debe aparecer individualmente,
no puede aparecer dentro de una asignacin ni de otra operacin excepto en un bucle for. En un for la expresin sera del
tipo for (int algo=1; algo<=limite; algo++) { }
PREGUNTA: El siguiente fragmento de cdigo en C/C++:
typedef int TipoVector[5];
TipoVector vector;
for(int i = 0; i <= i; i++){
printf("%d", vector[ i ]);
}
a) Ejecuta la sentencia de impresin 0 veces
b) Entra en un bucle infinito
c) Ejecuta la sentencia de impresin 1 vez
d) Ejecuta la sentencia de impresin 5 veces
RESPUESTA: la respuesta correcta es la b). Si nos fijamos se declara i = 0 y la condicin de ejecucin es que i sea menor o
igual que i. Como esto siempre va a ocurrir, el bucle intentar ejecutarse infinitas veces.

24

PREGUNTA: Cul de los siguientes rdenes de complejidad de crecimiento asinttico es ms eficiente?


a) O(log n)
b) O(n log n)

c) 0(n

d) O(2 )

RESPUESTA: la respuesta correcta es la a). Hay que tener en cuenta que el orden de complejidad indica cmo crece el coste
computacional (normalmente medido en trminos de tiempo que se requiere para ejecutar un algoritmo a medida que crece
el tamao de datos de entrada). El peor coste posible entre las opciones que se dan es el exponencial de la opcin d,
seguido por el cuadrtico de la opcin c y luego por el n-logartmico de la opcin b. El mejor coste entre los indicados es el
logartmico. Este indica que el coste de computacin crece logartmicamente con el tamao del problema n.

PREGUNTA: Dado el siguiente fragmento de programa en C/C++, con un valor de j positivo:


while (j > 0) { v[j] = v[j-1]; j--;}
Se produce:
a) La insercin de un nuevo elemento en el vector v
b) La bsqueda de un cierto elemento en el vector v
c) Un desplazamiento de los elementos del vector v
d) Un bucle que no finaliza nunca

RESPUESTA: La opcin correcta es la c).


Supongamos que j vale 2. Al entrar en el bucle v[2] = v[1] y j pasa a valer 1. Se repite el bucle y v[1]= v[0] y j pasa a valer
0. Como j no es mayor que cero no se repetira el bucle. La opcin a es incorrecta, no se produce la insercin de un nuevo
elemento en el vector. La opcin b es incorrecta, tampoco se produce una bsqueda de un cierto elemento en el vector v. La
opcin d es incorrecta, el bucle finalizar (en principio). La opcin c) s es correcta: los elementos se desplazan de modo que
el elemento de ndice superior toma el valor que tena el elemento de ndice inferior.

25

PREGUNTA: Dada la funcin posicion en C/C++:


typedef char Vchar[40];
int posicion(Vchar cad, char c){
int pos = -1; int i = 0;
while ( cad [i ] != '\0' ){
if(cad[i ] ==c){ pos = i;}
i++;
}
return(pos);
}
Si la llamamos con posicion("EJEMPLO DE", 'E'):
a) La funcin posicion devuelve 0
b) La funcin posicion devuelve 9
c) La funcin posicion devuelve 2
d) La funcin posicion devuelve -1

RESPUESTA: La respuesta correcta es la b). Nada trivial, adems los nombres de variables empleados pueden confundirnos
fcilmente. Analizamos el cdigo. En primer lugar declara un tipo Vchar que es un array de caracteres de 41 caracteres, una
cadena de texto. Luego declara una funcin denominada posicion que devuelve un entero y recibe dos parmetros: una
cadena de tipo Vchar, cad, y un carcter simple que viene en una variable denominada c. Declara dos variables locales, pos
y le asigna valor -1 y i con valor cero.
Ahora se ejecuta el bucle: mientras el elemento de ndice i, en primer lugar el de ndice cero, en la cadena, sea distinto del
carcter especial de final de cadena, si ese elemento del array contiene el carcter que viene en la variable c, el valor de
posicin en el array se almacena en la variable pos. i se incrementa unitariamente y se vuelve a repetir el bucle.
Nota sobre el significado de \0: El \0 es un carcter especial oculto que seala el final de una cadena en C/C++.
En resumen el bucle lo que hace es buscar el carcter que recibe en la llamada a la funcin dentro de la cadena que se le
pase. Si encuentra el carcter, la funcin almacena la ltima posicin en que se ha encontrado. Al terminar, devolver la
ltima posicin en que se encuentra el carcter dentro de la cadena. Si no encuentra el carcter, la funcin devolver menos
1. En este caso la cadena es EJEMPLO DE cuyas posiciones son 0123456789 y el carcter que se busca es la E
mayscula. La E se encuentra en posiciones 0, 2 y 9. Como la posicin 9 es la ltima que se encuentra, es la que devuelve
finalmente la funcin. El razonamiento no es demasiado complejo, pero deshacer este ovillo con la presin de un examen ya
es otro cantar. Un matiz que nos puede liar es que no es lo mismo 'c' que c, en el primer caso sera el carcter c y en el
segundo una variable de nombre c.

PREGUNTA: En el lenguaje C/C++, las unidades de compilacin son:


a) Slo el programa principal y el fichero de implementacin de los mdulos
b) Slo el fichero de implementacin de los mdulos
c) El programa principal, el fichero de interfaz y el fichero de implementacin de los mdulos
d) Slo el programa principal y el fichero de implementacin de los mdulos

RESPUESTA: La respuesta correcta es la c).


Esta preguntita se las trae en lata porque no hay razonamiento que valga (o casi), con lo cual o la sabemos de memoria o
no la sabemos. Y si no la sabemos tenemos un 75 % de posibilidades de fallar, con lo cual mejor no responderla. Adems
cuando repasamos el por qu de la respuesta, no es que sea lo que se dice algo claro y unvoco. Bien, el por qu se escoge
la respuesta c) est aqu: El mdulo principal (.ccp), el fichero interfaz (.h) y el fichero de implementacin de un mdulo
(.cpp) pueden considerarse unidades de compilacin en el sentido de que es posible invocar la compilacin de cada uno de
ellos por separado. En realidad a la hora de preparar una aplicacin slo se mandan compilar realmente los cpp, que son los
ficheros que generan cdigo objeto, mientras que los .h se cargan dentro de los cpp cuando son llamados. La inclusin de los
.h se hace en una fase inicial de la compilacin denominada preproceso.

26

PREGUNTA: Dado el siguiente fragmento de programa en C/C++:

const int v[],

Es una declaracin de:


a) Un argumento de tipo vector abierto
b) Una constante de tipo cadena
c) Un argumento de tipo cadena
d) Una constante de tipo vector abierto

RESPUESTA: La opcin correcta es la a). Puede resultar un poco confuso porque aparece el argumento aislado de la funcin,
pero veamos por qu elegir la a).
Tenemos que recordar que en C/C++ no se permite la declaracin de vectores abiertos, ni como variables ni como
constantes. La respuesta b) la descartamos porque ni es una constante ni aparece char para poder pensar que se trate de
una cadena. La respuesta c) la descartamos porque no se trata de un vector de char, que sera una cadena, sino un vector
de int (enteros). La respuesta d) la descartamos porque no es posible declarar constantes de tipo vector abierto (esto
concuerda con la lgica de C/C++, no tendra sentido que se permitiera declarar como constante algo que no tiene una
dimensin ni un valor!). Por descarte hemos llegado a que la a) es la respuesta correcta. A modo de recordatorio, diremos
que nombreFuncion (int v[], int n) hace que el vector abierto sea argumento de la funcin y se reciba por referencia. Si se
usa nombreFuncion (const int v[], int n) el vector se pasa por valor. El parmetro n debe traer la dimensin del vector que
se pasa a la funcin y es obligatorio excepto en el caso de vectores de char (cadenas), donde el carcter de final de cadena
\0 se usa como indicador de final de vector.
PREGUNTA: El uso de variables globales:
a) No tiene por qu evitarse
b) Slo puede evitarse mediante el paso de argumentos por valor
c) Slo puede evitarse mediante el paso de argumentos por referencia
d) Puede evitarse mediante el paso de argumentos por valor y por referencia

RESPUESTA:
Variables globales son las reconocidas en todo el mbito del programa.
Si pasamos argumentos por valor el argumento no se modifica durante la operacin de la funcin, lo que impide
"manipulaciones indeseadas" de la variable que se pasa.
Si pasamos argumentos por variable el argumento s se puede modificar durante la operacin de la funcin, lo que permite
que vare el valor de la variable que se pasa.
La pregunta no es demasiado clara. Vamos a tratar de razonar para responderla:
1) Idealmente el resultado de una funcin debe ser predecible de antemano en funcin de los argumentos que se le pasan. A
esto se le denomina transparencia referencial y se garantiza si la funcin utiliza solo elementos locales o mencionados en la
lista de argumentos. La funcin no debera usar variables globales porque pueden modificar el resultado de la funcin siendo
algo ajena a ella. Si un subprograma modifica una variable ajena se dice que est produciendo efectos secundarios o
laterales (side effects).
2) Idealmente todos los argumentos de funciones deberan pasarse por valor porque el objetivo de las funciones debera ser
devolver el resultado en funcin de unos argumentos y nada ms.
Pasar argumentos por valor no garantiza que no se usen variables globales dentro de una funcin. Pasar argumentos por
referencia idem.
El uso de variables globales no tiene por qu evitarse siempre que se haga de forma controlada y razonada.
Esta pregunta es confusa y por tanto daramos la respuesta a) al mismo tiempo que incluimos una explicacin adicional
(hoja adicional) indicando por qu hemos respondido esta opcin.

27

PREGUNTA: Respecto al nmero de elementos podemos afirmar que:


a) Las secuencias enlazadas son ilimitadas y las formaciones limitadas
b) Las secuencias enlazadas y las formaciones son limitadas
c) Las secuencias enlazadas y las formaciones son ilimitadas
d) Las secuencias enlazadas son limitadas y las formaciones ilimitadas

RESPUESTA:
Pregunta difcil de entender. Qu estn preguntando? Poco claro, y si no sabemos qu se pregunta dar una respuesta es
difcil. Voy a dar una respuesta haciendo una suposicin.
Si suponemos que con secuencias enlazadas se refieren a una estructura de datos enlazada a travs de punteros como una
lista enlazada, son ilimitadas ya que podemos aadir o eliminar elementos dinmicamente.
Si suponemos que con formaciones se refieren a arrays (vectores o matrices tradicionales), stos en C/C++ tienen un
tamao fijo y que no puede cambiar, por tanto diremos que son limitadas.
Respondemos por tanto la opcin a).
PREGUNTA: Las redes de operadores se utilizan en:
a) El modelo abstracto de cmputo funcional
b) El modelo abstracto de cmputo lgico
c) El modelo abstracto de cmputo imperativo
d) El modelo abstracto de cmputo flujo de datos

RESPUESTA: la opcin correcta es la d).


Pregunta difcil de responder puesto que para poder responderla hemos hacerlo por pura memorizacin. Para responderla
tenemos que recordar esto: El modelo de cmputo de flujo de datos hace que los programas se basen en un conjunto de
operadores (por ejemplo +, - , *, /, etc.) que forman una red. Cada operador se representa como un cuadrado con entradas
numricas y salidas (el resultado de aplicar el operador a las entradas)."

28

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