Problème de boucle en C

Fermé
aze - 28 janv. 2010 à 00:37
 aze - 28 janv. 2010 à 02:09
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

5 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
28 janv. 2010 à 00:58
Voilà un extrait qui explique pourquoi le programme plante:
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.
1
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
28 janv. 2010 à 00:59
héhé, j'allais le dire et tu as posté juste avant moi :)
0
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?
0
J'ai beau me creuser la tête je ne vois pas ou est mon (mes) erreur. Un ptit indice siouplait
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
28 janv. 2010 à 01:56
Entre
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.
0

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é.
0