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

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
ejemplo código C/C++ pasando variables por referencia
« Respuesta #80 en: 08 de Julio 2013, 09:24 »
PREGUNTA: Tras la ejecución del siguiente fragmento de código 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 opción correcta es la c).

Local comienza valiendo 1 y en ese momento se invoca el procedimiento producto pasándole por referencia local tanto como parámetro x como parámetro y. En la primera línea se ejecuta local = 2; en la segunda línea se ejecuta local = local + 1 = 2 + 1 = 3. Ahora local vale 3. En la tercera línea se ejecuta local = local * local * local = 3*3*3 = 27

Tener en cuenta que al pasar por referencia en dos parámetros distintos cada vez que se modifica alguno de los parámetros se está modificando la variable en sí. Esto no ocurriría si el paso de argumento fuera por valor.
« Última modificación: 20 de Marzo 2014, 10:36 por nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
EJERCICIO DE PROGRAMACIÓN (PARTE PRÁCTICA DEL EXAMEN)

Realizar en C/C++ un TAD, con fichero de interfaz y de implementación, capaz de contener los siguientes datos de 50 personas: Nombre, Primer Apellido, Segundo Apellido, Estado civil (soltero, casado, divorciado) y edad. El TAD dispondrá de los siguientes subprogramas: MayoresDe, que recibe como entrada un número natural e imprime por pantalla los datos de aquellas personas cuya edad sea mayor o igual que la solicitada; ContEstadoCivil, que recibe como entrada un estado civil y devuelve el número de personas que tienen ese estado civil; GuardarNuevo, que recibe los datos de una nueva persona y los almacena en el TAD.

Nota: este fue el ejercicio de examen de febrero de 2013, 2ª semana, tipo B.




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

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

Archivo arrayPersonas.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. El archivo para comprobación es: programa_arrayPersonas.cpp. Con este archivo podemos hacer la ejecución en nuestro ordenador para comprobar que esté todo ok.



siarcrpg

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Muchisimas gracias por tu esfuerzo; no sabes la ayuda que nos das con tus explicaciones.

GRACIAS!!!!!!!!

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
Agradezco todos los mensajes que me haceis llegar, si no hubiera "feedback" creo que habría abandonado; me tomo mis descansos pero continuo. Saludos.

elasfaltoesgris

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Soy consciente de que te mereces tus descansos pero por favor, no los dilates demasiado.
Me asomo todos los dias a este foro para comprobar si has subido algo nuevo.
Un saludo.

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
Creo que igual ya eres más experta que yo en C/C++  ;) tratando de retomar el hilo, pasemos a otra pregunta.

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) Sólo formando parte de un bucle for







RESPUESTA: la opción 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 expresión algo++; equivale a algo = algo +1; En la parte declarativa no tendría sentido usar esta sentencia así, a secas. Sin embargo podríamos preguntarnos si una expresión como int var = algo++; ó var = algo++; sería admisible. El resultado que obtenemos con el compilador es que no se admite esta expresión ni en la parte declarativa ni en la ejecutiva. Lógico, si intentamos la traslación de var = algo++; obtendríamos var = algo = algo+1; y esto no tendría sentido. Una expresión como algo++; debe aparecer individualmente, no puede aparecer dentro de una asignación ni de otra operación excepto en un bucle for. En un for la expresión sería del tipo for (int algo=1; algo<=limite; algo++) { … }


« Última modificación: 20 de Marzo 2014, 10:36 por nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
bucle infinito en C/C++ con un for
« Respuesta #86 en: 31 de Agosto 2013, 00:10 »
PREGUNTA: El siguiente fragmento de código 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 impresión 0 veces
b) Entra en un bucle infinito
c) Ejecuta la sentencia de impresión 1 vez
d) Ejecuta la sentencia de impresión 5 veces








RESPUESTA: la respuesta correcta es la b). Si nos fijamos se declara i = 0 y la condición de ejecución es que i sea menor o igual que i. Como esto siempre va a ocurrir, el bucle intentará ejecutarse infinitas veces.
« Última modificación: 20 de Marzo 2014, 10:36 por nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
ordenes de complejidad y eficiencia computacional
« Respuesta #87 en: 01 de Septiembre 2013, 00:25 »
PREGUNTA: ¿Cuál de los siguientes órdenes de complejidad de crecimiento asintótico es más eficiente?

a) O(log n)
b) O(n log n)
c) 0(n2 )
d) O(2n)







RESPUESTA: la respuesta correcta es la a). Hay que tener en cuenta que el orden de complejidad indica cómo crece el coste computacional (normalmente medido en términos de tiempo que se requiere para ejecutar un algoritmo a medida que crece el tamaño de datos de entrada). El peor coste posible entre las opciones que se dan es el exponencial de la opción d, seguido por el cuadrático de la opción c y luego por el n-logarítmico de la opción b. El mejor coste entre los indicados es el logarítmico. Este indica que el coste de computación crece logarítmicamente con el tamaño del problema n.


« Última modificación: 20 de Marzo 2014, 10:37 por nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
bucle while con vectores en C/C++
« Respuesta #88 en: 02 de Septiembre 2013, 00:05 »
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 inserción de un nuevo elemento en el vector v
b) La búsqueda 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 opción 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 repetiría el bucle. La opción a es incorrecta, no se produce la inserción de un nuevo elemento en el vector. La opción b es incorrecta, tampoco se produce una búsqueda de un cierto elemento en el vector v. La opción d es incorrecta, el bucle finalizará (en principio). La opción c) sí es correcta: los elementos se desplazan de modo que el elemento de índice superior toma el valor que tenía el elemento de índice inferior.

« Última modificación: 20 de Marzo 2014, 10:37 por nosferacento »

chasq

  • Sin experiencia
  • *
  • Mensajes: 1
    • Ver Perfil
Re:Preguntas examen Fundamentos de programación UNED Ingeniería Informática
« Respuesta #89 en: 02 de Septiembre 2013, 17:41 »
Mil gracias por tus aportes!!!
Son una estupenda ayuda para esta asignatura.Espero que te plantees ser profesor...
 :) :) :)

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
Re:Preguntas examen Fundamentos de programación UNED Ingeniería Informática
« Respuesta #90 en: 03 de Septiembre 2013, 00:28 »
Con el tiempo, quién sabe  ::). Aunque ser profesor es algo que bajo mi punto de vista conlleva una gran responsabilidad. Por eso se agradecen tanto los buenos profesores y se sufre tanto con los malos, que de todo hay. Como siempre agradezco los comentarios (sobre todo si son positivos  ;D), en este caso los tuyos en particular.

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
bucle while de búsqueda de un elemento en vector con C/C++
« Respuesta #91 en: 04 de Septiembre 2013, 00:16 »
PREGUNTA: Dada la función 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 función posicion devuelve 0
b) La función posicion devuelve 9
c) La función posicion devuelve 2
d) La función posicion devuelve -1








RESPUESTA: La respuesta correcta es la b). Nada trivial, además los nombres de variables empleados pueden confundirnos fácilmente. Analizamos el código. En primer lugar declara un tipo Vchar que es un array de caracteres de 41 caracteres, una cadena de texto. Luego declara una función denominada posicion que devuelve un entero y recibe dos parámetros: una cadena de tipo Vchar, cad,  y un carácter 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 carácter especial de final de cadena, si ese elemento del array contiene el carácter que viene en la variable c, el valor de posición 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 carácter especial oculto que señala el final de una cadena en C/C++.

En resumen el bucle lo que hace es buscar el carácter que recibe en la llamada a la función dentro de la cadena que se le pase. Si encuentra el carácter, la función almacena la última posición en que se ha encontrado. Al terminar, devolverá la última posición en que se encuentra el carácter dentro de la cadena. Si no encuentra el carácter, la función devolverá menos 1. En este caso la cadena es “EJEMPLO DE” cuyas posiciones son “0123456789” y el carácter que se busca es la E mayúscula. La E se encuentra en posiciones 0, 2 y 9. Como la posición 9 es la última que se encuentra, es la que devuelve finalmente la función. El razonamiento no es demasiado complejo, pero deshacer este ovillo con la presión 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 sería el carácter c y en el segundo una variable de nombre c.
« Última modificación: 20 de Marzo 2014, 10:38 por nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
concepto de unidad de compilación en C/C++
« Respuesta #92 en: 06 de Septiembre 2013, 18:18 »
PREGUNTA:  En el lenguaje C/C++, las unidades de compilación son:

a) Sólo el programa principal y el fichero de implementación de los módulos

b) Sólo el fichero de implementación de los módulos

c) El programa principal, el fichero de interfaz y el fichero de implementación de los módulos

d) Sólo el programa principal y el fichero de implementación de los módulos








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. Además cuando repasamos el por qué de la respuesta, no es que sea lo que se dice algo claro y unívoco. Bien, el por qué se escoge la respuesta c) está aquí: “El módulo principal (.ccp), el fichero interfaz (.h) y el fichero de implementación de un módulo (.cpp) pueden considerarse unidades de compilación en el sentido de que es posible invocar la compilación de cada uno de ellos por separado. En realidad a la hora de preparar una aplicación sólo se mandan compilar realmente los cpp, que son los ficheros que generan código objeto, mientras que los .h se cargan dentro de los cpp cuando son llamados. La inclusión de los .h se hace en una fase inicial de la compilación denominada preproceso.”

Hemos omitido algo de texto para no liarla más. Mejor pasar a la siguiente.
« Última modificación: 20 de Marzo 2014, 10:38 por nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
vector abierto en C/C++ uso con const
« Respuesta #93 en: 07 de Septiembre 2013, 14:56 »
PREGUNTA: Dado el siguiente fragmento de programa en C/C++:     const int v[],

Es una declaración 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 opción correcta es la a). Puede resultar un poco confuso porque aparece el argumento aislado de la función, pero veamos por qué elegir la a).
Tenemos que recordar que en C/C++ no se permite la declaración 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 sería 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 lógica de C/C++, ¡no tendría sentido que se permitiera declarar como constante algo que no tiene una dimensión 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 función y se reciba por referencia. Si se usa nombreFuncion (const int v[], int n) el vector se pasa por valor. El parámetro n debe traer la dimensión del vector que se pasa a la función y es obligatorio excepto en el caso de vectores de char (cadenas), donde el carácter de final de cadena ‘\0’ se usa como indicador de final de vector.
« Última modificación: 20 de Marzo 2014, 10:38 por nosferacento »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
uso de variables globales en programas
« Respuesta #94 en: 09 de Diciembre 2013, 11:52 »
PREGUNTA: El uso de variables globales:

a) No tiene por qué evitarse
b) Sólo puede evitarse mediante el paso de argumentos por valor
c) Sólo 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 operación de la función, lo que impide "manipulaciones indeseadas" de la variable que se pasa.

Si pasamos argumentos por variable el argumento sí se puede modificar durante la operación de la función, lo que permite que varíe 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 función debe ser predecible de antemano en función de los argumentos que se le pasan. A esto se le denomina transparencia referencial y se garantiza si la función utiliza solo elementos locales o mencionados en la lista de argumentos. La función no debería usar variables globales porque pueden modificar el resultado de la función 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 deberían pasarse por valor porque el objetivo de las funciones debería ser devolver el resultado en función de unos argumentos y nada más.

Pasar argumentos por valor no garantiza que no se usen variables globales dentro de una función. 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 daríamos la respuesta a) al mismo tiempo que incluimos una explicación adicional (hoja adicional) indicando por qué hemos respondido esta opción.

« Última modificación: 20 de Marzo 2014, 10:39 por nosferacento »

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:Preguntas examen Fundamentos de programación UNED Ingeniería Informática
« Respuesta #95 en: 20 de Diciembre 2013, 00:57 »
Hola Gracias por tomarte el tiempo para ayudarnos, son excelentes tus explicaciones y han sido de gran ayuda.
Un saludo

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
Re:Preguntas examen Fundamentos de programación UNED Ingeniería Informática
« Respuesta #96 en: 20 de Diciembre 2013, 22:06 »
Gracias mil, como siempre digo sólo paro para coger carrerilla. Suerte a todos los que están estudiando!

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
concepto de secuencia enlazada y formación en C/C++ (lenguajec, cplusplus)
« Respuesta #97 en: 20 de Marzo 2014, 10:44 »
PREGUNTA: Respecto al número 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 difícil de entender. ¿Qué están preguntando? Poco claro, y si no sabemos qué se pregunta dar una respuesta es difícil. Voy a dar una respuesta haciendo una suposición.

Si suponemos que con secuencias enlazadas se refieren a una estructura de datos enlazada a través de punteros como una lista enlazada, son ilimitadas ya que podemos añadir o eliminar elementos dinámicamente.

Si suponemos que con formaciones se refieren a arrays (vectores o matrices tradicionales), éstos en C/C++ tienen un tamaño fijo y que no puede cambiar, por tanto diremos que son limitadas.

Respondemos por tanto la opción a).
« Última modificación: 11 de Mayo 2015, 19:06 por Alex Rodríguez »

nosferacento

  • Moderador Global
  • Avanzado
  • *******
  • Mensajes: 440
    • Ver Perfil
redes de operadores y modelo abstracto de cómputo
« Respuesta #98 en: 31 de Marzo 2014, 09:57 »
PREGUNTA: Las redes de operadores se utilizan en:

a) El modelo abstracto de cómputo funcional

b) El modelo abstracto de cómputo lógico

c) El modelo abstracto de cómputo imperativo

d) El modelo abstracto de cómputo flujo de datos







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

Pregunta difícil de responder puesto que para poder responderla hemos hacerlo por pura memorización. Para responderla tenemos que recordar esto: “El modelo de cómputo 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 numéricas y salidas (el resultado de aplicar el operador a las entradas)."

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

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".