-1

注:実際の質問については、一番下までスキップしてください

やあみんな、今私は数独プログラムを解決するための基本的な方法を知っている轍にいますが、私がそれをやったら、それがいかに醜く、長く、そして多くの不要なコードになるかを知っています。

右私はsudoku.cc、sudokuboard.cc、sudokuboard.h、stack.cc、stack.hを持っているので、今のところ、stack.ccとstack.hはかなり一般的であるため、問題ではありません。そして、誰もがそれらのプログラムを見つけることができ、率直に言って、なぜ私がstack.cc/hを含める必要があるのか​​理解できません。

現在の私の数独.ccは次のとおりです。

#include <iostream>
#include <cassert>
#include <fstream>
#include "sudokuboard.h"
#include "stack.h"

using namespace std;
    int main (void)
    {
        FILE *fp = fopen("test.txt","r");
        char sudoku_grid[9][9];
        char ch;

        if(fp != NULL)
        {
            for(int i = 0; i < 9; i++)
            {            
                for(int j = 0; j < 9; j++)
                {
                    ch = fgetc(fp);
                    sudoku_grid[i][j] = ch;   
                }
                ch = fgetc(fp);
            }
            for(int i = 0; i< 9;i++)
            {
                for(int j= 0; j<9;j++)
                    cout<<sudoku_grid[i][j];
                cout<<endl;
            }
        }  
     return 0; 
    }

これまでのところ、私が提供したファイルを印刷して2D配列に格納する以外に何もしていません。

私のsudokuboard.hは

#include <iostream>

#define SDIM 9

class SudokuBoard {
 public:
  //------------------------------------------------------------------------
  SudokuBoard();
  // Construct a blank sudoku board
  //------------------------------------------------------------------------

  //------------------------------------------------------------------------
  void print(std::ostream & ostr) const;
  // display it.  duh.
  //------------------------------------------------------------------------

  //------------------------------------------------------------------------
  void place(size_t r, size_t c, char digit);
  // PRE: safe(r,c,digit)
  //------------------------------------------------------------------------

  //------------------------------------------------------------------------
  void remove(size_t r, size_t c, char digit); 
  // PRE: get(r,c) == digit
  //------------------------------------------------------------------------

  //------------------------------------------------------------------------
  char get(size_t r, size_t c) const;
  // Return the digit at (r,c) on the board.  or ' ' if blank.
  //------------------------------------------------------------------------

  //------------------------------------------------------------------------
  bool safe(size_t r, size_t c, char digit) const;
  // 
  //------------------------------------------------------------------------

  //------------------------------------------------------------------------
  bool done() const; 
  // Return true iff every cell has a number
  //------------------------------------------------------------------------
 private:
  std::string rows[SDIM];
};

と私のsudokuboard.cc:

#include <iostream>
#include <cassert>
#include "sudokuboard.h"

#define ASSERTBOUNDS assert(0 <= r and r < SDIM and 0 <= c and c < SDIM)

SudokuBoard::SudokuBoard()
{
  for (size_t i = 0;i<SDIM;i++) {
    rows[i] = "";
    for (size_t j=0;j<SDIM;j++)
      rows[i] += ' ';
  }
}

void SudokuBoard::place(size_t r, size_t c, char digit)
{
  ASSERTBOUNDS;
  assert(safe(r,c,digit));
}

void SudokuBoard::remove(size_t r, size_t c, char digit)
{
  ASSERTBOUNDS;
  assert(get(r,c)==digit);
  rows[r][c] = ' ';
}

char SudokuBoard::get(size_t r, size_t c) const
{
  ASSERTBOUNDS;
  return rows[r][c];
}


void SudokuBoard::print(std::ostream & ostr) const
{
  for (size_t i=0;i<SDIM;i++)
    ostr << rows[i] << std::endl;
}
bool SudokuBoard::safe(size_t r, size_t c, char digit) const
{
 for(size_t r=0; r<SDIM; r++)
    for(size_t c=0; c<SDIM; c++)
       if (get(r,c) == digit)
           return false;

 for(size_t c=0; c<SDIM; c++)
    for(size_t r=0; r<SDIM; r++)
       if (get(r,c) == digit)
           return false;
  return true;
}
bool SudokuBoard::done() const
{
  for (size_t r=0;r<SDIM;r++)
    for (size_t c=0;c<SDIM;c++)
      if (rows[r][c]==' ')
    return false;
  return true;
}

ですから、今のところ、sudokuboard.ccメソッドを使用し、sudoku.ccでSudokuBoard()を使用したいと思います。そうすれば、Sudokuboard.ccが提供する便利なメソッドを使用できるようになり、コードが表示されるようになるからです。 1つのプログラムにすべてが散らかっていないため、非常にクリーンです。

したがって、現時点では、スペースを最大化するためにこれら2つのプログラムをリンクするためのゲートウェイは、 sudoku_gridである現在の2D配列をSudokuboard()の一部に設定する必要があると思います。

問題は、私が文字通りこの子犬をどのように接続するかについてのまばたきの考えを持っていないということです。sudoku_grid = Sudokuboard()を実行できないことはわかっています。これは、機能したとしても、すべての配列が単なるスペースに設定される可能性があるためです。

どこから始めればよいかという解決策はありますか?

4

1 に答える 1

1

メインファイルの先頭に配置#include "sudokuboard.h"して、コンパイラがそこにあることを認識できるようにします。次に、上部に、を使用してクラスint main()のインスタンスを作成する必要があります。次に、メインの別の場所からそのメソッドにアクセスできます。SudokuBoardクラスに新しいメソッドを作成して、ファイルからデータを読み取り、それを内部からSBのプライベート配列に直接配置することをお勧めします(基本的に、ほとんどのコードをメインからクラスに移動します)。コードをそのまま使用すると、名前を壊さなかったと仮定して、これは機能するはずです。SudokuBoardSudokuBoard mainBoard;mainBoard.doSomething();std::string rows[SDIM];

#include "sudokuboard.h"

int main (void) {
  SudokuBoard mainBoard;
  FILE *fp = fopen("test.txt","r");
  char sudoku_grid[9][9];
  char ch;

  if(fp != NULL) {
    for(int i = 0; i < 9; i++) {            
      for(int j = 0; j < 9; j++ ) {
        ch = fgetc(fp);
        //sudoku_grid[i][j] = ch;  
        //set mainBoard's internal state, etc here
        mainBoard.place(i,j,ch);
      }
      ch = fgetc(fp);
    }
    for(int i = 0; i< 9;i++) {
      for(int j= 0; j<9;j++) cout<<sudoku_grid[i][j];
      cout<<endl;
    }
  }  
  return 0; 
}
于 2012-10-04T11:52:46.673 に答える