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 - Mario R. Rancel

Páginas: 1 ... 4 5 6 7 8 [9] 10 11 12 13 14 ... 32
161
Buenos días el ejercicio está correcto

Mismos comentarios que en https://www.aprenderaprogramar.com/foros/index.php?topic=4207.0

Nota: si declaras los atributos como private no significa que no puedas acceder a ellos desde la subclase, sino que no podrás acceder directamente. Sí podrás acceder indirectamente por ejemplo invocando el método get correspondiente pero de la superclase

Ejemplo:

salarioBase = 925+(super.getAnyosConsolidados()*33.25)+(47.80*anyosEmerito);

Saludos.

162
Buenos días el ejercicio está correcto

Una sugerencia para mejorar: en la clase Profesor has escrito esto

Código: [Seleccionar]
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" y años consolidados y no tiene años de emérito.\nPor lo tanto le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }


Error de concepto: estás considerando que Profesor es una cosa y que ProfesorEmerito es otra cosa.

Pero realmente no es así, decimos que ProfesorEmerito es un tipo de Profesor (a veces se dice que es una especialización de Profesor). Por ello un Profesor es algo "más general" que un ProfesorEmerito, algo que lo engloba. Un Profesor podría ser un ProfesorEmerito, o un ProfesorAyudante, o un ProfesorBecario... por tanto no es correcto decir que un Profesor no tiene años de emérito. Si es un ProfesorEmérito sí los tendrá.

El planteamiento correcto en programación orientada a objetos es que la superclase maneje e informe sobre sus atributos. La subclase reutilizará dicha información, y posiblemente añadirá alguna más.

En este ejercicio esto se traduciría en que los métodos quedarían así:

en la clase Profesor

Código: [Seleccionar]
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" años consolidados y le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }

En la clase ProfesorEmerito

Código: [Seleccionar]
    public void mostrarInfoProfesor(){
        super.mostrarInfoProfesor();
        System.out.print("Años de emérito "+getAnyosEmerito());
    }


Si entiendes bien esto habrás dado un buen paso

Las ideas interesantes son:

Profesor y ProfesorEmerito no son cosas distintas, uno es una "extensión de otro". Un ProfesorEmerito es también un Profesor. Un Profesor no sabemos si es ProfesorEmerito, quizás lo sea, pero no lo sabemos.

Una subclase hereda atributos y métodos de su superclase, por tanto reutiliza el código de la superclase, evitando repetir algo que ya esté en la superclase. En la subclase únicamente añadimos, no repetimos.

Saludos.

163
Buenas tardes,

a) b) c) e) bien

En el apartado d) tienes que mejorar una cosa: en el método toString() debes reutilizar el código de la superclase en lugar de repetir. Ver este hilo como ejemplo https://www.aprenderaprogramar.com/foros/index.php?topic=1147.0

Saludos

164
Buenas tardes, en esta consulta se ve algo extraño (parece erróneo, te lo señalo en rojo):

Dim sql As String = "SELECT c_dni,c_apellidos,c_nombre,c_ultimo_grado, fecha_baja FROM miembros_club, historico_bajas WHERE baja_dni=c_dni AND c_activa_baja = true like  '%" + consul_dni.Text.Trim + "%'"

¿A qué campo de la base de datos le quieres aplicar ese like? Es como si faltara algo...

¿Has probado la consulta directamente en la base de datos a modo de prueba con datos de ejemplo y te funciona?


Saludos

165
Buenas tardes, todo bien

Como indicas en el comentario para recuperar el valor del atributo usando getAttribute se haría así (solo indico la línea implicada):

Código: [Seleccionar]
msg += '\n Elemento input de tipo '+formulario[i].elements[j].type+' con name '+formulario[i].elements[j].name+' su id es '+formulario[i].elements[j].id+' y su maxlength es de '+formulario[i].elements[j].getAttribute('maxlength')+' caracteres';


Saludos

166
Buenos días matru

Tienes un error de concepto:

Código: [Seleccionar]
    public double getAreaCirculo(){
        radio = radio*radio;
        double area = numeroPi * radio;
        return area;
    }

El radio del círculo es un atributo del mismo. El radio se establece a través de un constructor o a través del método setRadio.

Si escribes radio = radio*radio; estás diciendo que el radio es igual al resultado de multiplicar el radio por sí mismo. Esto no tiene sentido, no debemos usarlo porque crea confusión: el radio es el que es, no es el resultado de multiplicarlo por sí mismo. Además con esta sentencia estás cambiando el valor del atributo, algo que no debe hacerse excepto a través del método set.

Debes corregir esto

Saludos

167
Buenos días, todo bien, aquí el objetivo era simplemente conocer cómo visualizar las cabeceras

Saludos

168
Buenos días Pedro

En el ejercicio 1 esta función

Código: [Seleccionar]
function comprobarNombres($resultados) {
if ($resultados !=NULL) {
return strncmp($resultados['nombre'], 'M', 1);
}
else {echo "<br/>No hay más datos!!! <br/>";}
}

Si se entra en la primera parte del if el resultado es que se devuelve un valor false ó true (o su equivalente numérico 0 ó 1) mediante la sentencia return. Si se entra en el else el resultado es que no hay sentencia return, y a cambio hay una sentencia echo con una cadena de texto.

Esto es una situación que en líneas generales debe evitarse. De hecho, muchos lenguajes de programación no permiten situaciones de este tipo. PHP sí lo permite porque es más relajado en el control de tipos. Sin embargo, a no ser que tengamos un fuerte motivo para hacerlo no es recomendable. El motivo es que la función debe realizar una tarea homogénea (devolver un mismo tipo de dato siempre con un return) en lugar de hacer unas veces una cosa y otras veces otra. Si la función no hace siempre lo mismo es más fácil incurrir en errores a la hora de llamarla, porque la respuesta podría no ser la que esperamos y no obtener la respuesta esperada dar lugar a errores.

El ejercicio 2 funciona correctamente y puede verse como un ejercicio donde has ejercitado el uso de funciones. El diseño realmente no me parece óptimo por varios pequeños detalles.

Por ejemplo:

Código: [Seleccionar]
function dameNumeroHabitantes($resultados) {
if ($resultados !=NULL) {
return $resultados['habitantes'];
}
}

Una función que hace una tarea elemental quizás no merezca la pena ser definida como función, sino incluir su código directamente ya que no supone ahorro de código.

En esta función tenemos un condicional de modo que si se cumple hay un return, y si no no hay nada. Estamos en un caso parecido al comentado antes: la función se comportará de distinta manera, no tiene una respuesta homogénea, y esto a la larga puede traer problemas.

Esta función: function muestraResultado($numeroHabitantes, $ciudades, $tienenMetro)

parece concebida para ser llamada una sola vez. En general una función tendrá interés cuando se vaya a llamar más de una vez. Aunque no está prohibido, es raro definir funciones pensadas para ser llamadas una sola vez. Podría usarse en casos justificados si por ejemplo mejoran la ordenación y legibilidad del código.

Para este ejercicio 2 no le veo ventajas al uso de funciones (aunque tampoco está establecido que no se puedan usar, de hecho en general es preferible usarlas, pero tampoco siempre). En este post hay una solución más compacta sin funciones https://www.aprenderaprogramar.com/foros/index.php?topic=1598.0


Saludos

169
Buenos días Pedro, todo bien. Esta forma de extraer los resultados de una consulta (una a una) puede resultar repetitiva, pero es justamente lo que se pedía en este ejercicio. En las siguientes entregas del curso ya se explica cómo hacer lo mismo pero de forma más ágil mediante el uso de bucles.

Saludos

170
Buenos días 3skai recomendamos ir publicando en los foros todos los ejercicios realizados para obtener orientación y seguridad de no tener fallos de conceptos o codificación

El ejercicio 1 no está bien resuelto ya que se pedía crear una función. Para ello debes definir una función usando function, definir los parámetros que debe recibir, las instrucciones a ejecutar, etc. y después invocarla. Puedes ver una posible solución en https://www.aprenderaprogramar.com/foros/index.php?topic=4161.0

En el ejercicio 2 se produce la misma situación

Saludos

171
Buenos días Pedro el código hace correctamente lo que pedía el ejercicio

Hay una línea ¿mal definida?:

Código: [Seleccionar]
contenidosAMostrar = contenidosAMostrar+'<div id="ciudades'+i+'"> <a href="http://aprendehtml.byethost3.com/Ajax/CU01206F/datosCU01206F.php">' + contenidosRecibidos[i]+ '</a></div>';
Aquí parece que basta con:

Código: [Seleccionar]
contenidosAMostrar = contenidosAMostrar+'<div id="ciudades'+i+'">' + contenidosRecibidos[i]+ '</div>';
No sé si incluiste eso con algún motivo específico o si se quedó porque el código inicial de ejemplo incluía el mismo enlace para todas las ciudades.

De cualquier manera, en caso de incluir una ruta en tu propio servidor (sobre tu propio sistema de archivos) siempre se recomienda usar rutas relativas en lugar de rutas absolutas. La ruta absoluta es la ruta completa (tal cual la escribirías en un navegador) mientras que la ruta relativa se basa en el directorio donde tienes el archivo. En este caso si el archivo php está en el mismo directorio que el archivo html la ruta relativa sería simplemente el nombre del archivo. Se habla de esto en https://www.aprenderaprogramar.com/foros/index.php?topic=390.0


En esta línea hay un espacio antes del comienzo del nombre de archivo:
xmlhttp.open("GET"," datosCU01206F.php?pais="+str);

Te recomiendo eliminar ese espacio porque podría traer problemas (podría).

Saludos

172
Buenas tardes, haría falta concretar a qué te refieres con dato aleatorio. Supongo que tratas de generar una estructura de datos aleatoria, pero ¿cuál es la estructura de datos con la que estás trabajando? Por ejemplo podría tratarse de una estructura de datos que incluya un número, una palabra y un puntero. O podría tratarse de un array de números. O podría tratarse de una estructura de datos recursiva. U otras cosas, por eso habría que saber qué tipo de información es la que hay que generar.

Saludos

173
Buenas tardes

Tienes un fallo de concepto.

Un envío de productos es una agrupación o colección de productos.

Polimorfismo significa que una cosa puede ser de varios tipos.

En la clase EnvioDeProductos no estás haciendo uso del polimorfismo:

Código: [Seleccionar]
     private ArrayList<ProductoFresco> productosFrescos;
    private ArrayList<ProductoRefrigerado> productosRefrigerados;
    private ArrayList<ProductoCongeladoPorAgua> productosCongeladosPorAgua;
    private ArrayList<ProductoCongeladoPorAire> productosCongeladosPorAire;
    private ArrayList<ProductoCongeladoPorNitrogeno> productosCongeladosPorNitrogeno;

Aquí lo que tienes son cinco colecciones de objetos donde cada colección admite un tipo único. Esto te obliga a escribir las cosas cinco veces.

Pero la idea no es esa: la idea es tener una colección de objetos de un tipo (Producto) que admita objetos de distintos tipos (ProductoFresco, ProductoRefrigerado, etc.). Y donde solo tendremos que escribir las cosas una única vez.

¿Cómo hacemos esto en Java?

Fíjate en cómo se hace en la solución propuesta en https://www.aprenderaprogramar.com/foros/index.php?topic=2959.0

Ahí verás que no nos hacen falta 5 ArrayList. Con un ArrayList de Producto nos es suficiente, porque gracias a la herencia esta colección admitirá un objeto de cualquier tipo que sea un subtipo de Producto, es decir, admitirá productos frescos, refrigerados, etc.

Fíjate también en ese ejercicio cómo se crean los productos:

Producto productoRefrigerado1 = new ProductoRefrigerado("15/04/2017", 48688, 14423557);

Este producto tiene declarado el tipo estático Producto, mientras que su tipo dinámico es ProductoRefrigerado: es las dos cosas al mismo tiempo. Normalmente declararemos como tipo estático el de una superclase (o interface) y como tipo dinámico el de una clase concreta.

Saludos

174
Buenas tardes

Tratando de responder

1- Qué tipos de problemas puede generar esto? puede traer más dificultades de lo normal que utilizando bases de datos MySQL?

Obviamente sí. Las bases de datos se concibieron para el almacenamiento masivo de información estructurada con un acceso rápido para la lectura y escritura. Supón que en tu juego tienes 5 jugadores, lo que equivaldría a tener 5 archivos. En este caso, posiblemente no notes diferencia entre usar archivos y bases de datos porque manejas poco volumen de información. Supón que en tu juego tienes 500 ó 5000 jugadores: posiblemente el sistema funcionaría mal o lentamente, ya que el acceso a archivos ralentizaría enormemente la operación del sistema.

2- Como puedo mejorar la seguridad? que los archivos no sean accesibles, o se encripten, además de cambiar el formato.

Tienes diversas alternativas (por ejemplo con htaccess) pero ninguna se explica o entiende en unas pocas palabras.


3- Tienen alguna recomendación?

En este curso se explica el uso básico de bases de datos con PHP, te puede ser útil, http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=70&Itemid=193

Saludos

175
Buenas tardes

Ahora sí, puedes dar el ejercicio por correcto, código y lógica. Comentaré algunas cosas, pero no creo que debas seguir revisando este ejercicio sino seguir avanzando.

Hay algunos detalles interesantes. Por ejemplo el enunciado dice: "Todos los productos llevan esta información común: fecha de caducidad y número de lote. A su vez, cada tipo de producto lleva alguna información específica. Los productos frescos deben llevar la fecha de envasado y el país de origen. Los productos refrigerados deben llevar el código del organismo de supervisión alimentaria, la fecha de envasado, la temperatura de mantenimiento recomendada y el país de origen. Los productos congelados deben llevar la fecha de envasado, el país de origen y la temperatura de mantenimiento recomendada."

Aquí parece haber un error en el enunciado, porque nos dice que la información común de los productos es fecha de caducidad y número de lote. Sin embargo por la explicación vemos que hay más información común. ¿Error? Hay que tener en cuenta que cuando un cliente hace el encargo de un programa nos puede proporcionar información mal especificada o con contradicciones. Por ello como programadores habremos de encargarnos de:

a) Entender bien el problema
b) Solicitar aclaraciones si son necesarias
c) Reestructurar la información y el código cuando lo consideremos conveniente

En este caso de la explicación se deduce que es conveniente agrupar los atributos "fecha de envasado" y "país de origen" para evitar su repetición en las subclases.


Sobre la clase "ProductoRefrigeradoYCongelado" ¿hacía falta una clase "intermedia"? Digamos que hacía falta porque el ejercicio así lo pedía. Esta clase supone desviar el diseño en código del esquema del problema en el mundo real. Es decir, en el mundo real no existe un tipo de producto refrigerado-congelado. No obstante, nosotros como programadores podemos crear este tipo de abstracciones cuando lo consideremos oportuno. Pero siempre guardando coherencia. En este caso es coherente que de Producto herede ProductoRefrigerado-Congelado y que de ahí continue la herencia. Creo que hubiera sido más apropiado el nombre ProductoRefrigeradoOCongelado en lugar de YCongelado porque esta clase representa una abstracción de un producto refrigerado ó congelado, no de ambas cosas al mismo tiempo.

En este fragmento de código hay una idea interesante:

Código: [Seleccionar]
    public void mostrarInfoProductoRefrigerado(){
        mostrarInfoProductoRefrigeradoYCongelado();
        System.out.print(" y un código de Organismo de Supervisión: "+getCodigoOrganismoSupervision()+"\n");
    }

La idea es reutilizar el código de superclases para evitar su repetición en las subclases. Buena idea. Más adelante en el curso se ve cómo sofisticar aún más esta idea.

La pregunta es: ¿Por qué no hiciste lo mismo en todos los casos? Por ejemplo que el método public void mostrarInfoProductoFresco() reutilizara mostrarInfoProducto de la clase Producto?

La idea del polimorfismo tienes que ir asentándola poco a poco. Para ello te propongo esta reflexión:

Si escribes ProductoFresco productoFresco1 = new ProductoFresco("23-06-2016",1234, "05-01-2016","Argentina"); entonces productoFresco1 es solamente de un tipo, es de tipo ProductoFresco.

Si escribes Producto productoFresco1 = new ProductoFresco("23-06-2016",1234, "05-01-2016","Argentina"); entonces productoFresco1 es de dos tipos: es de tipo Producto (tipo estático) y de tipo ProductoFresco (tipo dinámico).

Saludos

176
Buenas tardes

Has citado algo importante: tienes que guardar la lógica en los diseños. En determinadas situaciones puedes encontrar soluciones que suponen atajos pero que contravienen la lógica. Esto a la larga genera inconsistencias y hace que los programas terminen por fallar.

Por criterio de lógica, un producto congelado no debe heredar de un producto refrigerado: no tiene lógica (incluso aunque en un caso concreto puedas cuadrarlo así sería algo contrario a la lógica).

Tienes que hacer un diseño coherente: public class ProductoRefrigerado extends ProductoFresco no es coherente. Un ProductoRefrigerado no es un tipo de ProductoFresco. Supón que tienes la clase Fruta y las clases FrutaDulce, FrutaAmarga y FrutaMixta. No tendría ningún sentido decir que FrutaAmarga hereda de FrutaDulce. El diseño coherente sería que Fruta sea superclase de FrutaDulce, FrutaAmarga y FrutaMixta. Independientemente de cómo se organicen luego los atributos. Lo primero será tener un diseño coherente. El diseño que muestras no es coherente.

En el hilo https://www.aprenderaprogramar.com/foros/index.php?topic=2342.0 tienes un diseño consistente: el esquema planteado es lógico.

Saludos

177
Buenos días

Has planteado unas relaciones de herencia muy extrañas, como si te hubieras equivocado de ejercicio

De la clases Producto deben heredar ProductoFresco, ProductoRefrigerado y ProductoCongelado.

De la clase ProductoCongelado deben heredar los distintos tipos de producto congelado.

En https://www.aprenderaprogramar.com/foros/index.php?topic=2342.0 tienes una propuesta de solución correcta y algunos comentarios

Revisa todo tu código

Saludos

178
Buenos días

Buen trabajo, has cumplido con lo requerido por el ejercicio

Saludos

179
Sí perdona no quería poner un enlace y sí la idea era simplemente que se viera mejor, el ejercicio está bien

Saludos

180
Buenos días

Todo bien incluso el marco-borde personalizado se ve más claro si comentamos la línea con la imagen de fondo

/*background-image:url(https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcR4gtgWpjM_X5cR8b2TM6llbpCvTztaE8-I8f-HmMfDqUWIH7mS);*/

Saludos

Páginas: 1 ... 4 5 6 7 8 [9] 10 11 12 13 14 ... 32

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