C/Visual C - Explicacion de este while

   
Vista:

Explicacion de este while

Publicado por Diego (85 intervenciones) el 25/03/2014 00:28:25
Bunas noches, recien empiezo a programar en c, y me topé con esta expresion dentro del while, compila así que supongo que es correcto utilizarla dentro de ubn while, pero no entiendo bien que es lo que hace;

1
2
3
4
5
6
7
int main() {
int sumo=0, n=5;
  do
    sumo+=n;
  while(--n);
  return sumo;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Explicacion de este while

Publicado por vangodp (10 intervenciones) el 25/03/2014 14:46:29
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
 
   int sumo=0, n=5;
    //El bucle do while hace que entre como mínimo una vez antes de analizar la expresión
   do
      //sumo aumenta el valor de n que es 5 en la primera iteración.
      sumo+=n;
   //while lo que quiere saber es si el resultado de una expresión sea true(verdadero). El numero ira decrementando en cada iteración.
   //Fije se que el símbolo -- va antes de la n que lo que hace es que primero se decrementa y después comprueba el valor.
   //Mientras n no sea 0 seguirá decrementando.
   while(--n);
   return sumo;
 }

Lo que hace este bucle es sumar a "sumo" en cada iteración de esta manera los valores de n que a cada ciclo sera cada vez menor hasta detener por completo cuando llegue n valer 0 que en la programacion 0 es lo mismo que falso.
Eso es lo que pasa....

1º iteracion:
entra en el bucle por que do permite el paso antes de comprobar.
sumo vale 0 y n vale 5
se asigna el valor de n a sumo que a partir de ese momento vale 5.
En while() se decrementa primero y después se mira si es verdadero, o sea n pasa a valer 4 y se comprueba si 4 es verdadero, cosa que si es verdadero en ese caso. Al ser verdadero vuelve hacia el "do" y repite el mismo proceso.
2º iteracion:
Entra en do por que es verdadero en el while anterior.
Ahora "sumo" vale 5 y n vale 4.
se incrementa sumo n lo que vale 4.
OBS el operador += es como el ++, pero el ++ solo incrementa una unidad y el operador += lo que hace es incrementar lo que aya del lado derecho de el, sumo =+ n; ahora en ese punto equivale a 5 += 4; que es lo mismo que: sumo=sumo+n; o sea ( sumo = 5+4 ).
Se decrementa en while a "n" y se comprueba si es verdadero, ahora n vale 3¿Es verdadero? ¡Si, si que lo es, mientras no sea 0 seguira siendo verdadero ;)
entramos por do mas una vez...
3º iteracion XDDD
esta la calcula tu ^^
asi va a seguir hasta que while reciba un falso, en la programación solo existe un falso y es el cero "0", algunos lenguajes tienen la palabra reservada false, pero es como si de 0 se tratara. De echo si creas una variable tipo bool numero = false; y imprimes el "numero" con un cout o un printf envés de decir false te va dar un claro "CERO" 0 =D
te hago una sugerencia ^^ Compila eso y así tienes control de lo que vale cada numero en cada iteración:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
int main (){
    int sumo=0, n=5;
    /*no haga caso de estos numeros, solo son para comprobar el comportamiento de tu programa ;)*/
    int contador = 1;
 
    printf("Antes del bucle sumo:%d y n:%d", sumo,n);
 
    do{
 
        printf("\n\n%dra iteracion", contador);
        printf("\nAl entrar en el bucle sumo:%d y n:%d", sumo,n);
        sumo+=n;
        printf("\nDespues de la operacion sumo:%d y n:%d", sumo,n);
        contador++;
    } while(--n);
 
    printf("\n");
    printf("\nAqui, n es falso\"No existe un sexta iteracion, por que ya estamos fuera\"");
    printf("\nNi siquiera entramos en do la sexta vez, pasamos a la seguinte linea despues de while");
    printf("\n\n\n\n");
 
    return sumo;
}

atento a los operadores --, ++ y +=
si por ejemplo tienes una expresión:
valor = numero++;
y valor fuera 0 y numero fuera 10.
si pongo valor = n++; y imprimo "valor", me va imprimir 10 ¿Pero como asi si lo he incrementado el valor?¿NO?
cuando hago:
valor = numero++;
primero estoy asignando el valor de "numero" a "valor" y solo despues se incrementa, eso puede ser una fuente de problemas si no te fias bien.

si n vale 10 y quiero asignar a valor lo que vale numero incrementado debo poner el operador++ antes.
valor = ++numero;

Ahora valor vale 11 ;)
Lo mismo que el de --

Con el de += no tienes ese problema por que piensas que += es lo mismo que sumar lo que viene despues del+= con lo que esta antes...
valor = valor +numero;
Aqui hacemos que valor que vale 0 se sume a numero que vale 10 y lo metemos dentro de ella misma, o sea ahora valor vale lo que valor + numero.
El resto ya va por tu cuenta ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

Explicacion de este while

Publicado por JuanC juanc2942@gmail.com (35 intervenciones) el 25/03/2014 15:25:13
sin probarlo creo que hace la suma: sumo = 5+4+3+2+1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Explicacion de este while

Publicado por vangodp (10 intervenciones) el 26/03/2014 05:14:37
Antes del bucle sumo:0 y n:5
Despues de la operacion sumo:5 y n:5
Despues de la operacion sumo:9 y n:4
Despues de la operacion sumo:12 y n:3
Despues de la operacion sumo:14 y n:2
Despues de la operacion sumo:15 y n:1

Estos son los valores que va tomando :D
Esta claro que calcular eso es fácil pero no nos dejemos engañar que si n llega valer algo como 999999 y ni me he colado jeje, te tira la tarde pa hacer con el lápiz XDD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Explicacion de este while

Publicado por diego (85 intervenciones) el 26/03/2014 17:27:04
Gracias a todos, ya entendí bien lo que hace, había olvidado que 0 es falso y el resto de los números son verdadero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar