为什么该函数只打印上一个项目的结果?

Why does the function prints the results of the last project only?

提问人:freech 提问时间:1/27/2023 最后编辑:freech 更新时间:1/27/2023 访问量:69

问:

我正在尝试创建一个函数来计算每个项目的净现值 (NPW),NPW 最高的项目将是我们的选择。

该程序适用于一个项目,如果我输入多个项目,它只会打印重复的最后一个项目结果以及项目的数量。

法典:

#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[nproj];
    
    for(int i=1;i<=nproj;i++){
        
        for(int j=1;j<=n[i];j++){
            sum[i]+=(oc[j]*(pow(1+marr,-j)));
        }
        for(int j=1;j<=n[i];j++){
            sum[i]+=(ai[j]*(pow(1+marr,-j)));
        }
        npw[i]=pv[i]+sv[i]*(pow(1+marr,-n[i]))+sum[i];
    }
    for(int i=1;i<=nproj;i++){
        cout<<"NPW"<<i<<"="<<npw[i]<<endl;
    }
}

int main() {
    int nProj,methodNum, *OC, *AI;
    float MARR;
    
    cout<<"Enter the number of projects please:";
    cin>>nProj;
    
    int *PV=new int[nProj], *N=new int[nProj], *SV=new int [nProj];     
    
    for(int i=1;i<=nProj;i++){
        cout<<"------Project"<<i<<"------\n";
        cout<<"PV"<<i<<":";
        cin>>PV[i];
        cout<<"n"<<i<<":";
        cin>>N[i];
        
        OC=new int[N[i]], AI=new int [N[i]];
        
        for(int j=1;j<=N[i];j++){
            cout<<"OC"<<j<<":";
            cin>>OC[j];
        }
        for(int j=1;j<=N[i];j++){
            cout<<"AI"<<j<<":";
            cin>>AI[j];
        }
        
        cout<<"SV"<<i<<":";
        cin>>SV[i];
                
    }
    
    cout<<"-------------------\nMARR:";
    cin>>MARR;
    MARR=MARR/100;
    
    cout<<"------RESULTS------\n";
    npwMethod(nProj, PV, N, OC, AI, SV, MARR);
}

输入:

Enter the number of projects please:2
------Project1------
PV1:-1000
n1:2
OC1:-200
OC2:-300
AI1:0
AI2:0
SV:2000
------Project2------
PV1:-1000
n1:2
OC1:-200
OC2:-300
AI1:500
AI2:0
SV:2000
-------------------
MARR:10

预期输出:

NPW1:223.14
NPW2:677.686

谁能帮忙解决这个问题?

C++ 嵌套函数 指针

评论

1赞 Eljay 1/27/2023
这不是有效的 C++ 代码。您是否正在使用非标准编译器扩展?如果没有,则应启用编译器警告,修复警告,然后查看是否能解决问题。此外,在 C++ 中,数组从 开始,而不是 。01
0赞 tadman 1/27/2023
您应该考虑使用,因为 C++ 并不总是支持可变长度数组。这也适用于通过使用来避免。std::vectornew[]std::vector
0赞 tadman 1/27/2023
这是怎么回事?OC=new int[N[i]], AI=new int [N[i]];
0赞 Sam Varshavchik 1/27/2023
非标准的 C++ 和指针的无意义使用是怎么回事;两者是做同一件事的两种完全不同的方法?由于C++领域知识不完整,这表明基于搜索引擎的编程:一个由多个搜索引擎查询和不同来源拼凑而成的程序,希望最终结果有效。最后,C++ 中的数组索引从 0 开始,而不是从 1 开始。显示的代码使用 1,导致内存损坏和未定义的行为。float npw[nproj], sum[nproj];int *PV=new int[nProj]
0赞 freech 1/27/2023
@tadman 这两个变量取决于 N(年数)的数量,因此我将它们创建为动态变量。

答:

0赞 Chronial 1/27/2023 #1

您的问题可以归结为以下几行:

    int* OC;
    for(int i=1; i <= nProj; i++){
        OC = new int[N[i]];
        for(int j=1; j <= N[i]; j++){
            cout << "OC" << j << ":";
            cin >> OC[j];
        }
    }
    
    npwMethod(nProj, PV, N, OC, AI, SV, MARR);

使用 ,则覆盖上一个项目中 OC 的值。人工智能也是如此。您需要将 OC 设置为数组数组。当您使用 时,这要容易得多。然后你可以做这样的事情:OC = new int[N[i]]std::vector

int main() {
    std::vector<std::vector<int>> OCs;
    for(int i=1; i <= nProj; i++){
        OCs.emplace_back();
        OC = OCs.back();
        for(int j=1; j <= N[i]; j++){
            cout << "OC" << j << ":";
            int oc;
            cin >> oc;
            OC.push_back(oc);
        }
    }
    
    npwMethod(nProj, PV, N, OCs, AI, SV, MARR);
}

void npwMethod(..., std::vector<std::vector<int>> const& oc, ...) {
    for(int i=1; i<=nproj; i++){
        for(int j=1 ;j<=n[i]; j++){
            sum[i] += oc[i][j]*...;
        }
    }
}