Autor Tema: Exámenes resueltos Fundamentos de programación UNED Ingeniería Informática 1ero  (Leído 87341 veces)

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
Nota:  He revisado las preguntas con vistas al curso 2018-2019 y en principio está todo "OK". De cualquier manera si encuentras alguna errata puedes escribirme tanto públicamente en el foro como por mensaje privado.

En este post se encuentran exámenes resueltos de la asignatura "Fundamentos de programación" de la UNED (Grado en Ingeniería Informática – Grado en Ingeniería de las Tecnologías de la Información). En general son interesantes pero a veces te parecerán absurdas o rebuscadas. He incluido las preguntas tipo test pero también la parte de problemas (parte de desarrollo del examen). Los exámenes constan de dos partes: una parte de preguntas tipo test y otra con un problema de programación en C/C++.

Algunas preguntas son de exámenes reales y otras son inventadas; por los comentarios tendrás pistas adicionales que te ayudarán a razonar la respuesta.

Otros post de interés para quienes busquen materiales:

Apuntes y recomendaciones para superar la asignatura "Fundamentos de Sistemas Digitales" del primer curso del Grado en Ingeniería Informática – Grado en Ingeniería de las Tecnologías de la Información de la UNED, que viene siendo una asignatura universitaria de introducción a la electrónica. Se pueden encontrar aquí: https://aprenderaprogramar.com/foros/index.php?topic=7066.0

Exámenes resueltos de la Asignatura "Fundamentos de sistemas digitales" del primer curso de Grado en Ingeniería Informática – Grado en Ingeniería de las Tecnologías de la Información de la UNED se puede encontrar aquí: https://www.aprenderaprogramar.com/foros/index.php?topic=6938.0

Exámenes resueltos de la Asignatura "Autómatas, gramáticas y lenguajes" del primer curso de Grado en Ingeniería Informática – Grado en Ingeniería de las Tecnologías de la Información de la UNED se puede encontrar aquí: http://www.aprenderaprogramar.com/foros/index.php?topic=638.0

Exámenes resueltos de la Asignatura "Programación orientada a objetos" del primer curso de Grado en Ingeniería Informática – Grado en Ingeniería de las Tecnologías de la Información de la UNED (lenguaje Java) se puede encontrar aquí: http://www.aprenderaprogramar.com/foros/index.php?topic=49.0

¡Gracias a todos los que envían comentarios y sugerencias!
« última modificación: 26 de Abril 2019, 23:18 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
PREGUNTA: En el lenguaje C±, la sentencia catch:

a) Agrupa las sentencias para el tratamiento de la excepción

b) Agrupa las sentencias para la detección de la excepción

c) Devuelve el resultado de la excepción

d) Devuelve el resultado de la excepción 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 excepción, es decir, nos sirve para agrupar las sentencias para el tratamiento de la excepción.
« última modificación: 20 de Marzo 2014, 10:18 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
uso sentencia printf en C mostrar numero con porcentaje
« Respuesta #2 : 17 de Noviembre 2012, 10:28 »
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 expresión %5.2f y %c\n no son interpretadas como textos a mostrar debido a que están precedidas del carácter especial %. Luego lo que aparece detrás de esta expresión %5.2f tiene el siguiente significado: 5 representa el número de espacios que ocupará la salida por pantalla, .2 representa el número de decimales con que se mostrará el valor numérico; f representa "fixed point" o tipo de valor que se va a mostrar es "número real";

Lo que aparece detrás de %c\n tiene el significado: c, se va a insertar un carácter (que será el símbolo %) y \n salto de línea y retorno de carro.

Esta pregunta es desde luego un poco enrevesada, posiblemente hasta los propios profesores fallaran a la hora de responderla. No hay otra opción que conocer bien el significado de cada cosa para poder responderla.
« última modificación: 20 de Marzo 2014, 10:18 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
operadores logicos en C/C++
« Respuesta #3 : 18 de Noviembre 2012, 21:50 »
PREGUNTA:  Si a = true y b = false, la expresión:

!(!(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). Pregunta con bastante mala idea ya que es bastante liosa mezclando símbolos. Es probable que terminemos con un dolor de cabeza después de haber estado un rato dándole vueltas. Hay que tener en cuenta que el orden de precedencia de los operadores es:

1º) Operadores unarios como ! y -
2º) Operadores multiplicativos *, /, %
3º) Operadores aditivos: +, -
4º) Comparación matemática: >, >=, <, <=
5º) Comparación de igualdad: ==, !=
6º) Conjunción &&
7º) Disyunción ||

Y también que dentro de un mismo nivel, la ejecución es de izquierda a derecha.

Si a= true y b=false y evaluamos la expresión inicial tenemos:

! ( !( true || false) && !(true))

!(true) devuelve false

x && false devuelve false, luego la expresión interior !(a || b) && !(a) devuelve false. Al tener toda la expresión negada, el resultado final es true.

La opción a) plantea true && false, que devuelve false, con lo cual no puede ser solución.

La opción b) plantea !(true || !false), lo interior devuelve true y el resultado global es false con lo cual no puede ser solución.

La opción c) plantea false || ... que devolverá false.

Conclusión: la opción correcta es la d), que nos permite obtener true (aparte del dolor de cabeza)  ???
« última modificación: 20 de Marzo 2014, 10:19 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
uso sentencia scanf con texto en c/c++
« Respuesta #4 : 19 de Noviembre 2012, 10:29 »
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 módulo de librería stdio. El dato solicitado se almacena en la variable indicada precedida del símbolo &, en este caso la variable es mes y el tipo de la variable no lo sabemos a priori. El término %2d indica que se espera un tipo entero (decimal es entero) con número de caracteres leídos o "tamaño 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 dígitos. scanf se suele utilizar sin texto (el texto se suele poner en un printf anterior) por lo que es fácil confundirse con esta pregunta.

En la opción a) se recibe mes3, es decir, mes y un dígito, lo que coincide con lo esperado.

La opción b) no es cierta porque si lo introducido por el usuario no corresponde a lo esperado la ejecución no es correcta.

La opción c) no es correcta porque no se recibe lo esperado.

La opción d) no es correcta porque la ejecución sí sería correcta, truncándose los dos últimos caracteres.

Pregunta  nada sencilla de responder, y además con cierta ambiguedad (porque la opción d) sería 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 después de mes es %d", mes);
    return 0;
}



« última modificación: 20 de Marzo 2014, 10:19 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
registros con variantes en C/C++ con union y struct
« Respuesta #5 : 20 de Noviembre 2012, 09:26 »
En el lenguaje C/C++, los registros con variantes necesitan:

a) Sólo la definición de un tipo struct

b) Sólo la definición de un tipo union

c) La definición de al menos un tipo struct y un tipo unión

d) La definición de varios tipos struct o bien de un único tipo union






RESPUESTA: la opción correcta es la c).

Hay ocasiones en que nos puede interesar que una variable funcione según las circunstancias como si fuese de un tipo u otro. En estos casos hacemos una declaración 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 opción c).
« última modificación: 20 de Marzo 2014, 10:20 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
paso de vectores abiertos por valor o referencia en C/C++
« Respuesta #6 : 21 de Noviembre 2012, 13:54 »
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 opción correcta es la a). En C/C++ no es posible declarar vectores abiertos (sin un número de elementos predefinido), pero sí es posible incluirlos como argumentos de subprogramas siempre que al mismo tiempo se pase como argumento al subprograma un parámetro que represente el número 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.
« última modificación: 20 de Marzo 2014, 10:20 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
uso de static en ficheros cpp de implementación
« Respuesta #7 : 22 de Noviembre 2012, 10:08 »
PREGUNTA: ¿Cuál de las siguientes funciones NO puede llamarse desde otro fichero de implementación en C/C++?

a) void mifuncion() { ... }

b) static void mifuncion() { ... }

c) extem void mifuncion() { ... }

d) const void mifuncion() { ... }






RESPUESTA: La opción correcta es la b). Llamamos módulo a un fragmento de un programa desarrollado de forma independiente. Para un programa podemos definir:

a) Un módulo de especificación (interfaz) que dice qué se hace (en C/C++, el fichero .h), es decir, define abstracciones.

b) Un módulo de realización (implementación) que define cómo se hace (en C/C++ fichero .cpp), donde se desarrollan las abstracciones declaradas.

La palabra clave static dentro de un módulo restringe la visibilidad de una variable o función al fichero fuente del módulo, de modo que esas variables o funciones no pueden ser llamadas desde fuera.
« última modificación: 20 de Marzo 2014, 10:20 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
valor para selección en sentencia switch C/C++
« Respuesta #8 : 23 de Noviembre 2012, 12:11 »
PREGUNTA: El valor que determina la selección en la sentencia switch en C/C++ no puede ser de tipo:

a) int

b) float

c) Enumerado

d) char






RESPUESTA: la opción 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.
« última modificación: 20 de Marzo 2014, 10:20 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
PREGUNTA:
Supongamos el fragmento de código en C/C++:

int a;
........ ........
void Func_1(int & b) {
a= 3;
b = a*b;
}
..........
a=2;
Func_1(a);


Después de la ejecución 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 opción correcta es la d). Un poco liosa la pregunta, vamos a verla con calma.

Lo primero a tener en cuenta es que la declaración de la función como void Func_1(int & b) supone que el parámetro b se pasa por referencia (siendo conocido y modificable dentro de la función, cosa que no ocurriría si lo pasáramos por valor).

Recorramos ahora el código. Se declara la variable entera a (queda con valor 0). Se define la función. Se hace la valor a igual a 2 y se invoca la función pasándole por referencia la variable a, con valor inicial 2.

En la función 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 parámetro que apunta por referencia a la variable a, con lo cual al modificarse el parámetro dentro de la función se está modificando la variable que se ha pasado por referencia. En consecuencia, al concluir la ejecución la variable a queda con valor 9.

Pregunta enredada, la clave está en ver que a la función le entra la variable a pasada por referencia, al ocurrir esto a y b dentro de la función 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 ejecución de la función, quedando la variable a con valor 9.  ::)
« última modificación: 20 de Marzo 2014, 10:21 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
sentencia continue en C/C++
« Respuesta #10 : 26 de Noviembre 2012, 08:27 »
PREGUNTA: En el lenguaje C/C++, la sentencia continue:

a) Finaliza la iteración en curso y el bucle

b) No se puede utilizar dentro de un bucle for

c) Finaliza la iteración en curso de un bucle

d) No se puede utilizar dentro de una sentencia condicional






RESPUESTA: La opción correcta es la c).
« última modificación: 20 de Marzo 2014, 10:21 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
Problema de examen tarjeta monedero .h .cpp y auxiliares
« Respuesta #11 : 26 de Noviembre 2012, 08:50 »
EJERCICIO DE PROGRAMACIÓN (PARTE PRÁCTICA DEL EXAMEN)

Realizar en C/C++ un TAD para gestionar una tarjeta monedero. La información de la tarjeta es el saldo y las 10 últimas operaciones. La información de cada operación es fecha (día-mes-año), cantidad (float) y tipo de operación (cargar, sacar, consultar). Las operaciones a realizar son:

1.- Cargar una cantidad.
2.- Sacar una cierta cantidad, si hay saldo disponible.
3.- Consultar el saldo y todas las últimas operaciones.




RESPUESTA: La solución está disponible en el archivo adjunto a este post (archivo problema_examen_feb_11_resuelto.pdf, pulsar sobre el nombre o icono para descargarlo estando logeado). En la solución tenemos varias partes:


Archivo tarjetamonedero.h: código del .h, el módulo de especificación o interfaz que define qué se hace.

Archivo tarjetamonedero.cpp: código del .cpp, el módulo de implementación que define cómo se hace.

Archivos para comprobación: código de lo que serían archivos que contienen código que no es necesario escribir en el examen, pero que son necesarios para poder ejecutar el programa. Cuando estemos estudiando o trabajando con nuestro ordenador es adecuado que después de escribir el código del .h y del .cpp escribamos el código necesario para poder ejecutar y comprobar que lo que hayamos preparado está bien. Los archivos para comprobación son: gestordefechas.h, gestordefechas.cpp y programa_principal_gestiontarjetas.cpp. Con estos archivos podemos hacer la ejecución en nuestro ordenador para comprobar que esté todo ok.

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
bucle en C/C++
« Respuesta #12 : 27 de Noviembre 2012, 09:28 »
PREGUNTA: Dado el siguiente bucle for en C/C++:

for (int i=-5; i>=-7; i--){
   printf (“Hola”);
}


El número de veces que aparecerá la palabra hola será:


a)   0

b)   3

c)   2

d)   Existe un error de tipos






RESPUESTA: la opción 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 condición y no se imprime hola.
« última modificación: 20 de Marzo 2014, 10:22 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
significado del símbolo & o ampersand en C/C++
« Respuesta #13 : 28 de Noviembre 2012, 08:20 »
En C/C++ el símbolo &:

a)   Es un símbolo que se utiliza para pasar argumentos por referencia.

b)   Es un identificador predefinido que se utiliza para declarar variables.

c)   Es un símbolo que se utiliza para pasar argumentos por valor.

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







RESPUESTA: La opción correcta es la a). Se usa para pasar argumentos a procedimientos o funciones por referencia. En caso de no incluirse & los argumentos se pasarían por valor.
« última modificación: 20 de Marzo 2014, 10:22 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
conocer el entero asociado a un carácter C/C++
« Respuesta #14 : 29 de Noviembre 2012, 08:35 »
PREGUNTA: En C/C++ para convertir el carácter 5 en el número entero correspondiente usaría la sentencia:

a) int('5') – int ('0')

b)   int ( int(5))

c)   int ('5')

d)   char(5)






RESPUESTA: la opción correcta es la c. Esto es una cuestión de mera sintaxis, un caracter en C/C++ se escribe entre comillas simples. Cada carácter tiene un número entero asociado, y esta es una forma para conocerlo. No es lo mismo el carácter '5' que el valor numérico 5.
« última modificación: 20 de Marzo 2014, 10:22 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
operador mod o resto de división en C/C++
« Respuesta #15 : 30 de Noviembre 2012, 08:33 »
PREGUNTA: En C/C++ ¿qué operación 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 opción correcta es la c). La a) la desechamos por no usar separador decimal el punto. La b) y d) usan el operador módulo o mod, que devuelve el resto de una división entre números enteros. Al intervenir en ambos casos números no enteros, no serían correctas. Nos queda como opción viable la c).
« última modificación: 20 de Marzo 2014, 10:22 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
programacion imperativa, funcional, logica y de flujo de datos
« Respuesta #16 : 03 de Diciembre 2012, 18:44 »
PREGUNTA: En C/C++ el modelo de programación que se sigue es:

a) El modelo de programación funcional

b) El modelo de programación imperativa

c) El modelo de programación de flujo de datos

d) El modelo de programación lógica





RESPUESTA: la opción correcta es la b). La programación funcional (p.ej. lenguaje Haskell), de flujo de datos (p.ej. labView) y lógica (p.ej. Prolog) corresponden a otros paradigmas y lenguajes.
« última modificación: 20 de Marzo 2014, 10:22 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
paso de variables por referencia en C/C++
« Respuesta #17 : 04 de Diciembre 2012, 08:26 »
PREGUNTA:

Supongamos el fragmento de código 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);



Después de la ejecución 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 opción correcta es la b). Recorramos el código. Las variables x, x2 y x3 se pasan por referencia al procedimiento ya que están precedidas del símbolo &. La llamada al procedimiento se realiza con A=4, B=1 e invocación CuaCubo (A, A, B) lo cual supone que x y x2 referencian a la misma posición de memoria. En la primera línea x2, que en nuestra invocación es A, pasa a valer x*x, que en nuestra invocación es A*A, resultando x2 = 4*4 = 16, y A=16. En la segunda línea x3 = A*A*A = 16*16*16 = 4096 y B= 4096. Conclusión: después de la ejecución 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.
« última modificación: 20 de Marzo 2014, 10:23 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
diferencias entre compilación e interpretación
« Respuesta #18 : 05 de Diciembre 2012, 08:21 »
PREGUNTA: La ejecución de un programa mediante interpretación cumple que...

a)   Es más lenta que mediante compilación y necesita al menos dos etapas de procesado

b)   Es más rápida que mediante compilación y necesita al menos dos etapas de procesado

c)   Es más lenta que mediante compilación y necesita sólo una etapa de procesado

d)   Es más rápida que mediante compilación y necesita sólo una etapa de procesado





RESPUESTA: La opción correcta es la c). El intérprete ha de realizar la transformación en código máquina y la ejecución, lo que lo hace más lento que disponer del código máquina ya compilado y proceder a su ejecución. C/C++ son lenguajes que usan compilación.
« última modificación: 20 de Marzo 2014, 10:23 de nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 391
    • Ver Perfil
programar con abstracciones favorece la reutilización
« Respuesta #19 : 07 de Diciembre 2012, 08:09 »
PREGUNTA:   La reutilización 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 opción correcta es la a). Las opciones b), c) y d) podríamos decir que no son una respuesta coherente. De todas formas esta pregunta ejem... ejem..., no tiene digamos que una redacción muy coherente en sí. Lo que sí es verdad es que el uso de abstracciones favorece la reutilización.
« última modificación: 20 de Marzo 2014, 10:23 de nosferacento »

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".