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 - RaGa

Páginas: 1 ... 4 5 6 7 8 [9] 10 11 12
161
Muchas gracias Alex. Tus observaciones, recomendaciones y correcciones son un gran aliciente.
Me interesa mucho ir avanzar en el lenguaje, poder ir utilizando y relacionando las cosas nuevas con las ya aprendidas, y fundamentalmente ir madurando e incorporando la filosofía de POO.  :)

162
Hola Matru:

El ejercicio está bien estructurado, lo cual hace que sea más facil de seguir. Te felicito por ello, es una muy buena práctica la prolijidad, al igual que el agregado de comentarios. Agradecerás haberlo hecho de esa forma al realizar mantenimientos futuros sobre tus propios códigos.

Respecto del ejercicio te haré una observación que creo puede ser producto de no haber interpretado bien la consigna del ejercicio.
Tanto las clases dimeMotor() como la clase dimeSiMotorEsParaAgua(), deben evaular el campo tipoMotor. En tu método dimeSiMotorEsParaAgua realizas la evaluación sobre un campo de instancia llamada motor lo cuál no es correcto.

Deberías reemplazar:

Código: [Seleccionar]
    public boolean dimeSiMotorEsParaAgua(){
        boolean motorEsParaAgua = false;
        if (motor == 1) {motorEsParaAgua= true;}
        return motorEsParaAgua;}

por :

Código: [Seleccionar]
    public boolean dimeSiMotorEsParaAgua(){
        boolean motorEsParaAgua = false;
        if (tipoBomba == 1) {motorEsParaAgua= true;}
        return motorEsParaAgua;}

El campo de instancia motor no debería existir ya que no tiene utilidad.

Analízalo y cualquier duda estamos acá para ayudarte. Saludos!

163
Quiero aportar en este hilo un código sobre el que he estado trabajando basado en el ejercicio resuelto de la Entrega Nº912.
La idea es tratar de poder hacer algo modular, dejando la posibilidad de ampliaciones futuras. Y por qué no, hacer código reutilizable en otro momento.
Me interesa poner a consideración estas premisas. Si bien el programa hace lo que tiene que hacer, me interesa saber si estoy en la senda de pensar con la filosfía de POO.

Volviendo al código entonces: la organización está establecida en paquetes.

En el paquete Entidades, se almacenará la clase Persona. Este package podría almacenar en un futuro clases como Profesor, Taxi, Motor, etc. según las necesidades.

Hay otro package que se denomina IteradoresDeEntidades.
En este paquete tenemos una clase llamada CreadorIteradorColeccionesTipoPersona. Esta clase sirve para crear un iterador ya sea sobre un vector, o sobre un objeto tipo List, que contengan objetos Persona.

Llegado el caso que en el paquete Entidades además de la clase Persona, se almacenara una clase llamada Taxi, entonces en el paquete IteradorDeEntidades se crearía la clase CreadorIteradorColeccionesTipoTaxi, que serviría para crear iteradores sobre vectores u objetos tipo List que contengan objetos tipo Taxi.

En la raíz tenemos -por ahora- dos clases de interés: ConjuntoPersonas y ConjuntoPersonas2 (cada una con sus respectivas clase Test).

ConjuntoPersonas es una clase que implementa la interface Iterable y contiene como campo de instancia un vector de objetos Persona.
ConjuntoPersonas2 es una clase que implementa la interface Iterable y contiene como campo de instancia una lista List de objetos Persona.

Como podemos ver (y es el objetivo de este código), crear clases que implementen la interface Iterable sobre colecciones que contengan objetos de tipo Persona se hace mucho más sencillo.

(Los archivos se adjuntan. Loguearse previamente para poder descargarlos).

164
Hola Matru.

Por mi parte he de decirte que a tu ejercicio lo veo perfecto!
Destaco la muy buena organización del código incluyendo comentarios.
A seguir adelante!

165
Muy esclarecedora tu explicación Alex. Muchas gracias.

166
Mi consulta es sobre cómo debo leer (interpretar) la información del API.
En este caso analicemos los dos métodos utilizados en el ejemplo resuelto, los cuales  pertenecen a la clase Collections.

Analicemos el siguiente método:

static <T extends Comparable<? super T>> void       sort(List<T> list)

Lo que entiendo de este método es que:
el método es un método estático tipo procedimiento (no devuelve nada).
Es aplicable sobre objetos tipo T, los que implementan la interface Comparable (o heredan una clase que la implemente).
Y que a su vez esa interface Comparable está definida sobre objetos que heredan la clase T.
El parámetro que se debe pasar al método es un objeto tipo List definido sobre objetos tipo T.

¿ Esto es correcto ?

Analizando la información del API de este otro método:

static <T> void              sort(List<T> list, Comparator<? super T> c)

entiendo que: es una método estático tipo procedimiento también.
Los parámetros que se deben pasar al método son dos:
El primero, un objeto tipo List definido sobre objetos tipo T.
El segundo, un objeto tipo Comparator definido sobre objetos que hereden la clase T.

¿ Esto es correcto ?

167
Hola Macarena:

El error que señales se debe a que has declarado el nombre de la cláse como Depósito, y el nombre del Constructor como Deposito.
Quítale el acento ortográfico al nombre de clase. En java no utilices ni acentos ortográficos, ni la letra "ñ" (en su lugar se utiliza 'nn").

Además de eso tienes que corregir el código ya que hay varias líneas que les falta el ";" al final de las mismas. También has omitido un "}" que cierre el while. También tienes dos atributos con errores de tipeado de sus nombres cuando los vuelves a usar. Y por último escribiste printl cuando en realidad debe ser println.

Te recomiendo que revises el código nuevamente teniendo en cuenta estas observaciones. Saludos!

168
Hola Macarena:

Al ejercicio propuesto por la Lección Nº49 lo veo muy bien, correcto!

Con respecto a lo que preguntas al final, entiendo quisiste imprimir lo que devuelve el método combinacion del ejercicio resuelto en la lección, cierto?.

Antes que nada, fíjate que la instrucción debe terminar en ";" y no en un punto como escribiste tu.
Por otro lado, debes instanciar previamente un objeto tipo Combinacion de manera gráfica, sobre el cual se llamará luego el método combinacion en el code pad.
Asegúrate que en el code pad el nombre del objeto sobre el cual llamas al método, sea el mismo nombre del objeto que instanciaste previamente de manera gráfica.

Por lo tanto, si el objeto que se instancia de manera gráfica se llama combinad1, luego en el code pad deberías escribir:

Código: [Seleccionar]
System.out.println(combinad1.combinacion("Thomas","Alva Edison"));

169
Hola Macarena:

Este método corresponde a lo que se llamará luego "método principal".
No quiero ahondar en esto en esta instancia del curso. Pienso que deberías continuar y más adelante se tratará en detalle sobre ello en una lección. Los temas están ordenados de manera sistemática y respondiendo a una razón pedagógica.
Igualmente destaco y celebro (una vez más) el interés que demuestras en cada ejercicio por que no quede nada sin entender.  :)

170
Hola Macarena:

Tu ejercicio está muy bien, y funciona correctamente.
Ya que noto quieres optimización aún más el código, te planteo una alternativa de codificación declarando solo un atributo dentro del método multiplicarPorDieces.
Analízalo, compílalo y cualquier duda acá estamos para ayudarte.

Código: [Seleccionar]
public class MultiplicadorDieces {
    public MultiplicadorDieces() {
    }
   
    public double multiplicarPorDieces (double m,int n){
        double resultado=m;
       
        for( int i=1; i<=n; i++){
            resultado = resultado*10;
        }
       
            return resultado;
    }
 
}


Una observación:
En tu Constructor de clase escribiste.

Código: [Seleccionar]
public MultiplicadorDieces() {};
ese último ";" no es necesario. El compilador no marca error ya que considera que es una línea sin ningúna instrucción.
Equivale a escribir por ejemplo:

Código: [Seleccionar]
public MultiplicadorDieces() {}
//línea que no será tomada en cuenta por el compilador//;

La duda en cuanto a la precisión del tipo double está muy bien explicada en aquí:

https://www.aprenderaprogramar.com/foros/index.php?topic=1972.0

Saludos.

171
Hola Macarena:

Bueno, te voy a responder con un ejemplo:

En el ejercicio CU00642B, dentro del código de la clase Casa, podría haberse incluido un método más, supongamos llamado crearSalonCasa()

De esa manera, este nuevo método podría codificarse así:

Citar
public void crearSalonCasa(){
   salonCasa = new SalonCasa();
}

Entonces:
Lo que hace este método es instanciar (osea crear) el objeto salonCasa tipo SalonCasa mediante la instruccion new.
Recordemos que el objeto tiene que haber sido antes declarado. Y eso ya lo hicimos previamente cuando en nuestro código habíamos escrito:

Código: [Seleccionar]
private SalonCasa salonCasa;

Ten en cuenta que este nuevo objeto que se crea, el ide de BlueJ no lo mostrará como cuando instanciábamos objetos de manera gráfica. Pero, si bien no lo vemos, si existe.

Ya en las próximas lecciones se verá todo esto con más profundidad, mejor explicado, con ejemplos y ejercicios, donde tendrás la oportunidad de crear objetos usando la instruccion new.

172
Hola Macarena.

Revisé tu código y por mi parte lo veo perfecto! También he dedecirte que esta vez usaste bien las etiquetas para que los códigos publicados queden bien ordenados, felicitaciones.

Saludos!

173
Hola Macarena!

El ejercicio está muy bien. Funciona correctamente. Lo único que podría decir es que no respetaste cómo inicilizar los campos en los Constructores nada más.
En la clase SalonCasa se debía inicializar el campo tipoSalon a "desconocido", y tu lo inicializaste como: tipoSalon = ""
Lo mismo sucedió en la clase CocinaCasa, el campo esIdepenediente debía inicializarse a false.

Complilé los códigos de las 3 clases que publicaste , hice correr el programa, cree objetos de los tres tipos, y no me dió ningún error.
Vuelve a intentarlo, quizás cometiste algún error en esa oportunidad. Para probar tu programa deberías crear primero un objeto SalonCasa y un objeto CocinaCasa. Posteriormente un objeto tipo Casa.
Cuando llames al método setSalonCasa() del objeto tipo Casa, escoge en la ventana que se despliega al objeto tipo SalonCasa que creaste previamente. Luego, cuando llames al método setCocina() del objeto tipo Casa, en la ventana que se despliega escoge al objeto tipo CocinaCasa que creaste previamente.

Pruébalo y cualquier cosa estamos aqui para ayudarte si hay alguna duda, o se presentan problemas.

En otro orden de cosas, cuando publiques los códigos, asegúrate que entre [ code ] [ /code ] vaya el código de una sola clase.

Al publicar entonces tres clases como en este ejercicio, quedaría:

[ code ]  aquí iría el código de la clase SalonCasa [ /code ]

[ code ]  aquí iría el código de la clase CocinaCasa [ /code ]

[ code ]  aquí iría el código de la clase Casa [ /code ]

De esta manera queda más ordenado sin que estén los tres códigos juntos.

Saludos!

174
Hola mzamora60:

Esto que tu observas es por el grado de precisión al trabajar con un atributo del tipo double. El resultado es el esperable, está bien que de ese resultado al hacer la operación que realizas.

De todos modos, fíjate que el grado de error en el resultado es prácticamente cero en una aplicación práctica, del orden de 0.00000000000003 que al ser tan bajo podríamos despreciarlo.

175
Hola!

Estuve haciendo la prueba de ver qué sucedía cuando usamos el for-each para recorrer un objeto tipo ConjuntoPersonas, y es cierto lo que dice Lorenzo31.
Si corremos paso-por-paso el código Programa nos damos cuenta que al entrar en la instrucción for (del for-each) se llama al método iterator() de la clase ConjuntoPersonas.
Por lo tanto for-each utiliza el método iterator() de la clase ConjuntoPersonas, de la misma manera que si utilizáramos un iterador sobre el objeto ConjuntoPersonas y luego llamáramos a sus métodos hasNext() y Next().

Es decir, que la utilización de los métodos declarados en la clase concreta MiIteratorPersona (que son los métodos que estamos obligados a implementar de la interface Iterator) son utilizados de la misma manera tanto al hacer en nuestro código Programa:

Código: [Seleccionar]
Iterator<Persona> it1 = cp.iterator();

        while (it1.hasNext()){

            Persona tmp = it1.next();

            System.out.println("La persona:"+tmp.dni+" tiene una edad de:"+tmp.edad);

        }

como si hiciéramos :

Código: [Seleccionar]
for (Persona p : cp) // Esto es un for extendido o for-each{
            System.out.println("La persona:"+p.dni+" tiene una edad de:"+p.edad);
        }

Es como si  (y por favor que se tome bien el entrecomillado) "el for-each fuese una máscara del iterador", ambas cosas funcionalmente hacen lo mismo.

Otro dato importante que va en el mismo sentido: no podríamos usar for-each para un objeto tipo ConjuntoPersonas si ConjuntoPersonas no implementara la interfaz Iterable.
Una forma simple de hacer saltar esto sería: haciendo un cambio en una línea de la clase ConjuntoPersonas:

Código: [Seleccionar]
public class ConjuntoPersonas implements Iterable<Persona>{

por:

Código: [Seleccionar]
public class ConjuntoPersonas {

(y si ningún otro cambio más en el código). Al compilar la clase Persona nos da un error de compilación en el for-each con la siguiente leyenda:

for-each not applicable to expression type
  required: array or java.lang.Iterable; found: ConjuntoPersonas

176
Todo correcto Macarena! por mi parte lo veo muy bien al ejercicio! No tengo ninguna observación para hacerte. A seguir adelante.
Saludos!

177
Hola Macarena!

Revisé tu código y por mi parte lo veo perfecto! No tengo observaciones para hacerte.
Adelante!

178
Hola, respecto de la Entrega Nº912 del curso, me gustaría hacer un aporte y una consulta:


Aporte:

El ejercicio resulto de la entega da un Warning cuando uno compila la clase ConjuntoPersonas.
Esta advertencia deja de aparecer si hacemos el siguiente cambio en el método iterator()

Código: [Seleccionar]
public Iterator<Persona> iterator() {   
        Iterator it = new MiIteratorPersona();
        return it;         
    }

por:

Código: [Seleccionar]
public Iterator<Persona> iterator() {
        Iterator<Persona> it = new MiIteratorPersona();
        return it;         
    }

Consulta:

En un párrafo de la entrega se dice:

Citar
Piensa que un iterador viene siendo “un clon” de la colección a recorrer. Es decir, en vez de operar directamente sobre la colección original operamos sobre una copia.

¿ Cuando se dice colección, a qué se refiere ? Porque si se refiere a lo que veníamos llamando colección: un vector, un ArrayList, un LinkedList, cualquier tipo List, etc. entonces por la forma en que vemos está implementada la interface Iterable, me da la sensación que no sería tan así, no es que "en vez de operar directamente sobre la colección original operamos sobre una copia."
Diría más bien que se crea un objeto distinto, pero que al fin y al cabo referencia a la misma coleccion (en el caso del ejemplo resuelto un vector) perteneciente a la clase sobre la cual se implementa la interface Iterable.

No estaríamos creando un "copia de la colección" en donde operar, que ahí si podríamos creo hablar de un clon de la colección.
En este caso sería tener un nuevo objeto (el iterador) que referencia a la colección del objeto cuyo tipo implementa la interface Iterable, pero la colección siempre es la misma (el vector).

¿ Estoy en lo correcto ?


179
Perdón, una aclaración. Donde escribí:
Citar
Ya que tu ejercicio está muy bien, te propongo analizar otra forma de implementar el método diametroRueda(). Fíjate en el siguiente código:

quise decir en realidad:
Citar
Ya que tu ejercicio está muy bien, te propongo analizar otra forma de implementar el método comprobarDimensiones(). Fíjate en el siguiente código:

Mil disculpas, confundí el nombre del método jeje   ;D

180
Hola Macarena!

Felicitaciones por iniciar un nuevo tema para tu ejercicio.
Revisé tu código y lo veo muy bien! Has seguido las recomendaciones y sugerencias perfectamente.

Ya que tu ejercicio está muy bien, te propongo analizar otra forma de implementar el método diametroRueda(). Fíjate en el siguiente código:

Código: [Seleccionar]
public void comprobarDimensiones(){
    if (diametro>1.4){
        System.out.println ("La rueda es para un vehículo grande.");
        if (grosor<0.4) System.out.println ("El grosor para esta rueda es inferior al recomendado.");
    }
    else if ((diametro>0.8)&&(diametro<=1.4)){
        System.out.println ("La rueda es para un vehículo mediano.");
        if (grosor<0.25) System.out.println ("El grosor para esta rueda es inferior al recomendado.");
    }
    else System.out.println ("La rueda es para un vehículo pequeño");
}

Es otra forma de hacer lo mísmo, ambos métodos (este que te escribo y el tuyo) funcionan correctamente. La diferencia es que esta forma de implementar el método usa lo que se llaman "condicionales if anidados" (un condicional if dentro de otro condicional if).
Analízalo, compáralo, y cualquier duda acá estamos para ayudarte.

Adelante! lo vienes haciendo muy bien!

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

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