2012-11-01 38 views
0

我爲我的計算機科學類編寫了一個程序,用於驗證和解決.txt文件中的數獨遊戲難題,但我想更進一步,並編寫一個程序,使其易於輸入和使用數獨遊戲。我相信你可以根據這段代碼找出文件的格式。我唯一的問題是最後一個cin被跳過了,這個選項對我很重要。任何見解將不勝感激!數獨輸入程序跳過提示

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

struct s { 
s(); 
~s() {/*zzzz*/} 
void show_grid(); 
void set (int &r, int &c, int &v) {g[r][c] = v;} 
private: 
int g[9][9]; 
}; 

//************************************************************************ 

void s::show_grid() { 

//print game out to check it 
cout << " | ------------------------------- |" << endl; 
for (int k=0; k<81; k++) { 
    if (k%3 == 0) 
     cout << " |"; 
    cout << " " << g[k/9][k%9]; 
    if (k%9 == 8) { 
     cout << " |" << endl; 
     if ((k/9)%3 == 2) 
      cout << " | ------------------------------- |" << endl; 
    } 
} 
cout << endl; 
} 

//************************************************************************ 

s::s() { 

//initialize all elements to zero 
for (int i=0; i<9; i++) { 
    for (int j=0; j<9; j++) { 
     g[i][j] = 0; 
    } 
} 
} 

//************************************************************************ 

void create_name (string &name) { 

//append .txt extension LIKE IT OR NOT 
string ext = name; 
ext.erase(ext.begin(), ext.end() - 4); 

if (ext.compare(".txt")!=0) 
    name.append(".txt"); 
} 

//************************************************************************ 

int main() { 

s g; 
string name; 
string yon(""); 
int count = 0; 
int row, col, val, rcv; 
ofstream os; 

cout << "Enter game file name: "; 
cin >> name; 

create_name(name); 

//open and do typical checks 
os.open(name.c_str()); 
if (os.fail()) { 
    cerr << "Could not create " << name << ". Waaaah waaaaaaaaaah...\n\n"; 
    return 0; 
} 

//useful output (hopefully) 
cout << "Enter grid coordinates and value as a 3-digit number,\n" 
    << "from left to right, row by row.\n" 
    << "(e.g. 2 in first box would be 112)\n"; 

//take input as one int, to be user friendly 
while (cin >> rcv && count < 81) { 
    row = (rcv/100) - 1; 
    col = ((rcv/10) % 10) - 1; 
    val = rcv % 10; 
    os << row << " " << col << " " << val << endl; 
    g.set (row, col, val); 
    count++; 
} 

os.close(); 

//From here down is broken, but it still compiles, runs, and works 
cout << "Show grid input(y/n)?\n"; 
cin >> yon; 

if (yon.compare("y")==0) 
    g.show_grid(); 
else if (yon.compare("n")==0) 
    cout << "Peace!\n"; 

return 0; 
} 
+0

你如何終止'while'循環?你實際輸入了81個數字嗎? –

+0

哦,我想這很重要,我只需輸入任何終止循環的字符,因爲它不是int。 81是爲了防止用戶超出陣列的邊界 – dockleryxk

+0

嗯,這是你的問題。你故意在'cin'上創建一個錯誤條件 - 直到你調用'.clear()'*和*讀入奇數字符後,才能繼續進行輸入操作。 –

回答

0

試着這麼做:

//useful output (hopefully) 
cout << "Enter grid coordinates and value as a 3-digit number,\n" 
    << "from left to right, row by row.\n" 
    << "(e.g. 2 in first box would be 112)\n" 
    << "or Z to end the loop\n"; // 1 

//take input as one int, to be user friendly 
while (count < 81 && cin >> rcv) { // 2 
    row = (rcv/100) - 1; 
    col = ((rcv/10) % 10) - 1; 
    val = rcv % 10; 
    os << row << " " << col << " " << val << endl; 
    g.set (row, col, val); 
    count++; 
} 

if(!std::cin) { // 3 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

1)讓用戶知道他可以在無效字符輸入。它不一定是Z,實際上任何非數字字符將工作。

2)修正&&的順序錯誤。

3)如果std::cin處於錯誤狀態,請清除錯誤並忽略Z

+0

開頭!這是我需要做的。您是否添加了標準範圍來說明您的觀點?另外,STL忽略()只是爲了好的衡量嗎?如果你要清除cin,那不僅僅是完成同樣的事情嗎? – dockleryxk

+0

1)我添加了'std ::',因爲我教會人們永遠不要使用'使用名稱空間標準;'。 2)'ignore()'是必需的。 3)即使在清除錯誤情況後,「Z」仍然在輸入流中,必須刪除。 –

1

的問題是在這裏:

while (cin >> rcv && count < 81) 

考慮時會發生什麼count==81:首先,rcv將從cin輸入,也只有這樣的條件count < 81將被評估爲假。循環將停止,並且rcv的值將被忽略。所以有效地閱讀一個輸入太多。

你應該改變評價的順序,使count首先檢查:

while (count < 81 && cin >> rcv) 

編輯

根據您的評論上面的你實際上是希望讀取小於81個值。在這種情況下,我建議讓用戶輸入一個特殊值(例如0)來終止循環。你只需要添加if (rcv==0) break;。如果您剛剛輸入一個無效值,那麼cin數據流將處於失敗狀態,並且進一步的輸入將不會成功。

+0

豈不更好的解決辦法是做簡單的'而(CIN >> RCV)',然後檢查你有沒有(在循環後或過少,有檢查)輸入了太多。 –

+0

@JamesKanze:但是程序在81個值之後接受更多輸入,所以這不起作用。 – interjay

+0

我沒有注意到。由於他輸入了81個值,顯然該程序設計爲從文件讀取;沒有人手動輸入81個值。 –

0
cin >> yon 

仍然實際讀入一個變量,它只是讀取while循環發現爲false的變量。當while循環條件返回false時,rcv被忽略,所以數字保留在等待下一個cin語句的輸入流中。當你被稱爲rcv的數字被讀入yon時,會給你一些奇怪的錯誤。

這將是更好地使用interjay的方法:

while (count < 81 && cin >> rcv) 
+0

嗯很好,我並不想投入81個變數,因爲我想輸入一個難題,是尚待解決,所以空指數將爲零 – dockleryxk

+0

,那麼這對我提出的循環有什麼影響?循環將繼續運行,並在接下來的變量看,直到它找到數將超過81 –

+0

由於小於81級的變量獲取輸入,但它絕對不能超過81位。這是因爲數獨遊戲給出的值是以 – dockleryxk