<java>incrementation

Bonjour,
je suis débutant,le prg suivant marche bien,mais j'aimerai bien savoir,comment marche ce boucle
chaque passage de 0 à 8,si quelqu'un peut m'aider?je serai content
public class Icrem1 {
	
		public static void main(String[] args) 
		{
		
		int n,p;
		n=p=0;
               while(n<=8)n+=++p;
		{
			System.out.println("increment n= " + n);
			System.out.println("increment p= " + p);
		}
		
	}
}
Configuration: Windows Vista / Firefox 3.5.8

12 réponses

Résumé de la discussion

Le problème central est le comportement de la boucle while et l’ordre d’incrémentation dans n += ++p, ainsi que l’effet d’un bloc après le while qui peut être exécuté hors de la boucle. Des explications montrent que ++p augmente d’abord p puis que n est augmenté de cette valeur, produisant une progression typique (n,p) de (1,1), (3,2), (6,3) puis n atteint 10 et sort de la boucle. Le bloc d’impression, séparé par le point-virgule, s’exécute après la boucle et affiche les valeurs finales, ce qui répond à certaines confusions et éclaire des remarques sur l’initialisation et la lisibilité du code.

Bobot (l’IA à votre service)
  1. I) les variables sont déclarées et initialisées à zéro
    int n,p;

    Petite remarque : la ligne suivante :
    n=p=0;
    est complètement inutile en java. En java les variables nombres sont toujours initialisés à 0 lorsqu'elles sont déclarées.

    II) la boucle du programme :
    while(n<=8)n+=++p;


    ce que je préfère (personnellement) réécrire comme ceci :
    while(n<=8) {
        n+=++p;
    }


    d'abord on teste pour savoir si n est plus petit ou égal à 8. On sortira donc de la boucle lorsque n sera strictement plus grand que 8.

    à chaque étape de la boucle on éxécute cette ligne :

    n+=++p;

    ceci signifie :
    1) avant toute chose, incrémenter p.
    2)ensuite, avec la nouvelle valeur de p, on exécute cette ligne :
    n+=p, ce qui est comme n=n+p.

    Ainsi, tu peux prendre un papier et un crayon (et une gomme) et marquer les valeurs de p et de n au fur et é mesure des itérations de la boucle. Tu verras ainsi comment les valeurs changent très facilement. Essaye et is-nous s'il y a qqchose que tu ne comprends pas.

    III) Les valeurs finales de n et p après la boucle sont affichées grâce au bloc
    {
        System. ....
        System....
    }

    Remarque : les accolades ici sont inutiles pour le programme. (éventuellement pour bien voir que ce bloc ne fait que de l'affichage, mais j'aurai plutôt tendance à dire que c'est source d'erreur, on pourrait croire que le programme boucle sur ce bloc alors que ce n'est pas le cas, le while ne va que sur l'instruction qui la suit.
    1. Salut Paco,

      Citation:
      "Petite remarque : la ligne suivante :
      n=p=0;est complètement inutile en java. En java les variables nombres sont toujours initialisés à 0 lorsqu'elles sont déclarées."

      Que donne ceci à la compilation ?

               int n;
              -------
              --------
               n++;
      

      javac n'aime pas:
      variable n might not have been initialized
      Alors?

      Cordialement,

      Dan
    2. @danimoabsolument, c'est un warning censé, le programmeur pourrait avoir oublié de préciser une valeur de départ, ça aurait pu ne pas être zéro.
      je t'accorde que c'est une bonne chose à faire, pour éviter ce warning et juste par habitude.
      je n'aurai même pas dû le dire effectivement.
    3. @PacorabanixRe,

      Pourquoi un warning ?
      C'est une erreur et la compilation est stoppée, ce qui oblige le programmeur à initialiser sa donnée alors qu'avec un message warning (exemple: on veut utiliser une méthode "deprecated") la compile abouti et on peut executer.
      Dans ce cas javac propose de lancer l'execution avec -Xlint:deprecation ce qui permettra d'abord de savoir quelle méthode est dépreciée et ensuite le n° de la ligne du code, ce que n'indique pas warning.

      Mais je m'éloigne du sujet...

      Cordialement,

      Dan
  2. Fais plutot une boucle for...
    1. je pense plutot que c'est un programme d'exemple pour apprendre(mais je peux me tromper)
      cdlt
  3. j'ai besoin encore votre aide
    quand 0 est inferieur egal 8 n+= ++p; //aimerais bien savoir quel est valeur de n et p
    quand 1 est inferieur egal 8 n+= ++p; //aimerais bien savoir quel est valeur de n et p
    quand 2 est inférieur égal 8 n+= ++p; //aimerais bien savoir quel est valeur de n et p
    quand 3 est inférieur égal 8 n+= ++p; //aimerais bien savoir quel est valeur de n et p

    je suis un peu confondu aidez moi s'il vous plaît
    1. ok, faisons le pas à pas.
      n n'augmente pas de manière régulière...

      Au tout début, c'est clair que n=0 et p=0.

      Que se passe t'il lorsque la ligne n+= ++p est exécutée ?
  4. lorsque la ligne n+= ++p est exécutée
    n=1, p=1
    1. tout à fait exact.

      Et ensuite, lorsque cette ligne est exécutée une deuxième fois ?
  5. n=2,p=1
    1. non. Revois la ligne. Que fait-elle ?
    2. @domxaline(désolé de la réponse tardive, je n'étais plus devant un ordi :) )

      non plus.

      Avant d'essayer encore, redis moi exactement ce que fais la ligne n += ++p . (elle fait deux choses, dans un ordre très précis)
  6. s'il fait deux choses:
    n+= n aditionne 1
    ++p p aditionne 1
    1. non ! l'ordre est faux et n n'est pas "additionné de 1". Il est incrémenté de p.
      Et c'est ans l'autre ordre !!! (d'abord p est incrémenté de 1, puis n est incrémenté de p).

      Relis mon premier post.

      Donc alors, que se passe t'il exactement lorsque la ligne est exécuté alors que n=1 et p=1 au début.
  7. merci de m'aider
    excuse moi,si je raconte des conneries

    n=3 p=2
    1. voilà, exactement :)

      pas de problème. Mais si je te donnais la solution tout de suite tu n'aurais pas compris je pense

      et ensuite, à la prochaine itération ?
    2. @Pacorabanixbonjour,
      n 0, p 0 ;
      n 1, p 1 ;
      n 3, p 2 ;
      n 6, p 3 ;
      n 10 , p 4 ;
      n 15 , p 5 ;
      n 21 , p 6;
      n 28 , p 7;

      si c'est bon pour le cas de "p++"
      while(n<=8){
      n+=p++}
      

      explique moi s'il te plaît
    3. @domxalineoui c'est bon, tu as compris, mais tu as oublié une chose : la boucle s'arrette avant d'arriver aussi loin.

      Sinon pour le cas où c'est n+=p++

      c'est la même chose, sauf un point important : d'abord on incrémente n de la valeur actuelle de p, et ensuite on incrémente p (l'ordre inverse de ce qu'on a fait avant).

      C'est ce que signifie le fait de mettre " p++ " au lieu de "++p" dans le code.
    4. @domxalineregarde, s'il te plait pour le code
      while(n<=8){
      n+=p++}
      


      n 0, p 0 ;
      n 1, p 0 ;
      n 2, p 1 ;
      n 4, p 2 ;
      n 7 , p 3 ;
      n 11 , p 4 ;
    5. @domxalinemmm pas tout à fait.

      attention, n est augmenté de la valeur de p. Donc :

      au départ :

      n=0, p=0 (comme tu as dit)

      et ensuite au premier passage de la boucle on fait
      n = n + p
      puis
      p=p+1

      donc ça donne quoi ?
  8. Pacorabanix aide moi s'il te plaît
    1. je t'ai aidé en te montrant la méthode. Maintenant c'est à toi d'essayer de comprendre la méthode, apprendre à lire un code, à le décortiquer, et à essayer de le faire "fonctionner" sur une feuille de papier avec un crayon et une gomme.

      si tu n'essayes rien, je laisse à quelqu'un d'autre le soin de t'aider.
  9.                 int n,p,i;
    		n=p=0;
    		while(n<5) 
    		{	
    		  n+=2;
    		  System.out.println("increment n= " + n);
    		  //System.out.println("increment p= " + p);
    		}
    		  p++;
    		  System.out.println("increment p= " + p);
    		  //System.out.println("increment p= " + p);
                    

    resultat est
    increment n= 2
    increment n= 4
    increment n= 6
    increment p= 1

    on va bien le passage de n 2 et 4
    mais pour passage de p,il va au direct 1
    pour voir le passage de p,que je dois faire?
    1. Ok,

      n=p=0;
      while(n<5) n+=2;p++;


      n va avoir la valeur 0 (avant la boucle), puis 2, puis 4, puis 6.
      Et après p sera incrémenté de 1 (une seule fois), exactement comme tu as dit! Car l'instruction "p++" est hors de la boucle, et n'est donc exécutée qu'un seule fois

      Ensuite je ne comprends pas trop ta question "pour voir le passage de p,que je dois faire?"

      La suite du code c'est :

      while(n<5)
      {n+=2;p++};

      est-ce que cette boucle va être exécutée ?
    2. @Pacorabanix
      while(n<5)
      {
      n+=2;
      p++;
      }
      


      increment n= 2 increment p= 1
      increment n= 4 increment p= 2
      increment n= 6 increment p= 3

      n inferieur 5 est 4 donc 4+2=6 ;n=6
      p est =2 donc 2+1=3 ;p=3
  10. Salut,

    C'est un gag ou quoi (ou une mauvaise plaisanterie) ?

    Dis nous ce que tu penses des accolades présentes ici:

           while(n<5) 
           {	
           n+=2;
           System.out.println("increment n= " + n);
           //System.out.println("increment p= " + p);
           }
    

    Et où est faite l'incrémentation p++

    Dan