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 ... 93
1
Unos códigos que ilustran como dibujar un árbol de Navidad usando Python de tres maneras diferentes. Es un ejercicio interesante para practicar con bucles para cualquier persona que esté aprendiendo programación, tanto con Python como con otros lenguajes.

Código con bucle for:

Código: [Seleccionar]
# Función para dibujar un árbol de navidad de una altura dada
def draw_tree(height):
  # Bucle for que crea cada fila del árbol
  for i in range(1, height + 1):
    # Imprimir los espacios antes de los asteriscos en cada fila
    for j in range(height - i):
      print(" ", end="")
    # Imprimir los asteriscos en cada fila
    for j in range(2 * i - 1):
      print("*", end="")
    # Pasar a la siguiente línea
    print()
# Llamar a la función para dibujar el árbol con una altura dada por ejemplo 5
draw_tree(5)

Código con bucle while:

Código: [Seleccionar]
# Función para dibujar un árbol de navidad de una altura dada
def draw_tree(height):
  # Establecer los valores iniciales para el bucle while
  i = 1
  j = 1
  # Iterar mientras el número de fila sea menor o igual a la altura del árbol
  while i <= height:
    # Imprimir los espacios antes de los asteriscos en cada fila
    while j <= height - i:
      print(" ", end="")
      j += 1
    # Resetear el valor de j
    j = 1
    # Imprimir los asteriscos en cada fila
    while j <= 2 * i - 1:
      print("*", end="")
      j += 1
    # Resetear el valor de j
    j = 1
    # Pasar a la siguiente línea
    print()
    # Incrementar el valor de i
    i += 1
# Llamar a la función para dibujar el árbol con una altura dada por ejemplo 15
draw_tree(15)

Y la que quizás sea la versión más compleja, basada en código recursivo:

Código: [Seleccionar]
# Función para dibujar un árbol de navidad de una altura y nivel dada
def draw_tree(height, level):
  # Comprobar si el nivel es igual a la altura del árbol
  if level == height:
    # Return si el nivel es igual a la altura
    return
  # Imprimir los espacios antes de los asteriscos en cada fila
  for j in range(height - level):
    print(" ", end="")
  # Imprimir los asteriscos en cada fila
  for j in range(2 * level - 1):
    print("*", end="")
  # Pasar a la siguiente línea
  print()
  # Llamar a la función recursivamente con el siguiente nivel
  draw_tree(height, level + 1)
# Llamar a la función para dibujar el árbol con una altura dada por ejemplo 5
draw_tree(5, 1)

Quien se anime puede crear el mismo código en otro lenguaje usando las mismas ideas ("lógica o algoritmia subyacente").



2
Comunidad / Re: Feliz Navidad y Próspero Año Nuevo para todos
« en: 22 de Diciembre 2023, 09:48 »
Coincido con Javi, muchos años y muchas manos y cabezas que están o han estado aquí ayudando y compartiendo conocimiento. Felicidades compañeros.



3
Comunidad / Re: Feliz Navidad y Próspero Año Nuevo para todos
« en: 24 de Diciembre 2022, 00:35 »
Felices fiestas, paz y concordia para todos y a seguir luchando por un mundo mejor.

4
Para quienes nos han consultado sobre la vigencia de estos enlaces, los enlaces siguen vigentes (aunque el software al que se refieren es muy antiguo). Saludos.

5
Hola, para quien revise este ejercicio que quedó sin comentar, está bien resuelto. Solo indicar que al declarar arrays o colecciones de objetos en general es preferible utilizar nombres en singular. Por ejemplo en lugar de un array String [] meses declararíamos String [] mes. El objetivo es que cuando usemos elementos del array si usamos mes[4] su interpretación es más directa (mes 4 del array) que si usamos el plural (meses 4 del array ¿?, es más difícil si usamos el plural). Puede haber excepciones, pero esto puede ser una idea general.

Tener en cuenta que al comenzar los elementos del array por 0 resulta que el mes 0 es enero, el mes 1 febrero y así hasta diciembre que es el elemento 11 del array y no el 12 como podría suponerse si pensamos empezando a contar desde 1.

Por otro lado es preferible poner nombres de clases que eviten confusiones. Por ejemplo en Java hay una clase del API que es Arrays. Si llamamos a la clase ClaseArray resulta un tanto confuso. Por eso sería preferible nombrarla como AdivinarMeses, EjercicioCU00669B o de otra  manera.

Saludos

6
Hola, el ejercicio está muy bien resuelto y con un código muy compacto. Como posibles mejoras voy a indicar:

- En general recomendamos no incluir tildes (acentuación) en los nombres de clases ni de métodos, por ejemplo en lugar de comparaciónLetras usaríamos comparacionLetras. El uso de tildes, eñes, etc. a la larga puede generar problemas, y evitando tildes y eñes evitamos esos posibles problemas.

- En general recomendamos que los nombres de métodos, variables, etc. sean descriptivos. En este código se ha usado por ejemplo int palabraMasCorta = 0; lo cual no es muy adecuado. Porque si el nombre de variable es "palabraMasCorta" se espera que el contenido de la variable sea una palabra. Por tanto no es un nombre adecuadamente descriptivo si luego esa variable representa a un número entero. Hubiera sido más adecuado por ejemplo numLetrasPalabraCorta

Saludos

7
Hola, para quien revise este hilo, comentar que la solución propuesta sigue sin atenerse a lo que pedía el ejercicio, ya que no se define la clase Polideportivo. Para quien esté interesado, ver el hilo comentado anteriormente. Saludos.

8
Hola, respecto a este ejercicio indicar que está bien resuelto y cumple con los requerimientos planteados. Como observaciones:

-->  En el for extendido has introducido un índice. Si se usa un for de este tipo normalmente no se usan índices numéricos. En caso de usar índices numéricos es preferible usar un for tradicional, al menos esto es lo más habitual. Sin embargo, no hay ninguna regla que prohíba hacerlo como lo has hecho.

--> Para continuar añadiendo cantantes únicamente nos admite "Si" pero no admite "SI" ni "Sí" ni "S" etc. Esto podría haberse mejorado un poco, pero esto tampoco era algo importante en este ejercicio.

--> En los casos en que debe ejecutarse al menos una vez un bucle, puede ser interesante usar un do while en lugar de un while. Puede verse un ejemplo de esto en https://aprenderaprogramar.com/foros/index.php?topic=2888.0

Saludos.

9
Comunidad / Re: Felices fiestas y próspero año nuevo para todos
« en: 26 de Diciembre 2021, 20:42 »
Felicidades para todos y que el año que va a comenzar nos traiga buenas cosas.

Quien quiera hacerse un árbol de navidad en java, aquí el código: https://aprenderaprogramar.com/foros/index.php?topic=7229.0


10
Hola Diego, en primer lugar felicitarte por haber concluido el curso pues para hacerlo se requiere esfuerzo y voluntad. Hay personas que siguen el curso tutorizado porque lo prefieren así, mientras que otras como tú son capaces de sacarlo adelante por sí mismos. De una forma un otra, ya tenemos bastantes casos de personas que han aprendido con nuestros cursos y estos han servido como semilla o germen para una posterior carrera profesional exitosa. Espero que ese pueda ser tu caso y que con el tiempo recuerdes esta web con cariño, pues quienes escriben los contenidos y participan en los foros no son máquinas, sino que somos personas, aunque no nos veamos o estemos en distintos países.

El curso de java avanzado me temo que no te va a resultar tan útil porque por el momento no está completo (la persona que se encargaba de escribirlo tuvo que dejarlo por trabajo), aunque lo que encontrarás sí te puede ayudar a avanzar.

Otra cosa que te puede ayudar a avanzar, y que agradecemos, es responder a personas que realizan consultas en los foros de la web. Responder consultas te sirve para ver cómo codifican otras personas y habituarte a la resolución de problemas de distinta naturaleza, algo que a la larga te vas encontrando si empiezas a trabajar en el área de programación. Es algo "voluntario", pero como te digo agradecemos la participación pues ayuda a enriquecer los foros y ayuda a su mantenimiento, que también requiere un esfuerzo.

Gracias por tus comentarios y franqueza. Un abrazo y a seguir.

11
Hola N1elsRoy, sin ser experto creo que con Pascal habría muchas formas de trabajar esto, incluso dependiendo de la versión de Pascal que se utilice puede haber variantes.

La forma más básica sería con un array estático:

Código: [Seleccionar]
program arrayToFunction;
const
   size =6;
type
   a = array [1..size] of integer;
var
   balance:  a =(300,7,2,94,31,49);
   media: real; 
function avg(var arr: a): real;
var
   i :1..size;
   sum: integer;
begin
   sum :=0;
   for i :=1 to size do
      sum := sum + arr[i];
   avg := sum / size;
end;
begin 
   (*  Pasamos el array a la función *)
   media := avg( balance );
   (* Mostramos el resultado obtenido *)
   writeln('La media que se obtiene de los valores del array es: ', media:7:2);
end.

Pero habría otras basadas en punteros, arrays abiertos, etc. de modo que el tamaño y contenido del array puede ser establecido en tiempo de ejecución del programa. Por ejemplo:

Código: [Seleccionar]
program arrayToFunction;
var
   miArray: Array of Integer;

Function Average (Row : Array of integer) : Real; 
Var I : longint; 
    Temp : Real; 
begin 
  Temp := Row[0]; 
  For I := 1 to High(Row) do 
    Temp := Temp + Row[i]; 
  Average := Temp / (High(Row)+1); 
end;

begin 
   (*  Pasamos el array a la función *)
   (* Mostramos el resultado obtenido *)
   setlength(miArray,3); 
   miArray[0] := 1; miArray[1] := 8; miArray[2] := 9;
   writeln('La media que se obtiene de los valores del array es: ', Average(miArray):7:3);
end.

Que es más al estilo Java como en este código:

Código: [Seleccionar]
import java.util.Scanner;

public class ArraysToMethod {
   public int max(int [] array) {
      int max = 0;

      for(int i=0; i<array.length; i++ ) {
         if(array[i]>max) {
            max = array[i];
         }
      }
      return max;
   }

   public int min(int [] array) {
      int min = array[0];
   
      for(int i = 0; i<array.length; i++ ) {
         if(array[i]<min) {
            min = array[i];
         }
      }
      return min;
   }

   public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      System.out.println("Introduzca el tamaño del array a ser creado:");
      int size = sc.nextInt();
      int[] myArray = new int[size];
      System.out.println("Introduzca el número de elementos del array:");

      for(int i=0; i<size; i++) {
         myArray[i] = sc.nextInt();
      }
      ArraysToMethod m = new ArraysToMethod();
      System.out.println("El elemento más grande del array es:"+m.max(myArray));
      System.out.println("El elemento más pequeño del array es:"+m.min(myArray));
   }
}

12
Hola Felipe, bienvenido a los foros. Te comento algunas cuestiones.

Revisa https://aprenderaprogramar.com/foros/index.php?topic=1460.0 donde hay distintas indicaciones para escribir en los foros. Es importante seguir las pautas para poner título a los temas, pegar el código con el formato adecuado, etc.

En el ejercicio algunas cuestiones a mejorar serían:

- Los métodos set y get por convenio van seguidos del nombre del atributo. En lugar de setInde y getInde es más adecuado setEsIndependiente y getEsIndependiente. No significa que el código no funcione como tú lo has escrito, sino que no se atiene al convenio que siguen los programadores java.

- Si comparas tu segundo constructor con el que aparece en https://aprenderaprogramar.com/foros/index.php?topic=1238.0 verás algunas diferencias. La principal es que tal y como has escrito tú el código, los objetos que se reciben como parámetros pasan a ser atributos y pueden ser modificados. Con el código tal y como está escrito en ese otro hilo se crean nuevos objetos salonCasa y cocina, de modo que su modificación no afectaría a los objetos que se recibieron como parámetros.

- Con tus métodos setCocinaCasa y setSalonCasa ocurre lo mismo: los objetos recibidos como parámetros pasan a ser atributos. Esto implica que si se manipulan, se verán afectados también los objetos recibidos. Pongo un ejemplo. Supongamos que tú tienes una casa llamada casaFelipe con una cocina llamada cocinaFelipe. Y ahora creamos otra casa llamada casaJuan con una cocina llamada cocinaJuan. Si tú pasas la cocinaFelipe para crear la cocinaJuan, tal y como tú tienes escrito el código, si se modifica la cocinaJuan se modificará también la cocinaFelipe ¿Por qué? Porque estableces el propio objeto recibido como parámetro como atributo en lugar de crear uno nuevo. En cambio con el código como se explica en el hilo indicado puede evitarse esto, que en general es preferible.

Si no entiendes bien esto ahora no te preocupes, apúntalo para revisarlo más adelante.

Saludos

13
Hola Andres1s y bienvenido. Mira en este hilo cómo poner título a los temas y cómo pegar código en los foros: https://aprenderaprogramar.com/foros/index.php?topic=1460.0

En este curso tienes ejemplos de consultas a una base de datos con PHP que quizás te sirvan: https://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=70&Itemid=193

Saludos

14
Hola, he ejecutado el programa y me ha salido el error siguiente:

error system was not declared in this scope

Esto lo he arreglado simplemente añadiendo al principio la línea siguiente:

#include <cstdlib>

Después me ha salido el error siguiente:

main.cpp|139|error: 'to_string' was not declared in this scope

He añadido al principio la siguiente línea:

#include <string>

Pero siguió saliéndome el error del to string.

to_string() es una característica de c++11. Como estoy usando CodeBlocks, me he ido a Project -> Build options -> Compiler settings y he activado la opción "Have g++ follow the C++11 ISO C++ language standard [-stc=c++0x]

Pero tampoco me ha funcionado. Hay una forma de solucionarlo descrita en https://www.programmersought.com/article/84184740114/ pero ya he desistido, así que me he ido a un compilador de c++ online y lo he probado online y ha funcionado bien.

Hago algunos comentarios sobre el código.

Veo que en los comentarios aparece marketProduct pero esa variable no aparece después en el código.

Has declarado cosas como:

Código: [Seleccionar]
int vegeFruts[3]; //vegetales y frutas
vegeFruts[0] = 2; //tomates
vegeFruts[1] = 4; //papas
vegeFruts[2] = 4; //lechuga

A mí esto no me parece demasiado correcto, en el sentido de que sabes que el índice 0 son tomates debido a un comentario del código, pero si el programa crece o se cambian cosas a la larga puede hacerse caótico porque no se sabe bien la correspondencia de los números con las cosas.

Para evitar esto lo suyo sería tener una estructura de datos, un struct al estilo clásico, o una clase al estilo de la programación orientada a objetos.

El no usar funciones en general hace el código no reutilizable, por lo que se desaconseja. Pero si lo has hecho para practicar, pues eso, sólo debería usarse algo así para practicar.

Saludos.

15
Hola, he revisado el ejercicio y lo veo muy bien resuelto.

Sobre lo que comentas de si usar return (super.obtenerSalarioBase() + (47.80*añosEmerito)); sería correcto, la respuesta es que sí, seguramente muchos programadores lo harían así por economía o para ir más rápido. Sin embargo a mí me gusta más como lo has hecho tú porque es más legible y más entendible.

Una recomendación que solemos hacer es evitar el uso de eñes en identificadores como nombres de métodos o de variables. En lugar de añosConsolidados usaríamos annosConsolidados. El motivo es que a la larga cuando se migran los programas o se ejecutan en otras plataformas usar caracteres con tildes o eñes puede acabar generando problemas y una forma de evitarlo es simplemente no usarlos ni aunque sean permitidos.

Saludos.

16
El mensaje de error parece aludir a que no encuentra el archivo datos.txt que parece que tienes definido en

archivo_leer = New StreamReader("./datos.txt")

Deberías comprobar que tienes el archivo creado y que la ruta es correcta. Al indicar ./datos.txt estarías aludiendo a que el archivo se encuentra en el directorio de trabajo actual que está usando Visual Basic, esto deberías comprobarlo.

¿Qué versión de VB estás usando? Esto deberías indicarlo en el título, como se explica en https://aprenderaprogramar.com/foros/index.php?topic=1460.0 , mira ahí las recomendaciones para poner título a los temas.

Saludos

17
Hola mark255, recomendamos siempre que el código quede en los foros debido a que los enlaces suelen terminar fallando con el tiempo y dificultan la navegación. Como ha indicado Kabuto, además de pegar el código se puede añadir un enlace como forma "combinada" si se desea. Saludos.

18
Comunidad / Re: Feliz Navidad y Próspero Año Nuevo para todos
« en: 26 de Diciembre 2020, 17:47 »
Igualmente felices fiestas y mis mejores deseos para todos y todas.

19
Hola, el concepto de interface puede ser un poco difícil de captar al principio. Básicamente lo que hace una interface es definir cómo va a ser una clase en cuanto a cosas que debe cumplir, pero sin especificar el código concreto con el que va a cumplirse eso. Luego puede haber varias clases que cumplan (implementen) la interfaz de distintas maneras en cuanto al código concreto, pero los nombres y parámetros de los métodos definidos por la interfaz tendrán que incluirlos en todo caso. De todas formas este concepto de interface se estudia con más detalle más adelante en el curso, casi al final, por lo que ahora es suficiente con quedarse con la idea.

Respecto al ejercicio el código lo veo bastante bien planteado. Comentar algunas cosas:

- Set se traduce como conjunto y es una interface Java, mientras que List es otra interface Java distinta. Por eso no es lo más adecuado usar nombres para sets de tipo lista1 porque puede confundir. Por ejemplo en lugar de HashSet<String> lista1; sería mejor HashSet<String> conjunto1; ó HashSet<String> miSet1; para no confundir sets con lists.

- En la parte de recorridos con iteradores, creas un iterador para el ArrayList de Set y lo invocas, pero realmente no llegas a usarlo. Es un código "que está pero no se usa", por lo que no es útil. En concreto si comento varias líneas del código, el resultado que obtengo es el mismo porque realmente los iteradores que usas son sólo los del HashSet y los del TreeSet. Aquí el fragmento de código con las líneas comentadas:

Código: [Seleccionar]
        //Iterator<Set> listaIterada = miLista.iterator();    //creando iterador para miLista ArrayList<set>
        Iterator<String> lista1Iterada = lista1.iterator(); //creando iterador para lista1 HashSet<String>
        Iterator<Integer> lista2Iterada = lista2.iterator();//creando iterador para lista2 TreeSet<Integer>
     
        //recorro con un iterador mi HashSet y mi Set ,contenidos en un Arraylist ,recorrido a su vez a traves de un iterador
        //while(listaIterada.hasNext()){
            while(lista1Iterada.hasNext()){
                System.out.print(lista1Iterada.next() + "," );
            }
            while(lista2Iterada.hasNext()){
                System.out.print(lista2Iterada.next());
                if (lista2Iterada.hasNext())
                {
                    System.out.print(",");
                   
                }
            }
            //listaIterada.next();
        //}


Podría hacerse uso del iterador del ArrayList así:

Código: [Seleccionar]
        Iterator<Set> listaIterada = miLista.iterator();    //creando iterador para miLista ArrayList<set>
        Iterator<String> lista1Iterada = lista1.iterator(); //creando iterador para lista1 HashSet<String>
        Iterator<Integer> lista2Iterada = lista2.iterator();//creando iterador para lista2 TreeSet<Integer>
     
        //recorro con un iterador mi HashSet y mi Set ,contenidos en un Arraylist ,recorrido a su vez a traves de un iterador
        while(listaIterada.hasNext()){
            System.out.println("Elemento del ArrayList de Set: "+listaIterada.next());
        }
            while(lista1Iterada.hasNext()){
                System.out.print(lista1Iterada.next() + "," );
            }
            while(lista2Iterada.hasNext()){
                System.out.print(lista2Iterada.next());
                if (lista2Iterada.hasNext())
                {
                    System.out.print(",");
                   
                }
            }


En cualquier caso creo que puede darse el ejercicio por bueno.

Si se quiere ver una solución donde se recorren los elementos del ArrayList, y para cada uno se recorren sus elementos, puede encontrarse en https://aprenderaprogramar.com/foros/index.php?topic=2384.0 donde el bucle se plantea básicamente así:

Código: [Seleccionar]
        while (it1.hasNext()) {
            Set tmp = it1.next();
            Iterator it2=tmp.iterator();
            int i = 0;                               
            while(it2.hasNext()){
                System.out.println("i: " + (i++) + " - " + it2.next());
            }
        }

Correspondiendo el it1 al ArrayList de Set y por cada elemento extraído se crea un iterador it2 dentro del bucle. it1 nos devuelve objetos Set mientras que it2 nos puede devolver bien String bien Integer. Por eso para it2 si no declaramos el tipo, se maneja lo que devuelve como si elementos del supertipo Object.

Saludos

20
Hola, he revisado el ejercicio y aunque el código "funciona" hay varias cosas que habría que corregir.

- En la clase CantanteFamoso hay un comentario que es << * esta clase contiene a los objetos Cantantefamoso >>
Sería más correcto decir << * esta clase define a los objetos Cantantefamoso >> o bien << * esta clase representa a los objetos Cantantefamoso >> ya que la clase no contiene objetos, los define.

- Lo mismo ocurre en la clase ListaCantantesFamosos

- En la clase CantanteFamoso los métodos set no se ajustan a la convención que siguen los miles de programadores Java. Un método set se usa para establecer un atributo a partir de un parámetro o varios parámetros recibidos. Pero aquí los métodos set no reciben parámetros, sino que piden al usuario que introduzca datos por teclado. Esto no está bien planteado desde el punto de vista de la programación orientada a objetos, porque no es responsabilidad de un método set interactuar con el usuario.

- En la clase ListaCantantesFamosos se añaden dos cantantes en el constructor. Esto no debe hacerse, excepto si el ejercicio lo pide explícitamente. En este ejercicio no se pide, luego no es correcto. Esto implicaría que todas las listas se inicializarían con las mismas dos canciones iniciales.

En el hilo https://aprenderaprogramar.com/foros/index.php?topic=2889.0 puede verse una solución correcta con una buena distribución de responsabilidades y ordenación del código. Recomiendo revisarlo. Si te quedan dudas consulta. Saludos.

Páginas: [1] 2 3 4 5 6 ... 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".