簡體   English   中英

邏輯流程不正確? 獲取數獨游戲坐標的函數

[英]Incorrect logic flow? function that gets coordinates for a sudoku game

我的此功能使自動分級機不斷失敗,我試圖找出其邏輯流程是否存在問題? 有什么想法嗎?

基本上,如果該行錯誤,則應打印“ invalid row”,然后執行clearInput();。 調用,並返回false。 如果y錯誤,則打印“無效列”,然后clearInput(); 調用並返回false。

如果兩者都不正確,則僅打印“無效行”(並且仍然clearInput並返回false。

顯然,當row和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;
    }
}

沒有輸入就很難知道,但是這里有兩個可能的問題:

(1)通過檢查y的值來檢測列讀取失敗的方式-但是您確定調用代碼將其設置為1-9范圍之外的值嗎? 否則,即使讀取失敗,您也可能認為讀取成功。 您可以通過添加y=0;來解決此問題y=0; 到函數的開頭

一些更多的解釋:當您使用cin >> y將一個整數讀入y沒有一個整數要讀時(可能是因為流中有一個非數字,或者達到了EOF,或其他) y不會被感動。 因此,假設您的輸入看起來像“ CB”。 然后,在cin >> row >> yrow包含'C'並且y仍包含調用該函數之前所具有的任何值 (記住y是對該函數外部變量的引用!)這是問題所在:您檢查通過查看y的值來查看讀取是否成功,但是即使讀取失敗,也很有可能在1到9之間(尤其是如果您在循環中調用此函數並重用相同的y )。 所以,你的代碼認為一切正常,即使它沒有和流已經得到了它的failbit集...這一切,如果這個點之后去有點瘋狂並不奇怪。

(2)如果行不完整,則使用cin提取來讀取數據的方式可能會出現錯誤。 這是因為讀取整數會跳過前導空格-包括換行符。 因此,例如,如果(無效)輸入行僅是“ B”,則可以通過提取一個字符正確讀取“ B”,然后整數提取將吞下換行符並失敗(假設下一個輸入行沒有t以整數開頭)。 然后,您的忽略將完全跳過下一行(除非您由於點(1)而沒有失敗)!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM