Problème programme ponctuation automatique java
soaleex
Messages postés
10
Date d'inscription
Statut
Membre
Dernière intervention
-
soaleex Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
soaleex Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
Bonjour, je suis amené à écrire sur ce forum car j'ai un problème avec un programme que je veux réaliser: faire la majuscule après le point a la place de l'utilisateur, ce qui me ferait gagner un certain temps quand je serais amené a faire des rédactions pour le lycée.
En gros, mon programme cherche tous les points du texte ainsi que la majuscule du début. La lettre après le point est transformé en majuscule de sorte a ce que par exemple la phrase:
bonjour mon pseudo est soaleex. j'étudie le java.
devienne
Bonjour mon pseudo est soaleex. J'étudie le java.
Mon code marche lorsque qu'il y a seulement 2 phrases mais quand il y en a plus de 2, le programme marche qu'a partir de la dernière ligne comme le montre cette image:

Si la phrase comporte 3 points, il lui faut 4 lignes et a chaque ligne, la méthode que j'ai créé change la lettre après le point par la majuscule, donc sur cette image, la 4ème ligne est le résultat final que j'attends de mon programme or je n'arrive pas a faire retourner seulement la 4ème ligne. C'est peut-etre une erreur d'étourderie que j'ai fait je ne sais pas mais en tout cas, je ne trouve pas comment la régler.
Voici mon code:
Une personne confirmé en java peut elle régler mon problème ?
Dans l'attente de vous lire.
SoAleex
En gros, mon programme cherche tous les points du texte ainsi que la majuscule du début. La lettre après le point est transformé en majuscule de sorte a ce que par exemple la phrase:
bonjour mon pseudo est soaleex. j'étudie le java.
devienne
Bonjour mon pseudo est soaleex. J'étudie le java.
Mon code marche lorsque qu'il y a seulement 2 phrases mais quand il y en a plus de 2, le programme marche qu'a partir de la dernière ligne comme le montre cette image:

Si la phrase comporte 3 points, il lui faut 4 lignes et a chaque ligne, la méthode que j'ai créé change la lettre après le point par la majuscule, donc sur cette image, la 4ème ligne est le résultat final que j'attends de mon programme or je n'arrive pas a faire retourner seulement la 4ème ligne. C'est peut-etre une erreur d'étourderie que j'ai fait je ne sais pas mais en tout cas, je ne trouve pas comment la régler.
Voici mon code:
import java.util.Scanner; public class ponctuationPhrase { public static void main(String[] args) { Scanner sc = new Scanner (System.in); System.out.println(" ---PonctuaKinG---"); int i = 0; String texteUtilisateur; System.out.println("Rentrez votre texte ici:"); texteUtilisateur = sc.nextLine(); ponctuation(texteUtilisateur); } public static void ponctuation (String a) { int k =0; char[] b; char point = '.'; b = a.toCharArray(); int x = a.length(); do { do {k++; } while (b[k] != point); int v = k; String l = Character.toString(b[0]); l =l.toUpperCase(); b[0] = l.charAt(0); String h = Character.toString(b[v+2]); h = h.toUpperCase(); b[v+2] = h.charAt(0); String m = new String(b); System.out.println(m); } while (b[k] != x ); } }
Une personne confirmé en java peut elle régler mon problème ?
Dans l'attente de vous lire.
SoAleex
A voir également:
- Problème programme ponctuation automatique java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Réponse automatique thunderbird - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Logiciel de sauvegarde automatique gratuit - Guide
3 réponses
Bonjour !
Le problème est que, quand tu arrives au point final, tu vas chercher la lettre après or il n'y en a pas d'où le "ArrayOutOfBoundException".
Pour que le programme ne t'affiche que la dernière ligne tu peux retourner le String tout à la fin, il ne sera donc afficher qu'une fois la méthode finie.
Pour empêcher l'exception tu peux faire ça :
Je ne pense pas que ce soit la meilleure manière mais, sans trop toucher à ton code, c'est ce que j'ai trouvé à faire le plus facilement.
Fait attention aussi, si ta phrase ne finit pas par un point ou si la lettre n'est pas à un espace du point, tu vas avoir quelques problèmes !
N'hésite pas si tu as des questions j'ai essayé d'être le plus clair possible.
Le problème est que, quand tu arrives au point final, tu vas chercher la lettre après or il n'y en a pas d'où le "ArrayOutOfBoundException".
Pour que le programme ne t'affiche que la dernière ligne tu peux retourner le String tout à la fin, il ne sera donc afficher qu'une fois la méthode finie.
Pour empêcher l'exception tu peux faire ça :
public class ponctuationPhrase { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println(" ---PonctuaKinG---"); int i = 0; String texteUtilisateur; System.out.println("Rentrez votre texte ici:"); texteUtilisateur = sc.nextLine(); System.out.println(ponctuation(texteUtilisateur)); } public static String ponctuation(String a) { int k = 0; char[] b; char point = '.'; b = a.toCharArray(); int x = a.length(); String m = null; do { do { k++; } while(b[k] != point); int v = k; //On vérifie si on ne va pas chercher une lettre qui n'existe pas ! if(v+2 > a.length()) break; String l = Character.toString(b[0]); l = l.toUpperCase(); b[0] = l.charAt(0); String h = Character.toString(b[v + 2]); h = h.toUpperCase(); b[v + 2] = h.charAt(0); m = new String(b); } while(b[k] != x); return m; } }
Je ne pense pas que ce soit la meilleure manière mais, sans trop toucher à ton code, c'est ce que j'ai trouvé à faire le plus facilement.
Fait attention aussi, si ta phrase ne finit pas par un point ou si la lettre n'est pas à un espace du point, tu vas avoir quelques problèmes !
N'hésite pas si tu as des questions j'ai essayé d'être le plus clair possible.
Merci pour ta réponse mais apparemment avec ton code, il y a une erreur sur la ligne 35 soit la ligne while(b[k] != point); de la méthode ponctuation..
Sinon comment procéderais tu pour faire cette méthode en sachant que je dois prendre en compte après le point d'interrogation et d'exclamation..
Sinon comment procéderais tu pour faire cette méthode en sachant que je dois prendre en compte après le point d'interrogation et d'exclamation..
Bonjour KX, merci pour ta réponse,
j'ai changé mon code en mettant ceci:
Et quand j'essaies par exemple avec la phrase a. b. c. d. e. f., et bien il n'y a que la lettre a et c qui deviennent majuscules..
Saurais tu régler le pb ?
j'ai changé mon code en mettant ceci:
for (; k<x && b[k] != point; k++);
{
do {
k++;
} while(b[k] != point);
int v = k;
String l = Character.toString(b[0]);
l = l.toUpperCase();
b[0] = l.charAt(0);
String h = Character.toString(b[v + 2]);
h = h.toUpperCase();
b[v + 2] = h.charAt(0);
m = new String(b);
}
Et quand j'essaies par exemple avec la phrase a. b. c. d. e. f., et bien il n'y a que la lettre a et c qui deviennent majuscules..
Saurais tu régler le pb ?
Je viens de regarder plus ton code et il y a d'autres erreur.
Ton
Le début donnerait donc :
Par contre après ça devient bizarrement très compliqué, avec des b[v+2], qui vont forcément planter si x<b[v+2], des conversions de String dans tous les sens, etc. Il y a plus simple...
Remarque : il ne faut pas utiliser une seule lettre comme nom de variable. Quand c'est des itérateurs de boucles ça passe (i, j, k), mais pour tout le reste il faut que le nom de la variable ait un sens (parfois reprendre le type de l'objet suffit).
Voici une solution plus simple :
Ton
while (b[k] != x);alors que b[k] est un caractère et x est la taille du tableau... Il faudrait là encore plutôt mettre une boucle qui teste si k<x.
Le début donnerait donc :
public static void ponctuation(String a) { char[] b = a.toCharArray(); for(int k=0, x=b.length; k<x; k++) { for(; k<x && b[k] != '.'; k++);
Par contre après ça devient bizarrement très compliqué, avec des b[v+2], qui vont forcément planter si x<b[v+2], des conversions de String dans tous les sens, etc. Il y a plus simple...
Remarque : il ne faut pas utiliser une seule lettre comme nom de variable. Quand c'est des itérateurs de boucles ça passe (i, j, k), mais pour tout le reste il faut que le nom de la variable ait un sens (parfois reprendre le type de l'objet suffit).
Voici une solution plus simple :
public static String syntaxCorrecter(String txt) { StringBuilder sb = new StringBuilder(); boolean inPhrase = false; for (char c : txt.toCharArray()) { if (inPhrase) { if (c == '.' || c == '!' || c == '?') inPhrase = false; sb.append(c); } else { if (c != ' ') { inPhrase = true; sb.append(Character.toUpperCase(c)); } else { sb.append(c); } } } return sb.toString(); } public static void main(String[] args) { System.out.println(syntaxCorrecter("bonjour ! je m'appelle KX. et vous ?")); }
"je ne connaissais cette méthode miracle "append""
C'est parce que je ne manipules pas des String, mais un StringBuilder.
Avec des String on pourrais faire
C'est pour ça que j'utilise un StringBuilder, peu importe le nombre de fois que j'ajoutes du texte, je n'aurais toujours qu'un seul objet, qui grossira au fur et à mesure.
"si tu connaissais un répertoire si possible en français des méthodes déjà créé par java"
Java est un langage autodocumenté, il y a un outil (la javadoc) qui permet de générer automatiquement un site web à partir du code source Java. Du coup la documentation se trouve très facilement. Pour l'API standard tu auras donc : API Specification, par contre tout est en anglais.
Voici par exemple la documentation de StringBuilder.
"je ne comprends pas notamment comment marche le boolean "inPhrase""
En gros je distingue deux "états" dans une phrase, si je suis "dans la phrase" c'est à dire après une majuscule et avant un point, ou si je ne suis pas dans la phrase, donc entre le point et la première lettre de la phrase suivante. Je commence par inPhrase=false pour traiter la première lettre du texte, qui doit être en majuscule.
"Pourrais tu juste commenter ton code"
J'en profite pour te montrer également comment documenter ton code pour la génération automatique de documentation, il faut juste pour cela rajouter un commentaire qui commence avec deux étoiles
C'est parce que je ne manipules pas des String, mais un StringBuilder.
Avec des String on pourrais faire
str = "bon"; str += "jour";d'où str vaut "bonjour". Cependant il y a un inconvénient de performances avec les String c'est qu'on ne peut pas les modifier, en fait quand je fais str1 += str2; je ne modifies pas str1, mais je crées un nouvel objet indépendant qui est la concaténation des deux. Si on fait une boucle comme c'est le cas ici, tu aurais autant d'objet String que de lettres, ce qui est mauvais pour les performances.
C'est pour ça que j'utilise un StringBuilder, peu importe le nombre de fois que j'ajoutes du texte, je n'aurais toujours qu'un seul objet, qui grossira au fur et à mesure.
"si tu connaissais un répertoire si possible en français des méthodes déjà créé par java"
Java est un langage autodocumenté, il y a un outil (la javadoc) qui permet de générer automatiquement un site web à partir du code source Java. Du coup la documentation se trouve très facilement. Pour l'API standard tu auras donc : API Specification, par contre tout est en anglais.
Voici par exemple la documentation de StringBuilder.
"je ne comprends pas notamment comment marche le boolean "inPhrase""
En gros je distingue deux "états" dans une phrase, si je suis "dans la phrase" c'est à dire après une majuscule et avant un point, ou si je ne suis pas dans la phrase, donc entre le point et la première lettre de la phrase suivante. Je commence par inPhrase=false pour traiter la première lettre du texte, qui doit être en majuscule.
"Pourrais tu juste commenter ton code"
J'en profite pour te montrer également comment documenter ton code pour la génération automatique de documentation, il faut juste pour cela rajouter un commentaire qui commence avec deux étoiles
/**suivi de quelques éléments descriptifs. Voir : How to Write Doc Comments
/** * Converts text to uppercase the first letter of each sentence. * @param txt a text to convert * @return the text converted * @throws NullPointerException when txt==null */ public static String syntaxCorrecter(String txt) { // le résultat que je construit caractère par caractère StringBuilder sb = new StringBuilder(); // est-ce que je suis à l'intérieur d'une phrase ? boolean inPhrase = false; // pour chaque caractère de mon texte for (char c : txt.toCharArray()) { // si je suis dans une phrase if (inPhrase) { // si j'ai un point (ou un point d'exclamation ou un point d'interrogation) if (c == '.' || c == '!' || c == '?') inPhrase = false; // c'est la fin de ma phrase // je rajoute le caractère sb.append(c); } else // je suis après un point { // si le caractère n'est pas un espace (alors c'est une lettre) if (c != ' ') { // alors je suis dans la phrase inPhrase = true; // la première lettre que j'ajoute je la mets en majuscule sb.append(Character.toUpperCase(c)); } else // c'est un espace { sb.append(c); // donc je le rajoute } } } // je transforme mon StringBuilder en String, c'est mon résultat return sb.toString(); }