2014-02-01 3 views
1

Я новичок в программировании, поэтому это не должно быть проблемой для большинства из вас. Я должен написать программу, которая суммирует 1/n^2 (n - последовательные натуральные числа), а элементы больше, чем константа eps = 0,001. Я написал фрагмент кода и попытался его отредактировать, но я все еще придерживаюсь бесконечного цикла, в котором я просто получаю последовательные числа, но совершенно очевидно, что сумма должна быть между 1 и 2. Я был бы более чем благодарен, если любой может показать мне, что я делаю неправильно.Добавление 1/n^2 + 1/(n + 1)^2 + ... в цикле

namespace program 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      const double eps=0.001; 
      int n=1; 
      double x; 
      x = 1/(n * n); 
      double sum=x; 
      while (x > eps) 
      { 
       n++; 
       sum = sum + x; 
       Console.WriteLine(sum); 
      } 
      Console.Write("\nSum: {0}.", sum); 
      Console.ReadLine(); 
     } 
    } 
} 
+1

'x' не является функцией' n', это просто переменная. Он не изменяется в цикле. – harold

+0

Хорошо. но не могли бы вы дать мне несколько советов о том, как его редактировать? –

ответ

0

Пара вещей. Прежде всего

1/(n * n) 

представляет собой целое выражение, и всегда либо 0 или 1. Вы должны сделать это выражение с плавающей точкой, как это:

1.0/(n * n) 

И тогда вам необходимо обновить x внутри цикла, а не присваивание x один раз и только один раз.

Возможно, как это:

static void Main(string[] args) 
{ 
    const double eps = 0.001; 
    int n = 1; 
    double x = 1.0/(n * n); 
    double sum = 0.0; 
    while (x > eps) 
    { 
     sum += x; 
     n++; 
     x = 1.0/(n*n); 
     Console.WriteLine(sum); 
    }; 
    Console.Write("\nSum: {0}", sum); 
    Console.ReadLine(); 
} 

Недостатком этого является то, что выражение для x написано дважды. Таким образом, лучший способ, как это:

static void Main(string[] args) 
{ 
    const double eps = 0.001; 
    int n = 1; 
    double sum = 0.0; 
    while (true) 
    { 
     double x = 1.0/(n * n); 
     if (x <= eps) 
      break; 

     sum += x; 
     n++; 
     Console.WriteLine(sum); 
    }; 
    Console.Write("\nSum: {0}", sum); 
    Console.ReadLine(); 
} 
+0

Я думаю, что это добавит еще один термин, чем хотелось бы суммировать. – babbageclunk

+0

@babbage делает хорошую точку. Я дам вам понять, как закончить цикл. Я думаю, что я затронул основные проблемы, и я уверен, что вы можете сделать все остальное. –

+0

Теперь он говорит, что я использую неназначенную переменную x перед циклом do while, но хорошо, я постараюсь самостоятельно ее решить. Думаю, я еще шаг. Спасибо –

1

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

const double eps=0.001; 
int n=1; 
double x; 

double sum=x; 
while (true) 
{ 
    x = 1.0/(n * n); 
    if (x < eps) { 
     break; 
    } 
    n++; 
    sum = sum + x; 
    Console.WriteLine(sum); 
} 
Console.Write("\nSum: {0}.", sum); 
Console.ReadLine(); 
Смежные вопросы