我的程序中是否存在计算错误?

时间:2014-11-10 10:56:47

标签: c++ function

显然我的程序中某处存在计算错误,但我找不到它。

我有关于为什么存在计算错误的唯一信息是MyProgrammingLab提供的以下反馈(一个自动测试代码以查看它是否不正确的站点)。我不知道为年度死亡率和年出生率输入了什么值。可能是我说得对,但MyProgrammingLab错了吗?老实说,我所有的测试都很好。

预期输出:

Year 1: 200 176
Year 2: 176 154
Year 3: 154 135
Year 4: 135 118
Year 5: 118 103
Year 6: 103 90
Year 7: 90 79

实际输出:

Year 1: 200 199
Year 2: 199 198
Year 3: 198 197
Year 4: 197 196
Year 5: 196 195
Year 6: 195 194
Year 7: 194 193

我根据以下任务构建了程序:

在人口中,出生率是出生人口增加的百分比,死亡率是死亡人口减少的百分比。编写一个要求以下内容的程序:

  • 人口的起始人数(最少2人)(提示Enter starting size:
  • 年出生率(提示Enter annual birth rate:
  • 年死亡率(提示Enter annual death rate:
  • 显示的年数(最少1个)(提示Enter years to display:

然后,该计划应显示每年年底的起始人口和预计人口。它应该使用一个函数来计算并返回一年后人口的预计新大小。公式是

  N = P(1 + B)(1 - D) 

其中N是新的人口规模,P是先前的人口规模,B是出生率,D是死亡率。年出生率和死亡率是每1000人一年中的典型出生和死亡人数,以小数表示。因此,例如,如果特定人群中每1000人通常有大约32个新生儿和26个死亡,则出生率为.032,死亡率为.026。

我的代码:

#include <iostream>
using namespace std;

int projectedNewSize(float population, float annualBirthRate, float annualDeathRate) {
    float annualBirthRate2 = annualBirthRate / 1000;
    float annualDeathRate2 = annualDeathRate / 1000;

    int newpopulation = population * (1 + annualBirthRate2) * (1 - annualDeathRate2);
    return newpopulation;
}

int main() {

    int populationStartingSize = 0;
    float annualBirthRate = 0;
    float annualDeathRate = 0;
    int numberOfYearsToDisplay = 0;

    do  {
        cout << "Enter starting population size: ";
        cin >> populationStartingSize;
        cout << "Enter annual birth rate: ";
        cin >> annualBirthRate;
        cout << "Enter annual death rate: ";
        cin >> annualDeathRate;
        cout << "Enter years to display: ";
        cin >> numberOfYearsToDisplay;
    } while (!(populationStartingSize >= 2) || !(numberOfYearsToDisplay >= 1));

    int population;

    for (int i = 1; i <= numberOfYearsToDisplay; i++) {
        cout << "Year " << i << ": " << populationStartingSize << " ";
        population = projectedNewSize(populationStartingSize, annualBirthRate, annualDeathRate);
        cout << population << endl;
        populationStartingSize = population;
    }

    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:3)

所以,答案是

没有必要将annualBirthRate和annualDeathRate除以1000.由于annualBirthRate计算为每1000人口的年出生率,因此不必再将其除以1000。

因此删除这些行

float annualBirthRate2 = annualBirthRate / 1000;
float annualDeathRate2 = annualDeathRate / 1000;

并改变

int newpopulation = population * (1 + annualBirthRate2) * (1 - annualDeathRate2);

int newpopulation = population * (1 + annualBirthRate) * (1 - annualDeathRate);

所以,最终的代码看起来像这样:

#include <iostream>
using namespace std;

int projectedNewSize(float population, float annualBirthRate, float annualDeathRate) {

    int newpopulation = population * (1 + annualBirthRate) * (1 - annualDeathRate);
    return newpopulation;
}

int main() {

    int populationStartingSize = 0;
    float annualBirthRate = 0;
    float annualDeathRate = 0;
    int numberOfYearsToDisplay = 0;

    do  {
        cout << "Enter starting population size: ";
        cin >> populationStartingSize;
        cout << "Enter annual birth rate: ";
        cin >> annualBirthRate;
        cout << "Enter annual death rate: ";
        cin >> annualDeathRate;
        cout << "Enter years to display: ";
        cin >> numberOfYearsToDisplay;
    } while (!(populationStartingSize >= 2) || !(numberOfYearsToDisplay >= 1));

    int population;

    for (int i = 1; i <= numberOfYearsToDisplay; i++) {
        cout << "Year " << i << ": " << populationStartingSize << " ";
        population = projectedNewSize(populationStartingSize, annualBirthRate, annualDeathRate);
        cout << population << endl;
        populationStartingSize = population;
    }

    system("pause");
    return 0;
}

你们在评论部分进行了讨论,并且没有回答这个问题。

答案 1 :(得分:2)

int projectedNewSize(float population, float annualBirthRate, float annualDeathRate) {

    int newpopulation = roundf(population * (1.0 + annualBirthRate) * (1.0 - annualDeathRate);
    return newpopulation;
}

在计算中,如果已经在输入值中完成,则不必考虑因子1000。但如果你想要一个最准确的&#39;你必须在正确的思想中围绕价值观。计算的返回是一个浮点数。如果将其分配给int - 它将始终被截断。将从一个循环延伸到下一个循环的一点差异,最终与最终的预期值有一些合理的差异。最恰当的方法是改变“新计算”的类型。仅在显示值时浮动和舍入。

答案 2 :(得分:1)

N = P + BP-DP

程序询问出生率和死亡率,假设用户输入5%的 5 。 基本数学需要在这里计算5/100 = 0.05

公式现在是

N = P +(BP / 100)-(DP / 100)

替换

    float annualBirthRate2 = annualBirthRate / 1000;
    float annualDeathRate2 = annualDeathRate / 1000;

    int newpopulation = population * (1 + annualBirthRate2) * (1 - annualDeathRate2);

使用

    int newpopulation = population + (population * birthRate/100) - (population * deathRate/100)