0

私はプログラミングについて学ぼうとしている学生で、これまで複雑なコーディングをしたことがありません。最近、講師からノースウェスト コーナー法に関するタスクが与えられました。インターネットで見つけたコードをたどりましたが、私はまだ初心者なので、このコードにはいくつかの問題があるようです。いくつかの読み取りを行いましたが、問題が何であるかをまだ理解できず、コーディングに多くの問題があると確信しています。コーディングを見てくださる方々には本当に感謝しています。前もって感謝します。:)

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

using namespace std;

#include <iostream>
#include <fstream>

const int row_max =4;
const int col_max =4;
int i,j;

//create supply_array and require_array
float supply_array[row_max];
float require_array[col_max];

//creating the cost matrix and unit matrix
float cost_matrix[row_max][col_max];
float unit_matrix[row_max][col_max];

//initialize cost_matrix

int main()
{
    for(i=0 ; i<=row_max ; i++)
    {
        for(j=0 ; j<=col_max ; j++)
        {
            cin >> cost_matrix[i][j];
        }
    }

    //initialize unit_matrix
    for(i=0 ; i<=row_max ; i++)
    {
        for(j=0 ; j<=col_max; j++)
        {
            unit_matrix[i][j]=0;
        }
    }

    float cost_minimal= 0.0;
    float *supply_ptr;
    float *require_ptr;
    supply_ptr = &supply_array[4];
    require_ptr = &require_array[4];

    //initialize supply_array
    for(i=0 ; i<=row_max ; i++)
    {
        cin >> supply_array[i];
    }

    //initialize require_array
    for(i=0 ; i<=col_max; i++)
    {
        cin>>require_array[i];
    }

    float *matrix_ptr;
    matrix_ptr = &cost_matrix[0][0];
    int r=0,c=0,x=0,y=0;
    while((x<= row_max) &&( y=col_max))
    {
        if(*require_ptr>*supply_ptr)
        {
            unit_matrix[x][y]=supply_array[x];
            require_array[y]=require_array[y]-unit_matrix[x][y];
            supply_array[x]=supply_array[x]-unit_matrix[x][y];
            cost_minimal=cost_minimal+unit_matrix[x][y];
            x=x+1;
            supply_ptr=supply_ptr+1;
            matrix_ptr=matrix_ptr+col_max;

            continue;
        }

        if(*require_ptr<*supply_ptr)
        {
            unit_matrix[x][y]=require_array[y];
            require_array[y]=require_array[y]-unit_matrix[x][y];
            supply_array[x]=supply_array[x]-unit_matrix[x][y]*cost_matrix[x][y];
            y=y+1;
            x=x+1;
            require_ptr=require_ptr+1;
            supply_ptr=supply_ptr+1;
            matrix_ptr=matrix_ptr+col_max;

            continue;
        }
    }

    //displaying the unit matrix
    for(i=0;i<=row_max;i++)
    {
        for(j=0;j<=col_max;j++)
        {
            cout<<unit_matrix[i][j];
        }
    }

    //displaying the minimal cost
    cout<< "the minimal cost obtained is : "<<cost_minimal;
    return 0;
}
4

2 に答える 2

1

コードの明らかな問題の 1 つは、配列のインデックスが 0 から始まり、配列のサイズから 1 を引いた値で終わることです。

 for(i=0 ; i<=row_max ; i++)
 {         //^^should be <
    for(j=0 ; j<=col_max ; j++)
    {        //^^should be <
       cin >> cost_matrix[i][j];
    }
 }

この場合、row_maxcol_maxは 4 であるため、インデックスは区間[0,3]にあり、 にアクセスできませんcost_matrix[4][4]

一方、mainor _tmain(作成している C++ プロジェクトの種類によって異なります) のいずれかを同じソース ファイルに含めることはできません。

于 2013-05-14T16:44:02.767 に答える
0

メモリの上書き:

for(i=0 ; i<=row_max ; i++)
{
    for(j=0 ; j<=col_max; j++)
    {
        unit_matrix[i][j]=0;
    }
}

うわー、配列はプログラム全体で上書きされます。配列を大きくするか、ロジックを変更して、どこでもエントリ '4' をヒットし続けないようにする必要があります。世界のどこでこれを手に入れましたか?それは恐ろしいです!また、代入のためにガベージ メモリへのポインターを使用したり、その他の多くの非常に悪いことを行ったりしています。これはゴミなので、別の場所でコードを探してください。

于 2013-05-14T17:07:24.580 に答える