Программа ввода судоку, пропускающая подсказку

Я написал программу для своего класса информатики, которая проверяет и решает головоломки судоку из файлов .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

Решение

Попробуйте что-то вроде:

//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

Другие решения

Проблема здесь:

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 поток будет переведен в состояние сбоя и дальнейший ввод не будет успешным.

1

cin >> yon

все еще фактически читает в переменной, это просто читает в переменной, которую цикл while нашел ложным. Когда условие цикла while возвращает false, rcv игнорируется, поэтому число остается во входном потоке в ожидании следующего оператора cin. Когда yon вызывается, число, предназначенное для rcv, читается в yon, что приводит к некоторым странным ошибкам.

было бы лучше использовать метод Interjay:

while (count < 81 && cin >> rcv)
0
По вопросам рекламы [email protected]