Un petit morceau manquant !

Fermé
jowpac - 20 oct. 2013 à 22:37
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 20 oct. 2013 à 23:01
Bonjour, je suis un débutant en programmation et j'aurais besoin d'aide dans un contexte particulier ! En fait, j'ai coder un petit programme assez simple qui détermine combien de fois l une chaîne de caractères entrée par L'utilisateur se retrouve dans un seconde chaîne de caractères entrée par l'utilisateur. Après quelques tests, cela fonctionne dans tous les cas sauf dans un seul.

Par exemple si mon premier string est : '' Jonathan joue joliment '' et que le second est '' jo '' ,
le programme affichera : Le 2e string se retrouve 3 fois dans le 1er.

Aussi, si le premier string est '' popopopo '' et que le second est ''po'', le programme affichera ceci : Le 2e string se retrouve 4 fois dans le premier.

Mon programme fonctionne dans tous les cas sauf pour celui-là :

si le premier string est '' po po po po '' et que le second est ''po'', le programme affichera une réponse int complètement mauvaise.

Je ne sais pas pourquoi, j'ai besoin de votre avis, quelle est la dernière pièce du puzzle que je dois ajouter pour que cela fonctionne ?
Merci à vous, :)


Voici le code en :


  public class ChercherLaChaine {

public static void main(String[] args) {
String chaine1 = " ",
chaine2 = " ";
int save = 0 ;
int compteur = 0,
compteur2 = 0,
lon1 = 0,
total = 0,
lon2 = 0;
boolean x = false;



chaine1 = JOptionPane.showInputDialog(null, "Veuillez entrer la première chaîne." ,"Saisie", JOptionPane.INFORMATION_MESSAGE);
chaine2 = JOptionPane.showInputDialog(null, "Veuillez entrer la deuxième chaîne." ,"Saisie", JOptionPane.INFORMATION_MESSAGE);
lon1 = chaine1.length();
lon2 = chaine2.length();

while (lon1 < 4)
{
chaine1 = JOptionPane.showInputDialog(null, "La première chaine doit avoir au minimum 4 caractères." ,"Re Saisir !", JOptionPane.ERROR_MESSAGE);
lon1 = chaine1.length();
}
if (lon1 >= 4 )
{
JOptionPane.showMessageDialog(null, "La chaine#1 " +chaine1 +" est valide");
}



while (lon2 < 1 || lon2 >= lon1 )
{
chaine2 = JOptionPane.showInputDialog(null, "La seconde chaine doit avoir au minimum 1 caractère et doit être plus petite"
+ " que la première chaîne." ,"Re Saisir !", JOptionPane.ERROR_MESSAGE);
lon2 = chaine2.length();

}
if (lon2 > 0 && lon2 < lon1 )
{
JOptionPane.showMessageDialog(null, "La chaine#2 " +chaine2 +" est valide");
}

while (compteur < lon1)
{
save = compteur;

while ( (compteur < lon1) && (chaine1.charAt(compteur)) == chaine2.charAt(compteur2) && (compteur2 < lon2) )
{

x = true;
if (compteur2 == lon2 -1)
{
total ++ ;
compteur ++;
compteur2 = 0;
save = compteur;

}
else
{
compteur ++;
compteur2 ++;
save = compteur;
}

}

if (x == true)
{
if (chaine1.charAt(compteur -1)!= chaine2.charAt(compteur2))
{
compteur =save;
compteur2 = 0;

}
}
else if (chaine1.charAt(compteur) != chaine2.charAt(compteur2))
{
compteur = save;
compteur2 = 0;
}
compteur ++;

}
JOptionPane.showMessageDialog(null, "La Chaîne #1 = " +chaine1 + " \nLa Chaîne #2 = " + chaine2 +" \nLa chaîne #2 se trouve " + total +" fois dans la première.");



}

}



1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 20/10/2013 à 23:03
Personnellement quand je testes "po po po po" avec "po" ça me renvoie bien 4...

Mais c'est très compliqué à lire, tu devrais segmenter ton code pour y voir plus clair, plus c'est simple, plus c'est facile à corriger. En particulier tu devrais différencier la partie interaction avec l'utilisateur, avec la vraie partie du calcul.

Tu aurais donc par exemple des méthodes comme ceci :

/** Vérifies la validité des chaînes de caractères */
public static boolean sontValides(String str1, String str2);

/** Compte le nombre de fois que str2 est dans str1 */
public static int nbOccurence(String str1, String str2);

public static void main(String[] args)
{
String chaine1 = JOptionPane.showInputDialog(null, "Veuillez entrer la première chaîne.", "Saisie", JOptionPane.INFORMATION_MESSAGE);
String chaine2 = JOptionPane.showInputDialog(null, "Veuillez entrer la deuxième chaîne.", "Saisie", JOptionPane.INFORMATION_MESSAGE);

if (sontValides(chaine1, chaine2))
{
int total = nbOccurences(chaine1, chaine2);
JOptionPane.showMessageDialog(null,
"La Chaîne #1 = " + chaine1 + "\n"
+ "La Chaîne #2 = " + chaine2 + "\n"
+ "La chaîne #2 se trouve " + total + " fois dans la première.");
}
}

Cela permettra notamment de mieux tester ton code en faisant des tests les uns à la suite des autres, par exemple comme ceci :

public static void test(String str1, String str2)
{
System.out.println("Chaine 1 : "+str1);
System.out.println("Chaine 2 : "+str2);

if (sontValides(str1,str2))
System.out.println("Valides : "+nbOccurences(str1,str2));
else
System.out.println("Invalides");
}

public static void main(String[] args)
{
test("Jonathan joue joliment","jo");
test("popopopo","po");
test("po po po po","po");
}
1