• Publicidad

Moda de un arreglo en Perl

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

Moda de un arreglo en Perl

Notapor youngfresnel » 2008-12-22 10:10 @465

Hola, ¿cómo están?, recorriendo Internet no me había percatado que existía un foro tan bueno de Perl :shock: , y quería preguntarles si me pueden ayudar con un ejercicio:

Me piden calcular la moda, media, mediana de un arreglo.

Las 2 últimas las tengo hechas, pero no sé cómo sacar la moda.

Adjunto lo que llevo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
print"Ingrese el largo del arreglo"."\n";
$n=<stdin>;
print"Ingrese los datos del arreglo y presione ENTER"."\n";
for($i=0;$i<$n;$i++)
{
$DAT[$i]=<stdin>;
}
if(($n/2)==int($n/2))
{
$k=$n/2;
print"Los digitos centrales son:"."\n";
chop ($DAT[$k]);
print"$DAT[$k]"."\n";
chop ($DAT[$k-1]);
print"$DAT[$k-1]"."\n";
}
else
{
print"El digito central es:"."\n";
print"$DAT[($n-1)/2]";
}

$sum=0;
for($i=0;$i<=$n;$i++)
{
$sum=$sum+$DAT[$i];
}
$prom=$sum/$n;
print"El promedio de los datos en el arreglo es  = $prom\n";
 
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Me decían que ordenara los datos del arreglo (en mi caso son números), y luego comparar los números ingresados en el arreglo... pero no sé cómo hacerlo, por favor, ayuda :cry:
Avatar de Usuario
youngfresnel
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-12-22 10:02 @460

Publicidad

Notapor creating021 » 2008-12-22 10:53 @495

Pero si eso parece Java :lol:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
print "Ingrese los datos del arreglo (separados por un espacio)";
print " y presione ENTER\n";
chomp ( my $datos = <STDIN> ); # Leemos los datos.
my @array = split " ", $datos;# Los separamos
my $n = $#array + 1;      # Calculamos el tamaño
if ( not $n % 2 ) ) {    # Si $n es divisible por 2
    my $k = $n / 2;
    print "Los dijitos centrales son:\n";
    print $array[ $k ], "\n";
    print $array[ $k - 1 ], "\n";
}
else {
    print "El digito central es:\n";
    print $array[ ( $n - 1 ) / 2 ], "\n";
}
my $sum = 0;
for my $i ( 0..$n ) {
    $sum += $array[$i]
}
my $prom = $sum / $n;
print "El promedio de los datos en el arreglo es = $prom\n";
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿Pero... cómo saco la moda?
Bueno, eso es fácil, pero como es una tarea, tendrás que buscar... te doy unas pistas:
  • Haz un foreach para el array de datos.
  • Crea un hash con la relación numero_aparecido => dato
    De esta forma: foreach (@datos){$hash{$_} += 1; }
Te queda buscar cuáles son los repetidos :D
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2008-12-22 11:42 @529

Si la Moda es el valor que más veces se repite, deberás contar las veces que se repite cada valor, y luego quedarte con el de mayor repeticiones.

Utilizando hash, como te ha indicado creating021, se puede hacer fácil.

¡Ánimo! Si te atascas, estaremos por aquí.
Última edición por explorer el 2008-12-22 11:51 @535, editado 1 vez en total
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

Notapor youngfresnel » 2008-12-22 11:44 @530

Hola, gracias creating021, :D ... el problema es que soy un novato en Perl, y no sé qué es un hash o cómo ocupar el foreach :shock:

Voy a investigar, pero si alguien sabe una forma más fácil y prehistórica (para entender algo :cry: ), será bienvenida :D
Avatar de Usuario
youngfresnel
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-12-22 10:02 @460

Notapor creating021 » 2008-12-22 13:03 @586

youngfresnel escribiste:Hola, gracias creating021, :D ... el problema es que soy un novato en Perl, y no sé qué es un hash o cómo ocupar el foreach :shock:

Voy a investigar, pero si alguien sabe una forma más fácil y prehistórica (para entender algo :cry: ), será bienvenida :D

En ese caso, vamos por partes.
Lo primero que necesitas es tener una buena base del lenguaje y para eso tenemos en la página un buen tutorial Perl básico donde se habla de variables, arrays y hashes.
Luego, tienes que saber sobre bucles... este tutorial te ayudará a entender el uso de foreach
Y por último, aquí está lo que necesitas.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor youngfresnel » 2008-12-25 13:30 @604

Hola, ¿cómo están?, bueno, yo todavía no sé cómo obtener la moda :(

Y lo que pasa es que se me vino a la mente si es que podía ordenar el arreglo de números, por ejemplo ingreso el arreglo {1 6 3 2 1} y me lo ordene quedando {1 1 2 3 6}, para así luego comparar los datos uno con uno, poner un contador de frecuencia y imprimir el que se repite mas :) ... pero no sé cómo ordenar los datos en un array, leí que a lo mejor se puede hacer con un sort() , ¿es cierto? :shock:

Bueno, a lo mejor, es una forma más complicada, pero nunca pude aplicar bien el hash y foreach() :cry:, es que entendí que con el foreach() recorría el arreglo, pero no sé qué condición agregarle, y bueno el hash me iba a servir para extraer la moda.

Cualquier ayuda es bienvenida :D :D
Avatar de Usuario
youngfresnel
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-12-22 10:02 @460

Notapor explorer » 2008-12-25 13:54 @621

Sí, el sort() te vale para ordenar un arreglo, pero depende del contenido de ese arreglo. Por defecto, sort() ordenará siguiendo el orden alfanumérico. Deberás usar una expresión para ordenar numéricamente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@ordenado = sort {$a <=> $b} @desordenado;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Luego, el foreach() (que es lo mismo que for()) te servirá para recorrer el arreglo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $elemento (@ordenado) {
    # ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y el hash te sirve para "recordar" en función de una clave.

Por ejemplo, si creamos el hash %veces, podemos decir
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$veces{$elemento} += 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
para indicar que el $elemento aparece en el arreglo una vez más.

Una vez contadas las veces que aparecen los elementos, llega el momento de saber cuál se repite más veces. Para eso, podríamos hacer otro foreach() por las claves de %veces, para ver toda la estadística:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $elemento (keys %veces) {
    # ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Dentro del bucle, vemos si las veces que aparece el elemento supero nuestro máximo, recordamos qué número es. Eso quiere decir que necesitamos dos variables más:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $elemento_con_mas_repeticiones;
my $veces_que_mas_se_repite;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Dentro del bucle anterior las vamos actualizando según encontremos elementos que superen el máximo.

Al final de todo, tendremos el que más se repite.

Y ahora, como deberes, queda reducir los dos foreach() a uno solo.

P.D. En estos foros se ha comentado algunas veces el problema de contar repeticiones. Por ejemplo, Contar repeticiones.
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


Volver a Básico

¿Quién está conectado?

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