C++ 文字解读程序-C++;

C++ 文字解读程序-C++;,c++,arrays,string,pointers,C++,Arrays,String,Pointers,嗨,我正在使用一个程序来解读一组字母,并输出该组字母可以生成的所有单词,例如:如果我输入字母“vlei”,程序将输出“live”、“evil”和“vile” 到目前为止,我已经在互联网上浏览了一些关于这个问题的信息,但找不到任何与我目前的技能水平(2级noob)相关的具体问题 到目前为止,我已经从给定的字母中得到了所有可能的组合。不包括任何少于7个字母的字母,这是一个问题 这是我目前掌握的代码: string letter; char newWord[7]; int main() {

嗨,我正在使用一个程序来解读一组字母,并输出该组字母可以生成的所有单词,例如:如果我输入字母“vlei”,程序将输出“live”、“evil”和“vile”

到目前为止,我已经在互联网上浏览了一些关于这个问题的信息,但找不到任何与我目前的技能水平(2级noob)相关的具体问题

到目前为止,我已经从给定的字母中得到了所有可能的组合。不包括任何少于7个字母的字母,这是一个问题

这是我目前掌握的代码:

string letter;
char newWord[7];

    int main()
{

cout << "Type letters here: ";
cin >> letter;


for(int i = 0 ; i < 7 ; i++)
{   
    for(int j = 0 ; j < 7 ; j++)
    {
        for(int k = 0 ; k < 7 ; k++)
        {
            for(int l = 0 ; l < 7 ; l++)
            {
                for(int m = 0 ; m < 7 ; m++)
                {
                    for(int n = 0 ; n < 7 ; n++)
                    {
                        for(int o = 0 ; o < 7 ; o++)
                        {

                            sprintf(newWord, "%c%c%c%c%c%c%c", letter[i], letter[j], letter[k], letter[l], letter[m], letter[n], letter[o]);

                        }
                    }
                }
            }
        }
    }
}

return 0;

}
试试这个:

# include <stdio.h>

/* Function to swap values at two pointers */
void swap (char *x, char *y)
{
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

/* Function to print permutations of string
   This function takes three parameters:
   1. String
   2. Starting index of the string
   3. Ending index of the string. */
void permute(char *a, int i, int n) 
{
   int j; 
   if (i == n)
     printf("%s\n", a);
   else
   {
        for (j = i; j <= n; j++)
       {
          swap((a+i), (a+j));
          permute(a, i+1, n);
          swap((a+i), (a+j)); //backtrack
       }
   }
} 

/* Driver program to test above functions */
int main()
{
   char a[] = "vlei";  
   permute(a, 0, 3);
   getchar();
   return 0;
}
#包括
/*函数在两个指针处交换值*/
无效交换(字符*x,字符*y)
{
焦炭温度;
温度=*x;
*x=*y;
*y=温度;
}
/*用于打印字符串排列的函数
此函数采用三个参数:
1.一串
2.字符串的起始索引
3.字符串的结束索引*/
无效排列(字符*a,整数i,整数n)
{
int j;
如果(i==n)
printf(“%s\n”,a);
其他的
{

对于(j= i;j),你需要的是某种比较。C++不知道,英语中哪个词是正确的。所以你可能需要一个单词表。然后你可以Brutforce(这就是你现在正在做的)直到找到匹配。

为了比较你的brutforce结果,你可以使用一个包含尽可能多英语单词的.txt。然后你必须使用一个文件流来迭代每个单词,并将其与你的brutforce结果进行比较

在你成功地解读了一个单词之后,你应该再次考虑你的解决方案。正如你所看到的,你被限制在特定数量的字符上,这不是很好


对于初学者来说,这听起来是一项有趣的任务;)

假设您在Internet上找到了一个纯文本文件形式的单词列表,您可以首先将所有单词加载到字符串向量中

ifstream word_list_file("word_list.txt");
string buffer;
vector<string> all_words;
while (getline(word_list_file, buffer))
    all_words.push_back(buffer);
请注意,我还没有测试我的代码。但这就是我的想法


回应评论的编辑:

简言之,只需使用
std::string
,而不是
std::array
。或者直接复制我的
match
函数并调用它。这对于您的情况来说会更容易

详情:

std::is_permutation
可用于任何容器和任何元素类型。例如:

#include <string>
#include <array>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

int main()
{
//Example 1
    string str1 = "abcde";
    string str2 = "ecdba";
    is_permutation(begin(str1), end(str1), begin(str2));

//Example 2
    array<double, 4> array_double_1{ 4.1, 4.2, 4.3, 4.4 };
    array<double, 4> array_double_2{ 4.2, 4.1, 4.4, 4.3 };
    is_permutation(begin(array_double_1), end(array_double_1), begin(array_double_2));

//Example 3
    list<char> list_char = { 'x', 'y', 'z' };
    string str3 = "zxy";
    is_permutation(begin(list_char), end(list_char), begin(str3));

// Exampl 4
    short short_integers[4] = { 1, 2, 3, 4 };
    vector<int> vector_int = { 3, 4, 2, 1 };
    is_permutation(begin(list_char), end(list_char), begin(str3));

    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
//例1
字符串str1=“abcde”;
字符串str2=“ecdba”;
is_置换(begin(str1)、end(str1)、begin(str2));
//例2
数组双_1{4.1,4.2,4.3,4.4};
数组双数组{4.2,4.1,4.4,4.3};
是_置换(开始(数组双_1)、结束(数组双_1)、开始(数组双_2));
//例3
list_char={'x','y','z'};
字符串str3=“zxy”;
是置换(begin(list_char)、end(list_char)、begin(str3));
//例4
短_整数[4]={1,2,3,4};
向量向量_int={3,4,2,1};
是置换(begin(list_char)、end(list_char)、begin(str3));
返回0;
}
  • 示例1使用
    std::string
    作为
    char
    s的容器,这正是我的
    match
    函数的工作方式
  • 示例2使用大小为4的两个
    数组
    double
  • 示例3甚至使用了两种不同类型的容器,具有相同的元素类型。(您听说过“std::list”吗?没关系,先关注我们的问题。)
  • 示例4更为奇怪。一个容器是老式的原始数组,另一个是
    std::vector
    。还有两种元素类型,
    short
    int
    ,但它们都是整数。(这里与
    short
    int
    之间的确切区别无关。)
然而,这四种情况都可以使用
is_permutation
。非常灵活

灵活性是由以下事实实现的:

  • is_permution
    不完全是一个函数。它是一个函数模板,是一种根据传递给它的数据类型生成新函数的语言功能
  • 容器和
    is_permutation
    算法彼此不认识。它们通过一个称为“迭代器”的中间人进行通信。
    begin
    end
    函数一起为我们提供了一对表示元素“范围”的迭代器

  • 要理解这些事实需要更多的研究。但总体思路并不难。而且,这些事实对于标准库中的其他算法也是如此。

    问题是什么?如果单词有10个字母,你的程序会是什么样子?你的代码是否工作?@AndreiAlexandruAgape抱歉我不小心发布得太早,我刚刚编辑过我的帖子。主要是询问如何比较拼凑的单词和字典中的单词,以及如何将字典中的内容读入我的程序。@MichaelWalz我相信如果它有10个字母,我只需在我已有的字母之后再为
    循环添加3个
    ,但这是一个我觉得我可以在已有字母之后继续解决的问题基本的工作。是的,它有点工作,我已经让它打印出所有可能的单词,给定7个字母。减去任何少于7个字母的单词,我不知道为什么。你需要一个英文单词列表,一个排列字母的函数,以及一个检查排列字母是否创建了一个单词的函数你的列表。阅读字母,做排列-检查它是否是你列表中的一个单词。如果是,在屏幕上打印,如果不是,跳过。做下一个排列,直到没有更多的排列是可能的。这也是@Amol Bavannavar提供的解决方案。你的解决方案是不可伸缩的,不能涵盖所有可能的情况。我认为这个解决方案是在h上找到的为了训练的目的,e想自己做这个。是的,但是如果他想做的是排列,那么他可以使用这个代码。嗯,这看起来很有用。看起来更像e
    
    // Remember to #include <algorithm>
    bool match(const string& letters, const string& each_word)
    {
        if (letters.size() != each_word.size())
            return false;
    
        return is_permutation(begin(letters), end(letters), begin(each_word));
    }
    
    #include <string>
    #include <array>
    #include <vector>
    #include <list>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    //Example 1
        string str1 = "abcde";
        string str2 = "ecdba";
        is_permutation(begin(str1), end(str1), begin(str2));
    
    //Example 2
        array<double, 4> array_double_1{ 4.1, 4.2, 4.3, 4.4 };
        array<double, 4> array_double_2{ 4.2, 4.1, 4.4, 4.3 };
        is_permutation(begin(array_double_1), end(array_double_1), begin(array_double_2));
    
    //Example 3
        list<char> list_char = { 'x', 'y', 'z' };
        string str3 = "zxy";
        is_permutation(begin(list_char), end(list_char), begin(str3));
    
    // Exampl 4
        short short_integers[4] = { 1, 2, 3, 4 };
        vector<int> vector_int = { 3, 4, 2, 1 };
        is_permutation(begin(list_char), end(list_char), begin(str3));
    
        return 0;
    }