premier post et tout ça. Je suis un programmeur novice.
Quoi qu'il en soit, j'ai été chargé de créer un programme en Java qui prendra une entrée utilisateur sous la forme d'une phrase et d'un mot. Le programme supprime les espaces de la phrase et vérifie si le mot est présent dans la phrase "sans vierge". Cependant, le programme supprime également une lettre de la fin du mot et vérifie si que le mot em> est présent dans la phrase blanche. Le programme continue de supprimer les lettres du mot jusqu'à ce qu'il n'y ait plus de lettres à supprimer. P> De plus, le programme est également censé indiquer l'emplacement du mot, mais il ne peut pas répertorier un emplacement plusieurs fois. Si le programme ne trouve pas le mot entier, il imprime "" mot "n'a pas été trouvé." Si tel est le cas, il imprime "" mot "a été trouvé à l'emplacement" x "" p> E.g. Si ma phrase est "elle chante par la rivière" et par mot est "octet", le code est censé vérifier "ShesingsbyTheriver" pour "Byte", "BYT", "BY", et "BY", mais il ne peut pas trouver "BYT", "BY", et "B" au même endroit. em> p> ci-dessous est le code que j'ai. Tout va bien jusqu'à ma déclaration IF. Au lieu de trouver le mot dans la phrase sans réserve, il continue d'imprimer "" mot "n'a pas été trouvé" P> Quelques dernières notes: je devrais éviter les tableaux et la plupart des commandes dont j'ai besoin sont en classe de cordes. p> merci! p>
3 Réponses :
Vous devez envisager pause code> hors de la boucle si le mot n'a pas été trouvé
Ah, la chose est, mon professeur n'aime pas non plus les déclarations de pause. Il affirme qu'il conduit à un mauvais code. Personnellement je suis en désaccord.
Quelques commentaires:
La déclaration mais que va casser votre qui me conduit à commenter # 2. Vous pouvez aussi facilement cela comme un comme pour ne pas pouvoir trouver le même mot au même endroit plusieurs fois. , c'est un peu plus délicat. Probablement le moyen le plus simple de le faire serait avec un tableau de par défaut primitif booléen à False . Donc, chaque fois que vous trouverez l'instance de la sous-chaîne code> code> à une position, vous définissez le drapeau de votre tableau. P> Ensuite, vous devez vérifier le tableau à chaque fois que vous recherchez le Soyez conscient de la mise à jour de la matrice de drapeau, et la sous-chaîne spécifique que vous devez transmettre dans la méthode récursive. p> p> si (phraseblankless.tolowercase (). Contient (Word.Tolowercase ())) code> ne prend pas en compte que vous recherchez une version plus courte de
mot code> à chaque fois. Au lieu de simplement afficher une version abrégée à l'utilisateur dans votre boîte de dialogue, vous pouvez frapper plutôt le mot
code> plus court sur chaque itération: p>
pour code> boucle. p>
tandis que code> boucle: p>
Boolean code> S, avec chaque élément de tableau représentant un index dans la chaîne: p>
Word code>, et s'il a déjà été trouvé, essayez la recherche de nouveau mais commencez par position forte> cette fois em>. Si vous avez déjà couvert la récursion, c'est un bon moment pour la pratique. Ceci est un peu de code pseudo (car je ne vais pas faire vos devoirs complètement) qui montre comment j'approcherais cela: p>
L'as tu essayé? Cela a-t-il fonctionné? L'idée de méthode récursive est uniquement de traiter si l'entrée de mot a déjà été trouvée à cette position. La boucle pour raccourcir le Wordinput ne devrait pas être à l'intérieur de cette méthode, elle devrait l'appeler. Revenez et examinez la portée variable, et voyez si vous pouvez savoir pourquoi vous ne pouvez pas déclarer le tableau booléen à l'intérieur de la méthode. Meilleur conseil, insérez quelques déclarations d'impression libéralement dans votre code pour l'exécuter et voir ce que cela fait.
Votre problème est qu'il est toujours cherché si "octet" a été trouvé et non des soustractions d'octets.
Cela se produit sur cette ligne p> vous utilisez toujours mais je ne le recommanderais pas. Au lieu de cela, essayez de mettre à jour le mot sur chaque itération de la boucle de la boucle pour. P> afin que vous puissiez faire: p> Votre finale de boucle serait: p> mot code> qui est toujours "octet", il n'est jamais mis à jour. P> Vous pouvez donc le remplacer par p>
for (int x = 0; x < word.length(); x++)
{
word = word.substring(0, word.length() - x);
if (sentenceBlankless.toLowerCase().contains(word.toLowerCase()))
{
int loc = sentenceBlankless.toLowerCase().indexOf(word.toLowerCase());
JOptionPane.showMessageDialog(null, word + " was found at location " + loc);
}
else
JOptionPane.showMessageDialog(null, word + " was not found");
}
J'ai essayé votre suggestion et je sors des erreurs de limites. Qui est bizarre parce que je n'ai pas joué avec les longueurs de la corde
EDIT: Erreur de ma part, essayé d'imprimer le mot avec (Word.Substring (0, Word.Length () - x) en plus d'avoir cela dans la boucle.
Oh ouais, j'aurais dû mentionner que j'ai aussi changé cette partie. Aussi à ne pas imprimer deux fois au même endroit, vous pouvez utiliser un hashmap, cependant, je ne savais pas comment votre instructeur veut que vous le résolvez.
Ceci est un peu hors sujet, mais vous devez envisager de créer une liste des recherches qui se trouvent et la présentant ceci à l'utilisateur au lieu de spammer l'utilisateur avec des boîtes de dialogue pour chaque recherche trouvée. Enfin, bienvenue à Stackoverflow et félicitations pour faire votre premier post!
@ Smac89 ah droite, ça. Mon professeur a demandé spécifiquement que nous «spamons» l'utilisateur, oublié de mentionner que haha.