Autor Tema: for dudillas  (Leído 1499 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado safiro_pic

  • PIC10
  • *
  • Mensajes: 16
for dudillas
« en: 26 de Abril de 2006, 22:26:37 »
vuelvo a pedir su ayuda amigos  me tope con la instruccion for, que estoy siguiendo del microcursillo de foro vi estos casos
como funciona la instruccion for

revisando los programas coche fantastico y juego de luces observe dos
situaciones del for

en el primer caso "coche fantastico"

for(i=1;i<8;i++)
{                   
   output_b(cont);                     
   delay_ms(100);
   cont=cont*2;
}

1.-¿al entrar en la condicion for cuando i=1 se incrementa en ese mismo instante
i++??? o sea i=2 y luego despues realiza   output_b(cont);                     
                                           delay_ms(100);
                                           cont=cont*2;

o esta otra es la forma correcta?
       entra a for    i=1
                      luego reliza la instruccion

                      output_b(cont);                     
                      delay_ms(100);
                      cont=cont*2;
 y aqui es donde       i=i+1


2.- Esta bien esta parte for(i=1,i<8,i++) no seria for(i=0,i<8,i++)
    sguiendo lo que hace yo supongo que hace asi

    i=1   1<8   " si "  muestra output_b(cont)
    i=2   2<8   " si "  muestra output_b(cont)
    i=3   3<8   " si "  muestra output_b(cont)
    i=4   4<8   " si "  muestra output_b(cont)
    i=5   5<8   " si "  muestra output_b(cont)
    i=6   6<8   " si "  muestra output_b(cont)
    i=7   7<8   " si "  muestra output_b(cont)
    i=8   8<8   " no "  NO muestra output_b(cont)

en la ultima parte no estaria mostrando el ultimo led en el puerto b
cosa que viendo en proteus muestra todos los leds

yo lo cambie a cero lo que decia ser correcto de
   
    i=0   1<8   " si "  muestra output_b(cont)
    i=1   1<8   " si "  muestra output_b(cont)
    i=2   2<8   " si "  muestra output_b(cont)
    i=3   3<8   " si "  muestra output_b(cont)
    i=4   4<8   " si "  muestra output_b(cont)
    i=5   5<8   " si "  muestra output_b(cont)
    i=6   6<8   " si "  muestra output_b(cont)
    i=7   7<8   " si "  muestra output_b(cont)
    i=8   8<8   " no "  se sale ???? digo que salta al otro for que viene de abajo del otro barrido

en este caso tendria que iluminar todos los leds cosa que no lo hace en proteus
el primer caso estaria el correcto pero no entiendo como realiza este ciclo for?????

3.- en el otro el "juego de luces"


hay otro for

for(i=0;i<4;i++)
{           
output_b(leds[ i ]);         
delay_ms(100);
}

en este caso estaria correcto cosa que tambien se simula bien, en i recorreria 4 barridos
     i=0,1,2,3 hasta tres mostraria todos los leds de los costados de dos a dos, pero en el
               barrido 3 en el momento de salir se incrementaria a 4 pero llegando en for 4<4
               no se cumpliria esa condicion y estaria bien porque ya no queremos que nos muestre nada mas
               ya no entraria a la instruccion y se saltaria a lo que viene?


muestro estos dos ejemplos porque no entiendo en el primer caso porque no se cumple cuando es for(i=0;i<8;i++)?????







   

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: for dudillas
« Respuesta #1 en: 27 de Abril de 2006, 00:36:00 »
Hola. Muchas personas que se inicializan en este lenguaje, tienen este tipo de dudas.Intentare aclararlas.

La sentencia "for" tiene la siguiente estructura:

for ( [<inicializacion>] ; [<condicion>] ; [<incremento>] )  <codigo>

<condicion> es checkeada antes de ingresar al primer loop;

<codigo> es ejecutado repetidamente hasta que <condicion> sea falsa;

Antes de ingresar al primero loop, <inicializacion> inicializa las variables declaradas para comenzar el loop;

Después de cada loop, <incremento> se incrementa el contador  del loop.

Por lo tanto, el ejemplo 1 que pones, realiza el loop 7 veces.
Supongo que la variable cont del ejemplo ha sido previamente(antes de ingresar al for) inicializada al valor "1".
Por lo tanto, tenemos(al salir del loop): 2 a la potencia 7 = 128. Esto es correcto, ya q el valor 128 enciende el bit mas alto(el 7) del puertoB del PIC y apaga los demas bits.
A partir de alli, se hara el efecto inverso, haciendo regresar al led a encender hasta llegar a RB0.
Espero haberte ayudado.
Exitos!
« Última modificación: 27 de Abril de 2006, 00:41:14 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado safiro_pic

  • PIC10
  • *
  • Mensajes: 16
Re: for dudillas
« Respuesta #2 en: 27 de Abril de 2006, 18:41:36 »
hola gracias bruno por aclarar esto del for su funcionamiento lo entendi
 tu dices que realiza 7 interacciones estoy de acuerdo con eso, pero no crees
que para llegar a 128 no se necesita 8 interacciones me explico

1ra    2^0=1    primera interaccion  cont=1
2do    2^1=2   
3ro    2^2=4   
4to    2^3=8   
5to    2^4=16   
6to    2^5=32   
7mo    2^6=64   

8vo    2^7=128 


con 7 barridos se llegaria solo a 64 pero simulando  en proteus se
encienden todos los leds correspondientes no comprendo, o es que el proteus como
le falta un ledcito por encender lo enciende por compasion y despues se sale 
del ciclo for???
un saludo.


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: for dudillas
« Respuesta #3 en: 27 de Abril de 2006, 19:32:40 »
Hola. Por simplificar puse 2 a la potencia 7. Fijate que en el programa no hay potenciacion, hay multiplicacion.Si bien la multiplicacion sucesiva puede ser transformada a potenciacion, creo que mi simplificacion del algoritmo dificulto la comprension.

Citar
Supongo que la variable cont del ejemplo ha sido previamente(antes de ingresar al for) inicializada al valor "1".

Como bien dije en el post anterior, la unica manera que el algoritmo funcione, es que contador haya ingresado al for con el valor 1.
Fijate que el loop multiplica el valor de la variable cont x 2. NO LA POTENCIA.
Citar
1ra    2^0=1    primera interaccion  cont=1
2do    2^1=2   
3ro    2^2=4   
4to    2^3=8   
5to    2^4=16   
6to    2^5=32   
7mo    2^6=64 

Por lo tanto, tu seguimiento del comportamiento del for es incorrecto.
lo correcto es:
Antes de ingresar al for: cont=1

1ra    2*1=2
2do   2*2=4   
3ro    4*2=8
4to    8*2=16   
5to    16*2=32   
6to    32*2=64   
7mo  64*2=128

He alli la explicacion de porque el algoritmo funciona correctamente.
Lamentablemente, y afortunadamente en otros casos, no hay "compasion" en la programacion :lol: :lol:
Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado safiro_pic

  • PIC10
  • *
  • Mensajes: 16
Re: for dudillas
« Respuesta #4 en: 28 de Abril de 2006, 11:52:16 »
he gracias nuevamente, bueno solo era un decir  :lol:es que me parecia extraño esa parte no, si es asi como tu lo dices esta correcto un saludo Bruno  :-/