2010-11-03 4 views
3

Я новичок в Java, а также новичок в операторах while, for и if/else. Я действительно боролся с этим зверем проблемы.Java while loop/math logic

Код и описание ниже. Он компилируется, но я не рассчитываю так, как ожидалось. Я не уверен, что это ошибка математической логики, ошибка компоновки петли или и то, и другое.

Я шлифование моих передач в течение некоторого времени, и я не может его видеть. Я чувствую, что я очень близко ... но все еще так далеко.

Код:

/* 
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 для ссылки на семейного парня. проклятые дети колледжа ... – hvgotcodes

+0

проклятые виды и твоя музыка! –

ответ

0

Есть целый ряд проблем, связанных с вашим кодом. Я бы предпочел, чтобы вы сами справлялись с проблемой. Вы можете использовать отладку «println», чтобы распечатать переменные на этом пути, если вы не знаете, как отлаживать код.

Возьмите вход 3 и 1 и пройти через вашу программу построчно и думать о том, что ответ будет в вашей голове (или на бумаге). Посмотрите, соответствует ли это вашим ожидаемым результатам.

Вот некоторые общие комментарии о коде:

  • Рассмотрит нарушение другого вывода в различные подпрограммы: dumpOddNumbers(low, high), sumEvenNumbers(low, high), ...
  • Try, чтобы ограничить области видимости переменной как можно больше. Не определяйте переменные сверху, а затем используйте их позже. Попробуйте определить их прямо перед тем, как они вам понадобятся. Это ограничит ваши непредвиденные последствия. Не пытайтесь повторно использовать переменные, если это временные счетчики.
  • в то время как (tempnum < = SecondNum) Эти рода линий должны быть for петли. Одна из проблем с кодом заключается в том, что если первое число равно <, то второе (например, вход 1 10), программа циклически навсегда, потому что tempnum не увеличивается, если число нечетное.
  • while (tempnum <= secondnum), вероятно, следует for (int tempnum = firstnum; tempnum <= secondnum; tempnum++)
  • while (number <= 10) должен быть for (int number = 1; number <= 10; number++)
  • Вы определяете сообщение в верхней части вашей программы, но вы не должны лавировать на результатах позже. Сделайте что-нибудь вроде println(msgString + resultValue).
  • Взгляните на StringBuilder() вместо msg = msg + ... типа логики. Гораздо эффективнее.
  • Когда вы проверяете номера в правильном порядке и выплевываете сообщение об ошибке, вы уверены, что хотите продолжить? Я думаю, вам стоит return.
  • Следующий код не соответствует комментарию. Что правильно?

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

Надеется, что это помогает.

+0

Серый, спасибо.Это очень помогает. Я понимаю, что вы говорите об использовании «for» вместо этого. Это было бы намного более чистым, но назначение специально требует цикла while. Я вижу, что ваша точка не заканчивается, если цифры находятся вне правильного порядка. –

+0

Тогда я бы удостоверился, что у вас есть следующий тип шаблона (с разрывами строк): 'int number = 1; while (число <= 10) {...; // Последняя линия ; номер ++; } ' – Gray

2

В своем первом цикле, думаю, трудно об условиях, при которых вы приращение tempnum. Что происходит, когда это странно? Увеличивает ли tempnum?

+0

Нет. Это не так, но должно. Спасибо. –