我的程序中有计算错误吗

Is there a calculation error in my program?

本文关键字:错误 计算 程序 我的      更新时间:2023-10-16

显然我的程序中有一个计算错误,但我根本找不到。

关于为什么会出现计算错误,我所掌握的唯一信息是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,死亡率将为0.26。

我的代码:

#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;
}

所以,答案是

无需将年出生率和年死亡率除以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;
}

你们在评论区讨论了一下,没有回答这个问题。。

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

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

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)