#c #fstream #ifstream #ofstream #turbo-c
#c #fstream #ifstream #ofstream #turbo-c
Вопрос:
Я создаю игру со случайными инициализированными буквами (напр. B A S T E N), и пользователь введет как можно больше слов, используя только эти буквы. У меня есть файл, в котором есть правильные слова с соответствующими точками. Моя проблема в том, как мне запретить пользователю использовать одни и те же слова снова и снова?
Я пытаюсь использовать ofstream, чтобы всякий раз, когда пользователь вводит правильное слово, оно добавлялось в пустой файл
void start()
{
char ch;
do {
clrscr();
long* newptr = 0;
time_t start = time(newptr);
char arr[10][50] = {" B A N S E T ", " R E D G A E ", " S A H L E S ", " P R G N I S ",
" A L E R L Y ", " L A C S A U ", " A C Q U K Y ", " M B L U E J ",
" Z E D Z U B ", " L E A Z D Z "};
int i = 0, sum, x;
while (i != 2) {
clrscr();
sum = 0;
do {
clrscr();
cout << "t**********************************************n";
cout << "t* W O R D S E E K E R *n";
cout << "t**********************************************n";
cout << "nttttt SCORE: " << sum << " /50 pts"
<< "n ******************************n";
cout << " * " << arr[i] << " *n";
cout << " ******************************nn";
cout << " 6 letter=10pts, 5 letter=8pts, 4 letters=6pts, 3 letter=4ptsnn";
char a[20], b[20];
int c;
// this is where I have my problem
if (i == 0) {
ifstream fin;
fin.open("lvl1.txt");
if (fin.fail()) {
cout << "File doesn't exist!";
exit(1);
}
ofstream fout;
fout.open("trial.txt");
if (fout.fail()) {
cout << "Output file opening failed.n";
}
cout << "tEnter word: ";
cin >> a;
do {
fout << a;
fin >> b >> c;
if (fin.eof() == 1) {
cout << "Incorrect! Try Again!";
delay(1000);
exit(1);
}
} while (strcmp(a, b) != 0);
fin.close();
if (strcmp(a, b) == 0) {
sum = c;
}
}
} while (sum < 50);
i ;
}
x = time(newptr) - start;
cout << "ntGood Job! Your time is " << x << " secondsn";
cout << "tDo you want to continue?(Y/N): ";
cin >> ch;
} while (ch != 'n' || ch != 'N');
}
Комментарии:
1. Пожалуйста, представьте свой код в удобочитаемом формате. Я не собираюсь читать ваш хаотичный код. Один оператор на строку, правильный отступ и так далее. Есть даже программы, которые выполняют форматирование за вас. Используйте их.
2. @RolandIllig Я отредактировал ту часть, где находятся ifstream и ofstream, извините, если это беспорядок.
3. Я прогнал его через clang-format для вас. Если вы сами не используете clang-format, то вы можете (в будущем) использовать для этого онлайн-сервис .
4. @NikosC. большое вам спасибо, извините, я все еще нуб, когда дело доходит до такого рода вещей.
Ответ №1:
Вопрос в том, хотите ли вы запоминать слова во время выполнения или после завершения программы.
Чтобы запомнить слова после завершения программы, запишите их в файл.
Чтобы запомнить слова, введенные пользователем во время выполнения, используйте контейнер, например std::vector
. Добавьте слово в контейнер, затем отсортируйте контейнер. Вы можете использовать std::binary_search
, чтобы найти слово в контейнере перед добавлением.
Комментарии:
1. Предпочтительно последнее, чтобы мне не нужно было удалять слова из файла каждый раз, когда новый пользователь пытается играть. Также я забыл сказать вам, что мне разрешено использовать turbo c только для проекта
2. Спросите своего преподавателя, почему вы должны использовать Turbo C , очень старый компилятор, когда вы можете бесплатно скачать современный бесплатный компилятор (или использовать онлайн-компилятор для небольших проектов). Школе действительно нужно изменить свою учебную программу.
3. Хорошим решением для рассматриваемой проблемы было бы
std::unordered_set
вместоstd::vector
.4. Если у вас его нет
std::vector
, вам нужно будет написать его самостоятельно. Динамически выделите массив размером N. Когда массив заполнится, выделите новый, больший массив; скопируйте старый массив в новый массив, затем удалите старый массив.5. Еще одно предложение — написать свой собственный связанный список и использовать сортировку вставки со словами.