Itération manquante

Signaler
Messages postés
7
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
28 janvier 2012
-
Messages postés
16726
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
-
Bonsoir,

J'ai un code qui ne fonctionne pas comme j'ai envie, et je ne trouve pas du tout ou sa plante..
Le programme devrait afficher (si l’utilisateur rentre 3):
a
b
c
...
x
y
z
aa
ab
ac
...
zx
zy
zz
aaa
aab
aac
...
zzx
zzy
zzz

Mais chez moi, il affiche:
The user selected as length 3, your program displays
a
b
c
...
x
y
z
aa
ab
ac
...
yx
yy
yz
aaa
aab
aac
...
yyx
yyy
yyz

Voici le code source:
string charMap = "abcdefghijklmnopqrstuvwxyz";
string strSaisie;
int nbChar ;
int l = 0;
int i = 0;
int x = 0;
int y = 0;

Console.Write("Nomdre de caractère pour la recursion: ");
strSaisie = Console.ReadLine();
nbChar = int.Parse(strSaisie);

char[] buffer = new char [nbChar];
int[] nChar = new int [nbChar];

while(l < nbChar)
{
for(i=0; i<=l; i++)
{
buffer[i] = charMap[0];
nChar[i] = 0 ;
}

while(nChar[0]!=25)
{
for(x=0;x<=25;x++)
{
buffer[l]=charMap[x];
nChar[l]=x;
String ch = new String(buffer);
Console.WriteLine(ch);
}
for(y=l;y>=0;y--)
{
if(nChar[y]==25&&nChar[0]!=25)
{
nChar[y]=0;
nChar[y-1]++;
}
buffer[y] = charMap[nChar[y]];
}
}

l++;


Merci d'avance

12 réponses

Messages postés
16726
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
583
Bonjour

au tout premier passage dans la boucle
		for(i=0; i<=l; i++)
{
buffer[i] = charMap[0];
nChar[i] = 0 ;
}


l vaut 0, donc tu ne fais qu'une itération et buffer[i] = buffer[0] = a.

Ensuite tu passes dans cette boucle
			for(x=0;x<=25;x++)
{
buffer[l]=charMap[x];
nChar[l]=x;
String ch = new String(buffer);
Console.WriteLine(ch);
}


l vaut toujours 0, donc buffer[l] = buffer[0] = a.
donc ch vaut "a\0\0" et forcement ça t'affiche a.

Je ne suis pas allé plus loin dans l'étude de ton code.

Whismeril
Messages postés
7
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
28 janvier 2012

Merci,

J'ai essayé de changer les valeurs d'initialistions des variables l i x y pour voir si qqch changait, mais non..

Pour ce qui vont compiler ce programme, vous verrez qu'il manque qqch car il devrait se finir par

zzz

et il se finit par

yyz

(si l'utilisateur rentre 3 par ex.) Et je ne sais pas comment changer sa!
Messages postés
16726
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
583
Qu'as tu mis comme valeur?


Whismeril
Messages postés
7
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
28 janvier 2012

J'ai mis 1, faudrait-il que je mette plus? Car sa n'a rien changer, sauf quand j'ai mis un a l, le programme n'a rien afficher..
Messages postés
16726
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
583
As ru remarqué que ça passe de yz à aaa?
J'ai donc mis saisi 2 au nombre de caractère et ça stoppe bien à yz.

je te propose d'ajouter
                        if (ch.StartsWith("yz"))
                        { string toto = "a"; }//mettre un point d'arrêt ici


juste en dessus de
				String ch = new String(buffer);
Console.WriteLine(ch);


tu mets le pointa d'arrêt ou je te l'ai signalé.

Tu saisies 3 au nombre de caractères, ça va s'arrêter sur ma ligne (qui ne sert qu'à ça!) et ensuite tu exécutes en pas à pas pour voir ce qui ce passe, regarde bien les valeurs de chaque variable avant de passer à la ligne suivante.

Tu peux remettrais toutes les valeurs à 0, je n'avais pas bien compris ton problème au début.


Whismeril
Messages postés
7
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
28 janvier 2012

Un point d'arret? Qu'est ?
Et comment je peux voir les valeurs des variables en l'éxécutant pas à pas ?

Merci

Holaf
Messages postés
7
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
28 janvier 2012

J'ai trouvé comment voir les valeurs en pas à pas, mais le point d'arret... Un : Console.ReadLine(); irait?
Messages postés
7
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
28 janvier 2012

En pas à pas, il s'arrête à:
nbChar = int.Parse(strSaisie);

en me disant: L’exception FormatException n'a pas été gérée
Le format de la chaîne d'entrée est incorrect.
Messages postés
7
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
28 janvier 2012

Bon, j'ai fait Nettoyer la solution, donc c'est bon.. J'ai fait un pas à pas. Je n'ai quand même pas trouver pourquoi et ou sa plante...
Messages postés
16726
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
583
Le point d'arrêt est un outil de débugage.

Sous visual studio:
Tu appuies sur F9, là ou tu veux que l'exécution s'arrête. (ça devient marron)
Tu exécutes ton code avec la flèche verte ou F5 (pas ctrl F5).

Quand ça s'arrête, tu appuies sur F10 pour passer de ligne en ligne (F11 si tu appelles une méthode et que tu veux aussi passer cette méthode pas à pas).

Pour contrôler le contenu de tes variables, soit tu places la souris dessus et tu attends l'info bulle.
Sinon, en bas (par défaut) sous le code, dans la fenêtre ou apparaissent les erreurs de compilation tu as un onglet "variables locales", qui te permet d'étudier toutes les variables déclarées dans le bloc en cours.
Dernière solution, tu sélectionnes une variable ou une expression (par exemple a*b/c ne fonctionne pas tu peux choisir b/c) est tu fais click droit "ajouter un espion". Celui ci s'affichera dans un 3eme onglet de la fenêtre de variables locales.


Whismeril
Messages postés
16726
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
583
Bonjour,

as tu trouvé?

si non c'est ta boucle
while(nChar[0]!=25) {.....}
qui ne va pas.
En gros tu luis dis "si ça va commencer par z alors arrête toi".

A mon sens tu as deux types de solutions:
-tu calcules le nombre d'itérations 1 lettre : 26, 2 lettres 26 au carré, donc dans ton cas 1 lettre puis 2 = 26 + 26 au carré etc... et tu fais un for(...)
- tu fais un Do{....} While() et dans ta clause while tu testes que ch ne soit pas composé que de z, pour ça tu peux créer une variable de type string que que compose en contenant des z autant que tu à de lettres.


Whismeril
Messages postés
16726
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
583
Ha j'ai oublié ensuite pour décaler tes caractères dans ton buffer, ça coince aussi.


if(nChar[y]==25&&nChar[0]!=25)


à "zaz" il ne se passera rien.


Whismeril