【问题标题】:Is there a calculation error in my program?我的程序中是否存在计算错误?
【发布时间】:2014-11-10 10:56:46
【问题描述】:

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

关于为什么会出现计算错误,我所拥有的唯一信息是 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 人死亡,则出生率为 0.032,死亡率为 0.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;
}

【问题讨论】:

  • +1 写得很好的问题。包括预期和实际输出、清晰的问题陈述、自己的初步努力和相关代码。
  • 出生/死亡率是 int (32) 还是 float (0.032) ?因为您可以将不必要的除以 1000。并且在将浮点数转换为 int 以获取新的人口时,您正在截断,因此 200 减去非常小的值等于 199
  • @Learner - 是什么阻止您在 for 循环中执行 cout &lt;&lt; annualBirthRate
  • “它们应该以 int 形式给出” -- 你给它们的说明在这一点上似乎不清楚。您是否尝试过除以 1000,然后查看您得到的结果?
  • @Learner:查看 Florent 的评论。

标签: c++ function


【解决方案1】:

所以,答案是

不需要将每年的出生率和每年的死亡率除以 1000。由于每年的出生率是按每 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;
}

你们在 cmets 部分讨论过,没有回答这个问题..

【讨论】:

  • -1 仅用于进行代码转储。请说明您所做的更改以及解决问题的原因。
  • 没有回答的原因是因为它跑题了。这个问题与编程无关。它更多地与弄清楚如何正确解释某人写得不好的指示有关。
  • @BenjaminLindley 那又怎样..?留下未回答的问题也不正确。它出现在未回答的列表中。回答问题没有错。。
  • 相反,不回答问题实际上是针对题外问题的正确做法。如果你有代表,进一步正确的行动是投票关闭它。
  • 感谢您扩展您的回答——我恢复了我的 -1。与@BenjaminLindley 相反,我认为这是一个完全有效的问题,当然值得回答。特别是因为 OP 显然付出了一些努力来发布一个很好的问题。
【解决方案2】:
int projectedNewSize(float population, float annualBirthRate, float annualDeathRate) {

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

如果已经在输入值中完成了计算,则不必考虑 1000 的因子。但是,如果您想要一个“最准确”的表格,您必须以正确的心态对这些值进行四舍五入。计算的返回是一个浮点数。如果你将它分配给一个 int - 它总是会被截断。从一个循环到下一个循环会有一点差异,最终与预期值产生一些合理的差异。最合适的方法是仅在显示值时将“newcalculation”的类型更改为浮动和舍入。

【讨论】:

  • 在这些情况下正确舍入是非常困难的。人口统计通常是统计性质的。因此,您不太可能在恰好 50% 的情况下四舍五入。即使是这样,您也不太可能将平均值舍入 -0.25 并将平均值舍入 +0.25。如果您正在学习编程,这基本上可以归结为“如果它很少见,请不要担心是一次性的”
【解决方案3】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2011-05-05
    • 2016-10-06
    • 2019-01-27
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多