We're a community of 1077K IT Pros here for help, advice, solutions, professional growth and fun. Join us!
1,076,194 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Start New Discussion Reply to this Discussion

Anagram program: words of lesser length

I have an anagram program that if you type in a word's characters in any order, the dictionary file will be able to export it. However, my assignment is to build words that are shorter than the inputted search area in a one-to-one letter correspondance. An example of this would be inputting "abel's" and returning "abe, abe's, abel, abel's, able, ables", or whatever the words could fit the criteria.

I've had suggestion from my classmate that I should convert the string to a char, but I'm unsure if this is what I should perform (my test of this is commented out).

#include"WordClass.h"
#include<iostream>
#include<conio.h>
#include<vector>
#include<string>
#include<fstream>
#include<algorithm>
using namespace std;

int main()
{
    WordClass hold;
    bool output=false;
    ifstream inFile;
    string input, search, store, newin, newsea;
    //char chrArray[50], chrArray2[50];
    cout<<"Enter your search letters: ";
    getline(cin,input);
    newin=hold.sortletters(input);
    hold.lowercase(newin);
    hold.removenonletter(newin);
    /*for(int n=0; n<(int)input.length(); n++)
    {
        if(input[n]=='1')
        {
            chrArray[n]=input[n];
        }
    }*/
    cout<<endl;
    inFile.open("WordClassdictionaryfile.txt");
    while(!inFile.eof())
    {
        output=false;
        inFile>>search;
        store=search;
        newsea=hold.sortletters(search);
        hold.lowercase(newsea);
        hold.removenonletter(newsea);
        /*for(int n=0; n<(int)search.length(); n++)
        {
            if(search[n]=='1')
            {
                chrArray2[n]=search[n];
            }
        }*/
        if(hold.anagram(newin, newsea))
        {
            cout<<store<<endl;
        }
        else
        {
            continue;
        }
    }
    cout<<endl<<"Finished"<<endl;
    return 0;
    getch();
}

Anagram function in WordClass

bool WordClass::anagram(string newin, string newsea)
    {
        count=0;
        vector<string>word1;
        vector<string>word2;
        word1.push_back(newin);
        word2.push_back(newsea);
        if(newin.size()!=newsea.size())
        {
            return 0;
        }
        length=word1.size();
        for(int i=0; i<length; i++)
        {
            for(int j=0; j<length; j++)
            {
                if(word1[i]==word2[j])
                {
                    count++;
                }
            }
        }
        if(count==length)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
4
Contributors
7
Replies
5 Days
Discussion Span
5 Months Ago
Last Updated
8
Views
Question
Answered
ssh9411
Newbie Poster
6 posts since Dec 2012
Reputation Points: 0
Solved Threads: 0
Skill Endorsements: 0

Do your anagram words need to have meaning in dictionary?

Anyway, yes you need to work with the string as a char. You could do a brute-force way using permutation. For example, a given string is '123'. When you look for permutation of any length, you would get '1', '2', '3', '12', '13', '21', '23', '31', '32', '123', '132', '213', 231', '312', '321'.

Taywin
Posting Maven
2,633 posts since Apr 2010
Reputation Points: 275
Solved Threads: 375
Skill Endorsements: 17

I just wrote an annagram program simmilar to yours. My program didn't do the chopped up forms of a word. It only used the exact number of letters entered by the user. I wrote the input words into a struct that contained two items. The first was the word as entered by the user, the second was the alphbetized version. We then compared the sorted word against the sorted dictionary list of words. I think in your case you need to store every possible combination of the users input word and compare. Look up how to use permitations. I am not sure, but there could be a built in function that can do this.

T-Dogg3030
Light Poster
39 posts since Nov 2009
Reputation Points: 10
Solved Threads: 5
Skill Endorsements: 0

STL has something that can help you: an algorithm that performs permutation. You can apply it to a string, so that you get different words each time, and than comparing to your inner dictionary to see if they form indeed a word. You can save these string in a vector/other form of container.

#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

int main(){
   string s="abel's";
   do{
      cout<<s<<endl;
   }while(next_permutation(s.begin(),s.end()));
}

You can also chop the string (saw you mentioned that it could be truncated), than search for it in your dictionary.

Lucaci Andrew
Practically a Master Poster
649 posts since Jan 2012
Reputation Points: 91
Solved Threads: 91
Skill Endorsements: 12

What would be the best way to utilize a char inside the next_permutation function? I try to run it but get errors C2228 and C2780 when using this

...
do{
    if(inputArray[50]==searchArray[50]
    {
        cout<<searchArray[50]<<endl;
    }while(next_permutation(inputArray[50].begin(),input.Array[50].end())); //error occurs here

    //error C2228: left of '.begin' must have class/struct/union
    //error C2228: left of '.end' must have class/struct/union
    //error C2780: 'bool std::next_permutation (_BidIt,_BidIt,_Pr)': expects 3 arguments - 2 provided

Inline Code Example Here

ssh9411
Newbie Poster
6 posts since Dec 2012
Reputation Points: 0
Solved Threads: 0
Skill Endorsements: 0

Use it with a container that accepts an interator, you can always put all your variables into a vector:

vector<int> array;

and after that you apply that next_permutation function over the array.

Lucaci Andrew
Practically a Master Poster
649 posts since Jan 2012
Reputation Points: 91
Solved Threads: 91
Skill Endorsements: 12

Would I be using this ^ in comparison to a string or a char? And what should I apply it to: the inputted letters, the dictionary search, or both?

ssh9411
Newbie Poster
6 posts since Dec 2012
Reputation Points: 0
Solved Threads: 0
Skill Endorsements: 0

When dealing with simple arrays:

int array[7];

you can use next_permutation like this:

#define SIZE 7
int main(){
   int array[SIZE]={1,2,3,4,5,6,7};
   do{
       for (size_t i=0;i<SIZE;i++)
           cout<<array[i]<<" ";
       cout<<endl;
   }while(next_permutation(array, array+SIZE));
   return 0;
}

but for strings I would just permute the string's characters, than I'll store them in a container and search in my dictionaries:

vector<string> permute(string a){
    vector<string> ret;
    //while loop
        //do permutations;
        ret.push_back(a);//which was permuted;
    //
    return ret;
}

Than I'll traverse the vector, and look each word in my dictionary.

Lucaci Andrew
Practically a Master Poster
649 posts since Jan 2012
Reputation Points: 91
Solved Threads: 91
Skill Endorsements: 12
Question Answered as of 5 Months Ago by Lucaci Andrew, T-Dogg3030 and Taywin

This question has already been solved: Start a new discussion instead

Post: Markdown Syntax: Formatting Help
 
You
 
© 2013 DaniWeb® LLC
Page rendered in 0.1479 seconds using 2.75MB