6

我有一些作业要完成,直到我到达最后一步,我现在很难过,我真的很感激一些帮助。

该项目的前提是创建一个给定电话号码的可能单词文件。用户应输入格式为“###-####”的数字。然后代码将连字符拉出并将电话号码发送到方法wordGenerator。我知道到目前为止一切正常。当输出单词的不同可能性时,我遇到了问题。这是我的方法的样子:

// 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

不幸的是,我得到了一个代码框架,并被告知要填写空白以完成作业。评论被阻止的任何地方(/ * * /)都是我必须填写代码的地方。

我不确定我需要做什么来输出可能单词的正确格式。我尝试搜索谷歌,但我发现的所有结果都使用了一个更简单(在我看来)的 switch 语句来实现这一点,并且我受限于模板:(

感谢所有帮助,即使是朝着正确的方向轻推。

编辑:我只是想到了另一件事。我觉得如果有人甚至可以帮助我弄清楚如何单独遍历 phoneLetters[] 的字符而不是一个块,那将是向前迈出的重要一步。示例:当读取电话号码的数字“2”而不是打印“ABC”时,为所有可能的组合打印“A”,然后转到“B”。

编辑:这是我的主要():

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
4

3 回答 3

6

如果您无法摆脱可怕的嵌套 for 语句,那么您可以使用以下行:

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]
    << ' ';

关于代码的其他一些注释:

希望这可以帮助。

于 2012-04-17T18:55:12.343 回答
2

首先,改变这些嵌套的for-s。它们看起来很糟糕,如果我说你现在要生成 15 位数字,那你的处境就很糟糕了。

您正在寻找的是某种模数为 3 的置换生成器,正如我所想的那样...由于没有特殊情况(例如真实手机上的“PQRS”),只需计算从 0 到的所有可能组合3^7.

然后,使用一个 for 循环遍历它们。即编写自定义迭代器函数可能是难以理解的概念,所以想想就像做所有这些组合一样,比如:

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

该代码将在三进制系统中生成数字排列;)然后可用于输出正确的字母

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

如果您确实需要使用“级联”写入文件,请将内部循环替换为所有 7 种可能性,例如:

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

等等......如果我应该更详细地解释一些事情,请对此发表评论;如果我有帮助,请投票 :) 并祝你功课好运。

于 2012-04-17T18:31:01.817 回答
0

如果电话号码只有两位数,同时遵循您的模板,则解决方案。

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

输出:MW MX MY NW NX NY OW OX OY

于 2012-04-17T19:20:44.550 回答