• Publicidad

Ejercicio con matrices

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

Ejercicio con matrices

Notapor xwalero » 2012-02-04 01:19 @096

Hola, no sé si esto va acá xD... Lo que pasa es que tengo unos ejercicios con matrices. Pero me quedé estancado en la letra C). Las instrucciones son:

hacer una matriz y entregar matriz Traspuesta, los mayores de cada fila y ordenar la matriz usando como key el primer elemento de cada fila


Tengo este código para la A y B hasta ahora:
http://pastebin.com/r10teh0x
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. print "Filas:\n";
  3. my $filas = <stdin>;
  4. print "Columnas:\n";
  5. my $columnas = <stdin>;
  6.  
  7. if($filas>=1 && $columnas>=1)
  8. {
  9.         ### si hay más filas que columnas (o es matriz cuadrada)
  10.         if($filas>=$columnas)
  11.         {
  12.                 for($i=1; $i<=$filas; $i++)
  13.                 {
  14.                         for($j=1; $j<=$columnas; $j++)
  15.                         {
  16.                                 print "Datos para matriz [$i][$j]: ";
  17.                                 $arr[$i][$j] = <stdin>;
  18.                         }
  19.                 }
  20.         }
  21.         ### si hay más columnas que filas
  22.         else
  23.         {
  24.                 for($j=1; $j<=$columnas; $j++)
  25.                 {
  26.                         for($i=1; $i<=$filas; $i++)
  27.                         {
  28.                                 print "Datos para matriz [$i][$j]: ";
  29.                                 $arr[$i][$j] = <stdin>;
  30.                         }
  31.                 }
  32.         }
  33.        
  34.         #A) ################################
  35.         ## más filas que columnas (o es matriz cuadrada)
  36.         print "\nMatriz traspuesta:\n";
  37.         if($filas>=$columnas)
  38.         {
  39.                 for($i=1; $i<=$columnas; $i++)
  40.                 {
  41.                         for($j=1; $j<=$filas; $j++)
  42.                         {
  43.                                 print "Mat[$i][$j] = $arr[$j][$i]";
  44.                         }
  45.                 }
  46.         }
  47.         ## más columnas que filas
  48.         else
  49.         {
  50.                 for($j=1; $j<=$filas; $j++)
  51.                 {
  52.                         for($i=1; $i<=$columnas; $i++)
  53.                         {
  54.                                 print "Mat[$j][$i] = $arr[$j][$i]";
  55.                         }
  56.                 }
  57.         }
  58.        
  59.         #B) ################################
  60.         print "\nElementos mayores de cada fila:\n";
  61.         $i = 1;
  62.         $j = 1;
  63.         while($i<=$filas)
  64.         {
  65.                 ## mayor[1] sería igual a $arr[1][1]
  66.                 ## esto crea un nuevo array que tiene
  67.                 ## los mayores valores de $arr
  68.                 $mayor[$i] = $arr[$i][$j];
  69.                 for($j=1; $j<=$columnas; $j++)
  70.                 {      
  71.                         if($mayor[$i]<=$arr[$i][$j])
  72.                         {
  73.                                 $mayor[$i] = $arr[$i][$j];
  74.                         }
  75.                 }
  76.                 $i++;
  77.         }
  78.         ## como i<=filas, entonces i tiene un elemento de sobra, porque
  79.         ## al terminar la condición, igual aumenta.
  80.         ## hay que quitárselo:
  81.         $i--;
  82.         for($h=1; $h<=$i; $h++)
  83.         {
  84.                 print "Fila $h: $mayor[$h]";
  85.         }
  86.        
  87.         #C) ################################
  88.         ## aquí no entiendo: guardé los mayores de cada fila
  89.         ## pero si los quiere ordenar según eso, sería
  90.         ## lo mismo que decir $arr[$i][$j] poh.
  91.         print "\n";
  92.         print "Primer elemento de cada fila:\n";
  93.         for($i=1; $i<=$filas; $i++)
  94.         {
  95.                 $r = $arr[$i][1];
  96.                 print "Fila n$i: $r";
  97.                 ## creé un array orden y le metí los valores
  98.                 ## mayores de cada fila
  99.                 @orden = (@orden,$r);
  100.         }
  101.         @array = sort(@orden);
  102.         @array = sort{$a<=>$b}(@array);
  103.         print "\nDe mayor a menor:\n";
  104.         print @array;
  105.        
  106. } ## fin si los valores son >= 1
  107. else
  108. {
  109.         print "Introduzca un número de filas y columnas mayor que 0";
  110. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


La parte de:
Código: Seleccionar todo
  #C) ################################
        ## aquí no entiendo, guardé los mayores de cada fila
        ## pero si los quiere ordenar según eso, sería
        ## lo mismo que decir $arr[$i][$j] poh.

no la tomen en cuenta: era un intento por hacer esa parte del ejercicio xDDDD.

Lo que pide es que si, por ejemplo tengo esta matriz:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
3 | 6 | 5
1 | 8 | 2
9 | 7 | 4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La ordené según sus primeros elementos, y quedaría así:
1 | 8 | 2
3 | 6 | 5
9 | 7 | 4
porque 1 < 3 < 9
(o al revés, de mayor a menor... eso da igual)

¡Gracias!
Última edición por xwalero el 2012-02-04 18:09 @798, editado 1 vez en total
xwalero
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-04 01:15 @094

Publicidad

Re: Ejercicio con matrices

Notapor explorer » 2012-02-04 08:36 @400

Bienvenido a los foros de Perl en español, xwalero.

Creo que no te has dado cuenta, pero las líneas 12 a 19 hacen lo mismo que las líneas 24 a 31. Y que las líneas 39 a 45 hacen lo mismo que las líneas 50 a 56.

Luego, en el cálculo del mayor número por cada fila, el valor de $i será siempre igual al número de filas (debería ser igual a, o tendríamos un problema, por lo que pones del 78 al 82, sobra: simplemente cambia $i por $filas en el for de la 82.

Luego, en la ordenación, vas bien, haciendo un sort(), pero no de lo que quieres ordenar. Fíjate que pones sort(@orden), que hace una ordenación alfanumérica de los elementos de @orden, seguido por otro sort, esta vez numérico, de los elementos ordenados de @orden. Además, la ordenación es de menor a mayor ($a está antes que $b, en la comparación), por lo que no concuerda con el print de la línea 103.

El problema principal es que en las líneas 93 a 100 estás desligando los elementos de la primera columna, del resto de elementos. Eso quiere decir que luego, en el sort(), solo estamos ordenando esos valores... entonces... ¿cómo sabemos qué elemento ordenado corresponde a qué fila? Hay que recordar que tenemos que ordenar las filas enteras, no solo los elementos de la primera columna.

¡Inténtalo!
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 con matrices

Notapor xwalero » 2012-02-04 14:03 @627

Gracias por la bienvenida :D
¡Ooooh! Me acabo de dar cuenta de que puse el código antiguo xD!
En el que corregí, el problema de las líneas que hacen lo mismo y el print() (mayor a menor, en vez de menor a mayor) están corregidos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. print "Filas:\n";
  3. my $filas = <stdin>;
  4. print "Columnas:\n";
  5. my $columnas = <stdin>;
  6.  
  7. if ( $filas >= 1 && $columnas >= 1 ) {
  8.     for ( $i = 1; $i <= $filas; $i++ ) {
  9.         for ( $j = 1; $j <= $columnas; $j++ ) {
  10.             print "Datos para matriz [$i][$j]: ";
  11.             $arr[$i][$j] = <stdin>;
  12.         }
  13.     }
  14.  
  15.     #A) ################################
  16.     print "\nMatriz traspuesta:\n";
  17.     for ( $i = 1; $i <= $columnas; $i++ ) {
  18.         for ( $j = 1; $j <= $filas; $j++ ) {
  19.             print "Mat[$i][$j] = $arr[$j][$i]";
  20.         }
  21.     }
  22.  
  23.     #B) ################################
  24.     print "\nElementos mayores de cada fila:\n";
  25.     $i = 1;
  26.     $j = 1;
  27.     while ( $i <= $filas ) {
  28.         $mayor[$i] = $arr[$i][$j];
  29.         for ( $j = 1; $j <= $columnas; $j++ ) {
  30.             if ( $mayor[$i] <= $arr[$i][$j] ) {
  31.                 $mayor[$i] = $arr[$i][$j];
  32.             }
  33.         }
  34.         $i++;
  35.     }
  36.     for ( $i = 1; $i <= $filas; $i++ ) {
  37.         print "Fila $i: $mayor[$i]";
  38.     }
  39.  
  40.     #C) ################################
  41.     print "\n";
  42.     print "Primer elemento de cada fila:\n";
  43.     $i = 1;
  44.     while ( $i <= $filas ) {
  45.         for ( $j = 1; $j <= $columnas; $j++ ) {
  46.             $r = $arr[$i][$j];
  47.             @orden = ( @orden, $r );
  48.         }
  49.         $i++;
  50.     }
  51.     print @orden;
  52.  
  53.     for ( $h = 1; $h <= $columnas; $h++ ) {
  54.  
  55.     }
  56.  
  57. }                                      ## fin si los valores son >= 1
  58. else {
  59.     print "Introduzca un numero de filas y columnas mayor que 0";
  60. }
  61.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ahora, sé que está mal mi método, pero decidí no quitarlo para que vieras cómo lo pensé en un principio. Luego quise hacerlo de otra manera... la idea era hacer un for() anidado para ir recorriendo el mayor elemento (algo parecido al código desde la 30 hasta la 43) pero tuve varios errores en el proceso xD. El problema es que tampoco conozco Perl muy bien, he aprendido más o menos su sintaxis en algo como 3 o 4 días xd, entonces no sé si hay alguna función que haga lo que yo quiero.

Al hacer un sort al array, eso ordenaría la matriz completa, ¿o no? Entonces dejaría los elementos de menor a mayor, pero sin importar a qué fila pertenecen.

Mi problema es que creo poder ordenar las columnas de cada fila de mayor a menor, pero no sé cómo ordenar las filas para moverlas hacia arriba o abajo y que queden sus columnas intactas.

¡Gracias de nuevo!
xwalero
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-04 01:15 @094

Re: Ejercicio con matrices

Notapor explorer » 2012-02-04 15:26 @684

Te aconsejo que cambies el '&&' de la línea 7 por un 'and'.

Luego, para el tema del ordenamiento. Hay que usar sort, desde luego, pero ¿de qué? "del primer elemento de cada fila", Bien. ¿cuál es el primer elemento de cada fila? $arr[$i][0]. Bueno, pues justamente eso es lo que debes darle a sort() para que ordene toda la matriz...

¿Lo pillas? :wink:
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 con matrices

Notapor xwalero » 2012-02-04 15:46 @699

Si le hago sort() a $arr[$i][1] (es el primer elemento, no parte de 0 en este caso) dentro de un for(), estaré ordenando el número respecto a él mismo en cada ciclo, entonces no hará nada realmente :S. Por ejemplo, eso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "\n";
  2. print "Matriz ordenada por filas:\n";
  3. for($i=1; $i<=$filas; $i++)
  4. {
  5.         sort($arr[$i][1]);
  6.         sort{$a<=>$b}($arr[$i][1]);
  7.         print $arr[$i][1];
  8. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


muestra cada primer número de la fila, pero no en orden.

Sigo sin entender cómo puedo hacer para que muestre la fila con sus columnas completas y estén ordenadas según su primer número xD. Perdón lo bruto ¡ja,ja,ja!

Al ordenar un elemento dentro de un bucle, estaría siempre ordenando el elemento en base a sí mismo... por eso yo quería introducir todos los datos dentro de otro array y ordenar ese array. Lo que no sé, es dividir ese array en el número de columnas por fila... es decir, si tengo 3 filas y 2 columnas, dividir el array con todos los datos ingresados en su orden original, en 3 arrays que contengan 2 valores cada uno (por el número de columnas). Así podría después comparar los primeros valores de cada uno de esos arrays y mostrarlos.

¿Suena muy a "ciencia ficción"? xD
xwalero
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-04 01:15 @094

Re: Ejercicio con matrices

Notapor explorer » 2012-02-04 16:15 @719

Pues no, no lo has pillado.

Lo resuelves así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @array_ordenado = map { $arr[$_] } sort { $arr[$a][1] <=> $arr[$b][1] } 0 .. $#arr;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

"Ordenación numérica ascendente de los elementos de @arr, según el valor del elemento 1 referenciado por esos elementos".
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 con matrices

Notapor xwalero » 2012-02-04 16:23 @724

EDIT: no he dicho nada, ¡probaré! Gracias.
No tenía idea de que se podía hacer eso
xD

Para probarlo hice esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         print "Matriz ordenada por filas:\n";
  2.         my @arr2 = sort { $arr[$a][1] <=> $arr[$b][1] } @arr;
  3.  
  4.         print $arr2[1][1]." ";
  5.         print $arr2[1][2]." ";
  6.         print $arr2[1][3]."\n";
  7.         print $arr2[2][1]." ";
  8.         print $arr2[2][2]." ";
  9.         print $arr2[2][3]."\n";
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

He introduje una matriz de 2x3, así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
5 9 7
4 6 3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y la debió haber mostrado con la fila del 4 primero, pero la mostró igual :S
xwalero
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-04 01:15 @094

Re: Ejercicio con matrices

Notapor xwalero » 2012-02-04 17:21 @765

¡Listo! Así quedó:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         print "Matriz ordenada por filas:\n";
  2.         my @arr2 = sort { $arr[$a][1] <=> $arr[$b][1] } @arr;
  3.  
  4.         print "\nSEGUNDA:\n";
  5.         for $list_ref ( sort {$a->[1] <=> $b->[1]} @arr2 )
  6.         {
  7.         print "@$list_ref \n";
  8.         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Muchas gracias!
xwalero
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-04 01:15 @094

Re: Ejercicio con matrices

Notapor explorer » 2012-02-04 20:13 @884

¿Por qué haces la ordenación dos veces?
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 con matrices

Notapor xwalero » 2012-02-05 12:24 @558

Porque al hacer la primera, después muestro los resultados y no salen ordenados. Y si hago la segunda solamente, me da un error de querer modificar atributos... entonces primero está el array duplicado y después se ordena con la segunda función de ordenamiento.
xwalero
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-04 01:15 @094

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 21 invitados