C++项目:整数转double实现人口出生率死亡率计算问题
解决C++人口出生率/死亡率计算的整数除法与逻辑问题
先给你修正后的完整代码,直接解决你提到的所有问题:
#include <iostream> using namespace std; class PopulationStats { private: int population; int births; int deaths; public: // 无参默认构造函数 PopulationStats() : population(2), births(0), deaths(0) {} // 带三个参数的构造函数,调用Set函数复用校验逻辑 PopulationStats(int pop, int b, int d) { SetPopulation(pop); SetBirths(b); SetDeaths(d); } // SetPopulation:小于2则设为2 void SetPopulation(int pop) { population = (pop < 2) ? 2 : pop; } // SetBirths:小于0则设为0 void SetBirths(int b) { births = (b < 0) ? 0 : b; } // SetDeaths:小于0则设为0 void SetDeaths(int d) { deaths = (d < 0) ? 0 : d; } // 计算出生率:转换为double后做除法,返回百分比形式(比如0.1返回10.0) double getBirthrate() const { // 先把其中一个整数转成double,触发浮点数除法 return (static_cast<double>(births) / population) * 100; } // 计算死亡率:同理转换为double double getDeathrate() const { return (static_cast<double>(deaths) / population) * 100; } }; // 测试示例 int main() { PopulationStats stats(100, 10, 5); cout << "出生率: " << stats.getBirthrate() << "%" << endl; // 输出10% cout << "死亡率: " << stats.getDeathrate() << "%" << endl; // 输出5% // 测试非法输入的处理 PopulationStats badStats(1, -5, 20); cout << "非法输入后的出生率: " << badStats.getBirthrate() << "%" << endl; // 人口被设为2,出生数设为0,输出0% cout << "非法输入后的死亡率: " << badStats.getDeathrate() << "%" << endl; // 20/2*100=1000% return 0; }
关键问题的解决说明:
整数除法问题:
你之前的问题是births/population都是整数,C++会执行整数除法直接截断小数。解决方法是把其中一个操作数强制转换为double,比如static_cast<double>(births) / population,这样整个除法会自动提升为浮点数运算,得到正确的小数结果。最后乘以100是转成百分比形式,符合常规统计需求。Set函数逻辑修正:
用三元运算符简化判断逻辑,确保输入值不符合要求时自动修正:- 人口小于2时强制设为2,否则用传入值
- 出生/死亡数小于0时强制设为0,否则用传入值
带参构造函数直接调用Set函数,避免重复写校验逻辑,代码更简洁。
构造函数实现:
无参构造用初始化列表直接赋值,符合C++最佳实践;带参构造通过调用Set函数,确保传入的初始值也经过校验,避免非法值进入私有变量。
测试说明
运行示例代码后,你可以看到:
- 正常输入下,10/100会得到0.1,乘以100后输出10%的出生率
- 非法输入(人口1,出生数-5)会被自动修正为人口2、出生数0,计算出正确的0%出生率
内容的提问来源于stack exchange,提问作者dev1001
相关产品推荐
相关产品推荐

