Problème de boucle en C
aze
-
aze -
aze -
Bonjour,
Je dois faire un programme en C, en commençant par initialiser un vecteur de 1000 éléments à l'aide d'une boucle, je dois ensuite mettre tout les éléments du vecteur qui ne sont pas des nombres premier à 0, et ensuite n'afficher que les nombres premier.
le code que j'ai écrit passe la compilation sans erreur, mais plante a l'exécution. Je soupçonne la double boucle imbriqué d'en être responsable.
Pourriez vous jeter un œil a mon code et me dire ce qui ne va pas.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int tab[1000];
int i=0;
int j=0;
int max=1000;
int n=0;
while (i<max)
{
tab[i]=i+1;
i++;
}
i=2;
j=2;
while (i<500)
{
while (j<500)
{
n=i*j;
tab[n]=0;
j++;
}
i++;
j=2;
}
i=1;
while (i<max)
{
if (tab[i] != 0)
{
printf("%d\n",tab[i]);
i++;
}
else
{
i++;
}
}
return 0;
}
Merci beaucoup
Je dois faire un programme en C, en commençant par initialiser un vecteur de 1000 éléments à l'aide d'une boucle, je dois ensuite mettre tout les éléments du vecteur qui ne sont pas des nombres premier à 0, et ensuite n'afficher que les nombres premier.
le code que j'ai écrit passe la compilation sans erreur, mais plante a l'exécution. Je soupçonne la double boucle imbriqué d'en être responsable.
Pourriez vous jeter un œil a mon code et me dire ce qui ne va pas.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int tab[1000];
int i=0;
int j=0;
int max=1000;
int n=0;
while (i<max)
{
tab[i]=i+1;
i++;
}
i=2;
j=2;
while (i<500)
{
while (j<500)
{
n=i*j;
tab[n]=0;
j++;
}
i++;
j=2;
}
i=1;
while (i<max)
{
if (tab[i] != 0)
{
printf("%d\n",tab[i]);
i++;
}
else
{
i++;
}
}
return 0;
}
Merci beaucoup
A voir également:
- Problème de boucle en C
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Vlc lire en boucle ✓ - Forum Lecteurs et supports vidéo
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
- Pc qui s'allume et s'éteint en boucle - Forum Virus
5 réponses
Voilà un extrait qui explique pourquoi le programme plante:
Une bonne méthode, en fait celle de Pacorabanix: prendre un papier et un crayon et faire tourner le programme à la main.
Bonne réflexion.
int tab[1000]; while (i<500) while (j<500) tab[i*j] = 0; j++; i++;Si vraiment tu ne trouves pas... on t'aidera un peu plus.
Une bonne méthode, en fait celle de Pacorabanix: prendre un papier et un crayon et faire tourner le programme à la main.
Bonne réflexion.
Pacorabanix
Messages postés
3248
Date d'inscription
Statut
Membre
Dernière intervention
663
héhé, j'allais le dire et tu as posté juste avant moi :)
Tout d'abord, merci a vous de vous penchez sur mon problème.
je répond peut être un peu vite, mais je pense que si je l'avais écrit comme dans ton extrait (tab[i*j] = 0;) je finirais vite vite par boucler sur des multiplications comprenant un 0 donc je ne pourrait plus parcourir le tableau.
désolé si je ne suis pas très clair. Je dois avoué que je commence a fatiguer, mais je ne dormirais pas avant de comprendre ce qui ne va pas.
je précise que j'ai bien fait mon organigramme avant de me lancer.
de plus je viens de penser que je boucle jusqu'à 500, si je boucle jusqu'à 32 (un peu plus de la racine carré) ca devrais suffir non?
je répond peut être un peu vite, mais je pense que si je l'avais écrit comme dans ton extrait (tab[i*j] = 0;) je finirais vite vite par boucler sur des multiplications comprenant un 0 donc je ne pourrait plus parcourir le tableau.
désolé si je ne suis pas très clair. Je dois avoué que je commence a fatiguer, mais je ne dormirais pas avant de comprendre ce qui ne va pas.
je précise que j'ai bien fait mon organigramme avant de me lancer.
de plus je viens de penser que je boucle jusqu'à 500, si je boucle jusqu'à 32 (un peu plus de la racine carré) ca devrais suffir non?
Entre
Le problème n'est pas là.
je précise que j'ai bien fait mon organigramme avant de me lancer.
C'est très bien , mais le papier et le crayon dont je parlais, étaient destinés à faire 'tourner' le programme, par exemple:
Bonne continuation.
n = i*j; tab[n] = 0;et
tab[i*j] = 0;il n'y a aucune différence sauf que l'on déclare un variable supplémentaire (qui est d'ailleurs d'aucune utilité).
Le problème n'est pas là.
je précise que j'ai bien fait mon organigramme avant de me lancer.
C'est très bien , mais le papier et le crayon dont je parlais, étaient destinés à faire 'tourner' le programme, par exemple:
i = 2 j = 2 i*j = 4 tab[4] = 0 i = 2 j = 3 i*j = 6 tab[6] = 0 i = 2 j = 4 i*j = 8 tab[8] = 0 ... i = 2 j = 498 i*j = 996 tab[996] = 0 i = 2 j = 499 i*j = 998 tab[998] = 0 i = 2 j = 500 i = 3 j = 2 i = 3 j = 2 i*j = 6 tab[6] = 0 i = 3 j = 3 i*j = 9 tab[9] = 0 ... i=499 j=499 i*j = ???Je te laisse conclure.
Bonne continuation.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
hummm! bin didon. ya des moments comme ca on se sent un peu con. enfin y avait de l'idée dans cette histoire de racine carré, ca marche toujours pas mais ca plante plus (c déjà ca). Merci en tout cas. Je ne le met pas en résolut tout de suite, j' aurait peut être encore besoin de vos lumières pour le terminé.