2013-09-15 5 views
-3

Да, я знаю, что здесь есть много способов. Это часть задания. В этом коде все работает по назначению, за исключением того, что при вводе чисел, равных сумме < = 100, «средний» выход неверен. Например: если я поставил 8,10,19 и ноль, чтобы выйти из выхода, то счет 3 сумма 37 средний 9,25 .... среднее должно быть 12.3333. Теперь, если я вхожу в 8, 10, 99, вывод равен 3 суммам 117 и среднему 39, что является правильным. Почему он работает на сумму> 100, но не сумма < = 100 ??? Я не понимаю. Что мне не хватает?что не так с моим методом для avg?

public static void main(String[] args) { 
    //Use Main Method for gathering input 
    float input = 1; 
    // Declare variable for sum 
    float theSum = 0; 
    // Declare variable for average 
    float average = 0; 
    // Declare variable for counting the number of user inputs 
    int counter = 0; 
    /* Initialize the while loop using an input of 0 as a sentinel value 
    * to exit the loop*/ 
    while (input != 0) { 
     if (input!=0){ 
      counter++; 
     } 
     input = Float.parseFloat(
       JOptionPane.showInputDialog(
       null, "Please enter a number. Enter 0 to quit: ")); 
     // Invoke sum method and pass input and summation to sum method 


     theSum = (sum(input, theSum)); 
     if (theSum > 100) 
     { 
      JOptionPane.showMessageDialog(null, "The sum of your numbers " 
        + "are greater than 100!"); 
      break; 
     } 
    } 
     // Invoke display method and pass summation, average, and counter variables to it 
       average = (avg(theSum, counter));  
       display(theSum, average, counter); 
    } 


public static float sum(float num1, float sum) { 
    //Add the user's input number to the sum variable 
    sum += num1; 
    //Return value of sum variable as new summation variable 
    return sum; 
} 

public static float avg(float num1, float num2) { 
    //Declare and initialize variable for average 
    //Calculate average 
    float average = num1/num2; 
    //Return value of average variable 
    return average; 
} 

public static void display(float sum, float average, int counter) { 

    /* I am subtracting 1 from variable counter so as not to include the sentinel value 
    * of 0 that the user had to enter to exit the input loop in the overall count*/ 

    // Display the count, sum, and average to the user 
    if (sum > 100) { 
     JOptionPane.showMessageDialog(null, "Count = " + (counter) + ", Sum = " + sum + ", Average = " + average); 
    } 
    if (sum <= 100) { 
     JOptionPane.showMessageDialog(null, "Count = " + (counter - 1) + ", Sum = " + sum + ", Average = " + average); 
    } 

} 

}

+2

Почему вы используете отдельные методы для основных арифметических операторов? – chrylis

+0

Да. Обычно средний метод принимает массив или ArrayList чисел, а затем вычисляет среднее из них. –

+0

Это было требование задания. На этой неделе мы изучили методы, вы можете сказать? :) – Chris

ответ

0

Проблема связана с тем, как вы выходите из цикла while, упомянутого @chrylis. Поэтому в случае, если сумма равна <= 100, счетчик 1 больше. Но при печати вы получите правильный результат, потому что вы измените значение счетчика здесь:

if (sum <= 100) { 
     JOptionPane.showMessageDialog(null, "Count = " + (counter - 1) + ", Sum = " + sum + ", Average = " + average); 
    } 

Как вы видите, в вашем примере: «, если я ставлю в 8,10,19 и ноль для выхода выход count 3 sum 37 average 9.25 "

это потому, что значение счетчика 4 (ср поэтому будет 37/4 = 9.25), но в то время отображения результата нужно вычесть счетчик на 1, поэтому вы получите счетчик, как 3.

Цикл do-while решает проблему, так как условие будет проверено последним, таким образом, цикл будет работать одинаково как для <=100, так и для> 100.

Цикл do-while будет выглядеть так:

do{ 

//here goes your code 

}while (input != 0); 
0

Ваш счетчик 1 больше, чем необходимо. Разделение на (counter - 1) исправит это.

+0

правильно, но почему это работает на сумму> 100? будет ли проблема присутствовать в обоих случаях? sum> 100 и sum <= 100 ?? – Chris

+0

Нет, это не то же самое, и на самом деле вы поняли это в своем методе 'display', поскольку вы изменяете счетчик в одном случае, но не в другом. Попробуйте пересмотреть то, что делает ваш цикл while, так как @chrylis предложил – torquestomp

4

Причина в том, что вы выходите из цикла while по-разному в зависимости от общей суммы. Если сумма меньше 100, даже когда вы вводите номер 0 для «выхода», вы все равно продолжаете проходить цикл. Если честно, весь цикл должен быть полностью реструктурирован; a do...while цикл будет намного легче читать и отлаживать.

+0

Отлично :(Я надеялся на легкое исправление. Как бы это сделать ... в то время как смотреть? – Chris

+1

Это уже ответили в другом из ваших многочисленных репозиториев. не читайте ответы, почему вы ставите вопросы? – EJP

+0

Ну, я, очевидно, нуждался в дополнительном руководстве. Я изучаю это самостоятельно, используя ввод от инструктора. Спасибо за помощь. Я действительно пытаюсь «получить» это. прочитайте все ответы и попытайтесь их использовать. К счастью, я только что это понял. Я создал отдельные методы для среднего и отображения для операторов, если сумма> 100 и если сумма <= 100. Я получаю, что для вас опытные профи это это метод overkill, но, как я уже говорил во всех моих «многочисленных репозиториях», это было требование о назначении. Еще раз спасибо за вашу помощь EJP. Запутывание ваших «ответов» помогло мне понять, как решить это самостоятельно. – Chris

Смежные вопросы