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 ... 8 9 10 11 12 [13] 14 15 16 17 18 ... 23
241
PREGUNTA:   ¿Los parámetros en Java se pasan por valor o por referencia?



RESPUESTA:

A veces se piensa erróneamente que los tipos primitivos pasan por valor y los objetos por referencia, pero esto no es así. Todo parámetro pasa por valor.

La confusión radica en que cuando pasamos un tipo primitivo, este no es modificable dentro del método. En cambio, al pasar un objeto, sí se pueden producir modificaciones dentro del método. Pero la realidad es que cuando pasamos el parámetro no pasamos el objeto en sí, sino una referencia al objeto, y esta referencia es la que pasa por valor y funciona como una copia dentro del método, resultando que los cambios dentro del método no son conocidos luego fuera de él.


242
PREGUNTA: La técnica de desarrollo mediante refinamientos sucesivos consiste en:

a) Descomponer acciones en otras más simples en pasos sucesivos

b) Depurar los errores del código en pasos sucesivos

c) Reducir el tiempo de compilación de un programa en pasos sucesivos

d) Reducir el tiempo de ejecución de un programa en pasos sucesivos








RESPUESTA: la opción correcta es la a). La pregunta es quizás más de memorizar que de otra cosa. De todas formas después de haber leído los contenidos de la asignatura b), c) y d) son más o menos fácilmente descartables.

243
PREGUNTA: El siguiente fragmento de código 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 opción 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 operación 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 operación es 1 + 0,6667 - 1 = 0,6667. Se trunca y ahora x vale cero. Se analiza la condición del while, y como x no es mayor que cero, se sale del bucle.


Fíjate si preguntáramos: ¿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 también 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.

244
PREGUNTA: En C/C++, los vectores abiertos:

a) Sólo pueden utilizarse en la definición de funciones

b) Sólo pueden utilizarse en la definición de procedimientos

c) Pueden utilizarse en la definición de funciones y en la definición de procedimientos

d) No pueden utilizarse ni en la definición de procedimientos ni en la definición de funciones







RESPUESTA: La opción correcta es la c).  Recordar lo siguiente: En C/C++ no es posible declarar vectores abiertos (con un número de elementos indefinidos) pero sí es posible incluirlos como argumentos de subprogramas siempre que al mismo tiempo se pase al subprograma (función o procedimiento) como argumento un parámetro que represente el número 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 número de elementos de que constan.

245
EJERCICIO DE PROGRAMACIÓN (PARTE PRÁCTICA DEL EXAMEN)

Enunciado:
Realizar en C+- el tipo abstracto de datos TiempoCiudad para guardar las temperaturas y el estado del tiempo en una ciudad en 4 momentos diferentes. La operación NuevaCiudad guarda el NombreCiudad pasado como argumento e inicializa las temperaturas y los estados. La operación NuevoTiempo con los argumentos NombreCiudad, TipoMomento (enumerado: mañana, tarde, noche, madrugada), Temperatura y Estado (enumerado: sol, nubes, lluvia, nieve) guarda el nuevo tiempo de la ciudad para ese momento. La operación ListaTiempo escribe en pantalla la ciudad y las temperaturas y estado en los distintos momentos para el NombreCiudad pasado como argumento.



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


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

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

Ejemplo de respuesta del programa: un ejemplo de lo que debemos obtener al ejecutar el programa de comprobación.

246
ok, creo que ahora entiendo algo. Si no interpreto mal, supón que quieres crear un array dinámico (aplicación típica de los punteros, ya que C/C++ no permite crear arrays dinámicos). Definimos el elemento del array:

typedef struct TipoNodo {
int valor;
TipoNodo* siguiente;
};


Ahora para crear un nuevo elemento del array podemos usar:

nuevo = new TipoNodo;

nuevo->valor = 33;


La sintaxis nuevo->valor = 33;  es equivalente a (*nuevo.valor)=33, pero la forma de escribirlo usando -> es más cómoda de escribir.

Entonces lo que creo debe quedar claro es que el operador -> sirve para "hacer dos cosas en uno": por un lado, desreferenciar el puntero, y por otro lado, indicar una asignación o selección de campo de un registro.

Creo que por ahí van los tiros...

247
Hola satanas, yo he intentado compilar para ver equivalencia y obtengo estos resultados:

PROGRAMA QUE SÍ COMPILA

#include <stdio.h>
#include <stdlib.h>
int main(){
typedef int* Tp_Entero;
Tp_Entero pe;
*pe = 33;
printf ("%d", *pe);
}


PROGRAMA QUE NO COMPILA

#include <stdio.h>
#include <stdlib.h>
int main(){
typedef int-> Tp_Entero;
Tp_Entero pe;
->pe = 33;
printf ("%d", ->pe);
}

248
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 opción a responder es la c), es decir, la sentencia propuesta es incorrecta. El símbolo -> no es válido en C/C++, con lo cual ninguna de las otras opciones puede ser válida.

249
PREGUNTA: Del módulo de interfaz:

#pragma once
void uno();
void dos();


Se puede afirmar:


a) Faltan argumentos a los procedimientos

b) Es un tipo abstracto

c) Falta una declaración de tipo

d) Es un dato encapsulado







RESPUESTA: La opción correcta es la d). Recordar que hablábamos de módulo en alusión a un fragmento de un programa desarrollado de forma independiente y que distinguíamos dos tipos de módulos:

- Especificación o interfaz: define qué hace el programa (abstracciones). Fichero .h, parte "pública"

- Realización o implementación: define cómo lo hace el programa. Fichero .cpp. Desarrolla las abstracciones, parte "privada".

Hablamos de dato encapsulado en alusión a que si una abstracción 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 sólo interfaces de operaciones, mientras que en el cpp irá el typedef struct que define el dato como static TipoDato... , y además el código de implementación 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 estática 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 tendríamos una declaración de un tipo (typedef...). La c) no es cierta, si no hay declaración de tipo será porque es un dato encapsulado.

Comentarios: los nombres de los procedimientos, uno y dos, podríamos calificarlos de inadecuados o con intención de despistar, pero que los nombres no sean adecuados no cambia nada.

250
Agradezco tu mensaje, ya lo he comentado en ocasiones anteriores, esto lleva su trabajito... y se agradecen mensajes de aliento y comentarios que sirvan de "feedback". Te haría una recomendación: controla bien el tiempo, es muy típico que ante un tipo test complicado se vaya demasiado tiempo en el test y luego te falte para la parte del problema. Hay que distribuirse bien el tiempo. Suerte!

251
PREGUNTA:  Un tipo vector abierto:

a) Necesita utilizar un centinela

b) Omite el tamaño explícito del vector

c) Se utiliza para declarar variables de tipo ristra

d) Simplifica las condiciones de contorno







RESPUESTA: La opción correcta es la b). Recordar lo siguiente: En C/C++ no es posible declarar vectores abiertos (con un número de elementos indefinidos) pero sí es posible incluirlos como argumentos de subprogramas siempre que al mismo tiempo se pase al subprograma (función o procedimiento) como argumento un parámetro que represente el número 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 número de elementos de que constan.

252
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 opción correcta es la b). Tener en cuenta lo siguiente: para un tamaño de problema n, la complejidad de un algoritmo en general está en O(n) cuando tenemos un bucle de tratamiento de datos, en O(n2) cuando tenemos un bucle anidado dentro de otro, en O(n3) cuando tenemos un triple anidamiento de bucles y así sucesivamente. La verdad es que esta pregunta es poco correcta porque habría mucho que matizar, pero en fin, así son las cosas y así se las hemos contado :)

253
PREGUNTA: Dado el siguiente fragmento de código:

switch (j) {
case lunes: case martes: case miércoles: case jueves: j = TipoDia(int(j)+1); break;
case viernes: case sabado: case domingo: j = TipoDia(int(j)-1); break;
}



a) Falta una sentencia else

b) La sentencia else no se puede usar dentro de una instrucción

c) La variable j tiene que ser de tipo TipoDia para ser correcto

d) Los rangos establecidos son incorrectos







RESPUESTA: la opción correcta es la c). Analicemos las opciones. En un switch no aparecen elses luego desechamos la opción a). La opción b) es un poco confusa, cosas que aparecen de vez en cuando. Pensemos que un else puede aparecer acompañando a un if que puede estar dentro de otra instrucción, luego desechamos la b). j es el parámetro en que se basa la evaluación del switch. Recordar que un switch solo admite ciertos tipos de parámetros como enteros, enumerados, caracteres (aquello con equivalencia numérica). La expresión TipoDia(int(j)+1); indica que dentro del paréntesis se obtiene el valor numérico equivalente a j más una unidad, suponemos que será el siguiente día de la semana. Luego ese equivalente numérico lo transforma en tipo TipoDia. Por tanto la variable j tiene que ser de tipo TipoDia, en caso contrario no se podría realizar la asignación.

254
PREGUNTA: Dado el siguiente fragmento de código en C/C++:

n=0;
if (n<2) {
n=n+1;
}


Después de su ejecución n contiene el valor:



a) 3

b) 1

c) 2

d) 0







RESPUESTA: La opción correcta es la b). Consideremos el código. 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!

255
Un intérprete hace que un programa fuente escrito en un lenguaje vaya, sentencia a sentencia, traduciéndose a código objeto y sea ejecutado directamente por la computadora. El intérprete capta una sentencia fuente y la traduce, expandiéndola en una o varias instrucciones máquina, que ejecuta inmediatamente, no creándose, por tanto, un fichero o programa objeto que puede ser almacenado en memoria masiva para posteriores ejecuciones.

Ejecución con Intérprete --> trabaja en un solo paso, y es más lento que la ejecución de un programa compilado.

Ejecución con compilado --> trabaja en dos pasos, y una vez el programa se ha compilado es más rápida, el programa puede utilizarse tantas veces como se desee sin necesidad de volver a compilarlo.

Opción a) --> No es correcta porque el intérprete no necesita dos etapas de procesado

256
Supongo que te refieres a esta pregunta que aparecía anteriormente:

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.


La b) te dice que el intérprete sería más rápido que la ejecución de un programa ya compilado y esto no es así. El intérprete tiene que: primero, transformar a código máquina, segundo, ejecutar. En cambio si usas compilación partirás de un programa ya compilado (ya en código máquina) y sólo tienes que ejecutar. De este modo vas más rápido.

257
PREGUNTA: Dado el siguiente procedimiento en C/C++:

void proc( int a,int b, int & c)
{
int aux;
aux=a+b+c;
c=aux;
}


Para que fuese puro:


a) Es ya un procedimiento puro

b) bastaría con pasar las variables a y b por referencia

c) la variable c se debería pasar por referencia

d) Todas las variables, incluida aux, deben pasarse por referencia







RESPUESTA: la opción correcta es la a). ¿Por qué? Para poder responder esto tendremos que conocer la definición de "procedimiento puro" porque si no está difícil :) Muchos programadores profesionales no sabrían responder a esto porque es algo bastante teórico, pero veamos la definición. Para ello tenemos que ver algún concepto previo:

Transparencia referencial: existe transparencia referencial si el resultado de una llamada a un subprograma puede predecirse con la información del código de la llamada, es decir, si siempre que se pasan los mismos argumentos se obtienen los mismos resultados. La transparencia referencial se garantiza si el subprograma utiliza solo variables o elementos locales. Si un subprograma modifica una variable externa (global) se dice que está produciendo efectos secundarios o laterales (side effects) y que no existe transparencia referencial.

Procedimiento puro: el que no tiene efectos laterales, es decir, el que es tranparente referencialmente. No se exige el paso de argumentos por valor para considerar un procedimiento puro (en cambio para considerar una función pura sí se exige el paso de argumentos por valor).

En resumen, el procedimiento propuesto es puro porque solo usa elementos o variables locales (independientemente de que reciba dos parámetros por valor y uno por referencia). Si fuera una función, no sería pura.

258
PREGUNTA: En la práctica, la verificación:

a) Garantiza que en el programa no hay ningún error

b) Se hace mediante ensayos del programa

c) Aumenta la complejidad del programa

d) Garantiza la eficiencia del programa






RESPUESTA: la opción correcta es la b). La c) es claramente falsa ya que verificar un programa no hace que tenga mayor ni menor complejidad. La d) también es falsa, ya que con la verificación se trata de comprobar la corrección del programa, es decir, que cumpla con los objetivos de la especificación, no su eficiencia. Tampoco garantiza que en el programa no exista algún error. Esta pregunta se basa en conceptos teóricos que hay que saberse de memoria porque de otra manera no podremos responder porque la terminología es un poco ambigua.

259
Gracias a tí y a todos los que valoran el esfuerzo, porque esto lleva su trabajito... y se agradecen mensajes de aliento. Continúo claro, pero voy como una hormiguita poquito a poco. Trato de ayudar pero la ayuda principal es que cada uno sea capaz de organizarse por sí mismo, estudiar "sobre el papel" e - importante - practicar delante del ordenador. Suerte a todos los que se estén preparando el examen!

260
PREGUNTA: En la instrucción de asignación en C/C++ definida por A=B:

a) A debe ser variable y B constante

b) Tanto A como B deben ser variables

c) Debe haber compatibilidad de tipos entre A y B

d) A y B deben ser de tipo simple








RESPUESTA: la opción correcta es la c). Si analizamos las posibilidades, la a) no tiene por qué ser así. La B tampoco tiene por qué ser así, uno de los dos puede ser constante. La d) no se sabe muy bien a qué se refiere. La c es cierta: debe haber compatibilidad de tipos para realizar una asignación.

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