Help using a C ++ phone dictionary

I have homework that I flew over until I got to this last step, and now I'm at a standstill, I would really appreciate help.

The premise of the project is to create a file of possible words with a phone number. The user must enter a number with the format '### - ####'. The code then extracts the hyphen and sends the phone number to the wordGenerator method. I know that everything works up to this point. When the time comes for release, the different possibilities of words are where I have a problem. This is what my method looks like:

// function to form words based on phone number void wordGenerator( const int * const n ) { // set output stream and open output file /* Write a declaration for an ofstream object called outFile to open the file "phone.dat" */ ofstream outFile("phone.dat"); // letters corresponding to each number /* Write a declaration for an array of 10 const char *'s called phoneLetters. Use an initializer list to assign each element of the array the corresponding string of three letters. Use dummy characters for 0 and 1 */ const char * phoneLetters[] = {"###", "###", "ABC", "DEF", "GHI", "JKL", "MNO", "PRS", "TUV", "WXY"}; // terminate if file could not be opened /* Write code to check if the file was opened successfully, and terminate if not */ if( !outFile ) { cerr << "The file could not be opened"; exit(1); } int count = 0; // number of words found // output all possible combinations for ( int i1 = 0; i1 <= 2; i1++ ) { for ( int i2 = 0; i2 <= 2; i2++ ) { for ( int i3 = 0; i3 <= 2; i3++ ) { for ( int i4 = 0; i4 <= 2; i4++ ) { for ( int i5 = 0; i5 <= 2; i5++ ) { for ( int i6 = 0; i6 <= 2; i6++ ) { for ( int i7 = 0; i7 <= 2; i7++ ) { /* Write a series of cascaded stream insertion operations to output a set of seven letters to outFile, followed by a space */ outFile << phoneLetters[i7 + 2] << phoneLetters[i6 + 2] << phoneLetters[i5 + 2] << phoneLetters[i4 + 2] << phoneLetters[i3 + 2] << phoneLetters[i2 + 2] << phoneLetters[i1 + 2] << ' '; if ( ++count % 9 == 0 ) // form rows outFile << '\n'; } // end for } // end for } // end for } // end for } // end for } // end for } // end for // output phone number outFile << "\nPhone number is "; for ( int i = 0; i < 7; i++ ) { if ( i == 3 ) outFile << '-'; outFile << n[ i ]; } // end for /* Write a statement to close the ouput file */ outFile.close(); system("pause"); } // end function wordGenerator 

Unfortunately, they gave me a code skeleton and was told to fill in the blanks to complete the task. Wherever comments are blocked (/ * * /), I have to fill in the code.

I'm not sure what I need to do to get the correct format for possible words. I tried to find google, but all the results that I found use a much simpler (in my opinion) switch statement to achieve this, and I'm limited to the pattern: (

All help is welcome, even a push in the right direction.

Edit: I just thought about something else. I feel that if someone can even help me figure out how to iterate through the characters of phoneLetters [] individually rather than a block, this will be a significant step forward. Example: when reading the phone number in number “2” instead of printing “ABC”, type “A” for all possible combinations, then go to “B”.

Edit: Here is my main ():

 int main() { int phoneNumber[ 7 ] = { 0 }; // holds phone number // prompt user to enter phone number cout << "Enter a phone number (digits 2 through 9) " << "in the form: xxx-xxxx\n"; // loop 8 times: 7 digits plus hyphen; // hyphen is not placed in phoneNumber for ( int u = 0, v = 0; u < 8; u++ ) { int i = cin.get(); // test if i is between 0 and 9 if ( i >= '0' && i <= '9' ) phoneNumber[ v++ ] = i - '0'; } // end for wordGenerator( phoneNumber ); // form words from phone number return 0; } // end main 
+6
source share
3 answers

If you cannot get rid of terrifying nested expressions, you can use the following line:

 outFile << phoneLetters[n[0]][i1] << phoneLetters[n[1]][i2] << phoneLetters[n[2]][i3] << phoneLetters[n[3]][i4] << phoneLetters[n[4]][i5] << phoneLetters[n[5]][i6] << phoneLetters[n[6]][i7] << ' '; 

Some other code notes:

Hope this helps.

+6
source

First of all, change these nested for-s. They look terrible, and if I said that now you have to generate 15-digit numbers, you would be in a very bad position.

What you are looking for is some kind of permutation generator with module 3, as I would think about it ... Since there are no special cases (for example, "PQRS" on real phones), just indicate all possible combinations from 0 to 3 ^ 7.

Then use one for-loop to iterate through them. Writing a custom iterator function would probably be a difficult concept to understand, so consider making all these combinations, for example:

 // 3^7 = 2187 for (int i = 0; i < 2187; ++i) { int Div = 1; // now, 7 digits for (int d = 0; d < 7; ++d) { outFile << (i / Div) % 3; Div *= 3; } } 

This code will generate permutations of numbers in a three-way system;) which can then be used to output the right letters using

 outFile << phoneLetters[ActualReadNumber][ (i/Div)%3 ]; 

If you really need to use the cascade record in a file, replace the inner loop with all 7 possibilities, for example:

 /*1.*/ i % 3 /*2.*/ (i / 3) % 3 /*3.*/ (i / 9) % 3 

And so on ... If I have to explain something in more detail, comment on this; If I helped, upvote :) and good luck with homework.

+2
source

The solution is if there were only two digits in the phone numbers, and you follow the pattern.

 int pN[] = {6,9}; const char * phoneLetters[] = {"###", "###", "ABC", "DEF", "GHI", "JKL", "MNO", "PRS", "TUV", "WXY"}; // for (const char *c1 = phoneLetters[pN[0]]; *c1 != '\0'; c1++) { for (const char *c2 = phoneLetters[pN[1]]; *c2 != '\0'; c2++) { printf( "%c%c\n" , *c1 , *c2); } } 

CONCLUSION: MW MX MY NW NX New York OW OX OY

0
source

Source: https://habr.com/ru/post/913447/


All Articles