You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类中出生率、死亡率计算结果异常问题求助

问题分析与解决方法

核心问题

  • 成员变量初始化时机错误:dogum_orani和olum_orani在对象创建时就完成初始化,此时dogum、nufus、olum都是int类型的默认值0,计算0/0属于未定义行为,后续输入的数值根本不会更新这两个变量。
  • 整数除法导致精度丢失:就算后续重新计算,int类型的数值相除会先执行整数除法(比如100除以500结果是0),再转成float,自然得不到正确的浮点数结果。

修复方案

  1. 删掉类里的dogum_orani和olum_orani成员变量,改成在计算方法里实时计算,彻底避开初始化时机的问题。
  2. 计算时把其中一个整数转成float,强制触发浮点除法,保留小数精度。

修改后的完整代码

#include <iostream>
#include <string>
using namespace std;

class YerlesimBirimi {
public:
    string yerlesim;
    int nufus;
    int dogum;
    int olum;

    void isimAta() {
        cout << "Yerlesim yerini giriniz:";
        cin >> yerlesim;
    }
    void nufusAta() {
        cout << "Nufusu giriniz:";
        cin >> nufus;
    }
    void dogumAta() {
        cout << "Dogum sayisini giriniz:";
        cin >> dogum;
    }
    void olumAta() {
        cout << "Olum sayisini giriniz:";
        cin >> olum;
    }
    float dogumorani() {
        // 转换其中一个操作数为float,确保浮点除法
        return static_cast<float>(dogum) / nufus;
    }
    float olumorani() {
        return static_cast<float>(olum) / nufus;
    }
};

int main() 
{
    YerlesimBirimi x;

    x.isimAta();
    x.nufusAta();
    x.dogumAta();
    x.olumAta();

    cout << x.yerlesim << " --- " << " Dogum orani: " << x.dogumorani() << endl;
    cout << x.yerlesim << " --- " << " Olum orani: " << x.olumorani();

    return 0;
}

额外说明

  • 每次调用dogumorani()和olumorani()时,都会用当前最新的输入值计算,保证结果和输入一致。
  • 用static_cast<float>()做类型转换是C++里的标准写法,比直接加(float)更清晰安全。
  • 主函数里改用类的dogumAta()和olumAta()方法,避免直接操作成员变量,代码结构更规范。

内容的提问来源于stack exchange,提问作者İsmail Eren Uruç

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:21:13