仍然失败的功能,不知道为什么......测试用例的想法运行?

时间:2010-04-06 16:52:17

标签: c++

我一直试图让这个数独游戏运转起来,而且我仍然没有完成一些单独的功能。游戏一起工作,但当我通过“自动编程器”运行时,一些测试用例失败了.. 目前我被困在以下函数,placeValue,失败。我确实得到的输出与正确的输出相比,但我很困惑......发生了什么事?

编辑:我不知道他们对该功能做了什么输入/调用。

在每次调用placeValue之后输出“无效行”,我无法追查原因......

这是输出(我的+正确的),如果它有用的话:http://pastebin.com/Wd3P3nDA

这是placeValue,以下是placeValue调用的getCoords ..

void placeValue(Square board[BOARD_SIZE][BOARD_SIZE])
{   
    int x,y,value;  

    if(getCoords(x,y))
    { 

        cin>>value;

        if(board[x][y].permanent)
        {
            cout<< endl << "That location cannot be changed";   

        }
        else if(!(value>=1 && value<=9))
        {
            cout << "Invalid number"<< endl;
            clearInput();
        }
        else if(validMove(board, x, y, value))  
        {
            board[x][y].number=value;
        }
    }
}


bool getCoords(int & x, int & y)
{
    char row;
    y=0;

    cin>>row>>y;
    x = static_cast<int>(toupper(row));
   if (isalpha(row) && (x >= 'A' && x <= 'I') && y >= 1 && y <= 9)
   {
      x = x - 'A'; // converts x from a letter to corresponding index in matrix
      y = y - 1;   // converts y to corresponding index in matrix
      return (true);
   }
   else if (!(x >= 'A' && x <= 'I'))
   {
    cout<<"Invalid row"<<endl;  

    clearInput();
    return false;
   }
   else 
   {
    cout<<"Invalid column"<<endl;
    clearInput();
    return false;
   }

}

4 个答案:

答案 0 :(得分:2)

(复制我对原帖的评论)像这样盲目工作是毫无意义的。评分员会向您显示您的程序输出,对吧?所以只需将stdin回显到stdout,然后将其粘贴到此处,以便我们可以看到您应该处理的内容:string s; while (getline(cin, s)) cout<<s<<endl;

同时:

如果出现解析错误,您的clearInput()函数只是读取并忽略直到行尾。如果这就是他们这样做的话,那么使用getline()来读取一行然后解析它会容易得多。

只是为了踢,这是getCoords函数的更强大版本:

bool getCoords(int& x, int& y, int& value)
{
    string s;
    getline(cin, s);
    istringstream ss(s);
    char a, b, c;
    ss >> a >> b >> c >> ws;
    if (ss.fail() || !ss.eof()) return false;
    a = toupper(a);
    if (a < 'A' || a > 'I') return false;
    x = a - 'A';
    if (b < '1' || b > '9') return false;
    y = b - '1';
    if (c < '1' || c > '9') return false;
    value = c - '1';
    return true;
}
  1. 它一次在输入中读取一行,因此您不再需要使用愚蠢的clearInput()
  2. 它读三个字,三个字;任何更多或更少,它将跳过该行并返回false;试图阅读的任何问题,它将返回错误。 (不确定你是否假设这样做,但是如果你只想要完美的线条,那就是你要走的路)。
  3. 它在返回true之前执行所有范围验证,因此您的外部函数不需要担心它。
  4. 只需将getCoords(x,y)来电替换为getCoords(x, y, value),然后取出cin>>value;行。

答案 1 :(得分:0)

您可能还应该修复此行:

cout << endl << "That location cannot be changed"; 

cout << "That location cannot be changed" << endl;

可能的修复可能是如果行无效,则不应读取该列。这是一个非常模糊的猜测。

这会假设输入看起来像

A1 9
C3 3
d 9 8
q
A3 9

你的解析器会在那个输入处失败...我不确定他们对输入有多么意思。

我也不确定你实现这个有多大的自由,但如果你逐行解析,通常最好使用getline(),然后解析每个字符串。这需要一些重构。


再次,真正的意思是输入。这里有人认为他们会提供以下意见吗?

A 1 3
A 
A 2 4

在这种情况下,(s)他真的必须使用getline()或noskipws以及一些在家庭作业环境中非常有意义的额外解析逻辑。


为了对我为什么猜这个问题进行一些探讨,似乎你缺少输出线。在我看来,在每个输入阅读阶段,您可能正在阅读两行输入,而不是一行。

答案 2 :(得分:0)

如果在每个输入后打印无效行,我们必须得出结论:您的代码正在执行它所说的内容:它认为每行都在A-I范围之外。很可能一些输入使你的cin进入冻结状态并且cin&gt;&gt;行实际上要么是坚持0,要么根本没有任何行,因此它经常无法检查并打印消息。

答案 3 :(得分:0)

教授进一步澄清:

如果用户输入'P'然后按回车键,程序将等待进一步输入(意味着它正在等待行,然后是y然后是值)

所以,我不需要考虑像

这样的输入
A