2010-11-03 10 views
3

Je suis novice en Java et je suis également novice en ce qui concerne les instructions while, for et if/else. J'ai vraiment lutté avec cette bête de problème.Java en boucle/logique mathématique

Le code et la description sont ci-dessous. Il compile, mais je ne le calcule pas comme prévu. Je ne suis pas vraiment sûr si c'est une erreur de logique mathématique, une erreur de mise en boucle, ou les deux.

J'ai broyé mes engrenages depuis un certain temps maintenant, et je ne suis pas capable de le voir. J'ai l'impression d'être vraiment proche ... mais encore si loin.

code:

/* 
This program uses a while loop to to request two numbers and output (inclusively) the odd numbers between them, 
the sum of the even numbers between them, the numbers and their squares between 1 & 10, the sum of the squares 
of odd numbers. 
*/ 

import java.io.*; 
import java.util.*; 

public class SumOfaSquare 
{ 
static Scanner console = new Scanner(System.in); 

public static void main (String[] args) 
{ 

int firstnum = 0, secondnum = 0, tempnum = 0; 
int sum = 0,squaresum = 0, squarenum = 0; 
int number = 1; 


String oddOutputMessage = "The odd numbers between" + firstnum + " and " + secondnum + " inclusively are:"; 
    String evenSumMessage = "The sum of all even numbers between " + firstnum + " and " + secondnum + "is: "; 
    String oddSquareMessage = "The odd numbers and their squares are : "; 
    String squareMessage = "The numbers and their squares from 1-10 are : "; 

System.out.println ("Please enter 2 integers. The first number should be greater than the second: "); 
firstnum = console.nextInt(); 
secondnum = console.nextInt(); 

//used to find out if first number is greater than the second. If not, inform user of error. 
if (firstnum > secondnum) 
{ 
    tempnum = firstnum; 
    System.out.println ("You entered: " + firstnum + " and: " + secondnum); 
} 
else 
    System.out.println ("Your first number was not greater than your second number. Please try again."); 

//while the frist number is greater, do this.... 
while (tempnum <= secondnum) 
{ 
    //if it's odd.... 
    if (tempnum %2 == 1) 
    { 
    oddOutputMessage = (oddOutputMessage + tempnum + " "); 
    squaresum = (squaresum + tempnum * tempnum); 
    } 

    //otherwise it's even.. 
    else 
    { 
    sum = sum + tempnum; 
    evenSumMessage = (evenSumMessage + sum + " "); 
    tempnum++; 
    } 
} 
// figures squares from 1 - 10 
while (number <=10) 
{ 
    squarenum = (squarenum + number * number); 
    squareMessage = (squareMessage + number + " " + squarenum); 
    number++; 
} 



    oddSquareMessage = oddSquareMessage + squaresum; 
    System.out.println (oddOutputMessage); 

    System.out.println (oddOutputMessage); 
    System.out.println (squareMessage); 
    System.out.println (evenSumMessage); 
    System.out.println (oddSquareMessage); 

} 
} 
+0

+1 pour référence de type famille. putain d'enfants de collège ... – hvgotcodes

+0

damn sortes et votre musique! –

Répondre

0

Il existe un certain nombre de problèmes avec votre code. Je préférerais que vous travailliez sur le problème vous-même. Vous pouvez utiliser le débogage "println" pour imprimer les variables en cours de route si vous ne savez pas comment déboguer le code. Prenez les entrées 3 et 1 et parcourez votre programme ligne par ligne et réfléchissez à ce que la réponse va être dans votre tête (ou sur papier). Voyez si cela correspond à vos résultats attendus.

Voici quelques commentaires généraux sur votre code:

  • Tenir compte briser la sortie différente dans différentes sous-routines: dumpOddNumbers(low, high), sumEvenNumbers(low, high), ...
  • Essayez de limiter la portée des variables, autant que possible. Ne définissez pas les variables en haut, puis utilisez-les plus tard. Essayez de les définir juste avant d'en avoir besoin. Cela limitera vos conséquences imprévues. Essayez de ne pas réutiliser les variables sauf s'il s'agit de compteurs temporaires.
  • while (tempnum < = secondnum) Ce type de ligne doit être for. Un des problèmes avec le code est que si le premier nombre est < puis le second (l'entrée 1 10 par exemple), le programme boucle pour toujours parce que tempnum n'est pas incrémenté si le nombre est impair.
  • while (tempnum <= secondnum) devrait probablement être for (int tempnum = firstnum; tempnum <= secondnum; tempnum++)
  • while (number <= 10) devrait être for (int number = 1; number <= 10; number++)
  • Vous définissez le message en haut de votre programme, mais vous ne devriez pas virer de bord sur les résultats plus tard. Faites quelque chose comme println(msgString + resultValue).
  • Jetez un oeil à StringBuilder() au lieu de msg = msg + ... type de logique. Beaucoup plus efficace.
  • Lorsque vous vérifiez que les numéros sont dans le bon ordre et crachez un message d'erreur, êtes-vous sûr de vouloir continuer? Je pense que vous devriez return là.
  • Le code suivant ne correspond pas au commentaire. Qui est correct?

    // while the frist number is greater, do this 
    while (tempnum <= secondnum) { 
    

Hope this helps.

+0

Gris, merci.Cela aide un peu. Je vois ce que vous dites à propos de l'utilisation d'un "pour" à la place. Ce serait beaucoup plus propre, mais l'affectation nécessite spécifiquement une boucle "while". Je vois votre point de ne pas finir si les chiffres sont hors du bon ordre. –

+0

Ensuite, je m'assurerais que vous avez le type de motif suivant (avec des sauts de ligne): 'int nombre = 1; while (nombre <= 10) {...; // dernière ligne ; nombre ++; } ' – Gray

2

Dans votre première boucle, réfléchir sérieusement les conditions dans lesquelles vous incrémenter tempnum. Que se passe-t-il quand c'est bizarre? Est-ce que tempnum est incrémenté?

+0

Non Non, mais il le devrait. Je vous remercie. –