• Publicidad

Ejercicio que recoja datos y los ordene

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Ejercicio que recoja datos y los ordene

Notapor alexclipse » 2012-03-29 10:19 @471

No sé si seré tonto, pero no consigo entenderlo :(

La explicación de Wikipedia me lía muchísimo. Soy muy muy principiante y cuando me empieza a hablar de dos bucles, el i y el j, que recorren de un lado a otro... me pierdo.

Lo peor es que encima tengo que entregar un organigrama con el funcionamiento del programa :S

explorer te agradezco la ayuda pero no tienes que convertirte en mi profesor, es él el que tendría que enseñarme cómo se hace antes de mandarme una tarea.
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Publicidad

Re: Ejercicio que recoja datos y los ordene

Notapor explorer » 2012-03-29 10:42 @487

Si tienes que explicar cómo funciona el programa, deberás explicar también cómo funciona, al menos por encima, el algoritmo de ordenación elegido. Así que entenderlo, aunque sea un poco, debes hacerlo (lápiz y papel e imitar lo que hace el procesador es una buena ayuda en estos casos).

En la web de RosettaCode.org tienes ejemplos de muchos códigos. También tienes una implementación de este algoritmo en Perl (son solo 3 líneas, con dos líneas más que solo contienen '}').

Lo malo es que está escrito de una forma "supereficiente", y no es clara para la gente que empieza. Esta es una versión más doméstica:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. sub bubble_sort {                          # Los valores llegan a través de @_
  4.     for my $i (0 .. $#_-1) {               # Comparamos desde el 0 al penúltimo
  5.         for my $j ($i + 1 .. $#_) {        # Comparamos desde el siguiente al $i, hasta el último
  6.             if ( $_[$j] < $_[$i] ) {       # Si el elemento $j-ésimo es menor que el $i-ésimo,
  7.                 @_[$i, $j] = @_[$j, $i];   # los intercambiamos (el elemento $i será el $j, y el $j será el $i)
  8.             }
  9.         }
  10.     }
  11. }
  12.  
  13. my @a = (39, 25, 30, 28, 36, 72, 98, 25, 43, 38);    # Un ejemplo
  14. print "@a\n";                                        # orden original
  15.  
  16. bubble_sort(@a);                                     # ¡Ordena!
  17.  
  18. print "@a\n";                                        # Resultado
  19.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Buscando por Internet te encontrarás con miles de ejemplos más de este algoritmo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejercicio que recoja datos y los ordene

Notapor alexclipse » 2012-03-29 11:03 @502

¿Te importaría explicarme para qué son $#_-1? Es que no sé para que se usan '#' y '_' :S

Por ejemplo, en: if ( $_[$j] < $_[$i] ) no me queda claro para qué son las '_'

O aquí: @_[$i, $j] = @_[$j, $i];

Lo que hace el ordenamiento en burbuja más o menos lo entiendo (creo), sería algo así:
Tengo los números (5,9,23,54,1,76). Pues compara el 5 y el 9. Si 5<9 los deja y si no los cambia. Luego compara 23 y 54, y luego 1 y 76. ¿Cómo continua?

Muchísimas gracias por todo lo que me estás ayudando, siento ser pesado pero es que me cuesta bastante esto del Perl.
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Re: Ejercicio que recoja datos y los ordene

Notapor explorer » 2012-03-29 11:46 @532

alexclipse escribiste:¿Te importaría explicarme para qué son $#_-1? Es que no sé para que se usan '#' y '_' :S

Por ejemplo, en: if ( $_[$j] < $_[$i] ) no me queda claro para qué son las '_'

O aquí: @_[$i, $j] = @_[$j, $i];
La variable que recoge y almacena todos los argumentos que pasamos a una subrutina es la @_. Como ves, es un array. Así que para acceder al $i-esimo elemento de ese array lo escribimos como $_[$i]. Vamos, como si fuera cualquier otro array de Perl, pero en este caso solo se llama '_'.

Un caso especial de los arrays es cuando le ponemos un '#' delante. Por ejemplo:

@x = ('a', 'b', 'e');
print $#x;

En ese caso, estamos sacando el índice del último elemento del array. En el ejemplo, saldría un 2 en pantalla.

En el algoritmo, estamos usando $#_ para saber el índice del último elemento de @_.

En la subrutina trabajamos con @_, ya que así estamos modificando también los elementos que están en @a.

Más información en (tu propio ordenador en) perldoc perldata (traducido).

alexclipse escribiste:Lo que hace el ordenamiento en burbuja más o menos lo entiendo (creo), sería algo así:
Tengo los números (5,9,23,54,1,76). Pues compara el 5 y el 9. Si 5<9 los deja y si no los cambia. Luego compara 23 y 54, y luego 1 y 76. ¿Cómo continua?
No, no es así. Se compara el 5 con todos los demás. Si en las comparaciones hay algún número menor, se intercambia con él (en este caso, el '1'), y sigue hasta el final. Luego, se coge el segundo elemento de la lista y se compara con todos los demás. Luego el tercero, y así, hasta el penúltimo, que solo tiene que compararse con el último.

alexclipse escribiste:Muchísimas gracias por todo lo que me estás ayudando, siento ser pesado pero es que me cuesta bastante esto del Perl.
Para aprender Perl, es una buena base haber aprendido otro lenguaje, como el C o el awk.

Empezar desde cero.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejercicio que recoja datos y los ordene

Notapor alexclipse » 2012-03-31 13:39 @610

Pero es que en mi carrera sólo vamos a utilizar Perl pues es especialmente útil en bioinformática, así que no voy a usar más lenguajes.

Finalmente he conseguido entender el programa y todo lo utilizado en él, muchas gracias.

Antes de eso tengo tres últimas preguntas: si dentro de la subrutina solo uso @_ ¿cómo sabe el programa que, por ejemplo, $i es una variable que va desde el primer al penúltimo elemento del array @a y no de otro array?

¿Cómo funciona el for()?

Y por último, ¿se podría hacer la ordenación usando solo if() y while() en lugar de for? Es que el "for" todavía no nos lo han explicado (realmente no nos han explicado casi nada, pero bueno...)
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Re: Ejercicio que recoja datos y los ordene

Notapor explorer » 2012-03-31 13:52 @619

Aunque Perl es suficiente para resolver prácticamente todos problemas diarios, eso no quita para que podamos aprender otros lenguajes que nos pueden resultar útiles, como el Bash Shell o el awk (que es aún más sencillo que Perl).

Si os enseñan Perl es con la finalidad de que uséis más adelante el paquete de módulos BioPerl, que es el que se usa a nivel profesional.

Y si no quieres aprender otros lenguajes, sí que merece, y mucho, la pena, aprender teoría informática (algoritmos, estructuras de datos...)

En cuanto a las preguntas,
1.- No, no lo sabe. Es el bucle for() el que le va dando los números

2.- Es una estructura básica de control de flujo, presente en casi todos los lenguajes informáticos. Más información -en tu propio ordenador- en perldoc perlsyn (Web) (traducido), en la sección Bucles for.

3.- Pues sí, porque un for() es un while() al que se le ha añadido una variable que hace de contador
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejercicio que recoja datos y los ordene

Notapor alexclipse » 2012-04-06 03:50 @202

Ahora que creía que ya lo tenía todo incluso el diagrama de flujo, llega el profesor y nos dice que lo hagamos con while() e if(), sin usar el for() ya que no lo ha explicado aun. Este es mi código del ejercicio, hasta la ordenación es igual. Debo tener algún error que no identifico pues el programa entra en un bucle al ejecutarlo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Introduzca la cantidad de números a ordenar: ";
  2. $a = <STDIN>;
  3. chomp($a);
  4. while ( $a <= 0 ) {
  5.     print "Introduzca un numero mayor de 0:";
  6.     $a = <STDIN>;
  7.     chomp($a);
  8. }
  9. if ( $a > 0 ) {
  10.     $n = 0;
  11.     while ( $n < $a ) {
  12.         print "Introduzca los números: ";
  13.         $b = <STDIN>;
  14.         chomp($b);
  15.         push @numeros, $b;
  16.         $n++;
  17.     }
  18. }
  19. $c = 0;
  20. $d = $c + 1;
  21. while ( $c < $a ) {
  22.     while ( $numeros[$c] > $numeros[$d] ) {
  23.         $temp        = $numeros[$c];
  24.         $numeros[$c] = $numeros[$d];
  25.         $numeros[$d] = $temp;
  26.         $c++;
  27.     }
  28.     print "$c y $a";
  29. }
  30. print "Los numeros ordenados son: @numeros\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-04-06 10:10 @465, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Re: Ejercicio que recoja datos y los ordene

Notapor alexclipse » 2012-04-07 11:55 @538

El error del bucle ya lo he encontrado. Era simplemente un corchete mal puesto pero el programa solo me ordena los dos primeros números. ¿Cómo consigo que me los ordene todos? He cambiado respecto al anterior mensaje el último corchete de sitio detrás del último $temp.
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Re: Ejercicio que recoja datos y los ordene

Notapor explorer » 2012-04-07 12:03 @544

El método de la burbuja se basa en un doble bucle que vaya recorriendo todos los elementos, para hacer las comparaciones de todos los elementos consigo mismos. Pero en tu segundo bucle no haces eso... solo estás recorriendo los elementos mientras cumplan la condición de que uno sea menor que el otro. Se parará en el primer caso que falle, y entonces no seguirá comparando...

En la página de la Wikipedia lo tienes descrito mejor.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejercicio que recoja datos y los ordene

Notapor alexclipse » 2012-04-12 09:50 @451

Si en mi segundo bucle se para al fallar la condición, ¿cómo hago que en caso de que no se cumpla siga comparando?
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado