Как найти дубликат

#c

Вопрос:

/* Я написал код для простого палача на основе данных инструкций, я просто хочу знать, как обнаружить дублированные входные данные. Для этого кода он определяет только правильные буквы и длину

Например:

ввод пользователя: ХЭМ Х А А ПАЛАЧ! */

 #include <iostream>
#include <cstring>
using namespace std;

int main()
{
    // Word to be guessed can be assumed to be at most 20 characters long (including end-of-string null character)
    char HangmanWord[20];

    // Variable to store current guess
    char GuessLetter;
    int count = 0;
    std::cin >> HangmanWord;
    //char guessedletter[strlen(HangmanWord)];
    //int j = 0;
    bool valid = true;

    // Check that input word only consists of uppercase English letters
    for (int i = 0; i < strlen(HangmanWord); i  )
    {
        if ((HangmanWord[i] > 'Z') || (HangmanWord[i] < 'A'))
        {
            valid = false;
            break;
        }
    }
    while (valid == true)
    {
        std::cin >> GuessLetter; //Takes the Guess letter
        if ((GuessLetter > 'Z') || (GuessLetter < 'A')) //Check that guessed letter is uppercase
        {
            break;
        }
        else
        {
            for (int i = 0; i < strlen(HangmanWord); i  ) //loop to check every letter in word
            {
                if (GuessLetter == HangmanWord[i]) { //if the letter is equal to any letter in the word the count increases
                    count  ;
                    break;
                }
                if (i == strlen(HangmanWord) - 1) { //If no letter is equal to any letter in the word the program exits
                    valid = false;
                }
            }

            if (count == strlen(HangmanWord)) { //Checks if all letters were guessed and exits the loop after
                valid = false;
            }

        }
    }
    if (count == strlen(HangmanWord)) { //Checks if all letters were guessed correct to print Hangman
        cout << "HANGMAN!n";
        valid = false;
    }
 

Комментарии:

1. Поиск std::set, может быть, в нем есть то, что вам нужно

Ответ №1:

Если вы хотите определить, была ли уже введена буква, вы можете работать с символами ASCII, представленными цифрами. Предполагая, что мы ограничиваемся прописными буквами, 'A' равно 65, а «Z» равно 90.

Мы можем посчитать с их помощью. 'A' - 'A' есть 0 и 'C' - 'A' есть 2 .

Мы также знаем, что массивы индексируются, начиная с нуля.

Мы можем собрать эти вещи вместе, чтобы создать массив логических значений, и пометить их как буквы, которые угадываются.

 std::array<std::bool, 26> already_guessed;
std::fill(already_guess.begin(), already_guessed.end(), false);
 

И затем мы можем проверить, угадана ли буква, посмотрев ее. Рассмотрим, например, проверку того, было ли 'D' угадано. Они должны начинаться с ложного, так как в начале ничего не было угадано.

 already_guessed['D' - 'A']
 

Если это не так, мы можем отметить это как предположение:

 already_guessed['D' - 'A'] = true