C链接程序和使用主要功能上的其他程序的方法(数独

时间:2012-10-04 11:46:17

标签: c++ arrays function methods

注意:跳到底部以获得真实的问题

嘿伙计们,现在我在一个车辙,我知道如何解决我的数独程序的基础知识,但如果我这样做,我知道它将如何丑陋,冗长和许多不必要的代码。

对,我有sudoku.cc,sudokuboard.cc,sudokuboard.h,stack.cc和stack.h, 所以到目前为止我的stack.cc和我的stack.h并不重要,因为它们非常通用,任何人都可以找到它们的程序,坦率地说我没有理解为什么我甚至需要包含堆栈。 cc / h到期。

我的sudoku.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提供的有用方法从而制作我的代码似乎更清晰,因为它并不是所有程序都混乱。

所以到目前为止我认为将这两个程序连接在一起以便最大化我的空间的网关我必须将我当前的2D数组设置为 sudoku_grid 才能成为Sudokuboard()的一部分不知何故。

问题在于我确实没有想到如何将这只小狗挂起来的想法。我知道我不能做 sudoku_grid = Sudokuboard(),因为即使它确实有效,也可能将所有数组都设置为空格。

任何人都有解决方案从哪里开始?

1 个答案:

答案 0 :(得分:1)

在主文件的顶部放置#include "sudokuboard.h",以便编译器知道它在那里。接下来,在int main()的顶部,您需要使用SudokuBoard创建SudokuBoard mainBoard;类的实例,然后您可以通过mainBoard.doSomething();在其他位置访问该方法的方法主要。我建议在SudokuBoard类中创建一个新方法,该方法从文件中读取数据并将其从内部直接放入SB的私有std::string rows[SDIM];数组中(基本上将大部分代码从main移到类中)。使用代码原样,假设我没有破坏任何名称,这应该工作:

#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; 
}