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 - César Krall

Páginas: 1 ... 38 39 40 41 42 [43] 44 45 46 47 48 ... 68
841
Comunidad / Re:Me presento
« en: 05 de Agosto 2014, 13:34 »
Toda participación es bienvenida, y más si es de alguien con buen nivel de conocimientos dispuesto a ayudar a la gente que está empezando  ;D

842
Hola Toni, todo bien, no veo nada que "necesite ser cambiado". Te traslado algunas ideas que te pueden ser útiles. Ya se ha comentado en diferentes hilos, pero los nombres de las clases reflejadas en el esquema no me parecen buenos. Supón que tienes que crear un objeto como Productos p1 = new Productos(); Ese plural que "refleja bien la organización de la empresa" no es tan útil de cara a la programación orientada a objetos. Es más claro Producto p1 = new Producto(); Piensa que una clase define un tipo, el tipo Producto, no el tipo Productos. En el caso de Frescos, Refrigerados, Congelados habría optado por PFresco, PRefrigerado y PCongelado ó ProdFresco, ProdRefrigerado y ProdCongelado. En el caso de PorAire, PorAgua y PorNitrogeno quizás PCPorAire, PCPorAgua y PCPorNitrogeno. En el esquema indicas superclase, subclases y clases. Si matizamos esto a fondo, todo son clases. Son superclases aquellas que tienen subclases. Y en algunos casos como Congelados, son al mismo tiempo subclase y superclase. Por eso en un esquema de este tipo puede bastar con indicar "Esquema de herencia entre clases". Todo matices, no te detengas demasiado con estos matices, pero creo que puedan ir ayudando a mejorar. Saludos,

843
Hola, abundando en el tema tal y como comenta dongo es un problema con el buffer de entrada de C que raramente te encontrarás en otros lenguajes... Al ejecutar scanf se almacena en el buffer la entrada previa al caracter oculto salto de línea, pero el salto de línea se queda en el buffer y en la siguiente iteración del bucle es leído directamente sin que te permita la introducción de respuesta, de ahí que termine el bucle.

Una alternativa es usar lo siguiente: scanf("%c%*c", &respuesta);

De esta manera, el segundo carácter (el salto de línea) no es almacenado en el buffer, con lo cual a la repetición del bucle ya no se encuentra que haya nada almacenado y te pide el carácter.

Si piensas que es un poco extraño efectivamente lo es  :-\


844
Perfecto toni, nada que objetar  :o Saludos


845
Veo que lo cazas todo al vuelo, y no sólo el código...


Si sigues programando verás que uno nunca para de aprender y de sorprenderse. A veces se habla de bugs, a veces de hacks, y a veces de cracks... pero siempre surgen curiosidades y cosas nuevas, seas más o menos veterano. Y una fuente para ir descubriendo todo esto es revisar el código que crean otras personas, siempre te encontrarás algún enfoque nuevo en el que no habías pensado anteriormente.

En el caso del iterator sin indicación del tipo se puede decir que dentro de la filosofía de Java de tipado medio a fuerte es poco recomendable, pero las normas están... para saltárselas de vez en cuando.  >:(

846
Aprender a programar desde cero / Re:Ejercicio CU00680B
« en: 30 de Julio 2014, 00:13 »
Todo bien Toni... (Igual sonríes con El valor dipo 'double'  ;D)


847
Tampoco creo que sea para avergonzarse, tómatelo con filosofía y como bien dices como algo constructivo. Muy buena esa imagen del oso-monstruo  :o :o :o :o y ánimo con la programación!


848
Hola, la solución más básica es precisamente usar BlueJ, el entorno que propone el curso. Tiene muchas ventajas y pocos inconvenientes en el sentido de que todo lo que aprendas te servirá para más tarde si quieres pasar a usar Eclipse, NetBeans o cualquier otro entorno de los considerados profesionales. Mucha gente piensa que BlueJ es un entorno limitado o sin capacidad para trabajar con Java, pero la realidad es que te permite desarrollar el mismo código que Eclipse o NetBeans ya que con lo que trabaja es con el JDK de Java, lo mismo con lo que trabaja Eclipse o NetBeans. En resumen, la recomendación es usar BlueJ al menos hasta la entrega CU00655 para aprovechar sus ventajas de cara al aprendizaje. En ese momento puede pasarse a usar cualquier otro entorno ya que el aprendizaje estará suficientemente avanzado. Espero haber aclarado algo, saludos!


849
Hola, gracias por tus comentarios.

Sobre el código te comento las cosas que he visto:

- Los métodos no deben incluir mensajes (como System.out.println ("La llanta ha pasado de tener una marca " + marca + " por el de " + valorMarca +"") ; ) excepto si el enunciado lo pide explícitamente.

- Un método set sólo debe encargarse de establecer el valor correspondiente para el atributo. Por tanto tu método setDiametro no está bien planteado, ya que además de esto hace un análisis del diámetro y muestra ciertos mensajes según ese análisis.

- Lo mismo ocurre con el método setGrosor.

Debes reescribir el código y ajustarte a lo que pide el enunciado. El enunciado dice: "Crea un método denominado comprobarDimensiones..." y esto no lo has hecho, por tanto no queda bien resuelto el ejercicio.

Puedes consultar las respuestas de otras personas y así orientarte mirando aquí: https://www.aprenderaprogramar.com/foros/index.php?topic=919

Saludos

850
Hola toni, para iluminarte tendría que enviarte una linterna pero no sé cómo ;) En un primer intento traté de trabajar sobre tu código tal cual pero después cambié e hice una pequeña reorientación (sólo pequeña). A continuación adjunto el código. Adelanto que no me gusta demasiado la forma que tiene y con seguridad se podría replantear de una forma más adecuada, pero tampoco me parece que sea lo más oportuno detenerse a optimizar este código cuando el objetivo del ejercicio era simplemente comprobar las implicaciones del polimorfismo. Creo que tendrás tiempo más adelante de detenerte en cuestiones de este tipo...

Del código trabajado se pueden sacar algunas conclusiones, a lo mejor entre ellas que a veces no hay que obsesionarse con eliminar los warning (me lo aplico a mí mismo por la parte que me toca :) ) sino que a veces hay que convivir con ellos.

Código: [Seleccionar]
import java.util.*;
//https://www.aprenderaprogramar.com/foros/index.php?topic=1067.0

public class EjercicioPolimorfismo2 {           
    public static void main (String [] args) {
        // Declaración del ArrayList
        ArrayList<Set> planetasYCifras = new ArrayList<Set>();
        String [] planetasArr = {"sol", "luna", "saturno"};
        // Declaración del HashSet + inicialización
        Set<String> planetas = new HashSet<String>(Arrays.asList(planetasArr));
        // Declaración del TreeSet
        Set<Integer> cifras = new TreeSet<Integer>();
        int [] cifrasArr = {2, 8, 5};
        // Rellenado del TreeSet
        for (Integer cifr: cifrasArr) {
            cifras.add (cifr);
        }
        // Rellenado del ArrayList con el HashSet y el TreeSet
        planetasYCifras.add (planetas);
        planetasYCifras.add (cifras);
        // Iterador para el ArrayList
        Iterator<Set> itPYC = planetasYCifras.iterator();
        Set tmpSet;
        String tmpStr = ""; Integer tmpInt;//
        Object tmpObj;
        // Recorre el ArrayList
        boolean esElPrimero = true;
        while (itPYC.hasNext()) {
            tmpSet = itPYC.next();
            if (tmpSet instanceof java.util.HashSet) {
                System.out.print ("\n\tElementos del HashSet: ");     
                 Iterator itHS = tmpSet.iterator();         
                while (itHS.hasNext()) {
                    if (esElPrimero == false) {System.out.print (", ");}
                    esElPrimero=false;
                    tmpStr = (String)itHS.next();
                    System.out.print (tmpStr);
                }
                System.out.print (".");     
            }
            esElPrimero = true;
           
            if (tmpSet instanceof java.util.TreeSet) {
                System.out.print ("\n\tElementos del TreeSet: ");     
                Iterator itTS = tmpSet.iterator();         
                while (itTS.hasNext()) {
                    if (esElPrimero == false) {System.out.print (", ");}
                    esElPrimero=false;
                    tmpInt = (Integer)itTS.next();
                    System.out.print (tmpInt);
                }
                System.out.print (".");   
           
            }
        } // fin del while itPYC
    } // fin del main
} // Fin de la clase EjercicioPolimorfismo

851
Hola, después de ver detenidamente el enunciado y el código lo primero que hay que tener en cuenta es que se trata de un problema complejo cuya elaboración y solución puede requerir bastantes horas e incluso días. Normalmente este tipo de problemas no se abordan en cursos de programación básica, sino en cursos de algoritmia y estructuras de datos avanzadas.

Viendo el código te recomendaría usar nombres de variables más descriptivos. Por ejemplo estás usando la variable tablero para describir las casillas del tablero ya visitadas, pero ese nombre no es realmente descriptivo. Cuando el programa crece o cuando hay que revisarlo puede resultar confuso, por ello serían adecuados nombres más descriptivos, por ejemplo "casillaTableroVisitada". De ese modo casillaTableroVisitada[3][4] = true indicaría que la casilla en posición (3,4) ha sido visitada.

Sería recomendable que todas las variables lleven un nombre que describa adecuadamente su función dentro del programa.

Sobre el apartado c) del problema, lo primero que tendrías que hacer es desarrollar la algoritmia o lógica de los procesos y una vez comprendas bien todos los detalles desarrollar el código. Tal y como indica el enunciado el array o arreglo bidimensional accesibilidad indica el número de posiciones desde la que puede ser alcanzada una casilla del tablero y tiene que ser modificado a medida que se van visitando casillas. Una forma de abordar esto sería crear un método denominado nuevaAccesibilidad(int x, int y) de forma que cada vez que se visite una casilla (x, y) recalcule los valores de accesibilidad.

Es decir, cada vez que hagas: tablero[filaActual][columnaActual] = true;

tendrías que llamar a nuevaAccesibilidad(filaActual, columnaActual)

Suponiendo que la posición de partida es filaActual = 3, columnaActual = 4; tendríamos este tablero:

  2 3 4 4 4 4 3 2
  3 4 6 6 6 6 4 3
  4 6 8 8 8 8 6 4
  4 6 C 8 8 8 6 4
  4 6 8 8 8 8 6 4
  4 6 8 8 8 8 6 4
  3 4 6 6 6 6 4 3
  2 3 4 4 4 4 3 2

Desde que la casilla 3,4 queda marcada tendrías que llamar al método y reducir en 1 ud todas las posiciones visitables por el caballo desde la casilla marcada. Fíjate que esto tienes que hacerlo inmediatamente después de marcar la casilla como visitada y antes de que se decida el siguiente movimiento. En este caso quedaría:

  2 3 4 4 4 4 3 2
  3 3 6 5 6 6 4 3
  3 6 8 8 7 8 6 4
  4 6 C 8 8 8 6 4
  3 6 8 8 7 8 6 4
  4 5 8 7 8 8 6 4
  3 4 6 6 6 6 4 3
  2 3 4 4 4 4 3 2

La lógica para elegir la casilla a mover podrías desarrollarla después. Es mejor concentrarse en que el método funcione bien y cuando esté funcionando bien ir ampliando.

Ahora el caballo se desplazaría a una posición y desde ahí tendrías que volver a llamar al método para que recalcule el arreglo de accesibilidad.

Para cada movimiento del caballo puedes dibujar en pantalla el arreglo de accesibilidad y comprobar si lo que has planteado está funcionando bien.

Cuando tengas funcionando de forma correcta este método, podrías pasar a introducir la lógica de analizar qué casilla debe elegirse para el movimiento en función de los valores de accesibilidad en cada una de las casillas de destino, de modo que el caballo elija la casilla con menor valor de accesibilidad siempre.

Saludos!

852
Hola, el ejercicio está correcto y responde bien a lo que pedía el enunciado. Saludos.

853
Hola, he compilado y ejecutado el programa y como resultado inicial me aparece esto ¿A tí no te llega a compilar y aparecer el menú inicial?


   ***** Menu *****

   I = Incluir
   C = Consultar
   M = Modificar
   E = Eliminar
   R = Reporte
   S = Salir

   <<< Elija Opcion >>>

   ***** Menu *****

   I = Incluir
   C = Consultar
   M = Modificar
   E = Eliminar
   R = Reporte
   S = Salir

   <<< Elija Opcion >>>

   ***** Menu *****

   I = Incluir
   C = Consultar
   M = Modificar
   E = Eliminar
   R = Reporte
   S = Salir

   <<< Elija Opcion >>>

854
Hola, el ejercicio está perfecto, enhorabuena. Saludos,

855
Aprender a programar desde cero / Re:Ejercicio CU00649B
« en: 26 de Julio 2014, 23:56 »
Hola, el código está bien resuelto.

Sobre la consulta: el método subString no lo declaras, sino que lo usas.

Por ejemplo: ValorCadena1.substring(0,2)

La signatura del método es: String substring(int beginIndex,int endIndex)

Tú estás invocando el método sobre el String ValorCadena1 y usando como beginIndex el valor 0, que es un entero, y como endIndex el valor 2, que es otro entero.

Por tanto todo está correcto.

Saludos.

856
Gracias por tus comentarios hacia los moderadores Sniper, se agradecen...

Sobre el código simplemente comentarte que se ve un gran trabajo y una positiva evolución. Diría que ya pocas mejoras habría que realizar, aunque con ánimo de mejorar te voy a hacer algunos comentarios:


Habría que mejorar la ortografía: ¿no as escrito nada sin hache? Mejor no has escrito nada! Siempre has, hacer, hecho, hiciste, etc. van con hache! Esto no tiene que ver con la programación pero ;)

Las mejoras que serían recomendables en el código:

Una EntradaPorTeclado es normal que almacene información sobre una entrada de teclado, puesto que representa una entrada de teclado. Sin embargo, nos podemos preguntar, ¿es necesario que AnalizadorDeCaracteresSobrantes almacene información?

La respuesta es que depende de cómo se enfoque la solución al problema. Si tú consideras que es útil saber las cadenas con las que trabaja el AnalizadorDeCaracteresSobrantes, en ese caso sí puede ser útil que se registre esa información como atributos de la clase. Pero si consideras que te da igual las cadenas y que tú sólo necesitas "el resultado" entonces se puede prescindir de los atributos (y en este caso, llegar incluso a que la clase no tenga atributos). Lo más normal es que una clase tenga atributos y métodos, pero en algunas clases podemos prescindir de atributos y hacer que trabajen exclusivamente en base a información recibida a través de argumentos de métodos (parámetros).

En este caso en vez de tener los atributos private String cadena1, cadena2; eliminaríamos estos atributos (con lo cual tampoco habría que inicializarlos en el constructor) y lo que haríamos sería recibir la información al invocar los métodos, por ejemplo: public void ExtractorDeCaracteresSobrantes(String valorCadena1, String valorCadena2)

Nos podemos preguntar ¿Cuándo una clase debe carecer de atributos? La respuesta es que siempre que la tarea principal de la clase sea realizar operaciones sobre información que le venga de fuera y que no es necesario almacenar en la propia clase.

De acuerdo con esta lógica, habría que plantearse el eliminar los atributos cadena1, cadena2 en las siguientes clases:

IdentificadorDeCadenaMasLarga, ComparadorDeCaracteres, AnalizadorDeCaracteresSobrantes


En la clase AnalizadorDeVocales posiblemente también podrías prescindir de atributos: la clase se encarga de recibir una cadena y devolver un resultado, no es necesario que almacene la información sobre la cadena.

Sobre la clase ComparadorDeCadenas se ve una clase bien construida: dirige el programa, crea los objetos y hace que se comuniquen entre ellos. Bien hecho!

Saludos

857
Aprender a programar desde cero / Re:Eliminación de errores
« en: 24 de Julio 2014, 01:07 »
Hola, al tener los valores en una matriz lo que se me ocurre sería duplicar los resultados en otra columna de modo que incluyas una prueba condicional.

SI(prueba_lógica;valor_si_verdadero;valor_si_falso)

=SI(G10=#N/A;0.00E+00;G10)

Es decir, en otra celda analizar lo que ocurre en la celda G10. Si en G10 tienes un valor válido, mostrarlo. Si no es un valor válido, mostrar 0.00E+00

Saludos.

858
Aprender a programar desde cero / Re:Revision ejercicio CU00642B
« en: 24 de Julio 2014, 01:00 »
Para recibir un objeto como parámetro de un constructor, el objeto tendría que haber sido creado previamente (o crearse al invocar el constructor). Eso es lo único necesario. Saludos.

859
Hola Toni, al compilar me salta un warning relacionado con un problema de tipos. Deberías revisar y tratar de eliminar el warning.

Creo que el problema pueda estar relacionado con esto:

if (tmpSet instanceof java.util.HashSet) {
                System.out.println ("\n\tElementos del HashSet ");
                Iterator<HashSet> itHS = tmpSet.iterator();
                while (itHS.hasNext()) {

Ya "estás dentro del HashSet" y ahí quizás deberías declarar el tipo de los elementos dentro del HashSet (por ejemplo String), no HashSet...

Creo que haciendo una revisión en profundidad de los tipos podrías eliminar el warning.

Saludos.

860
Hola, es mejor indicar el enunciado del ejercicio así como el código que tengas desarrollado hasta el momento (para pegar código usa el botón # del editor del foro, tras pulsarlo pega el código entre las etiquetas [ code ] ... [ / code] y pulsa previsualizar.

Indica dónde obtienes mensajes de error o tienes problemas para poder concentrar la ayuda allí donde se presentan los problemas.

De este modo podrá ser analizado sin tener que acudir a la fuente original. Saludos.

Páginas: 1 ... 38 39 40 41 42 [43] 44 45 46 47 48 ... 68

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