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 - Alex Rodríguez

Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 ... 93
101
Hola por un lado felicitarte por haber desarrollado este código. Por otro lado te comento las cosas que veo mejorables.

- Con la herencia se pretende reutilizar código de las superclases en las subclases. Por ejemplo, si en la superclase Producto se usa el método imprimirProducto() en la clase ProductoFresco reutilizamos ese código para evitar repetirlo. Esto lo has hecho correctamente en

Código: [Seleccionar]
public void imprimirProductoFresco() {
imprimirProducto();
System.out.println("La fecha de envasado es: " + getFechaEnvasado() + " el pais de origen: " + getPais());
}

De esta forma logras reutilizar el código de la superclase en la subclase. (Nota: más adelante en el curso se explica el método toString pero ahora no nos vamos a meter con eso).

Sin embargo en la clase ProductoReferenciaFrio no haces esta reutilización de código. Luego introduces imprimirProducto() en la clase ProductoRefrigerado, pero no en la clase ProductoCongelado, ni en ProductoCongeladoPorAgua, etc. No acabo de entender el por qué.

Luego utilizas en el main

refrigerado3.imprimirProductoReferenciaCongelado();
refrigerado3.imprimirProductoRefrigerado();

Resulta confuso... si refrigerado3 es un producto refrigerado ¿Por qué invocas el método refrigerado3.imprimirProductoReferenciaCongelado(); si no es un producto congelado? Ese método lo tienes dentro de la clase ProductoReferenciaFrio pero eso no es correcto: crea confusión. Si el producto no es congelado, no debe tener un método que se llame imprimirProductoReferenciaCongelado

La idea debería ser:

a) Introducir el código a reutilizar en la clase más elevada en la jerarquía posible. En este caso deberías reutilizar imprimirProducto() en la clase ProductoReferenciaFrio

b) En cada subclase ir llamando al método de la superclase que sea necesario, más las instrucciones específicas de esa subclase.

c) Evitar tener que hacer dobles invocaciones para una tarea que puede solucionarse con un solo método: para eso está la herencia.

En resumen, las correcciones a hacer en este ejercicio serían:

- Corregir los nombres de métodos para evitar incoherencias (por ejemplo que se pueda invocar imprimirProductoReferenciaCongelado sobre un producto que no es un congelado, esto no tiene lógica). Es importante que los nombres de clases y métodos sean coherentes y no induzcan a confusión.

- Estructurar bien la reutilización de código desde las superclases hasta las subclases de modo que solo sea necesario llamar a un método para mostrar la información de un producto por ejemplo


Saludos

102
Hola gabrms: en este caso el título del tema está bien pero le ha faltado el código de ejercicio: CU01024D (ya lo edito yo y lo introduzco).

El ejercicio está bien resuelto, aunque he tenido problemas al visualizarlo porque el color de fondo de la tabla es violeta y la letra también violeta, con lo cual no se ve demasiado bien. Para verlo mejor he introducido esto como última línea del código css: .a, .b, .c, .d, .e, .f{color: black;}

Sobre el problema del segundo código, en este hilo: https://aprenderaprogramar.com/foros/index.php?topic=5124.0 hay una explicación sobre nth-child que quizás sea la explicación a por qué no te funciona el código.

Saludos.

103
Hola gabrms: el código lo has pegado correctamente. Lo único que te ha faltado es poner un título adecuado al tema. En general deben seguirse las pautas indicadas en este hilo: https://aprenderaprogramar.com/foros/index.php?topic=1460.0.

El título que has puesto es "Entrega nº20 del Tutorial básico del programador web: CSS desde cero." y ahí falta una cosa básica: el código del ejercicio, en este caso CU01020D. Mediante ese código se facilita identificar el ejercicio de que se trata, e introduciéndolo en el buscador del foro puedes obtener como resultados todos los hilos donde se habla de este ejercicio. Igualmente en lugar de el título utilizado es preferible usar palabras clave que permitan usar el buscador del foro cuando se tenga interés por un tema. Por ejemplo en este caso el título podría ser "Colores HTML - CSS con transparencia indicada como rgba gradación creciente CU01020D"

Tu ejercicio está bien resuelto y bien presentado. En este caso el ejercicio no pedía que se hiciera con table o con div, por tanto está igualmente bien resuelto de una manera u otra. En general, a la hora de maquetar la tendencia es a no usar tablas y darle preferencia al uso de div porque esto presenta algunas ventajas. No obstante, será la experiencia quien mejor te vaya aconsejando cuándo usar una cosa u otra. Hay una cosa que no me ha gustado, y es que apliques un borde y un ancho al body del 80%. El body es como el lienzo y por tanto no se le suele poner borde ni limitar su anchura. No obstante, hacerse se puede hacer y además el ejercicio no está mejor ni peor por ello.

Saludos.

104
Hola, para quien consulte este hilo, dejo un código para calcular la inversa de una matriz cuadrada invertible. Este problema no es nada sencillo de programar. En primer lugar hay que tener claros los conceptos y métodos matemáticos. Y luego hay que programarlo, que aún teniéndolo claro no es algo que se haga rápido. Por tanto no es un problema para hacer a modo de entretenimiento, sino más bien algo indicado para quien esté estudiando matemáticas.

Código: [Seleccionar]
    //Programa de ejemplo para calcular la inversa de una matriz

    import java.util.Scanner;

    public class Inverse

    {
        public static void main(String argv[])
        {
            Scanner input = new Scanner(System.in);
            System.out.println("Enter the dimension of square matrix: ");
            int n = input.nextInt();
            double a[][]= new double[n][n];
            System.out.println("Enter the elements of matrix: ");
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                    a[i][j] = input.nextDouble();
            double d[][] = invert(a);

            System.out.println("The inverse is: ");

            for (int i=0; i<n; ++i) {
                for (int j=0; j<n; ++j)

                {System.out.print(d[i][j]+"  ");}

                System.out.println();
            }
            input.close();
        }


        public static double[][] invert(double a[][])         {

            int n = a.length;
            double x[][] = new double[n][n];
            double b[][] = new double[n][n];
            int index[] = new int[n];
            for (int i=0; i<n; ++i)
                b[i][i] = 1;

     // Transform the matrix into an upper triangle

            gaussian(a, index);

     // Update the matrix b[i][j] with the ratios stored
            for (int i=0; i<n-1; ++i)
                for (int j=i+1; j<n; ++j)
                    for (int k=0; k<n; ++k)
                        b[index[j]][k]
                            -= a[index[j]][i]*b[index[i]][k];

     
     // Perform backward substitutions
            for (int i=0; i<n; ++i)             {
                x[n-1][i] = b[index[n-1]][i]/a[index[n-1]][n-1];
                for (int j=n-2; j>=0; --j)                 {
                    x[j][i] = b[index[j]][i];
                    for (int k=j+1; k<n; ++k)
                    {
                        x[j][i] -= a[index[j]][k]*x[k][i];
                    }

                    x[j][i] /= a[index[j]][j];
                }
            }
            return x;
        }

    // Method to carry out the partial-pivoting Gaussian
    // elimination.  Here index[] stores pivoting order.

        public static void gaussian(double a[][], int index[])  {

            int n = index.length;
            double c[] = new double[n];

     // Initialize the index
            for (int i=0; i<n; ++i)
                index[i] = i;

     // Find the rescaling factors, one from each row
            for (int i=0; i<n; ++i) {
                double c1 = 0;
                for (int j=0; j<n; ++j) {
                    double c0 = Math.abs(a[i][j]);
                    if (c0 > c1) c1 = c0;
                }
                c[i] = c1;
            }

     // Search the pivoting element from each column
            int k = 0;
            for (int j=0; j<n-1; ++j) {
                double pi1 = 0;
                for (int i=j; i<n; ++i)  {

                    double pi0 = Math.abs(a[index[i]][j]);
                    pi0 /= c[index[i]];
                    if (pi0 > pi1) {
                        pi1 = pi0;
                        k = i;
                    }
                }

     
       // Interchange rows according to the pivoting order
                int itmp = index[j];
                index[j] = index[k];
                index[k] = itmp;
                for (int i=j+1; i<n; ++i) {
                    double pj = a[index[i]][j]/a[index[j]][j];

     // Record pivoting ratios below the diagonal
                    a[index[i]][j] = pj;

     // Modify other elements accordingly
                    for (int l=j+1; l<n; ++l)
                        a[index[i]][l] -= pj*a[index[j]][l];
                }
            }
        }
    }

Ejemplo de ejecución

$ javac Inverse.java
$ java Inverse
Enter the dimension of square matrix:
2
Enter the elements of matrix:
1 2
3 4
The Inverse is:
-1.9999999999999998  1.0 
1.4999999999999998  -0.49999999999999994

Parece que hay un problema con los redondeos decimales. Quien esté interesado aquí hay una explicación sobre redondeo: https://aprenderaprogramar.com/index.php?option=com_content&view=article&id=960:java-redondear-a-2-o-mas-decimales-errores-precision-bigdecimal-roundingmode-biginteger-cu00907c&catid=58&Itemid=180

Saludos

105
Hola, respuestas correctas. En la respuesta a la opción b) añadiría lo siguiente: si existen dependencias entre scripts y uno depende de otro que falla, posiblemente salten dos errores (el que generó el error inicial y el que tenía dependencia del otro), no llegando a ejecutarse ninguno de ellos. Así podría ocurrir que se encadene una secuencia de errores debido a dependencias entre scripts.

Saludos

106
Hola, todo correcto. Lo más adecuado para el ejercicio 1 es primero escribir la respuesta sólo reflexionando (sin ejecutar ningún código) y luego si se quiere comprobar con código, como has hecho, así que comprobado está.

Respecto a NaN copio un fragmento de la entrega CU01112E: Para JavaScript NaN (abreviatura de “Not-a-Number”) es un valor numérico especial, que representa “número ilegal o no representable”.

Sobre que sea una propiedad de un objeto global, creo que es mejor avanzar en el curso antes de hablar sobre esto, porque a medida que se avanza se irá entendiendo mejor todo esto.

Ciertamente es curioso que NaN comparado con sí mismo arroje "distinto", porque parece contradictorio. Una faceta más del lenguaje que conviene conocer...

Saludos

107
Hola Dan, de cara a presentar en el foro las respuestas del curso JavaScript recomendamos incluir un código HTML completo como forma más entendible de cargar luego para visualizarlo en un navegador.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<title>Ejemplo aprenderaprogramar.com</title>
<meta charset="utf-8">
<script>
var val1 = prompt("Ingresa el primer valor: ");
var val2 = prompt("Ingresa el segundo valor: ");
alert(val1%5);
alert(val1/val2);
alert(parseInt(val1) + parseInt(val2));
</script>
</head>
<body>
<div id="cabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplos JavaScript</h3>
</div>
</body>
</html>

El código es correcto, aunque el uso de parseInt no entra dentro del curso ahora, ya que se explica en una entrega más avanzada y por motivos didácticos se recomienda no usar en respuestas a ejercicios contenidos no explicados hasta la entrega correspondiente

Saludos

108
Hola, respuestas correctas y bien razonadas. Dejo el código como documento HTML:

Código: [Seleccionar]
<!DOCTYPE html>

<html>
<head>

<title>Ejemplo aprenderaprogramar.com</title>
<meta charset="utf-8">

<script>
var bool1=true,bool2=false;
alert(bool1+bool2);
alert(bool1.toString()+bool2.toString());
</script>
</head>
<body>
<div id="cabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplos JavaScript</h3>
</div>
</body>
</html>

Saludos

109
Hola Dan, como dices, ejercicio bien sencillo. A mí me da mejor resultado \u03C0

Código: [Seleccionar]
<!DOCTYPE html>

<html>
<head>

<title>Ejemplo aprenderaprogramar.com</title>
<meta charset="utf-8">

<script>
var mensaje = "El número \u03C0 vale 3.1416"
alert(mensaje);
</script>
</head>
<body>
<div id="cabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplos JavaScript</h3>
</div>
</body>
</html>

110
Hola, para plantear consultas en los foros se deben seguir las indicaciones dadas en https://aprenderaprogramar.com/foros/index.php?topic=1460.0

Para adquirir los conceptos básicos de pseudocódigo se recomienda seguir este curso: https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=28&Itemid=59

Saludos

111
Hola Jorge, todo correcto y "bien entendido"

Saludos

112
Hola, para escribir en los foros deben seguirse las normas y sugerencias que se dan en https://aprenderaprogramar.com/foros/index.php?topic=1460.0 tanto en cuanto a título de los temas, cómo pegar código, etc.

El código de ejercicio debe escribirse completo y en mayúsculas, por ejemplo CU00636B en lugar de cu00636

El ejercicio está bien resuelto, todo bien: constructor, métodos, condicionales, etc.

Saludos

113
Hola, para quien lea este hilo mi respuesta sería la siguiente: si se quiere tener una página sin acceso a internet hay varias alternativas posibles:

a) Restringir el acceso al directorio en el que se aloja la página con usuario y contraseña. De ese modo nadie que no disponga de usuario y contraseña podrá acceder a los contenidos de ese directorio.

b) Mantener la web en nuestro pc y no tener conectividad con internet, de forma que al intentar enlazar no se pueda.

c) Mantener la web en nuestro pc y a su vez tener un firewall que impida las conexiones a internet que se soliciten desde un origen concreto (la página web que queremos restringir) ó hacia un destino concreto (puertos 80 ó 443 de otra máquina)

Habría otras alternativas...

Saludos

114
Hola, para quien lea este hilo, mi respuesta sería la siguiente. Si se quieren usar funciones de jQuery, habría que correr un script que actuara sobre un fichero determinado (el fichero donde queremos hacer los reemplazos). Si se usara un plugin de Notepad++ este no estaría basado en jQuery, sino posiblemente en otras formas más eficientes de manipular ficheros.

La forma más intuitiva de hacer lo indicado sería abrir el navegador, correr el script y hacer que este operara sobre el fichero deseado, aunque a simple vista no se le ve interés a esto ya que hay otras formas más eficientes de manipular ficheros.

Saludos

115
Hola, edito la respuesta que había dado. El ejercicio no está bien resuelto. Por ejemplo si se escribe:

Ingrese la primera palabra:
padron
Ingrese la segunda palabra:
patron

El resultado que se obtiene es:

¿Letra 1 igual en las dos palabras? --> Si
¿Letra 2 igual en las dos palabras? --> Si
¿Letra 3 igual en las dos palabras? --> No
¿Letra 4 igual en las dos palabras? --> No
¿Letra 5 igual en las dos palabras? --> No
¿Letra 6 igual en las dos palabras? --> No



Esto no es correcto ya que la cuarta, quinta, sexta letra son iguales y el programa está diciendo que no son iguales. Dónde está el fallo es fácil de ver, así que lo dejo como ejercicio para quien quiera revisar el código.

Saludos

116
Hola, al igual que en el ejercicio anterior, tal y como está escrito el código, se muestra por pantalla 1.a 2.av 3. ave mientras que el ejercicio pedía mostrar 1.a 2.v. 3.e (suponiendo que se introduzca como palabra ave).

Se corrige introduciendo solo un pequeño cambio:
en lugar de System.out.println(i+". "+dato.substring (0, i));
escribir esto: System.out.println(i+". "+dato.substring (i-1, i));


Saludos

117
Hola, tal y como está escrito el código, se muestra por pantalla 1.a 2.av 3. ave mientras que el ejercicio pedía mostrar 1.a 2.v. 3.e (suponiendo que se introduzca como palabra ave).

Se corrige introduciendo solo un pequeño cambio:
en lugar de System.out.println(i+". "+dato.substring (0, i));
escribir esto: System.out.println(i+". "+dato.substring (i-1, i));


Aunque en este ejercicio se pedía solo una clase con el main, para más adelante ya podemos ir empezando a pensar en no construir nuestro código completamente sobre una clase con el main, sino a crear clases que cumplan tareas, y en la clase con el main definir las tareas que deben ir realizándose invocando clases. Consultando este hilo creo que podrá verse mejor a qué me refiero: https://aprenderaprogramar.com/foros/index.php?topic=2278.0, aunque esto se trabajará en ejercicios de entregas posteriores del curso, con lo cual no es preciso detenerse ahora en ello.

Saludos

118
Hola, el código funciona dando los resultados esperados. Sin embargo no es un código que obtendría una buena calificación si fuera evaluado. Los motivos para ello son:

- Repetición de código: por ejemplo se repite más de una vez if(cadena.substring(0,1).equals("a") cuando realmente solo sería necesario una vez en el código

- Anidamiento de los if poco legible: en general cuanto más fácil de entender y claro sea el código, mejor. Si puede resolverse en 20 líneas en lugar de en 40, en general mejor.

Puede compararse la solución dada con esta otra https://aprenderaprogramar.com/foros/index.php?topic=2873.0 y observar gracias a qué estrategias se puede conseguir el mismo resultado de una forma más clara y utilizando menos líneas.

Saludos

119
Hola, el ejercicio pedía responder unas preguntas, pero no veo que se hayan respondido. No sé si se cortó al escribir el mensaje.

Saludos

120
Hola, a falta de respuesta de algún experto en el tema trataré de dejar indicada una aproximación para quien pueda leer el hilo. En PHP los programadores están tendiendo a usar cada vez más la programación orientada a objetos porque se considera que es más eficiente en términos generales, lo cual no quiere decir que esto sea una verdad absoluta.

Las extensiones mysqli te permiten programar tanto de forma procedural ("tradicional") como en forma orientada a objetos. Una buena estrategia es comenzar comprendiendo la programación tradicional y luego comenzar con la programación orientada a objetos. Las extensiones mysqli básicamente te dan soporte para bases de datos MySql. Esto significa que si cambiaras de base de datos, pasando por ejemplo a una base de datos de Microsoft SQL Server, tendrías que reprogramar tu aplicación pues los comandos de base de datos no serían reconocidos.

En cambio, PDO proporciona una interfaz común que te soporta distintos tipos de bases de datos. En ese caso, si cambias de base de datos tu aplicación, no necesitas (al menos en teoría, aunque depende) reprogramar tu aplicación ya que PDO oculta la sintaxis particular reemplazándola por una común.

PDO es completamente orientado a objetos, con lo que no tienes opción a decidir si quieres usar programación procedural u orientada a objetos.

Si se trata de aprender, puede estar bien hacer el recorrido: mysqli procedural , luego mysqli orientado a objetos y luego PDO.

En el curso PHP de esta web disponible en https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=70&Itemid=193 sólo podrías cubrir la primera etapa, ya que por el momento solo llega hasta explicar la parte procedural.

En cuanto a versión de PHP mi opinión es que nunca es conveniente estar "a la última", sino "a la penúltima". Lo que quiero decir es que yo en particular prefiero trabajar con versiones que tengan como mínimo 6 meses de rodaje y que gocen de aceptación. De cara al aprendizaje no tiene demasiada importancia usar una versión u otra de PHP.

Saludos

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

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