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

Páginas: 1 2 3 4 [5] 6 7 8 9 10 ... 25
81
Hola calderas

Ejercicio correcto. Bien.

Respecto al número de decimales. En la clase Math encontrarás el método rint(double) con el que puedes conseguir esos decimales con redondeo.

La sintaxis a usar es la siguiente:

   valorDouble = Math.rint(valorDouble * potenciaDeDiez) / potenciaDeDiez;

donde valorDouble es el valor con muchos decimales y potenciaDeDiez es la unidad seguida de tantos ceros como decimales quieres.

Y el código siguiente presenta los caracteres ASCII entre el 30 y el 255.
Aquí están caracteres que no aparecen en el teclado incluso el ²

Código: [Seleccionar]
        for (int i=1030; i < 1256;i++) {
            System.out.print(i + " " + (char)(i-1000) + " ");
            if ((i % 10) == 9)  System.out.println();
        }

Saludos

82
Hola Lorenzo

Ejercicio correcto.

El uso de this en el constructor sin parámetros es válido. Lo único, es que se hace raro que cada profesor nuevo que venga se llame Juan en lugar de dejar la casilla vacía, es decir "" una cadena vacía, etc. etc...

El constructor sin parámetros se usa para asignar valores por defecto a los atributos.
Se pueden asingar los parámetros por defecto usando this. ¿Cómo lo harías?

Saludos

83
Hola Lorenzo

Respuestas correctas:
a, b y c. OK

Saludos

84
Hola erivalo

Lo que le ocurre a tu código es que cuando entras en el arraySet con su iterador  it, utilizas dos veces it.next() antes de leer datos.
Así pues, el primer dato que lees no es el primero sino el segundo pues has dado dos saltos.

El problema está en las líneas
25    Iterator<String> itString = it.next().iterator();
36    Iterator<Integer> itInteger = it.next().iterator();

donde antes de leer, ya estas saltando al siguiente elemento usando it.next()

Solución: Cuando obtienes el primer elemento con el método it.next(), lo guardas en una variable/objeto temporal. Y usas ésta para hacer todas las consultas y asignaciones.
En cada ciclo del while se ejecutará el método it.next() dando acceso al siguiente elemento del array y así hasta terminar.

Compilando tu código he visto que dará un warning en las líneas 25 y 36
Eliminando el tipo de objeto en la declaración se soluciona.
Ejem.
    Iterator<String> itString = it.next().iterator();
cambiarla a:
    Iterator itString = it.next().iterator();

¿Por qué. Te preguntarás?. Pues porque Java en tiempo de compilación ve que este iterador it dará acceso a dos tipo de datos (String e Integer) y que en estas declaraciones puede no recibirse el objeto adecuado. Por ello el warning.
La solución, la que apuntamos. Elminar el tipo de objeto en la declaración y, ya en tiempo de ejecución Java asignará dinámicamente el tipo adecuado.

Saludos

85
Hola Dan

Ejercicio correcto.

A partir de ahora gracias a la clase Math podemos hacer cálculos de todo tipo.

Saludos

86
Hola Dan

Ejercicio correcto.

Respecto al redondeo, en próximas lecciones hablaremos del API de Java y buscando en la clase Math encontraremos el método round(double) que sirve para redondear.

Saludos

87
Hola.

Hace tiempo que me ronda por la cabeza una duda que me plantean las opciones para pasar objetos como parámetros a las clases.

Me refiero a estas dos opciones.

La opción A:  (asignación por igualdad)
    public void setPersona(Persona persona1) { 
        persona = new Persona(persona1.getNombre(), persona1.getEdad());
    }
No me plantea ninguna duda. La considero perfecta e incorruptible. Se puede perder el objeto persona1 pues ya ha dado una copia de sus datos.

La duda la tengo en esta opción B: (asignación por identidad)
    public void setPersona(Persona persona1) {
        persona = persona1;
    }
Sobre esta opción he leido que si persona1 cambia más tarde, tal vez ¿? el objeto persona cambie en la misma forma sin haberlo decidido yo así.

He creado el código que adjunto en el mensaje intentando simular ese cambio inesperado, y he aquí la salida que obtengo:

Salida.txt
Código: [Seleccionar]
Fecha: 23/03/2015 > 02:06:01                               
01) Creados agentes: ag[0] = new Agente("A00",30)               y ag[1] = new Agente("A11",31)
02) ag[0]. ref.: ...Agente@143e87d                              ag[1]. ref.: ...Agente@1549b82
03) ····················idAgente: A00                           ····················idAgente: A11
04) ···········ExperienciaPuntos: 30                            ···········ExperienciaPuntos: 31
                                                           
05) Creados perros: pe[0] = new Perro("Labrador",false)         y  pe[1] = new Perro("Dogo",true)
06) pe[0]. ref.: ...Perro@1ad81d2                               pe[1]. ref.: ...Perro@262adc
07) ························Raza: Labrador                      ························Raza: Dogo
08) ················Esterilizado: false                         ················Esterilizado: true
                                                           
09) Creados equipos: eq[0] = new Equipo("Equipo A",ag[0],pe[0]) y  eq[1] = new Equipo("Mister T",ag[1],pe[1])
10) eq[0]<alias,ag,pe>. Ref.: ...Equipo@1c7d5b2                 eq[1]<alias,ag,pe>. Ref.: ...Equipo@9e9a07
11) ·······················Alias: Equipo A                      ·······················Alias: Mister T
12) Ref. agente: ...Agente@143e87d                              Ref. agente: ...Agente@1549b82
13) ····················idAgente: A00                           ····················idAgente: A11
14) ···········ExperienciaPuntos: 30                            ···········ExperienciaPuntos: 31
15) Ref. perro: ...Perro@927633                                 Ref. perro: ...Perro@18e2a42
16) ························Raza: Labrador                      ························Raza: Dogo
17) ················Esterilizado: false                         ················Esterilizado: true
                                                           
18) Asignación de identidad. ag[0] = ag[1]                      Asignación de identidad. pe[0] = pe[1]
19) ag[0]. ref.: ...Agente@1549b82                              ag[1]. ref.: ...Agente@1549b82
20) ····················idAgente: A11                           ····················idAgente: A11
21) ···········ExperienciaPuntos: 31                            ···········ExperienciaPuntos: 31
22) pe[0]. ref.: ...Perro@262adc                                pe[1]. ref.: ...Perro@262adc
23) ························Raza: Dogo                          ························Raza: Dogo
24) ················Esterilizado: true                          ················Esterilizado: true
25) eq[0]<alias,ag,pe>. Ref.: ...Equipo@1c7d5b2                 eq[1]<alias,ag,pe>. Ref.: ...Equipo@9e9a07
26) ·······················Alias: Equipo A                      ·······················Alias: Mister T
27) Ref. agente: ...Agente@143e87d                              Ref. agente: ...Agente@1549b82
28) ····················idAgente: A00                           ····················idAgente: A11
29) ···········ExperienciaPuntos: 30                            ···········ExperienciaPuntos: 31
30) Ref. perro: ...Perro@927633                                 Ref. perro: ...Perro@18e2a42
31) ························Raza: Labrador                      ························Raza: Dogo
32) ················Esterilizado: false                         ················Esterilizado: true
                                                           
33) Objeto nuevo. ag[0] =  new Agente()                         Objeto nuevo. pe[0] = new Perro()
34) ag[0]. ref.: ...Agente@1419cf7                              ag[1]. ref.: ...Agente@1549b82
35) ····················idAgente: Sin Id                        ····················idAgente: A11
36) ···········ExperienciaPuntos: 0                             ···········ExperienciaPuntos: 31
37) pe[0]. ref.: ...Perro@b44131                                pe[1]. ref.: ...Perro@262adc
38) ························Raza: Desconocida                   ························Raza: Dogo
39) ················Esterilizado: false                         ················Esterilizado: true
40) eq[0]<alias,ag,pe>. Ref.: ...Equipo@1c7d5b2                 eq[1]<alias,ag,pe>. Ref.: ...Equipo@9e9a07
41) ·······················Alias: Equipo A                      ·······················Alias: Mister T
42) Ref. agente: ...Agente@143e87d                              Ref. agente: ...Agente@1549b82
43) ····················idAgente: A00                           ····················idAgente: A11
44) ···········ExperienciaPuntos: 30                            ···········ExperienciaPuntos: 31
45) Ref. perro: ...Perro@927633                                 Ref. perro: ...Perro@18e2a42
46) ························Raza: Labrador                      ························Raza: Dogo
47) ················Esterilizado: false                         ················Esterilizado: true


En la salida del programa presento en dos columnas los dos elementos de cada array: agente, perro y equipo creados. Cada clase tiene sus propios atributos y en la clase Equipo dos atributos son de tipo Agente y Perro.

En la clase Equipo el atributo de tipo Perro lo inicializo o modifico siempre con la opción A, citada arriba (establezco una asignación de igualdad), y el atributo de tipo Agente lo modifico con la opción B, (establezco siempre una asignación de identidad).

Cada vez que en la salida se muestra un objeto, adjunta va una referencia que Java crea única para ese objeto (es la respuesta que da el método toString(), no sobreescrito a propósito para poder mostrar esa información.)
Esto que yo llamo referencia, supongo que viene a ser una forma que tiene Java de ligar el objeto en cuestión con los datos de este objeto en la memoria. ¿?
Esta referencia cambia en cada ejecución (la memoria no debe ser igual en todo momento).

En la salida, hasta la línea 17 se crean y presentan los objetos.
En la línea 18 se modifican un objeto de tipo Agente y otro de tipo Perro.
Hasta la línea 32 se vuelven a mostrar todos los objetos.
En la línea 33 se vuelven a modificar los mismos objetos de tipo Agente y de tipo Perro.
Y hasta el final se vuelven a mostrar todos los objetos.


En la información mostrada, se observa lo siguiente:

El objeto pe[1] que no se ha modificado en ningún momento, mantiene sus atributos y su referencia en todo momento. Este mismo objeto al colocarlo dentro del  objeto equipo, cambia su referencia y la mantiene siempre dentro del objeto equipo (pues su asignación ha sido por igualdad).

El objeto pe[0] al que se le han hecho cambios, cambia su contenido y también su referencia en cada cambio. Una vez este objeto se coloca dentro del objeto equipo, cambia su referencia y la mantiene junto con los datos.

El objeto ag[1] que no se ha modificado en ningún momento, mantiene su referencia incluso dentro del objeto equipo (pues su asignación es por identidad), tampoco cambian sus datos.

El objeto ag[0] al que se le han hecho cambios, cambia su contenido cada vez al igual que su referencia. Al colocarlo dentro del objeto equipo, mantiene sus datos en todo momento al igual que su referencia (que es la misma que en su creación antes de modificar el objeto).

El objeto eq[1] mantiene su referencia en todo momento aunque han cambiado algunas referencias internas. Nunca cambian los datos.

El objeto eq[0] mantiene su referencia en todo momento aunque cambian algunas referencias internas así como datos.


Conclusión:
No se pierden datos de objetos pasados como parámetros tanto si se usa la opción A -era previsible-, como la B -en la que tenía dudas-
Si existe el riesgo a que un atributo inicializado o actualizado con un objetoZ revierta su contenido al cambiar externamente el objetoZ debe ser a un nivel muy profundo y que yo no sé reproducir.

Os pido vuestros comentarios después de haber mascullado/triturado todo el mamotreto anterior. Gracias por vuestra opinión.

Saludos

88
Hola Dan

Ejercicio perfecto. OK

Respecto a tu pregunta:
Citar
Finalmente, mi pregunta es: ¿Es buena idea tener dos constructores en una clase?

Tal vez al hecho de tener sobrecarga de constructores lo veas como la desventaja de soportar un peso demasiado grande.
Pero no, es todo lo contrario. Piensa en el mecánico que en su caja de herramientas tiene no una, sino varias llaves. Y tiene la posibilidad de escoger la que desee según la ocasión para realizar su reparación.
Así pues, has de pensar en esa sobrecarga de métodos como una ventaja.

Saludos

89
Hola Lorenzo

Has presentado dos mensajes para este ejercicio.
Si lo has hecho porque ya hacía tiempo que habías presentado el primero.  No hay problema.
Si entras a leer tu mensaje, verás que hay disponible un botón 'Modificar'. al pulsarlo, puedes editar tu propio mensaje.
Esta opción está disponible para esto.
O bien, usa el botón responder y añade el segundo mensaje en el mismo hilo.

De momento los he unido en el mismo hilo.


Respecto al código. Nada que objetar al contrario, has hecho más de lo que se pedía con tu método combinaLetras(...). Muy original.
Mezclar las letras de las dos palabras.

Respecto al segundo mensaje.
Si, tal como dices el 'espacio en blanco' es coherente con el código.
Y también como dices los atributos no usados, pueden eliminarse.

Citar
También he detectado que los métodos, en el texto, están en mayúscula, es un error o tiene que ver algo que sean de la Clase String?
Si Lorenzo, es un error que ha colado.
En el código de la clase Combinador sobre fondo gris en la entrega CU00650B:
    String Combinacion (String valor_texto1, String valor_texto2)  {...}
    String CombinadoSiempre (String valor_texto1, String valor_texto2)  {...}
    String CombinadoSiempre = ""; //Cadena vacía, variable local

Formalmente debía ser:
    String combinacion (String valor_texto1, String valor_texto2)  {...}
    String combinadoSiempre (String valor_texto1, String valor_texto2)  {...}
    String combinadoSiempre = ""; //Cadena vacía, variable local

Cambiando las iniciales a minúscula como proclama la convención de nombres. Y si queremos ser puristas, tal vez declarar los métodos como public.

Gracias por avisar Lorenzo.


Desde aquí hago un llamamiento al departamento de mantenimiento para que tome nota a fin de realizar las rectificaciones oportunas.

Saludos

90
Hola Dan

Ejercicio correcto.

Si tu constructor inicializa con los parámetros recibidos, no es escusa para no crear los setters. Siempre se puede necesitar modificar un atributo.

Has de tener presente que si una clase tiene atributos, ha de tener setters y getters.

Saludos

91
Hola Lorenzo

Ejercicio correcto.

Bien, a controlar los parámetros incorrectos. OK

Saludos

92
Hola Lorenzo

Ejercicio correcto.

Y si, el curso a mi me parece una joya, se lo han currado bien.
Yo he aprendido Java aquí.

Saludos

93
Hola Lorenzo

Ejercicio correcto.

No es malo usar muchas variables si para tí clarifica el código. Aún así, te comprimo el método multiplicarPorDiez

Código: [Seleccionar]
    public double multiplicarPorDiez(double valorNumero, int numeroCeros){
        int dieces=1;
       
        for (int i=1;i<=numeroCeros;i++){
           dieces=dieces*10;}
       
        return valorNumero * dieces;
    }

Y en el método recursionMultiplicar le quito la condición else if y funciona igual.

Código: [Seleccionar]
    public double recursionMultiplicar(double valorNumero, int numeroCeros){

        if (numeroCeros==0){return valorNumero;
        } else { return valorNumero * recursionMultiplicar(10, numeroCeros-1);}
    }

Saludos

94
Hola emma

Tu clase compila y cumple su cometido, incluyendo el método calculoParaMultiploEdad

Te pongo una indicación a tener en cuenta.
Cuando se crea un constructor asignando unos valores por defecto a los atributos, se refiere a:

Los atributos String se inicializan con cadena vacía ""
Y tal como tu has hecho los int a cero, y los boolean a false.

Por lo demás, el resto bien como te he apuntado.

Saludos

95
Hola Dan

A las palabras clave public y private se les llama: modificadores de acceso.
Que en otras palabras quiere decir que establecen o estipulan quien puede acceder a esos atributos, variables o métodos.

Refiriéndonos a los atributos. Ejem. La declaración:
    private String nombre;
Significa que la instrucción
    nombre = valorNombre;
Solo puede hacerse en la clase donde se ha declarado este atributo. El acceso a este atributo es privado exclusivamente a la clase propietaria del atributo.

Refiriéndonos a los métodos. Ejem.
    public getPrecio() { return precio; }
Este método getPrecio es accesible a todo el mundo, es de acceso público.
Tiene sentido que el método sea público, si no no podríamos invocarlo desde otra clase con main para averiguar el precio.

Espero haberte ayudado.

Saludos

96
Aprender a programar desde cero / Re:Entrega ejercicio CU00636B
« en: 18 de Marzo 2015, 22:39 »
Hola jogonzalez

Tu clase no compila. El comentario que has puesto al principio:
    Autor: jogonzalezmor
    fecha: 18-03-2015
sin sus etiquetas es el causante del error.

Después de arreglarlo, te comento dos cosas de tu clase para mejorar.

Declaras los atributos de tipo public, cuando lo correcto es que sean private.
Si son public el código funciona igual, pero a nadie le interesa que le toquen sus atributos, así que para otra vez ya lo sabes.

Tu método comprobarDimensiones está mal planteado. Para hacerlo bien puedes hacer lo siguiente.
Sigue los pasos a) y b) tal cual están en el enunciado.

a) Si el diámetro es superior a 1.4 debe mostrarse por consola el mensaje "La rueda es para un vehículo grande". Si es menor o igual a 1.4 pero mayor que 0.8 debe mostrarse por consola el mensaje "La rueda es para un vehículo mediano". Si no se cumplen ninguna de las condiciones anteriores debe mostrarse por pantalla el mensaje "La rueda es para un vehículo pequeño".

    si diametro MAYOR QUE 1.4  muestra   La rueda es para un vehículo grande
    pero si diametro MENOR o IGUAL  1.4   Y  MAYOR  0.8  muestra  La rueda es para un vehículo mediano
    si no   muestra   La rueda es para un vehículo pequeño

Las tres líneas anteriores son un                if ...  else if .....  else

b) Si el diámetro es superior a 1.4 con un grosor inferior a 0.4, ó si el diámetro es menor o igual a 1.4 pero mayor que 0.8, con un grosor inferior a 0.25, deberá mostrarse por consola el mensaje "El grosor para esta rueda es inferior al recomendado".

    si diametro MAYOR QUE 1.4   Y   grosor  MENOR  0.4
                O
                            si diametro MENOR o IGUAL 1.4    Y    MAYOR   0.8   Y  grosor   MENOR   0.25     muestra   El grosor para esta rueda es inferior al recomendado

Las tres líneas anteriores son el condicional de un solo if.
Nota: El texto que está en mayúsculas lo has de cambiar por los operadores lógicos correspondientes ==, >, >=, && y ||

Espero no haberte liado con mis explicaciones. Si tienes alguna consulta, ya lo sabes. Aquí nos tienes.

Saludos

97
Hola fedegaray

Ejercicio correcto.

En cuanto a qué estudiar o cómo continuar después de este curso, por mi parte no puedo guiarte mucho, excepto recomendarte los consejos que habrás visto del propio portal:
https://www.aprenderaprogramar.es/index.php?option=com_content&view=section&layout=blog&id=4&Itemid=18

Espero que alguien pueda darte más indicaciones.

Saludos.

98
Hola Dan

Ejercicio correcto.

A parte de que los atributos son directamente accesibles a las clases del package.
Quiero que te fijes en que tu método dimeSiMotorEsParaAgua funciona exactamete igual si le quitas el código del else. Pruébalo.

Saludos

99
Hola Dan

Ejercicio correcto.
Se repite la ausencia de private en la declaración de atributos.

Saludos.

100
Hola Dan

Ejercicio correcto, con una salvedad. Te descuidaste de declarar private los atributos de la clase.

La clase es igualmente operativa, pero sus atributos se pueden manipular saltándose los setters.

Saludos

Páginas: 1 2 3 4 [5] 6 7 8 9 10 ... 25

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