0

一連の数値を読み取り、それらを画面上の 4x4 グリッドに表示するコードを作成しています。プログラムは、それが魔方陣であるかどうかを判断します。私の質問は、 readData メソッドに表示されるファイルにユーザーに数字を入力させて、そのメソッドが呼び出されたときにユーザーグリッドが表示されるようにする方法です。

また、ファイル data.txt はどこに保存されますか?

ありがとう

#include<iostream>
#include<fstream>
using namespace std;
const int dimension = 4;   // dimension for the array
typedef int Sq[dimension] [dimension];  // declare vector for type names

void ReadData(Sq square ) // read data from file
{  ifstream inFile;
  char fileName[13] = "data.txt";
  inFile.open (fileName);  // open file for reading                
  for (int r = 0; r < dimension; r++)   // row loop
      for ( int c = 0; c < dimension; c++)  // column loop
            inFile >> square[r][c]; // read data into matrix
      inFile.close( ); // close the file                
}

void Display ( const Sq square ) // display matrix
{ cout << " Magic Square Program " << endl << endl;
 for (int r = 0; r < dimension; r++)
   { for ( int c = 0; c < dimension; c++)
        { cout.width(6);  //set output width to 6 characters
           cout << square[r][c] << "\t ";  // display numbers
            }
       cout << endl;
    }    
 }
bool magicSquare( Sq square)  // add rows, columns, and diagonals
{ int firstSum = 0, sum;
  bool magic = true;
  for (int r = 0; r < dimension; r++) // add 1st column for a comparison
      firstSum += square[r][1]; 
   for (int r = 1; r < dimension; r++) // row loop first when adding rows
      { sum = 0;
         for ( int c = 0; c < dimension; c++)
             sum += square[r][c];  // add row
         if ( sum != firstSum)  // check for magic failure
              return (false);  // not magic
       }

     for ( int c = 0; c < dimension; c++)   // column loop first when adding columns
       { sum = 0;
          for (int r = 0; r < dimension; r++)
              sum += square[r][c];   // add columns
              if ( sum != firstSum)  // check for magic failure
               return (false);  // not magic
        }
     sum = 0;
     for (int r = 0; r < dimension; r++)  
          sum += square[r][r];   // add front diagonal
        if ( sum != firstSum)  // check for magic failure
           return (false);  // not magic
      sum = 0;
      for (int r = 0; r < dimension; r++)  
          sum += square[r][dimension - r - 1];   // add back diagonal
         if ( sum != firstSum)  // check for magic failure
          return (false);  // not magic
      else
          return (true);
      }  // end magicSquare function

int main( )
{
  Sq square;
 ReadData( square);  // read data from file
 Display ( square);  // display matrix
 if ( magicSquare(square) )   // check for magic property
    cout << "\n This Square is Magic \n " << endl;
 else
    cout << "\n This Square is Not Magic \n " << endl;
 system("Pause");
 return(0);
 }
4

2 に答える 2

2

最も簡単な方法は、プログラムがファイル名をコマンドライン引数として受け取るようにすることです。main は実際には次のようになります。ここargcで、 は引数の数であり、argv[]はそれらへの char ポインターの配列です (argv[0]は常に実行可能ファイルの名前です)。int argc, char *argv[] の意味を参照してください。

int main(int argc, char * argv[])

それで、あなたはそうします

if (argc == 2)
{
   ReadData(square, argv[1]);
   ...
}
else
  ...

ReadData は次のようになります。

void ReadData(Sq &square, const std::string &filename) // read data from file
{
  ifstream inFile;
  inFile.open (filename);  // open file for reading   

ノート!正方形を参照パラメーター ( ) として使用する必要があり&squareます。そうしないと、入力データが無視されます。

于 2013-03-27T14:00:31.317 に答える
0

私の質問は、readData メソッドに表示されているファイルにユーザーに数値を入力させるにはどうすればよいですか?

丁寧に聞く?これはディスク上のファイルであるため、ユーザーはプログラムを開始する前にファイルを埋める必要があります。適切なifstreamフラグを使用して、ファイルが存在しない場合はファイルを作成せず、代わりにエラー メッセージを表示して、後でプログラムを終了することができます。

また、ファイル data.txt はどこに保存されますか?

バイナリの現在の実行パス。これは、バイナリが配置されているフォルダーである場合とそうでない場合があります。

補足として、C++ を使用してstd::array<>いるため、C スタイルの配列よりも適している可能性があります。

于 2013-03-27T13:56:09.583 に答える