为何NPW计算函数仅输出最后一个项目的结果?
解决多项目NPW计算重复输出最后一个结果的问题
问题根源分析
- 数组索引越界:C++动态数组的有效索引从
0开始,代码中循环使用i=1到nProj访问PV、N、SV等数组,会访问到数组外的未知内存,引发未定义行为。 - OC/AI数据未持久化:
OC和AI被定义为单个指针,每次处理新项目时都会重新分配内存并覆盖指针地址,最终仅保留最后一个项目的运营成本和收入数据,导致所有项目计算复用同一组数据。 - sum数组未初始化:局部数组
sum默认未初始化,存储的是随机垃圾值,直接参与计算会导致NPW结果错误。 - 内存泄漏:每次循环分配的
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
相关产品推荐
相关产品推荐

