2010-04-05 34 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