Forum Clubic

Débutant, Problème d'utilisation du For

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 :confused:
Si jamais vous avez un tutoriel clair pour débutant, je suis preneur !

Merci.

j’ai pas travaillé avec le c#
mais avec le c++ la syntaxe du for :

public static int division (int nbr)
{
int i, S;
S = 0;

for (i = 1;i<=nbr; i++)
  {
       if (nbr != 0)
          S = S % i
      else
          S = 0;
}

return S;
}

je pense que c la meme chose

les i dans la boucle (for) sont des conteurs qui s’incrimente chaque fois avec un 1jusqu’a nbr qui indique la fin de la boucle

J’espère être vous aider un peu!!

Bonne chance

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 ?

Merci.

En gros, ton code réécrit en “plus simple”:

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 :

  1. inutile de faire if (nbr != 0) à chaque fois si nbr ne change pas, donc je le fais au début
  2. i est déclarée dans le for, puisqu’il ne sert que là
  3. 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 :wink:

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 … :confused:

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 ? :slight_smile:

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. :wink:
Edité le 04/11/2008 à 13:12

Pas faux ça :smiley:

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 !

Normalement l’algo de base c’est :

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 :

fr.wikipedia.org…

Si quelqu’un sait, ce serait pas mal :smiley:

C’est logique non ? :icon_biggrin:

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
}


Edité le 05/11/2008 à 13:11

Voilà ce que j’ ai traduit de l’ algo, mais sa ne fonctionne tjrs pas :confused: 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 :

Merci pour votre aide, il faut que j’ y arrive !

Bon je viens d’ essayer de faire sa :

et voila ce qu’ il me retourne :

Si tu veux afficher le nombre de diviseurs dans ta liste, c’est taListe.Count

Donc en l’occurence :

Console.WriteLine(diviseurs.Count);

Si tu veux afficher la liste des diviseurs, il faut parcourir ta liste. Donc quelque chose du genre :


foreach (int diviseur in diviseurs)
{
Console.WriteLine(diviseur);
}

Voila ma procédure d’ affichage :

Je saisit mon nombre mais rien ne s’ affiche …
Et avec count, im ’ affiche 1 si impair, et 0 si chiffre pair …
Je vois plus ce qu’ il fait faire :confused:

Si tu reprends ça :


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 :slight_smile:
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

Effectivement, ce n’est pas normal. Reposte ton code en entier pour voir ? :slight_smile:

Je viens d’ édité mon post :wink:

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