• 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 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

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.003 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: 14480
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

Re: Ejercicio que recoja datos y los ordene

Notapor explorer » 2012-04-12 10:11 @466

Las únicas condiciones de parada de los bucles deben ser la que marcan sus contadores, que recorren los elementos de la lista. No hay más condiciones que comprobar si el contador ha llegado al último elemento de la lista. No hay que poner otra condición, salvo que uses la variante del centinela.

Enséñanos cómo va tu código...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
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 10:23 @474

No he avanzado respecto al último código que puse pues estuve haciendo el ejercicio del tema de bioinformática. Bueno, sí que he hecho un cambio: He borrado el penúltimo print() pues no sirve para nada.

print "Introduzca la cantidad de números a ordenar: ";
$a = <STDIN>;
chomp($a);
while ( $a <= 0 ) {
print "Introduzca un número mayor de 0:";
$a = <STDIN>;
chomp($a);
}
if ( $a > 0 ) {
$n = 0;
while ( $n < $a ) {
print "Introduzca los números: ";
$b = <STDIN>;
chomp($b);
push @numeros, $b;
$n++;
}
}
$c = 0;
$d = $c + 1;
while ( $c < $a ) {
while ( $numeros[$c] > $numeros[$d] ) {
$temp = $numeros[$c];
$numeros[$c] = $numeros[$d];
$numeros[$d] = $temp;
}
$c++;
}
print "Los números ordenados son: @numeros\n";

Estoy muy atascado y no sé cómo seguir :S

Veo el error del segundo bucle como me indicaste pero no la solución ¡je,je!
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-12 15:55 @705

Tan sencillo como copiar y adaptar el código que aparece en la página de la Wikipedia... :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. procedimiento DeLaBurbuja (a₀, a₁, a₂, ...aₙ₋₁)
  2.     para i ← 1 hasta n, hacer
  3.         para j ← 0 hasta n - i, hacer
  4.             si a(j) > a(j+1), entonces
  5.                 temp ← a(j)
  6.                 a(j) ← a(j+1)
  7.                 a(j+1) ← temp
  8.             fin si
  9.         fin para
  10.     fin para
  11. fin procedimiento
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejercicio que recoja datos y los ordene

Notapor alexclipse » 2012-04-13 08:48 @408

He intentado adaptarlo y tengo esto:

print "Introduzca la cantidad de números a ordenar: ";
$a = <STDIN>;
chomp ($a);
while ($a<=0) {print "Introduzca un número mayor de 0:";
$a = <STDIN>;
chomp ($a);
}
if ($a>0) {
$n = 0;
while ($n<$a) {print "Introduzca los números: ";
$b = <STDIN>;
chomp ($b);
push @numeros, $b;
$n ++; }
}
$c = 1;
$d = 0;
while ($c<$a) {
while ($d<($a-$c)) {
if ($numeros[$d]>$numeros[$d+1]) {
$temp=$numeros[$d];
$numeros[$d]=$numeros[$d+1];
$numeros[$d+1]=$temp;}
$d++;}}
print "Los números ordenados son: @numeros\n";

Lo extraño es que así al ejecutarlo no me devuelve los números, el programa no me muestra nada, pero si, por ejemplo, pongo uno de los últimos dos corchetes detrás del print() me devuelve los números ordenados infinitas veces. Es normal pues está dentro del bucle pero el caso es que están ordenados, aunque si no coloco el corchete ahí no me devuelve nada. Creo que casi lo tengo pero sigue fallando algo.
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-13 10:05 @462

He hecho una pequeña corrección que mejora el programa pero ahora me doy cuenta de que me ordena a medias. El programa es este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Introduzca la cantidad de numeros 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 numeros: ";
  13.         $b = <STDIN>;
  14.         chomp($b);
  15.         push @numeros, $b;
  16.         $n++;
  17.     }
  18. }
  19. $c = 1;
  20. $d = 0;
  21. while ( $c < $a ) {
  22.     while ( $d < ( $a - $c ) ) {
  23.         if ( $numeros[$d] > $numeros[ $d + 1 ] ) {
  24.             $temp              = $numeros[$d];
  25.             $numeros[$d]       = $numeros[ $d + 1 ];
  26.             $numeros[ $d + 1 ] = $temp;
  27.         }
  28.         $d++;
  29.     }
  30.     $c++;
  31. }
  32. print "Los numeros ordenados son: @numeros\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El fallo es que al intercambiar dos números, sigue donde lo dejo y no vuelve a empezar. ¿Qué tengo que cambiar o añadir para que lo haga?
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 14 invitados