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ステートメントを使用しており、テンプレートに制約されています:(

正しい方向への微調整であっても、すべての助けに感謝します。

編集:もう1つ考えました。ブロックの代わりに phoneLetters[] の文字を個別に反復処理する方法を誰かが理解するのを手伝ってくれたら、それは大きな前進になると思います。例:「ABC」を印刷する代わりに電話番号の番号「2」を読み取る場合、すべての可能な組み合わせに対して「A」を印刷し、次に「B」に進みます。

編集:ここに私の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
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 を変更します。それらはひどいものに見えます。15 桁の数字を生成する必要があると言ったら、非常に不利な立場に置かれることになります。

あなたが見ているのは、私が考えるように、モジュロ3のある種の順列ジェネレーターです...特別なケースはないので(実際の電話の「PQRS」など)、0から可能なすべての組み合わせを数えるだけです3^7。

次に、1 つの 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;
    } 
}

そのコードは、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

テンプレートに従っているときに電話番号が2桁しかない場合の解決策。

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 に答える