2010-04-06 11 views
1

我一直在試圖讓這款Sudoku遊戲能夠正常工作,而且我仍然失敗了一些單獨的功能。所有這些遊戲一起工作,但是當我通過「autograder」運行它時,一些測試用例失敗。 目前,我陷入以下函數placeValue失敗。我確實得到了我得到的輸出與正確的輸出,但是我很困惑。究竟是怎麼回事?仍然失敗的功能,不知道爲什麼...測試用例運行的想法?

編輯:我不知道他們對這個函數做了什麼輸入/調用。

會發生什麼是「無效的行」每placeValue電話後輸出,我找不到爲什麼..

這裏是輸出(礦+正確的),如果它是在所有有用的:http://pastebin.com/Wd3P3nDA

這裏是placeValue了,下面是getCoords是placeValue調用..

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

} 
+1

哪個是autograder?這是一個像SPOJ這樣的在線裁判嗎?也許你打印的空白或空行比需要更多。或者你的輸出不會在每個地方都以換行符結束。 – 2010-04-06 17:04:17

+0

它的任何部門用來檢查程序輸出。如果他們的程序輸出與我的不匹配,則表示該函數失敗 – codefail 2010-04-06 17:05:32

+0

clearInput()方法在做什麼?你可以粘貼它。 – 2010-04-06 17:09:28

回答

0

如果在之後每輸入打印無效行,我們必須得出結論:您的代碼正在做它所說的事情:它認爲每行都超出範圍A-I。很可能有些輸入讓你的cin進入了凍結狀態,而cin >>行實際上或者是零或者一直沒有填充到行中,因此它總是不能通過檢查並打印消息。

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 

在這種情況下,他(她)真的會有用函數getline()或noskipws,這將是相當平均的功課設置一些額外的分析邏輯。


爲了給出一些探討,爲什麼我猜這個,看起來你缺少輸出行。在我看來,在每個輸入閱讀階段,您可能會閱讀兩行輸入,而不是一行。

+0

我問了關於輸入,並被告知,「所有輸入需要將在同一行「 – codefail 2010-04-06 19:45:51

+0

要問的問題更多,如果他們會餵你沒有良好的形式輸入。例如,我給出的例子中的倒數第二行。 – 2010-04-06 19:51:08

+0

我曾經問過這個問題,以及我剛纔提到的情況。 我的搭檔有一個cin.fail()元素參與檢查輸入,但我們還沒有通過autograder運行它。 – codefail 2010-04-06 21:05:19

2

(複製我對原文的評論)像這樣工作的盲人是毫無意義的。平地機顯示你的程序輸出,對吧?因此,只要呼應標準輸入到標準輸出,然後將其粘貼到這裏,我們可以看到你應該怎樣來處理: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;任何嘗試讀取的問題都會返回false。 (不知道這是如何你假設做到這一點,但如果你只想完美結構的線,這是要走的路)。
  3. 它在返回true之前執行所有範圍驗證,因此您的外部函數不需要擔心它。

只是一個getCoords(x, y, value)更換您的通話getCoords(x,y),並採取了cin>>value;線。

+0

你不想要ss >> ws。 ws沒有被宣傳。 – 2010-04-06 19:33:16

+0

感謝您的工作,但我對我的電話必須是有限的。 誠實地說,getCoords必須是getCoords(x,y) 這是有史以來最糟糕的項目。 教授/ GSIs也停止回覆我的電子郵件,但許多其他人也遇到了與課程論壇上的帖子相同的問題。 呃。 – codefail 2010-04-06 19:44:42

+0

@igor:聽起來像是一個苦澀的課程。我討厭的不僅僅是被強迫*通過課程/指導者以死腦筋的方式做事。 – tzaman 2010-04-06 20:17:57

0

得到進一步澄清從教授:

如果在「P」的用戶類型,然後按下回車,程序是等待進一步的輸入(這意味着它正在等待該行,那麼y,則該值)

所以,我並不需要考慮輸入像

A 
相關問題