Bonjour,
Je viens de débuter en C#, et je rencontre un problème avec l’ utilisation du For, comment l’utiliser pour faire répéter une séquence voulu, et ressortir ces séquences , a quoi correspondent les “i” ?
Par exemple je dois réaliser un programme permettant d’ afficher tout les diviseurs d’ un nombre saisie, voilà ce que j’ ai réalisé :
L’ erreur vient certainement de la boucle For, mais d’ ou ? Visual studio ne me renvoi pas d’ erreur, mais pourtant cela ne fonctionne pas
Si jamais vous avez un tutoriel clair pour débutant, je suis preneur !
Le problème ne vient pas des accolades, mais surement de ma syntaxe, en effet le programe ne me ressort tjrs 0, alors qu’il devrai plutôt me ressortir la liste des diviseurs …
Pour les i, que signifie le “i++”, je n’ ai utiliser que celui ci pour l’ instant et ca a marché, mais y’ en a t-il d’ autres ?
Le problème vient surement du S, est-ce tjrs le même type de syntaxe S=S+*/-X … ? Et comment ressortir tous les résultat qu’ il peut faire ?
public static int division (int nbr) {
if (nbr == 0) return 0;
int S = 0;
for (int i = 1; i < nbr; ++i) {
S = S % i; // ou S %= i;
}
return S;
}
En somme :
inutile de faire if (nbr != 0) à chaque fois si nbr ne change pas, donc je le fais au début
i est déclarée dans le for, puisqu’il ne sert que là
for (int i = 1; i < nbr; ++i) => soit i = 0; tant que i < nbr, effectue S = S % i puis, incrémente i.
++i = incrémente i puis retourne la valeur incrémentée, si i = 0, alors ++i = 1;
i++ = incrémente i puis retourne la valeur avant incrémentation, si i = 0, alors i++ = 0
Si ça ne fait rien c’est peut-être que ton algo est faux, tout simplement
Merci pour l’ information concernant le i++ et ++i, mais j’ ai essayer ta fonction, mais tjrs le même problème, il me répond 0, quelque soit la valeur que je rentre, je ne comprend vraiment pas pourquoi il ne veut pas sortir ces diviseurs …
Ca me parait normal. Tu initialises S à 0, tu fais des modulos sur S (qui renvoient donc à chaque fois 0), puis tu renvoies S. Comment veux-tu avoir autre chose que 0 ?
Il est censé faire quoi ton algo ?
Edit : je viens de lire dans ton premier post. Et pour l’instant tu es completement à côté de la plaque, ton algo est faux.
Commence par écrire sur papier, étape par étape, ce que doit faire ton algo. On t’aidera ensuite à le coder si tu n’y parviens pas.
Edité le 04/11/2008 à 13:12
En gros tu fais l’algo de division de base? qui est le même que pour détecter les nombres premiers? (soit tester les n diviseurs sur p tel que n < sqrt§).
L’ algo que j’ avais fait, est le même que le programme.
J’ ai donc essayé ça après réflexion :
Pour moi, pour trouver tout les diviseurs, il faut faire :
S=nbr/1
S=nbr/2
S=nbr/3
Ainsi de suite, et les diviseurs étant OK, si S a pour reste 0.
Après réflexion,j’ avais pensez faire :
S=nbr/i (avec i<=nbr), je n’ obient plus 0 comme resultat a S, mais 1 …
1 étant surement le premier diviseur qu’ il a trouver …
Merci pour votre aide !
Si n % 2 == 0 Return 2; // diviseur = 2 (2, 4, 6, 8, 10, etc)
Pour d = 3 jusqu'à arrondi inf(racine carrée(n)) Alors
Si n % d == 0 Return d;
Return n; // n divise toujours n.
Pour la racine carrée, je n’ai plus l’explication exacte, même Wikipedia n’en parle pas :
Sinon, il y a un second problème dans ton algo. Tu veux la liste des diviseurs, mais ta fonction renvoie un “int”, donc un seul nombre. Il faut plutôt que tu renvoies une liste de nombres. Donc quelque chose du genre :
public static List<int> division (int nbr)
{
// On initialise une liste qui stockera des int
List<int> diviseurs = new List<int>();
int s = 0;
for (int i = 1; i<=nbr; i++)
{
// Ton code de vérification
// Chic, j'ai trouvé un diviseur ! Je l'ajoute à la liste
diviseurs.Add(s);
}
// Plus qu'à renvoyer la liste
return diviseurs
}
Voilà ce que j’ ai traduit de l’ algo, mais sa ne fonctionne tjrs pas Il me retourne 2, quand le nombre est pair, et 0 si il est impair…
Je ne comprends pas la fonction avec la liste, je ne l’ ai encore jamais vu, ou mettre le diviseurs.Add(s) ? Apres le for ?
Voilà ou j’ en suis dans le code pour l’ instant :
for (i = 1; i <= (Math.Sqrt(nbr)); i++)
{
S = nbr % i;
if (S == 0)
{
diviseurs.Add(i);
}
}
En gros : tu parcours les nombres de 1 à racine de nbr, tu regardes à chaque fois si nbr est divisible par le nombre, et si oui tu l’ajoute à la liste des diviseurs
Edité le 05/11/2008 à 16:51
Merci !
Il y’ a du mieux, mais je n’ ai pas la liste des diviseurs entières, par exemple pour 6, je n’ obtient que 1 et 2, alors qu’ il devrait y avoir 3 normalement ?
Edit : J’ ai réussi, j’ ai enlevé la racine pour i, en mettant : for (i = 1; i <=nbr; i++), et j’ obtient la liste des diviseurs ! Mais il n’ y aurait-il pas eu une solution sans utiliser la Liste ? A l’ énonce de l’ exercice c’ était apparemment possible sans !
Mais en tt cas merci bcp !
Edité le 05/11/2008 à 17:04
Si tu veux juste le nombre de diviseurs, il suffit d’incrémenter une variable à chaque fois que tu en trouves un.
Si tu veux la liste des diviseurs, tu peux à la limite les afficher au fur et à mesure (un Console.WriteLine dans ta boucle for) :neutre:
Edité le 05/11/2008 à 17:21