-1

これが私が持っているものです。値を確認できるように、ほとんどの合計を出力しています。問題は、列の合計を格納する配列内の要素の値にあると思います。フィードバックをいただければ幸いです。

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

void fillMatrix(int matrix[][4],const int SIZE);
int rowSum(int matrix[][4],const int SIZE,int row[]);
int columnSum(int matrix[][4], const int SIZE, int column[]);
bool isMagic(int matrix[][4], const int SIZE,int row[],int column[]);

int main()
{
const int SIZE=4;
int matrix[SIZE][SIZE];
int row[4],column[4];//arrays to be filled with row and column sums.
char response=0;

cout<<"This program determines whether or not a 4x4 square matrix is a magic square.\n";
do
{
    fillMatrix(matrix,SIZE);
    rowSum(matrix,SIZE,row);
    columnSum(matrix,SIZE,row);



    if(isMagic(matrix,SIZE,row,column))
        cout<<"This is a magic square.\n\n";
    else {
        cout<<"This is not a magic square.\n\n";
    }
    cout<<"To end this program, enter q. To check another matrix, enter any other letter.\n";
    cin>>response;
}while(response!='q'&&response!='Q');

return 0;
}

void fillMatrix(int matrix[][4],const int SIZE)
{
for(int i=0;i<4;i++)
{
    cout<<"Enter four values for row "<<i+1<<".\n";
    for(int j=0;j<4;j++)
    {
        cin>>matrix[i][j];
    }
}
}

int rowSum(int matrix[][4],const int SIZE,int row[4])
{ 
int i=0;
int rowsum=0;
for(i=0;i<4;i++)
{
    rowsum=0;
    for(int j=0;j<4;j++)
    {
        rowsum+=matrix[i][j];
    }
   row[i]=rowsum;
    cout<<row[i]<<endl;
}
return row[i];

}
int columnSum(int matrix[][4], const int SIZE, int column[4])
{
int j=0;
int columnsum=0;
for(j=0;j<4;j++)
{
    columnsum=0;
    for(int i=0;i<4;i++)
    {
        columnsum+=matrix[i][j];
    }
    column[j]=columnsum;
    cout<<column[j]<<endl;
}
return column[j];
}

bool isMagic(int matrix[][4], const int SIZE,int row[4],int column[4])
{
int rightdiagonalsum=0, leftdiagonalsum=0, check;

for(int i=0;i<4;i++)
{
    rightdiagonalsum+=matrix[i][i];
}
cout<<rightdiagonalsum<<endl;
for(int i=0;i<4;i++)
{
    leftdiagonalsum+=matrix[i][3-i];
}
cout<<leftdiagonalsum<<endl;
for(int i=1;i<4;i++)
{
    if (row[i]==row[i-1])
    {
        check=row[i];
    }
    else {
        return false;
    }
}
for(int j=0;j<4;j++)
{
    if (column[j]!=check)
    {
        cout<<column[j]<<"*****";//For some reason, the value of column[j] is 0.
        return false;
    }
}

if (rightdiagonalsum!=check||leftdiagonalsum!=check)
{
    return false;
}

return true;

}
4

1 に答える 1

0

このコード:

rowSum(matrix,SIZE,row);
columnSum(matrix,SIZE,row);

次のようにする必要があります。

rowSum(matrix,SIZE,row);
columnSum(matrix,SIZE,column);

したがって、columnコード内の配列には、初期化したことがないというかなり平凡な理由でゼロ値があります。

さらに、ここで配列の終わりを超えてアクセスしています:

return row[i];

そしてここ:

return column[j];

これらの点の両方で、値ij持っています4forステートメント内でループ変数を宣言していれば、このような間違いを回避できたはずです。これにより、これらの変数の範囲が制限されます。

問題を解決するには、rowsumそれぞれ とを返しcolumnsumます。

SIZEあなたのハードコードはどこでも4の値であるため、さまざまな宣言がどのような目的に役立つのか疑問に思います。

于 2014-02-23T18:01:35.720 に答える