函数中的计算似乎被忽略,始终返回相同的数字

时间:2010-12-11 02:09:28

标签: c++

growthRate功能(截至2010年11月12日晚8点)

    #include "header.h"

float growthRate (float birthRate, float deathRate)     
{   
    float growthrt;  
    growthrt =  (birthRate) - (deathRate);
    cout << growthrt << endl; 
    return growthrt;

}

估计人口功能(截至2010年11月12日晚8点)

#include "header.h"

float estimatedPopulation (float currentPopulation, float years, float birthRate, float deathRate)
{
    int x;
    float newPopulation;
    for (x = 0; x < years; x++)
    {
    newPopulation = currentPopulation + currentPopulation * (growthRate (birthRate, deathRate) / 100);
    currentPopulation  = newPopulation;
    cout << newPopulation << endl;
    }

    return newPopulation;
}

输出功能(截至2010年11月12日晚8点)

#include "header.h"

void output (float currentPopulation, float years)

{     
     cout <<  estimatedPopulation (currentPopulation, years) << endl;
}     

主要功能 :(截至2010年12月11日晚8点)

#include "header.h"

int main ()
{

    float currentPopulation, birthRate, deathRate, years;

    char response; 


     do //main loop
      { 
           input (currentPopulation, birthRate, deathRate, years);
           growthRate (birthRate, deathRate);
           estimatedPopulation (currentPopulation, years, birthRate, deathRate);
           output (currentPopulation, years, birthRate, deathRate);
           cout << "\n Would you like another population estimation? (y,n) ";
           cin >> response;
      }          
    while (response == 'Y' || response == 'y');

    myLabel ("5-19", "12/09/2010");   

    system ("Pause");

    return 0;

}    

编辑(2010年11月12日晚8点)

解决!参数,参数,参数!感谢大家的投入。

6 个答案:

答案 0 :(得分:3)

你有两个主要问题。

第一个问题是,estimatedPopulation的返回值为int。因此,当评估表达式的结果时,它将转换为int,将其向下舍入。除非currentPopulation * growthrt / 100的结果大于1,否则你永远不会看到变化。我认为你最后一个例子也有同样的问题。

另一个问题是您不断为newPopulation变量分配相同的值。您可能希望在循环中调整currentPopulation

@Matt:看起来你没有使用函数的返回值,例如:

something = estimatedPopulation(currentPopulation, years);

(顺便说一句 - 该功能应该采用4个参数???)

请注意,当你传入一个'int'时,函数中的变量是函数的局部变量 - 修改它对函数外同名变量没有影响。看起来非常像你期待的那样。如果您确实想要修改传入的值,可以尝试以下方法:

void estimatedPopulation(int &newPopulation....) {

这会通过引用传递中的变量,以便您可以在函数中实际修改它。

答案 1 :(得分:2)

循环迭代时没有更新newPopulationcurrentPopulation,因此newPopulation只会被相同的值多次覆盖。我想在那个循环中的某个点你想要一个像currentPopulation = newPopulation;

这样的行

编辑添加:

现在您添加了main函数:您正在将所有函数调用视为void类型。也就是说,您实际上并未使用estimatedPopulationgrowthRate中的任何返回值,因此我很遗憾您在output函数中打印了除垃圾值之外的任何内容,它的论点从未设定过。

答案 2 :(得分:1)

您将newPopulation作为参数传递,但是按值,而不是通过引用或指针传递。所以它没有被你的代码更新。

你也没有触及那个变量,所以它只会进行一次迭代。

答案 3 :(得分:1)

除了其他人所说的内容之外,看起来growthrt被分为100次,一次在函数growthRate内,再次在estimatedPopulation的循环内。

一旦你更新内容,你将遇到的另一件事是循环运行years+1次,这可能比你想要的多。

答案 4 :(得分:0)

我认为这只是一个用整数进行四舍五入的情况,说“currentpopulation”是100,“growthrt”是0.1。然后:总和变成: 100 + 100 * 0.1 / 100 = 100.1; - 然后将其设置为下一个“newPopulation”。然而,由于新的人口是一个整数,它再次向下舍入到100!

更好地将“newPopulation”更改为双/浮点数(并且可能在函数结束时将其再次向下舍入)

答案 5 :(得分:0)

您没有看到此代码存在问题?

void output ()

{
     float currentPopulation, years;

     cout <<  estimatedPopulation (currentPopulation, years) << endl;
}     

如果你真的不明白为什么这是错的,那么你应该从更简单的程序开始。