Проверка наличия буквы в комбинации
Условия задачи: Язык C++. У нас есть 4 слота и условных 10 букв, которые можно в эти слоты вставить. Одну букву можно использовать только 1 раз, и порядок букв в комбинации не имеет значения, т.е. ABCD и DCBA - без разницы.
Написал небольшую программу, которая генерирует все возможные комбинации и делает определенное действие, если в комбинации существует определенная буква, поэтому при наличии буквы желательно генерировать отдельное сообщение "В комбинации есть буква [...]", впоследствии заменю это на блок других действий.
Программа вроде работает, и выдает правильный результат, но я понимаю, что это кринж конечно, и за такое надо гнать мокрыми тряпками, так что просьба помочь решить эту задачу более правильно.
Вопрос:
- Не смог придумать как сделать так, чтобы выполнялось одно действие в одном и том же блоке, в итоге [Если есть "А" то ->] приходится дублировать 4 раза.
- Изначально пробовал вариант еще сложнее, сделать что-то вроде
string Final_str [4] = {str[i], str[j], str[k], str[l]}, а потом черезstrchr4 раза проверять наличие символа в строке и выводить фразу, что он там присутствует, но выдает ошибку о невозможности преобразовании 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;
}
Ответы (1 шт):
Ну, например, все такие сочетания можно сгенерировать как
#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'))