Problem en java
kylleyoub
Messages postés
14
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
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
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:
- Problem en java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
10 réponses
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 ;)
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 ;)
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 :-()
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 :-()
Exemple de code dont tu peux t'inspirer :
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
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
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:
Cordialement,
Dan
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
merci bp danimo je n'arrive po comprendre votre programme il est un peu compliq pr moi mai il sa march bien. merci encore
Salut,
En fait il y a 2 programmes dans un.
Le premier (class SequenceCaracteres1) en fait le tien modifié:
Et le second (class SequenceCaracteres2) en utilisant REGEX:
Cordialement,
Dan
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