Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - nosferacento

Páginas: 1 ... 6 7 8 9 10 [11] 12 13 14 15 16 ... 23
201
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.

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

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

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

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


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



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

208
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++) { … }



209
Agradezco todos los mensajes que me haceis llegar, si no hubiera "feedback" creo que habría abandonado; me tomo mis descansos pero continuo. Saludos.

210
Comunidad / Re:Mentiras, grandes mentiras y estadísticas
« en: 02 de Agosto 2013, 12:29 »
"La inflación es el impuesto de los pobres"


211
Comunidad / Re:Mentiras, grandes mentiras y estadísticas
« en: 29 de Julio 2013, 17:19 »
"Un New York Times del fin de semana tiene más información que la que recibía un campesino en la Edad Media en toda su vida"

Esto no me lo creo, pero sí es verdad que vivimos saturados de información escrita o audiovisual.

212
Comunidad / Re:Mentiras, grandes mentiras y estadísticas
« en: 18 de Julio 2013, 18:17 »
Einstein decía "La información no es conocimiento" y "La educación es lo que nos queda cuando salimos del colegio y olvidamos todo lo que hemos aprendido"


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



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

215
PREGUNTA: Cuando un argumento se pasa por referencia en C/C++:

a) No se podrá usar una expresión como argumento real

b) No se puede modificar el argumento real en el subprograma

c) Es siempre una variable global

d) Sólo puede ser de tipo entero







RESPUESTA: La opción correcta es la a)

El argumento real es el valor o expresión 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 pasándole una variable o una expresión, o un número, un carácter, 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 expresión ya que esto no tendría sentido en un paso por referencia.

La opción b) es falsa, si se pasa por referencia, el argumento real que es la variable sí se puede modificar en el subprograma.
La opción c) no es cierta, no tiene por qué ser una variable global.
La opción d) no es cierta, no tiene por qué ser un tipo entero, puede ser otro tipo.


216
PREGUNTA:  Si a = true, b = true, y c = true, ¿cuál de las siguientes expresiones se evalúa como verdadera?

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

b)   a && !c || b

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

d)   a && !(a || !c)







RESPUESTA: La opción correcta es la b). Veamos por qué.

Para la opción a) empezamos evaluando por partes. !a es false, c es true y !b es false. Por tanto dentro del paréntesis tenemos (false OR true OR false) y esto es true. Al aplicar la negación el resultado es que a) resulta false.

Para la opción b) tenemos true AND false OR true. Debemos recordar la prioridad de operadores que es conjunción > disyunción. Por tanto hacemos true AND false resultando false. false OR true es lo que evaluamos a continuación por lo que resulta true.

Para la opción c) tenemos dentro del paréntesis (false OR true AND true) que resulta (true AND true) que resulta true. Con la negación inicial obtenemos false.

Para la opción d) tenemos dentro del paréntesis (true OR false) que resulta true, pero con la negación que precede al paréntesis queda en false. Ahora nos queda true AND false resultando false.

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

void Uno(Dos Tres, Cuatro Cinco)


a) Uno es un identificador de función

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 difícil de entender. Dado que los nombres son bastante confusos, si le ponemos nombres razonables es más fácil responder a esta pregunta. Por ejemplo: void Calcular (int Preciokg, double Pesokg) sería una posible declaración de procedimiento. Calcular es un identificador de procedimiento, no de función, luego la respuesta a) es falsa. ¿Preciokg y Pesokg pueden ser el mismo identificador? En principio diremos que no porque son parámetros a usar en el procedimiento y habría una colisión 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 función luego la c) es falsa. ¿Dos y Cuatro pueden ser el mismo identificador? Podríamos escribir void Calcular (double Preciokg, double Pesokg) de modo que Dos y Cuatro serían el mismo identificador. Respondemos esta por descarte de las anteriores, porque si quisiéramos darle vueltas nos podríamos aquí pasar un rato discutiendo… para llegar a la conclusión de que este enunciado es un tanto confuso, y por tanto no merece la pena pararse demasiado en él  ::)

218
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 opción 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;
};


Además 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…


219
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 comprensión de un programa








RESPUESTA: la opción 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 comprensión no tiene que ver con la complejidad ya que un programa donde los nombres de variables están deliberadamente puestos para confundir puede ser muy difícil de comprender y sin embargo su complejidad computacional ser baja.

También podemos responder si recordamos la definición de complejidad: la función de complejidad es aquella que nos indica la eficiciencia de un programa (generalmente medida en términos de tiempo de ejecución) en función del tamaño del problema.



220
PREGUNTA: Dada la siguiente función 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 opción correcta es la c), la llamada devuelve 10.

Esta pregunta es un tanto compleja porque es un caso de recursión (función que se llama a sí misma). No te desesperes si no lo ves a la primera porque la recursión es algo trabajoso incluso para programadores con muchos años de experiencia. En esta función el caso base que da lugar a la terminación de la recursión es que el parámetro pasado valga cero. Para analizar la recursión tenemos:

Primera invocación: no estamos en el caso base ya que x vale 5 y el resultado obtenido es 5 + suma(4) -1

Segunda invocación: el resultado obtenido es 4 + suma(3) -1

Tercera invocación: el resultado obtenido es 3 + suma(2) -1

Cuarta invocación: el resultado obtenido es 2 + suma(1) – 1

Quinta invocación: 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 invocación: 2 + 0 – 1 = 1

Salida de la tercera invocación: 3 + 1 -1 = 3

Salida de la segunda invocación: 4 + 3 -1 = 6

Salida de la primera invocación: 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.

Páginas: 1 ... 6 7 8 9 10 [11] 12 13 14 15 16 ... 23

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