0

ユーザー定義ファイルから 3x3 行列を取得して印刷し、それが魔方陣かどうかを判断するプログラムを作成する必要があります。

私の最新バージョンには、修正方法がわからない問題がいくつかあります。これについて何時間も頭を悩ませてきました。解決策を見つけるためにWebで解決策を見つけようとすることから、基本をもう一度確認することまで、すべてを行いました。

私は David Brown の解決策を試しましたが、私たちがお互いを誤解していることに気付きました。

ユーザーにファイル名を入力してもらい、プログラムに (ifstream を使用して) そこから 3x3 行列を取得させ、行列を出力してから、それが魔方陣かどうかを判断してもらいます。

#include <iostream>
#include <fstream>
#include <iomanip> #include <string>

using namespace std;

int main()
{
    int n = 3;
    int row, col, r, c, i, j, k, diag=0;
    int magic[19][19];

    std::string fout = "my_file_name.txt";

    std::ifstream ifs(fout.c_str());

    for(j=0 ; j<n+1 ; j++){
        for(k=0 ; k<n+1 ; k++)
            magic[j][k] = 0;
    }

    row=1;
    col=(n+1)/2;
    magic[row-1][col-1]=1;

    for(i=2 ; i<=(n*n) ; i++){
        row-=1;
        col-=1;

        if(row==0 && col==0){
            col++;
            row+=2
        }
        else if(row==0)
            row=n;
        else if(col==0)
            col=n;
        else if(magic[row-1][col-1]!=0){
            col++;
            row+=2;
        }

        magic[row-1][col-1]=i;
    }

    for(r=0; r<n; r++){
        for(c=0; c<n; c++){
            magic[r][n]+=magic[r][c];
        }
    }

    for(c=0; c<n; c++){
        for(r=0; r<n; r++){
            magic[n][c]+=magic[r][c];
        }
    }

    for(r=0; r<n; r++){
        magic[n][n] += magic[r][r];
    }

    for(r=0; r<n; r++){
        c = n - r + 1;
        diag+=magic[r][c];
    }

    for(r=0; r<(n+1) ; r++){
        fout << endl;
        for(c=0; c<(n+1) ; c++){
            fout << setw (5) << magic[r][c];
        }
        fout << endl;
    }

    return 0;
}
4

2 に答える 2