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 ... 7 8 9 10 11 [12] 13 14 15 16 17 ... 23
221
PREGUNTA: La programación estructurada sugiere el uso de tres esquemas generales denominados:

a) Secuencia, selección y objetos
b) Selección, recursividad y objetos
c) Secuencia, selección y recursividad
d) Secuencia, selección e iteración







RESPUESTA: La opción correcta es la d). Esta pregunta es básica, quien no la tenga clara es que le falta estudio o práctica!



222
PREGUNTA: ¿Qué se muestra por pantalla después de ejecutar el siguiente código en C/C++?

#include <stdio.h>

int main(){

int i, j;
i = 0;
j = 12;
do {
printf("%d-" ,i*j);
i = i+2;
j = j-2;
} while(i != j);
}


a)  0-16-24-

b) 0-20-32-

c) 0-20-24-

d) Se ejecuta infinitamente







RESPUESTA: la respuesta correcta es la b), se muestra 0-20-32-

Analicemos por qué. Inicialmente i vale cero y j vale 12. Comienza el bucle do y se muestra por pantalla el resultado de la operación 0*12 seguido de un guión, es decir, 0-.

A continuación i vale 2  y j vale 10. Se evalúa la condición del bucle y al ser i distinto de j se produce la repetición. En esta pasada se muestra 2*10 que es 20 junto al guión, 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 guión y ya tenemos 0-20-32-.

Ahora i vale 6 y j vale 6. Al ser iguales no cumplen la condición de repetición y la ejecución termina.

Esta pregunta es básica, quien no la tenga clara es que le falta estudio o práctica!


223
Continuamos con otra tanda de 10 preguntas y problema de examen.

PREGUNTA: En C/C++, cuando se utiliza:         #pragma once


a) Se debe indicar un nombre del módulo
b) Tenemos una directiva del programa
c) Es una declaración del módulo
d) Hay una expresión del programa







RESPUESTA:

Un fichero .h (interfaz de un TAD) debe comenzar con las palabras clave #pragma once. ¿Pero qué es pragma once y para qué sirve? En los lenguajes de programación C y C++, #pragma once es una directiva del preprocesador. Está diseñada para asegurar que el código no se cargue múltiples veces, sino solo una vez, aunque sea invocado muchas veces.

La opción a) es falsa. Las opciones b, c y d podríamos decir que son un tanto confusas en el enunciado. La opción d) vamos a considerarla no válida ya que no se trata de una “expresión”, sino en todo caso de una directiva o una declaración. Suponiendo que el término declaración lo reservamos para declarar variables, constantes, etc. responderíamos la opción b). No obstante, ante preguntas que se vean de enunciado “dudoso” recomendamos incluir una hoja de aclaración 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 después en caso de que efectivamente se pueda considerar que la redacción 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 quizás no tengamos claro si puede haber un error en el enunciado de la pregunta, de ahí el comentario que hemos hecho.

224
Sí, sí, claro que continuo... si ves la fecha del primer post sobre la asignatura POO es de « : 04 de Septiembre 2011, 11:14 », es decir, que voy ampliando el catálogo poco a poco. El asunto es que tengo que ir sacando tiempo en ratos libres para hacer esto, de ahí que no pueda ir más rápido  :-\, pero iré subiendo más cosas, entre ellas más ejercicios resueltos de programación de la parte práctica del examen  ;)


225
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 almacenar hasta 50 valores enteros. El TAD dispondrá de un único subprograma: Moda, que devuelve la moda de los números enteros almacenados en el TAD. Por ejemplo, la moda de {1,6,2,5,4,2,1,3,4,2} es 2 porque es el valor que aparece más veces (3 veces). En caso de que haya varias modas, se devolverá una cualquiera de ellas.

Nota: este fue el ejercicio de examen de febrero de 2013 (1ª semana, tipo A)


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


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

Archivo arrayConModa.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_arrayConModa.cpp. Con este archivo podemos hacer la ejecución en nuestro ordenador para comprobar que esté todo ok.

Nota: leer los comentarios adicionales incluidos en el pdf para tener una mejor orientación de cómo afrontar un problema de este tipo en situación de examen "real".


227
Gracias a Array por sus aportaciones para el foro.

PREGUNTA: ¿Cuál es la diferencia entre sobrecarga y sobreescritura?


RESPUESTA:

Si revisamos las definiciones formales de sobrecarga y sobreescritura tendríamos:

Sobrecarga: Cuando más de un constructor o método tienen el mismo nombre pero distintos parámetros decimos que el constructor o método está sobrecargado. La sobrecarga de constructores o métodos permite llevar a cabo una tarea de distintas maneras (por ejemplo crear un objeto Persona con un nombre ya establecido o crearlo sin nombre establecido).

Sobreescritura: Decimos que un método está sobreescrito cuando está presente, exactamente con la misma signatura, en una subclase y en una superclase.

228
¿Qué tal? Supongo que sacas el examen de septiembre de 2012 porque estás estudiando para la convocatoria de junio de 2013, así que suerte. Voy a ver si puedo revisar las respuestas para ver si coincidimos.

Para empezar con la pregunta 7 (revisada, gracias a Array):

Dada la siguiente instrucción: x = y--;
¿Cuál de las siguientes afirmaciones es verdadera después de ejecutarse la instrucción?

a) La instrucción da un error de compilación
b) x > y
c) x == y
d) x < y


RESPUESTA:

Parece una pregunta tonta pero si ejecutamos este código seguramente deje de parecerlo:

int x=1;
int y = 3;
x = y--;
System.out.println ("x vale " + x);
System.out.println ("y vale " + y);

El resultado es x vale 3, y vale 2.

En cambio si ejecutamos:

int x=1;
int y = 3;
x = --y;
System.out.println ("x vale " + x);
System.out.println ("y vale " + y);

El resultado es x vale 2, y vale 2.

La respuesta correcta es por tanto (una vez revisada, gracias a Array) la b), es decir, x > y.

La justificación la dan en los Java tutorials así:

The increment/decrement operators can be applied before (prefix) or after (postfix) the operand. The code result++; and ++result; will both end in result being incremented by one. The only difference is that the prefix version (++result) evaluates to the incremented value, whereas the postfix version (result++) evaluates to the original value. If you are just performing a simple increment/decrement, it doesn't really matter which version you choose. But if you use this operator in part of a larger expression, the one that you choose may make a significant difference.

Lo cual viene a decir que en una asignación tipo k = t++; primero se ejecuta k = t y luego se ejecuta t++, quedando k y t con distintos valores.

En cambio en una asignación tipo k = ++t; primero se ejecuta ++t y luego k = t quedando k y t con iguales valores.

El caso es que si yo estoy programando escribo k = t+1; y me quedo tranquilo. Pero para el examen habrá que tener esto en cuenta por si acaso.


229
PREGUNTA: Tras la ejecución del siguiente fragmento de código en C/C++:

int a;

void proc (int &b, int &c){
b = 2;
c = a%2;
b = a+b * c;
}

a = 1;
proc (a,a);
printf ("Variable a = %d , a);



a) La variable a vale 3

b) La variable a vale 2

c) La variable a vale 1

d) La variable a vale 0







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

Analicemos el código, empezando por el procedimiento proc. Este procedimiento recibe dos parámetros que se pasan por variable: parámetros b y c. El parámetro b (y la variable asociada) toman valor 2. A continuación el parámetro c (y la variable asociada) toman el valor del resto de dividir el valor que tenga la variable a entre 2, que puede ser 0 si a es par ó 1 si a es impar. En este caso a se declara en la parte inferior del código y vale 1, es decir, es impar, con lo cual c toma valor 1. A continuación se establece que b es igual a -- > a+b*c que será en nuestro caso 1+b*1, es decir, b termina con un valor igual a b+1 mientras que c termina con un valor 1.

El problema o dificultad radica en que el procedimiento se invoca pasándole a como parámetro con lo cual tenemos que atender a lo que pasa a medida que evoluciona el código. Dado que a se pasa por referencia tanto como parámetro b como como parámetro c, a será sobreescrita cada vez que se modifique b o c. En la primera línea b = 2 con lo cual a toma valor 2. En la segunda línea del procedimiento c = 2%2 = 0 con lo cual a toma valor cero; En la tercera línea b toma valor a + b*c = 0 + b * 0 = 0, con lo cual a=0, b=0, c=0. Un poco lioso, pero analizándolo con detenimiento se puede sacar.


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

typedef struct Uno{Dos Tres; Cuatro Cinco;};



a) Uno y Cuatro son identificadores de tipo

b) Tres y Cinco son identificadores de tipo

c) Dos y Cinco son identificadores de tipo

d) Uno y Tres son identificadores de tipo







RESPUESTA: la opción 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 opción b) es incorrecta porque Tres no es un identificador de tipo, sino un nombre o identificador de variable. La opción c) no es correcta porque Cinco no es un identificador de tipo, sino un nombre o identificador de variable. La opción 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.

231
PREGUNTA: El modelo de programación lógica:


a) Imita la arquitectura de Von Newmann

b) Se basa en el uso de funciones

c) Se basa en la declaración de hechos y reglas

d) Es el que utiliza C/C++







RESPUESTA: La opción correcta es la c). La programación lógica es un tipo de programación declarativa: se basa en declarar hechos y reglas que permiten resolver, por inferencia lógica, un problema. Es un tipo de programación bastante peculiar (y con más uso en investigación que en el mercado laboral donde prácticamente no se trabaja con ella).

232
PREGUNTA: ¿Qué características tienen los elementos locales?


a) Son visibles en su ámbito y fuera

b) Son invisibles en su ámbito y fuera

c) Son invisibles en su ámbito y visibles fuera

d) Son visibles en su ámbito e invisibles fuera







RESPUESTA: La opción 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) también. Un "elemento local" típico es una variable declarada dentro de una función. Puede haber algo de confusión si pensamos en parámetros (que se pueden pasar por valor o por referencia), pero el asunto aquí está en pensar que un parámetro es un parámetro y un elemento local una variable local.


233
Aprender a programar desde cero / Re:Listas enlazadas
« en: 12 de Marzo 2013, 12:14 »
Yo creo también que no es código Java ¿De qué libro y asignatura estamos hablando? Aquí te dejo un ejemplo simplificado de lista enlazada codificada en Java. Son pocas líneas de código pero entenderlas suele llevar un buen rato. Las claves están en que:

- La estructura de datos (la clase) es recursiva, contiene una referencia a un objeto del mismo tipo que define la clase.


- Al añadir un elemento a la lista hace falta que first tome el valor u objeto a añadir y que la cola (tail) pase a ser lo que antes era la lista (para ello necesitamos crear una lista nueva que sea una copia de la lista existente antes de añadir el elemento)

- Tenemos que recorrer la lista recursivamente para mostrarla

Código de la clase (simplificación de lista enlazada):

Código: [Seleccionar]
public class listaEnlazadaEnteros<Integer> {

    private Integer first;
    private listaEnlazadaEnteros<Integer> tail;
    //https://www.aprenderaprogramar.com/foros/index.php?topic=503.0

    //Construye una lista enlazada vacía
    listaEnlazadaEnteros() {
        first = null;
        tail = null;
    }

    public boolean isEmpty () {
        if ( first==null && tail ==null ) {return true;} else {return false;}
    }

    public void addElement (Integer element) {
        listaEnlazadaEnteros<Integer> siguiente = new listaEnlazadaEnteros<Integer>();
        siguiente.first = first;
        siguiente.tail = tail;
        first = element;
        tail = siguiente;
    }

    public String toString (listaEnlazadaEnteros<Integer> listaRecibida) {

        if (listaRecibida.getFirst() == null && listaRecibida.getTail() == null) { return "fin";}
        else if (listaRecibida.getFirst() != null && listaRecibida.getTail() == null) { return listaRecibida.getFirst().toString();}
        else { return listaRecibida.getFirst().toString() + ", " + toString(listaRecibida.getTail());}

    }

    public Integer getFirst() { return first;}

    public listaEnlazadaEnteros getTail() { return tail;}

}

Código test para hacer pruebas:

Código: [Seleccionar]
public class testListaEnlazada {
    //https://www.aprenderaprogramar.com/foros/index.php?topic=503.0

    public static void main (String [] Args) {

        listaEnlazadaEnteros listaTest = new listaEnlazadaEnteros();

        System.out.println ("Representación de la lista enlazada: "+ listaTest.toString(listaTest));
        listaTest.addElement(Integer.valueOf(3));
        System.out.println ("Representación de la lista enlazada: "+ listaTest.toString(listaTest));
        listaTest.addElement(Integer.valueOf(-5));
        System.out.println ("Representación de la lista enlazada: "+ listaTest.toString(listaTest));
        listaTest.addElement(Integer.valueOf(64));
        listaTest.addElement(Integer.valueOf(8));
        System.out.println ("Representación de la lista enlazada: "+ listaTest.toString(listaTest));
    }

}


234
Aprender a programar desde cero / Re:Valor y referencia en Java
« en: 11 de Marzo 2013, 14:59 »
Mírate esto: https://www.aprenderaprogramar.com/foros/index.php?topic=49.msg2892#msg2892

Por valor indica que la variable no es transferida a un método, sólo lo es su valor. Al transferirse solo el valor, una manipulación de la variable dentro del método no afecta a la variable en sí, que sigue en el mismo estado una vez termina la ejecución del método.

Java es un poco especial porque cuando pasas un objeto no pasas el objeto en sí, sino una referencia (a la posición de memoria) del objeto.

235
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 opción 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.


236
Gracias bartvander aunque ya me gustaría a mí ser un crack  :-[ ... seguimos siendo aprendices


237
Aprender a programar desde cero / Re:Bucles anidados funcionamiento
« en: 28 de Febrero 2013, 19:05 »
Ahí no puede haber fallo ninguno, es tal como indicas y a mí me sale sin problema. El problema tiene que ser de otro tipo, mira a hacer esto:

Ejecuta y cuando se te abra la ventana de consola vete al menú options y comprueba que tengas activadas las opciones "Clear screen at method call" y "Unlimited buffering"

Apaga el ordenador, reinicia y ejecuta otra vez.


238
Aprender a programar desde cero / Re:Bucles anidados funcionamiento
« en: 28 de Febrero 2013, 12:20 »
Una cuestión interesante es la complejidad que introduce el anidamiento de bucles. Si tenemos un bucle con n repeticiones, el ordenador tiene que realizar n procesos. La complejidad es O(n).

Si tenemos un bucle de tamaño 2 anidado sobre un bucle de tamaño 5 el ordenador tiene que realizar 10 procesos (2x5). Si el tamaño del bucle exterior es n y el del bucle interior es n también, requiere nxn procesos, es decir, n2 procesos. Si tuviéramos un triple anidamiento nos iríamos a n3 y así sucesivamente.

Como puede verse el anidamiento de bucles con índice igual al tamaño del problema es poco deseable ya que provoca complejidades poco deseables. O sea, mejor evitarlo cuando tengamos otras alternativas menos costosas.



239
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 opción correcta es la d). Según esta opción 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 asignación 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 opción b) no es correcta.



240
PREGUNTA: El esquema de datos formación se corresponde con el esquema de acción:

a) Secuencia

b) Iteración

c) Selección

d) Tupla






RESPUESTA: la opción correcta es la b). Esta pregunta implica que tenemos que haber memorizado algunas cosas. En primer lugar que "formación" equivale a "array". En segundo lugar lo siguiente: si consideramos que los esquemas de acción son secuencia, selección e iteración la analogía entre esquemas de datos y acciones sería la siguiente:

Secuencia <---> Tupla o registro

Selección <---> Union

Iteración <---> Formación (array)

Tratando de buscarle algo de lógica a esto, podríamos 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 valiéndonos de índices.

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