Boucle incrementation ou decrementation [Résolu]

Signaler
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017
-
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
-
bonsoir,

je voulais calculer la somme de de 1/n avec n entrer au clavier,

j'ai fait deux programme avec la boucle while pour calculer la somme,
le premier calcule la somme avec une incrémentation et le deuxième avec une décrémentation.

En variant le n de 100 jusqu'au 100000000

les deux programme affiche le résultat

mais en entrant un n = un Milliard par exemple

j'ai trouvé que la boucle avec décrémentation affiche le résultat
mais l'autre programme avec incrémentation reste bloqué et n'affiche rien

je veux savoir qu'elle est la différence entre l'incrémentation et la décrémentation dans ce cas la ?

est ce que la décrémentation est plus performante en cas d'un n très grand.


Merci beaucoup

8 réponses

Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
118
Bonjour,

Pour t'aider ce serait bien de voir ton code.

A priori il y a pas trop de différences entre incrémentation ou décrémentation, à part que si tu dépasses la valeur maximale du type l'incrémentation va te donner un nombre négatif qui respectera encore l'inégalité de la boucle.
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
Bonjour.

Il n'y a pas de différence entre une boucle incrémentale et décrémentale, si elles expriment la même chose. Au pire, sur de (très) vieux compilateurs on pouvait avoir une différence de performance entre "++i" et "i++", mais on parle alors d'incrémentation préfixe et suffixe.

Pour le "i + 0.0", on préfère certes utiliser un cast. Mais dans le cas évoqué, on peut aussi s'en passer tout en gardant un code élégant en faisant: "1.0 / i" tout simplement.

#include <stdio.h>

int main()
{
  int max = 0;
  int i = 0;
  double inc_sum = 0;
  double dec_sum = 0;

  printf("Veuillez entre le nombre max pour calculer la somme: ");
  scanf("%d", &max);

  for (i = 1; i <= max; ++i)
    inc_sum += 1.0 / i;
  for (i = max; i >= 1; --i)
    dec_sum += 1.0 / i;

  printf("La somme (incrémentation) = 1+..+1/%d = %lf\n", max, inc_sum);
  printf("La somme (décrémentation) = 1+..+1/%d = %lf\n", max, dec_sum);

  return 0;
}


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017

Merci pour votre réponse
je m'excuse voila mon code :

#include <stdio.h>

int main()
{
int Max = 1;
int i=1;
double somme = 0;


printf("- Veuillez entre le nombre Max pour calculer la Somme :\n");

scanf("%d",&Max);

while(i<=Max)
{

somme = somme + (1/(i+0.0));
// +0.0 pour eviter la division entier
i++;

}

printf(" La Somme = 1+..+1/%d = %lf\n",Max, somme);


return 0;

}


et pour décrémentation même chose sauf la boucle change :


while(i>=1)
{

somme = somme + (1/(i+0.0));
i--;

}


pour Max = 1000000000 la premier boucle reste bloquée
et la deuxième affiche rapidement le résultat

Merci encore
Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
118
Normalement pour 1 milliard il ne devrait pas y avoir de problème, le type int peut aller jusqu'à 2.1 milliards. Ou alors tu as un très vieux pc en 16 bits...

Tu pourrais vérifier la limite des int en l'affichant :

#include "limits.h"
...
printf("%d\n", INT_MAX);

Une manière de se prémunir de ce genre d'erreur est de faire
while(i<=Max && i>0)
comme ça si tu bascules dans les négatifs la boucle s'arrêtera.

Remarque :
i+0.0
c'est particulièrement moche ! Un cast
(double) i
ce serait tellement mieux.
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017

Merci beaucoup, tu as tout a fait raison
c'est bon je vais rectifier ce que vous m'avez dit,


bon je voulais poser cette question car l'exercice que je doit faire, dit qu'il faut calculer cette somme en faisant varier le Max de 100, 1000, jusqu'à 1000000000
en partant de 1 a Max de de Max a 1 et dire quel calcule est bon et le meilleur,

pour moi j'ai trouvé que de max a 1 trouve le résultat plus rapidement.
je me suis dit est ce que la décrémentation est plus rapide ?
Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
118
Pour moi il n'y a pas de raison que la décrémentation soit plus rapide que l'incrémentation (j'en vois bien une quand même mais ce serait imperceptible).
Si un calcul est vraiment plus long que l'autre c'est qu'à mon avis tu calcules pas la même chose, il faudrait comparer les résultats.
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017

oui tu as tout a fait raison, je vois clairement que le résultat n'est pas le même, et je vois que pour la décrémentation le résultat est 1.000000, comme si il ne fait qu'une seule itération.

donc j'ai un problème dans la boucle de décrémentation
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017

c'est bon j'ai remplacer par une boucle for, les deux boucle ont le même résultat et même duree de réponse, donc je pense que la question posée par l'exercice n'est pas utile ou elle n'est pas claire. ???

Merci beaucoup KX, vous me sauvez comme toujours.
Bonne soirée