Boucle incrementation ou decrementation [Résolu]

omidaoui 32 Messages postés dimanche 11 novembre 2012Date d'inscription 2 décembre 2017 Dernière intervention - 28 oct. 2014 à 23:10 - Dernière réponse : cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
KX 15561 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 23 juin 2018 Dernière intervention - 28 oct. 2014 à 23:26
1
Merci
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.

Merci KX 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 120 internautes ce mois-ci

Commenter la réponse de KX
omidaoui 32 Messages postés dimanche 11 novembre 2012Date d'inscription 2 décembre 2017 Dernière intervention - 28 oct. 2014 à 23:31
0
Merci
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
Commenter la réponse de omidaoui
KX 15561 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 23 juin 2018 Dernière intervention - 28 oct. 2014 à 23:41
0
Merci
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.
Commenter la réponse de KX
omidaoui 32 Messages postés dimanche 11 novembre 2012Date d'inscription 2 décembre 2017 Dernière intervention - 28 oct. 2014 à 23:52
0
Merci
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 ?
Commenter la réponse de omidaoui
KX 15561 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 23 juin 2018 Dernière intervention - Modifié par KX le 28/10/2014 à 23:57
0
Merci
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.
Commenter la réponse de KX
omidaoui 32 Messages postés dimanche 11 novembre 2012Date d'inscription 2 décembre 2017 Dernière intervention - 29 oct. 2014 à 00:24
0
Merci
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
Commenter la réponse de omidaoui
omidaoui 32 Messages postés dimanche 11 novembre 2012Date d'inscription 2 décembre 2017 Dernière intervention - 29 oct. 2014 à 00:29
0
Merci
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
Commenter la réponse de omidaoui
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention - 29 oct. 2014 à 11:38
0
Merci
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
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.