显然我的程序中某处存在计算错误,但我找不到它。
我有关于为什么存在计算错误的唯一信息是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
我根据以下任务构建了程序:
在人口中,出生率是出生人口增加的百分比,死亡率是死亡人口减少的百分比。编写一个要求以下内容的程序:
Enter starting size:
)Enter annual birth rate:
)Enter annual death rate:
)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;
}
答案 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)