Problem en java

Fermé
kylleyoub Messages postés 14 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 15 septembre 2012 - 4 févr. 2010 à 00:36
 Utilisateur anonyme - 5 févr. 2010 à 03:41
Bonjour,t le monde
j'ai un problem, je n'arrive pas à résoudre mon souci.jai besoin d'aide svp
Exercice 1
Ecrire un algorithme qui affiche le nombre de mots dans une séquence de caractères représentée dans un fichier ne contenant que des lettres ou des espaces, et éventuellement vide, puis affiche le nombre de mots terminant par un 's'.
Exemple :
fichier qui sont ces serpents qui sifflent sur nos têtes
résultats le fichier comporte 9 mots
le fichier comporte 4 mots se terminant par un 's'
mon programme est:
import java.util.Scanner;
public class séquence_caractères {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
int cent=0,j=0;

System.out.println("saisir la phrase");
String p=s.next();
for(int i=0;i<p.length();i++){
if(p.substring(i,1)==" "){
int f=i+1;
if(p.substring(f,1)!=" "){
cent+=1;
}
}
}
for(int i=0;i<p.length();i++){
if(p.substring(i,2)=="s "){
j+=1;
}
}
System.out.println("le fichier comporte "+cent+"mots");
System.out.println("le fichier comporte"+j+"mots se terminant par un 's'");
}

}
il affiche toujours:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at séquence_caractères.main(séquence_caractères.java:15)
merci d'avance
A voir également:

10 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
4 févr. 2010 à 01:08
une chaine est un peu comme un tableau.
avec ton p.substring(i,2), tu regardes deux cases du "tableau" p : la ième et la i+1 ème (puisque tu regardes deux cases)

ceci risquera de causer une erreur plus tard.

Mais cela n'est pas la cause de l'erreur dont tu parles, puisqu'elle est détectée en ligne 15.

Je pense que le problème est que tu compares des chaines à l'aide de " == ", ce n'est pas comme ça qu'il faut faire avec les chaines... c.f. ton cours ;)
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
4 févr. 2010 à 03:07
Hello,

Comme solution je te conseille de:

- Lire la chaîne entrée au clavier.
- Afficher cette chaîne pour valider qu'on l'a bien enregistré
- Utiliser la fonction split, qui te permet de découper une chaine de caractères via un séparateur, en un tableau de chaine, le séparateur étant ici l'espace
- utiliser de fait la fonction tableau.length pour connaître le nombre de mot de ta phrase
- faire une boucle à partir de ce tableau de chaînes et utilisation de la fonction "endsWith" pour savoir si le mot se termine par un S ou non.

J'essaie de te faire un exemple :-()
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
4 févr. 2010 à 03:15
Exemple de code dont tu peux t'inspirer :

public class pipo
{
	String chaine="Il fait beau today nest ce pas hein";
	String[] splited;
	int compteur=0;
	
	public pipo()
	{
		splited=chaine.split(" ");
		System.out.println("Nombre de mot de la chaîne : "+splited.length);
		
		for(int i=0;i<splited.length;i++)
			if(splited[i].endsWith("s"))
				compteur++;
		System.out.println("Nombre de mot se terminant par S dans la chaîne : "+compteur);
	}
	
	public static void main(String[] args)
	{
		new pipo();
	}
}


Et le résultat dans la console:

Nombre de mot de la chaîne : 8
Nombre de mot se terminant par S dans la chaîne : 1
0
Utilisateur anonyme
4 févr. 2010 à 10:36
Salut,

Si tu veux, voici ton code modifié, j'ai ajouté le code pour faire çà en utilisant REGEX et la méthode split de la classe pattern:

   import java.util.Scanner;
   import java.nio.charset.Charset;
   import java.io.*;
   import java.util.regex.Pattern;
   import java.util.regex.Matcher;
    
    public class SequenceCaracteres
   { 
   
   /** 
   * @param args 
   */ 
       public static void main(String[] args)
      {
         Scanner s = new Scanner(System.in); 
         
         int nbreMots = 0, j = 0;
      
         System.out.print("\nsaisir la phrase: "); 
         String p = s.nextLine();
      	
         System.out.println("Vous avez saisi: \"" + p + "\"");
         if(p.length() != 0)
         {
            p = p + " "; // au cas ou un dernier mot se terminant par 's' ne serait pas suivi d'un espace
          
            for(int i = 0; i<p.length(); i++)
            { 
               if(p.substring(i,i+1).equals(" "))
               {
                  nbreMots++;
                  if(i <p.length())
                     i++;
               } 
            }
         
            for(int i = 0; i<p.length()-1; i++)
            { 
               if(p.substring(i,i+2).equals("s "))
               { 
                  j+= 1; 
               } 
            }
            System.out.println("\nla phrase comporte " + nbreMots + " mots"); 
            System.out.println("\nla phrase comporte " + j + " mots se terminant par un 's'");
         }
         else
            System.out.println("\nla phrase est vide!!!");
         
      	
      	//REGEX
      	   // avec la methode split de la classe Pattern:
         if(p.length() != 0)
         {
         	
            nbreMots = 0;
            j = 0;
         	
         // compilation de la regex
            Pattern patern = Pattern.compile(" +"); // le séparateur est un ou plusieurs  espaces (motif " +")
         // éclatement en sous-chaînes
            String[] sousChaine = patern.split(p);
            nbreMots = sousChaine.length; 
            System.out.println("\n\nAvec SPLIT: la phrase comporte aussi " + nbreMots + " mots");
         
            String lesMots = "";
            for(int i = 0; i<sousChaine.length; i++)
            {
               if(sousChaine[i].endsWith("s"))
               { 
                  lesMots+= "-" + sousChaine[i] + "\n";
                  j++;
               }
            } 
            System.out.println("\net la phrase comporte aussi " + j + " mots se terminant par un 's':\n"
               + lesMots);
         
         }
         else
            System.out.println("\n\nAvec SPLIT: la phrase est vide!!!");
         
         // On peut aussi utiliser la classe StringTockenizer... 
      } 
   }


Cordialement,

Dan
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kylleyoub Messages postés 14 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 15 septembre 2012
5 févr. 2010 à 00:22
merci beaucoup Pacorabanix j'ai compri votre remarque
0
bizire32 Messages postés 36 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 25 mars 2010
5 févr. 2010 à 00:25
mais tuot simplement length-1
0
kylleyoub Messages postés 14 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 15 septembre 2012
5 févr. 2010 à 00:40
merci bp arth jai compri votre programme ,il est simple et court
0
kylleyoub Messages postés 14 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 15 septembre 2012
5 févr. 2010 à 00:49
merci bp danimo je n'arrive po comprendre votre programme il est un peu compliq pr moi mai il sa march bien. merci encore
0
kylleyoub Messages postés 14 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 15 septembre 2012
5 févr. 2010 à 00:51
ui c sa , merci bizire32
0
Utilisateur anonyme
5 févr. 2010 à 03:41
Salut,

En fait il y a 2 programmes dans un.

Le premier (class SequenceCaracteres1) en fait le tien modifié:


    import java.util.Scanner;
    
    public class SequenceCaracteres1
   {
   /** 
   * @param args 
   */ 
       public static void main(String[] args)
      {
         Scanner s = new Scanner(System.in); 
         
         int nbreMots = 0, j = 0; // j'ai remplacé cent par nbreMots qui est plus parlant
      
         System.out.print("\nsaisir la phrase: "); 
         String p = s.nextLine(); // <<<<<<<<<<<<<<<< et non String p = s.next();
         
         System.out.println("Vous avez saisi: \"" + p + "\"");
         // la ligne ci-dessous est ajoutée:
         p = p.trim(); // il ne doit pas y avoir d'espace(s) en début de phrase, trim permet de les supprimer
                       // mais également a la fin de la phrase alors qu'il peut etre nécéssaire:
         // on ajoute donc un espace a la fin de la phrase au cas ou le dernier mot serait un mot terminé
         // par un 's' et qu'il doit etre suivi d'un espace puisqu'en réalité on chechera
         // les mots terminés par 's '.
         p = p + " "; // ajout de l'espace a la fin 
         System.out.println("La phrase qu'on utilsera: \"" + p + "\"");
         
         if(p.length() != 0)
         {
          
            for(int i = 0; i<p.length(); i++)
            { 
               if(p.substring(i,i+1).equals(" ")) // et non if(p.substring(i,1)==" ")
                                                  // avec (i+1) ce qui évite de faire
                                                  // int f=i+1;
               {
                  nbreMots++; 
                  if(i <p.length()) // ce test n'est pas obligatoire mais permet d'éviter un tour de boucle
                  {
                     i++; // pour passer apres l'espace qu'on vient de trouver
                  }
               } 
            }
         
            for(int i = 0; i<p.length()-1; i++) // et non for(int i=0;i<p.length();i++)
            { 
              if(p.substring(i,i+2).equals("s ")) // et non if(p.substring(i,2)=="s ")
               { 
                  j+= 1; // j'ai laissé j, on pouvait utiliser nbreMotS
               } 
            }
            System.out.println("\nla phrase comporte " + nbreMots + " mot(s)"); 
            System.out.println("\nla phrase comporte " + j + " mot(s) se terminant par un 's'");
         }
         else
            System.out.println("\nla phrase est vide!!!");
     } 
   }


Et le second (class SequenceCaracteres2) en utilisant REGEX:

   import java.util.Scanner; 
   import java.util.regex.Pattern;
   import java.util.regex.Matcher;
    
    public class SequenceCaracteres2
   { 
       public static void main(String[] args)
      {
         Scanner s = new Scanner(System.in); 
         
         int nbreMots = 0, j = 0; 
      
         System.out.print("\nsaisir la phrase: "); 
         String p = s.nextLine(); 
         
         System.out.println("Vous avez saisi: \"" + p + "\"");

         p = p.trim();  // la phrase ne doit pas comporter d'espaces au début
         
                  //REGEX
            // avec la methode de la classe Pattern:

         if(p.length() != 0) // phrase non vide
         {
         // compilation de la regex
            Pattern patern = Pattern.compile(" +"); // le séparateur est un ou plusieurs  espaces (motif " +")
         // éclatement en sous-chaînes
            String[] sousChaine = patern.split(p);
            nbreMots = sousChaine.length; 
            System.out.println("\n\nLa phrase comporte " + nbreMots + " mot(s)");
         
            String lesMots = "";
            for(int i = 0; i<sousChaine.length; i++)
            {
               if(sousChaine[i].endsWith("s"))
               { 
                  lesMots+= "-" + sousChaine[i] + "\n";
                  j++;
               }
            } 
            System.out.println("\nLa phrase comporte " + j + " mot(s) se terminant par un 's':\n"
               + lesMots);
         
         }
         else
            System.out.println("\n\nLa phrase est vide!!!");
         
         // On peut aussi utiliser la classe StringTockenizer... 
      } 
   }


Cordialement,

Dan
0