• Publicidad

Mostrar valor más alto y más bajo

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

Mostrar valor más alto y más bajo

Notapor charlygarza » 2013-05-18 17:49 @784

Tengo un arreglo y quiero mostrar el valor máximo y mínimo.
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Publicidad

Re: Mostrar valor más alto y más bajo

Notapor explorer » 2013-05-18 20:06 @879

Bienvenido a los foros de Perl en Español, charlygarza.

Puedes recorrer todos los valores del arreglo, y cuando encuentres un valor que sea más pequeño que lo que contenga la variable $minimo (inicializada al principio con el valor más alto), pues lo guardas en ella. Y si el valor es más grande que lo que contenga la variable $maximo (inicializada al principio con el valor más bajo), pues lo guardas en ella. Al final, tienes en $minimo el valor mínimo, y el máximo en $maximo.

También puedes usar las funciones min() y max() del módulo List::Util.
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: Mostrar valor más alto y más bajo

Notapor charlygarza » 2013-05-21 23:23 @016

Gracias por tu ayuda. Lo hice con las funciones max

#!/usr/bin/perl
use List::Util qw(first max maxstr min minstr reduce shuffle sum);
@list = ( 10, 15, 5 );
$foo = first { defined($_) } @list; # first defined value in @list
$foo = first { $_ > $value } @list; # first value in @list which
# is greater than $value
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Re: Mostrar valor más alto y más bajo

Notapor explorer » 2013-05-22 02:28 @144

No sé qué pretendes mostrando ese código, pero ahí no aparece la función max.

Debería ser así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use List::Util qw(max min);
  3. @list = ( 10, 15, 5 );
  4.  
  5. $minimo = min @list;
  6. $maximo = max @list;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

A propósito... te aconsejo que mires el código de List/Util.pm, para que veas lo sencillo que son las funciones min() y max().
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: Mostrar valor más alto y más bajo

Notapor charlygarza » 2013-05-22 22:04 @961

Gracias por tu respuesta tan pronta. El programa me corrió a la perfección. El problema es que ahora que lo ingreso dentro de mi programa principal me muestra el mayor y el menor de las listas pero quiero mostrar nombre del producto que corresponde al precio mayor y de igual manera para el menor pero no lo muestra de forma correcta.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use List::Util qw(max min);
  3. @tipo       = ();
  4. @jumbo      = ();
  5. @grande     = ();
  6. @mediano    = ();
  7. @pequeno    = ();
  8. @economico  = ();
  9. @abarrotes  = ();
  10. @perfumeria = ();
  11. @libreria   = ();
  12. @limpieza   = ();
  13. @tecnologia = ();
  14. for ( $x = 1; $x <= 2; $x = $x + 1 ) {
  15.     print "PRODUCTO No. $x \n";
  16.     print "TIPO PRODUCTO A/ABARROTES, L/LIBRERIA, P/PERFUMERIA LI/LIMPIEZA T/TECNOLOGIA: ";
  17.     $tipo = <STDIN>;
  18.     chop($tipo);
  19.     print "NOMBRE PRODUCTO: ";
  20.     $nombre = <STDIN>;
  21.     chop($nombre);
  22.     print "TAMANO PRODUCTO: J/JUMBO, G/GRANDE, M/MEDIANO, P/PEQUENO, E/ECONOMICO: ";
  23.     $tamano = <STDIN>;
  24.     print "PRECIO:";
  25.     $precio = <STDIN>;
  26.     chop($precio);
  27.  
  28.     #chop para recortar ya que guarda variable f + \n
  29.     #lc lower case para que reconozca siempre como minuscula aunque se ingrese mayuscula
  30.  
  31.     if ( lc($tipo) eq "a" ) {
  32.  
  33.         push( @abarrotes, $precio );
  34.  
  35.         #push(@abarrotes, $nombre);
  36.  
  37.     }
  38.  
  39.     if ( lc($tipo) eq "l" ) {
  40.  
  41.         #push(@libreria, $nombre);
  42.         push( @libreria, $precio );
  43.  
  44.     }
  45.     if ( lc($tipo) eq "p" ) {
  46.  
  47.         #push(@perfumeria, $nombre);
  48.         push( @perfumeria, $precio );
  49.  
  50.     }
  51.     if ( lc($tipo) eq "li" ) {
  52.  
  53.         #push(@pequeno, $nombre);
  54.         push( @pequeno, $precio );
  55.  
  56.     }
  57.     if ( lc($tamano) eq "t" ) {
  58.  
  59.         #push(@economico, $nombre);
  60.         push( @economico, $precio );
  61.  
  62.     }
  63.  
  64. }
  65. $minimo = min @abarrotes;
  66. $maximo = max @abarrotes;
  67. print "TIPO DE PRODUCTOS ABARROTES";
  68. print "el producto mas caro es $maximo\n";
  69. print "el producto mas barato es $minimo\n";
  70.  
  71. $minimo = min @libreria;
  72. $maximo = max @libreria;
  73. print "TIPO DE PRODUCTOS ABARROTES";
  74. print "el producto mas caro es $maximo\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2013-05-23 04:38 @235, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Re: Mostrar valor más alto y más bajo

Notapor explorer » 2013-05-23 09:03 @418

Lo que hay que hacer es guardar el $nombre del producto asociado a su $precio. De esa manera, luego podemos saber qué nombre corresponde a qué precio.

Lo malo es que eso nos obliga a dejar de usar las funciones min() y max(), pero no pasa nada: son solo diez líneas las que hay que agregar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my @tipo      ;
  4. my @jumbo     ;
  5. my @grande    ;
  6. my @mediano   ;
  7. my @pequeno   ;
  8. my @economico ;
  9. my @abarrotes ;
  10. my @perfumeria;
  11. my @libreria  ;
  12. my @limpieza  ;
  13. my @tecnologia;
  14.  
  15. for my $x ( 1 .. 2) {
  16.     print "PRODUCTO No. $x \n";
  17.     print "TIPO PRODUCTO A/ABARROTES, L/LIBRERIA, P/PERFUMERIA LI/LIMPIEZA T/TECNOLOGIA: ";
  18.     $tipo = <STDIN>;
  19.     chomp($tipo);
  20.  
  21.     print "NOMBRE PRODUCTO: ";
  22.     $nombre = <STDIN>;
  23.     chomp($nombre);
  24.  
  25.     print "TAMANO PRODUCTO: J/JUMBO, G/GRANDE, M/MEDIANO, P/PEQUENO, E/ECONOMICO: ";
  26.     $tamano = <STDIN>;
  27.     chomp($tamano);
  28.  
  29.     print "PRECIO:";
  30.     $precio = <STDIN>;
  31.     chomp($precio);
  32.  
  33.     #chop para recortar ya que guarda variable f + \n
  34.     #lc lower case para que reconozca siempre como minuscula aunque se ingrese mayuscula
  35.     $tipo = lc $tipo;
  36.  
  37.     if ( $tipo eq "a" ) {
  38.  
  39.         push( @abarrotes, [ $precio, $nombre ] );
  40.     }
  41.  
  42.     if ( $tipo eq "l" ) {
  43.  
  44.         push( @libreria,  [ $precio, $nombre ] );
  45.     }
  46.  
  47.     if ( $tipo eq "p" ) {
  48.  
  49.         push( @perfumeria,[ $precio, $nombre ] );
  50.     }
  51.  
  52.     if ( $tipo eq "li" ) {
  53.  
  54.         push( @pequeno,   [ $precio, $nombre ] );
  55.     }
  56.  
  57.     if ( $tamano eq "t" ) {
  58.  
  59.         push( @economico, [ $precio, $nombre ] );
  60.     }
  61. }
  62.  
  63. ## búsqueda del valor mínimo y máximo en ABARROTES
  64. print "TIPO DE PRODUCTOS ABARROTES\n";
  65.  
  66. my $minimo = "Inf";
  67. my $maximo = 0;
  68. my($nombre_minimo, $nombre_maximo);
  69.  
  70. for my $abarrote ( @abarrotes ) {
  71.  
  72.     my($precio, $nombre) = @{ $abarrote };
  73.  
  74.     if ($minimo > $precio) {
  75.         $minimo = $precio;
  76.         $nombre_minimo = $nombre;
  77.     }
  78.  
  79.     if ($maximo < $precio) {
  80.         $maximo = $precio;
  81.         $nombre_maximo = $nombre;
  82.     }
  83. }
  84.  
  85. print "el producto más caro es $nombre_maximo con un precio de $maximo\n";
  86. print "el producto más barato es $nombre_minimo con un precio de $minimo\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> perl code_34743.pl
PRODUCTO No. 1
TIPO PRODUCTO A/ABARROTES, L/LIBRERIA, P/PERFUMERIA LI/LIMPIEZA T/TECNOLOGIA: a
NOMBRE PRODUCTO: barrote1
TAMANO PRODUCTO: J/JUMBO, G/GRANDE, M/MEDIANO, P/PEQUENO, E/ECONOMICO: j
PRECIO:100
PRODUCTO No. 2
TIPO PRODUCTO A/ABARROTES, L/LIBRERIA, P/PERFUMERIA LI/LIMPIEZA T/TECNOLOGIA: a
NOMBRE PRODUCTO: barrote2
TAMANO PRODUCTO: J/JUMBO, G/GRANDE, M/MEDIANO, P/PEQUENO, E/ECONOMICO: g
PRECIO:200
TIPO DE PRODUCTOS ABARROTES
el producto más caro es barrote2 con un precio de 200
el producto más barato es barrote1 con un precio de 100
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Esta es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.16;
  3. use utf8::all;                  # activamos todo el soporte para UTF-8
  4.  
  5. my %tipo_productos = (
  6.     A   => 'ABARROTES',
  7.     L   => 'LIBRERÍA',
  8.     P   => 'PERFUMERIA',
  9.     H   => 'HIGIENE',
  10.     T   => 'TECNOLOGIA',
  11. );
  12.  
  13. my %size_productos = (
  14.     P   => 'PEQUEÑO',
  15.     E   => 'ECONÓMICO',
  16.     M   => 'MEDIANO',
  17.     G   => 'GRANDE',
  18.     J   => 'JUMBO',
  19. );
  20.  
  21. ## Lectura de los productos
  22. my %productos;
  23.  
  24. while (1) {                                             # bucle infinito
  25.     say "Introduzca el tipo de producto. [FIN para terminar]";
  26.     while (my($t,$tn) = each %tipo_productos) {
  27.         say "\t$t => $tn";
  28.     }
  29.     print " : ";
  30.     chomp(my $tipo   = readline);
  31.     $tipo = uc $tipo;
  32.  
  33.     last if $tipo eq 'FIN';                             # fin de introducción de productos
  34.     next if not exists $tipo_productos{$tipo};          # el usuario se equivocó
  35.  
  36.  
  37.     print "Introduzca el nombre del producto: ";
  38.     chomp(my $nombre = readline);
  39.  
  40.     say "Introduzca el tamaño del producto";
  41.     while (my($t,$tn) = each %size_productos) {
  42.         say "\t$t => $tn";
  43.     }
  44.     print " : ";
  45.     chomp(my $tamano = readline);
  46.     $tamano = uc $tamano;
  47.  
  48.     print "Introduzca el precio del producto: ";
  49.     chomp(my $precio = readline);
  50.  
  51.     push @{ $productos{$tipo} }, [ $nombre, $precio, $tamano ];
  52. }
  53.  
  54. # Búsqueda de los máximos y mínimos en cada tipo
  55. for my $tipo (sort keys %tipo_productos) {              # para todos los tipo de productos
  56.  
  57.     if ($productos{$tipo}) {
  58.  
  59.         my @productos = @{ $productos{$tipo} };         # leemos todos los productos de ese $tipo
  60.  
  61.         say "TIPO DE PRODUCTOS $tipo_productos{$tipo}";
  62.         my $minimo = "Inf";
  63.         my $maximo = 0;
  64.         my($nombre_minimo, $nombre_maximo);
  65.  
  66.         for my $producto (@productos) {                 # para cada producto
  67.  
  68.             my($nombre, $precio) = @{ $producto };
  69.  
  70.             if ($minimo > $precio) {
  71.                 $minimo = $precio;
  72.                 $nombre_minimo = $nombre;
  73.             }
  74.  
  75.             if ($maximo < $precio) {
  76.                 $maximo = $precio;
  77.                 $nombre_maximo = $nombre;
  78.             }
  79.         }
  80.  
  81.         say "\tEl producto más caro es $nombre_maximo con un precio de $maximo";
  82.         say "\tEl producto más barato es $nombre_minimo con un precio de $minimo";
  83.     }
  84.     else {
  85.         say "No hay productos del tipo $tipo_productos{$tipo}";
  86.     }
  87. }
  88.  
  89. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> perl code_34743.pl
Introduzca el tipo de producto. [FIN para terminar]
        H => HIGIENE
        A => ABARROTES
        T => TECNOLOGIA
        P => PERFUMERIA
        L => LIBRERÍA
 : a
Introduzca el nombre del producto: barrotes1
Introduzca el tamaño del producto
        J => JUMBO
        M => MEDIANO
        P => PEQUEÑO
        G => GRANDE
        E => ECONÓMICO
 : p
Introduzca el precio del producto: 100
Introduzca el tipo de producto. [FIN para terminar]
        H => HIGIENE
        A => ABARROTES
        T => TECNOLOGIA
        P => PERFUMERIA
        L => LIBRERÍA
 : a
Introduzca el nombre del producto: barrotes2
Introduzca el tamaño del producto
        J => JUMBO
        M => MEDIANO
        P => PEQUEÑO
        G => GRANDE
        E => ECONÓMICO
 : g
Introduzca el precio del producto: 200
Introduzca el tipo de producto. [FIN para terminar]
        H => HIGIENE
        A => ABARROTES
        T => TECNOLOGIA
        P => PERFUMERIA
        L => LIBRERÍA
 : t
Introduzca el nombre del producto: tdt
Introduzca el tamaño del producto
        J => JUMBO
        M => MEDIANO
        P => PEQUEÑO
        G => GRANDE
        E => ECONÓMICO
 : m
Introduzca el precio del producto: 50
Introduzca el tipo de producto. [FIN para terminar]
        H => HIGIENE
        A => ABARROTES
        T => TECNOLOGIA
        P => PERFUMERIA
        L => LIBRERÍA
 : l
Introduzca el nombre del producto: El Quijote
Introduzca el tamaño del producto
        J => JUMBO
        M => MEDIANO
        P => PEQUEÑO
        G => GRANDE
        E => ECONÓMICO
 : e
Introduzca el precio del producto: 23
Introduzca el tipo de producto. [FIN para terminar]
        H => HIGIENE
        A => ABARROTES
        T => TECNOLOGIA
        P => PERFUMERIA
        L => LIBRERÍA
 : l
Introduzca el nombre del producto: Fisica 1
Introduzca el tamaño del producto
        J => JUMBO
        M => MEDIANO
        P => PEQUEÑO
        G => GRANDE
        E => ECONÓMICO
 : e
Introduzca el precio del producto: 30
Introduzca el tipo de producto. [FIN para terminar]
        H => HIGIENE
        A => ABARROTES
        T => TECNOLOGIA
        P => PERFUMERIA
        L => LIBRERÍA
 : fin
TIPO DE PRODUCTOS ABARROTES
        El producto más caro es barrotes2 con un precio de 200
        El producto más barato es barrotes1 con un precio de 100
No hay productos del tipo HIGIENE
TIPO DE PRODUCTOS LIBRERÍA
        El producto más caro es Fisica 1 con un precio de 30
        El producto más barato es El Quijote con un precio de 23
No hay productos del tipo PERFUMERIA
TIPO DE PRODUCTOS TECNOLOGIA
        El producto más caro es tdt con un precio de 50
        El producto más barato es tdt con un precio de 50
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: Mostrar valor más alto y más bajo

Notapor charlygarza » 2013-05-23 11:20 @514

Hola, gracias por tu respuesta en tu código cuando lo intento correr me da error en línea 2...

En el que me corregiste a mi cambiando la función max me sigue dando error en el segundo producto. El más barato es y no muestra nada con un precio de inf.
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Re: Mostrar valor más alto y más bajo

Notapor explorer » 2013-05-23 11:33 @523

charlygarza escribiste:Hola, gracias por tu respuesta en tu código cuando lo intento correr me da error en línea 2...

En el que me corregiste a mi cambiando la función max me sigue dando error en el segundo producto. El más barato es y no muestra nada con un precio de inf.
No dices qué error sale, pero en la línea 2 dice que la versión mínima de Perl a usar debe ser un 5.16. Si tenéis una versión más baja, cambiadlo. El programa, debido a la presencia de los say(), requiere una versión mínima de 5.10. O si tienes una versión más antigua (que ya es difícil), pues cambias los say por print, y quitas el 'use'. En la tercera línea uso otro módulo, que facilita el uso de texto con tildes. Si no los necesitas, también puedes quitarlo.

En el primer programa, prueba a cambiar"Inf" por 9999E99.
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: Mostrar valor más alto y más bajo

Notapor charlygarza » 2013-05-25 09:50 @451

Muchas gracias, ya funcionó :D
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598


Volver a Básico

¿Quién está conectado?

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