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

为何NPW计算函数仅输出最后一个项目的结果?

解决多项目NPW计算重复输出最后一个结果的问题

问题根源分析

  1. 数组索引越界:C++动态数组的有效索引从0开始,代码中循环使用i=1到nProj访问PV、N、SV等数组,会访问到数组外的未知内存,引发未定义行为。
  2. OC/AI数据未持久化:OC和AI被定义为单个指针,每次处理新项目时都会重新分配内存并覆盖指针地址,最终仅保留最后一个项目的运营成本和收入数据,导致所有项目计算复用同一组数据。
  3. sum数组未初始化:局部数组sum默认未初始化,存储的是随机垃圾值,直接参与计算会导致NPW结果错误。
  4. 内存泄漏:每次循环分配的OC、AI内存未释放,造成内存资源浪费。

修正后的完整代码

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

void npwMethod(int nproj, int *pv, int *n, int **oc, int **ai, int *sv, float marr) {
    float npw[nproj];
    // 初始化sum数组为0,避免垃圾值影响计算
    float sum[nproj] = {0};
    
    // 从0开始遍历项目,符合C++数组索引规则
    for(int i = 0; i < nproj; i++){
        for(int j = 0; j < n[i]; j++){
            sum[i] += (oc[i][j] * pow(1 + marr, -(j+1))); // j从0开始,对应第j+1期
        }
        for(int j = 0; j < n[i]; j++){
            sum[i] += (ai[i][j] * pow(1 + marr, -(j+1)));
        }
        npw[i] = pv[i] + sv[i] * pow(1 + marr, -n[i]) + sum[i];
    }
    for(int i = 0; i < nproj; i++){
        cout << "NPW" << (i+1) << "=" << npw[i] << endl;
    }
}

int main() {
    int nProj;
    float MARR;
    
    cout << "Enter the number of projects please:";
    cin >> nProj;
    
    int *PV = new int[nProj];
    int *N = new int[nProj];
    int *SV = new int[nProj];
    // 使用指针数组存储每个项目的OC和AI,支持不同项目的期数差异
    int **OC = new int*[nProj];
    int **AI = new int*[nProj];
    
    // 从0开始遍历项目
    for(int i = 0; i < nProj; i++){
        cout << "------Project" << (i+1) << "------" << endl;
        cout << "PV" << (i+1) << ":";
        cin >> PV[i];
        cout << "n" << (i+1) << ":";
        cin >> N[i];
        
        OC[i] = new int[N[i]];
        AI[i] = new int[N[i]];
        
        for(int j = 0; j < N[i]; j++){
            cout << "OC" << (j+1) << ":";
            cin >> OC[i][j];
        }
        for(int j = 0; j < N[i]; j++){
            cout << "AI" << (j+1) << ":";
            cin >> AI[i][j];
        }
        
        cout << "SV" << (i+1) << ":";
        cin >> SV[i];
    }
    
    cout << "-------------------" << endl;
    cout << "MARR:";
    cin >> MARR;
    MARR = MARR / 100;
    
    cout << "------RESULTS------" << endl;
    npwMethod(nProj, PV, N, OC, AI, SV, MARR);
    
    // 释放动态分配的内存,避免泄漏
    for(int i = 0; i < nProj; i++){
        delete[] OC[i];
        delete[] AI[i];
    }
    delete[] PV;
    delete[] N;
    delete[] SV;
    delete[] OC;
    delete[] AI;
    
    return 0;
}

关键修改说明

  • 索引修正:所有数组遍历从0开始,输出项目编号时用i+1保持用户习惯的编号方式。
  • OC/AI存储改造:改用指针数组int** OC和int** AI,每个元素指向对应项目的期数数据数组,确保每个项目的OC/AI都被持久化存储。
  • sum初始化:将sum数组初始化为{0},避免垃圾值干扰计算结果。
  • 内存释放:添加内存释放逻辑,清理所有动态分配的数组,避免内存泄漏。

测试验证

输入示例中,修正后的代码会输出预期结果:

NPW1=223.14
NPW2=677.686

内容的提问来源于stack exchange,提问作者freech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:05:44