#91 12-08-13 12:14

jvergara
Miembro
Calificacion :   

Re: Clases: Sistemas de informe automatico

al parecer hay un error en la condición del for y en la sintaxis del print ... así funciona:

for ($i=1; $i<=10; $i++)
{
print "Esto se repetira hasta que la variable ".$i.", valga 10\n"; 
}

Desconectado

#92 12-08-13 12:32

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

sip...

jvergara escribió:

al parecer hay un error en la condición del for y en la sintaxis del print ... así funciona:

for ($i=1; $i<=10; $i++)
{
print "Esto se repetira hasta que la variable ".$i.", valga 10\n"; 
}

o también:

for ($i=0; $i<10; $i++)
{
print "Esto se repetirá 10 veces, desde cero a nueve ($i)\n"; 
printf("\tEsta es la vuelta numero %03d\n",$i+1);
}

(notese la variante printf)

o al revés:

for ($i=10; $i>0; $i--)
{
printf("\tEsta es la vuelta numero %03d\n",$i);
}

Desconectado

#93 12-08-13 12:52

gokkuu
Miembro
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

Estimado me referia a lo que señala jvergara

Hoy 12:14 al parecer hay un error en la condición del for y en la sintaxis del print ... así funciona:


for ($i=1; $i<=10; $i++)
{
print "Esto se repetira hasta que la variable ".$i.", valga 10\n"; 
}

NAX escribió:

nop... es que no tiene por que funcionar.

en el for hay tres secciones, las cuales están separadas por ";", la primera sección indica que valor debe tener la variable escalar al inicio, la segunda sección corresponde a la condición de termino... osea el bloque de código se ejecuta mientras la condición sea "verdad", y la tercera sección es la de incremento de variable.

tu tienes en el for, que "parta en uno", y le dices en la condicionante, "lo ejecute mientras sea 10".... osea nunca se ejecutara, dado que desde el principio la variable es distinta a 10

(me meto de puro patudo, sorry fike)

gokkuu escribió:

me  imprime infinito esto....
For
Veamos la sintaxis de esta estructura y luego la comentamos:
Código:
for ($i=1; $i=10; $i++)
{
print "Esto se repetira hasta que la variable i, valga 10";
}
algo no funciona .........
"El segundo parametro tenemos i=10, este es el parametro de corte, se le llama asi, ya que cuando i valga 10, el ciclo for habra llegado a su fin."


"Tu mejor consejero será la experiencia.. "
Twitter@gokkuu2
youtube: Gokkuu

Desconectado

#94 12-08-13 12:53

gokkuu
Miembro
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

jvergara escribió:

al parecer hay un error en la condición del for y en la sintaxis del print ... así funciona:

for ($i=1; $i<=10; $i++)
{
print "Esto se repetira hasta que la variable ".$i.", valga 10\n"; 
}

si asi me  funciona smile


"Tu mejor consejero será la experiencia.. "
Twitter@gokkuu2
youtube: Gokkuu

Desconectado

#95 12-08-13 13:22

benjamax
Moderador
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

Yo no habia tenido ni un problema con el original. Me parece que no es relevante poner i con comillas y puntos, si alguien lo hace sin eso no deberia tener problemas.

Desconectado

#96 12-08-13 13:43

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

benjamax escribió:

Yo no habia tenido ni un problema con el original. Me parece que no es relevante poner i con comillas y puntos, si alguien lo hace sin eso no deberia tener problemas.

eso de las comillas y punto hay que entenderlo bien, lo que haces es "CONCATENAR" o juntar dos valores y se vean consecutivos

osea:

my $variable1="hola benja";
my $variable2="como estas";

my $variable3=$variable1." ".$variable2;

print $variable3;

acostúmbrense a usar la palabra "my" para definir variables (por un tema de ámbito)

por cierto la asignación a $variable3 también se puede hacer así:

my $variable3="$variable1 $variable2";

Desconectado

#97 12-08-13 13:56

benjamax
Moderador
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

".$i."   y en ese caso que estariamos concatenando?

Desconectado

#98 12-08-13 13:59

benjamax
Moderador
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

"Esto se repetira hasta que la variable ".$i.", valga 10\n" ( concatenado )

pero que es lo mismo que imprimieramos todo juanto

Esto se repetira hasta que la variable $i, valga 10\n"

onofre?

Desconectado

#99 12-08-13 14:02

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

benjamax escribió:

".$i."   y en ese caso que estariamos concatenando?

eso es un error de sintaxis, algo como esto sería concatenar

my $xxx=" ".$i." ";

osea un espacio al principio, el valor de $i y un espacio al final; tres valores diferentes, que se convierten en uno solo (sumado por así decirlo) en la variable "$xxx"

Desconectado

#100 12-08-13 16:19

benjamax
Moderador
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

Ya amigos del foro que siguen el curso de fikegroup. Como habian bastantes ganas de aprender y fike esta medio escaso de tiempo, el amigo NAX con la ayuda de Katy nos daran una mano para que las ganas no queden en nada y sigamos aprendiendo, te seguimos esperando fikegroup ,pero NAX y Katy nos colaboraran mientas dispongas de tiempo. Asi que dentro de estos dias se subiran nuevos post en relacion al tema.( Todo lo que sume es bienvenido ).

Saludos

Desconectado

#101 12-08-13 22:57

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Como dice Benja, colaboraremos en la continuación del curso.

Primera lección, printf:

printf permite formar texto, utilizando secuencias de conversión.
básicamente sirve para desplegar texto, similar a print, pero permite formatear la salida

Ejemplos básicos de printf:

printf("Hola Mundo!\n");
printf("numero %d\n",1);
printf("saludo '%s'\n","hola");
printf("texto formateado '%20s'\n","texto");
printf("texto formateado '%-20s'\n","texto");

explicaciones:
printf("Hola Mundo!\n"); desplegará por pantalla el texto "Hola Mundo!" incluyendo un salto de carro
printf("numero %d\n",1); desplegará por pantalla el texto "numero 1" incluyendo un salto de carro. La secuencia de conversion "%d" será reemplazada por el primer argumento osea 1
printf("saludo '%s'\n","hola"); desplegará por pantalla el texto "saludo 'hola'" incluyendo un salto de carro. La secuencia de conversion "%s" será reemplazada por el primer argumento osea "hola"
printf("texto formateado '%20s'\n","texto"); desplegará por pantalla el texto "texto formateado '               texto'" incluyendo un salto de carro. La secuencia de conversion "%20s" será reemplazada por el primer argumento osea "texto" el cual será justificado a la derecha y se presentará en 20 caracteres
printf("texto formateado '%-20s'\n","texto"); desplegará por pantalla el texto "texto formateado 'texto               '" incluyendo un salto de carro. La secuencia de conversion "%-20s" será reemplazada por el primer argumento osea "texto" el cual será justificado a la izquierda y se presentará en 20 caracteres, la justificación a la izquierda es gracias al signo -

secuencias de conversión disponibles:
%% a percent sign
%c a character with the given number
%s a string
%d a signed integer, in decimal
%u an unsigned integer, in decimal
%o an unsigned integer, in octal
%x an unsigned integer, in hexadecimal
%e a floating-point number, in scientific notation
%f a floating-point number, in fixed decimal notation
%g a floating-point number, in %e or %f notation

Notas
* Es importante entender el comando printf dado que nos permite estructurar los datos y hacer mas legible la entrega de información.
* Cualquier error u omisión hacerla saber para corregir a la brevedad.
* Haga pruebas para entender, y realice consultas para clarificar.

Próxima entrega
paso de argumentos por linea de comando

Desconectado

#102 13-08-13 13:22

Fikegroup
Miembro

Re: Clases: Sistemas de informe automatico

No habia tenido tiempo para pasearme por estos lugares, felicito a nax por continuar con el curso, por mi parte, con el horario que tengo no podre meterme al foro hasta diciembre mas o menos, hasta que termine mi examen.  Les comento a los que siguen en contacto conmigo que tome un curso muy peculiar, lo dicta un fisico medio loco... se llama fisica bursatil bueno ya les contare un poco mas por mail.

Saludos a todos

Desconectado

#103 15-08-13 00:07

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Bueno para redondear un poco en el tema del printf, a continuación hablaremos un poco de las secuencias de escape...

y es que hay caracteres que no se pueden representar de forma fácil.

por ejemplo:

como puedo representar una comilla doble (")??

resulta que cuando imprimimos por pantalla con print o printf, empezamos un texto con (") y lo cerramos con la misma....

entonces, si escribimos: print "hola mundo!!"feo";

tendríamos un problema, dado que la segunda comilla (después del !!) cerraría la sentencia... por tanto tendríamos un error de sintaxis...

pero si quisieramos hacer que nuestro programa en perl despliegue esa comilla como parte del texto, deberíamos poner una secuencia de escape.

así: print "hola mundo!!\"feo";

hay otras secuancias de escape, por ejemplo si queremos deplegar por pantalla el backslash debería ser así: print "mostrando sl backslash \\";

para desplegar una secuencia de escape, debemos anteponer un backslash (\)

Secuencias:
\a     Sonido audible (bell)
\b     Retroceso (backspace)
\f     Salto de formato (formfeed)
\n     Saltar una línea (linefeed)
\r     Retorno de carro (carriage return)
\t     Tabulación horizontal (H Tab)
\v     Tabulación vertical (V Tab)
\\     Barra invertida (backslash) [2]
\'     Apóstrofo (comilla simple)
\"     Doble comilla
\?     Interrogación
\O     O = cadena de hasta tres dígitos octales
\xH    H = cadena de dígitos hexadecimales
\XH    H = cadena de dígitos hexadecimales

Explicación:

existen 33 de estos caracteres que no tienen representación gráfica; son los denominados caracteres de control. Con el fin de poder representarlos en el código fuente, se recurrió al artificio de representarlos utilizando una barra invertida (\) seguida de otra serie de caracteres

Desconectado

#104 15-08-13 00:40

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Segunda lección, paso de argumentos por linea de comando

cuando ejecutamos nuestro programa perl, generalmente lo haremos de la siguiente manera:

perl nuestro_programa.pl

con eso basta para ejecutarlo... pero y como hacemos para darle parametros de entrada (argumento de ejecución)???

simple:

perl nuestro_programa.pl arg1 arg2 xx hola cha 4 5 6

pero... como recibimos esos argumentos?

facil, como comentaba fike, existen tres tipos de datos base en perl:
* escalares: para numeros y texto
* arrays: (arreglos) para secuencias de datos (o paquetes consecutivos)
* hash-maps: para listas de par "clave valor"

si fuera chino lo que estoy hablando, no se preocupen, ya lo entenderán, hasta el momento ustedes han visto los escalares para representar texto o números, ahora verán las arrays (arreglos de memoria); y es en una de estas estructuras donde residen los argumentos de invocación (los argumentos en el ejemplo anterior son; arg1 arg2 xx hola cha 4 5 6 -8 en total-).

Para acceder a los argumentos de invocación, empleamos la variable interna llamada ARGV (argument value).

ARGV es una array que contiene cada uno de los argumentos pasados al momento de invocación.

por ser un arreglo, su definición como arreglo es @ARGV, pero para acceder a cada elemento, debemos usar el subíndice ([posición]).

por ejemplo: el primer elemento del arreglo es el numero cero, entonces accederíamos al primero así: $ARGV[0]

Entonces, un arreglo podría ser una colección de escalares? si de hecho en este caso es así.

entonces, para que nos sirven los argumentos de invocación?
resulta, que cuando queramos ejecutar nuestro sistema o "informe automático", queremos hacerlo sobre cualquier histórico de precios, entonces sería útil por ejemplo invocar nuestro programa así: perl nuestro_programa.pl IPSA;
y que de esa manera el informa sea realizado sobre el histórico de precios del IPSA, en ves de IPSA puede ir COPEC, LAN, BSANTADER, o cualquier papel o índice de mercado.

como podemos recorrer los argumentos de invocación?
Simple, ssamos un ciclo, así:

foreach my $arg ( @ARGV )
{
    print "$arg\n";
}

osea: por cada @ARGV se almacenará la unidad en la variable $arg, y será desplegado por pantalla con print.

y como puedo desplegar el primer argumento?

print "$ARGV[0]\n";

o

printf("$ARGV[0]\n");

o

printf("%s\n",$ARGV[0]);

Notas
* es importante saber como rescatar lo argumentos de linea de comando, para dar un comportamiento particular (o selectivo), a nuestro programa perl.
* los argumentos de invocación son útiles para definir el origen de los datos con los que trabajaremos.

Próxima entrega
Operaciones con archivos 1

Desconectado

#105 15-08-13 00:41

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Agradeceré vuestro feedback para saber si alguien esta interesado en el curso.
Consultas bienvenidas.

Desconectado

#106 15-08-13 06:25

cacique8
Miembro
Calificacion :   

Re: Clases: Sistemas de informe automatico

Si..... interesado y estudiando a mi ritmo.

Desconectado

#107 15-08-13 13:33

jvergara
Miembro
Calificacion :   

Re: Clases: Sistemas de informe automatico

dale nax, por aca siguiendo el curso ... podrias dejar algunos ejercicios practicos para ir aplicando lo que pasas en clases

Desconectado

#108 16-08-13 09:11

benjamax
Moderador
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

Dele no mas man. Con unos ejercicios quedamos tiqui taca, Se agradece.

Desconectado

#109 16-08-13 17:22

jopo35
Miembro
Calificacion :   

Re: Clases: Sistemas de informe automatico

muy buena clase don nax. aqui aprendiendo y muy agradecido de todos los teachers .

Saludos y buen trading a todos

Desconectado

#110 20-08-13 22:33

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Refuerzo: vectores (arrays)

los vectores, en programación, son lugares de la memoria, destinados al almacenamiento de elementos contiguos.
Cada elemento del vector, se accede mediante un índice (posición), donde en un vector de 10 posiciones, la primera posición es la cero, y la última la nueve.

un vector también puede ser llamado arreglo o array.

un arreglo vacío se define así:

my @arreglo=();

la @ denota un arreglo, un $ denota un escalar.

Para esta lección, cada elemento del arreglo será un escalar; por tanto si quisiéramos acceder a cualquier posición válida, deberíamos emplear el simbolo $ seguida del arreglo, más el índice al cual queremos acceder. P.Ej:

print $arreglo[0];

El ejemplo anterior despliega por pantalla el primer escalar del vector.
Tenga claridad que al definir un arreglo o al hacer referencia a este en su totalidad (osea todos los elementos), empleamos el caracter @, pero para referirnos a un elemento especifico, lo hacemos con el caracter $.
para agregar elementos al final del vector, usamos la función push. P.Ej:

my @open = ();
my @high = ();
my @low = ();
my @close = ();
my @volume = ();

for ( my $i = 0; $i < 100; $i++ )
{
    push ( @open, $i );
    push ( @high, $i * 10 );
    push ( @low, $i - 100 );
    push ( @close, $i * 100 );
    push ( @volume, $i * 1000 );
}

para saber cuantos elementos tiene nuestro vector, emplearemos la función scalar (existen otras formas, pero esta será la que emplearemos).

En el siguiente ejemplo, se recorrerán los arreglos desde inicio a fin, y cada elemento almacenado será desplegado por pantalla con printf

for ( my $i = 0; $i < scalar ( @open ); $i++ )
{
    printf ( "open[$i]=%d\n", $open[$i] );
    printf ( "high[$i]=%d\n", $high[$i] );
    printf ( "low[$i]=%d\n", $low[$i] );
    printf ( "close[$i]=%d\n", $close[$i] );
    printf ( "volume[$i]=%d\n", $volume[$i] );
}

ahora, si quisiéramos mostrar el contenido del arreglo de forma "chancha", simplemente hacemos lo siquiente:

print "@open\n";
print "@high\n";
print "@low\n";
print "@close\n";
print "@volume\n";

funciones para operar con arreglos:

push(@array,Element)    Adds to the end of an array
pop(@array)    Removes the last element of the array
unshift(@array,Element)    Adds to the beginning of an array
shift(@array)    Removes the first element of an array
delete $array[index]    Removes an element Spam index number

Nota: En un arreglo, cada posición, no solo puede contener un escalar, pueden ser estructuras mas complejas, pero esas quedan para vuestra investigación.

un sitio recomendado: Arrays en Perl

Hagan sus ejercicios y preocúpense por entender esto de los arreglos, dado que serán las estructuras que emplearemos para el "Informe automático".

He realizado ciertas alteraciones a la planificación del curso, dejaremos para después los archivos, antes deben saber arreglos y funciones

Próxima entrega: Funciones

No dude en hacer consultas

Desconectado

#111 21-08-13 12:09

jvergara
Miembro
Calificacion :   

Re: Clases: Sistemas de informe automatico

Interesante las múltiples posibilidades y la lógica de los arrays, no tengo preguntas por el momento pero están muy buenas las clases

Desconectado

#112 21-08-13 17:02

benjamax
Moderador
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

Resueltas mis dudas man, vamos bien....

Desconectado

#113 29-08-13 16:24

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Refuerzo: funciones

Las funciones son pedazos de código de programación, los cuales pueden ser utilizadas múltiples veces, desde cualquier parte de nuestro programa.

para definir una funcion, se hace así

sub saludar(){
    print("Hola!!\n");
}

la función anterior, se llama saludar, se encargará de hacer un print cada vez que sea invocada.
Y para invocar una función, se hace así: "saludar();"

el programa entero es el siguiente:

sub saludar(){
    print("Hola!!\n");
}

saludar();

(copiar/pegar en sus programa el quote anterior, y lo ejecutan)

También es posible entregar argumentos (parámetros de entrada) a la función así:

sub saludar_con_mensaje()
{
    my $primer_argumento = shift;
    my $segundo_argumento = shift;
    my $tercer_argumento = shift;
    print ( "Hola!! $primer_argumento $segundo_argumento $tercer_argumento\n" );
}
&saludar_con_mensaje ( "cabros", "del", "foro" );

(shift es el encargado de sacar los argumentos secuencialmente)

es posible invocar funciones desde otras funciones así:

sub saludar()
{
    print ( "Hola!!" );
}

sub saludar_con_mensaje()
{
    my $primer_argumento = shift;
    my $segundo_argumento = shift;
    my $tercer_argumento = shift;
    saludar();
    print ( " $primer_argumento $segundo_argumento $tercer_argumento" );
}

saludar();
print ( "\n" );

&saludar_con_mensaje ( "cabros", "del", "foro" );
print ( "\n" );

Las funciones nos servirán, por ejemplo, para aplicar una SMA a un vector de precios...

imaginen la función "sub SimpleMovingAverage(){....}" y que esta nos permita calcular la media simple... el que la haga se gana una estrellita en la mano.

Próxima entrega: archivos 1

No dude en hacer consultas

Desconectado

#114 29-08-13 16:44

benjamax
Moderador
Calificacion :   114 

Re: Clases: Sistemas de informe automatico

Man en la frase

&saludar_con_mensaje ( "cabros", "del", "foro" );

comienza con un &, puedes explicar su importancia, ya que sin el & no funca.

Desconectado

#115 29-08-13 17:12

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

benjamax escribió:

...comienza con un &, puedes explicar su importancia, ya que sin el & no funca.

diferentes formas de hacer lo mismo, prueba con esto:

saludar();
print ( "\n" );

saludar_con_mensaje ( "cabros", "del", "foro" );
print ( "\n" );

sub saludar()
{
    print ( "Hola!!" );
}

sub saludar_con_mensaje {
    my $primer_argumento = shift;
    my $segundo_argumento = shift;
    my $tercer_argumento = shift;
    saludar();
    print ( " $primer_argumento $segundo_argumento $tercer_argumento" );
}

(solo cambia el lugar de la definición... ahora si funka sin el &)

Desconectado

#116 29-08-13 17:19

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Complemento: funciones

las funciones también pueden devolver valores gracias a "return"

my $p = promedio ( 1, 3 );
printf ( "el promedio es: %0.3f", $p );

sub promedio()
{
    return ( $_[0] + $_[1] ) / 2;
}

Fíjense la diferencia, que al recibir los argumentos de entrada, he empleado un vector ($_[0] y $_[1])

(otra forma de hacer lo mismo)

Desconectado

#117 30-08-13 11:03

jvergara
Miembro
Calificacion :   

Re: Clases: Sistemas de informe automatico

# funciones
my @array = (100, 102, 110, 105, 100, 102, 100, 102, 104, 103);
my $p = 3;
sub sma(){
for ($i = $p; $i < scalar(@array)+$p; $i++)
{
    @sma[0..$p-1] = 0;
    @sma[$i] += @array[$i-1];
    @sma[$i] += @array[$i-2];
    @sma[$i] += @array[$i-3];
    printf("Cierre: %.1f ", @array[$i-$p]);
    printf(" SMA$p: %.1f\n", @sma[$i-$p]/$p);
}}
&sma();

Aqui dejo mi funcion sma, aunque creo que esta bastante indecente ... saludos y se agradece el tiempo nax

Desconectado

#118 30-08-13 14:10

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

excelente aporte

te corriste un espacio en la salida, pero en general funciona.

abajo pongo la salida de tu programa (los numeros nomas), y al lado el valor que debiera realmente salir:

(lo verde es lo ok)

100    0    0,00
102    0    0,00
110    0    104,00
105    104    105,67
100    105,7    105,00
102    105    102,33
100    102,3    100,67
102    100,7    101,33
104    101,3    102,00
103    102    103,00

(una estrellita pal Jota)

después pongo mi solución

Desconectado

#119 02-09-13 20:31

mr_one_two
Miembro
Calificacion :   23 

Re: Clases: Sistemas de informe automatico

y? voy atrasado , pero siguiendo el curso wink


"Quiero hacer contigo lo que la primavera hace con los cerezos"

Desconectado

#120 03-09-13 11:56

NAX
Miembro
Calificacion :   49 

Re: Clases: Sistemas de informe automatico

Mi solución...

print ( "---- Spam NAX ----\n" );
use strict;
my @close = ( 100, 102, 110, 105, 100, 102, 100, 102, 104, 103 );
my @SMAResult = fnSMA ( 3, \@close );

for ( my $i = 0; $i < scalar ( @close ); $i++ )
{
    printf ( "%f;%f\n", $close[$i], $SMAResult[$i] );
}

sub fnSMA ()
{
    my $howManyPeriods = $_[0];
    my @array = @ {$_[1]};
    my $count = 0;
    my @retVal = ();
    $retVal[0..$howManyPeriods - 1] = 0;
    for ( my $count = $howManyPeriods - 1; $count < scalar ( @array ); $count++ ) {
        my $sum = 0;
        for ( my $i = $count; $i > $count - $howManyPeriods; $i-- ) {
            $sum += $array[$i];
        }
        push ( @retVal, $sum / $howManyPeriods );
    }
    return @retVal;
}

En el programa del J y este hay cosas que uds. no han visto, por lo tanto debieran hacer consultas o quedarán bajo la mesa

Desconectado

Pie de página

Powered by FluxBB