Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2008
  • Last Modified:

dictionary file words.txt

Consider the dictionary file words.txt, which contains one word per line. Write a program of your language choice to read a list of characters separated by spaces (through the command line) and print out all words containing every input character.

For examples, if the input characters are "a b c d e f"

The output may be:

There are 3 words containing all supplied characters:
   1: barefaced
   2: boldface
   3: feedback


My program complies and when I run it...it hangs up.  Do yall have any idea why?
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
 
int main ()
{
	char letters[26];
	int matches,wordcount,lenOfLetters;
	vector<string> myWords;
	bool next;
 
	cout << "Please enter in 6 letters >> ";
	cin.getline (letters,26);
	
	cout << "The following letters is what you typed in: " << letters << "." << endl;
 
	string line;
	ifstream dictionary ("words.txt");
 
	if (dictionary.is_open())
	{
	    while (!dictionary.eof() )
		{
			getline (dictionary,line);
			lenOfLetters=strlen(letters);
		
			for (int i=0,matches=0;i<lenOfLetters && next==false;i++)
 
           {
              string::size_type loc = line.find( letters[i],0 );
              if( loc == string::npos )
               {
                next=true;
               }
               else
               {
                   matches++;
               }
		  }
		  if (lenOfLetters==matches)
		  {
            wordcount++;
            myWords.push_back(line);           
          }
        
        }                        
	
	
cout << "There are " << wordcount << " words containing all supplied characters:" << endl;
for (int i=0;i<myWords.size();i++)
{
        cout << i<<myWords[i] << endl;
}
	
	dictionary.close();
	}
	
	else cout << "Unable to open file" << endl; 
	//system ("PAUSE");
	return 0;
}

Open in new window

words.txt
0
texanweb
Asked:
texanweb
  • 3
  • 3
  • 2
  • +1
2 Solutions
 
ozoCommented:
perl -ne 'BEGIN{$r=qr/@{[map"(?=.*$_)",@ARGV]}/x;@ARGV="words.txt"}print if/$r/' a b c d e f
0
 
texanwebAuthor Commented:
What does this mean????
perl -ne 'BEGIN{$r=qr/@{[map"(?=.*$_)",@ARGV]}/x;@ARGV="words.txt"}print if/$r/' a b c d e f
0
 
ozoCommented:
it is a command to run a program of my language choice to read a list of characters separated by spaces (through the command line) and print out all words containing every input character.
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
texanwebAuthor Commented:
I still don't see how this has to do with C++ programming.  I believe what your saying is perl language and I have absolute 0 knowledge on perl .... but I do have some knowledge on C++.
0
 
Infinity08Commented:
1) You should initialize the int and bool variables :

        int matches = 0, wordcount = 0, lenOfLetters = 0;
        bool next = false;


2) You should reset the matches and next values at the start of each iteration (ie. for each word).


3) The letters string you read in still contains spaces ... shouldn't you remove those ?


4) Consider using :

            while (getline(dictionary, line))
                {

    instead of :

            while (!dictionary.eof() )
                {
                        getline (dictionary,line);
0
 
ozoCommented:
you said "of your language choice" but if you want to know what's wrong with your Code snippet,
for (int i=0,matches=0;i<lenOfLetters && next==false;i++)
declares matches local to the loop, and next is uninitialized
                        next=false;
                        int i;
                        for (i=0,matches=0;i<lenOfLetters && next==false;i++)
0
 
rstaveleyCommented:
http:#21790655 is very classy, ozo!
0
 
texanwebAuthor Commented:
Ok, I have done some code changing.  The program works, but its not outputting all of the lines.  For example, when I type in "abcdef"... its only coming up with 2 words, not 3.

Any ideas?
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
 
int main ()
{
	char letters[26];
	int matches = 0, wordcount = 0, lenOfLetters = 0;
	vector<string> myWords;
	bool next = false;
 
	
	cout << "Please enter in 6 letters >> ";
	cin.getline (letters,26);
	cout << endl;
	cout << "The following letters is what you typed in: " << letters << "." << endl;
	
	string line;
	ifstream dictionary ("words.txt");
 
	if (dictionary.is_open())
	{
	    while (getline(dictionary, line))
		{
			getline (dictionary,line);
			lenOfLetters=strlen(letters);
			matches=0;
			for (int i=0 ; i < lenOfLetters ; i++)
			{
				string::size_type loc = line.find( letters[i], 0 );
				next = false;
				
				if(!next)
				{
					if( loc == string::npos )
					{
						next=true;
					}
					else
					{
						matches++;
					}
				}
			}
			if (lenOfLetters==matches)
			{
				wordcount++;
				myWords.push_back(line);
			}
		}
		cout << "There are " << wordcount << " words containing all supplied characters:" << endl;
		for (int i=0;i<myWords.size();i++)
		{
			cout << i+1 << ". " << myWords[i] << endl;
		}
		dictionary.close();
	}
	else cout << "Unable to open file" << endl;
	system ("PAUSE");
	return 0;
}

Open in new window

0
 
Infinity08Commented:
>> The program works, but its not outputting all of the lines.

Note that you call getline twice in each iteration ... The second getline should not be there :

            while (getline(dictionary, line))
                {
                        getline (dictionary,line);


Isn't this :

                                next = false;
                               
                                if(!next)
                                {

a bit predictable ? ;) Setting it to false first, and then checking whether it's false ... Are you sure the next = false; should be there ? Somewhere else ?
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 3
  • 3
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now