2015-10-29 3 views
0

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

(1/3 + 3/5 + 5/7 + 7/9 + 9/11 + 11/13 + ... 95/97 + 97/99) Ответ должен быть 45.12445 согласно профессору но я получаю ответ 40.92541, и мне трудно понять, где ошибка в моей логике.

public class HW6 
public static void main(String[]args) 
    { 
      //Declarations 
      double num; 
      double denom; 
      double holder1; 
      double sum; 
      num=1; 
      denom = 3; 
      sum=0; 


      // Perform loop 
      for (num=1;num<=98;num=num+2) { 
        num = num+2; 
        denom = denom+2; 
        holder1 = num/denom; 
        sum= sum+holder1; 
        } 

      // Print sum 
      System.out.println("The sum is " +sum); 
    } 
} 

ответ

0

Чтобы понять проблему в вашей логике, сделайте это шаг за шагом. Ваша инициализация перед цикл выглядит хорошо, так что давайте начнем с самого начала цикла:

Итерация 1

for (num=1;num<=98;num=num+2) { 

На данный момент ваши переменные содержат следующее:

NUM == 1, denom == 3, sum == 0 и держатель == undefined (потому что вы его не инициализировали)

Следующий отчет:

num = num+2; 

num изменения в 3-х, так что мы теперь имеем:

Num == , DENOM == 3, сумма == 0, и держатель == неопределенными.

После следующего утверждения:

denom = denom+2; 

denom изменяется от 3 до 5, так что мы имеем:

Num == 3, DENOM == , сумма == 0, и держатель == undefined.

Затем, после того, как

holder1 = num/denom; 

мы имеем первую расчетную часть, которая (так как Num == 3 и DENOM == 5) 3/5, или 0,6. Вы, вероятно, заметите, что это не то, что вы намеревались, потому что согласно вашему назначению первая фракция в серии должна быть 1/3. Поэтому первая проблема с вашей логикой заключается в том, что вы добавляете 2 к обоим num и denom, прежде чем вычислять первую фракцию в серии.

Продолжая шаг через код, после того, как

sum= sum+holder1; 

переменные содержат

Num == 3, DENOM == 5, сумма == 0,6, и держатель == 0,6.


Итерация 2

Теперь перед циклом назад для выполнения следующей итерации цикла for, переменная num будет увеличиваться на 2, как указано в третьем выражении в вашем определении for петли: num=num+2 , Поэтому, когда цикл начинается для второй итерации, переменные содержат:

num == , обозначение == 5, сумма == 0.6 и держатель == 0.6.

Как и прежде, следующие два оператора приращения num и denom, соответственно, на 2, так что перед следующей фракции вычисляется, переменные содержат:

Num == , DENOM == , сумма == 0.6 и держатель == 0.6.

Переменная holder затем вычисляется как num/denom = 7/7 = 1,0 (что, конечно, не фракция, которая является частью правильной серии), и после добавления этого к sum, у вас есть

Num == 7 , denom == 7, sum == 1.6 и holder == 1.0.


Заключение

Таким образом, есть по крайней мере две ошибки в вашей логике. Во-первых, после инициализации num и denom до 1 и 3, вы добавляете 2 к каждому, прежде чем вычислять их отношение. То, что вы, вероятно, должно, вместо этого добавляет 2 к каждому из num и denomпосле вы рассчитываете их соотношение, но перед тем, как вернуться к началу цикла.

Вторая ошибка, которую вы, надеюсь, заметили, как мы ступили через код, что вы добавляете 2 к numдважды с каждым разом через петлю: один раз в нижней части цикла в соответствии с вашими for спецификатора, и один раз в верхней части цикла. Вам нужна только одна из этих операций «шаг за шагом».

Так улучшенный цикл будет выглядеть следующим образом:

 for (num=1;num<=98;num=num+2) { 
       holder1 = num/denom; 
       sum= sum+holder1; 
       denom = denom+2; 
       } 
Смежные вопросы