Проверка наличия буквы в комбинации

Рейтинг: 0Ответов: 1Опубликовано: 22.02.2023

Условия задачи: Язык C++. У нас есть 4 слота и условных 10 букв, которые можно в эти слоты вставить. Одну букву можно использовать только 1 раз, и порядок букв в комбинации не имеет значения, т.е. ABCD и DCBA - без разницы.

Написал небольшую программу, которая генерирует все возможные комбинации и делает определенное действие, если в комбинации существует определенная буква, поэтому при наличии буквы желательно генерировать отдельное сообщение "В комбинации есть буква [...]", впоследствии заменю это на блок других действий.

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

Вопрос:

  1. Не смог придумать как сделать так, чтобы выполнялось одно действие в одном и том же блоке, в итоге [Если есть "А" то ->] приходится дублировать 4 раза.
  2. Изначально пробовал вариант еще сложнее, сделать что-то вроде string Final_str [4] = {str[i], str[j], str[k], str[l]}, а потом через strchr 4 раза проверять наличие символа в строке и выводить фразу, что он там присутствует, но выдает ошибку о невозможности преобразовании char к string.
#include <iostream>

using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");
    const char* str = "ABCDEFGHIJ";
    const int strsize = 10;
    int count = 1;
    for (int i = 0; i < strsize - 3; i++)
        for (int j = i + 1; j < strsize - 2; j++)
            for (int k = j + 1; k < strsize - 1; k++)
                for (int l = k + 1; l < strsize; l++)
                {
                    cout << count << "\t" << str[i] << str[j] << str[k] << str[l] << "\n";
                    
                    if (str[i] == 'A') //Проверка А
                        cout << " Фраза содержит букву А\n";
                    else if(str[j] == 'A')
                        cout << " Фраза содержит букву А\n";
                    else if (str[k] == 'A')
                        cout << " Фраза содержит букву А\n";
                    else if (str[l] == 'A')
                        cout << " Фраза содержит букву А\n";

                    if (str[i] == 'B') //Проверка B
                        cout << " Фраза содержит букву B\n";
                    else if (str[j] == 'B')
                        cout << " Фраза содержит букву B\n";
                    else if (str[k] == 'B')
                        cout << " Фраза содержит букву B\n";
                    else if (str[l] == 'B')
                        cout << " Фраза содержит букву B\n";

                    if (str[i] == 'C') //Проверка C
                        cout << " Фраза содержит букву C\n";
                    else if (str[j] == 'C')
                        cout << " Фраза содержит букву C\n";
                    else if (str[k] == 'C')
                        cout << " Фраза содержит букву C\n";
                    else if (str[l] == 'C')
                        cout << " Фраза содержит букву C\n";

                    if (str[i] == 'D') //Проверка D
                        cout << " Фраза содержит букву D\n";
                    else if (str[j] == 'D')
                        cout << " Фраза содержит букву D\n";
                    else if (str[k] == 'D')
                        cout << " Фраза содержит букву D\n";
                    else if (str[l] == 'D')
                        cout << " Фраза содержит букву D\n";

                    if (str[i] == 'E') //Проверка E
                        cout << " Фраза содержит букву E\n";
                    else if (str[j] == 'E')
                        cout << " Фраза содержит букву E\n";
                    else if (str[k] == 'E')
                        cout << " Фраза содержит букву E\n";
                    else if (str[l] == 'E')
                        cout << " Фраза содержит букву E\n";

                    if (str[i] == 'F') //Проверка F
                        cout << " Фраза содержит букву F\n";
                    else if (str[j] == 'F')
                        cout << " Фраза содержит букву F\n";
                    else if (str[k] == 'F')
                        cout << " Фраза содержит букву F\n";
                    else if (str[l] == 'F')
                        cout << " Фраза содержит букву F\n";

                    if (str[i] == 'G') //Проверка G
                        cout << " Фраза содержит букву G\n";
                    else if (str[j] == 'G')
                        cout << " Фраза содержит букву G\n";
                    else if (str[k] == 'G')
                        cout << " Фраза содержит букву G\n";
                    else if (str[l] == 'G')
                        cout << " Фраза содержит букву G\n";

                    if (str[i] == 'H') //Проверка H
                        cout << " Фраза содержит букву H\n";
                    else if (str[j] == 'H')
                        cout << " Фраза содержит букву H\n";
                    else if (str[k] == 'H')
                        cout << " Фраза содержит букву H\n";
                    else if (str[l] == 'H')
                        cout << " Фраза содержит букву H\n";

                    if (str[i] == 'I') //Проверка I
                        cout << " Фраза содержит букву I\n";
                    else if (str[j] == 'I')
                        cout << " Фраза содержит букву I\n";
                    else if (str[k] == 'I')
                        cout << " Фраза содержит букву I\n";
                    else if (str[l] == 'I')
                        cout << " Фраза содержит букву I\n";

                    if (str[i] == 'J') //Проверка J
                        cout << " Фраза содержит букву J\n";
                    else if (str[j] == 'J')
                        cout << " Фраза содержит букву J\n";
                    else if (str[k] == 'J')
                        cout << " Фраза содержит букву J\n";
                    else if (str[l] == 'J')
                        cout << " Фраза содержит букву J\n";

                    cout << "\n";
                    

                    count++;
                }

    return 0;
}

Ответы

▲ 3Принят

Ну, например, все такие сочетания можно сгенерировать как

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iomanip>

using namespace std;


int main(int argc, char * argv[])
{
    vector<int> p{0,0,0,0,0,0,1,1,1,1};
    string alp{"ABCDEFGHIJ"};
    do
    {
        string s;
        for(int i = 0; i < p.size(); ++i) if (p[i]) s += alp[i];
        cout << s << endl;
    } while(next_permutation(p.begin(),p.end()));
}

Что до букв - то лучше плясать не от букв, а от строки.

cout << "Строка содержит букву " << s[0] << endl;
cout << "Строка содержит букву " << s[1] << endl;
cout << "Строка содержит букву " << s[2] << endl;
cout << "Строка содержит букву " << s[3] << endl;

:)

Но если нужна определенная буква, то

if (s.find('A') != s.npos) 
{
    // Содержит A
}

Или, если компилятор посвежее — то

if (s.contains('A'))