2013-04-07 2 views
0

Эта программа должна запускать функцию до тех пор, пока она не удовлетворяет условию (ответ < 0,01), а затем сообщите о количестве необходимых серверов (c) для этого условия. Моя программа никогда не доходит до этой точки, потому что она начинает возвращаться на полпути через программу. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?Почему моя функция начинает возвращать nan?

#include <iostream> 
#include <cmath> 
#include <math.h> 


using namespace std; 

float product (float p); 
float answer; 


int main() 
{ 
    cout << "Searching for minimum number of servers..." << endl; 

    float c; 
    float answer; 

    do 
    {for (c=1; c<220; c++) 
     { 
     answer = product(c); 
     cout << "when c is " << c << " answer is " << answer << endl; 
     } 
    }while (answer >= 0.01); 

    cout << "when c is " << c << " answer is " << product(c) << endl; 
    cout << "Minimum number of servers required is " << c << endl; 

    return 0; 
} 

float product (float p) 
{ 
    float temp; 
    float result; 
    if (p==0) 
     answer = 1; 
    else 
     temp=200*product(p-1); 
     result=temp/(temp+p); 
    return result; 
} 
+7

Добро пожаловать в Stack Overflow! Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –

+0

В вашем базовом случае (то есть: 'p == 0') вы никогда не устанавливаете' result', вы только установите 'ответ'. Я не знаком с стандартом C++, но для некоторых языков неинициализированные значения могут вызывать неопределенное поведение. –

ответ

1

В функции product, вы не установили temp если p равен 0. Это приводит к тому, что temp неинициализируется и содержит, казалось бы, случайное значение, когда вы позже вычислите result.

Если вы забыли скобки вокруг отступов после else, вместо этого вы оставите result неинициализированным, и он по-прежнему будет содержать, казалось бы, случайное значение.

Эти случайные значения, конечно, включают NaN.

+0

Спасибо за помощь !!! – AS10999

0

С вашего отступа, я ожидаю, вы имели в виду, чтобы написать это:

, что я добавил { и } вокруг состояния else
float product (float p) 
{ 
    float temp; 
    float result; 
    if (p==0) 
     answer = 1; 
    else 
    { 
     temp=200*product(p-1); 
     result=temp/(temp+p); 
    } 
    return result; 
} 

Примечание.

0
  1. добавить скобки вокруг двух утверждений после того, как еще

    else { temp=200*product(p-1); result=temp/(temp+p); }

  2. if(p == 0) result = 1 Назначение ответа = 1, а затем возвращение результата, который инициализирован в этом случае даст вам значение NaN при р = 0. Хотя в текущей ситуации p никогда не будет равным нулю, поскольку аргумент c передан в product в диапазоне от 1 до 220.

  3. удалить объявление глобальной переменной answer. Скорее всего, вам это не нужно.

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