Bonjour,
Pour un programme j'aurai besoin de faire :
Est ce qu'il existe une façon de faire ça ?Code:for(i=0;i<=1000;if(n=0){i=i+2;}else{i=i+4})
Merci.
Version imprimable
Bonjour,
Pour un programme j'aurai besoin de faire :
Est ce qu'il existe une façon de faire ça ?Code:for(i=0;i<=1000;if(n=0){i=i+2;}else{i=i+4})
Merci.
Salut !
Pourquoi ne pas utiliser une boucle while ?
Code:
1
2
3
4
5 int i=0; while(i<1001) { if (n==0) i+=2; else i+=4; }
Si tu tiens au for :
Code:for(i=0; i<=1000; i=i+2+2*(n!=0))
En utilisant les ternaires
Les ternaires permettent de construire une condition if+else en une seule instructionCode:for(i=0 ; i<=1000 ; (n==0) ? i+=2 : i+=4)
un exemple simple des ternaire :
Code:(age>=18) ? printf("majeur") : printf("mineur");
Ok, merci pour vos réponses, elles sont toutes très bien, par contre mon but est de faire le programme le plus rapide possible, d'après vous quelle est la solution la plus rapide ?
Merci.
Je dirais "aucune".
La boucle reste la même. Dans tous les cas, il y a un test ; il ne s'écrit juste pas de la même manière. Celle de CGi est peut-être un poil plus lente : il y a une multiplication.
La seule façon de vérifier est de comparer l'assembleur généré.
Il n' y a pas de grande différence entre la vitesse d'exécution d'un while et celle d'un for, ou alors cette différence est légère. Après, tout dépend sur quel genre de processeur tu travailles, mais en général ce n'est pas la principale source de ralentissement d'un programme.Citation:
d'après vous quelle est la solution la plus rapide ?
Si tu code en c tu peut facilement évaluer la vitesse d’exécution en ms avec time.h
exemple:
Code:
1
2
3
4
5
6
7
8
9 clock_t debut=clock(); //bloque d'instructions dont tu veux évaluer le temps d'execution clock_t fin=clock(); //on affiche la différence entre début et fin en s (ex: 1.33) printf("%f", (float)(fin-debut)/1000);
D'où le "un poil" :mouarf:
Clairement, le choix parmi les boucles proposées n'aura quasiment aucune influence sur les performances.
for est souvent utilisé pour des parcours "pas à pas".
Donc dans ce cas là, je recommanderais l'utilisation d'une boucle while pour améliorer la lisibilité du code.
Je me méfierais de cette méthode :
- les résultats dépendent beaucoup de ce qui s'exécute sur l'ordinateur ;
- il vaut mieux mettre le bloc d'instruction dans une boucle pour limiter la marge d'erreur.
Dans un petit code comme celui-ci, il vaut mieux regarder le code assembleur généré.
Question bête d'ou viens le n?
A priori, s'il ne change pas dans la boucle autant le sortir du calcul avec une solution du genre
Code:
1
2
3
4 int step = ( n == 0 ? 2 : 4); int i = 0; while ( i < 1001) { i += step; }
L'idée pour être plus précis est de faire des calculs sur les nombres premiers, sachant que les nombres premiers finissent toujours pas 1,3,7 ou 9 je voulais faire des sauts de valeurs différentes pour éviter de faire des calculs sur des nombres dont on sait qu'ils ne sont pas premiers,
donc les saut dans la boucle sont +2, +4, +2, +2.
ça permet d'éviter des milliards de calculs quand on arrive à des nombres de plusieurs milliards.
Quand je fais ça j'ai l'erreur suivante :Code:
1
2 for(f=11 ; f<=1000 ; (g==2) ? f+=4 : f+=2) {...}
lvalue required as left operande of assignment
Mets des parenthèses :
Code:for(f=11 ; f<=1000 ; (g==2) ? (f+=4) : (f+=2))
Ok merci à tous, j'ai réussi à faire ce que je voulais.