2014-11-28 2 views
0

안녕하세요. 편지 집합을 해독하고 해당 문자 집합에서 만들 수있는 모든 단어를 출력하는 프로그램을 만들고 있습니다. 예를 들어, "vlei"문자를 입력하면 프로그램 "생", "사악", "사악"을 출력합니다.Word Unscrambling Program - C++

지금까지 인터넷을 통해이 quiiiite에 대해 조금 훑어 보았고이 시점에서 내 스킬 레벨과 관련된 구체적인 질문 (레벨 2 멍청한 답변)을 찾을 수 없습니다.

지금까지 나는 주어진 문자들로부터 모든 가능한 조합을 만들었습니다. 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; 

} 

나는 사람이 이런 일에 경험이 있는지 궁금하고, 힌트 또는 조언을 제공 할 수 있습니다.

특히 내가 어려움을 겪고있는 것은 .txt 파일을 단어를 비교하기위한 사전으로 사용하는 방법입니다. 또한 나는 strcmp()을 사용하는 데 어려움을 겪고 있었는데, 이는 내가 스크램블 된 단어를 사전과 비교하는 데 사용할 계획이었습니다. 그래서 두 개의 문자열을 비교하는 다른 방법이 더 간단하다면 크게 도움이 될 것입니다.

미리 감사드립니다.


안녕하세요. 제 프로그램을 끝내고 다른 사람을 도울 수 있기를 바랍니다. 모든 도움에 감사드립니다.

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstring> 
#include <stdio.h> 
#include <stdlib.h> 
#include <algorithm> 
#include <vector> 
#include <array> 

using namespace std; 



//declaring variables 
int i; 
int scores[531811]; //array for scores of found words 
string wordlist[531811]; //array for found matched words 
string word[531811]; //array of strings for dictionary words about to be read it 
string tester;//string for scrambled letters that will be read in 

int scorefinder(string scrab) //SCORE FINDER FUNCTION 
{ 
    int score = 0; 
    int x = 0; 
    int j = 0; 
    while (scrab[j]) 
    { 
     char ltr = toupper(scrab[j]); //converts to all caps 

     //assings values to each letter and adds it to itself 
     if(ltr == 'A' || ltr == 'E' || ltr == 'I' || ltr == 'L' || ltr == 'N' || ltr == 'O' || ltr == 'R' || ltr == 'S' || ltr == 'T' || ltr == 'U') 
      x += 1; 
     else if(ltr == 'D' || ltr == 'G') 
      x += 2; 
     else if(ltr == 'B' || ltr == 'C' || ltr == 'M' || ltr == 'P') 
      x += 3; 
     else if(ltr == 'F' || ltr == 'H' || ltr == 'V' || ltr == 'W' || ltr == 'Y') 
      x += 4; 
     else if(ltr == 'K') 
      x += 5; 
     else if(ltr == 'J' || ltr == 'X') 
      x += 8; 
     else if(ltr == 'Q' || ltr == 'Z') 
      x += 10; 
     ++j; 
    } 
    score = x; 
    return score; 
} 

int main() { 

//READS IN DICTIONARY 
    ifstream file("words.txt"); //reads in dictionary 
    if (!file.is_open()){ //checks if file is being NOT read correctly 
     cout << "BROEKN \n"; //prints error message if so 
    } 
    if(file.is_open()){ //checks if file IS being read correctly 
     for(int i = 0; i < 531811; i++){ 
      file >> word[i]; //read in each word from the file and 
     } //assigns each to it's position in the words array 
    } 
//END OF READ IN DICTIONARY 

    cout << "Enter scrambled letters: "; 
    cin >> tester; //reads in scrambled letters 

    sort(tester.begin(),tester.end()); //sorts scrambled letters for next_permutation 
    while (next_permutation(tester.begin(),tester.end())){ //while there are still permutations available 
     for(i=0;i<531811;i++){ 
      if (is_permutation (word[i].begin(),word[i].end(), tester.begin())){ 
       wordlist[i] = word[i]; //assigns found word to foundword array 
       scores[i] = scorefinder(word[i]); //assigns found word score to foundscore array 
      } 
     } 
    } 

    //PRINTS OUT ONLY MATCHED WORDS AND SCORES 
    for(i=0;i<531811;i++){ 
     if(scores[i]!=0){ 
      cout << "Found word: " << wordlist[i] << " " << scores[i] << "\n"; 
     } 
    } 
} 
+1

무엇이 문제입니까? –

+0

단어의 글자 수가 10 개라면 프로그램이 어떻게 보이나요? 그리고 당신의 코드는 작동합니까? –

+0

@AndreiAlexandruAgape 죄송합니다. 실수로 너무 일찍 게시했습니다. 방금 내 게시물을 편집했습니다. 대부분 그냥 스크램블 된 단어와 사전 단어를 비교하는 방법과 사전에서 내 프로그램을 읽는 방법에 대한 조언을 구하는 것입니다. –

답변

0

가) 인터넷에 일반 텍스트 파일의 형태로 단어 목록을 발견 한 가정, 당신은 첫 번째 문자열의 벡터로 모든 단어를로드 할 수 있습니다.

ifstream word_list_file("word_list.txt"); 
string buffer; 
vector<string> all_words; 
while (getline(word_list_file, buffer)) 
    all_words.push_back(buffer); 

입력 문자와 각 입력 항목을 all_words으로 비교합니다. std::is_permutation을 사용하는 것이 좋습니다. 순서에 관계없이 두 시퀀스를 비교합니다. 하지만 두 시퀀스의 길이가 다를 때 문제가 발생할 수 있으므로 먼저 길이를 직접 비교하십시오.

// 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)); 
} 

코드를 테스트하지 않았습니다. 그러나 그것은 그 아이디어입니다.


주석 responsing 편집 : 한마디로

을, 단지 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; 
} 
  • 예 정확히 어떻게 내 match 기능 작품이다 char의의 용기로 1 개 용도 std::string 예를 들면 다음과 같습니다.
  • 예 2는 크기가 4 인 double의 두 array을 사용합니다. 예 3은 동일한 요소 유형의 두 가지 다른 종류의 컨테이너를 사용합니다. (`std :: list '에 대해 들어 보셨습니까? 신경 쓰지 마시고 먼저 문제에 집중하십시오.)
  • 예제 4는 낯선 사람입니다. 한 컨테이너는 구식 원시 배열이고 다른 컨테이너는 std::vector입니다. shortint의 두 가지 요소 유형도 있지만 둘 다 정수입니다. (shortint 사이의 정확한 차이는 여기에 관련이 없습니다.)

는하지만, 네 경우가 is_permutation를 사용할 수 있습니다. 매우 유연합니다.

유연성은 다음과 같은 사실에 의해 사용할 수 있습니다 :

  1. is_permutation가 정확하게 작동하지 않을 것입니다. 함수 템플리트는 사용자가 전달한 데이터 유형에 따라 새 기능을 생성하는 언어 기능입니다.
  2. 컨테이너와 is_permutation 알고리즘은 서로를 알지 못합니다. 그들은 "반복자"라는 중개인을 통해 의사 소통합니다. beginend 함수는 함께 요소의 "범위"를 나타내는 한 쌍의 반복자를 제공합니다.

이러한 사실을 이해하려면 더 많은 연구가 필요합니다. 그러나 일반적인 생각은 어렵지 않습니다. 또한 이러한 사실은 표준 라이브러리의 다른 알고리즘에도 해당됩니다.

+0

와우'is_permutation'는 내 프로그램에 아주 완벽하게 보입니다. 나는 그것을 확실히 사용하려고합니다. 또한 텍스트 파일을 읽을 때 벡터를 사용하는 방법. 벡터는 완전히 새로운 순간입니다. 나는 그것들을 조사해야한다. 답변 주셔서 감사합니다! –

+0

안녕하세요,'is_permutation()'을 사용하는 방법에 대한 조언이 있다면 궁금합니다. 나는 그것을 많이 들여다 보았지만'is_permutation'이 비교하려고 시도하는 것을 어떻게 바꿀 지 알 수 없다. 가장 가까운 것은'std :: array foo = {1,2,3,4,5};'를'std :: array foo = { "word};로 변경하고'std :: array bar = { "drow"};'진정한 반환을 위해. 그러나 단어가 인용문에 포함되어 있지 않으면 작동하지 않으므로 쉽게 비교할 단어를 변경할 수 없습니다. 어떤 조언이 있습니까? –

+0

@DominikFigueroa'std :: array foo = {1,2,3,4,5}'의 예가 cplusplus.com에서 나왔습니까? 제 답변에 더 많은 정보를 추가하는 것이 더 좋을 것이라고 생각합니다. 잠시 기다려주십시오. 내 'match'함수를 직접 사용할 수 있습니다. –

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; 
} 
+0

나는이 해결책을 http://www.geeksforgeeks.org/write-ac-program-to-print-all-permutations-of-a-given-string/에 발견했다. –

+0

나는 그가 이것을 스스로하고 싶어한다고 생각한다. 훈련 목적. – Horius

+0

그래,하지만 그가 순열을 원한다면 그는이 코드를 사용할 수있다. –

1

글쎄, 당신이 필요 비교의 일종이다. C++은 영어로 올바른 단어가 무엇인지 알지 못합니다. 따라서 단어 목록이 필요할 수 있습니다. 그렇다면 당신은 성냥을 찾을 때까지 Brutforce (그 순간 당신이하고있는 일)를 할 수 있습니다.

귀하의 강렬한 결과를 비교하기 위해 찾을 수있는만큼 많은 영어 단어가있는 .txt를 사용할 수 있습니다. 그런 다음 모든 단어를 반복하고 그 결과를 당신의 잔인한 결과와 비교하기 위해 FileStream을 사용해야합니다.

단어를 성공적으로 해독 한 후에는 솔루션에 대해 다시 생각해야합니다. 보시다시피, 당신은 그다지 좋지 않은 숯의 특정 양으로 제한됩니다.

이것은 초보자를위한 흥미로운 작업 같은 소리,

+0

오, 파일 스트림은 내가하려는 일에 완벽 할 것 같은데. 즉 내 단어 목록을 내 코드로 가져옵니다. 그리고() 루프를 위해 중첩 된 모든 사람들보다 더 좋은 방법을 생각해 내야합니다. FileStreamin에 대한 자세한 정보는 어디서 볼 수 있습니까? 그것은 제 3 자의 물건과 같습니까? –

+0

이것 좀보세요 : http://www.cplusplus.com/reference/fstream/fstream/ – Horius