2009-12-14 5 views
-1

comment puis-je écrire une boucle contrôlée par requête qui continuera à entrer des valeurs int de l'utilisateur, en ajoutant chacun à la somme de valeur, puis demander si l'utilisateur a une autre valeur à saisir, jusqu'à ce que l'utilisateur dit qu'il n'y a pas plus de valeursune boucle contrôlée par requête en Java

+1

Est-ce que ce travail est fait? –

Répondre

3
double sum = 0; 
while (user.hasMoreInput()) { 
    double += user.mostRecentInput(); 
} 

où vous implémentez hasMoreInput et mostRecentInput à votre assimilation.

+0

Hehe, sympa. +1 :) – Bombe

+0

Exact. Mapping exigences pour le code est tellement sacrément facile :) –

-1

Le Java Developer's Almanac est toujours une bonne source d'exemples de base tels que le vôtre. Edit: Apparemment, certaines personnes pensent qu'une démonstration de l'essentiel d'une technique devrait avoir une vérification d'erreur. Peut-être devrais-je aussi avoir commenté le code, et fourni une spécification. La prochaine fois, je développerai également des annotations personnalisées pour exprimer les conditions pré et post, ou rédiger une implémentation dans Eiffel.

+0

+1: Bonne réponse, merci pour le lien! Mais j'exhorte les lecteurs à coder quelque chose d'utile dans le bloc 'catch'. Toutes sortes de frustrations de l'utilisateur résultent de cette pratique répréhensible d'avaler des exceptions. Je dirais que le code comme ceci ne devrait pas apparaître dans un Almanach; cela ne les aurait pas blessés d'inclure une ligne de code supplémentaire. –

+2

Non, je le reprends. Le code est horrible! 'readLine()' est suivi de 'process (str)' sans vérification de null. Les gens qui codent comme ça n'ont pas d'almanachs d'écriture d'affaires. –

+1

C'est une façon très étrange de faire un REPL - vous allez traiter une chaîne nulle lorsque vous atteignez EOF. Une utilisation plus idiomatique serait quelque chose comme 'prompt(); pour (String cmd; (cmd = in.readLine())! = null;) {processus (cmd); rapide(); } ' – gustafc

1

Voici comment j'écris une telle boucle. Je ne devrais pas écrire vos devoirs pour vous, mais je voudrais néanmoins démontrer mon style préféré pour ce genre de boucle.

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
while (true) { 
    System.out.print("> prompt "); 
    String str = in.readLine(); 
    if (str == null) break; 
    process(str); 
} 

Certaines personnes peuvent ne pas aimer

  • while (true) - il ressemble à une boucle infinie parce qu'elle est! Il est aussi infini que la patience de l'utilisateur en tapant l'entrée.
  • Ligne unique if - certaines personnes préféreraient en faire un 3-liner entièrement entre parenthèses. Mais je ne vois aucune utilité à cela; il ne devient pas plus lisible en conséquence.
  • break en milieu de boucle. C'est pour ça que break est pour! C'est votre trappe d'échappement des boucles autrement infinies.

Si vous avez l'habitude de lire du code Java, ceci est idiomatique et lisible. Avantages:

  • Il montre les étapes se déroulant exactement dans la séquence où elles se produisent;
  • Il limite la portée de str à exactement où c'est nécessaire;
  • Il est très explicite sur la condition de terminaison;
  • C'est très concis. Moins de lignes = moins de bugs, je dis toujours.
0

Il y a quelques pièces que vous devez manipuler. Tout d'abord, vous devez savoir comment recevoir les entrées de l'utilisateur. L'exemple de Java Developer almanach (http://www.exampledepot.com/egs/java.io/ReadFromStdIn.html) que je trouve ressemble à ceci:

try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String str = ""; 
     while (str != null) { 
      System.out.print("> prompt "); 
      str = in.readLine(); 
      process(str); 
     } 
    } catch (IOException e) { 
} 

Vous pouvez remplacer « > invite » avec quelque chose de plus descriptif. Vous aimeriez également avoir un meilleur moyen pour l'utilisateur de quitter que d'entrer une ligne vide, alors demandez-lui d'entrer un «q» s'il a terminé. Ensuite, changez la comparaison dans la boucle while en quelque chose comme! Str.toLowerCase(). Est égal à ("q"). Ensuite, vous devez implémenter la fonction de processus pour convertir la chaîne en entier. Integer.parseInt (String) renverra la valeur entière d'un String qui représente correctement un entier (ie, "3" ou "49" mais pas "7e") et lancera une exception NumberFormatException sinon.Parce que vous ne voulez pas que votre application échoue avec une exception sur une mauvaise entrée, je pense que ce processus pourrait juste retourner 0 dans le cas d'une chaîne non-Integer (c'est-à-dire, quand vous attrapez une exception NumberFormatException). Enfin, vous voudrez avoir une variable somme initialisée avant votre boucle principale, et vous pouvez ajouter le résultat de process à chaque itération. Ensuite, lorsque la boucle est terminée, vous pouvez imprimer le résultat de process à l'écran en utilisant System.out.println. J'ai délibérément omis la plupart du code parce que cela ressemble à des devoirs, mais si vous pouvez comprendre tout cela assez pour le mettre ensemble, je pense que vous l'aurez appris assez bien pour le faire par vous-même.

+0

prise vide? au moins faire un printStackTrace! ou ne pas attraper du tout ... le pire est de cacher l'erreur comme ci-dessus. –

+0

Ce code est simplement copié verbatim à partir de ce lien, comme je l'ai mentionné ci-dessus. Et l'instruction catch ne manque pas son accolade proche, elle n'est tout simplement pas indentée. – danben

+0

n'a pas dit quoi que ce soit à propos de l'absence de l'accolade ... –

0

Voici comment je le fais habituellement. aussi peu de code que possible :).

String s; 
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
while((s = in.readLine()) != null) 
    process(s); 
+0

pas "aussi peu que possible", a remporté 2 lignes: 'while (processus (in.readLine()));' .... (ne dit pas que je le ferais de cette façon) –

+0

bien, vous aurez besoin d'avoir un processus interne if (s! = null), il n'est donc pas clair si votre version est vraiment plus courte. –

+0

était censé être une blague, mais je n'ai toujours pas besoin de la ligne 'String s;', et très probablement j'aurais une vérification (String vide) ou au moins une affirmation en cours ... :-) –