Documente Academic
Documente Profesional
Documente Cultură
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
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)
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;
}
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
b)
c)
d)
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)
b)
c)
d)
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.
A vale 16 y B vale 64
b)
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)
b)
c)
d)
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:
a)
b)
Solo ascendente
c)
Solo descendente
d)
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.
b)
c)
d)
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:
a)
!(! a || c || !b)
b)
!(! c || b && a)
c)
a && ! (a || ! c)
d)
a && ! c || b
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:
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;
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
10
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:
11
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
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
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
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
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
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
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:
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;};
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
a) La variable a vale 3
b) La variable a vale 2
c) La variable a vale 1
d) La variable a vale 0
#pragma once
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
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
21
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)
23
local = 1;
Producto(local,local);
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
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.
25
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.
26
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
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
28