2010-04-05 36 views
1

我的这个函数不断失败autograder,我想弄清楚它的逻辑流程是否有问题?有什么想法吗?逻辑流程错误?为数独游戏获取坐标的函数

基本上,如果行错了,应该打印“无效行”,并且clearInput();称为,并返回false。当y错误时,打印出“无效列”,并清除输入();调用并返回false。

当两个都错了,只有“无效行”是要打印(仍然clearInput并返回false。

显然,当行和y是正确的,打印没有错误并返回true。

我功能获得通过大部分的测试案例,但接近年底失败,我有点失去了,为什么

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

    cin>>row>>y; 
    row=toupper(row); 

    if(row>='A' && row<='I' && isalpha(row) && y>=1 && y<=9) 
    { 
     x=row-'A'; 
     y=y-1; 
     return true; 
    } 

    else if(!(row>='A' && row<='I')) 
    { 
     cout<<"Invalid row"<<endl; 
     noError=false; 
     clearInput(); 
     return false; 
    } 

    else 
    { 
     if(noError) 
     { 
      cout<<"Invalid column"<<endl; 
     } 
     clearInput(); 
     return false; 
    } 
} 
+0

你可以简化if条件,但除了你的代码看起来是正确的。哪些测试失败? – pajton 2010-04-05 16:34:40

+0

我不完全确定,我很难理解它..这里有自编器的输出: http://pastebin.com/vVchxvYz 第27行是我的输出不同于他们的输出.. – codefail 2010-04-05 16:39:13

回答

0

很难知道没有看到输入,但这里有几个可能的问题:

(1)检测列读取失败的方法是通过检查y的值 - 但是您确定它被调用代码设置为范围1-9以外的值吗?否则,即使读取失败,您可能会认为它成功。您可以通过在函数的开头添加一个y=0;来解决此问题。

一些更多的解释:当您使用cin >> y读一个整数到y不是整数读取(可能是因为有一个非数字流中,或达到EOF,或其他)价值y将不会被触及。所以,想象你的输入看起来像“CB”。然后你cin >> row >> y后,row包含'C'y仍然包含任何值它收到的函数被调用(记住y是这个函数外的变量的引用!)这是一个问题:你检查,看看是否读取成功通过查看y的值,但即使读取失败(尤其是如果您在循环中调用此函数并重复使用相同的y),它也很有可能在1和9之间。所以你的代码认为一切都正常了,即使它没有,并且流已经设置了failbit ......如果在这之后所有的事情都变得有点疯狂,这并不奇怪。 (2)如果一行是不完整,那么使用从cin提取的数据读取数据的方式可能会出错。这是因为读取一个整数将跳过主要的空白 - 包括换行符。因此,例如,如果(无效的)输入行仅仅是“B”,那么您可以通过提取char来正确读取“B”,然后整数提取将吞下新行并失败(假设下一个输入行不会' t以整数开始)。然后你的忽略会完全跳过下一行(除非你因为第(1)点而没有接受失败!)。

+0

我只是很难找出它最终失败的地方。我知道某个地方它应该给我一个“无效的列”,我的代码返回true,从那里他们使用的其他调用是不正确的。 就(1)而言,如果我理解你的问题,范围无论是1-9还是外,都是来自函数调用,而不是其他地方。 只要2,是的,可能是它。我会研究这一点。 – codefail 2010-04-05 19:20:32

+0

我试着给点(1)增加一些解释 - 它是否更有意义?让我知道它仍然不清楚;) – 2010-04-05 20:08:41

+0

我刚刚被告知,所有的输入将在同一行,所以(2)不是一个问题。 – codefail 2010-04-05 20:26:41