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 ... 8 9 10 11 12 [13] 14 15 16 17 18 ... 32
241
Buenos días este tema es un poco complejo no te preocupes pues se va entendiendo poco a poco.

Te digo lo que serían las respuestas correctas.


a) No. En Java no se permite la herencia múltiple. No obstante, se puede simular algo parecido a la herencia múltiple haciendo que dos clases implementen una interface.

Errores de concepto: no existe una "clase interface". En Java existen interfaces, clases abstractas, clases concretas... y todas ellas pueden ser tipos estáticos. Sin embargo para instanciar un objeto hemos de hacerlo con una clase concreta (es decir, su tipo dinámico ha de ser una clase concreta).

Recomendación: volver a leer la entrega

Citar
Java no permite la herencia múltiple, pero a cambio dispone de la construcción denominada “Interface” que permite una forma de simulación o implementación limitada de la herencia múltiple.

b) Correcta. Digamos que una interface declara lo que debe hacer una clase que la implemente, pero no dice cómo ha de hacerlo, por eso no lleva instrucciones, sino solo declaraciones o signaturas.

c) Sí se puede crear un objeto del tipo definido por una interface (como tipo estático).

Por ejemplo List <String> lista1 = new ArrayList<String> lista1 ();

List es una interface y ArrayList una clase concreta. El objeto es al mismo tiempo de tipo List y tipo ArrayList (polimorfismo).

El objeto no podrá ser de un tipo que no implemente la interface que es su tipo estático porque supondría una contradicción en la declaración de tipos.

Sí puede ser del tipo definido por una interface y de una clase que implemente la interface como en el ejemplo List - ArrayList.


Para repasar y ver ejemplos es recomendable leer las respuestas y comentarios en https://www.aprenderaprogramar.com/foros/index.php?topic=1332.0

Si te quedan dudas coméntamelas

Saludos

242
Buenas tardes Enzo

El ejercicio después de revisarlo lo veo correcto, considerando que la dimensión principal de un cuadrado es su lado y de un círculo su radio.

Para tener precisión matemática con el número pi te recomiendo usar Math.PI que es una constante disponible a través del api de Java.

En lugar de return 3.1416 * (dimensionPrincipal*dimensionPrincipal); escribiríamos return Math.PI * (dimensionPrincipal*dimensionPrincipal);

Para hacer uso del polimorfismo en lugar de esta declaración:

        Cuadrado_CU00694B cuadrado1 = new Cuadrado_CU00694B (55);
        Cuadrado_CU00694B cuadrado2 = new Cuadrado_CU00694B (25);
        Cuadrado_CU00694B cuadrado3 = new Cuadrado_CU00694B (55);

Puedes usar esta:

        Figura_CU00694B cuadrado1 = new Cuadrado_CU00694B (55);
        Figura_CU00694B cuadrado2 = new Cuadrado_CU00694B (25);
        Figura_CU00694B cuadrado3 = new Cuadrado_CU00694B (55);

En este caso el tipo estático es Figura y el dinámico Cuadrado.

Lo mismo para los círculos.

Hay una cosa que no has hecho y sería interesante que hicieras: en lugar de mostrarDatos() usar el método toString(). El método toString es un estándar usado por todos los programadores y cuanto antes nos acostumbremos a usarlo mejor. Tener en cuenta que toString es un método tipo función que devuelve un String, no es un void.

Saludos

243
Bueno, para eso tendrías que mantener la información en un campo adicional de la clase, o mostrar directamente el cálculo.

Ejemplo: en la clase Profesor escribir

Código: [Seleccionar]
    public void mostrarDatos() {
        System.out.println ("Nombre: " + nombre);
        System.out.println ("De: " + edad + " años");
        System.out.println ("Con: " + agnosConsolidados + " años como Profesor Consolidado");
        System.out.println ("Con sueldo de partida: " + (725 +agnosConsolidados * 33.25));
        System.out.println ("Y con un Sueldo Base de: " + this.obtenerSalarioBase());
    } // Cierre del método para mostrar información del Profesor

Saludos

244
Buenos días, ahora parece que va todo perfecto y estás logrando algo interesante para los programadores: ser capaces de depurar código.  :)

Ten en cuenta que en la función detener() debes añadir clearTimeout(moverPalo) para que la detención sea completa:

Código: [Seleccionar]
function detener() {
cancelAnimationFrame(animacionColocaBolas);
cancelAnimationFrame(muevePalo);
cancelAnimationFrame(evitaGolpe);
cancelAnimationFrame(mueveBolas);
cancelAnimationFrame(animacionMuevePalo);
clearTimeout(cambiaColor);
clearTimeout(moverPalo);
}

Sin esto parece que hay una detención pero después siguen ejecutándose cosas. Supongo que se quedó fuera por despiste.

Saludos

245
Buenas tardes

Has resuelto bien el código como te había indicado.

El método que usa el compilador lo tenemos explicado en http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=660:sobreescribir-metodos-en-java-tipo-estatico-y-dinamico-ligadura-metodos-polimorficos-ejercicio-cu00690b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Citar
el control de tipos del compilador se basa en los tipos estáticos pero en tiempo de ejecución los métodos que se ejecutan dan preferencia al tipo dinámico. Es decir, en tiempo de ejecución Java está constantemente “buscando” (“ligando” o “despachando”) el método que corresponda en función del tipo dinámico al que apunta una variable. Si el método invocado no se encuentra definido en el tipo dinámico de que se trate, Java busca el método en la superclase para tratar de ejecutarlo. Si no lo encuentra en la superclase, continúa subiendo niveles de clase hasta alcanzar a la clase Object. Si en la clase Object tampoco se encontrara un método con ese nombre, el programa no llegaría a compilar.

Es decir, si invocas un método sobre un objeto de una subclase y lo encuentra en la subclase, ese es el que ejecuta. Si no lo encuentra, lo busca en la superclase.

Sobre lo del desglose, no sé bien a qué desglose te refieres.

Saludos

246
Buenos días Pedro

El código del ejercicio 1 está bien comentado, pero aún así no estoy seguro de si te queda claro todo el código. Si tienes alguna duda sobre ese código indícalo.

La animación que has creado está muy bien, has utilizado diversas cosas con lo cual aprovechas todo lo visto a lo largo del curso que era el objetivo del ejercicio.

Sobre el problema que existe por el que la animación no se detiene al pulsar detener, te comento lo que se aprecia si activas la consola en el navegador:

En ejecución normal aparecen estos errores:

Código: [Seleccionar]
ReferenceError: clearTimeOut is not defined prueba.html:51:5
TypeError: nodoBola[i] is undefined prueba.html:99:6

En ejecución pulsando detener aparecen estos errores:

Código: [Seleccionar]
ReferenceError: clearTimeOut is not defined prueba.html:51:5
TypeError: nodoBola[i] is undefined prueba.html:190:6
TypeError: nodoBola[i] is undefined prueba.html:99:6

Habría que estudiar por qué salen esos errores y eliminarlos.

Intenta corregir primero el error de nodoBola[ i ] porque te puede estar interfiriendo en lo demás

Saludos

247
Buenos días jbodenser

Ambos ejercicios están resueltos a la perfección.

Para futuros ejercicios es preferible incluir el script dentro de las etiqueta <head> ... </head> en lugar de intercalado dentro del código HTML. Cuando el usuario haga click sobre un texto, botón o imagen (por ejemplo como está hecho aquí: https://www.aprenderaprogramar.com/foros/index.php?topic=3289.0 ) entonces sería cuando se ejecuta el código javascript. Esa es la forma estándar utilizada por los programadores y la que recomendamos para los ejercicios del curso (aunque en alguna ocasión pueda hacerse de otra manera, recomendamos seguir los estándares).

Saludos

248
Buenos días Carlos Andrés

En tu clase EntradaDeTeclado tienes un método getPrimerPalabra() pero si intento usarlo no funciona.

Por ejemplo:

Código: [Seleccionar]
            EntradaDeTeclado entrada4=new EntradaDeTeclado();
            EntradaDeTeclado entrada5=new EntradaDeTeclado();
            System.out.println ("La primera palabra de la entrada es " + entrada5.getPrimerPalabra());

Empezamos el programa
Introduzca el nombre de dos cantantes famosos
juan
andres carlos
La primera palabra de la entrada es andres carlos
Gracias
ARTISTAS FAMOSOS
1.Dany Worsnop
2.Vic Fuentes
3.Oliver Sykes
4.juan
5.andres carlos


No debes tener código que no funcione. En estos ejercicios debes de revisar todo el código que utilices y comprobar que funcione. Además, dado que se trata de ejercicios pequeños, no es necesario incluir métodos ni clases complementarias que no se utilicen, sino simplemente el código necesario para el ejercicio.

Deberías revisar esto en este ejercicio y tenerlo en cuenta para futuros ejercicios

Saludos

249
Buenos días Enzo he chequeado tu código y está muy bien. Comentarte un detalle.

En la clase de test tienes un código que es este:

Código: [Seleccionar]
        emerito1.mostrarDatos();
        System.out.println ("Y con un Sueldo Base de: " + emerito1.obtenerSalarioBase());
        System.out.println("");
        profesor1.mostrarDatos();
        System.out.println ("Y con un Sueldo Base de: " + profesor1.obtenerSalarioBase());

Te propongo que intentes trasladar las líneas donde se muestra el sueldo base a los propios métodos mostrarDatos de las clases Profesor y ProfesorEmerito.

Orientación: si incluimos System.out.println ("Y con un Sueldo Base de: " + this.obtenerSalarioBase()); en una superclase, el método estará disponible tanto para la superclase como para las subclases. ¿Qué método usará el compilador java cuando tenga que resolver si usar el método de la superclase o de la subclase, cuando sea invocado desde un objeto instanciado con tipo dinámico el de la subclase? Esto podemos resolverlo haciendo una prueba y comprobándolo

Saludos

250
Ante las diversas consultas que recibimos sobre las diferencias entre versiones de html y la importancia que tiene el usar una u otra versión en este post vamos a tratar de dar una orientación sobre algunas preguntas frecuentes:


Tengo una web creada con HTML 4.01 ¿Debo modificarla para adaptarme a HTML 5?

En principio no. Todos los navegadores reconocen HTML 4 y van a seguir reconociéndolo, por lo tanto si tu web funciona correctamente no debes preocuparte.


Estoy haciendo un curso de HTML que usa HTML 4 ¿es mejor abandonarlo y centrarme en HTML 5?

En principio no. Lo importante es que el curso sea de calidad y tenga buenos contenidos. HTML 5 podemos verlo como una extensión HTML 4, por lo tanto todo lo que aprendas de HTML 4 te va a resultar útil para HTML 5.


No sé nada de HTML, ¿con qué versión debería trabajar?

Con HTML 5.


Soy programador y trabajo desde hace muchos años con HTML 4 ¿debo reciclarme y pasarme a HTML 5?

Esta pregunta tiene diferentes matices:

a) Si creas páginas web para tí y tus páginas funcionan bien, no tienes por qué pasarte a HTML 5. Puedes seguir creando webs con HTML 4 y podrás seguir haciéndolo durante muchos años.

b) Si creas páginas web para empresas, aunque no tienes por qué pasarte a HTML 5 (lo realmente importante es que tus páginas funcionen bien), sí sería adecuado que te recicles y adquieras conocimientos de HTML 5 porque este se va a ir imponiendo progresivamente a lo largo de los próximos años y es posible que las empresas te acaben pidiendo que utilices HTML 5 (de hecho muchas empresas ya lo hacen). Por ello es mejor adelantarse e ir aprendiéndolo antes de que nos obliguen a aprenderlo.


¿Qué implicaciones tiene el cambio de HTML 4 a HTML 5 con vistas al aprendizaje de la programación web?

HTML 5 podemos verlo como una extensión HTML 4, por lo tanto todo lo que aprendas  o hayas aprendido de HTML 4 te va a resultar útil para HTML 5. Todos los fundamentos de la programación web siguen siendo los mismos con HTML 4 y HTML 5. Por tanto los cursos básicos o fundamentos se ven poco afectados por el cambio. Sí existen implicaciones en cambio para cursos avanzados o aspectos avanzados.


¿Es HTML 5 una especificación oficial?

Sí, lo es desde finales de octubre de 2014. No obstante, hay que relativizar el hecho de que sea una especificación oficial. Los navegadores no se ciñen exactamente a las especificaciones oficiales. Y por otro lado, a veces la industria web va por delante de las especificaciones oficiales. Por ejemplo, el HTML 5 fue impulsado sin ser una especificación oficial. Sólo después de coger fuerza se ha convertido en especificación oficial. A las personas que quieran aprender programación web les recomendamos crear páginas web que funcionen bien, aunque no cumplan estrictamente con la especificación oficial.


¿Es HTML un lenguaje de programación?

No. Esto se explica en el curso HTML desde cero de aprenderaprogramar.com disponible en http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=69&Itemid=192


Tengo webs creadas con declaraciones de doctype tipo
 
Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
¿Debo modificarlas por declaraciones <!DOCTYPE html>?

En principio no debes preocuparte por esto. Tu web va a seguir funcionando igualmente con una declaración u otra.


Estoy consultando en internet y me encuentro webs con declaraciones de doctype tipo

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
¿Debo desconfiar de estas webs?

En principio no debes preocuparte por esto. El código y los ejemplos serán tan válidos si llevan un tipo de declaración como si llevan la otra. Sí debes preocuparte de si la web ofrece contenidos de calidad y bien estructurados. Si es así no prestes demasiada atención al doctype. Para el aprendizaje son más importantes los conceptos que los detalles.


¿Es HTML 5 experimental?


No en el sentido de que ya es una especificación oficial. Sí en el sentido de que es una tecnología novedosa y no todos los navegadores soportan todas las características de HTML 5. Además, HTML 5 está en evolución. Podríamos decir que aunque ya no se considera experimental, todavía no se considera una tecnología madura.

251
Buenos días Enzo

En la clase Producto has agrupado correctamente algunos atributos que eran comunes a las subclases.

En los métodos para mostrar información estás reutilizando código invocando el código que ya has definido en la superclase, eso es correcto (más adelante en el curso se explican algunas cuestiones adicionales que permiten mejorar esto).

La clase ProductoNoFresco funciona como superclase intermedia que sirve para agrupar

La clase ProductoCongelado comentas que se podría quitar pero que es preferible dejarla por si en el futuro existieran atributos comunes. No sólo eso, es preferible dejarla porque así tenemos un diseño de clases más consistente. Si tenemos diseños consistentes eso será bueno para la programación (y hablará bien de nosotros si hemos sido los programadores).

En resumen tienes el código bien planteado, ordenado y comentado, bien!

Nota: más adelante en el curso se explica que podemos cambiar estas declaraciones

PtoFresco_CU00687B productoFresco1 = new PtoFresco_CU00687B ("23-11-2015", "21-5-2020", 55, "España");

Por declaraciones de este tipo:

Producto_CU00687B productoFresco1 = new PtoFresco_CU00687B ("23-11-2015", "21-5-2020", 55, "España");

Saludos

253
Buenos días. Enzo, simplemente hacerte un comentario para que lo tengas en cuenta de cara a los próximos ejercicios. Si te fijas en la clase Producto tienes el método mostrarInformacion() con esta línea (entre otras): System.out.println ("Fecha de Caducidad: " + getFechaCaducidad());

Luego en la clase ProductoFresco tienes el método mostrarInformacion() con esta línea: System.out.println ("Fecha de Caducidad: " + getFechaCaducidad());

Como ves, se trata de líneas repetidas.

La herencia nos sirve entre otras cosas para que las subclases hereden de las superclases y no tengamos que repetir código. En este caso te he puesto de ejemplo una línea, pero esto podría involucrar a cientos de líneas.

Hay varias formas de solucionar esto. Puedes ver un ejemplo en https://www.aprenderaprogramar.com/foros/index.php?topic=2926.0

En las siguientes entregas del curso se profundiza más en herencia y cómo reutilizar código y tendrás oportunidad de hacer ejercicios donde practicar con el concepto de reutilización de código.

Saludos

254
Hola Chopi cuando vayas a pegar código de varias clases hazlo así:

Clase 1

[ code ]
...
[ / code]


Clase 2

[ code ]
...
[ / code]


Clase 3

[ code ]
...
[ / code]

En tu ejercicio tendrías diversas cosas a mejorar.

Clase CocinaCasa:

El constructor compila pero no es correcto si nos atenemos a los estándares. Podrías tener un constructor

Código: [Seleccionar]
    public CocinaCasa(){
        esIndependiente = false;
        numeroDeFuegos = 0;
    }

O bien un constructor

Código: [Seleccionar]
    public CocinaCasa(boolean esIndependienteC, int numeroDeFuegosC){
        esIndependiente = esIndependienteC;
        numeroDeFuegos = numeroDeFuegosC;
    }

O bien ambos, pero el constructor que tú has definido no es en principio adecuado (podría usarse si estuviera justificado, pero no parece que aquí esté justificado).

En la clase CocinaCasa deberías tener métodos get y set para cada uno de los atributos, no los tienes.

En la clase SalonCasa podemos aplicar los mismos comentarios.

En la clase Casa además de faltarte los get y los set tienes esto en el constructor:

salonCasa = new SalonCasa(salonCasa.getNumeroTV());

Aquí parece que te has confundido y habrías querido escribir

salonCasa = new SalonCasa(salonCasaC.getNumeroTV());

El error te lo tira porque al hacer salonCasa = new SalonCasa(salonCasa.getNumeroTV()); el objeto salonCasa no está definido. Si el objeto no ha sido creado, no puedes invocar un método sobre él.

También podrías tener el parámetro con el mismo nombre que el atributo y utilizar this para diferenciarlos, por ejemplo:

Código: [Seleccionar]
    public Casa(double superficie, String direccion, SalonCasa saloncasa, CocinaCasa cocinaCasa){
        this.superficie = superficie;
        this.direccion = direccion;
        this.salonCasa = new SalonCasa(salonCasa.getNumeroTV());
        this.cocina = new CocinaCasa(cocinaCasa.getEsIndependiente());
    }   


Te recomiendo revisar los contenidos previos del curso y hacer todos los ejercicios previos si no lo has hecho. También mirar estos hilos:

Ejercicio CU00641B: https://www.aprenderaprogramar.com/foros/index.php?topic=1220.0

Ejercicio CU00642B: https://www.aprenderaprogramar.com/foros/index.php?topic=1238.0

Saludos

255
Hola Pedro los ejercicios en general los veo bien resueltos y además estás haciendo uso de aspectos clave de JavaScript correctamente. Hay un aspecto del ejercicio 3 que no me acaba de gustar, y es que si no detienes la animación los "objetos voladores" continúan yéndose hacia la derecha indefinidamente y esto da lugar a que el navegador vaya creando un scroll hacia la derecha que tendería a hacerse infinitamente grande y posiblemente llevara a que se bloqueara. En general debemos prever la posibilidad de que el usuario no haga lo que esperamos (en este caso por ejemplo pulsar el botón detener) y tener previsto algo que impida el bloqueo. En este caso podría ser que los objetos voladores reboten en el límite derecho de la pantalla y vuelvan hacia atrás, o que la animación se detenga cuando los objetos voladores lleguen al límite derecho.

Saludos

256
Hola Enzo tu esquema está correcto, la única recomendación es mejorar la forma de nombrar las clases según explicación en https://www.aprenderaprogramar.com/foros/index.php?topic=3035.msg13698#msg13698

Saludos

257
Buenos días, las respuestas son correctas

La duda sobre la atrib: atrib es un parámetro que se recibe para un constructor. Sin embargo, después no se utiliza, por lo tanto tienes razón en el sentido de que ese parámetro no parece útil porque en este código no se utiliza para nada. Sin embargo ten en cuenta que esto es un ejercicio y también que este código podría ser el principio de un código más extenso y que ese parámetro pudiera ser útil posteriormente.

En este hilo se hacen algunos comentarios interesantes sobre este ejercicio, https://www.aprenderaprogramar.com/foros/index.php?topic=2354.0

Saludos

258
Buenos días Pedro

Felicitarte porque el ejercicio no era sencillo y lo has resuelto perfectamente. Quizás haya algún detalle mejorable o alguna cosa que se pudiera haber hecho de otra manera pero el código se ve limpio y bien estructurado, buen diseño con buena división por funciones, etc. Mi enhorabuena!

Saludos

259
Buenos días nitacardi

Te indico las mejoras que deberías introducir:

- Inicializar los atributos en el constructor según la convención. Explicado en https://www.aprenderaprogramar.com/foros/index.php?topic=2826.0

- Te faltan los métodos get para obtener los valores de los atributos según pedía el ejercicio (y que incluiremos en general en todas las clases que creemos, al igual que los set)

En la respuesta https://www.aprenderaprogramar.com/foros/index.php?topic=1300.0 puedes ver algunos detalles interesantes.

Saludos cordiales

260
Buenos días, las respuestas son correctas. Los objetos de tipo Iterator nos proveen de métodos que facilitan el recorrido de colecciones como hasNext(), next() y remove()

Saludos

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