Boucle incrementation ou decrementation

Résolu
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017 - 28 oct. 2014 à 23:10
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 29 oct. 2014 à 11:38
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

KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023 126
28 oct. 2014 à 23:26
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.
1
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
29 oct. 2014 à 11:38
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
1
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
28 oct. 2014 à 23:31
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
0
KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023 126
28 oct. 2014 à 23:41
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
28 oct. 2014 à 23:52
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 ?
0
KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023 126
Modifié par KX le 28/10/2014 à 23:57
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.
0
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
29 oct. 2014 à 00:24
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
0
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
29 oct. 2014 à 00:29
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
0
Rejoignez-nous